tango-app-ui-analyse-traffic 3.4.0-beta.96 → 3.4.0-beta.97

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.
@@ -3,11 +3,13 @@ import { Subject, takeUntil } from 'rxjs';
3
3
  import * as i0 from "@angular/core";
4
4
  import * as i1 from "@ng-bootstrap/ng-bootstrap";
5
5
  import * as i2 from "../../services/traffic.service";
6
- import * as i3 from "@angular/common";
7
- import * as i4 from "@angular/forms";
6
+ import * as i3 from "tango-app-ui-shared";
7
+ import * as i4 from "@angular/common";
8
+ import * as i5 from "@angular/forms";
8
9
  export class DuplicateComponent {
9
10
  activeModal;
10
11
  service;
12
+ toaster;
11
13
  inputData;
12
14
  selectedTempId;
13
15
  selectedTime;
@@ -16,9 +18,10 @@ export class DuplicateComponent {
16
18
  checkedIndexes = [];
17
19
  images = [];
18
20
  selectedData = [];
19
- constructor(activeModal, service) {
21
+ constructor(activeModal, service, toaster) {
20
22
  this.activeModal = activeModal;
21
23
  this.service = service;
24
+ this.toaster = toaster;
22
25
  this.checkedIndexes = this.images.map(() => false);
23
26
  }
24
27
  destroy$ = new Subject();
@@ -94,55 +97,76 @@ export class DuplicateComponent {
94
97
  onSubmit() {
95
98
  let payload = [];
96
99
  this.selectedData.push({ tempId: this.selectedTempId, selectedTime: this.selectedTime });
97
- this.selectedData.map((data) => {
98
- let obj = {
99
- clientId: this.inputData.clientId,
100
- storeId: this.inputData.storeId[0],
101
- timeRange: data.selectedTime,
102
- dateString: this.inputData.footfallDate,
103
- tempId: data.tempId,
104
- processType: this.inputData.processType,
105
- revopsType: "nonShopper",
106
- nonshoperType: "Duplicate",
107
- customerInfo: {
108
- name: "",
109
- mobile: "",
110
- email: "",
111
- location: "",
112
- age: "",
113
- gender: "",
114
- },
115
- description: this.description,
116
- status: "submitted",
117
- issueList: []
118
- };
119
- payload.push(obj);
120
- });
100
+ let inputData = {
101
+ clientId: this.inputData.clientId,
102
+ storeId: this.inputData.storeId,
103
+ dateString: this.inputData.footfallDate,
104
+ };
121
105
  this.service
122
- .submitRevopTagging(payload)
106
+ .revoptaggingcount(inputData)
123
107
  .pipe(takeUntil(this.destroy$))
124
108
  ?.subscribe({
125
109
  next: (res) => {
126
110
  if (res && res.code === 200) {
127
- this.activeModal.close('submit');
111
+ console.log(res.data.count, this.selectedData.length);
112
+ if (res.data.count <= 0 || res.data.count != this.selectedData.length) {
113
+ this.toaster.getErrorToast("Tag limit reached! Try tagging under different categories");
114
+ return;
115
+ }
116
+ else {
117
+ this.selectedData.map((data) => {
118
+ let obj = {
119
+ clientId: this.inputData.clientId,
120
+ storeId: this.inputData.storeId[0],
121
+ timeRange: data.selectedTime,
122
+ dateString: this.inputData.footfallDate,
123
+ tempId: data.tempId,
124
+ processType: this.inputData.processType,
125
+ revopsType: "nonShopper",
126
+ nonshoperType: "Duplicate",
127
+ customerInfo: {
128
+ name: "",
129
+ mobile: "",
130
+ email: "",
131
+ location: "",
132
+ age: "",
133
+ gender: "",
134
+ },
135
+ description: this.description,
136
+ status: "submitted",
137
+ issueList: []
138
+ };
139
+ payload.push(obj);
140
+ });
141
+ this.service
142
+ .submitRevopTagging(payload)
143
+ .pipe(takeUntil(this.destroy$))
144
+ ?.subscribe({
145
+ next: (res) => {
146
+ if (res && res.code === 200) {
147
+ this.activeModal.close('submit');
148
+ }
149
+ }, error: (err) => {
150
+ },
151
+ complete: () => { },
152
+ });
153
+ }
128
154
  }
129
- }, error: (err) => {
130
- },
131
- complete: () => { },
155
+ }
132
156
  });
133
157
  }
134
158
  cancel() {
135
159
  this.activeModal.close('cancel');
136
160
  }
137
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DuplicateComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.TrafficService }], target: i0.ɵɵFactoryTarget.Component });
138
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DuplicateComponent, selector: "lib-duplicate", inputs: { inputData: "inputData", selectedTempId: "selectedTempId" }, ngImport: i0, template: "<div class=\"row h-550px scroll-container scroll-y w-100\">\r\n <div class=\"col-md-12 p-5\">\r\n <div class=\"row mb-3\">\r\n \r\n <h3 class=\"card-title mx-5\">\r\n <div class=\"title-text mx-2 mt-3\">Tag Duplicate ID</div>\r\n <div class=\"text-sub mx-2 my-1\">Identify and tag the original ID this entry duplicates.</div>\r\n </h3>\r\n\r\n </div>\r\n <div class=\"separator separator-double m-3\"></div>\r\n <div class=\"d-flex mt-2 mb-2 w-100 overflow-x px-0\">\r\n \r\n <div class=\"col text-nowrap\" *ngFor=\"let obj of objectsArray\">\r\n <ul class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap\">\r\n <li class=\"nav-item cursor-pointer\">\r\n <a (click)=\"selectedTimes(obj.folderName)\"\r\n [ngClass]=\"selectedTime === obj?.folderName ? 'active' : ''\" class=\"nav-link cursor-pointer no-border mx-3 mb-2\">\r\n {{obj?.folderName}}<span class=\"mx-2 \" [ngClass]=\"selectedTime === obj?.folderName ? 'badge-num-primary' :'badge-num-muted'\">{{obj?.count?obj?.count:0}}</span>\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n\r\n <div class=\"border-gray-active1 mx-3 p-5\">\r\n\r\n <div class=\"row g-3\">\r\n <div \r\n class=\"col-md-3 rounded border mt-3 p-3 border-2 me-5\" \r\n *ngFor=\"let obj of images\"\r\n [ngClass]=\"{\r\n 'border-primary': isChecked(obj),\r\n 'border-secondary': !isChecked(obj)\r\n }\"\r\n >\r\n <div class=\"form-check mb-2\">\r\n <input *ngIf=\"selectedTempId!==obj?.tempId\"\r\n class=\"form-check-input mt-1\"\r\n type=\"checkbox\"\r\n [id]=\"'flexCheck' + obj.tempId\"\r\n (change)=\"toggleCheck(obj)\"\r\n [checked]=\"isChecked(obj)\"\r\n />\r\n <label class=\"form-check-label ms-1\" [for]=\"'flexCheck' + obj.tempId\">\r\n {{ obj?.tempId }}\r\n </label>\r\n </div>\r\n <img [src]=\"obj.image\" alt=\"Image\" class=\"img-fluid w-100 h-200px rounded\" />\r\n </div>\r\n \r\n\r\n </div>\r\n \r\n \r\n \r\n <div class=\"col-md-12 mt-5 pb-5\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName\">Description (Optional)</label>\r\n <textarea [(ngModel)]=\"description\" class=\"form-control mt-3\" rows=\"3\" placeholder=\"\"></textarea>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"text-end mt-5\">\r\n <button type=\"button\" class=\"btn btn-outline mt-3 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button type=\"submit\" class=\"btn btn-primary mt-3\" (click)=\"onSubmit()\">Submit</button>\r\n \r\n </div>\r\n </div>\r\n</div>", styles: [".nav-item .nav-link.active{border:none;border-radius:6px;background:var(--Primary-50, #EAF8FF);padding:8px 12px}.nav-item .nav-link:hover{border:none}.badge-num-primary{border-radius:16px!important;background:var(--Primary-50, #EAF8FF)!important;color:var(--Primary-700, #009BF3)!important;text-align:center;font-size:14px!important;font-weight:500;line-height:20px;padding:2px 10px!important;mix-blend-mode:multiply!important}.badge-num-muted{border-radius:16px!important;background:var(--Primary-50, #F2F4F7)!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:14px;font-weight:500;line-height:20px;padding:2px 10px!important;mix-blend-mode:multiply!important}.border-gray-active1{border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--Primary-50, #ffffff);padding:12px!important}input[type=checkbox]{width:16px!important;height:16px!important;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}.overflow-x{overflow-x:auto}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
161
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DuplicateComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.TrafficService }, { token: i3.ToastService }], target: i0.ɵɵFactoryTarget.Component });
162
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DuplicateComponent, selector: "lib-duplicate", inputs: { inputData: "inputData", selectedTempId: "selectedTempId" }, ngImport: i0, template: "<div class=\"row h-550px scroll-container scroll-y w-100\">\r\n <div class=\"col-md-12 p-5\">\r\n <div class=\"row mb-3\">\r\n \r\n <h3 class=\"card-title mx-5\">\r\n <div class=\"title-text mx-2 mt-3\">Tag Duplicate ID</div>\r\n <div class=\"text-sub mx-2 my-1\">Identify and tag the original ID this entry duplicates.</div>\r\n </h3>\r\n\r\n </div>\r\n <div class=\"separator separator-double m-3\"></div>\r\n <div class=\"d-flex mt-2 mb-2 w-100 overflow-x px-0\">\r\n \r\n <div class=\"col text-nowrap\" *ngFor=\"let obj of objectsArray\">\r\n <ul class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap\">\r\n <li class=\"nav-item cursor-pointer\">\r\n <a (click)=\"selectedTimes(obj.folderName)\"\r\n [ngClass]=\"selectedTime === obj?.folderName ? 'active' : ''\" class=\"nav-link cursor-pointer no-border mx-3 mb-2\">\r\n {{obj?.folderName}}<span class=\"mx-2 \" [ngClass]=\"selectedTime === obj?.folderName ? 'badge-num-primary' :'badge-num-muted'\">{{obj?.count?obj?.count:0}}</span>\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n\r\n <div class=\"border-gray-active1 mx-3 p-5\">\r\n\r\n <div class=\"row g-3\">\r\n <div \r\n class=\"col-md-3 rounded border mt-3 p-3 border-2 me-5\" \r\n *ngFor=\"let obj of images\"\r\n [ngClass]=\"{\r\n 'border-primary': isChecked(obj),\r\n 'border-secondary': !isChecked(obj)\r\n }\"\r\n >\r\n <div class=\"form-check mb-2\">\r\n <input *ngIf=\"selectedTempId!==obj?.tempId\"\r\n class=\"form-check-input mt-1\"\r\n type=\"checkbox\"\r\n [id]=\"'flexCheck' + obj.tempId\"\r\n (change)=\"toggleCheck(obj)\"\r\n [checked]=\"isChecked(obj)\"\r\n />\r\n <label class=\"form-check-label ms-1\" [for]=\"'flexCheck' + obj.tempId\">\r\n {{ obj?.tempId }}\r\n </label>\r\n </div>\r\n <img [src]=\"obj.image\" alt=\"Image\" class=\"img-fluid w-100 h-200px rounded\" />\r\n </div>\r\n \r\n\r\n </div>\r\n \r\n \r\n \r\n <div class=\"col-md-12 mt-5 pb-5\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName\">Description (Optional)</label>\r\n <textarea [(ngModel)]=\"description\" class=\"form-control mt-3\" rows=\"3\" placeholder=\"\"></textarea>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"text-end mt-5\">\r\n <button type=\"button\" class=\"btn btn-outline mt-3 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button type=\"submit\" class=\"btn btn-primary mt-3\" (click)=\"onSubmit()\">Submit</button>\r\n \r\n </div>\r\n </div>\r\n</div>", styles: [".nav-item .nav-link.active{border:none;border-radius:6px;background:var(--Primary-50, #EAF8FF);padding:8px 12px}.nav-item .nav-link:hover{border:none}.badge-num-primary{border-radius:16px!important;background:var(--Primary-50, #EAF8FF)!important;color:var(--Primary-700, #009BF3)!important;text-align:center;font-size:14px!important;font-weight:500;line-height:20px;padding:2px 10px!important;mix-blend-mode:multiply!important}.badge-num-muted{border-radius:16px!important;background:var(--Primary-50, #F2F4F7)!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:14px;font-weight:500;line-height:20px;padding:2px 10px!important;mix-blend-mode:multiply!important}.border-gray-active1{border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--Primary-50, #ffffff);padding:12px!important}input[type=checkbox]{width:16px!important;height:16px!important;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}.overflow-x{overflow-x:auto}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
139
163
  }
