@dignite-ng/expand.cms 3.0.0-rc.14 → 3.0.0-rc.16

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.
@@ -1,6 +1,6 @@
1
1
  import { ConfigStateService, LocalizationService } from '@abp/ng.core';
2
2
  import { ToasterService } from '@abp/ng.theme.shared';
3
- import { Component, inject, Input, ViewChild } from '@angular/core';
3
+ import { ChangeDetectorRef, Component, inject, Input, ViewChild } from '@angular/core';
4
4
  import { Router } from '@angular/router';
5
5
  import { DatePipe, Location } from '@angular/common';
6
6
  import { CmsApiService } from '../../../services';
@@ -25,6 +25,7 @@ export class CreateOrEditEntriesComponent {
25
25
  this._LocalizationService = inject(LocalizationService);
26
26
  this.router = inject(Router);
27
27
  this._CmsApiService = inject(CmsApiService);
28
+ this.cdRef = inject(ChangeDetectorRef);
28
29
  /**语言列表 */
29
30
  this.languagesList = [];
30
31
  /**条目列表-选择上级条目 */
@@ -61,6 +62,9 @@ export class CreateOrEditEntriesComponent {
61
62
  get cultureInput() {
62
63
  return this.formEntity?.get('culture');
63
64
  }
65
+ get slugInput() {
66
+ return this.formEntity?.get('slug');
67
+ }
64
68
  /**加载数据 */
65
69
  async loadData() {
66
70
  if (this.sectionId) {
@@ -71,7 +75,10 @@ export class CreateOrEditEntriesComponent {
71
75
  let repetition = await this.cultureAsyncValidator();
72
76
  if (repetition)
73
77
  this.cultureInput.setErrors(repetition);
78
+ this.slugInput.addAsyncValidators(this.SlugAsyncValidator());
74
79
  if (this.entryInfo) {
80
+ // this.slugInput.reset(this.entryInfo.slug);
81
+ // this.slugInput.updateValueAndValidity();
75
82
  await this.getAllVersionsList();
76
83
  this.formEntity.patchValue({
77
84
  entryTypeId: this.entryInfo.entryTypeId,
@@ -82,6 +89,8 @@ export class CreateOrEditEntriesComponent {
82
89
  versionNotes: this.entryInfo.versionNotes,
83
90
  initialVersionId: this.entryInfo.id,
84
91
  });
92
+ this.slugInput.setErrors({});
93
+ this.slugInput.setErrors(null);
85
94
  }
86
95
  else {
87
96
  this.formEntity.patchValue({
@@ -89,11 +98,42 @@ export class CreateOrEditEntriesComponent {
89
98
  publishTime: this.datePipe.transform(new Date(), 'yyyy-MM-dd HH:mm:ss'),
90
99
  });
91
100
  }
101
+ this.cdRef.detectChanges();
92
102
  this.isLoad = true;
93
103
  setTimeout(() => {
94
104
  this.submitclick?.nativeElement.click();
95
105
  }, 0);
96
106
  }
107
+ // /**别名查重 */
108
+ SlugAsyncValidator() {
109
+ return (control) => {
110
+ return new Promise(async (resolve) => {
111
+ let touchedOrDirty = control.touched || control.dirty;
112
+ if (control.value) {
113
+ if (control.value == this.entryInfo?.slug) {
114
+ resolve(null);
115
+ return;
116
+ }
117
+ this._EntryAdminService
118
+ .slugExists({
119
+ culture: this.cultureInput.value,
120
+ sectionId: this.sectionId,
121
+ slug: control.value,
122
+ })
123
+ .subscribe(res => {
124
+ if (res) {
125
+ resolve({
126
+ repetition: this._LocalizationService.instant(`Cms::EntrySlug{0}AlreadyExist`, control.value),
127
+ });
128
+ }
129
+ else {
130
+ resolve(null);
131
+ }
132
+ });
133
+ }
134
+ });
135
+ };
136
+ }
97
137
  /**定义自定义异步验证 */
98
138
  cultureAsyncValidator() {
99
139
  return new Promise(resolve => {
@@ -168,8 +208,22 @@ export class CreateOrEditEntriesComponent {
168
208
  if (slug.value)
169
209
  return;
170
210
  pinyinstr = this._CmsApiService.chineseToPinyin(val);
171
- this.formEntity.patchValue({
172
- slug: pinyinstr || val,
211
+ this.slugInput.patchValue(pinyinstr || val);
212
+ this._EntryAdminService
213
+ .slugExists({
214
+ culture: this.cultureInput.value,
215
+ sectionId: this.sectionId,
216
+ slug: this.slugInput.value,
217
+ })
218
+ .subscribe(res => {
219
+ if (res) {
220
+ this.slugInput.setErrors({
221
+ repetition: this._LocalizationService.instant(`Cms::EntrySlug{0}AlreadyExist`, this.slugInput.value),
222
+ });
223
+ }
224
+ else {
225
+ this.slugInput.setErrors(null);
226
+ }
173
227
  });
174
228
  }
175
229
  /**获取条目版本列表 */
@@ -204,11 +258,11 @@ export class CreateOrEditEntriesComponent {
204
258
  });
205
259
  }
206
260
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: CreateOrEditEntriesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
207
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.5", type: CreateOrEditEntriesComponent, selector: "cms-create-or-edit-entries", inputs: { isEdit: "isEdit", sectionId: "sectionId", entryTypeId: "entryTypeId", select: "select", entity: "entity" }, viewQueries: [{ propertyName: "submitclick", first: true, predicate: ["submitclick"], descendants: true, static: true }], ngImport: i0, template: "<form [formGroup]=\"formEntity\">\r\n <div class=\"row\">\r\n <div class=\"col-md-8\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n <div class=\"mb-3\">\r\n <div class=\"form-label\">{{'Cms::Title' | abpLocalization}}</div>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"title\"\r\n (blur)=\"setTitleToSlugBlur($event)\">\r\n </div>\r\n <ng-container *ngIf=\"isLoad\">\r\n <ng-container *ngFor=\"let item of showEntryType?.fieldTabs;let i =index\">\r\n <ng-container *ngFor=\"let el of item.fields;let i1 =index\">\r\n <ng-container *ngIf=\"el&&formEntity\">\r\n <df-dynamic [fields]=\"el\"\r\n [selected]=\"entryInfo ? entryInfo.extraProperties[el.field.name] : ''\"\r\n [parentFiledName]=\"'extraProperties'\"\r\n [culture]=\"cultureInput.value\" [entity]=\"formEntity\"></df-dynamic>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n <div class=\"mb-3\">\r\n <div class=\"form-label\">{{'Cms::Slug' | abpLocalization}}</div>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"slug\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <div class=\"form-label\">{{'AbpUi::Languages' | abpLocalization}}</div>\r\n <select class=\"form-select form-select-multiple\" formControlName=\"culture\">\r\n <ng-container *ngFor=\"let item of languagesList;let i =index\">\r\n <option [value]=\"item.cultureName\">{{item.displayName}}</option>\r\n </ng-container>\r\n </select>\r\n <div class=\"text-danger\" *ngIf=\"cultureInput.dirty\">\r\n {{cultureInput?.errors?.repetition}}\r\n </div>\r\n </div>\r\n <div class=\"mb-3\" *ngIf=\"sectionInfo.type===1\">\r\n <label class=\"form-label\" for=\"parentId\">{{'Cms::ParentEntry' | abpLocalization}}</label>\r\n <select class=\"form-select \" formControlName=\"parentId\">\r\n <option value=\"\"></option>\r\n <ng-container *ngFor=\"let item of entryList;let i =index\">\r\n <option [value]=\"item.id\">{{item.title}}</option>\r\n <ng-container *ngFor=\"let el of item.children\">\r\n <ng-container *ngTemplateOutlet=\"childTemplate; context: {\r\n $implicit: {\r\n value: el,\r\n }\r\n }\"></ng-container>\r\n <ng-template #childTemplate let-data>\r\n <option [value]=\"data.value.id\">\r\n <ng-container *ngFor=\"let item of data.value.layer\">--</ng-container>\r\n {{data.value.title}}\r\n </option>\r\n <ng-container *ngFor=\"let el of data.value.children\">\r\n <ng-container *ngTemplateOutlet=\"childTemplate; context: {\r\n $implicit: {\r\n value: el,\r\n }\r\n }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </select>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"publishTime\">{{'Cms::PublishTime' | abpLocalization}}</label>\r\n <input type=\"datetime-local\" class=\"form-control\" step=\"1\" formControlName=\"publishTime\">\r\n </div>\r\n <div class=\"mb-3\" *ngIf=\"isEdit\">\r\n <label class=\"form-label\" for=\"Version\">{{'Cms::Version' | abpLocalization}}</label>\r\n <ul class=\"list-group\">\r\n <ng-container *ngFor=\"let item of AllVersionsList\">\r\n <li\r\n class=\"list-group-item flex-between d-flex align-items-center justify-content-between\">\r\n <div>\r\n {{item.initialVersionId?(item.creationTime| date: 'YYYY/MM/dd HH:mm:s'):('Cms::InitialVersion' | abpLocalization)}}\r\n <span class=\"badge text-bg-success ms-1\"\r\n *ngIf=\"item.isActivatedVersion\">{{'Cms::IsActive' | abpLocalization}}</span>\r\n <span class=\"badge text-bg-primary ms-1\"\r\n *ngIf=\"item.id === entryVersionId\">{{'Cms::Editing' |\r\n abpLocalization}}</span>\r\n </div>\r\n <div>\r\n <div ngbDropdown class=\"d-inline-block\">\r\n <button type=\"button\" class=\"btn btn-link-primary p-2 \"\r\n style=\"line-height: 0;\" id=\"dropdownBasic1\" ngbDropdownToggle>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\r\n <button ngbDropdownItem type=\"button\" *ngIf=\"!item.isActivatedVersion\"\r\n (click)=\"ActivatedVersion(item.id)\">\r\n <i class=\"fas fa-check me-1\"></i>{{'Cms::IsActive' |\r\n abpLocalization}}\r\n </button>\r\n <button ngbDropdownItem type=\"button\"\r\n routerLink=\"/cms/admin/entries/create\"\r\n [queryParams]=\"{entryVersionId:item.id}\">\r\n <i class=\"fas fa-plus me-1\"></i>{{'Cms::NewVersion' |\r\n abpLocalization}}\r\n </button>\r\n <button ngbDropdownItem type=\"button\" (click.stop)=\"toEditUrl(item.id)\"\r\n *ngIf=\"item.id !== entryVersionId\">\r\n <i class=\"fas fa-edit me-1\"></i>{{'AbpUi::Edit' | abpLocalization}}\r\n </button>\r\n <button ngbDropdownItem type=\"button\"\r\n (click.stop)=\"delectVersion(item.id)\"\r\n *ngIf=\"item.initialVersionId&&!item.isActivatedVersion&&item.id !== entryVersionId\">\r\n <i class=\"fas fa-trash me-1\"></i>{{'AbpUi::Delete' |\r\n abpLocalization}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n <div class=\"mb-3\" *ngIf=\"entryInfo\">\r\n <label class=\"form-label\" for=\"versionNotes\">{{'Cms::RevisionNotes' | abpLocalization}}</label>\r\n <textarea class=\"form-control\" formControlName=\"versionNotes\" rows=\"3\"></textarea>\r\n </div>\r\n\r\n\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <button type=\"submit\" style=\"display: none;\" #submitclick></button>\r\n</form>", styles: [""], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i4.StopPropagationDirective, selector: "[click.stop]", outputs: ["click.stop"] }, { kind: "directive", type: i5.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "directive", type: i5.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "directive", type: i6.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i6.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i6.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "directive", type: i6.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["tabindex", "disabled"] }, { kind: "directive", type: i6.NgbDropdownButtonItem, selector: "button[ngbDropdownItem]" }, { kind: "component", type: i7.DynamicComponent, selector: "df-dynamic", inputs: ["selected", "type", "culture", "parentFiledName", "fields", "entity"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "pipe", type: i4.LocalizationPipe, name: "abpLocalization" }] }); }
261
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.5", type: CreateOrEditEntriesComponent, selector: "cms-create-or-edit-entries", inputs: { isEdit: "isEdit", sectionId: "sectionId", entryTypeId: "entryTypeId", select: "select", entity: "entity" }, viewQueries: [{ propertyName: "submitclick", first: true, predicate: ["submitclick"], descendants: true, static: true }], ngImport: i0, template: "<form [formGroup]=\"formEntity\">\r\n <div class=\"row\">\r\n <div class=\"col-md-8\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n <div class=\"mb-3\">\r\n <div class=\"form-label\">{{'Cms::Title' | abpLocalization}}</div>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"title\"\r\n (blur)=\"setTitleToSlugBlur($event)\">\r\n </div>\r\n <ng-container *ngIf=\"isLoad\">\r\n <ng-container *ngFor=\"let item of showEntryType?.fieldTabs;let i =index\">\r\n <ng-container *ngFor=\"let el of item.fields;let i1 =index\">\r\n <ng-container *ngIf=\"el&&formEntity\">\r\n <df-dynamic [fields]=\"el\"\r\n [selected]=\"entryInfo ? entryInfo.extraProperties[el.field.name] : ''\"\r\n [parentFiledName]=\"'extraProperties'\"\r\n [culture]=\"cultureInput.value\" [entity]=\"formEntity\"></df-dynamic>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n <div class=\"mb-3\">\r\n <div class=\"form-label\">{{'Cms::Slug' | abpLocalization}}</div>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"slug\">\r\n <div class=\"text-danger\" *ngIf=\"slugInput.dirty\">\r\n {{slugInput?.errors?.repetition}}\r\n </div>\r\n </div>\r\n <div class=\"mb-3\">\r\n <div class=\"form-label\">{{'AbpUi::Languages' | abpLocalization}}</div>\r\n <select class=\"form-select form-select-multiple\" formControlName=\"culture\">\r\n <ng-container *ngFor=\"let item of languagesList;let i =index\">\r\n <option [value]=\"item.cultureName\">{{item.displayName}}</option>\r\n </ng-container>\r\n </select>\r\n <div class=\"text-danger\" *ngIf=\"cultureInput.dirty\">\r\n {{cultureInput?.errors?.repetition}}\r\n </div>\r\n </div>\r\n <div class=\"mb-3\" *ngIf=\"sectionInfo.type===1\">\r\n <label class=\"form-label\" for=\"parentId\">{{'Cms::ParentEntry' | abpLocalization}}</label>\r\n <select class=\"form-select \" formControlName=\"parentId\">\r\n <option value=\"\"></option>\r\n <ng-container *ngFor=\"let item of entryList;let i =index\">\r\n <option [value]=\"item.id\">{{item.title}}</option>\r\n <ng-container *ngFor=\"let el of item.children\">\r\n <ng-container *ngTemplateOutlet=\"childTemplate; context: {\r\n $implicit: {\r\n value: el,\r\n }\r\n }\"></ng-container>\r\n <ng-template #childTemplate let-data>\r\n <option [value]=\"data.value.id\">\r\n <ng-container *ngFor=\"let item of data.value.layer\">--</ng-container>\r\n {{data.value.title}}\r\n </option>\r\n <ng-container *ngFor=\"let el of data.value.children\">\r\n <ng-container *ngTemplateOutlet=\"childTemplate; context: {\r\n $implicit: {\r\n value: el,\r\n }\r\n }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </select>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"publishTime\">{{'Cms::PublishTime' | abpLocalization}}</label>\r\n <input type=\"datetime-local\" class=\"form-control\" step=\"1\" formControlName=\"publishTime\">\r\n </div>\r\n <div class=\"mb-3\" *ngIf=\"isEdit\">\r\n <label class=\"form-label\" for=\"Version\">{{'Cms::Version' | abpLocalization}}</label>\r\n <ul class=\"list-group\">\r\n <ng-container *ngFor=\"let item of AllVersionsList\">\r\n <li\r\n class=\"list-group-item flex-between d-flex align-items-center justify-content-between\">\r\n <div>\r\n {{item.initialVersionId?(item.creationTime| date: 'YYYY/MM/dd HH:mm:s'):('Cms::InitialVersion' | abpLocalization)}}\r\n <span class=\"badge text-bg-success ms-1\"\r\n *ngIf=\"item.isActivatedVersion\">{{'Cms::IsActive' | abpLocalization}}</span>\r\n <span class=\"badge text-bg-primary ms-1\"\r\n *ngIf=\"item.id === entryVersionId\">{{'Cms::Editing' |\r\n abpLocalization}}</span>\r\n </div>\r\n <div>\r\n <div ngbDropdown class=\"d-inline-block\">\r\n <button type=\"button\" class=\"btn btn-link-primary p-2 \"\r\n style=\"line-height: 0;\" id=\"dropdownBasic1\" ngbDropdownToggle>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\r\n <button ngbDropdownItem type=\"button\" *ngIf=\"!item.isActivatedVersion\"\r\n (click)=\"ActivatedVersion(item.id)\">\r\n <i class=\"fas fa-check me-1\"></i>{{'Cms::IsActive' |\r\n abpLocalization}}\r\n </button>\r\n <button ngbDropdownItem type=\"button\"\r\n routerLink=\"/cms/admin/entries/create\"\r\n [queryParams]=\"{entryVersionId:item.id}\">\r\n <i class=\"fas fa-plus me-1\"></i>{{'Cms::NewVersion' |\r\n abpLocalization}}\r\n </button>\r\n <button ngbDropdownItem type=\"button\" (click.stop)=\"toEditUrl(item.id)\"\r\n *ngIf=\"item.id !== entryVersionId\">\r\n <i class=\"fas fa-edit me-1\"></i>{{'AbpUi::Edit' | abpLocalization}}\r\n </button>\r\n <button ngbDropdownItem type=\"button\"\r\n (click.stop)=\"delectVersion(item.id)\"\r\n *ngIf=\"item.initialVersionId&&!item.isActivatedVersion&&item.id !== entryVersionId\">\r\n <i class=\"fas fa-trash me-1\"></i>{{'AbpUi::Delete' |\r\n abpLocalization}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n <div class=\"mb-3\" *ngIf=\"entryInfo\">\r\n <label class=\"form-label\" for=\"versionNotes\">{{'Cms::RevisionNotes' | abpLocalization}}</label>\r\n <textarea class=\"form-control\" formControlName=\"versionNotes\" rows=\"3\"></textarea>\r\n </div>\r\n\r\n\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <button type=\"submit\" style=\"display: none;\" #submitclick></button>\r\n</form>", styles: [""], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i4.StopPropagationDirective, selector: "[click.stop]", outputs: ["click.stop"] }, { kind: "directive", type: i5.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "directive", type: i5.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "directive", type: i6.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i6.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i6.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "directive", type: i6.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["tabindex", "disabled"] }, { kind: "directive", type: i6.NgbDropdownButtonItem, selector: "button[ngbDropdownItem]" }, { kind: "component", type: i7.DynamicComponent, selector: "df-dynamic", inputs: ["selected", "type", "culture", "parentFiledName", "fields", "entity"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "pipe", type: i4.LocalizationPipe, name: "abpLocalization" }] }); }
208
262
  }