140
164
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DuplicateComponent, decorators: [{
141
165
  type: Component,
142
166
  args: [{ selector: 'lib-duplicate', template: "<div class=\"row h-550px scroll-container scroll-y w-100\">\r\n <div class=\"col-md-12 p-5\">\r\n <div class=\"row mb-3\">\r\n \r\n <h3 class=\"card-title mx-5\">\r\n <div class=\"title-text mx-2 mt-3\">Tag Duplicate ID</div>\r\n <div class=\"text-sub mx-2 my-1\">Identify and tag the original ID this entry duplicates.</div>\r\n </h3>\r\n\r\n </div>\r\n <div class=\"separator separator-double m-3\"></div>\r\n <div class=\"d-flex mt-2 mb-2 w-100 overflow-x px-0\">\r\n \r\n <div class=\"col text-nowrap\" *ngFor=\"let obj of objectsArray\">\r\n <ul class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap\">\r\n <li class=\"nav-item cursor-pointer\">\r\n <a (click)=\"selectedTimes(obj.folderName)\"\r\n [ngClass]=\"selectedTime === obj?.folderName ? 'active' : ''\" class=\"nav-link cursor-pointer no-border mx-3 mb-2\">\r\n {{obj?.folderName}}<span class=\"mx-2 \" [ngClass]=\"selectedTime === obj?.folderName ? 'badge-num-primary' :'badge-num-muted'\">{{obj?.count?obj?.count:0}}</span>\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n\r\n <div class=\"border-gray-active1 mx-3 p-5\">\r\n\r\n <div class=\"row g-3\">\r\n <div \r\n class=\"col-md-3 rounded border mt-3 p-3 border-2 me-5\" \r\n *ngFor=\"let obj of images\"\r\n [ngClass]=\"{\r\n 'border-primary': isChecked(obj),\r\n 'border-secondary': !isChecked(obj)\r\n }\"\r\n >\r\n <div class=\"form-check mb-2\">\r\n <input *ngIf=\"selectedTempId!==obj?.tempId\"\r\n class=\"form-check-input mt-1\"\r\n type=\"checkbox\"\r\n [id]=\"'flexCheck' + obj.tempId\"\r\n (change)=\"toggleCheck(obj)\"\r\n [checked]=\"isChecked(obj)\"\r\n />\r\n <label class=\"form-check-label ms-1\" [for]=\"'flexCheck' + obj.tempId\">\r\n {{ obj?.tempId }}\r\n </label>\r\n </div>\r\n <img [src]=\"obj.image\" alt=\"Image\" class=\"img-fluid w-100 h-200px rounded\" />\r\n </div>\r\n \r\n\r\n </div>\r\n \r\n \r\n \r\n <div class=\"col-md-12 mt-5 pb-5\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName\">Description (Optional)</label>\r\n <textarea [(ngModel)]=\"description\" class=\"form-control mt-3\" rows=\"3\" placeholder=\"\"></textarea>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"text-end mt-5\">\r\n <button type=\"button\" class=\"btn btn-outline mt-3 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button type=\"submit\" class=\"btn btn-primary mt-3\" (click)=\"onSubmit()\">Submit</button>\r\n \r\n </div>\r\n </div>\r\n</div>", styles: [".nav-item .nav-link.active{border:none;border-radius:6px;background:var(--Primary-50, #EAF8FF);padding:8px 12px}.nav-item .nav-link:hover{border:none}.badge-num-primary{border-radius:16px!important;background:var(--Primary-50, #EAF8FF)!important;color:var(--Primary-700, #009BF3)!important;text-align:center;font-size:14px!important;font-weight:500;line-height:20px;padding:2px 10px!important;mix-blend-mode:multiply!important}.badge-num-muted{border-radius:16px!important;background:var(--Primary-50, #F2F4F7)!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:14px;font-weight:500;line-height:20px;padding:2px 10px!important;mix-blend-mode:multiply!important}.border-gray-active1{border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--Primary-50, #ffffff);padding:12px!important}input[type=checkbox]{width:16px!important;height:16px!important;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}.overflow-x{overflow-x:auto}\n"] }]
143
- }], ctorParameters: () => [{ type: i1.NgbActiveModal }, { type: i2.TrafficService }], propDecorators: { inputData: [{
167
+ }], ctorParameters: () => [{ type: i1.NgbActiveModal }, { type: i2.TrafficService }, { type: i3.ToastService }], propDecorators: { inputData: [{
144
168
  type: Input
145
169
  }], selectedTempId: [{
146
170
  type: Input
147
171
  }] } });