209
263
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: CreateOrEditEntriesComponent, decorators: [{
210
264
  type: Component,
211
- args: [{ selector: 'cms-create-or-edit-entries', template: "<form [formGroup]=\"formEntity\">\r\n <div class=\"row\">\r\n <div class=\"col-md-8\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n <div class=\"mb-3\">\r\n <div class=\"form-label\">{{'Cms::Title' | abpLocalization}}</div>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"title\"\r\n (blur)=\"setTitleToSlugBlur($event)\">\r\n </div>\r\n <ng-container *ngIf=\"isLoad\">\r\n <ng-container *ngFor=\"let item of showEntryType?.fieldTabs;let i =index\">\r\n <ng-container *ngFor=\"let el of item.fields;let i1 =index\">\r\n <ng-container *ngIf=\"el&&formEntity\">\r\n <df-dynamic [fields]=\"el\"\r\n [selected]=\"entryInfo ? entryInfo.extraProperties[el.field.name] : ''\"\r\n [parentFiledName]=\"'extraProperties'\"\r\n [culture]=\"cultureInput.value\" [entity]=\"formEntity\"></df-dynamic>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n <div class=\"mb-3\">\r\n <div class=\"form-label\">{{'Cms::Slug' | abpLocalization}}</div>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"slug\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <div class=\"form-label\">{{'AbpUi::Languages' | abpLocalization}}</div>\r\n <select class=\"form-select form-select-multiple\" formControlName=\"culture\">\r\n <ng-container *ngFor=\"let item of languagesList;let i =index\">\r\n <option [value]=\"item.cultureName\">{{item.displayName}}</option>\r\n </ng-container>\r\n </select>\r\n <div class=\"text-danger\" *ngIf=\"cultureInput.dirty\">\r\n {{cultureInput?.errors?.repetition}}\r\n </div>\r\n </div>\r\n <div class=\"mb-3\" *ngIf=\"sectionInfo.type===1\">\r\n <label class=\"form-label\" for=\"parentId\">{{'Cms::ParentEntry' | abpLocalization}}</label>\r\n <select class=\"form-select \" formControlName=\"parentId\">\r\n <option value=\"\"></option>\r\n <ng-container *ngFor=\"let item of entryList;let i =index\">\r\n <option [value]=\"item.id\">{{item.title}}</option>\r\n <ng-container *ngFor=\"let el of item.children\">\r\n <ng-container *ngTemplateOutlet=\"childTemplate; context: {\r\n $implicit: {\r\n value: el,\r\n }\r\n }\"></ng-container>\r\n <ng-template #childTemplate let-data>\r\n <option [value]=\"data.value.id\">\r\n <ng-container *ngFor=\"let item of data.value.layer\">--</ng-container>\r\n {{data.value.title}}\r\n </option>\r\n <ng-container *ngFor=\"let el of data.value.children\">\r\n <ng-container *ngTemplateOutlet=\"childTemplate; context: {\r\n $implicit: {\r\n value: el,\r\n }\r\n }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </select>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"publishTime\">{{'Cms::PublishTime' | abpLocalization}}</label>\r\n <input type=\"datetime-local\" class=\"form-control\" step=\"1\" formControlName=\"publishTime\">\r\n </div>\r\n <div class=\"mb-3\" *ngIf=\"isEdit\">\r\n <label class=\"form-label\" for=\"Version\">{{'Cms::Version' | abpLocalization}}</label>\r\n <ul class=\"list-group\">\r\n <ng-container *ngFor=\"let item of AllVersionsList\">\r\n <li\r\n class=\"list-group-item flex-between d-flex align-items-center justify-content-between\">\r\n <div>\r\n {{item.initialVersionId?(item.creationTime| date: 'YYYY/MM/dd HH:mm:s'):('Cms::InitialVersion' | abpLocalization)}}\r\n <span class=\"badge text-bg-success ms-1\"\r\n *ngIf=\"item.isActivatedVersion\">{{'Cms::IsActive' | abpLocalization}}</span>\r\n <span class=\"badge text-bg-primary ms-1\"\r\n *ngIf=\"item.id === entryVersionId\">{{'Cms::Editing' |\r\n abpLocalization}}</span>\r\n </div>\r\n <div>\r\n <div ngbDropdown class=\"d-inline-block\">\r\n <button type=\"button\" class=\"btn btn-link-primary p-2 \"\r\n style=\"line-height: 0;\" id=\"dropdownBasic1\" ngbDropdownToggle>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\r\n <button ngbDropdownItem type=\"button\" *ngIf=\"!item.isActivatedVersion\"\r\n (click)=\"ActivatedVersion(item.id)\">\r\n <i class=\"fas fa-check me-1\"></i>{{'Cms::IsActive' |\r\n abpLocalization}}\r\n </button>\r\n <button ngbDropdownItem type=\"button\"\r\n routerLink=\"/cms/admin/entries/create\"\r\n [queryParams]=\"{entryVersionId:item.id}\">\r\n <i class=\"fas fa-plus me-1\"></i>{{'Cms::NewVersion' |\r\n abpLocalization}}\r\n </button>\r\n <button ngbDropdownItem type=\"button\" (click.stop)=\"toEditUrl(item.id)\"\r\n *ngIf=\"item.id !== entryVersionId\">\r\n <i class=\"fas fa-edit me-1\"></i>{{'AbpUi::Edit' | abpLocalization}}\r\n </button>\r\n <button ngbDropdownItem type=\"button\"\r\n (click.stop)=\"delectVersion(item.id)\"\r\n *ngIf=\"item.initialVersionId&&!item.isActivatedVersion&&item.id !== entryVersionId\">\r\n <i class=\"fas fa-trash me-1\"></i>{{'AbpUi::Delete' |\r\n abpLocalization}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n <div class=\"mb-3\" *ngIf=\"entryInfo\">\r\n <label class=\"form-label\" for=\"versionNotes\">{{'Cms::RevisionNotes' | abpLocalization}}</label>\r\n <textarea class=\"form-control\" formControlName=\"versionNotes\" rows=\"3\"></textarea>\r\n </div>\r\n\r\n\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <button type=\"submit\" style=\"display: none;\" #submitclick></button>\r\n</form>" }]
265
+ args: [{ selector: 'cms-create-or-edit-entries', template: "<form [formGroup]=\"formEntity\">\r\n <div class=\"row\">\r\n <div class=\"col-md-8\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n <div class=\"mb-3\">\r\n <div class=\"form-label\">{{'Cms::Title' | abpLocalization}}</div>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"title\"\r\n (blur)=\"setTitleToSlugBlur($event)\">\r\n </div>\r\n <ng-container *ngIf=\"isLoad\">\r\n <ng-container *ngFor=\"let item of showEntryType?.fieldTabs;let i =index\">\r\n <ng-container *ngFor=\"let el of item.fields;let i1 =index\">\r\n <ng-container *ngIf=\"el&&formEntity\">\r\n <df-dynamic [fields]=\"el\"\r\n [selected]=\"entryInfo ? entryInfo.extraProperties[el.field.name] : ''\"\r\n [parentFiledName]=\"'extraProperties'\"\r\n [culture]=\"cultureInput.value\" [entity]=\"formEntity\"></df-dynamic>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n <div class=\"mb-3\">\r\n <div class=\"form-label\">{{'Cms::Slug' | abpLocalization}}</div>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"slug\">\r\n <div class=\"text-danger\" *ngIf=\"slugInput.dirty\">\r\n {{slugInput?.errors?.repetition}}\r\n </div>\r\n </div>\r\n <div class=\"mb-3\">\r\n <div class=\"form-label\">{{'AbpUi::Languages' | abpLocalization}}</div>\r\n <select class=\"form-select form-select-multiple\" formControlName=\"culture\">\r\n <ng-container *ngFor=\"let item of languagesList;let i =index\">\r\n <option [value]=\"item.cultureName\">{{item.displayName}}</option>\r\n </ng-container>\r\n </select>\r\n <div class=\"text-danger\" *ngIf=\"cultureInput.dirty\">\r\n {{cultureInput?.errors?.repetition}}\r\n </div>\r\n </div>\r\n <div class=\"mb-3\" *ngIf=\"sectionInfo.type===1\">\r\n <label class=\"form-label\" for=\"parentId\">{{'Cms::ParentEntry' | abpLocalization}}</label>\r\n <select class=\"form-select \" formControlName=\"parentId\">\r\n <option value=\"\"></option>\r\n <ng-container *ngFor=\"let item of entryList;let i =index\">\r\n <option [value]=\"item.id\">{{item.title}}</option>\r\n <ng-container *ngFor=\"let el of item.children\">\r\n <ng-container *ngTemplateOutlet=\"childTemplate; context: {\r\n $implicit: {\r\n value: el,\r\n }\r\n }\"></ng-container>\r\n <ng-template #childTemplate let-data>\r\n <option [value]=\"data.value.id\">\r\n <ng-container *ngFor=\"let item of data.value.layer\">--</ng-container>\r\n {{data.value.title}}\r\n </option>\r\n <ng-container *ngFor=\"let el of data.value.children\">\r\n <ng-container *ngTemplateOutlet=\"childTemplate; context: {\r\n $implicit: {\r\n value: el,\r\n }\r\n }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </select>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"publishTime\">{{'Cms::PublishTime' | abpLocalization}}</label>\r\n <input type=\"datetime-local\" class=\"form-control\" step=\"1\" formControlName=\"publishTime\">\r\n </div>\r\n <div class=\"mb-3\" *ngIf=\"isEdit\">\r\n <label class=\"form-label\" for=\"Version\">{{'Cms::Version' | abpLocalization}}</label>\r\n <ul class=\"list-group\">\r\n <ng-container *ngFor=\"let item of AllVersionsList\">\r\n <li\r\n class=\"list-group-item flex-between d-flex align-items-center justify-content-between\">\r\n <div>\r\n {{item.initialVersionId?(item.creationTime| date: 'YYYY/MM/dd HH:mm:s'):('Cms::InitialVersion' | abpLocalization)}}\r\n <span class=\"badge text-bg-success ms-1\"\r\n *ngIf=\"item.isActivatedVersion\">{{'Cms::IsActive' | abpLocalization}}</span>\r\n <span class=\"badge text-bg-primary ms-1\"\r\n *ngIf=\"item.id === entryVersionId\">{{'Cms::Editing' |\r\n abpLocalization}}</span>\r\n </div>\r\n <div>\r\n <div ngbDropdown class=\"d-inline-block\">\r\n <button type=\"button\" class=\"btn btn-link-primary p-2 \"\r\n style=\"line-height: 0;\" id=\"dropdownBasic1\" ngbDropdownToggle>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\r\n <button ngbDropdownItem type=\"button\" *ngIf=\"!item.isActivatedVersion\"\r\n (click)=\"ActivatedVersion(item.id)\">\r\n <i class=\"fas fa-check me-1\"></i>{{'Cms::IsActive' |\r\n abpLocalization}}\r\n </button>\r\n <button ngbDropdownItem type=\"button\"\r\n routerLink=\"/cms/admin/entries/create\"\r\n [queryParams]=\"{entryVersionId:item.id}\">\r\n <i class=\"fas fa-plus me-1\"></i>{{'Cms::NewVersion' |\r\n abpLocalization}}\r\n </button>\r\n <button ngbDropdownItem type=\"button\" (click.stop)=\"toEditUrl(item.id)\"\r\n *ngIf=\"item.id !== entryVersionId\">\r\n <i class=\"fas fa-edit me-1\"></i>{{'AbpUi::Edit' | abpLocalization}}\r\n </button>\r\n <button ngbDropdownItem type=\"button\"\r\n (click.stop)=\"delectVersion(item.id)\"\r\n *ngIf=\"item.initialVersionId&&!item.isActivatedVersion&&item.id !== entryVersionId\">\r\n <i class=\"fas fa-trash me-1\"></i>{{'AbpUi::Delete' |\r\n abpLocalization}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n <div class=\"mb-3\" *ngIf=\"entryInfo\">\r\n <label class=\"form-label\" for=\"versionNotes\">{{'Cms::RevisionNotes' | abpLocalization}}</label>\r\n <textarea class=\"form-control\" formControlName=\"versionNotes\" rows=\"3\"></textarea>\r\n </div>\r\n\r\n\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <button type=\"submit\" style=\"display: none;\" #submitclick></button>\r\n</form>" }]
212
266
  }], propDecorators: { isEdit: [{
213
267
  type: Input
214
268
  }], sectionId: [{
@@ -223,4 +277,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImpor
223
277
  type: ViewChild,
224
278
  args: ['submitclick', { static: true }]
225
279
  }] } });