148
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVwbGljYXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJhZmZpYy9zcmMvbGliL2NvbXBvbmVudHMvZHVwbGljYXRlL2R1cGxpY2F0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYWZmaWMvc3JjL2xpYi9jb21wb25lbnRzL2R1cGxpY2F0ZS9kdXBsaWNhdGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7OztBQU8xQyxNQUFNLE9BQU8sa0JBQWtCO0lBU1Q7SUFBcUM7SUFSaEQsU0FBUyxDQUFLO0lBQ2QsY0FBYyxDQUFLO0lBQzVCLFlBQVksQ0FBTTtJQUNsQixXQUFXLENBQU07SUFDakIsWUFBWSxHQUFRLENBQUMsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEVBQUUsQ0FBQztJQUM3SixjQUFjLEdBQWMsRUFBRSxDQUFDO0lBQy9CLE1BQU0sR0FBUSxFQUFFLENBQUM7SUFDakIsWUFBWSxHQUFRLEVBQUUsQ0FBQTtJQUN0QixZQUFvQixXQUEyQixFQUFVLE9BQXVCO1FBQTVELGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUFVLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQzlFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7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QyxDQUFBO0lBQ04sQ0FBQztJQUNELE1BQU07UUFDSixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuQyxDQUFDO3dHQTlJVSxrQkFBa0I7NEZBQWxCLGtCQUFrQiwySENUL0IsMHNHQXVFTTs7NEZEOURPLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxlQUFlO2dIQUtoQixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmdiQWN0aXZlTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBUcmFmZmljU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RyYWZmaWMuc2VydmljZSc7XHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWR1cGxpY2F0ZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2R1cGxpY2F0ZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2R1cGxpY2F0ZS5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIER1cGxpY2F0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgaW5wdXREYXRhOiBhbnlcclxuICBASW5wdXQoKSBzZWxlY3RlZFRlbXBJZDogYW55XHJcbiAgc2VsZWN0ZWRUaW1lOiBhbnk7XHJcbiAgZGVzY3JpcHRpb246IGFueTtcclxuICBvYmplY3RzQXJyYXk6IGFueSA9IFt7ICdmb2xkZXJOYW1lJzogJzExIEFNIC0gMTIgUE0nIH0sIHsgJ2ZvbGRlck5hbWUnOiAnMTIgUE0gLSAxIFBNJyB9LCB7ICdmb2xkZXJOYW1lJzogJzEgUE0gLSAyIFBNJyB9LCB7ICdmb2xkZXJOYW1lJzogJzIgUE0gLSAzIFBNJyB9LF07XHJcbiAgY2hlY2tlZEluZGV4ZXM6IGJvb2xlYW5bXSA9IFtdO1xyXG4gIGltYWdlczogYW55ID0gW107XHJcbiAgc2VsZWN0ZWREYXRhOiBhbnkgPSBbXVxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYWN0aXZlTW9kYWw6IE5nYkFjdGl2ZU1vZGFsLCBwcml2YXRlIHNlcnZpY2U6IFRyYWZmaWNTZXJ2aWNlLCkge1xyXG4gICAgdGhpcy5jaGVja2VkSW5kZXhlcyA9IHRoaXMuaW1hZ2VzLm1hcCgoKSA9PiBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRUaW1lID0gdGhpcy5pbnB1dERhdGEuZm9sZGVyTmFtZVxyXG4gICAgdGhpcy5pbml0aWFsRGF0YUxvYWQoKVxyXG4gICAgbGV0IHBheWxvYWQgPSB7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmlucHV0RGF0YS5jbGllbnRJZCxcclxuICAgICAgc3RvcmVJZDogdGhpcy5pbnB1dERhdGEuc3RvcmVJZCxcclxuICAgICAgZm9vdGZhbGxEYXRlOiB0aGlzLmlucHV0RGF0YS5mb290ZmFsbERhdGUsXHJcbiAgICAgIHByb2Nlc3NUeXBlOiB0aGlzLmlucHV0RGF0YS5wcm9jZXNzVHlwZSxcclxuXHJcbiAgICB9XHJcbiAgICB0aGlzLnNlcnZpY2UuZ2V0Rm9vdGZhbGxEaXJlY3RvcnlGb2xkZXJzKHBheWxvYWQpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgPy5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMub2JqZWN0c0FycmF5ID0gcmVzLmRhdGEuZm9vdGZhbGxEYXRhO1xyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7IH0sXHJcbiAgICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIGlzQ2hlY2tlZChkYXRhOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRGF0YS5zb21lKFxyXG4gICAgICAoaXRlbTogYW55KSA9PiBpdGVtLnRlbXBJZCA9PT0gZGF0YS50ZW1wSWQgJiYgaXRlbS5zZWxlY3RlZFRpbWUgPT09IGRhdGEuc2VsZWN0ZWRUaW1lXHJcbiAgICApO1xyXG4gIH1cclxuICBcclxuXHJcbiAgaW5pdGlhbERhdGFMb2FkKCkge1xyXG4gICAgdGhpcy5zZXJ2aWNlLmdldEZvb3RmYWxsRGlyZWN0b3J5KHRoaXMuaW5wdXREYXRhKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgID8uc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICByZXMuZGF0YS5mb290ZmFsbERhdGEgPSAgcmVzLmRhdGEuZm9vdGZhbGxEYXRhLmZpbHRlcigoZWxlOmFueSk9PmVsZS50ZW1wSWQhPT10aGlzLnNlbGVjdGVkVGVtcElkKVxyXG4gICAgICAgICAgICB0aGlzLmltYWdlcyA9IHJlcy5kYXRhLmZvb3RmYWxsRGF0YS5tYXAoKGRhdGE6IGFueSkgPT4gKHtcclxuICAgICAgICAgICAgICBpbWFnZTogZGF0YS5pbWFnZXMuZW50cnlUaW1lSW1hZ2UsXHJcbiAgICAgICAgICAgICAgdGVtcElkOiBkYXRhLnRlbXBJZCxcclxuICAgICAgICAgICAgICBzZWxlY3RlZFRpbWU6IHRoaXMuaW5wdXREYXRhLmZvbGRlck5hbWVcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHsgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIHRvZ2dsZUNoZWNrKGRhdGE6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coZGF0YSlcclxuICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuc2VsZWN0ZWREYXRhLnNvbWUoXHJcbiAgICAgIChpdGVtOiBhbnkpID0+IGl0ZW0udGVtcElkID09PSBkYXRhLnRlbXBJZCAmJiBpdGVtLnNlbGVjdGVkVGltZSA9PT0gZGF0YS5zZWxlY3RlZFRpbWVcclxuICAgICk7XHJcbiAgXHJcbiAgICBpZiAoZXhpc3RzKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRhID0gdGhpcy5zZWxlY3RlZERhdGEuZmlsdGVyKFxyXG4gICAgICAgIChpdGVtOiBhbnkpID0+ICEoaXRlbS50ZW1wSWQgPT09IGRhdGEudGVtcElkICYmIGl0ZW0uc2VsZWN0ZWRUaW1lID09PSBkYXRhLnNlbGVjdGVkVGltZSlcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRhLnB1c2goeyAuLi5kYXRhIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuXHJcbiAgLy8gdG9nZ2xlQ2hlY2soaW5kZXg6IG51bWJlciwgZGF0YTogYW55KTogdm9pZCB7XHJcbiAgLy8gICBjb25zb2xlLmxvZyhpbmRleCwgZGF0YSlcclxuICAvLyAgIHRoaXMuY2hlY2tlZEluZGV4ZXNbaW5kZXhdID0gIXRoaXMuY2hlY2tlZEluZGV4ZXNbaW5kZXhdO1xyXG4gIC8vICAgbGV0IGV4aXRzQ291bnQgPSB0aGlzLnNlbGVjdGVkRGF0YS5maWx0ZXIoKGVsZTogYW55KSA9PiBlbGUudGVtcElkID09PSBkYXRhLnRlbXBJZCkubGVuZ3RoXHJcblxyXG4gIC8vICAgaWYoZXhpdHNDb3VudD4wICl7XHJcbiAgLy8gICAgIHRoaXMuc2VsZWN0ZWREYXRhID0gdGhpcy5zZWxlY3RlZERhdGEuZmlsdGVyKChvYmo6IGFueSkgPT4gb2JqLnRlbXBJZCAhPT0gZGF0YS50ZW1wSWQpXHJcbiAgLy8gICB9ZWxzZXtcclxuICAvLyAgICAgdGhpcy5zZWxlY3RlZERhdGEucHVzaChkYXRhKVxyXG4gIC8vICAgfVxyXG5cclxuICAvLyB9XHJcbiAgc2VsZWN0ZWRUaW1lcyhvYmo6IGFueSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFRpbWUgPSBvYmpcclxuICAgIHRoaXMuaW5wdXREYXRhLmZvbGRlck5hbWUgPSBvYmpcclxuICAgIHRoaXMuaW5pdGlhbERhdGFMb2FkKClcclxuICB9XHJcbiAgb25TdWJtaXQoKSB7XHJcbiAgICBsZXQgcGF5bG9hZDogYW55ID0gW11cclxuICAgIHRoaXMuc2VsZWN0ZWREYXRhLnB1c2goe3RlbXBJZDp0aGlzLnNlbGVjdGVkVGVtcElkLHNlbGVjdGVkVGltZTp0aGlzLnNlbGVjdGVkVGltZX0pXHJcbiAgICB0aGlzLnNlbGVjdGVkRGF0YS5tYXAoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICBsZXQgb2JqID0ge1xyXG4gICAgICAgIGNsaWVudElkOiB0aGlzLmlucHV0RGF0YS5jbGllbnRJZCxcclxuICAgICAgICBzdG9yZUlkOiB0aGlzLmlucHV0RGF0YS5zdG9yZUlkWzBdLFxyXG4gICAgICAgIHRpbWVSYW5nZTogZGF0YS5zZWxlY3RlZFRpbWUsXHJcbiAgICAgICAgZGF0ZVN0cmluZzogdGhpcy5pbnB1dERhdGEuZm9vdGZhbGxEYXRlLFxyXG4gICAgICAgIHRlbXBJZDogZGF0YS50ZW1wSWQsXHJcbiAgICAgICAgcHJvY2Vzc1R5cGU6IHRoaXMuaW5wdXREYXRhLnByb2Nlc3NUeXBlLFxyXG4gICAgICAgIHJldm9wc1R5cGU6IFwibm9uU2hvcHBlclwiLFxyXG4gICAgICAgIG5vbnNob3BlclR5cGU6IFwiRHVwbGljYXRlXCIsXHJcbiAgICAgICAgY3VzdG9tZXJJbmZvOiB7XHJcbiAgICAgICAgICBuYW1lOiBcIlwiLFxyXG4gICAgICAgICAgbW9iaWxlOiBcIlwiLFxyXG4gICAgICAgICAgZW1haWw6IFwiXCIsXHJcbiAgICAgICAgICBsb2NhdGlvbjogXCJcIixcclxuICAgICAgICAgIGFnZTogXCJcIixcclxuICAgICAgICAgIGdlbmRlcjogXCJcIixcclxuICAgICAgICB9LFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxyXG4gICAgICAgIHN0YXR1czogXCJzdWJtaXR0ZWRcIixcclxuICAgICAgICBpc3N1ZUxpc3Q6IFtdXHJcbiAgICAgIH1cclxuICAgICAgcGF5bG9hZC5wdXNoKG9iailcclxuICAgIH0pXHJcbiAgICB0aGlzLnNlcnZpY2VcclxuICAgICAgLnN1Ym1pdFJldm9wVGFnZ2luZyhwYXlsb2FkKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgID8uc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdzdWJtaXQnKTtcclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHsgfSxcclxuICAgICAgfSlcclxuICB9XHJcbiAgY2FuY2VsKCkge1xyXG4gICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnY2FuY2VsJyk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJyb3cgaC01NTBweCBzY3JvbGwtY29udGFpbmVyIHNjcm9sbC15IHctMTAwXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIHAtNVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxyXG4gIFxyXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiY2FyZC10aXRsZSBteC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlLXRleHQgbXgtMiBtdC0zXCI+VGFnIER1cGxpY2F0ZSBJRDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXN1YiBteC0yIG15LTFcIj5JZGVudGlmeSBhbmQgdGFnIHRoZSBvcmlnaW5hbCBJRCB0aGlzIGVudHJ5IGR1cGxpY2F0ZXMuPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2gzPlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VwYXJhdG9yIHNlcGFyYXRvci1kb3VibGUgbS0zXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiAgY2xhc3M9XCJkLWZsZXggbXQtMiBtYi0yIHctMTAwIG92ZXJmbG93LXggcHgtMFwiPlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgPGRpdiAgY2xhc3M9XCJjb2wgdGV4dC1ub3dyYXBcIiAqbmdGb3I9XCJsZXQgb2JqIG9mIG9iamVjdHNBcnJheVwiPlxyXG4gICAgICAgICAgICAgIDx1bCAgY2xhc3M9XCJuYXYgbmF2LXN0cmV0Y2ggbmF2LWxpbmUtdGFiczEgbmF2LWxpbmUtdGFicyBib3JkZXItdHJhbnNwYXJlbnQgZmxleC1ub3dyYXBcIj5cclxuICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW0gY3Vyc29yLXBvaW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxhIChjbGljayk9XCJzZWxlY3RlZFRpbWVzKG9iai5mb2xkZXJOYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJzZWxlY3RlZFRpbWUgPT09IG9iaj8uZm9sZGVyTmFtZSA/ICdhY3RpdmUnIDogJydcIiBjbGFzcz1cIm5hdi1saW5rIGN1cnNvci1wb2ludGVyIG5vLWJvcmRlciBteC0zIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7e29iaj8uZm9sZGVyTmFtZX19PHNwYW4gY2xhc3M9XCJteC0yIFwiIFtuZ0NsYXNzXT1cInNlbGVjdGVkVGltZSA9PT0gb2JqPy5mb2xkZXJOYW1lID8gJ2JhZGdlLW51bS1wcmltYXJ5JyA6J2JhZGdlLW51bS1tdXRlZCdcIj57e29iaj8uY291bnQ/b2JqPy5jb3VudDowfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJvcmRlci1ncmF5LWFjdGl2ZTEgbXgtMyBwLTVcIj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZy0zXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBcclxuICAgICAgICAgICAgICBjbGFzcz1cImNvbC1tZC0zIHJvdW5kZWQgYm9yZGVyIG10LTMgcC0zIGJvcmRlci0yIG1lLTVcIiBcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb2JqIG9mIGltYWdlc1wiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1wcmltYXJ5JzogaXNDaGVja2VkKG9iaiksXHJcbiAgICAgICAgICAgICAgICAnYm9yZGVyLXNlY29uZGFyeSc6ICFpc0NoZWNrZWQob2JqKVxyXG4gICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwic2VsZWN0ZWRUZW1wSWQhPT1vYmo/LnRlbXBJZFwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtdC0xXCJcclxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgW2lkXT1cIidmbGV4Q2hlY2snICsgb2JqLnRlbXBJZFwiXHJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlQ2hlY2sob2JqKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzQ2hlY2tlZChvYmopXCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1zLTFcIiBbZm9yXT1cIidmbGV4Q2hlY2snICsgb2JqLnRlbXBJZFwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBvYmo/LnRlbXBJZCB9fVxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwib2JqLmltYWdlXCIgYWx0PVwiSW1hZ2VcIiBjbGFzcz1cImltZy1mbHVpZCB3LTEwMCBoLTIwMHB4IHJvdW5kZWRcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgXHJcblxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBtdC01IHBiLTVcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4YW1wbGVJbnB1dE5hbWVcIj5EZXNjcmlwdGlvbiAoT3B0aW9uYWwpPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPHRleHRhcmVhICBbKG5nTW9kZWwpXT1cImRlc2NyaXB0aW9uXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbXQtM1wiIHJvd3M9XCIzXCIgcGxhY2Vob2xkZXI9XCJcIj48L3RleHRhcmVhPlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1lbmQgbXQtNVwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBtdC0zIG1lLTNcIiAoY2xpY2spPVwiY2FuY2VsKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXQtM1wiIChjbGljayk9XCJvblN1Ym1pdCgpXCI+U3VibWl0PC9idXR0b24+XHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+Il19
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVwbGljYXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJhZmZpYy9zcmMvbGliL2NvbXBvbmVudHMvZHVwbGljYXRlL2R1cGxpY2F0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYWZmaWMvc3JjL2xpYi9jb21wb25lbnRzL2R1cGxpY2F0ZS9kdXBsaWNhdGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7QUFTMUMsTUFBTSxPQUFPLGtCQUFrQjtJQVNUO0lBQXFDO0lBQzdDO0lBVEgsU0FBUyxDQUFLO0lBQ2QsY0FBYyxDQUFLO0lBQzVCLFlBQVksQ0FBTTtJQUNsQixXQUFXLENBQU07SUFDakIsWUFBWSxHQUFRLENBQUMsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEVBQUUsQ0FBQztJQUM3SixjQUFjLEdBQWMsRUFBRSxDQUFDO0lBQy9CLE1BQU0sR0FBUSxFQUFFLENBQUM7SUFDakIsWUFBWSxHQUFRLEVBQUUsQ0FBQTtJQUN0QixZQUFvQixXQUEyQixFQUFVLE9BQXVCLEVBQ3BFLE9BQXFCO1FBRGIsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDcEUsWUFBTyxHQUFQLE9BQU8sQ0FBYztRQUMvQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLENB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QUFlOzJJQUtoQixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmdiQWN0aXZlTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBUcmFmZmljU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RyYWZmaWMuc2VydmljZSc7XHJcblxyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItZHVwbGljYXRlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZHVwbGljYXRlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vZHVwbGljYXRlLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRHVwbGljYXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSBpbnB1dERhdGE6IGFueVxyXG4gIEBJbnB1dCgpIHNlbGVjdGVkVGVtcElkOiBhbnlcclxuICBzZWxlY3RlZFRpbWU6IGFueTtcclxuICBkZXNjcmlwdGlvbjogYW55O1xyXG4gIG9iamVjdHNBcnJheTogYW55ID0gW3sgJ2ZvbGRlck5hbWUnOiAnMTEgQU0gLSAxMiBQTScgfSwgeyAnZm9sZGVyTmFtZSc6ICcxMiBQTSAtIDEgUE0nIH0sIHsgJ2ZvbGRlck5hbWUnOiAnMSBQTSAtIDIgUE0nIH0sIHsgJ2ZvbGRlck5hbWUnOiAnMiBQTSAtIDMgUE0nIH0sXTtcclxuICBjaGVja2VkSW5kZXhlczogYm9vbGVhbltdID0gW107XHJcbiAgaW1hZ2VzOiBhbnkgPSBbXTtcclxuICBzZWxlY3RlZERhdGE6IGFueSA9IFtdXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBhY3RpdmVNb2RhbDogTmdiQWN0aXZlTW9kYWwsIHByaXZhdGUgc2VydmljZTogVHJhZmZpY1NlcnZpY2UsXHJcbiAgICAgIHByaXZhdGUgdG9hc3RlcjogVG9hc3RTZXJ2aWNlLCkge1xyXG4gICAgdGhpcy5jaGVja2VkSW5kZXhlcyA9IHRoaXMuaW1hZ2VzLm1hcCgoKSA9PiBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRUaW1lID0gdGhpcy5pbnB1dERhdGEuZm9sZGVyTmFtZVxyXG4gICAgdGhpcy5pbml0aWFsRGF0YUxvYWQoKVxyXG4gICAgbGV0IHBheWxvYWQgPSB7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmlucHV0RGF0YS5jbGllbnRJZCxcclxuICAgICAgc3RvcmVJZDogdGhpcy5pbnB1dERhdGEuc3RvcmVJZCxcclxuICAgICAgZm9vdGZhbGxEYXRlOiB0aGlzLmlucHV0RGF0YS5mb290ZmFsbERhdGUsXHJcbiAgICAgIHByb2Nlc3NUeXBlOiB0aGlzLmlucHV0RGF0YS5wcm9jZXNzVHlwZSxcclxuXHJcbiAgICB9XHJcbiAgICB0aGlzLnNlcnZpY2UuZ2V0Rm9vdGZhbGxEaXJlY3RvcnlGb2xkZXJzKHBheWxvYWQpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgPy5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMub2JqZWN0c0FycmF5ID0gcmVzLmRhdGEuZm9vdGZhbGxEYXRhO1xyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7IH0sXHJcbiAgICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIGlzQ2hlY2tlZChkYXRhOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRGF0YS5zb21lKFxyXG4gICAgICAoaXRlbTogYW55KSA9PiBpdGVtLnRlbXBJZCA9PT0gZGF0YS50ZW1wSWQgJiYgaXRlbS5zZWxlY3RlZFRpbWUgPT09IGRhdGEuc2VsZWN0ZWRUaW1lXHJcbiAgICApO1xyXG4gIH1cclxuICBcclxuXHJcbiAgaW5pdGlhbERhdGFMb2FkKCkge1xyXG4gICAgdGhpcy5zZXJ2aWNlLmdldEZvb3RmYWxsRGlyZWN0b3J5KHRoaXMuaW5wdXREYXRhKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgID8uc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICByZXMuZGF0YS5mb290ZmFsbERhdGEgPSAgcmVzLmRhdGEuZm9vdGZhbGxEYXRhLmZpbHRlcigoZWxlOmFueSk9PmVsZS50ZW1wSWQhPT10aGlzLnNlbGVjdGVkVGVtcElkKVxyXG4gICAgICAgICAgICB0aGlzLmltYWdlcyA9IHJlcy5kYXRhLmZvb3RmYWxsRGF0YS5tYXAoKGRhdGE6IGFueSkgPT4gKHtcclxuICAgICAgICAgICAgICBpbWFnZTogZGF0YS5pbWFnZXMuZW50cnlUaW1lSW1hZ2UsXHJcbiAgICAgICAgICAgICAgdGVtcElkOiBkYXRhLnRlbXBJZCxcclxuICAgICAgICAgICAgICBzZWxlY3RlZFRpbWU6IHRoaXMuaW5wdXREYXRhLmZvbGRlck5hbWVcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHsgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIHRvZ2dsZUNoZWNrKGRhdGE6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coZGF0YSlcclxuICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuc2VsZWN0ZWREYXRhLnNvbWUoXHJcbiAgICAgIChpdGVtOiBhbnkpID0+IGl0ZW0udGVtcElkID09PSBkYXRhLnRlbXBJZCAmJiBpdGVtLnNlbGVjdGVkVGltZSA9PT0gZGF0YS5zZWxlY3RlZFRpbWVcclxuICAgICk7XHJcbiAgXHJcbiAgICBpZiAoZXhpc3RzKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRhID0gdGhpcy5zZWxlY3RlZERhdGEuZmlsdGVyKFxyXG4gICAgICAgIChpdGVtOiBhbnkpID0+ICEoaXRlbS50ZW1wSWQgPT09IGRhdGEudGVtcElkICYmIGl0ZW0uc2VsZWN0ZWRUaW1lID09PSBkYXRhLnNlbGVjdGVkVGltZSlcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRhLnB1c2goeyAuLi5kYXRhIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuXHJcbiAgLy8gdG9nZ2xlQ2hlY2soaW5kZXg6IG51bWJlciwgZGF0YTogYW55KTogdm9pZCB7XHJcbiAgLy8gICBjb25zb2xlLmxvZyhpbmRleCwgZGF0YSlcclxuICAvLyAgIHRoaXMuY2hlY2tlZEluZGV4ZXNbaW5kZXhdID0gIXRoaXMuY2hlY2tlZEluZGV4ZXNbaW5kZXhdO1xyXG4gIC8vICAgbGV0IGV4aXRzQ291bnQgPSB0aGlzLnNlbGVjdGVkRGF0YS5maWx0ZXIoKGVsZTogYW55KSA9PiBlbGUudGVtcElkID09PSBkYXRhLnRlbXBJZCkubGVuZ3RoXHJcblxyXG4gIC8vICAgaWYoZXhpdHNDb3VudD4wICl7XHJcbiAgLy8gICAgIHRoaXMuc2VsZWN0ZWREYXRhID0gdGhpcy5zZWxlY3RlZERhdGEuZmlsdGVyKChvYmo6IGFueSkgPT4gb2JqLnRlbXBJZCAhPT0gZGF0YS50ZW1wSWQpXHJcbiAgLy8gICB9ZWxzZXtcclxuICAvLyAgICAgdGhpcy5zZWxlY3RlZERhdGEucHVzaChkYXRhKVxyXG4gIC8vICAgfVxyXG5cclxuICAvLyB9XHJcbiAgc2VsZWN0ZWRUaW1lcyhvYmo6IGFueSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFRpbWUgPSBvYmpcclxuICAgIHRoaXMuaW5wdXREYXRhLmZvbGRlck5hbWUgPSBvYmpcclxuICAgIHRoaXMuaW5pdGlhbERhdGFMb2FkKClcclxuICB9XHJcbiAgb25TdWJtaXQoKSB7XHJcbiAgICBsZXQgcGF5bG9hZDogYW55ID0gW11cclxuICAgIHRoaXMuc2VsZWN0ZWREYXRhLnB1c2goe3RlbXBJZDp0aGlzLnNlbGVjdGVkVGVtcElkLHNlbGVjdGVkVGltZTp0aGlzLnNlbGVjdGVkVGltZX0pXHJcblxyXG4gICAgbGV0IGlucHV0RGF0YSA9IHtcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuaW5wdXREYXRhLmNsaWVudElkLFxyXG4gICAgICBzdG9yZUlkOiB0aGlzLmlucHV0RGF0YS5zdG9yZUlkLFxyXG4gICAgICBkYXRlU3RyaW5nOiB0aGlzLmlucHV0RGF0YS5mb290ZmFsbERhdGUsXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZXJ2aWNlXHJcbiAgICAgIC5yZXZvcHRhZ2dpbmdjb3VudChpbnB1dERhdGEpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgPy5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2cocmVzLmRhdGEuY291bnQsdGhpcy5zZWxlY3RlZERhdGEubGVuZ3RoKVxyXG4gICAgICAgICAgICBpZiAocmVzLmRhdGEuY291bnQgPD0gMHx8cmVzLmRhdGEuY291bnQhPXRoaXMuc2VsZWN0ZWREYXRhLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIHRoaXMudG9hc3Rlci5nZXRFcnJvclRvYXN0KFwiVGFnIGxpbWl0IHJlYWNoZWQhIFRyeSB0YWdnaW5nIHVuZGVyIGRpZmZlcmVudCBjYXRlZ29yaWVzXCIpXHJcbiAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRhLm1hcCgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgb2JqID0ge1xyXG4gICAgICAgICAgICAgICAgICBjbGllbnRJZDogdGhpcy5pbnB1dERhdGEuY2xpZW50SWQsXHJcbiAgICAgICAgICAgICAgICAgIHN0b3JlSWQ6IHRoaXMuaW5wdXREYXRhLnN0b3JlSWRbMF0sXHJcbiAgICAgICAgICAgICAgICAgIHRpbWVSYW5nZTogZGF0YS5zZWxlY3RlZFRpbWUsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGVTdHJpbmc6IHRoaXMuaW5wdXREYXRhLmZvb3RmYWxsRGF0ZSxcclxuICAgICAgICAgICAgICAgICAgdGVtcElkOiBkYXRhLnRlbXBJZCxcclxuICAgICAgICAgICAgICAgICAgcHJvY2Vzc1R5cGU6IHRoaXMuaW5wdXREYXRhLnByb2Nlc3NUeXBlLFxyXG4gICAgICAgICAgICAgICAgICByZXZvcHNUeXBlOiBcIm5vblNob3BwZXJcIixcclxuICAgICAgICAgICAgICAgICAgbm9uc2hvcGVyVHlwZTogXCJEdXBsaWNhdGVcIixcclxuICAgICAgICAgICAgICAgICAgY3VzdG9tZXJJbmZvOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJcIixcclxuICAgICAgICAgICAgICAgICAgICBtb2JpbGU6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgZW1haWw6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb246IFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgYWdlOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGdlbmRlcjogXCJcIixcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgICAgICAgIHN0YXR1czogXCJzdWJtaXR0ZWRcIixcclxuICAgICAgICAgICAgICAgICAgaXNzdWVMaXN0OiBbXVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcGF5bG9hZC5wdXNoKG9iailcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIHRoaXMuc2VydmljZVxyXG4gICAgICAgICAgICAgICAgLnN1Ym1pdFJldm9wVGFnZ2luZyhwYXlsb2FkKVxyXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgICAgICAgPy5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7IH0sXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG5cclxuXHJcblxyXG5cclxuICAgIFxyXG4gIH1cclxuICBjYW5jZWwoKSB7XHJcbiAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdjYW5jZWwnKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cInJvdyBoLTU1MHB4IHNjcm9sbC1jb250YWluZXIgc2Nyb2xsLXkgdy0xMDBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgcC01XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+XHJcbiAgXHJcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJjYXJkLXRpdGxlIG14LTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGUtdGV4dCBteC0yIG10LTNcIj5UYWcgRHVwbGljYXRlIElEPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc3ViIG14LTIgbXktMVwiPklkZW50aWZ5IGFuZCB0YWcgdGhlIG9yaWdpbmFsIElEIHRoaXMgZW50cnkgZHVwbGljYXRlcy48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvaDM+XHJcblxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXBhcmF0b3Igc2VwYXJhdG9yLWRvdWJsZSBtLTNcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2ICBjbGFzcz1cImQtZmxleCBtdC0yIG1iLTIgdy0xMDAgb3ZlcmZsb3cteCBweC0wXCI+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICA8ZGl2ICBjbGFzcz1cImNvbCB0ZXh0LW5vd3JhcFwiICpuZ0Zvcj1cImxldCBvYmogb2Ygb2JqZWN0c0FycmF5XCI+XHJcbiAgICAgICAgICAgICAgPHVsICBjbGFzcz1cIm5hdiBuYXYtc3RyZXRjaCBuYXYtbGluZS10YWJzMSBuYXYtbGluZS10YWJzIGJvcmRlci10cmFuc3BhcmVudCBmbGV4LW5vd3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbSBjdXJzb3ItcG9pbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGEgKGNsaWNrKT1cInNlbGVjdGVkVGltZXMob2JqLmZvbGRlck5hbWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNlbGVjdGVkVGltZSA9PT0gb2JqPy5mb2xkZXJOYW1lID8gJ2FjdGl2ZScgOiAnJ1wiIGNsYXNzPVwibmF2LWxpbmsgY3Vyc29yLXBvaW50ZXIgbm8tYm9yZGVyIG14LTMgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7b2JqPy5mb2xkZXJOYW1lfX08c3BhbiBjbGFzcz1cIm14LTIgXCIgW25nQ2xhc3NdPVwic2VsZWN0ZWRUaW1lID09PSBvYmo/LmZvbGRlck5hbWUgPyAnYmFkZ2UtbnVtLXByaW1hcnknIDonYmFkZ2UtbnVtLW11dGVkJ1wiPnt7b2JqPy5jb3VudD9vYmo/LmNvdW50OjB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm9yZGVyLWdyYXktYWN0aXZlMSBteC0zIHAtNVwiPlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTNcIj5cclxuICAgICAgICAgICAgICA8ZGl2IFxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiY29sLW1kLTMgcm91bmRlZCBib3JkZXIgbXQtMyBwLTMgYm9yZGVyLTIgbWUtNVwiIFxyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvYmogb2YgaW1hZ2VzXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAnYm9yZGVyLXByaW1hcnknOiBpc0NoZWNrZWQob2JqKSxcclxuICAgICAgICAgICAgICAgICdib3JkZXItc2Vjb25kYXJ5JzogIWlzQ2hlY2tlZChvYmopXHJcbiAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJzZWxlY3RlZFRlbXBJZCE9PW9iaj8udGVtcElkXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG10LTFcIlxyXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICBbaWRdPVwiJ2ZsZXhDaGVjaycgKyBvYmoudGVtcElkXCJcclxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVDaGVjayhvYmopXCJcclxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNDaGVja2VkKG9iailcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbXMtMVwiIFtmb3JdPVwiJ2ZsZXhDaGVjaycgKyBvYmoudGVtcElkXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IG9iaj8udGVtcElkIH19XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxpbWcgW3NyY109XCJvYmouaW1hZ2VcIiBhbHQ9XCJJbWFnZVwiIGNsYXNzPVwiaW1nLWZsdWlkIHctMTAwIGgtMjAwcHggcm91bmRlZFwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICBcclxuXHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIG10LTUgcGItNVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXhhbXBsZUlucHV0TmFtZVwiPkRlc2NyaXB0aW9uIChPcHRpb25hbCk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgIFsobmdNb2RlbCldPVwiZGVzY3JpcHRpb25cIiBjbGFzcz1cImZvcm0tY29udHJvbCBtdC0zXCIgcm93cz1cIjNcIiBwbGFjZWhvbGRlcj1cIlwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWVuZCBtdC01XCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIG10LTMgbWUtM1wiIChjbGljayk9XCJjYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBtdC0zXCIgKGNsaWNrKT1cIm9uU3VibWl0KClcIj5TdWJtaXQ8L2J1dHRvbj5cclxuICAgICAgICAgICBcclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj4iXX0=