226
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLW9yLWVkaXQtZW50cmllcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbXMvc3JjL2xpYi9jb21wb25lbnRzL2FkbWluL2VudHJpZXMvY3JlYXRlLW9yLWVkaXQtZW50cmllcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbXMvc3JjL2xpYi9jb21wb25lbnRzL2FkbWluL2VudHJpZXMvY3JlYXRlLW9yLWVkaXQtZW50cmllcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQWMsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFaEYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7Ozs7Ozs7QUFPN0UsTUFBTSxPQUFPLDRCQUE0QjtJQUx6QztRQU1VLFlBQU8sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbEMsY0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3pDLHlCQUFvQixHQUFHLE1B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QkFBdEQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uZmlnU3RhdGVTZXJ2aWNlLCBMb2NhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnQGFicC9uZy5jb3JlJztcbmltcG9ydCB7IFRvYXN0ZXJTZXJ2aWNlIH0gZnJvbSAnQGFicC9uZy50aGVtZS5zaGFyZWQnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBpbmplY3QsIElucHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgRGF0ZVBpcGUsIExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENtc0FwaVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBTZWN0aW9uQWRtaW5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vcHJveHkvZGlnbml0ZS9jbXMvYWRtaW4vc2VjdGlvbnMnO1xuaW1wb3J0IHsgRW50cnlBZG1pblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9wcm94eS9kaWduaXRlL2Ntcy9hZG1pbi9lbnRyaWVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY21zLWNyZWF0ZS1vci1lZGl0LWVudHJpZXMnLFxuICB0ZW1wbGF0ZVVybDogJy4vY3JlYXRlLW9yLWVkaXQtZW50cmllcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NyZWF0ZS1vci1lZGl0LWVudHJpZXMuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQ3JlYXRlT3JFZGl0RW50cmllc0NvbXBvbmVudCB7XG4gIHByaXZhdGUgdG9hc3RlciA9IGluamVjdChUb2FzdGVyU2VydmljZSk7XG4gIHB1YmxpYyBfbG9jYXRpb24gPSBpbmplY3QoTG9jYXRpb24pO1xuICBwcml2YXRlIGNvbmZpZ1N0YXRlID0gaW5qZWN0KENvbmZpZ1N0YXRlU2VydmljZSk7XG4gIHByaXZhdGUgX1NlY3Rpb25BZG1pblNlcnZpY2UgPSBpbmplY3QoU2VjdGlvbkFkbWluU2VydmljZSk7XG4gIHByaXZhdGUgX0VudHJ5QWRtaW5TZXJ2aWNlID0gaW5qZWN0KEVudHJ5QWRtaW5TZXJ2aWNlKTtcbiAgcHJpdmF0ZSBkYXRlUGlwZSA9IGluamVjdChEYXRlUGlwZSk7XG4gIHByaXZhdGUgX0xvY2FsaXphdGlvblNlcnZpY2UgPSBpbmplY3QoTG9jYWxpemF0aW9uU2VydmljZSk7XG4gIHByaXZhdGUgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gIHByaXZhdGUgX0Ntc0FwaVNlcnZpY2UgPSBpbmplY3QoQ21zQXBpU2VydmljZSk7XG5cbiAgLyoq6K+t6KiA5YiX6KGoICovXG4gIGxhbmd1YWdlc0xpc3Q6IGFueVtdID0gW107XG4gIC8qKuadoeebruWIl+ihqC3pgInmi6nkuIrnuqfmnaHnm64gKi9cbiAgZW50cnlMaXN0OiBhbnlbXSA9IFtdO1xuICAvKirmnaHnm67kv6Hmga8gKi9cbiAgZW50cnlJbmZvOiBhbnkgPSAnJztcbiAgLyoq54mI5pys5L+h5oGvICovXG4gIHNlY3Rpb25JbmZvOiBhbnkgPSAnJztcbiAgLyoq6ZyA6KaB5bGV56S655qEYuadv+Wdl+S4i+adoeebruexu+WeiyAqL1xuICBzaG93RW50cnlUeXBlOiBhbnkgPSAnJztcbiAgLyoq54mI5pys5p2h55uuaWQgKi9cbiAgZW50cnlWZXJzaW9uSWQ6IGFueSA9ICcnO1xuICAvKirniYjmnKzliJfooaggKi9cbiAgQWxsVmVyc2lvbnNMaXN0OiBhbnlbXSA9IFtdO1xuXG4gIEBJbnB1dCgpIGlzRWRpdDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHNlY3Rpb25JZDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGVudHJ5VHlwZUlkOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgcHVibGljIHNldCBzZWxlY3QodjogYW55KSB7XG4gICAgdGhpcy5lbnRyeVZlcnNpb25JZCA9IHYuaWQ7XG4gICAgdGhpcy5lbnRyeUluZm8gPSB2O1xuICB9XG5cbiAgZm9ybUVudGl0eTogRm9ybUdyb3VwIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBzZXQgZW50aXR5KHZhbHVlOiBGb3JtR3JvdXAgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmZvcm1FbnRpdHkgPSB2YWx1ZTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGxldCBsYW5ndWFnZXMgPSB0aGlzLmNvbmZpZ1N0YXRlLmdldERlZXAoJ2xvY2FsaXphdGlvbi5sYW5ndWFnZXMnKTtcbiAgICAgIHRoaXMubGFuZ3VhZ2VzTGlzdCA9IGxhbmd1YWdlcztcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcbiAgICB9XG4gIH1cbiAgLyoq5piv5ZCm5Yqg6L295a6M5oiQICovXG4gIGlzTG9hZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKuivreiogOaOp+S7tiAqL1xuICBnZXQgY3VsdHVyZUlucHV0KCk6IEZvcm1Db250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtRW50aXR5Py5nZXQoJ2N1bHR1cmUnKSBhcyBGb3JtQ29udHJvbDtcbiAgfVxuXG4gIC8qKuiOt+WPluaPkOS6pOaMiemSruabv+i6q++8jOeUqOS6juecn+WunuinpuWPkeihqOWNleaPkOS6pCAqL1xuICBAVmlld0NoaWxkKCdzdWJtaXRjbGljaycsIHsgc3RhdGljOiB0cnVlIH0pIHN1Ym1pdGNsaWNrOiBFbGVtZW50UmVmO1xuXG4gIC8qKuWKoOi9veaVsOaNriAqL1xuICBhc3luYyBsb2FkRGF0YSgpIHtcbiAgICBpZiAodGhpcy5zZWN0aW9uSWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0U2VjdGlvbkluZm8oKTtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0RW50cnlMaXN0KCk7XG4gICAgfVxuICAgIHRoaXMuY3VsdHVyZUlucHV0LmRpc2FibGUoKTtcbiAgICBsZXQgcmVwZXRpdGlvbiA9IGF3YWl0IHRoaXMuY3VsdHVyZUFzeW5jVmFsaWRhdG9yKCk7XG4gICAgaWYgKHJlcGV0aXRpb24pIHRoaXMuY3VsdHVyZUlucHV0LnNldEVycm9ycyhyZXBldGl0aW9uKTtcbiAgICBpZiAodGhpcy5lbnRyeUluZm8pIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0QWxsVmVyc2lvbnNMaXN0KCk7XG4gICAgICB0aGlzLmZvcm1FbnRpdHkucGF0Y2hWYWx1ZSh7XG4gICAgICAgIGVudHJ5VHlwZUlkOiB0aGlzLmVudHJ5SW5mby5lbnRyeVR5cGVJZCxcbiAgICAgICAgcHVibGlzaFRpbWU6IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHRoaXMuZW50cnlJbmZvLnB1Ymxpc2hUaW1lLCAneXl5eS1NTS1kZCBISDptbTpzcycpLFxuICAgICAgICB0aXRsZTogdGhpcy5lbnRyeUluZm8udGl0bGUsXG4gICAgICAgIHNsdWc6IHRoaXMuZW50cnlJbmZvLnNsdWcsXG4gICAgICAgIHBhcmVudElkOiB0aGlzLmVudHJ5SW5mby5wYXJlbnRJZCxcbiAgICAgICAgdmVyc2lvbk5vdGVzOiB0aGlzLmVudHJ5SW5mby52ZXJzaW9uTm90ZXMsXG4gICAgICAgIGluaXRpYWxWZXJzaW9uSWQ6IHRoaXMuZW50cnlJbmZvLmlkLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybUVudGl0eS5wYXRjaFZhbHVlKHtcbiAgICAgICAgZW50cnlUeXBlSWQ6IHRoaXMuZW50cnlUeXBlSWQsXG4gICAgICAgIHB1Ymxpc2hUaW1lOiB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShuZXcgRGF0ZSgpLCAneXl5eS1NTS1kZCBISDptbTpzcycpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuaXNMb2FkID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc3VibWl0Y2xpY2s/Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKuWumuS5ieiHquWumuS5ieW8guatpemqjOivgSAqL1xuICBjdWx0dXJlQXN5bmNWYWxpZGF0b3IoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgbGV0IGN1bHR1cmUgPSB0aGlzLmN1bHR1cmVJbnB1dC52YWx1ZTtcbiAgICAgIGlmIChjdWx0dXJlID09IHRoaXMuZW50cnlJbmZvPy5jdWx0dXJlIHx8IHRoaXMuc2VjdGlvbkluZm8udHlwZSAhPT0gMCkgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgICB0aGlzLl9FbnRyeUFkbWluU2VydmljZVxuICAgICAgICAuY3VsdHVyZUV4aXN0V2l0aFNpbmdsZVNlY3Rpb24oe1xuICAgICAgICAgIGN1bHR1cmU6IGN1bHR1cmUsXG4gICAgICAgICAgc2VjdGlvbklkOiB0aGlzLnNlY3Rpb25JZCxcbiAgICAgICAgICBlbnRyeVR5cGVJZDogdGhpcy5lbnRyeVR5cGVJZCxcbiAgICAgICAgfSlcbiAgICAgICAgLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICByZXBldGl0aW9uOiB0aGlzLl9Mb2NhbGl6YXRpb25TZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgICAgICAgICAgYENtczo6RW50cmllc0FscmVhZHlFeGlzdEVudHJ5VHlwZWAsXG4gICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgdGhpcy5sYW5ndWFnZXNMaXN0LmZpbmQoZWwgPT4gZWwuY3VsdHVyZU5hbWUgPT0gY3VsdHVyZSkuZGlzcGxheU5hbWVcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKirojrflj5bmnb/lnZfkv6Hmga8gKi9cbiAgZ2V0U2VjdGlvbkluZm8oKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuX1NlY3Rpb25BZG1pblNlcnZpY2UuZ2V0KHRoaXMuc2VjdGlvbklkKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgdGhpcy5zaG93RW50cnlUeXBlID0gcmVzLmVudHJ5VHlwZXMuZmluZChlbCA9PiBlbC5pZCA9PSB0aGlzLmVudHJ5VHlwZUlkKTtcbiAgICAgICAgdGhpcy5zZWN0aW9uSW5mbyA9IHJlcztcbiAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgLyoq6I635Y+W5p2/5Z2X5LiL5omA5pyJ5p2h55uuICovXG4gIGdldEVudHJ5TGlzdCgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdHMpID0+IHtcbiAgICAgIHRoaXMuX0VudHJ5QWRtaW5TZXJ2aWNlXG4gICAgICAgIC5nZXRMaXN0KHtcbiAgICAgICAgICBzZWN0aW9uSWQ6IHRoaXMuc2VjdGlvbklkLFxuICAgICAgICAgIG1heFJlc3VsdENvdW50OiAxMDAwLFxuICAgICAgICAgIGN1bHR1cmU6IHRoaXMuY3VsdHVyZUlucHV0LnZhbHVlLFxuICAgICAgICB9KVxuICAgICAgICAuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIGxldCBlbnRyeUxpc3QgPSByZXMuaXRlbXMuZmlsdGVyKGVsID0+IGVsLmlkICE9PSB0aGlzLmVudHJ5SW5mbz8uaWQpO1xuICAgICAgICAgIGxldCBwYXJlbnRMaXN0ID0gZW50cnlMaXN0LmZpbHRlcihlbCA9PiAhZWwucGFyZW50SWQpO1xuICAgICAgICAgIHBhcmVudExpc3QuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgICBsZXQgbGF5ZXI6IG51bWJlciA9IDA7XG4gICAgICAgICAgICBlbC5sYXllciA9IG5ldyBBcnJheShsYXllcik7XG4gICAgICAgICAgICBlbC5jaGlsZHJlbiA9IHRoaXMuZ3JvdXBCeVBhcmVudElkKGVudHJ5TGlzdCwgZWwuaWQsIGxheWVyICsgMSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5lbnRyeUxpc3QgPSBwYXJlbnRMaXN0O1xuICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgLyoq5a+55pWw57uE5oyJ54Wn54i25a2Q5YWz57O76L+b6KGM5YiG57uEICovXG4gIGdyb3VwQnlQYXJlbnRJZChhcnIsIGlkID0gJycsIGxheWVyKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIHJlc3VsdCA9IGFyci5maWx0ZXIoZWwgPT4gZWwucGFyZW50SWQgPT0gaWQpO1xuICAgIHJlc3VsdC5mb3JFYWNoKGVsID0+IHtcbiAgICAgIGVsLmxheWVyID0gbmV3IEFycmF5KGxheWVyKTtcbiAgICAgIGVsLmNoaWxkcmVuID0gdGhpcy5ncm91cEJ5UGFyZW50SWQoYXJyLCBlbC5pZCwgbGF5ZXIgKyAxKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKuagh+mimOi9rOWMluWIq+WQjSAqL1xuICBzZXRUaXRsZVRvU2x1Z0JsdXIoZXZlbnQpIHtcbiAgICBsZXQgdmFsID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIGxldCBzbHVnID0gdGhpcy5mb3JtRW50aXR5LmdldCgnc2x1ZycpO1xuICAgIGxldCBwaW55aW5zdHIgPSAnJztcbiAgICBpZiAoc2x1Zy52YWx1ZSkgcmV0dXJuO1xuICAgIHBpbnlpbnN0ciA9IHRoaXMuX0Ntc0FwaVNlcnZpY2UuY2hpbmVzZVRvUGlueWluKHZhbCk7XG4gICAgdGhpcy5mb3JtRW50aXR5LnBhdGNoVmFsdWUoe1xuICAgICAgc2x1ZzogcGlueWluc3RyIHx8IHZhbCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKuiOt+WPluadoeebrueJiOacrOWIl+ihqCAqL1xuICBnZXRBbGxWZXJzaW9uc0xpc3QoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3RzKSA9PiB7XG4gICAgICB0aGlzLl9FbnRyeUFkbWluU2VydmljZS5nZXRBbGxWZXJzaW9ucyh0aGlzLmVudHJ5SW5mby5pZCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgIHRoaXMuQWxsVmVyc2lvbnNMaXN0ID0gcmVzLml0ZW1zO1xuICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKua/gOa0uyAqL1xuICBBY3RpdmF0ZWRWZXJzaW9uKFZlcnNpb25JZCkge1xuICAgIHRoaXMuX0VudHJ5QWRtaW5TZXJ2aWNlLmFjdGl2YXRlKFZlcnNpb25JZCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICB0aGlzLkFsbFZlcnNpb25zTGlzdC5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgZWwuaXNBY3RpdmF0ZWRWZXJzaW9uID0gZWwuaWQgPT09IFZlcnNpb25JZDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG4gIC8qKue8lui+keeJiOacrCAqL1xuICB0b0VkaXRVcmwoaWQpIHtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKCcnLCB7IHNraXBMb2NhdGlvbkNoYW5nZTogdHJ1ZSB9KS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgL2Ntcy9hZG1pbi9lbnRyaWVzLyR7aWR9L2VkaXRgXSk7XG4gICAgfSk7XG4gIH1cbiAgLyoq5Yig6Zmk54mI5pysICovXG4gIGRlbGVjdFZlcnNpb24odmlkKSB7XG4gICAgdGhpcy5fRW50cnlBZG1pblNlcnZpY2UuZGVsZXRlKHZpZCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICB0aGlzLnRvYXN0ZXIuc3VjY2Vzcyh0aGlzLl9Mb2NhbGl6YXRpb25TZXJ2aWNlLmluc3RhbnQoYEFicFVpOjpEZWxldGVkU3VjY2Vzc2Z1bGx5YCkpO1xuICAgICAgdGhpcy5nZXRBbGxWZXJzaW9uc0xpc3QoKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtRW50aXR5XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC04XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tbGFiZWxcIj57eydDbXM6OlRpdGxlJyB8IGFicExvY2FsaXphdGlvbn19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwic2V0VGl0bGVUb1NsdWdCbHVyKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNMb2FkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc2hvd0VudHJ5VHlwZT8uZmllbGRUYWJzO2xldCBpID1pbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZWwgb2YgaXRlbS5maWVsZHM7bGV0IGkxID1pbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbCYmZm9ybUVudGl0eVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGYtZHluYW1pYyBbZmllbGRzXT1cImVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJlbnRyeUluZm8gPyBlbnRyeUluZm8uZXh0cmFQcm9wZXJ0aWVzW2VsLmZpZWxkLm5hbWVdIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcmVudEZpbGVkTmFtZV09XCInZXh0cmFQcm9wZXJ0aWVzJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY3VsdHVyZV09XCJjdWx0dXJlSW5wdXQudmFsdWVcIiAgW2VudGl0eV09XCJmb3JtRW50aXR5XCI+PC9kZi1keW5hbWljPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3snQ21zOjpTbHVnJyB8IGFicExvY2FsaXphdGlvbn19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwic2x1Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3snQWJwVWk6Okxhbmd1YWdlcycgfCBhYnBMb2NhbGl6YXRpb259fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3QtbXVsdGlwbGVcIiBmb3JtQ29udHJvbE5hbWU9XCJjdWx0dXJlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGxhbmd1YWdlc0xpc3Q7bGV0IGkgPWluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiaXRlbS5jdWx0dXJlTmFtZVwiPnt7aXRlbS5kaXNwbGF5TmFtZX19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3VsdHVyZUlucHV0LmRpcnR5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2N1bHR1cmVJbnB1dD8uZXJyb3JzPy5yZXBldGl0aW9ufX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIiAqbmdJZj1cInNlY3Rpb25JbmZvLnR5cGU9PT0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIiBmb3I9XCJwYXJlbnRJZFwiPnt7J0Ntczo6UGFyZW50RW50cnknIHwgYWJwTG9jYWxpemF0aW9ufX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgXCIgZm9ybUNvbnRyb2xOYW1lPVwicGFyZW50SWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj48L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZW50cnlMaXN0O2xldCBpID1pbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIml0ZW0uaWRcIj57e2l0ZW0udGl0bGV9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsIG9mIGl0ZW0uY2hpbGRyZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNoaWxkVGVtcGxhdGU7IGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2hpbGRUZW1wbGF0ZSBsZXQtZGF0YT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cImRhdGEudmFsdWUuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRhdGEudmFsdWUubGF5ZXJcIj4tLTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZGF0YS52YWx1ZS50aXRsZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsIG9mIGRhdGEudmFsdWUuY2hpbGRyZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2hpbGRUZW1wbGF0ZTsgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiIGZvcj1cInB1Ymxpc2hUaW1lXCI+e3snQ21zOjpQdWJsaXNoVGltZScgfCBhYnBMb2NhbGl6YXRpb259fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHN0ZXA9XCIxXCIgZm9ybUNvbnRyb2xOYW1lPVwicHVibGlzaFRpbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiICpuZ0lmPVwiaXNFZGl0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIiBmb3I9XCJWZXJzaW9uXCI+e3snQ21zOjpWZXJzaW9uJyB8IGFicExvY2FsaXphdGlvbn19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBBbGxWZXJzaW9uc0xpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gZmxleC1iZXR3ZWVuIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS5pbml0aWFsVmVyc2lvbklkPyhpdGVtLmNyZWF0aW9uVGltZXwgZGF0ZTogJ1lZWVkvTU0vZGQgSEg6bW06cycpOignQ21zOjpJbml0aWFsVmVyc2lvbicgfCBhYnBMb2NhbGl6YXRpb24pfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgdGV4dC1iZy1zdWNjZXNzIG1zLTFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5pc0FjdGl2YXRlZFZlcnNpb25cIj57eydDbXM6OklzQWN0aXZlJyB8IGFicExvY2FsaXphdGlvbn19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSB0ZXh0LWJnLXByaW1hcnkgbXMtMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLmlkID09PSBlbnRyeVZlcnNpb25JZFwiPnt7J0Ntczo6RWRpdGluZycgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicExvY2FsaXphdGlvbn19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd24gY2xhc3M9XCJkLWlubGluZS1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saW5rLXByaW1hcnkgcC0yIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwibGluZS1oZWlnaHQ6IDA7XCIgaWQ9XCJkcm9wZG93bkJhc2ljMVwiIG5nYkRyb3Bkb3duVG9nZ2xlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGFyaWEtbGFiZWxsZWRieT1cImRyb3Bkb3duQmFzaWMxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiRHJvcGRvd25JdGVtIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cIiFpdGVtLmlzQWN0aXZhdGVkVmVyc2lvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiQWN0aXZhdGVkVmVyc2lvbihpdGVtLmlkKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hlY2sgbWUtMVwiPjwvaT57eydDbXM6OklzQWN0aXZlJyB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnBMb2NhbGl6YXRpb259fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JEcm9wZG93bkl0ZW0gdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZXJMaW5rPVwiL2Ntcy9hZG1pbi9lbnRyaWVzL2NyZWF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwie2VudHJ5VmVyc2lvbklkOml0ZW0uaWR9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1wbHVzIG1lLTFcIj48L2k+e3snQ21zOjpOZXdWZXJzaW9uJyB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnBMb2NhbGl6YXRpb259fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JEcm9wZG93bkl0ZW0gdHlwZT1cImJ1dHRvblwiIChjbGljay5zdG9wKT1cInRvRWRpdFVybChpdGVtLmlkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0uaWQgIT09IGVudHJ5VmVyc2lvbklkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1lZGl0IG1lLTFcIj48L2k+e3snQWJwVWk6OkVkaXQnIHwgYWJwTG9jYWxpemF0aW9ufX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiRHJvcGRvd25JdGVtIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrLnN0b3ApPVwiZGVsZWN0VmVyc2lvbihpdGVtLmlkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0uaW5pdGlhbFZlcnNpb25JZCYmIWl0ZW0uaXNBY3RpdmF0ZWRWZXJzaW9uJiZpdGVtLmlkICE9PSBlbnRyeVZlcnNpb25JZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdHJhc2ggbWUtMVwiPjwvaT57eydBYnBVaTo6RGVsZXRlJyB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnBMb2NhbGl6YXRpb259fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIiAqbmdJZj1cImVudHJ5SW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCIgZm9yPVwidmVyc2lvbk5vdGVzXCI+e3snQ21zOjpSZXZpc2lvbk5vdGVzJyB8IGFicExvY2FsaXphdGlvbn19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwidmVyc2lvbk5vdGVzXCIgcm93cz1cIjNcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgI3N1Ym1pdGNsaWNrPjwvYnV0dG9uPlxyXG48L2Zvcm0+Il19
280
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLW9yLWVkaXQtZW50cmllcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbXMvc3JjL2xpYi9jb21wb25lbnRzL2FkbWluL2VudHJpZXMvY3JlYXRlLW9yLWVkaXQtZW50cmllcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbXMvc3JjL2xpYi9jb21wb25lbnRzL2FkbWluL2VudHJpZXMvY3JlYXRlLW9yLWVkaXQtZW50cmllcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQWMsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkcsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7Ozs7Ozs7QUFRN0UsTUFBTSxPQUFPLDRCQUE0QjtJQUx6QztRQU1VLFlBQU8sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbEMsY0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3pDLHlC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LENBQUM7SUFDRCxVQUFVO0lBQ1YsU0FBUyxDQUFDLEVBQUU7UUFDVixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDcEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxzQkFBc0IsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELFVBQVU7SUFDVixhQUFhLENBQUMsR0FBRztRQUNmLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2xELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDO1lBQ3RGLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs4R0F4UVUsNEJBQTRCO2tHQUE1Qiw0QkFBNEIsa1RDaEJ6Qyw4N1NBMklPOzsyRkQzSE0sNEJBQTRCO2tCQUx4QyxTQUFTOytCQUNFLDRCQUE0Qjs4QkErQjdCLE1BQU07c0JBQWQsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ2MsTUFBTTtzQkFBekIsS0FBSztnQkFNTyxNQUFNO3NCQUFsQixLQUFLO2dCQW9Cc0MsV0FBVztzQkFBdEQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uZmlnU3RhdGVTZXJ2aWNlLCBMb2NhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnQGFicC9uZy5jb3JlJztcbmltcG9ydCB7IFRvYXN0ZXJTZXJ2aWNlIH0gZnJvbSAnQGFicC9uZy50aGVtZS5zaGFyZWQnO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgaW5qZWN0LCBJbnB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRpb25FcnJvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgRGF0ZVBpcGUsIExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENtc0FwaVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBTZWN0aW9uQWRtaW5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vcHJveHkvZGlnbml0ZS9jbXMvYWRtaW4vc2VjdGlvbnMnO1xuaW1wb3J0IHsgRW50cnlBZG1pblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9wcm94eS9kaWduaXRlL2Ntcy9hZG1pbi9lbnRyaWVzJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY21zLWNyZWF0ZS1vci1lZGl0LWVudHJpZXMnLFxuICB0ZW1wbGF0ZVVybDogJy4vY3JlYXRlLW9yLWVkaXQtZW50cmllcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NyZWF0ZS1vci1lZGl0LWVudHJpZXMuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQ3JlYXRlT3JFZGl0RW50cmllc0NvbXBvbmVudCB7XG4gIHByaXZhdGUgdG9hc3RlciA9IGluamVjdChUb2FzdGVyU2VydmljZSk7XG4gIHB1YmxpYyBfbG9jYXRpb24gPSBpbmplY3QoTG9jYXRpb24pO1xuICBwcml2YXRlIGNvbmZpZ1N0YXRlID0gaW5qZWN0KENvbmZpZ1N0YXRlU2VydmljZSk7XG4gIHByaXZhdGUgX1NlY3Rpb25BZG1pblNlcnZpY2UgPSBpbmplY3QoU2VjdGlvbkFkbWluU2VydmljZSk7XG4gIHByaXZhdGUgX0VudHJ5QWRtaW5TZXJ2aWNlID0gaW5qZWN0KEVudHJ5QWRtaW5TZXJ2aWNlKTtcbiAgcHJpdmF0ZSBkYXRlUGlwZSA9IGluamVjdChEYXRlUGlwZSk7XG4gIHByaXZhdGUgX0xvY2FsaXphdGlvblNlcnZpY2UgPSBpbmplY3QoTG9jYWxpemF0aW9uU2VydmljZSk7XG4gIHByaXZhdGUgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gIHByaXZhdGUgX0Ntc0FwaVNlcnZpY2UgPSBpbmplY3QoQ21zQXBpU2VydmljZSk7XG4gIHByaXZhdGUgY2RSZWYgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIC8qKuivreiogOWIl+ihqCAqL1xuICBsYW5ndWFnZXNMaXN0OiBhbnlbXSA9IFtdO1xuICAvKirmnaHnm67liJfooagt6YCJ5oup5LiK57qn5p2h55uuICovXG4gIGVudHJ5TGlzdDogYW55W10gPSBbXTtcbiAgLyoq5p2h55uu5L+h5oGvICovXG4gIGVudHJ5SW5mbzogYW55ID0gJyc7XG4gIC8qKueJiOacrOS/oeaBryAqL1xuICBzZWN0aW9uSW5mbzogYW55ID0gJyc7XG4gIC8qKumcgOimgeWxleekuueahGLmnb/lnZfkuIvmnaHnm67nsbvlnosgKi9cbiAgc2hvd0VudHJ5VHlwZTogYW55ID0gJyc7XG4gIC8qKueJiOacrOadoeebrmlkICovXG4gIGVudHJ5VmVyc2lvbklkOiBhbnkgPSAnJztcbiAgLyoq54mI5pys5YiX6KGoICovXG4gIEFsbFZlcnNpb25zTGlzdDogYW55W10gPSBbXTtcblxuICBASW5wdXQoKSBpc0VkaXQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSBzZWN0aW9uSWQ6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBlbnRyeVR5cGVJZDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgc2VsZWN0KHY6IGFueSkge1xuICAgIHRoaXMuZW50cnlWZXJzaW9uSWQgPSB2LmlkO1xuICAgIHRoaXMuZW50cnlJbmZvID0gdjtcbiAgfVxuXG4gIGZvcm1FbnRpdHk6IEZvcm1Hcm91cCB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgc2V0IGVudGl0eSh2YWx1ZTogRm9ybUdyb3VwIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5mb3JtRW50aXR5ID0gdmFsdWU7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBsZXQgbGFuZ3VhZ2VzID0gdGhpcy5jb25maWdTdGF0ZS5nZXREZWVwKCdsb2NhbGl6YXRpb24ubGFuZ3VhZ2VzJyk7XG4gICAgICB0aGlzLmxhbmd1YWdlc0xpc3QgPSBsYW5ndWFnZXM7XG4gICAgICB0aGlzLmxvYWREYXRhKCk7XG4gICAgfVxuICB9XG4gIC8qKuaYr+WQpuWKoOi9veWujOaIkCAqL1xuICBpc0xvYWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiror63oqIDmjqfku7YgKi9cbiAgZ2V0IGN1bHR1cmVJbnB1dCgpOiBGb3JtQ29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUVudGl0eT8uZ2V0KCdjdWx0dXJlJykgYXMgRm9ybUNvbnRyb2w7XG4gIH1cbiAgZ2V0IHNsdWdJbnB1dCgpOiBGb3JtQ29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUVudGl0eT8uZ2V0KCdzbHVnJykgYXMgRm9ybUNvbnRyb2w7XG4gIH1cblxuICAvKirojrflj5bmj5DkuqTmjInpkq7mm7/ouqvvvIznlKjkuo7nnJ/lrp7op6blj5HooajljZXmj5DkuqQgKi9cbiAgQFZpZXdDaGlsZCgnc3VibWl0Y2xpY2snLCB7IHN0YXRpYzogdHJ1ZSB9KSBzdWJtaXRjbGljazogRWxlbWVudFJlZjtcblxuICAvKirliqDovb3mlbDmja4gKi9cbiAgYXN5bmMgbG9hZERhdGEoKSB7XG4gICAgaWYgKHRoaXMuc2VjdGlvbklkKSB7XG4gICAgICBhd2FpdCB0aGlzLmdldFNlY3Rpb25JbmZvKCk7XG4gICAgICBhd2FpdCB0aGlzLmdldEVudHJ5TGlzdCgpO1xuICAgIH1cbiAgICB0aGlzLmN1bHR1cmVJbnB1dC5kaXNhYmxlKCk7XG4gICAgbGV0IHJlcGV0aXRpb24gPSBhd2FpdCB0aGlzLmN1bHR1cmVBc3luY1ZhbGlkYXRvcigpO1xuICAgIGlmIChyZXBldGl0aW9uKSB0aGlzLmN1bHR1cmVJbnB1dC5zZXRFcnJvcnMocmVwZXRpdGlvbik7XG4gICAgdGhpcy5zbHVnSW5wdXQuYWRkQXN5bmNWYWxpZGF0b3JzKHRoaXMuU2x1Z0FzeW5jVmFsaWRhdG9yKCkpO1xuICAgIFxuXG4gICAgaWYgKHRoaXMuZW50cnlJbmZvKSB7XG4gICAgICAvLyB0aGlzLnNsdWdJbnB1dC5yZXNldCh0aGlzLmVudHJ5SW5mby5zbHVnKTtcbiAgICAgIC8vIHRoaXMuc2x1Z0lucHV0LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0QWxsVmVyc2lvbnNMaXN0KCk7XG4gICAgICB0aGlzLmZvcm1FbnRpdHkucGF0Y2hWYWx1ZSh7XG4gICAgICAgIGVudHJ5VHlwZUlkOiB0aGlzLmVudHJ5SW5mby5lbnRyeVR5cGVJZCxcbiAgICAgICAgcHVibGlzaFRpbWU6IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHRoaXMuZW50cnlJbmZvLnB1Ymxpc2hUaW1lLCAneXl5eS1NTS1kZCBISDptbTpzcycpLFxuICAgICAgICB0aXRsZTogdGhpcy5lbnRyeUluZm8udGl0bGUsXG4gICAgICAgIHNsdWc6IHRoaXMuZW50cnlJbmZvLnNsdWcsXG4gICAgICAgIHBhcmVudElkOiB0aGlzLmVudHJ5SW5mby5wYXJlbnRJZCxcbiAgICAgICAgdmVyc2lvbk5vdGVzOiB0aGlzLmVudHJ5SW5mby52ZXJzaW9uTm90ZXMsXG4gICAgICAgIGluaXRpYWxWZXJzaW9uSWQ6IHRoaXMuZW50cnlJbmZvLmlkLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnNsdWdJbnB1dC5zZXRFcnJvcnMoe30pXG4gICAgICB0aGlzLnNsdWdJbnB1dC5zZXRFcnJvcnMobnVsbClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb3JtRW50aXR5LnBhdGNoVmFsdWUoe1xuICAgICAgICBlbnRyeVR5cGVJZDogdGhpcy5lbnRyeVR5cGVJZCxcbiAgICAgICAgcHVibGlzaFRpbWU6IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKG5ldyBEYXRlKCksICd5eXl5LU1NLWRkIEhIOm1tOnNzJyksXG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5pc0xvYWQgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zdWJtaXRjbGljaz8ubmF0aXZlRWxlbWVudC5jbGljaygpO1xuICAgIH0sIDApO1xuICB9XG4gIC8vIC8qKuWIq+WQjeafpemHjSAqL1xuICBTbHVnQXN5bmNWYWxpZGF0b3IoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbFxuICAgICk6IFByb21pc2U8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+IHwgT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4gPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIHJlc29sdmUgPT4ge1xuICAgICAgICBsZXQgdG91Y2hlZE9yRGlydHkgPSBjb250cm9sLnRvdWNoZWQgfHwgY29udHJvbC5kaXJ0eTtcbiAgICAgICAgaWYgKCBjb250cm9sLnZhbHVlKSB7XG4gICAgICAgICAgaWYgKGNvbnRyb2wudmFsdWUgPT0gdGhpcy5lbnRyeUluZm8/LnNsdWcpIHtcbiAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX0VudHJ5QWRtaW5TZXJ2aWNlXG4gICAgICAgICAgICAuc2x1Z0V4aXN0cyh7XG4gICAgICAgICAgICAgIGN1bHR1cmU6IHRoaXMuY3VsdHVyZUlucHV0LnZhbHVlLFxuICAgICAgICAgICAgICBzZWN0aW9uSWQ6IHRoaXMuc2VjdGlvbklkLFxuICAgICAgICAgICAgICBzbHVnOiBjb250cm9sLnZhbHVlLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgcmVwZXRpdGlvbjogdGhpcy5fTG9jYWxpemF0aW9uU2VydmljZS5pbnN0YW50KFxuICAgICAgICAgICAgICAgICAgICBgQ21zOjpFbnRyeVNsdWd7MH1BbHJlYWR5RXhpc3RgLFxuICAgICAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgLyoq5a6a5LmJ6Ieq5a6a5LmJ5byC5q2l6aqM6K+BICovXG4gIGN1bHR1cmVBc3luY1ZhbGlkYXRvcigpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBsZXQgY3VsdHVyZSA9IHRoaXMuY3VsdHVyZUlucHV0LnZhbHVlO1xuICAgICAgaWYgKGN1bHR1cmUgPT0gdGhpcy5lbnRyeUluZm8/LmN1bHR1cmUgfHwgdGhpcy5zZWN0aW9uSW5mby50eXBlICE9PSAwKSByZXR1cm4gcmVzb2x2ZShudWxsKTtcbiAgICAgIHRoaXMuX0VudHJ5QWRtaW5TZXJ2aWNlXG4gICAgICAgIC5jdWx0dXJlRXhpc3RXaXRoU2luZ2xlU2VjdGlvbih7XG4gICAgICAgICAgY3VsdHVyZTogY3VsdHVyZSxcbiAgICAgICAgICBzZWN0aW9uSWQ6IHRoaXMuc2VjdGlvbklkLFxuICAgICAgICAgIGVudHJ5VHlwZUlkOiB0aGlzLmVudHJ5VHlwZUlkLFxuICAgICAgICB9KVxuICAgICAgICAuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgIHJlcGV0aXRpb246IHRoaXMuX0xvY2FsaXphdGlvblNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgICAgICAgICBgQ21zOjpFbnRyaWVzQWxyZWFkeUV4aXN0RW50cnlUeXBlYCxcbiAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICB0aGlzLmxhbmd1YWdlc0xpc3QuZmluZChlbCA9PiBlbC5jdWx0dXJlTmFtZSA9PSBjdWx0dXJlKS5kaXNwbGF5TmFtZVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKuiOt+WPluadv+Wdl+S/oeaBryAqL1xuICBnZXRTZWN0aW9uSW5mbygpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5fU2VjdGlvbkFkbWluU2VydmljZS5nZXQodGhpcy5zZWN0aW9uSWQpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICB0aGlzLnNob3dFbnRyeVR5cGUgPSByZXMuZW50cnlUeXBlcy5maW5kKGVsID0+IGVsLmlkID09IHRoaXMuZW50cnlUeXBlSWQpO1xuICAgICAgICB0aGlzLnNlY3Rpb25JbmZvID0gcmVzO1xuICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICAvKirojrflj5bmnb/lnZfkuIvmiYDmnInmnaHnm64gKi9cbiAgZ2V0RW50cnlMaXN0KCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0cykgPT4ge1xuICAgICAgdGhpcy5fRW50cnlBZG1pblNlcnZpY2VcbiAgICAgICAgLmdldExpc3Qoe1xuICAgICAgICAgIHNlY3Rpb25JZDogdGhpcy5zZWN0aW9uSWQsXG4gICAgICAgICAgbWF4UmVzdWx0Q291bnQ6IDEwMDAsXG4gICAgICAgICAgY3VsdHVyZTogdGhpcy5jdWx0dXJlSW5wdXQudmFsdWUsXG4gICAgICAgIH0pXG4gICAgICAgIC5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgbGV0IGVudHJ5TGlzdCA9IHJlcy5pdGVtcy5maWx0ZXIoZWwgPT4gZWwuaWQgIT09IHRoaXMuZW50cnlJbmZvPy5pZCk7XG4gICAgICAgICAgbGV0IHBhcmVudExpc3QgPSBlbnRyeUxpc3QuZmlsdGVyKGVsID0+ICFlbC5wYXJlbnRJZCk7XG4gICAgICAgICAgcGFyZW50TGlzdC5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgIGxldCBsYXllcjogbnVtYmVyID0gMDtcbiAgICAgICAgICAgIGVsLmxheWVyID0gbmV3IEFycmF5KGxheWVyKTtcbiAgICAgICAgICAgIGVsLmNoaWxkcmVuID0gdGhpcy5ncm91cEJ5UGFyZW50SWQoZW50cnlMaXN0LCBlbC5pZCwgbGF5ZXIgKyAxKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmVudHJ5TGlzdCA9IHBhcmVudExpc3Q7XG4gICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICAvKirlr7nmlbDnu4TmjInnhafniLblrZDlhbPns7vov5vooYzliIbnu4QgKi9cbiAgZ3JvdXBCeVBhcmVudElkKGFyciwgaWQgPSAnJywgbGF5ZXIpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgcmVzdWx0ID0gYXJyLmZpbHRlcihlbCA9PiBlbC5wYXJlbnRJZCA9PSBpZCk7XG4gICAgcmVzdWx0LmZvckVhY2goZWwgPT4ge1xuICAgICAgZWwubGF5ZXIgPSBuZXcgQXJyYXkobGF5ZXIpO1xuICAgICAgZWwuY2hpbGRyZW4gPSB0aGlzLmdyb3VwQnlQYXJlbnRJZChhcnIsIGVsLmlkLCBsYXllciArIDEpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoq5qCH6aKY6L2s5YyW5Yir5ZCNICovXG4gIHNldFRpdGxlVG9TbHVnQmx1cihldmVudCkge1xuICAgIGxldCB2YWwgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgbGV0IHNsdWcgPSB0aGlzLmZvcm1FbnRpdHkuZ2V0KCdzbHVnJyk7XG4gICAgbGV0IHBpbnlpbnN0ciA9ICcnO1xuICAgIGlmIChzbHVnLnZhbHVlKSByZXR1cm47XG4gICAgcGlueWluc3RyID0gdGhpcy5fQ21zQXBpU2VydmljZS5jaGluZXNlVG9QaW55aW4odmFsKTtcbiAgICB0aGlzLnNsdWdJbnB1dC5wYXRjaFZhbHVlKHBpbnlpbnN0ciB8fCB2YWwpO1xuICAgIHRoaXMuX0VudHJ5QWRtaW5TZXJ2aWNlXG4gICAgICAuc2x1Z0V4aXN0cyh7XG4gICAgICAgIGN1bHR1cmU6IHRoaXMuY3VsdHVyZUlucHV0LnZhbHVlLFxuICAgICAgICBzZWN0aW9uSWQ6IHRoaXMuc2VjdGlvbklkLFxuICAgICAgICBzbHVnOiB0aGlzLnNsdWdJbnB1dC52YWx1ZSxcbiAgICAgIH0pXG4gICAgICAuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICB0aGlzLnNsdWdJbnB1dC5zZXRFcnJvcnMoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHJlcGV0aXRpb246IHRoaXMuX0xvY2FsaXphdGlvblNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgICAgICAgICBgQ21zOjpFbnRyeVNsdWd7MH1BbHJlYWR5RXhpc3RgLFxuICAgICAgICAgICAgICAgIHRoaXMuc2x1Z0lucHV0LnZhbHVlXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2x1Z0lucHV0LnNldEVycm9ycyhudWxsKVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKuiOt+WPluadoeebrueJiOacrOWIl+ihqCAqL1xuICBnZXRBbGxWZXJzaW9uc0xpc3QoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3RzKSA9PiB7XG4gICAgICB0aGlzLl9FbnRyeUFkbWluU2VydmljZS5nZXRBbGxWZXJzaW9ucyh0aGlzLmVudHJ5SW5mby5pZCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgIHRoaXMuQWxsVmVyc2lvbnNMaXN0ID0gcmVzLml0ZW1zO1xuICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKua/gOa0uyAqL1xuICBBY3RpdmF0ZWRWZXJzaW9uKFZlcnNpb25JZCkge1xuICAgIHRoaXMuX0VudHJ5QWRtaW5TZXJ2aWNlLmFjdGl2YXRlKFZlcnNpb25JZCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICB0aGlzLkFsbFZlcnNpb25zTGlzdC5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgZWwuaXNBY3RpdmF0ZWRWZXJzaW9uID0gZWwuaWQgPT09IFZlcnNpb25JZDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG4gIC8qKue8lui+keeJiOacrCAqL1xuICB0b0VkaXRVcmwoaWQpIHtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKCcnLCB7IHNraXBMb2NhdGlvbkNoYW5nZTogdHJ1ZSB9KS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgL2Ntcy9hZG1pbi9lbnRyaWVzLyR7aWR9L2VkaXRgXSk7XG4gICAgfSk7XG4gIH1cbiAgLyoq5Yig6Zmk54mI5pysICovXG4gIGRlbGVjdFZlcnNpb24odmlkKSB7XG4gICAgdGhpcy5fRW50cnlBZG1pblNlcnZpY2UuZGVsZXRlKHZpZCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICB0aGlzLnRvYXN0ZXIuc3VjY2Vzcyh0aGlzLl9Mb2NhbGl6YXRpb25TZXJ2aWNlLmluc3RhbnQoYEFicFVpOjpEZWxldGVkU3VjY2Vzc2Z1bGx5YCkpO1xuICAgICAgdGhpcy5nZXRBbGxWZXJzaW9uc0xpc3QoKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtRW50aXR5XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC04XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tbGFiZWxcIj57eydDbXM6OlRpdGxlJyB8IGFicExvY2FsaXphdGlvbn19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwic2V0VGl0bGVUb1NsdWdCbHVyKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNMb2FkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc2hvd0VudHJ5VHlwZT8uZmllbGRUYWJzO2xldCBpID1pbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZWwgb2YgaXRlbS5maWVsZHM7bGV0IGkxID1pbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbCYmZm9ybUVudGl0eVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGYtZHluYW1pYyBbZmllbGRzXT1cImVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJlbnRyeUluZm8gPyBlbnRyeUluZm8uZXh0cmFQcm9wZXJ0aWVzW2VsLmZpZWxkLm5hbWVdIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcmVudEZpbGVkTmFtZV09XCInZXh0cmFQcm9wZXJ0aWVzJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY3VsdHVyZV09XCJjdWx0dXJlSW5wdXQudmFsdWVcIiAgW2VudGl0eV09XCJmb3JtRW50aXR5XCI+PC9kZi1keW5hbWljPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3snQ21zOjpTbHVnJyB8IGFicExvY2FsaXphdGlvbn19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwic2x1Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInNsdWdJbnB1dC5kaXJ0eVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tzbHVnSW5wdXQ/LmVycm9ycz8ucmVwZXRpdGlvbn19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3snQWJwVWk6Okxhbmd1YWdlcycgfCBhYnBMb2NhbGl6YXRpb259fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3QtbXVsdGlwbGVcIiBmb3JtQ29udHJvbE5hbWU9XCJjdWx0dXJlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGxhbmd1YWdlc0xpc3Q7bGV0IGkgPWluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiaXRlbS5jdWx0dXJlTmFtZVwiPnt7aXRlbS5kaXNwbGF5TmFtZX19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3VsdHVyZUlucHV0LmRpcnR5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2N1bHR1cmVJbnB1dD8uZXJyb3JzPy5yZXBldGl0aW9ufX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIiAqbmdJZj1cInNlY3Rpb25JbmZvLnR5cGU9PT0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIiBmb3I9XCJwYXJlbnRJZFwiPnt7J0Ntczo6UGFyZW50RW50cnknIHwgYWJwTG9jYWxpemF0aW9ufX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgXCIgZm9ybUNvbnRyb2xOYW1lPVwicGFyZW50SWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj48L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZW50cnlMaXN0O2xldCBpID1pbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIml0ZW0uaWRcIj57e2l0ZW0udGl0bGV9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsIG9mIGl0ZW0uY2hpbGRyZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNoaWxkVGVtcGxhdGU7IGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2hpbGRUZW1wbGF0ZSBsZXQtZGF0YT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cImRhdGEudmFsdWUuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRhdGEudmFsdWUubGF5ZXJcIj4tLTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZGF0YS52YWx1ZS50aXRsZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsIG9mIGRhdGEudmFsdWUuY2hpbGRyZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2hpbGRUZW1wbGF0ZTsgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiIGZvcj1cInB1Ymxpc2hUaW1lXCI+e3snQ21zOjpQdWJsaXNoVGltZScgfCBhYnBMb2NhbGl6YXRpb259fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHN0ZXA9XCIxXCIgZm9ybUNvbnRyb2xOYW1lPVwicHVibGlzaFRpbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiICpuZ0lmPVwiaXNFZGl0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIiBmb3I9XCJWZXJzaW9uXCI+e3snQ21zOjpWZXJzaW9uJyB8IGFicExvY2FsaXphdGlvbn19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBBbGxWZXJzaW9uc0xpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gZmxleC1iZXR3ZWVuIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS5pbml0aWFsVmVyc2lvbklkPyhpdGVtLmNyZWF0aW9uVGltZXwgZGF0ZTogJ1lZWVkvTU0vZGQgSEg6bW06cycpOignQ21zOjpJbml0aWFsVmVyc2lvbicgfCBhYnBMb2NhbGl6YXRpb24pfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgdGV4dC1iZy1zdWNjZXNzIG1zLTFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5pc0FjdGl2YXRlZFZlcnNpb25cIj57eydDbXM6OklzQWN0aXZlJyB8IGFicExvY2FsaXphdGlvbn19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSB0ZXh0LWJnLXByaW1hcnkgbXMtMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLmlkID09PSBlbnRyeVZlcnNpb25JZFwiPnt7J0Ntczo6RWRpdGluZycgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicExvY2FsaXphdGlvbn19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd24gY2xhc3M9XCJkLWlubGluZS1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saW5rLXByaW1hcnkgcC0yIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwibGluZS1oZWlnaHQ6IDA7XCIgaWQ9XCJkcm9wZG93bkJhc2ljMVwiIG5nYkRyb3Bkb3duVG9nZ2xlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGFyaWEtbGFiZWxsZWRieT1cImRyb3Bkb3duQmFzaWMxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiRHJvcGRvd25JdGVtIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cIiFpdGVtLmlzQWN0aXZhdGVkVmVyc2lvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiQWN0aXZhdGVkVmVyc2lvbihpdGVtLmlkKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hlY2sgbWUtMVwiPjwvaT57eydDbXM6OklzQWN0aXZlJyB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnBMb2NhbGl6YXRpb259fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JEcm9wZG93bkl0ZW0gdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZXJMaW5rPVwiL2Ntcy9hZG1pbi9lbnRyaWVzL2NyZWF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwie2VudHJ5VmVyc2lvbklkOml0ZW0uaWR9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1wbHVzIG1lLTFcIj48L2k+e3snQ21zOjpOZXdWZXJzaW9uJyB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnBMb2NhbGl6YXRpb259fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JEcm9wZG93bkl0ZW0gdHlwZT1cImJ1dHRvblwiIChjbGljay5zdG9wKT1cInRvRWRpdFVybChpdGVtLmlkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0uaWQgIT09IGVudHJ5VmVyc2lvbklkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1lZGl0IG1lLTFcIj48L2k+e3snQWJwVWk6OkVkaXQnIHwgYWJwTG9jYWxpemF0aW9ufX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiRHJvcGRvd25JdGVtIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrLnN0b3ApPVwiZGVsZWN0VmVyc2lvbihpdGVtLmlkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0uaW5pdGlhbFZlcnNpb25JZCYmIWl0ZW0uaXNBY3RpdmF0ZWRWZXJzaW9uJiZpdGVtLmlkICE9PSBlbnRyeVZlcnNpb25JZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdHJhc2ggbWUtMVwiPjwvaT57eydBYnBVaTo6RGVsZXRlJyB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnBMb2NhbGl6YXRpb259fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIiAqbmdJZj1cImVudHJ5SW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCIgZm9yPVwidmVyc2lvbk5vdGVzXCI+e3snQ21zOjpSZXZpc2lvbk5vdGVzJyB8IGFicExvY2FsaXphdGlvbn19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwidmVyc2lvbk5vdGVzXCIgcm93cz1cIjNcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgI3N1Ym1pdGNsaWNrPjwvYnV0dG9uPlxyXG48L2Zvcm0+Il19