tango-app-ui-store-builder 1.0.38 → 1.0.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/manage-plano/popups/create-planogram/create-planogram.component.mjs +19 -8
- package/esm2022/lib/components/manage-plano/verification-table/verification-table.component.mjs +8 -2
- package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +38 -34
- package/esm2022/lib/components/manage-store-plano/verification-feedback/editable-fixture/editable-fixture.component.mjs +14 -15
- package/esm2022/lib/components/manage-store-plano/verification-feedback/fixture/fixture.component.mjs +13 -14
- package/esm2022/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.mjs +30 -31
- package/esm2022/lib/components/plano-tools/plano-migrate/plano-migrate.component.mjs +54 -7
- package/esm2022/lib/components/plano-tools/tools-parent/tools-parent.component.mjs +3 -3
- package/esm2022/lib/components/planogram/plano-table/plano-filter/plano-filter.component.mjs +13 -12
- package/esm2022/lib/components/planogram/plano-table/plano-table.component.mjs +4 -4
- package/fesm2022/tango-app-ui-store-builder.mjs +185 -120
- package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
- package/lib/components/manage-plano/popups/create-planogram/create-planogram.component.d.ts +1 -0
- package/lib/components/manage-store-plano/manage-store-plano.component.d.ts +0 -3
- package/lib/components/manage-store-plano/verification-feedback/editable-fixture/editable-fixture.component.d.ts +1 -4
- package/lib/components/manage-store-plano/verification-feedback/fixture/fixture.component.d.ts +1 -4
- package/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.d.ts +1 -4
- package/lib/components/plano-tools/plano-migrate/plano-migrate.component.d.ts +1 -0
- package/package.json +1 -1
package/esm2022/lib/components/manage-plano/popups/create-planogram/create-planogram.component.mjs
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { Component, Input } from "@angular/core";
|
|
2
|
+
import { NgbTooltip } from "@ng-bootstrap/ng-bootstrap";
|
|
2
3
|
import { FormsModule, ReactiveFormsModule, Validators, } from "@angular/forms";
|
|
3
4
|
import { ReactiveSelectComponent } from "../../../reactive-select/reactive-select.component";
|
|
4
5
|
import { FileUploadComponent } from "../../../file-upload/file-upload.component";
|
|
5
6
|
import { generalValidator, getNameFromEmail, indianPincodeValidator, } from "./../../../../functions/plano.function";
|
|
6
|
-
import { NgIf } from "@angular/common";
|
|
7
|
+
import { NgIf, TitleCasePipe, UpperCasePipe } from "@angular/common";
|
|
7
8
|
import { Loader } from "@googlemaps/js-api-loader";
|
|
8
9
|
import { firstValueFrom } from "rxjs";
|
|
9
10
|
import { NgxGpAutocompleteModule } from "@angular-magic/ngx-gp-autocomplete";
|
|
@@ -32,6 +33,7 @@ export class CreatePlanogramComponent {
|
|
|
32
33
|
isLayoutExist = false;
|
|
33
34
|
isButtonLoading = false;
|
|
34
35
|
isCreateStoreMode = false;
|
|
36
|
+
newStoreDetails;
|
|
35
37
|
createStoreForm;
|
|
36
38
|
storeTypeList = [
|
|
37
39
|
{ label: "High Street", value: "HighStreet" },
|
|
@@ -159,7 +161,8 @@ export class CreatePlanogramComponent {
|
|
|
159
161
|
});
|
|
160
162
|
this.selectedStore = newStore.storeId;
|
|
161
163
|
this.selectedFloor = this.createStoreForm.get("floor")?.value ?? 1;
|
|
162
|
-
this.
|
|
164
|
+
this.newStoreDetails = createStorePayload;
|
|
165
|
+
this.isCreateStoreMode = false;
|
|
163
166
|
}
|
|
164
167
|
}
|
|
165
168
|
else {
|
|
@@ -179,8 +182,13 @@ export class CreatePlanogramComponent {
|
|
|
179
182
|
}
|
|
180
183
|
}
|
|
181
184
|
async getSpocUserDetails(storeName) {
|
|
182
|
-
const
|
|
183
|
-
|
|
185
|
+
const safeStoreName = storeName
|
|
186
|
+
?.toLowerCase()
|
|
187
|
+
.trim()
|
|
188
|
+
.replace(/\s+/g, "_")
|
|
189
|
+
.replace(/[^a-z0-9._-]/g, "");
|
|
190
|
+
const email = this.createStoreForm.get("email")?.value?.toLowerCase() ||
|
|
191
|
+
`${safeStoreName}_planogram@lenskart.com`;
|
|
184
192
|
try {
|
|
185
193
|
const result = await firstValueFrom(this.storeBuilderService.spocEmailCheck({
|
|
186
194
|
clientId: this.clientId,
|
|
@@ -280,8 +288,8 @@ export class CreatePlanogramComponent {
|
|
|
280
288
|
this.activeModal.dismiss();
|
|
281
289
|
}
|
|
282
290
|
onBack() {
|
|
283
|
-
this.createStoreForm = null;
|
|
284
291
|
this.isCreateStoreMode = false;
|
|
292
|
+
this.newStoreDetails = null;
|
|
285
293
|
}
|
|
286
294
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CreatePlanogramComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.StoreBuilderService }, { token: i3.ToastService }, { token: i4.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
287
295
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: CreatePlanogramComponent, isStandalone: true, selector: "app-create-planogram", inputs: { clientId: "clientId" }, providers: [
|
|
@@ -292,7 +300,7 @@ export class CreatePlanogramComponent {
|
|
|
292
300
|
libraries: ["places"],
|
|
293
301
|
}),
|
|
294
302
|
},
|
|
295
|
-
], ngImport: i0, template: "<div class=\"modal-wrapper\">\r\n <h3 class=\"mb-4\">Create store layout/plan from CAD</h3>\r\n @if(isCreateStoreMode){\r\n <form [formGroup]=\"createStoreForm\">\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"storeName\" class=\"form-label mb-1\">Store name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"storeName\" formControlName=\"storeName\"\r\n placeholder=\"Type store name\" />\r\n <ng-container *ngIf=\"createStoreForm.get('storeName')?.touched && createStoreForm.get('storeName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('required')\">\r\n Store name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('exists')\">\r\n Store already exists.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('whitespace')\">\r\n Store name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\" [label]=\"'Select floor'\"\r\n formControlName=\"floor\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"businessTypeList\"\r\n [label]=\"'Select business type'\" formControlName=\"businessType\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"storeTypeList\"\r\n [label]=\"'Select store type'\" formControlName=\"storeType\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n @if(createStoreForm.get('storeType')?.value == 'mall'){\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"storeTypeName\" class=\"form-label mb-1\">Enter Mall name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"storeTypeName\" formControlName=\"storeTypeName\"\r\n placeholder=\"Enter Mall name\" />\r\n <ng-container\r\n *ngIf=\"createStoreForm.get('storeTypeName')?.touched && createStoreForm.get('storeTypeName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('whitespace')\">\r\n Mall name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n }\r\n\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"address\" class=\"form-label mb-1\">Address</label>\r\n <input type=\"text\" class=\"form-control\" id=\"address\" formControlName=\"address\"\r\n placeholder=\"Search and enter address\" ngx-gp-autocomplete (onAddressChange)=\"onAddressChange($event)\" />\r\n <ng-container *ngIf=\"createStoreForm.get('address')?.touched && createStoreForm.get('address')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('address')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"country\" class=\"form-label mb-1\">Country</label>\r\n <input type=\"text\" class=\"form-control\" id=\"country\" formControlName=\"country\" placeholder=\"Enter Country\" />\r\n <ng-container *ngIf=\"createStoreForm.get('country')?.touched && createStoreForm.get('country')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"state\" class=\"form-label mb-1\">State</label>\r\n <input type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\" placeholder=\"Enter State\" />\r\n <ng-container *ngIf=\"createStoreForm.get('state')?.touched && createStoreForm.get('state')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"city\" class=\"form-label mb-1\">City / Town</label>\r\n <input type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\" placeholder=\"Enter City / Town\" />\r\n <ng-container *ngIf=\"createStoreForm.get('city')?.touched && createStoreForm.get('city')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('city')?.hasError('required')\">\r\n City / Town is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"pincode\" class=\"form-label mb-1\">Pin / Zip Code</label>\r\n <input type=\"text\" class=\"form-control\" id=\"pincode\" formControlName=\"pincode\"\r\n placeholder=\"Enter Pin / Zip Code\" />\r\n <ng-container *ngIf=\"createStoreForm.get('pincode')?.touched && createStoreForm.get('pincode')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('required')\">\r\n Pin / Zip Code is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"createStoreForm.get('pincode')?.hasError('whitespace') || createStoreForm.get('pincode')?.hasError('trimSpaces')\">\r\n Pincode cannot contain whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('invalidPincode')\">\r\n Enter a valid 6-digit pincode\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"email\" class=\"form-label mb-1\">Spoc user email</label>\r\n <input type=\"text\" class=\"form-control\" id=\"email\" formControlName=\"email\"\r\n placeholder=\"Enter spoc user email\" />\r\n <ng-container *ngIf=\"createStoreForm.get('email')?.touched && createStoreForm.get('email')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('email')?.hasError('email')\">\r\n Email is invalid.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n </form>\r\n }\r\n @else {\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\r\n <lib-reactive-select [search]=\"true\" [(ngModel)]=\"selectedStore\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"storeList\" [label]=\"'Select store'\" [action]=\"true\" (actionClick)=\"addNewStore()\"\r\n [actionLabel]=\"'Create new store'\" (ngModelChange)=\"onStoreChange()\" [disabled]=\"isButtonLoading\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"col-6\">\r\n <lib-reactive-select [(ngModel)]=\"selectedFloor\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\"\r\n [label]=\"'Select floor'\" (ngModelChange)=\"onFloorChange()\" [disabled]=\"isButtonLoading\">\r\n </lib-reactive-select>\r\n </div>\r\n </div>\r\n <div class=\"layout-exist-wrapper\" [class.show]=\"isLayoutExist\">\r\n <div class=\"layout-exist-warning mb-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n stroke=\"#F04438\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n This store already has a Floor {{selectedFloor}} planogram. Overwrite it? This can\u2019t be undone.\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <file-upload [disabled]=\"isButtonLoading\" (fileChange)=\"onFileChange($event)\"></file-upload>\r\n </div>\r\n }\r\n <div class=\"modal-actions\">\r\n @if(isCreateStoreMode){\r\n <button type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\">Back</button>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"createStoreForm.invalid\" (click)=\"onCreateStore()\">\r\n <span *ngIf=\"!isButtonLoading\">\r\n Create\r\n </span>\r\n <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }@else {\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"!isValidToCreatePlano || isButtonLoading\"\r\n (click)=\"onCreateLayoutPlano()\">\r\n <span *ngIf=\"!isButtonLoading\">\r\n {{isLayoutExist ? 'Overwrite' : 'Create'}}\r\n </span>\r\n\r\n <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n</div>", styles: [".modal-wrapper{padding:24px}.modal-actions{display:flex;justify-content:end;gap:12px}::ng-deep .counter-container{padding:10px!important;border:.49px solid #d0d5dd!important;background-color:#fff!important;justify-content:space-between!important;margin-bottom:26px!important}::ng-deep .modal-content{border-radius:12px!important}.layout-exist-warning{display:flex;align-items:center;gap:8px;padding:16px;background:#fef3f2;border:1px solid #fda29b;border-radius:8px;color:#d92d20;font-family:Inter;font-weight:600;font-size:14px;line-height:20px}.layout-exist-wrapper{overflow:hidden;max-height:0;opacity:0;transform:translateY(-8px);transition:max-height .25s ease,opacity .2s ease,transform .2s ease}.layout-exist-wrapper.show{max-height:120px;opacity:1;transform:translateY(0)}::ng-deep .create-planogram-modal .modal-dialog{max-width:700px;width:100%}.btn .spinner{height:22px;width:46px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:6px;stroke:#fff;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }, { kind: "component", type: FileUploadComponent, selector: "file-upload", inputs: ["disabled"], outputs: ["fileChange"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: NgxGpAutocompleteModule }, { kind: "directive", type: i5.NgxGpAutocompleteDirective, selector: "[ngx-gp-autocomplete]", inputs: ["options"], outputs: ["onAddressChange"], exportAs: ["ngx-places"] }] });
|
|
303
|
+
], ngImport: i0, template: "<div class=\"modal-wrapper\">\r\n <h3 class=\"mb-3\">Create store layout/plan from CAD</h3>\r\n @if(isCreateStoreMode){\r\n <div class=\"d-flex algn-items-center gap-2\">\r\n <p>Step 1: Onboard store with basic details</p>\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n ngbTooltip=\"A new store will be created when you perform this action (Manage > Stores).\">\r\n <path\r\n d=\"M10.0003 13.3337V10.0003M10.0003 6.66699H10.0087M18.3337 10.0003C18.3337 14.6027 14.6027 18.3337 10.0003 18.3337C5.39795 18.3337 1.66699 14.6027 1.66699 10.0003C1.66699 5.39795 5.39795 1.66699 10.0003 1.66699C14.6027 1.66699 18.3337 5.39795 18.3337 10.0003Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n }\r\n\r\n\r\n @if(isCreateStoreMode){\r\n <form [formGroup]=\"createStoreForm\">\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"storeName\" class=\"form-label mb-1\">Store name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"storeName\" formControlName=\"storeName\"\r\n placeholder=\"Type store name\" />\r\n <ng-container *ngIf=\"createStoreForm.get('storeName')?.touched && createStoreForm.get('storeName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('required')\">\r\n Store name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('exists')\">\r\n Store already exists.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('whitespace')\">\r\n Store name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\" [label]=\"'Select floor'\"\r\n formControlName=\"floor\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"businessTypeList\"\r\n [label]=\"'Select business type'\" formControlName=\"businessType\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"storeTypeList\"\r\n [label]=\"'Select store type'\" formControlName=\"storeType\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n @if(createStoreForm.get('storeType')?.value == 'mall'){\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"storeTypeName\" class=\"form-label mb-1\">Enter Mall name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"storeTypeName\" formControlName=\"storeTypeName\"\r\n placeholder=\"Enter Mall name\" />\r\n <ng-container\r\n *ngIf=\"createStoreForm.get('storeTypeName')?.touched && createStoreForm.get('storeTypeName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('whitespace')\">\r\n Mall name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n }\r\n\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"address\" class=\"form-label mb-1\">Address</label>\r\n <input type=\"text\" class=\"form-control\" id=\"address\" formControlName=\"address\"\r\n placeholder=\"Search and enter address\" ngx-gp-autocomplete (onAddressChange)=\"onAddressChange($event)\" />\r\n <ng-container *ngIf=\"createStoreForm.get('address')?.touched && createStoreForm.get('address')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('address')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"country\" class=\"form-label mb-1\">Country</label>\r\n <input type=\"text\" class=\"form-control\" id=\"country\" formControlName=\"country\" placeholder=\"Enter Country\" />\r\n <ng-container *ngIf=\"createStoreForm.get('country')?.touched && createStoreForm.get('country')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"state\" class=\"form-label mb-1\">State</label>\r\n <input type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\" placeholder=\"Enter State\" />\r\n <ng-container *ngIf=\"createStoreForm.get('state')?.touched && createStoreForm.get('state')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"city\" class=\"form-label mb-1\">City / Town</label>\r\n <input type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\" placeholder=\"Enter City / Town\" />\r\n <ng-container *ngIf=\"createStoreForm.get('city')?.touched && createStoreForm.get('city')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('city')?.hasError('required')\">\r\n City / Town is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"pincode\" class=\"form-label mb-1\">Pin / Zip Code</label>\r\n <input type=\"text\" class=\"form-control\" id=\"pincode\" formControlName=\"pincode\"\r\n placeholder=\"Enter Pin / Zip Code\" />\r\n <ng-container *ngIf=\"createStoreForm.get('pincode')?.touched && createStoreForm.get('pincode')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('required')\">\r\n Pin / Zip Code is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"createStoreForm.get('pincode')?.hasError('whitespace') || createStoreForm.get('pincode')?.hasError('trimSpaces')\">\r\n Pincode cannot contain whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('invalidPincode')\">\r\n Enter a valid 6-digit pincode\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"email\" class=\"form-label mb-1\">Spoc user email</label>\r\n <input type=\"text\" class=\"form-control\" id=\"email\" formControlName=\"email\"\r\n placeholder=\"Enter spoc user email\" />\r\n <ng-container *ngIf=\"createStoreForm.get('email')?.touched && createStoreForm.get('email')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('email')?.hasError('email')\">\r\n Email is invalid.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n </form>\r\n }\r\n @else {\r\n @if(newStoreDetails){\r\n <p class=\"mb-6\">Step 2: Add CAD file</p >\r\n\r\n <div class=\"row mb-6\">\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Store name</p>\r\n <h3>{{newStoreDetails?.storeName}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Floor</p>\r\n <h3>Floor {{this.selectedFloor}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Business type</p>\r\n <h3>{{newStoreDetails?.businessType | uppercase}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Store type</p>\r\n <h3>{{newStoreDetails?.storeType?.type | titlecase}}</h3>\r\n </div>\r\n </div>\r\n }@else {\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\r\n <lib-reactive-select [search]=\"true\" [(ngModel)]=\"selectedStore\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"storeList\" [label]=\"'Select store'\" [action]=\"true\" (actionClick)=\"addNewStore()\"\r\n [actionLabel]=\"'Create new store'\" (ngModelChange)=\"onStoreChange()\" [disabled]=\"isButtonLoading\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"col-6\">\r\n <lib-reactive-select [(ngModel)]=\"selectedFloor\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\"\r\n [label]=\"'Select floor'\" (ngModelChange)=\"onFloorChange()\" [disabled]=\"isButtonLoading\">\r\n </lib-reactive-select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"layout-exist-wrapper\" [class.show]=\"isLayoutExist\">\r\n <div class=\"layout-exist-warning mb-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n stroke=\"#F04438\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n This store already has a Floor {{selectedFloor}} planogram. Overwrite it? This can\u2019t be undone.\r\n </div>\r\n </div>\r\n }\r\n <div class=\"mb-4\">\r\n <file-upload [disabled]=\"isButtonLoading\" (fileChange)=\"onFileChange($event)\"></file-upload>\r\n </div>\r\n }\r\n <div class=\"modal-actions\">\r\n @if(isCreateStoreMode){\r\n <button type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\">Back</button>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"createStoreForm.invalid\" (click)=\"onCreateStore()\">\r\n <span *ngIf=\"!isButtonLoading\">\r\n Next\r\n </span>\r\n <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }@else {\r\n <button *ngIf=\"newStoreDetails\" type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\">Back</button>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"!isValidToCreatePlano || isButtonLoading\"\r\n (click)=\"onCreateLayoutPlano()\">\r\n <span *ngIf=\"!isButtonLoading\">\r\n {{isLayoutExist ? 'Overwrite' : 'Create'}}\r\n </span>\r\n\r\n <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n</div>", styles: [".modal-wrapper{padding:24px}.modal-actions{display:flex;justify-content:end;gap:12px}::ng-deep .counter-container{padding:10px!important;border:.49px solid #d0d5dd!important;background-color:#fff!important;justify-content:space-between!important;margin-bottom:26px!important}::ng-deep .modal-content{border-radius:12px!important}.layout-exist-warning{display:flex;align-items:center;gap:8px;padding:16px;background:#fef3f2;border:1px solid #fda29b;border-radius:8px;color:#d92d20;font-family:Inter;font-weight:600;font-size:14px;line-height:20px}.layout-exist-wrapper{overflow:hidden;max-height:0;opacity:0;transform:translateY(-8px);transition:max-height .25s ease,opacity .2s ease,transform .2s ease}.layout-exist-wrapper.show{max-height:120px;opacity:1;transform:translateY(0)}::ng-deep .create-planogram-modal .modal-dialog{max-width:700px;width:100%}.btn .spinner{height:22px;width:46px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:6px;stroke:#fff;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }, { kind: "component", type: FileUploadComponent, selector: "file-upload", inputs: ["disabled"], outputs: ["fileChange"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: NgxGpAutocompleteModule }, { kind: "directive", type: i5.NgxGpAutocompleteDirective, selector: "[ngx-gp-autocomplete]", inputs: ["options"], outputs: ["onAddressChange"], exportAs: ["ngx-places"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "pipe", type: UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: TitleCasePipe, name: "titlecase" }] });
|
|
296
304
|
}
|
|
297
305
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CreatePlanogramComponent, decorators: [{
|
|
298
306
|
type: Component,
|
|
@@ -303,6 +311,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
303
311
|
FileUploadComponent,
|
|
304
312
|
NgIf,
|
|
305
313
|
NgxGpAutocompleteModule,
|
|
314
|
+
NgbTooltip,
|
|
315
|
+
UpperCasePipe,
|
|
316
|
+
TitleCasePipe,
|
|
306
317
|
], providers: [
|
|
307
318
|
{
|
|
308
319
|
provide: Loader,
|
|
@@ -311,8 +322,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
311
322
|
libraries: ["places"],
|
|
312
323
|
}),
|
|
313
324
|
},
|
|
314
|
-
], template: "<div class=\"modal-wrapper\">\r\n <h3 class=\"mb-4\">Create store layout/plan from CAD</h3>\r\n @if(isCreateStoreMode){\r\n <form [formGroup]=\"createStoreForm\">\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"storeName\" class=\"form-label mb-1\">Store name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"storeName\" formControlName=\"storeName\"\r\n placeholder=\"Type store name\" />\r\n <ng-container *ngIf=\"createStoreForm.get('storeName')?.touched && createStoreForm.get('storeName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('required')\">\r\n Store name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('exists')\">\r\n Store already exists.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('whitespace')\">\r\n Store name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\" [label]=\"'Select floor'\"\r\n formControlName=\"floor\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"businessTypeList\"\r\n [label]=\"'Select business type'\" formControlName=\"businessType\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"storeTypeList\"\r\n [label]=\"'Select store type'\" formControlName=\"storeType\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n @if(createStoreForm.get('storeType')?.value == 'mall'){\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"storeTypeName\" class=\"form-label mb-1\">Enter Mall name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"storeTypeName\" formControlName=\"storeTypeName\"\r\n placeholder=\"Enter Mall name\" />\r\n <ng-container\r\n *ngIf=\"createStoreForm.get('storeTypeName')?.touched && createStoreForm.get('storeTypeName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('whitespace')\">\r\n Mall name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n }\r\n\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"address\" class=\"form-label mb-1\">Address</label>\r\n <input type=\"text\" class=\"form-control\" id=\"address\" formControlName=\"address\"\r\n placeholder=\"Search and enter address\" ngx-gp-autocomplete (onAddressChange)=\"onAddressChange($event)\" />\r\n <ng-container *ngIf=\"createStoreForm.get('address')?.touched && createStoreForm.get('address')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('address')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"country\" class=\"form-label mb-1\">Country</label>\r\n <input type=\"text\" class=\"form-control\" id=\"country\" formControlName=\"country\" placeholder=\"Enter Country\" />\r\n <ng-container *ngIf=\"createStoreForm.get('country')?.touched && createStoreForm.get('country')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"state\" class=\"form-label mb-1\">State</label>\r\n <input type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\" placeholder=\"Enter State\" />\r\n <ng-container *ngIf=\"createStoreForm.get('state')?.touched && createStoreForm.get('state')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"city\" class=\"form-label mb-1\">City / Town</label>\r\n <input type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\" placeholder=\"Enter City / Town\" />\r\n <ng-container *ngIf=\"createStoreForm.get('city')?.touched && createStoreForm.get('city')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('city')?.hasError('required')\">\r\n City / Town is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"pincode\" class=\"form-label mb-1\">Pin / Zip Code</label>\r\n <input type=\"text\" class=\"form-control\" id=\"pincode\" formControlName=\"pincode\"\r\n placeholder=\"Enter Pin / Zip Code\" />\r\n <ng-container *ngIf=\"createStoreForm.get('pincode')?.touched && createStoreForm.get('pincode')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('required')\">\r\n Pin / Zip Code is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"createStoreForm.get('pincode')?.hasError('whitespace') || createStoreForm.get('pincode')?.hasError('trimSpaces')\">\r\n Pincode cannot contain whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('invalidPincode')\">\r\n Enter a valid 6-digit pincode\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"email\" class=\"form-label mb-1\">Spoc user email</label>\r\n <input type=\"text\" class=\"form-control\" id=\"email\" formControlName=\"email\"\r\n placeholder=\"Enter spoc user email\" />\r\n <ng-container *ngIf=\"createStoreForm.get('email')?.touched && createStoreForm.get('email')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('email')?.hasError('email')\">\r\n Email is invalid.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n </form>\r\n }\r\n @else {\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\r\n <lib-reactive-select [search]=\"true\" [(ngModel)]=\"selectedStore\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"storeList\" [label]=\"'Select store'\" [action]=\"true\" (actionClick)=\"addNewStore()\"\r\n [actionLabel]=\"'Create new store'\" (ngModelChange)=\"onStoreChange()\" [disabled]=\"isButtonLoading\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"col-6\">\r\n <lib-reactive-select [(ngModel)]=\"selectedFloor\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\"\r\n [label]=\"'Select floor'\" (ngModelChange)=\"onFloorChange()\" [disabled]=\"isButtonLoading\">\r\n </lib-reactive-select>\r\n </div>\r\n </div>\r\n <div class=\"layout-exist-wrapper\" [class.show]=\"isLayoutExist\">\r\n <div class=\"layout-exist-warning mb-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n stroke=\"#F04438\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n This store already has a Floor {{selectedFloor}} planogram. Overwrite it? This can\u2019t be undone.\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <file-upload [disabled]=\"isButtonLoading\" (fileChange)=\"onFileChange($event)\"></file-upload>\r\n </div>\r\n }\r\n <div class=\"modal-actions\">\r\n @if(isCreateStoreMode){\r\n <button type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\">Back</button>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"createStoreForm.invalid\" (click)=\"onCreateStore()\">\r\n <span *ngIf=\"!isButtonLoading\">\r\n Create\r\n </span>\r\n <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }@else {\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"!isValidToCreatePlano || isButtonLoading\"\r\n (click)=\"onCreateLayoutPlano()\">\r\n <span *ngIf=\"!isButtonLoading\">\r\n {{isLayoutExist ? 'Overwrite' : 'Create'}}\r\n </span>\r\n\r\n <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n</div>", styles: [".modal-wrapper{padding:24px}.modal-actions{display:flex;justify-content:end;gap:12px}::ng-deep .counter-container{padding:10px!important;border:.49px solid #d0d5dd!important;background-color:#fff!important;justify-content:space-between!important;margin-bottom:26px!important}::ng-deep .modal-content{border-radius:12px!important}.layout-exist-warning{display:flex;align-items:center;gap:8px;padding:16px;background:#fef3f2;border:1px solid #fda29b;border-radius:8px;color:#d92d20;font-family:Inter;font-weight:600;font-size:14px;line-height:20px}.layout-exist-wrapper{overflow:hidden;max-height:0;opacity:0;transform:translateY(-8px);transition:max-height .25s ease,opacity .2s ease,transform .2s ease}.layout-exist-wrapper.show{max-height:120px;opacity:1;transform:translateY(0)}::ng-deep .create-planogram-modal .modal-dialog{max-width:700px;width:100%}.btn .spinner{height:22px;width:46px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:6px;stroke:#fff;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
|
|
325
|
+
], template: "<div class=\"modal-wrapper\">\r\n <h3 class=\"mb-3\">Create store layout/plan from CAD</h3>\r\n @if(isCreateStoreMode){\r\n <div class=\"d-flex algn-items-center gap-2\">\r\n <p>Step 1: Onboard store with basic details</p>\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n ngbTooltip=\"A new store will be created when you perform this action (Manage > Stores).\">\r\n <path\r\n d=\"M10.0003 13.3337V10.0003M10.0003 6.66699H10.0087M18.3337 10.0003C18.3337 14.6027 14.6027 18.3337 10.0003 18.3337C5.39795 18.3337 1.66699 14.6027 1.66699 10.0003C1.66699 5.39795 5.39795 1.66699 10.0003 1.66699C14.6027 1.66699 18.3337 5.39795 18.3337 10.0003Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n }\r\n\r\n\r\n @if(isCreateStoreMode){\r\n <form [formGroup]=\"createStoreForm\">\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"storeName\" class=\"form-label mb-1\">Store name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"storeName\" formControlName=\"storeName\"\r\n placeholder=\"Type store name\" />\r\n <ng-container *ngIf=\"createStoreForm.get('storeName')?.touched && createStoreForm.get('storeName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('required')\">\r\n Store name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('exists')\">\r\n Store already exists.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('whitespace')\">\r\n Store name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\" [label]=\"'Select floor'\"\r\n formControlName=\"floor\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"businessTypeList\"\r\n [label]=\"'Select business type'\" formControlName=\"businessType\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"storeTypeList\"\r\n [label]=\"'Select store type'\" formControlName=\"storeType\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n @if(createStoreForm.get('storeType')?.value == 'mall'){\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"storeTypeName\" class=\"form-label mb-1\">Enter Mall name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"storeTypeName\" formControlName=\"storeTypeName\"\r\n placeholder=\"Enter Mall name\" />\r\n <ng-container\r\n *ngIf=\"createStoreForm.get('storeTypeName')?.touched && createStoreForm.get('storeTypeName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('whitespace')\">\r\n Mall name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n }\r\n\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"address\" class=\"form-label mb-1\">Address</label>\r\n <input type=\"text\" class=\"form-control\" id=\"address\" formControlName=\"address\"\r\n placeholder=\"Search and enter address\" ngx-gp-autocomplete (onAddressChange)=\"onAddressChange($event)\" />\r\n <ng-container *ngIf=\"createStoreForm.get('address')?.touched && createStoreForm.get('address')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('address')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"country\" class=\"form-label mb-1\">Country</label>\r\n <input type=\"text\" class=\"form-control\" id=\"country\" formControlName=\"country\" placeholder=\"Enter Country\" />\r\n <ng-container *ngIf=\"createStoreForm.get('country')?.touched && createStoreForm.get('country')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"state\" class=\"form-label mb-1\">State</label>\r\n <input type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\" placeholder=\"Enter State\" />\r\n <ng-container *ngIf=\"createStoreForm.get('state')?.touched && createStoreForm.get('state')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"city\" class=\"form-label mb-1\">City / Town</label>\r\n <input type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\" placeholder=\"Enter City / Town\" />\r\n <ng-container *ngIf=\"createStoreForm.get('city')?.touched && createStoreForm.get('city')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('city')?.hasError('required')\">\r\n City / Town is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"pincode\" class=\"form-label mb-1\">Pin / Zip Code</label>\r\n <input type=\"text\" class=\"form-control\" id=\"pincode\" formControlName=\"pincode\"\r\n placeholder=\"Enter Pin / Zip Code\" />\r\n <ng-container *ngIf=\"createStoreForm.get('pincode')?.touched && createStoreForm.get('pincode')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('required')\">\r\n Pin / Zip Code is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"createStoreForm.get('pincode')?.hasError('whitespace') || createStoreForm.get('pincode')?.hasError('trimSpaces')\">\r\n Pincode cannot contain whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('invalidPincode')\">\r\n Enter a valid 6-digit pincode\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"email\" class=\"form-label mb-1\">Spoc user email</label>\r\n <input type=\"text\" class=\"form-control\" id=\"email\" formControlName=\"email\"\r\n placeholder=\"Enter spoc user email\" />\r\n <ng-container *ngIf=\"createStoreForm.get('email')?.touched && createStoreForm.get('email')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('email')?.hasError('email')\">\r\n Email is invalid.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n </form>\r\n }\r\n @else {\r\n @if(newStoreDetails){\r\n <p class=\"mb-6\">Step 2: Add CAD file</p >\r\n\r\n <div class=\"row mb-6\">\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Store name</p>\r\n <h3>{{newStoreDetails?.storeName}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Floor</p>\r\n <h3>Floor {{this.selectedFloor}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Business type</p>\r\n <h3>{{newStoreDetails?.businessType | uppercase}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Store type</p>\r\n <h3>{{newStoreDetails?.storeType?.type | titlecase}}</h3>\r\n </div>\r\n </div>\r\n }@else {\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\r\n <lib-reactive-select [search]=\"true\" [(ngModel)]=\"selectedStore\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"storeList\" [label]=\"'Select store'\" [action]=\"true\" (actionClick)=\"addNewStore()\"\r\n [actionLabel]=\"'Create new store'\" (ngModelChange)=\"onStoreChange()\" [disabled]=\"isButtonLoading\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"col-6\">\r\n <lib-reactive-select [(ngModel)]=\"selectedFloor\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\"\r\n [label]=\"'Select floor'\" (ngModelChange)=\"onFloorChange()\" [disabled]=\"isButtonLoading\">\r\n </lib-reactive-select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"layout-exist-wrapper\" [class.show]=\"isLayoutExist\">\r\n <div class=\"layout-exist-warning mb-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n stroke=\"#F04438\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n This store already has a Floor {{selectedFloor}} planogram. Overwrite it? This can\u2019t be undone.\r\n </div>\r\n </div>\r\n }\r\n <div class=\"mb-4\">\r\n <file-upload [disabled]=\"isButtonLoading\" (fileChange)=\"onFileChange($event)\"></file-upload>\r\n </div>\r\n }\r\n <div class=\"modal-actions\">\r\n @if(isCreateStoreMode){\r\n <button type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\">Back</button>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"createStoreForm.invalid\" (click)=\"onCreateStore()\">\r\n <span *ngIf=\"!isButtonLoading\">\r\n Next\r\n </span>\r\n <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }@else {\r\n <button *ngIf=\"newStoreDetails\" type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\">Back</button>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"!isValidToCreatePlano || isButtonLoading\"\r\n (click)=\"onCreateLayoutPlano()\">\r\n <span *ngIf=\"!isButtonLoading\">\r\n {{isLayoutExist ? 'Overwrite' : 'Create'}}\r\n </span>\r\n\r\n <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n</div>", styles: [".modal-wrapper{padding:24px}.modal-actions{display:flex;justify-content:end;gap:12px}::ng-deep .counter-container{padding:10px!important;border:.49px solid #d0d5dd!important;background-color:#fff!important;justify-content:space-between!important;margin-bottom:26px!important}::ng-deep .modal-content{border-radius:12px!important}.layout-exist-warning{display:flex;align-items:center;gap:8px;padding:16px;background:#fef3f2;border:1px solid #fda29b;border-radius:8px;color:#d92d20;font-family:Inter;font-weight:600;font-size:14px;line-height:20px}.layout-exist-wrapper{overflow:hidden;max-height:0;opacity:0;transform:translateY(-8px);transition:max-height .25s ease,opacity .2s ease,transform .2s ease}.layout-exist-wrapper.show{max-height:120px;opacity:1;transform:translateY(0)}::ng-deep .create-planogram-modal .modal-dialog{max-width:700px;width:100%}.btn .spinner{height:22px;width:46px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:6px;stroke:#fff;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
|
|
315
326
|
}], ctorParameters: () => [{ type: i1.NgbActiveModal }, { type: i2.StoreBuilderService }, { type: i3.ToastService }, { type: i4.FormBuilder }], propDecorators: { clientId: [{
|
|
316
327
|
type: Input
|
|
317
328
|
}] } });
|
|
318
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9tYW5hZ2UtcGxhbm8vcG9wdXBzL2NyZWF0ZS1wbGFub2dyYW0vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9tYW5hZ2UtcGxhbm8vcG9wdXBzL2NyZWF0ZS1wbGFub2dyYW0vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBR0wsV0FBVyxFQUNYLG1CQUFtQixFQUVuQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUU3RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNqRixPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixzQkFBc0IsR0FDdkIsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7QUF5QjdFLE1BQU0sT0FBTyx3QkFBd0I7SUFnRHpCO0lBQ0E7SUFDQTtJQUNBO0lBbERELFFBQVEs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QUUsSUFBSSxNQUFNLENBQUM7b0JBQ25CLE1BQU0sRUFBRSx5Q0FBeUM7b0JBQ2pELFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQztpQkFDdEIsQ0FBQzthQUNIO1NBQ0YsMEJDN0NILDJxVkE2TE0sc25DRC9KRixXQUFXLG0zQkFDWCxtQkFBbUIsZ1ZBQ25CLHVCQUF1Qix5TkFDdkIsbUJBQW1CLHVHQUNuQixJQUFJLDRGQUNKLHVCQUF1Qjs7NEZBWWQsd0JBQXdCO2tCQXZCcEMsU0FBUzsrQkFDRSxzQkFBc0IsY0FHcEIsSUFBSSxXQUNQO3dCQUNQLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQix1QkFBdUI7d0JBQ3ZCLG1CQUFtQjt3QkFDbkIsSUFBSTt3QkFDSix1QkFBdUI7cUJBQ3hCLGFBQ1U7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLE1BQU07NEJBQ2YsUUFBUSxFQUFFLElBQUksTUFBTSxDQUFDO2dDQUNuQixNQUFNLEVBQUUseUNBQXlDO2dDQUNqRCxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUM7NkJBQ3RCLENBQUM7eUJBQ0g7cUJBQ0Y7MEtBR1EsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE5nYkFjdGl2ZU1vZGFsIH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcbmltcG9ydCB7XHJcbiAgQWJzdHJhY3RDb250cm9sLFxyXG4gIEZvcm1CdWlsZGVyLFxyXG4gIEZvcm1zTW9kdWxlLFxyXG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgVmFsaWRhdG9yRm4sXHJcbiAgVmFsaWRhdG9ycyxcclxufSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgUmVhY3RpdmVTZWxlY3RDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vLi4vcmVhY3RpdmUtc2VsZWN0L3JlYWN0aXZlLXNlbGVjdC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgRmlsZVVwbG9hZENvbXBvbmVudCB9IGZyb20gXCIuLi8uLi8uLi9maWxlLXVwbG9hZC9maWxlLXVwbG9hZC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtcclxuICBnZW5lcmFsVmFsaWRhdG9yLFxyXG4gIGdldE5hbWVGcm9tRW1haWwsXHJcbiAgaW5kaWFuUGluY29kZVZhbGlkYXRvcixcclxufSBmcm9tIFwiLi8uLi8uLi8uLi8uLi9mdW5jdGlvbnMvcGxhbm8uZnVuY3Rpb25cIjtcclxuaW1wb3J0IHsgTmdJZiB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSBcInRhbmdvLWFwcC11aS1zaGFyZWRcIjtcclxuaW1wb3J0IHsgTG9hZGVyIH0gZnJvbSBcIkBnb29nbGVtYXBzL2pzLWFwaS1sb2FkZXJcIjtcclxuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBOZ3hHcEF1dG9jb21wbGV0ZU1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci1tYWdpYy9uZ3gtZ3AtYXV0b2NvbXBsZXRlXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhcHAtY3JlYXRlLXBsYW5vZ3JhbVwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsOiBcIi4vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuc2Nzc1wiLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVTZWxlY3RDb21wb25lbnQsXHJcbiAgICBGaWxlVXBsb2FkQ29tcG9uZW50LFxyXG4gICAgTmdJZixcclxuICAgIE5neEdwQXV0b2NvbXBsZXRlTW9kdWxlLFxyXG4gIF0sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IExvYWRlcixcclxuICAgICAgdXNlVmFsdWU6IG5ldyBMb2FkZXIoe1xyXG4gICAgICAgIGFwaUtleTogXCJBSXphU3lBZldROWd1RnNTWG9ZSXUyVkZCdy1YUTNWbnVmdkZBM0FcIixcclxuICAgICAgICBsaWJyYXJpZXM6IFtcInBsYWNlc1wiXSxcclxuICAgICAgfSksXHJcbiAgICB9LFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDcmVhdGVQbGFub2dyYW1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpIGNsaWVudElkOiBzdHJpbmc7XHJcblxyXG4gIHNlbGVjdGVkU3RvcmU6IHN0cmluZztcclxuICBzZWxlY3RlZEZsb29yOiBudW1iZXI7XHJcbiAgc2VsZWN0ZWRGaWxlOiBGaWxlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHN0b3JlTGlzdDoge1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgfVtdID0gW107XHJcblxyXG4gIGZsb29yTGlzdDoge1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHZhbHVlOiBudW1iZXI7XHJcbiAgfVtdID0gW1xyXG4gICAgeyBsYWJlbDogXCJGbG9vciAxXCIsIHZhbHVlOiAxIH0sXHJcbiAgICB7IGxhYmVsOiBcIkZsb29yIDJcIiwgdmFsdWU6IDIgfSxcclxuICAgIHsgbGFiZWw6IFwiRmxvb3IgM1wiLCB2YWx1ZTogMyB9LFxyXG4gIF07XHJcblxyXG4gIHNlbGVjdGVkU3RvcmVGbG9vcnM6IGFueSA9IFtdO1xyXG5cclxuICBpc0xheW91dEV4aXN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNCdXR0b25Mb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNDcmVhdGVTdG9yZU1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY3JlYXRlU3RvcmVGb3JtOiBhbnk7XHJcbiAgc3RvcmVUeXBlTGlzdDoge1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgfVtdID0gW1xyXG4gICAgeyBsYWJlbDogXCJIaWdoIFN0cmVldFwiLCB2YWx1ZTogXCJIaWdoU3RyZWV0XCIgfSxcclxuICAgIHsgbGFiZWw6IFwiTWFsbFwiLCB2YWx1ZTogXCJtYWxsXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiS2lvc2tcIiwgdmFsdWU6IFwia2lvc2tcIiB9LFxyXG4gIF07XHJcblxyXG4gIGJ1c2luZXNzVHlwZUxpc3Q6IHtcclxuICAgIGxhYmVsOiBzdHJpbmc7XHJcbiAgICB2YWx1ZTogc3RyaW5nO1xyXG4gIH1bXSA9IFtcclxuICAgIHsgbGFiZWw6IFwiQ09DT1wiLCB2YWx1ZTogXCJjb2NvXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiQ09GT1wiLCB2YWx1ZTogXCJjb2ZvXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiRk9GT1wiLCB2YWx1ZTogXCJmb2ZvXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiRk9DT1wiLCB2YWx1ZTogXCJmb2NvXCIgfSxcclxuICBdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYWN0aXZlTW9kYWw6IE5nYkFjdGl2ZU1vZGFsLFxyXG4gICAgcHJpdmF0ZSBzdG9yZUJ1aWxkZXJTZXJ2aWNlOiBTdG9yZUJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICkge31cclxuXHJcbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmdldFN0b3JlTGlzdCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzVmFsaWRUb0NyZWF0ZVBsYW5vKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRTdG9yZSAmJiB0aGlzLnNlbGVjdGVkRmxvb3IgJiYgdGhpcy5zZWxlY3RlZEZpbGU7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRTdG9yZUxpc3QoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBzdG9yZXM6IGFueSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5nZXRBbGxTdG9yZXModGhpcy5jbGllbnRJZCksXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuc3RvcmVMaXN0ID0gc3RvcmVzPy5kYXRhPy5tYXAoKHM6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7IGxhYmVsOiBzLnN0b3JlTmFtZSwgdmFsdWU6IHMuc3RvcmVJZCB9O1xyXG4gICAgICB9KTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBnZXRTdG9yZUxpc3QgW0VSUl06XCIsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG9uU3RvcmVDaGFuZ2UoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBmbG9vcnM6IGFueSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5nZXRTdG9yZUZsb29yc0xpc3QodGhpcy5zZWxlY3RlZFN0b3JlKSxcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZFN0b3JlRmxvb3JzID0gZmxvb3JzPy5kYXRhID8/IFtdO1xyXG4gICAgICB0aGlzLm9uRmxvb3JDaGFuZ2UoKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBnZXRTdG9yZUxpc3QgW0VSUl06XCIsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRmxvb3JDaGFuZ2UoKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZsb29yKSB7XHJcbiAgICAgIHRoaXMuaXNMYXlvdXRFeGlzdCA9IHRoaXMuc2VsZWN0ZWRTdG9yZUZsb29ycy5zb21lKFxyXG4gICAgICAgIChmOiBhbnkpID0+IGYuZmxvb3JOdW1iZXIgPT09IHRoaXMuc2VsZWN0ZWRGbG9vcixcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNMYXlvdXRFeGlzdCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25GaWxlQ2hhbmdlKGZpbGU6IEZpbGUgfCBudWxsKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsZSA9IGZpbGU7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkNyZWF0ZUxheW91dFBsYW5vKCkge1xyXG4gICAgaWYgKCF0aGlzLmlzVmFsaWRUb0NyZWF0ZVBsYW5vKSByZXR1cm47XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5pc0J1dHRvbkxvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgY29uc3QgcGxhbm9SZXM6IGFueSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5jcmVhdGVQbGFub0Zyb21DQUQoXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZSEsXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkU3RvcmUsXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmxvb3IsXHJcbiAgICAgICAgKSxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmICghcGxhbm9SZXM/LmRhdGEpIHJldHVybjtcclxuXHJcbiAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UocGxhbm9SZXM/LmRhdGEpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFxyXG4gICAgICAgIGVycm9yPy5lcnJvcj8uZXJyb3I/LmVyck1zZyA/PyBcIkZhaWxlZCB0byBleHRyYWN0IHBsYW5vIGZyb20gQ0FEIGZpbGUuXCIsXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBvbkNyZWF0ZSBbRVJSXTpcIiwgZXJyb3IpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5pc0J1dHRvbkxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG9uQ3JlYXRlU3RvcmUoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmlzQnV0dG9uTG9hZGluZyA9IHRydWU7XHJcbiAgICAgIGNvbnN0IHNwb2NVc2VyID0gYXdhaXQgdGhpcy5nZXRTcG9jVXNlckRldGFpbHMoXHJcbiAgICAgICAgdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWUuc3RvcmVOYW1lLnRyaW0oKSxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmICghc3BvY1VzZXIpIHJldHVybjtcclxuXHJcbiAgICAgIGNvbnN0IGNyZWF0ZVN0b3JlUGF5bG9hZCA9IHtcclxuICAgICAgICBzdG9yZU5hbWU6IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlLnN0b3JlTmFtZT8udG9VcHBlckNhc2UoKT8udHJpbSgpLFxyXG4gICAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICAgIGJ1c2luZXNzVHlwZTogdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWUuYnVzaW5lc3NUeXBlLFxyXG4gICAgICAgIGNsdXN0ZXI6IFtdLFxyXG4gICAgICAgIHN0b3JlVHlwZToge1xyXG4gICAgICAgICAgdHlwZTogdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWUuc3RvcmVUeXBlLFxyXG4gICAgICAgICAgbmFtZTogdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWU/LnN0b3JlVHlwZU5hbWU/LnRyaW0oKSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHN0b3JlUHJvZmlsZToge1xyXG4gICAgICAgICAgc3RvcmVDb2RlOiB0aGlzLmNyZWF0ZVN0b3JlRm9ybT8udmFsdWU/LnN0b3JlQ29kZSxcclxuICAgICAgICAgIGFkZHJlc3M6IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlPy5hZGRyZXNzLFxyXG4gICAgICAgICAgY291bnRyeTogdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWU/LmNvdW50cnksXHJcbiAgICAgICAgICBzdGF0ZTogdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWU/LnN0YXRlLFxyXG4gICAgICAgICAgY2l0eTogdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWU/LmNpdHksXHJcbiAgICAgICAgICBwaW5jb2RlOiB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZT8ucGluY29kZSxcclxuICAgICAgICAgIGxhdGl0dWRlOiB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZS5sYXRpdHVkZT8udG9TdHJpbmcoKS50cmltKClcclxuICAgICAgICAgICAgPyB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZS5sYXRpdHVkZVxyXG4gICAgICAgICAgICA6IDAsXHJcbiAgICAgICAgICBsb25naXR1ZGU6IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlLmxvbmdpdHVkZT8udG9TdHJpbmcoKS50cmltKClcclxuICAgICAgICAgICAgPyB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZS5sb25naXR1ZGVcclxuICAgICAgICAgICAgOiAwLFxyXG4gICAgICAgICAgdGltZVpvbmU6IFwiQXNpYS9Lb2xrYXRhXCIsXHJcbiAgICAgICAgICBvcGVuOiBcIjEwOjAwOjAwXCIsXHJcbiAgICAgICAgICBjbG9zZTogXCIyMDowMDowMFwiLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZWRnZToge1xyXG4gICAgICAgICAgc2VydmVyVHlwZTogZmFsc2UsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzcG9jRGV0YWlsczogW3Nwb2NVc2VyXSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmNyZWF0ZVN0b3JlKGNyZWF0ZVN0b3JlUGF5bG9hZCksXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBjb25zdCBuZXdTdG9yZSA9IHJlcz8uZGF0YT8uc3RvcmU7XHJcblxyXG4gICAgICBpZiAobmV3U3RvcmUgJiYgbmV3U3RvcmU/LnN0b3JlSWQpIHtcclxuICAgICAgICBjb25zdCB0aWNrZXRSZXMgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcclxuICAgICAgICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5jcmVhdGVJbmZyYVRpY2tldCh7XHJcbiAgICAgICAgICAgIHN0b3JlSWQ6IHJlcz8uZGF0YT8uc3RvcmU/LnN0b3JlSWQsXHJcbiAgICAgICAgICAgIERhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF0sXHJcbiAgICAgICAgICAgIGlzc3VlVHlwZTogXCJpbnN0YWxsYXRpb25cIixcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGlmICh0aWNrZXRSZXMpIHtcclxuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldFN1Y2Nlc3NUb2FzdChcIlN0b3JlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5XCIpO1xyXG4gICAgICAgICAgdGhpcy5zdG9yZUxpc3QucHVzaCh7XHJcbiAgICAgICAgICAgIGxhYmVsOiBuZXdTdG9yZS5zdG9yZU5hbWUsXHJcbiAgICAgICAgICAgIHZhbHVlOiBuZXdTdG9yZS5zdG9yZUlkLFxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFN0b3JlID0gbmV3U3RvcmUuc3RvcmVJZDtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGbG9vciA9IHRoaXMuY3JlYXRlU3RvcmVGb3JtLmdldChcImZsb29yXCIpPy52YWx1ZSA/PyAxO1xyXG4gICAgICAgICAgdGhpcy5vbkJhY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIlVuYWJsZSB0byBjcmVhdGUgc3RvcmVcIik7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgaWYgKGVycm9yPy5lcnJvcj8uZXJyb3I/LmVycm9yID09PSBcIlN0b3JlTmFtZSBhbHJlYWR5IGV4aXN0c1wiKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIlN0b3JlIE5hbWUgYWxyZWFkeSBleGlzdHNcIik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIkZhaWxlZCB0byBjcmVhdGUgc3RvcmVcIik7XHJcbiAgICAgIH1cclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuaXNCdXR0b25Mb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRTcG9jVXNlckRldGFpbHMoc3RvcmVOYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGVtYWlsID1cclxuICAgICAgdGhpcy5jcmVhdGVTdG9yZUZvcm0uZ2V0KFwiZW1haWxcIikudmFsdWUgfHxcclxuICAgICAgYCR7c3RvcmVOYW1lPy50b0xvd2VyQ2FzZSgpfV9wbGFub2dyYW1AbGVuc2thcnQuY29tYDtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2Uuc3BvY0VtYWlsQ2hlY2soe1xyXG4gICAgICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgICAgICBlbWFpbDogW2VtYWlsXSxcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBuYW1lOiBnZXROYW1lRnJvbUVtYWlsKGVtYWlsKSxcclxuICAgICAgICAgIGVtYWlsOiBlbWFpbCxcclxuICAgICAgICAgIGNvbnRhY3Q6IFwiOTk5OTk5OTk5OVwiLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBnZXRTcG9jVXNlckRldGFpbHMgW0VSUl06IFwiLCBlcnJvcik7XHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgZXJyb3I/LmVycm9yPy5lcnJvciA/PyBcIlVuYWJsZSB0byBjcmVhdGUgVXNlclwiLFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZE5ld1N0b3JlKCkge1xyXG4gICAgdGhpcy5jcmVhdGVTdG9yZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgc3RvcmVOYW1lOiBbXHJcbiAgICAgICAgXCJcIixcclxuICAgICAgICBbXHJcbiAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICAgICAgdGhpcy5zdG9yZU5hbWVFeGlzdHNWYWxpZGF0b3IoKSxcclxuICAgICAgICAgIGdlbmVyYWxWYWxpZGF0b3IoKSxcclxuICAgICAgICBdLFxyXG4gICAgICBdLFxyXG4gICAgICBlbWFpbDogW1wiXCIsIFZhbGlkYXRvcnMuZW1haWxdLFxyXG4gICAgICBmbG9vcjogWzFdLFxyXG4gICAgICBidXNpbmVzc1R5cGU6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgc3RvcmVUeXBlOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHN0b3JlVHlwZU5hbWU6IFtcIlwiLCBnZW5lcmFsVmFsaWRhdG9yKCldLFxyXG4gICAgICBhZGRyZXNzOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIGNvdW50cnk6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgc3RhdGU6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgY2l0eTogW1wiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBwaW5jb2RlOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIGluZGlhblBpbmNvZGVWYWxpZGF0b3IoKV1dLFxyXG4gICAgICBsYXRpdHVkZTogW1wiXCJdLFxyXG4gICAgICBsb25naXR1ZGU6IFtcIlwiXSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuaXNDcmVhdGVTdG9yZU1vZGUgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtXHJcbiAgICAgIC5nZXQoXCJzdG9yZVR5cGVcIilcclxuICAgICAgPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHZhbHVlICE9PSBcIm1hbGxcIikge1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVTdG9yZUZvcm0uZ2V0KFwic3RvcmVUeXBlTmFtZVwiKT8ucmVzZXQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIC8vIGNvbnN0IHVybFRyZWUgPSB0aGlzLnJvdXRlci5jcmVhdGVVcmxUcmVlKFtcIi9tYW5hZ2Uvc3RvcmVzL2FkZC1zaW5nbGUtc3RvcmVcIl0pO1xyXG4gICAgLy8gY29uc3QgdXJsID0gdGhpcy5yb3V0ZXIuc2VyaWFsaXplVXJsKHVybFRyZWUpO1xyXG4gICAgLy8gd2luZG93Lm9wZW4odXJsLCBcIl9ibGFua1wiKTtcclxuICB9XHJcblxyXG4gIHN0b3JlTmFtZUV4aXN0c1ZhbGlkYXRvciA9ICgpOiBWYWxpZGF0b3JGbiA9PiB7XHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWU7XHJcbiAgICAgIGlmICghdmFsdWUpIHJldHVybiBudWxsOyAvLyBhbGxvdyByZXF1aXJlZCB2YWxpZGF0b3IgdG8gaGFuZGxlIGVtcHR5XHJcblxyXG4gICAgICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgICBjb25zdCBzID0gdGhpcy5zdG9yZUxpc3QuZmluZChcclxuICAgICAgICAocykgPT4gcz8ubGFiZWw/LnRyaW0oKT8udG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gdHJpbW1lZCxcclxuICAgICAgKTtcclxuICAgICAgaWYgKHMpIHJldHVybiB7IGV4aXN0czogdHJ1ZSB9O1xyXG5cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG4gIH07XHJcblxyXG4gIG9uQWRkcmVzc0NoYW5nZShwbGFjZTogZ29vZ2xlLm1hcHMucGxhY2VzLlBsYWNlUmVzdWx0IHwgYW55KSB7XHJcbiAgICBpZiAoIXBsYWNlPy5nZW9tZXRyeSkgcmV0dXJuO1xyXG5cclxuICAgIGxldCBjb3VudHJ5ID0gXCJcIixcclxuICAgICAgY2l0eSA9IFwiXCIsXHJcbiAgICAgIHN0YXRlID0gXCJcIixcclxuICAgICAgcGluY29kZSA9IFwiXCI7XHJcblxyXG4gICAgbGV0IGxhdGl0dWRlID0gcGxhY2UuZ2VvbWV0cnkubG9jYXRpb24ubGF0KCk7XHJcbiAgICBsZXQgbG9uZ2l0dWRlID0gcGxhY2UuZ2VvbWV0cnkubG9jYXRpb24ubG5nKCk7XHJcblxyXG4gICAgcGxhY2UuYWRkcmVzc19jb21wb25lbnRzLmZvckVhY2goKGNvbXBvbmVudDogYW55KSA9PiB7XHJcbiAgICAgIGlmIChjb21wb25lbnQudHlwZXMuaW5jbHVkZXMoXCJjb3VudHJ5XCIpKSB7XHJcbiAgICAgICAgY291bnRyeSA9IGNvbXBvbmVudC5sb25nX25hbWU7XHJcbiAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50LnR5cGVzLmluY2x1ZGVzKFwibG9jYWxpdHlcIikpIHtcclxuICAgICAgICBjaXR5ID0gY29tcG9uZW50LmxvbmdfbmFtZTtcclxuICAgICAgfSBlbHNlIGlmIChjb21wb25lbnQudHlwZXMuaW5jbHVkZXMoXCJhZG1pbmlzdHJhdGl2ZV9hcmVhX2xldmVsXzFcIikpIHtcclxuICAgICAgICBzdGF0ZSA9IGNvbXBvbmVudC5sb25nX25hbWU7XHJcbiAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50LnR5cGVzLmluY2x1ZGVzKFwicG9zdGFsX2NvZGVcIikpIHtcclxuICAgICAgICBwaW5jb2RlID0gY29tcG9uZW50LmxvbmdfbmFtZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jcmVhdGVTdG9yZUZvcm0uZ2V0KFwiYWRkcmVzc1wiKT8uc2V0VmFsdWUocGxhY2UuZm9ybWF0dGVkX2FkZHJlc3MpO1xyXG4gICAgdGhpcy5jcmVhdGVTdG9yZUZvcm0uZ2V0KFwiY291bnRyeVwiKT8uc2V0VmFsdWUoY291bnRyeSk7XHJcbiAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybS5nZXQoXCJjaXR5XCIpPy5zZXRWYWx1ZShjaXR5KTtcclxuICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtLmdldChcInN0YXRlXCIpPy5zZXRWYWx1ZShzdGF0ZSk7XHJcbiAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybS5nZXQoXCJwaW5jb2RlXCIpPy5zZXRWYWx1ZShwaW5jb2RlKTtcclxuICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtLmdldChcImxhdGl0dWRlXCIpPy5zZXRWYWx1ZShsYXRpdHVkZSk7XHJcbiAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybS5nZXQoXCJsb25naXR1ZGVcIik/LnNldFZhbHVlKGxvbmdpdHVkZSk7XHJcbiAgfVxyXG5cclxuICBvbkNhbmNlbCgpIHtcclxuICAgIHRoaXMuYWN0aXZlTW9kYWwuZGlzbWlzcygpO1xyXG4gIH1cclxuXHJcbiAgb25CYWNrKCkge1xyXG4gICAgdGhpcy5jcmVhdGVTdG9yZUZvcm0gPSBudWxsO1xyXG4gICAgdGhpcy5pc0NyZWF0ZVN0b3JlTW9kZSA9IGZhbHNlO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibW9kYWwtd3JhcHBlclwiPlxyXG4gIDxoMyBjbGFzcz1cIm1iLTRcIj5DcmVhdGUgc3RvcmUgbGF5b3V0L3BsYW4gZnJvbSBDQUQ8L2gzPlxyXG4gIEBpZihpc0NyZWF0ZVN0b3JlTW9kZSl7XHJcbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImNyZWF0ZVN0b3JlRm9ybVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cInN0b3JlTmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+U3RvcmUgbmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwic3RvcmVOYW1lXCIgZm9ybUNvbnRyb2xOYW1lPVwic3RvcmVOYW1lXCJcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUeXBlIHN0b3JlIG5hbWVcIiAvPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0b3JlTmFtZScpPy50b3VjaGVkICYmIGNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0b3JlTmFtZScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZU5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICBTdG9yZSBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RvcmVOYW1lJyk/Lmhhc0Vycm9yKCdleGlzdHMnKVwiPlxyXG4gICAgICAgICAgICAgIFN0b3JlIGFscmVhZHkgZXhpc3RzLlxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RvcmVOYW1lJyk/Lmhhc0Vycm9yKCd3aGl0ZXNwYWNlJylcIj5cclxuICAgICAgICAgICAgICBTdG9yZSBuYW1lIGNhbm5vdCBiZSBvbmx5IHdoaXRlc3BhY2UuXHJcbiAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZU5hbWUnKT8uaGFzRXJyb3IoJ3RyaW1TcGFjZXMnKVwiPlxyXG4gICAgICAgICAgICAgIE5vIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbGxvd2VkLlxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi00XCI+XHJcbiAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwiZmxvb3JMaXN0XCIgW2xhYmVsXT1cIidTZWxlY3QgZmxvb3InXCJcclxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZmxvb3JcIj5cclxuICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTRcIj5cclxuICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJidXNpbmVzc1R5cGVMaXN0XCJcclxuICAgICAgICAgICAgW2xhYmVsXT1cIidTZWxlY3QgYnVzaW5lc3MgdHlwZSdcIiBmb3JtQ29udHJvbE5hbWU9XCJidXNpbmVzc1R5cGVcIj5cclxuICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTRcIj5cclxuICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJzdG9yZVR5cGVMaXN0XCJcclxuICAgICAgICAgICAgW2xhYmVsXT1cIidTZWxlY3Qgc3RvcmUgdHlwZSdcIiBmb3JtQ29udHJvbE5hbWU9XCJzdG9yZVR5cGVcIj5cclxuICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgQGlmKGNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0b3JlVHlwZScpPy52YWx1ZSA9PSAnbWFsbCcpe1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi00XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzdG9yZVR5cGVOYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5FbnRlciBNYWxsIG5hbWU8L2xhYmVsPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwic3RvcmVUeXBlTmFtZVwiIGZvcm1Db250cm9sTmFtZT1cInN0b3JlVHlwZU5hbWVcIlxyXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgTWFsbCBuYW1lXCIgLz5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RvcmVUeXBlTmFtZScpPy50b3VjaGVkICYmIGNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0b3JlVHlwZU5hbWUnKT8uaW52YWxpZFwiPlxyXG4gICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZVR5cGVOYW1lJyk/Lmhhc0Vycm9yKCd3aGl0ZXNwYWNlJylcIj5cclxuICAgICAgICAgICAgICAgIE1hbGwgbmFtZSBjYW5ub3QgYmUgb25seSB3aGl0ZXNwYWNlLlxyXG4gICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0b3JlVHlwZU5hbWUnKT8uaGFzRXJyb3IoJ3RyaW1TcGFjZXMnKVwiPlxyXG4gICAgICAgICAgICAgICAgTm8gbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlIGFsbG93ZWQuXHJcbiAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNFwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cImFkZHJlc3NcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkFkZHJlc3M8L2xhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImFkZHJlc3NcIiBmb3JtQ29udHJvbE5hbWU9XCJhZGRyZXNzXCJcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggYW5kIGVudGVyIGFkZHJlc3NcIiBuZ3gtZ3AtYXV0b2NvbXBsZXRlIChvbkFkZHJlc3NDaGFuZ2UpPVwib25BZGRyZXNzQ2hhbmdlKCRldmVudClcIiAvPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2FkZHJlc3MnKT8udG91Y2hlZCAmJiBjcmVhdGVTdG9yZUZvcm0uZ2V0KCdhZGRyZXNzJyk/LmludmFsaWRcIj5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2FkZHJlc3MnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICBBZGRyZXNzIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi00XCI+XHJcbiAgICAgICAgICA8bGFiZWwgZm9yPVwiY291bnRyeVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+Q291bnRyeTwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiY291bnRyeVwiIGZvcm1Db250cm9sTmFtZT1cImNvdW50cnlcIiBwbGFjZWhvbGRlcj1cIkVudGVyIENvdW50cnlcIiAvPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2NvdW50cnknKT8udG91Y2hlZCAmJiBjcmVhdGVTdG9yZUZvcm0uZ2V0KCdjb3VudHJ5Jyk/LmludmFsaWRcIj5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2NvdW50cnknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICBDb3VudHJ5IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi00XCI+XHJcbiAgICAgICAgICA8bGFiZWwgZm9yPVwic3RhdGVcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlN0YXRlPC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJzdGF0ZVwiIGZvcm1Db250cm9sTmFtZT1cInN0YXRlXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBTdGF0ZVwiIC8+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RhdGUnKT8udG91Y2hlZCAmJiBjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdGF0ZScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdGF0ZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgIFN0YXRlIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi00XCI+XHJcbiAgICAgICAgICA8bGFiZWwgZm9yPVwiY2l0eVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+Q2l0eSAvIFRvd248L2xhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImNpdHlcIiBmb3JtQ29udHJvbE5hbWU9XCJjaXR5XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBDaXR5IC8gVG93blwiIC8+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnY2l0eScpPy50b3VjaGVkICYmIGNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2NpdHknKT8uaW52YWxpZFwiPlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnY2l0eScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgIENpdHkgLyBUb3duIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi00XCI+XHJcbiAgICAgICAgICA8bGFiZWwgZm9yPVwicGluY29kZVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+UGluIC8gWmlwIENvZGU8L2xhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInBpbmNvZGVcIiBmb3JtQ29udHJvbE5hbWU9XCJwaW5jb2RlXCJcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBQaW4gLyBaaXAgQ29kZVwiIC8+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgncGluY29kZScpPy50b3VjaGVkICYmIGNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3BpbmNvZGUnKT8uaW52YWxpZFwiPlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgncGluY29kZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgIFBpbiAvIFppcCBDb2RlIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdwaW5jb2RlJyk/Lmhhc0Vycm9yKCd3aGl0ZXNwYWNlJykgfHwgY3JlYXRlU3RvcmVGb3JtLmdldCgncGluY29kZScpPy5oYXNFcnJvcigndHJpbVNwYWNlcycpXCI+XHJcbiAgICAgICAgICAgICAgUGluY29kZSBjYW5ub3QgY29udGFpbiB3aGl0ZXNwYWNlLlxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgncGluY29kZScpPy5oYXNFcnJvcignaW52YWxpZFBpbmNvZGUnKVwiPlxyXG4gICAgICAgICAgICAgIEVudGVyIGEgdmFsaWQgNi1kaWdpdCBwaW5jb2RlXHJcbiAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi00XCI+XHJcbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZW1haWxcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlNwb2MgdXNlciBlbWFpbDwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZW1haWxcIiBmb3JtQ29udHJvbE5hbWU9XCJlbWFpbFwiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgc3BvYyB1c2VyIGVtYWlsXCIgLz5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdlbWFpbCcpPy50b3VjaGVkICYmIGNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2VtYWlsJyk/LmludmFsaWRcIj5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2VtYWlsJyk/Lmhhc0Vycm9yKCdlbWFpbCcpXCI+XHJcbiAgICAgICAgICAgICAgRW1haWwgaXMgaW52YWxpZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Zvcm0+XHJcbiAgfVxyXG4gIEBlbHNlIHtcclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItNFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbc2VhcmNoXT1cInRydWVcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkU3RvcmVcIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcclxuICAgICAgICAgIFtkYXRhXT1cInN0b3JlTGlzdFwiIFtsYWJlbF09XCInU2VsZWN0IHN0b3JlJ1wiIFthY3Rpb25dPVwidHJ1ZVwiIChhY3Rpb25DbGljayk9XCJhZGROZXdTdG9yZSgpXCJcclxuICAgICAgICAgIFthY3Rpb25MYWJlbF09XCInQ3JlYXRlIG5ldyBzdG9yZSdcIiAobmdNb2RlbENoYW5nZSk9XCJvblN0b3JlQ2hhbmdlKClcIiBbZGlzYWJsZWRdPVwiaXNCdXR0b25Mb2FkaW5nXCI+XHJcbiAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XHJcbiAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEZsb29yXCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cImZsb29yTGlzdFwiXHJcbiAgICAgICAgICBbbGFiZWxdPVwiJ1NlbGVjdCBmbG9vcidcIiAobmdNb2RlbENoYW5nZSk9XCJvbkZsb29yQ2hhbmdlKClcIiBbZGlzYWJsZWRdPVwiaXNCdXR0b25Mb2FkaW5nXCI+XHJcbiAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImxheW91dC1leGlzdC13cmFwcGVyXCIgW2NsYXNzLnNob3ddPVwiaXNMYXlvdXRFeGlzdFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LWV4aXN0LXdhcm5pbmcgbWItNFwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgZD1cIk05Ljk5OTY1IDYuNjY2NjdWMTBNOS45OTk2NSAxMy4zMzMzSDEwLjAwOE04LjU3NDY1IDIuMzgzMzRMMS41MTYzMiAxNC4xNjY3QzEuMzcwNzkgMTQuNDE4NyAxLjI5Mzc5IDE0LjcwNDQgMS4yOTI5OCAxNC45OTU0QzEuMjkyMTYgMTUuMjg2NSAxLjM2NzU2IDE1LjU3MjYgMS41MTE2NyAxNS44MjU0QzEuNjU1NzkgMTYuMDc4MyAxLjg2MzU5IDE2LjI4OSAyLjExNDQxIDE2LjQzNjZDMi4zNjUyMyAxNi41ODQxIDIuNjUwMzIgMTYuNjYzNSAyLjk0MTMyIDE2LjY2NjdIMTcuMDU4QzE3LjM0OSAxNi42NjM1IDE3LjYzNDEgMTYuNTg0MSAxNy44ODQ5IDE2LjQzNjZDMTguMTM1NyAxNi4yODkgMTguMzQzNSAxNi4wNzgzIDE4LjQ4NzYgMTUuODI1NEMxOC42MzE3IDE1LjU3MjYgMTguNzA3MSAxNS4yODY1IDE4LjcwNjMgMTQuOTk1NEMxOC43MDU1IDE0LjcwNDQgMTguNjI4NSAxNC40MTg3IDE4LjQ4MyAxNC4xNjY3TDExLjQyNDcgMi4zODMzNEMxMS4yNzYxIDIuMTM4NDMgMTEuMDY2OSAxLjkzNTk0IDEwLjgxNzMgMS43OTU0MUMxMC41Njc3IDEuNjU0ODggMTAuMjg2MSAxLjU4MTA1IDkuOTk5NjUgMS41ODEwNUM5LjcxMzIxIDEuNTgxMDUgOS40MzE1OSAxLjY1NDg4IDkuMTgxOTkgMS43OTU0MUM4LjkzMjM4IDEuOTM1OTQgOC43MjMyMSAyLjEzODQzIDguNTc0NjUgMi4zODMzNFpcIlxyXG4gICAgICAgICAgICBzdHJva2U9XCIjRjA0NDM4XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgIFRoaXMgc3RvcmUgYWxyZWFkeSBoYXMgYSBGbG9vciB7e3NlbGVjdGVkRmxvb3J9fSBwbGFub2dyYW0uIE92ZXJ3cml0ZSBpdD8gVGhpcyBjYW7igJl0IGJlIHVuZG9uZS5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICA8ZmlsZS11cGxvYWQgW2Rpc2FibGVkXT1cImlzQnV0dG9uTG9hZGluZ1wiIChmaWxlQ2hhbmdlKT1cIm9uRmlsZUNoYW5nZSgkZXZlbnQpXCI+PC9maWxlLXVwbG9hZD5cclxuICAgIDwvZGl2PlxyXG4gIH1cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtYWN0aW9uc1wiPlxyXG4gICAgQGlmKGlzQ3JlYXRlU3RvcmVNb2RlKXtcclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpbmsgbWUtYXV0b1wiIChjbGljayk9XCJvbkJhY2soKVwiPkJhY2s8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwib25DYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBcIiBbZGlzYWJsZWRdPVwiY3JlYXRlU3RvcmVGb3JtLmludmFsaWRcIiAoY2xpY2spPVwib25DcmVhdGVTdG9yZSgpXCI+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNCdXR0b25Mb2FkaW5nXCI+XHJcbiAgICAgICAgICBDcmVhdGVcclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPHN2ZyAqbmdJZj1cImlzQnV0dG9uTG9hZGluZ1wiIGNsYXNzPVwic3Bpbm5lclwiIHZpZXdCb3g9XCIwIDAgNTAgNTBcIj5cclxuICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJwYXRoXCIgY3g9XCIyNVwiIGN5PVwiMjVcIiByPVwiMjBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjRcIj48L2NpcmNsZT5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICB9QGVsc2Uge1xyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIChjbGljayk9XCJvbkNhbmNlbCgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IFwiIFtkaXNhYmxlZF09XCIhaXNWYWxpZFRvQ3JlYXRlUGxhbm8gfHwgaXNCdXR0b25Mb2FkaW5nXCJcclxuICAgICAgICAoY2xpY2spPVwib25DcmVhdGVMYXlvdXRQbGFubygpXCI+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNCdXR0b25Mb2FkaW5nXCI+XHJcbiAgICAgICAgICB7e2lzTGF5b3V0RXhpc3QgPyAgJ092ZXJ3cml0ZScgOiAnQ3JlYXRlJ319XHJcbiAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICA8c3ZnICpuZ0lmPVwiaXNCdXR0b25Mb2FkaW5nXCIgY2xhc3M9XCJzcGlubmVyXCIgdmlld0JveD1cIjAgMCA1MCA1MFwiPlxyXG4gICAgICAgICAgPGNpcmNsZSBjbGFzcz1cInBhdGhcIiBjeD1cIjI1XCIgY3k9XCIyNVwiIHI9XCIyMFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiNFwiPjwvY2lyY2xlPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuPC9kaXY+Il19
|
|
329
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9tYW5hZ2UtcGxhbm8vcG9wdXBzL2NyZWF0ZS1wbGFub2dyYW0vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9tYW5hZ2UtcGxhbm8vcG9wdXBzL2NyZWF0ZS1wbGFub2dyYW0vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQWtCLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3hFLE9BQU8sRUFHTCxXQUFXLEVBQ1gsbUJBQW1CLEVBRW5CLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBRTdGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ2pGLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLHNCQUFzQixHQUN2QixNQUFNLHdDQUF3QyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXJFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFD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L2NvcmVcIjtcclxuaW1wb3J0IHsgTmdiQWN0aXZlTW9kYWwsIE5nYlRvb2x0aXAgfSBmcm9tIFwiQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcIjtcclxuaW1wb3J0IHtcclxuICBBYnN0cmFjdENvbnRyb2wsXHJcbiAgRm9ybUJ1aWxkZXIsXHJcbiAgRm9ybXNNb2R1bGUsXHJcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICBWYWxpZGF0b3JGbixcclxuICBWYWxpZGF0b3JzLFxyXG59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBSZWFjdGl2ZVNlbGVjdENvbXBvbmVudCB9IGZyb20gXCIuLi8uLi8uLi9yZWFjdGl2ZS1zZWxlY3QvcmVhY3RpdmUtc2VsZWN0LmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBTdG9yZUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NlcnZpY2VzL3N0b3JlLWJ1aWxkZXIuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBGaWxlVXBsb2FkQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uLy4uL2ZpbGUtdXBsb2FkL2ZpbGUtdXBsb2FkLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge1xyXG4gIGdlbmVyYWxWYWxpZGF0b3IsXHJcbiAgZ2V0TmFtZUZyb21FbWFpbCxcclxuICBpbmRpYW5QaW5jb2RlVmFsaWRhdG9yLFxyXG59IGZyb20gXCIuLy4uLy4uLy4uLy4uL2Z1bmN0aW9ucy9wbGFuby5mdW5jdGlvblwiO1xyXG5pbXBvcnQgeyBOZ0lmLCBUaXRsZUNhc2VQaXBlLCBVcHBlckNhc2VQaXBlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLXNoYXJlZFwiO1xyXG5pbXBvcnQgeyBMb2FkZXIgfSBmcm9tIFwiQGdvb2dsZW1hcHMvanMtYXBpLWxvYWRlclwiO1xyXG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IE5neEdwQXV0b2NvbXBsZXRlTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyLW1hZ2ljL25neC1ncC1hdXRvY29tcGxldGVcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImFwcC1jcmVhdGUtcGxhbm9ncmFtXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi9jcmVhdGUtcGxhbm9ncmFtLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmw6IFwiLi9jcmVhdGUtcGxhbm9ncmFtLmNvbXBvbmVudC5zY3NzXCIsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBSZWFjdGl2ZVNlbGVjdENvbXBvbmVudCxcclxuICAgIEZpbGVVcGxvYWRDb21wb25lbnQsXHJcbiAgICBOZ0lmLFxyXG4gICAgTmd4R3BBdXRvY29tcGxldGVNb2R1bGUsXHJcbiAgICBOZ2JUb29sdGlwLFxyXG4gICAgVXBwZXJDYXNlUGlwZSxcclxuICAgIFRpdGxlQ2FzZVBpcGUsXHJcbiAgXSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTG9hZGVyLFxyXG4gICAgICB1c2VWYWx1ZTogbmV3IExvYWRlcih7XHJcbiAgICAgICAgYXBpS2V5OiBcIkFJemFTeUFmV1E5Z3VGc1NYb1lJdTJWRkJ3LVhRM1ZudWZ2RkEzQVwiLFxyXG4gICAgICAgIGxpYnJhcmllczogW1wicGxhY2VzXCJdLFxyXG4gICAgICB9KSxcclxuICAgIH0sXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIENyZWF0ZVBsYW5vZ3JhbUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgY2xpZW50SWQ6IHN0cmluZztcclxuXHJcbiAgc2VsZWN0ZWRTdG9yZTogc3RyaW5nO1xyXG4gIHNlbGVjdGVkRmxvb3I6IG51bWJlcjtcclxuICBzZWxlY3RlZEZpbGU6IEZpbGUgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgc3RvcmVMaXN0OiB7XHJcbiAgICBsYWJlbDogc3RyaW5nO1xyXG4gICAgdmFsdWU6IHN0cmluZztcclxuICB9W10gPSBbXTtcclxuXHJcbiAgZmxvb3JMaXN0OiB7XHJcbiAgICBsYWJlbDogc3RyaW5nO1xyXG4gICAgdmFsdWU6IG51bWJlcjtcclxuICB9W10gPSBbXHJcbiAgICB7IGxhYmVsOiBcIkZsb29yIDFcIiwgdmFsdWU6IDEgfSxcclxuICAgIHsgbGFiZWw6IFwiRmxvb3IgMlwiLCB2YWx1ZTogMiB9LFxyXG4gICAgeyBsYWJlbDogXCJGbG9vciAzXCIsIHZhbHVlOiAzIH0sXHJcbiAgXTtcclxuXHJcbiAgc2VsZWN0ZWRTdG9yZUZsb29yczogYW55ID0gW107XHJcblxyXG4gIGlzTGF5b3V0RXhpc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0J1dHRvbkxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0NyZWF0ZVN0b3JlTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG5ld1N0b3JlRGV0YWlsczogYW55O1xyXG5cclxuICBjcmVhdGVTdG9yZUZvcm06IGFueTtcclxuICBzdG9yZVR5cGVMaXN0OiB7XHJcbiAgICBsYWJlbDogc3RyaW5nO1xyXG4gICAgdmFsdWU6IHN0cmluZztcclxuICB9W10gPSBbXHJcbiAgICB7IGxhYmVsOiBcIkhpZ2ggU3RyZWV0XCIsIHZhbHVlOiBcIkhpZ2hTdHJlZXRcIiB9LFxyXG4gICAgeyBsYWJlbDogXCJNYWxsXCIsIHZhbHVlOiBcIm1hbGxcIiB9LFxyXG4gICAgeyBsYWJlbDogXCJLaW9za1wiLCB2YWx1ZTogXCJraW9za1wiIH0sXHJcbiAgXTtcclxuXHJcbiAgYnVzaW5lc3NUeXBlTGlzdDoge1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgfVtdID0gW1xyXG4gICAgeyBsYWJlbDogXCJDT0NPXCIsIHZhbHVlOiBcImNvY29cIiB9LFxyXG4gICAgeyBsYWJlbDogXCJDT0ZPXCIsIHZhbHVlOiBcImNvZm9cIiB9LFxyXG4gICAgeyBsYWJlbDogXCJGT0ZPXCIsIHZhbHVlOiBcImZvZm9cIiB9LFxyXG4gICAgeyBsYWJlbDogXCJGT0NPXCIsIHZhbHVlOiBcImZvY29cIiB9LFxyXG4gIF07XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBhY3RpdmVNb2RhbDogTmdiQWN0aXZlTW9kYWwsXHJcbiAgICBwcml2YXRlIHN0b3JlQnVpbGRlclNlcnZpY2U6IFN0b3JlQnVpbGRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgKSB7fVxyXG5cclxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuZ2V0U3RvcmVMaXN0KCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNWYWxpZFRvQ3JlYXRlUGxhbm8oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFN0b3JlICYmIHRoaXMuc2VsZWN0ZWRGbG9vciAmJiB0aGlzLnNlbGVjdGVkRmlsZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldFN0b3JlTGlzdCgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHN0b3JlczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmdldEFsbFN0b3Jlcyh0aGlzLmNsaWVudElkKSxcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zdG9yZUxpc3QgPSBzdG9yZXM/LmRhdGE/Lm1hcCgoczogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHsgbGFiZWw6IHMuc3RvcmVOYW1lLCB2YWx1ZTogcy5zdG9yZUlkIH07XHJcbiAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJAQCB+IGdldFN0b3JlTGlzdCBbRVJSXTpcIiwgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25TdG9yZUNoYW5nZSgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGZsb29yczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmdldFN0b3JlRmxvb3JzTGlzdCh0aGlzLnNlbGVjdGVkU3RvcmUpLFxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkU3RvcmVGbG9vcnMgPSBmbG9vcnM/LmRhdGEgPz8gW107XHJcbiAgICAgIHRoaXMub25GbG9vckNoYW5nZSgpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJAQCB+IGdldFN0b3JlTGlzdCBbRVJSXTpcIiwgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25GbG9vckNoYW5nZSgpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkRmxvb3IpIHtcclxuICAgICAgdGhpcy5pc0xheW91dEV4aXN0ID0gdGhpcy5zZWxlY3RlZFN0b3JlRmxvb3JzLnNvbWUoXHJcbiAgICAgICAgKGY6IGFueSkgPT4gZi5mbG9vck51bWJlciA9PT0gdGhpcy5zZWxlY3RlZEZsb29yLFxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pc0xheW91dEV4aXN0ID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkZpbGVDaGFuZ2UoZmlsZTogRmlsZSB8IG51bGwpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gZmlsZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uQ3JlYXRlTGF5b3V0UGxhbm8oKSB7XHJcbiAgICBpZiAoIXRoaXMuaXNWYWxpZFRvQ3JlYXRlUGxhbm8pIHJldHVybjtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmlzQnV0dG9uTG9hZGluZyA9IHRydWU7XHJcblxyXG4gICAgICBjb25zdCBwbGFub1JlczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmNyZWF0ZVBsYW5vRnJvbUNBRChcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlISxcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdG9yZSxcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGbG9vcixcclxuICAgICAgICApLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKCFwbGFub1Jlcz8uZGF0YSkgcmV0dXJuO1xyXG5cclxuICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZShwbGFub1Jlcz8uZGF0YSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgZXJyb3I/LmVycm9yPy5lcnJvcj8uZXJyTXNnID8/IFwiRmFpbGVkIHRvIGV4dHJhY3QgcGxhbm8gZnJvbSBDQUQgZmlsZS5cIixcclxuICAgICAgKTtcclxuICAgICAgY29uc29sZS5sb2coXCJAQCB+IG9uQ3JlYXRlIFtFUlJdOlwiLCBlcnJvcik7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLmlzQnV0dG9uTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25DcmVhdGVTdG9yZSgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuaXNCdXR0b25Mb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgY29uc3Qgc3BvY1VzZXIgPSBhd2FpdCB0aGlzLmdldFNwb2NVc2VyRGV0YWlscyhcclxuICAgICAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZS5zdG9yZU5hbWUudHJpbSgpLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKCFzcG9jVXNlcikgcmV0dXJuO1xyXG5cclxuICAgICAgY29uc3QgY3JlYXRlU3RvcmVQYXlsb2FkID0ge1xyXG4gICAgICAgIHN0b3JlTmFtZTogdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWUuc3RvcmVOYW1lPy50b1VwcGVyQ2FzZSgpPy50cmltKCksXHJcbiAgICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgICAgYnVzaW5lc3NUeXBlOiB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZS5idXNpbmVzc1R5cGUsXHJcbiAgICAgICAgY2x1c3RlcjogW10sXHJcbiAgICAgICAgc3RvcmVUeXBlOiB7XHJcbiAgICAgICAgICB0eXBlOiB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZS5zdG9yZVR5cGUsXHJcbiAgICAgICAgICBuYW1lOiB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZT8uc3RvcmVUeXBlTmFtZT8udHJpbSgpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc3RvcmVQcm9maWxlOiB7XHJcbiAgICAgICAgICBzdG9yZUNvZGU6IHRoaXMuY3JlYXRlU3RvcmVGb3JtPy52YWx1ZT8uc3RvcmVDb2RlLFxyXG4gICAgICAgICAgYWRkcmVzczogdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWU/LmFkZHJlc3MsXHJcbiAgICAgICAgICBjb3VudHJ5OiB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZT8uY291bnRyeSxcclxuICAgICAgICAgIHN0YXRlOiB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZT8uc3RhdGUsXHJcbiAgICAgICAgICBjaXR5OiB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZT8uY2l0eSxcclxuICAgICAgICAgIHBpbmNvZGU6IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlPy5waW5jb2RlLFxyXG4gICAgICAgICAgbGF0aXR1ZGU6IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlLmxhdGl0dWRlPy50b1N0cmluZygpLnRyaW0oKVxyXG4gICAgICAgICAgICA/IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlLmxhdGl0dWRlXHJcbiAgICAgICAgICAgIDogMCxcclxuICAgICAgICAgIGxvbmdpdHVkZTogdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWUubG9uZ2l0dWRlPy50b1N0cmluZygpLnRyaW0oKVxyXG4gICAgICAgICAgICA/IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlLmxvbmdpdHVkZVxyXG4gICAgICAgICAgICA6IDAsXHJcbiAgICAgICAgICB0aW1lWm9uZTogXCJBc2lhL0tvbGthdGFcIixcclxuICAgICAgICAgIG9wZW46IFwiMTA6MDA6MDBcIixcclxuICAgICAgICAgIGNsb3NlOiBcIjIwOjAwOjAwXCIsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBlZGdlOiB7XHJcbiAgICAgICAgICBzZXJ2ZXJUeXBlOiBmYWxzZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNwb2NEZXRhaWxzOiBbc3BvY1VzZXJdLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3QgcmVzOiBhbnkgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UuY3JlYXRlU3RvcmUoY3JlYXRlU3RvcmVQYXlsb2FkKSxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IG5ld1N0b3JlID0gcmVzPy5kYXRhPy5zdG9yZTtcclxuXHJcbiAgICAgIGlmIChuZXdTdG9yZSAmJiBuZXdTdG9yZT8uc3RvcmVJZCkge1xyXG4gICAgICAgIGNvbnN0IHRpY2tldFJlcyA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmNyZWF0ZUluZnJhVGlja2V0KHtcclxuICAgICAgICAgICAgc3RvcmVJZDogcmVzPy5kYXRhPy5zdG9yZT8uc3RvcmVJZCxcclxuICAgICAgICAgICAgRGF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXSxcclxuICAgICAgICAgICAgaXNzdWVUeXBlOiBcImluc3RhbGxhdGlvblwiLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKHRpY2tldFJlcykge1xyXG4gICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0U3VjY2Vzc1RvYXN0KFwiU3RvcmUgY3JlYXRlZCBzdWNjZXNzZnVsbHlcIik7XHJcbiAgICAgICAgICB0aGlzLnN0b3JlTGlzdC5wdXNoKHtcclxuICAgICAgICAgICAgbGFiZWw6IG5ld1N0b3JlLnN0b3JlTmFtZSxcclxuICAgICAgICAgICAgdmFsdWU6IG5ld1N0b3JlLnN0b3JlSWQsXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkU3RvcmUgPSBuZXdTdG9yZS5zdG9yZUlkO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZsb29yID0gdGhpcy5jcmVhdGVTdG9yZUZvcm0uZ2V0KFwiZmxvb3JcIik/LnZhbHVlID8/IDE7XHJcbiAgICAgICAgICB0aGlzLm5ld1N0b3JlRGV0YWlscyA9IGNyZWF0ZVN0b3JlUGF5bG9hZDtcclxuICAgICAgICAgIHRoaXMuaXNDcmVhdGVTdG9yZU1vZGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIlVuYWJsZSB0byBjcmVhdGUgc3RvcmVcIik7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgaWYgKGVycm9yPy5lcnJvcj8uZXJyb3I/LmVycm9yID09PSBcIlN0b3JlTmFtZSBhbHJlYWR5IGV4aXN0c1wiKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIlN0b3JlIE5hbWUgYWxyZWFkeSBleGlzdHNcIik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIkZhaWxlZCB0byBjcmVhdGUgc3RvcmVcIik7XHJcbiAgICAgIH1cclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuaXNCdXR0b25Mb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRTcG9jVXNlckRldGFpbHMoc3RvcmVOYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHNhZmVTdG9yZU5hbWUgPSBzdG9yZU5hbWVcclxuICAgICAgPy50b0xvd2VyQ2FzZSgpXHJcbiAgICAgIC50cmltKClcclxuICAgICAgLnJlcGxhY2UoL1xccysvZywgXCJfXCIpXHJcbiAgICAgIC5yZXBsYWNlKC9bXmEtejAtOS5fLV0vZywgXCJcIik7XHJcblxyXG4gICAgY29uc3QgZW1haWwgPVxyXG4gICAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybS5nZXQoXCJlbWFpbFwiKT8udmFsdWU/LnRvTG93ZXJDYXNlKCkgfHxcclxuICAgICAgYCR7c2FmZVN0b3JlTmFtZX1fcGxhbm9ncmFtQGxlbnNrYXJ0LmNvbWA7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLnNwb2NFbWFpbENoZWNrKHtcclxuICAgICAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICAgICAgZW1haWw6IFtlbWFpbF0sXHJcbiAgICAgICAgfSksXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgbmFtZTogZ2V0TmFtZUZyb21FbWFpbChlbWFpbCksXHJcbiAgICAgICAgICBlbWFpbDogZW1haWwsXHJcbiAgICAgICAgICBjb250YWN0OiBcIjk5OTk5OTk5OTlcIixcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gZ2V0U3BvY1VzZXJEZXRhaWxzIFtFUlJdOiBcIiwgZXJyb3IpO1xyXG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFxyXG4gICAgICAgIGVycm9yPy5lcnJvcj8uZXJyb3IgPz8gXCJVbmFibGUgdG8gY3JlYXRlIFVzZXJcIixcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGROZXdTdG9yZSgpIHtcclxuICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHN0b3JlTmFtZTogW1xyXG4gICAgICAgIFwiXCIsXHJcbiAgICAgICAgW1xyXG4gICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgICAgIHRoaXMuc3RvcmVOYW1lRXhpc3RzVmFsaWRhdG9yKCksXHJcbiAgICAgICAgICBnZW5lcmFsVmFsaWRhdG9yKCksXHJcbiAgICAgICAgXSxcclxuICAgICAgXSxcclxuICAgICAgZW1haWw6IFtcIlwiLCBWYWxpZGF0b3JzLmVtYWlsXSxcclxuICAgICAgZmxvb3I6IFsxXSxcclxuICAgICAgYnVzaW5lc3NUeXBlOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHN0b3JlVHlwZTogW1wiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBzdG9yZVR5cGVOYW1lOiBbXCJcIiwgZ2VuZXJhbFZhbGlkYXRvcigpXSxcclxuICAgICAgYWRkcmVzczogW1wiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBjb3VudHJ5OiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHN0YXRlOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIGNpdHk6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgcGluY29kZTogW1wiXCIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBpbmRpYW5QaW5jb2RlVmFsaWRhdG9yKCldXSxcclxuICAgICAgbGF0aXR1ZGU6IFtcIlwiXSxcclxuICAgICAgbG9uZ2l0dWRlOiBbXCJcIl0sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmlzQ3JlYXRlU3RvcmVNb2RlID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybVxyXG4gICAgICAuZ2V0KFwic3RvcmVUeXBlXCIpXHJcbiAgICAgID8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gXCJtYWxsXCIpIHtcclxuICAgICAgICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtLmdldChcInN0b3JlVHlwZU5hbWVcIik/LnJlc2V0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAvLyBjb25zdCB1cmxUcmVlID0gdGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZShbXCIvbWFuYWdlL3N0b3Jlcy9hZGQtc2luZ2xlLXN0b3JlXCJdKTtcclxuICAgIC8vIGNvbnN0IHVybCA9IHRoaXMucm91dGVyLnNlcmlhbGl6ZVVybCh1cmxUcmVlKTtcclxuICAgIC8vIHdpbmRvdy5vcGVuKHVybCwgXCJfYmxhbmtcIik7XHJcbiAgfVxyXG5cclxuICBzdG9yZU5hbWVFeGlzdHNWYWxpZGF0b3IgPSAoKTogVmFsaWRhdG9yRm4gPT4ge1xyXG4gICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgICAgY29uc3QgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xyXG4gICAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDsgLy8gYWxsb3cgcmVxdWlyZWQgdmFsaWRhdG9yIHRvIGhhbmRsZSBlbXB0eVxyXG5cclxuICAgICAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgY29uc3QgcyA9IHRoaXMuc3RvcmVMaXN0LmZpbmQoXHJcbiAgICAgICAgKHMpID0+IHM/LmxhYmVsPy50cmltKCk/LnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IHRyaW1tZWQsXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChzKSByZXR1cm4geyBleGlzdHM6IHRydWUgfTtcclxuXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfTtcclxuICB9O1xyXG5cclxuICBvbkFkZHJlc3NDaGFuZ2UocGxhY2U6IGdvb2dsZS5tYXBzLnBsYWNlcy5QbGFjZVJlc3VsdCB8IGFueSkge1xyXG4gICAgaWYgKCFwbGFjZT8uZ2VvbWV0cnkpIHJldHVybjtcclxuXHJcbiAgICBsZXQgY291bnRyeSA9IFwiXCIsXHJcbiAgICAgIGNpdHkgPSBcIlwiLFxyXG4gICAgICBzdGF0ZSA9IFwiXCIsXHJcbiAgICAgIHBpbmNvZGUgPSBcIlwiO1xyXG5cclxuICAgIGxldCBsYXRpdHVkZSA9IHBsYWNlLmdlb21ldHJ5LmxvY2F0aW9uLmxhdCgpO1xyXG4gICAgbGV0IGxvbmdpdHVkZSA9IHBsYWNlLmdlb21ldHJ5LmxvY2F0aW9uLmxuZygpO1xyXG5cclxuICAgIHBsYWNlLmFkZHJlc3NfY29tcG9uZW50cy5mb3JFYWNoKChjb21wb25lbnQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoY29tcG9uZW50LnR5cGVzLmluY2x1ZGVzKFwiY291bnRyeVwiKSkge1xyXG4gICAgICAgIGNvdW50cnkgPSBjb21wb25lbnQubG9uZ19uYW1lO1xyXG4gICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudC50eXBlcy5pbmNsdWRlcyhcImxvY2FsaXR5XCIpKSB7XHJcbiAgICAgICAgY2l0eSA9IGNvbXBvbmVudC5sb25nX25hbWU7XHJcbiAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50LnR5cGVzLmluY2x1ZGVzKFwiYWRtaW5pc3RyYXRpdmVfYXJlYV9sZXZlbF8xXCIpKSB7XHJcbiAgICAgICAgc3RhdGUgPSBjb21wb25lbnQubG9uZ19uYW1lO1xyXG4gICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudC50eXBlcy5pbmNsdWRlcyhcInBvc3RhbF9jb2RlXCIpKSB7XHJcbiAgICAgICAgcGluY29kZSA9IGNvbXBvbmVudC5sb25nX25hbWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtLmdldChcImFkZHJlc3NcIik/LnNldFZhbHVlKHBsYWNlLmZvcm1hdHRlZF9hZGRyZXNzKTtcclxuICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtLmdldChcImNvdW50cnlcIik/LnNldFZhbHVlKGNvdW50cnkpO1xyXG4gICAgdGhpcy5jcmVhdGVTdG9yZUZvcm0uZ2V0KFwiY2l0eVwiKT8uc2V0VmFsdWUoY2l0eSk7XHJcbiAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybS5nZXQoXCJzdGF0ZVwiKT8uc2V0VmFsdWUoc3RhdGUpO1xyXG4gICAgdGhpcy5jcmVhdGVTdG9yZUZvcm0uZ2V0KFwicGluY29kZVwiKT8uc2V0VmFsdWUocGluY29kZSk7XHJcbiAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybS5nZXQoXCJsYXRpdHVkZVwiKT8uc2V0VmFsdWUobGF0aXR1ZGUpO1xyXG4gICAgdGhpcy5jcmVhdGVTdG9yZUZvcm0uZ2V0KFwibG9uZ2l0dWRlXCIpPy5zZXRWYWx1ZShsb25naXR1ZGUpO1xyXG4gIH1cclxuXHJcbiAgb25DYW5jZWwoKSB7XHJcbiAgICB0aGlzLmFjdGl2ZU1vZGFsLmRpc21pc3MoKTtcclxuICB9XHJcblxyXG4gIG9uQmFjaygpIHtcclxuICAgIHRoaXMuaXNDcmVhdGVTdG9yZU1vZGUgPSBmYWxzZTtcclxuICAgIHRoaXMubmV3U3RvcmVEZXRhaWxzID0gbnVsbDtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cIm1vZGFsLXdyYXBwZXJcIj5cclxuICA8aDMgY2xhc3M9XCJtYi0zXCI+Q3JlYXRlIHN0b3JlIGxheW91dC9wbGFuIGZyb20gQ0FEPC9oMz5cclxuICBAaWYoaXNDcmVhdGVTdG9yZU1vZGUpe1xyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxyXG4gICAgICA8cD5TdGVwIDE6IE9uYm9hcmQgc3RvcmUgd2l0aCBiYXNpYyBkZXRhaWxzPC9wPlxyXG4gICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgIG5nYlRvb2x0aXA9XCJBIG5ldyBzdG9yZSB3aWxsIGJlIGNyZWF0ZWQgd2hlbiB5b3UgcGVyZm9ybSB0aGlzIGFjdGlvbiAoTWFuYWdlID4gU3RvcmVzKS5cIj5cclxuICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgZD1cIk0xMC4wMDAzIDEzLjMzMzdWMTAuMDAwM00xMC4wMDAzIDYuNjY2OTlIMTAuMDA4N00xOC4zMzM3IDEwLjAwMDNDMTguMzMzNyAxNC42MDI3IDE0LjYwMjcgMTguMzMzNyAxMC4wMDAzIDE4LjMzMzdDNS4zOTc5NSAxOC4zMzM3IDEuNjY2OTkgMTQuNjAyNyAxLjY2Njk5IDEwLjAwMDNDMS42NjY5OSA1LjM5Nzk1IDUuMzk3OTUgMS42NjY5OSAxMC4wMDAzIDEuNjY2OTlDMTQuNjAyNyAxLjY2Njk5IDE4LjMzMzcgNS4zOTc5NSAxOC4zMzM3IDEwLjAwMDNaXCJcclxuICAgICAgICAgIHN0cm9rZT1cIiMxMDE4MjhcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgPC9zdmc+XHJcbiAgICA8L2Rpdj5cclxuICB9XHJcblxyXG5cclxuICBAaWYoaXNDcmVhdGVTdG9yZU1vZGUpe1xyXG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJjcmVhdGVTdG9yZUZvcm1cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi00XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTRcIj5cclxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJzdG9yZU5hbWVcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlN0b3JlIG5hbWU8L2xhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInN0b3JlTmFtZVwiIGZvcm1Db250cm9sTmFtZT1cInN0b3JlTmFtZVwiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZSBzdG9yZSBuYW1lXCIgLz5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZU5hbWUnKT8udG91Y2hlZCAmJiBjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZU5hbWUnKT8uaW52YWxpZFwiPlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RvcmVOYW1lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgU3RvcmUgbmFtZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0b3JlTmFtZScpPy5oYXNFcnJvcignZXhpc3RzJylcIj5cclxuICAgICAgICAgICAgICBTdG9yZSBhbHJlYWR5IGV4aXN0cy5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0b3JlTmFtZScpPy5oYXNFcnJvcignd2hpdGVzcGFjZScpXCI+XHJcbiAgICAgICAgICAgICAgU3RvcmUgbmFtZSBjYW5ub3QgYmUgb25seSB3aGl0ZXNwYWNlLlxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RvcmVOYW1lJyk/Lmhhc0Vycm9yKCd0cmltU3BhY2VzJylcIj5cclxuICAgICAgICAgICAgICBObyBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UgYWxsb3dlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxyXG4gICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cImZsb29yTGlzdFwiIFtsYWJlbF09XCInU2VsZWN0IGZsb29yJ1wiXHJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZsb29yXCI+XHJcbiAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi00XCI+XHJcbiAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwiYnVzaW5lc3NUeXBlTGlzdFwiXHJcbiAgICAgICAgICAgIFtsYWJlbF09XCInU2VsZWN0IGJ1c2luZXNzIHR5cGUnXCIgZm9ybUNvbnRyb2xOYW1lPVwiYnVzaW5lc3NUeXBlXCI+XHJcbiAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi00XCI+XHJcbiAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwic3RvcmVUeXBlTGlzdFwiXHJcbiAgICAgICAgICAgIFtsYWJlbF09XCInU2VsZWN0IHN0b3JlIHR5cGUnXCIgZm9ybUNvbnRyb2xOYW1lPVwic3RvcmVUeXBlXCI+XHJcbiAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIEBpZihjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZVR5cGUnKT8udmFsdWUgPT0gJ21hbGwnKXtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNFwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic3RvcmVUeXBlTmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+RW50ZXIgTWFsbCBuYW1lPC9sYWJlbD5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInN0b3JlVHlwZU5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJzdG9yZVR5cGVOYW1lXCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIE1hbGwgbmFtZVwiIC8+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0b3JlVHlwZU5hbWUnKT8udG91Y2hlZCAmJiBjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZVR5cGVOYW1lJyk/LmludmFsaWRcIj5cclxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RvcmVUeXBlTmFtZScpPy5oYXNFcnJvcignd2hpdGVzcGFjZScpXCI+XHJcbiAgICAgICAgICAgICAgICBNYWxsIG5hbWUgY2Fubm90IGJlIG9ubHkgd2hpdGVzcGFjZS5cclxuICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZVR5cGVOYW1lJyk/Lmhhc0Vycm9yKCd0cmltU3BhY2VzJylcIj5cclxuICAgICAgICAgICAgICAgIE5vIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbGxvd2VkLlxyXG4gICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTRcIj5cclxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJhZGRyZXNzXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5BZGRyZXNzPC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJhZGRyZXNzXCIgZm9ybUNvbnRyb2xOYW1lPVwiYWRkcmVzc1wiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGFuZCBlbnRlciBhZGRyZXNzXCIgbmd4LWdwLWF1dG9jb21wbGV0ZSAob25BZGRyZXNzQ2hhbmdlKT1cIm9uQWRkcmVzc0NoYW5nZSgkZXZlbnQpXCIgLz5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdhZGRyZXNzJyk/LnRvdWNoZWQgJiYgY3JlYXRlU3RvcmVGb3JtLmdldCgnYWRkcmVzcycpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdhZGRyZXNzJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgQWRkcmVzcyBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cImNvdW50cnlcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkNvdW50cnk8L2xhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImNvdW50cnlcIiBmb3JtQ29udHJvbE5hbWU9XCJjb3VudHJ5XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBDb3VudHJ5XCIgLz5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdjb3VudHJ5Jyk/LnRvdWNoZWQgJiYgY3JlYXRlU3RvcmVGb3JtLmdldCgnY291bnRyeScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdjb3VudHJ5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgQ291bnRyeSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cInN0YXRlXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5TdGF0ZTwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwic3RhdGVcIiBmb3JtQ29udHJvbE5hbWU9XCJzdGF0ZVwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgU3RhdGVcIiAvPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0YXRlJyk/LnRvdWNoZWQgJiYgY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RhdGUnKT8uaW52YWxpZFwiPlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RhdGUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICBTdGF0ZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cImNpdHlcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkNpdHkgLyBUb3duPC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJjaXR5XCIgZm9ybUNvbnRyb2xOYW1lPVwiY2l0eVwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgQ2l0eSAvIFRvd25cIiAvPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2NpdHknKT8udG91Y2hlZCAmJiBjcmVhdGVTdG9yZUZvcm0uZ2V0KCdjaXR5Jyk/LmludmFsaWRcIj5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2NpdHknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICBDaXR5IC8gVG93biBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cInBpbmNvZGVcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlBpbiAvIFppcCBDb2RlPC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwaW5jb2RlXCIgZm9ybUNvbnRyb2xOYW1lPVwicGluY29kZVwiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgUGluIC8gWmlwIENvZGVcIiAvPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3BpbmNvZGUnKT8udG91Y2hlZCAmJiBjcmVhdGVTdG9yZUZvcm0uZ2V0KCdwaW5jb2RlJyk/LmludmFsaWRcIj5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3BpbmNvZGUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICBQaW4gLyBaaXAgQ29kZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgncGluY29kZScpPy5oYXNFcnJvcignd2hpdGVzcGFjZScpIHx8IGNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3BpbmNvZGUnKT8uaGFzRXJyb3IoJ3RyaW1TcGFjZXMnKVwiPlxyXG4gICAgICAgICAgICAgIFBpbmNvZGUgY2Fubm90IGNvbnRhaW4gd2hpdGVzcGFjZS5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3BpbmNvZGUnKT8uaGFzRXJyb3IoJ2ludmFsaWRQaW5jb2RlJylcIj5cclxuICAgICAgICAgICAgICBFbnRlciBhIHZhbGlkIDYtZGlnaXQgcGluY29kZVxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNFwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cImVtYWlsXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5TcG9jIHVzZXIgZW1haWw8L2xhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImVtYWlsXCIgZm9ybUNvbnRyb2xOYW1lPVwiZW1haWxcIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHNwb2MgdXNlciBlbWFpbFwiIC8+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnZW1haWwnKT8udG91Y2hlZCAmJiBjcmVhdGVTdG9yZUZvcm0uZ2V0KCdlbWFpbCcpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdlbWFpbCcpPy5oYXNFcnJvcignZW1haWwnKVwiPlxyXG4gICAgICAgICAgICAgIEVtYWlsIGlzIGludmFsaWQuXHJcbiAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9mb3JtPlxyXG4gIH1cclxuICBAZWxzZSB7XHJcbiAgICBAaWYobmV3U3RvcmVEZXRhaWxzKXtcclxuICAgICAgPHAgY2xhc3M9XCJtYi02XCI+U3RlcCAyOiBBZGQgQ0FEIGZpbGU8L3AgPlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi02XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgPHAgY2xhc3M9XCJtYi0yXCI+U3RvcmUgbmFtZTwvcD5cclxuICAgICAgICAgIDxoMz57e25ld1N0b3JlRGV0YWlscz8uc3RvcmVOYW1lfX08L2gzPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgIDxwIGNsYXNzPVwibWItMlwiPkZsb29yPC9wPlxyXG4gICAgICAgICAgPGgzPkZsb29yIHt7dGhpcy5zZWxlY3RlZEZsb29yfX08L2gzPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgIDxwIGNsYXNzPVwibWItMlwiPkJ1c2luZXNzIHR5cGU8L3A+XHJcbiAgICAgICAgICA8aDM+e3tuZXdTdG9yZURldGFpbHM/LmJ1c2luZXNzVHlwZSB8IHVwcGVyY2FzZX19PC9oMz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICA8cCBjbGFzcz1cIm1iLTJcIj5TdG9yZSB0eXBlPC9wPlxyXG4gICAgICAgICAgPGgzPnt7bmV3U3RvcmVEZXRhaWxzPy5zdG9yZVR5cGU/LnR5cGUgfCB0aXRsZWNhc2V9fTwvaDM+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfUBlbHNlIHtcclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi00XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XHJcbiAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbc2VhcmNoXT1cInRydWVcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkU3RvcmVcIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcclxuICAgICAgICAgICAgW2RhdGFdPVwic3RvcmVMaXN0XCIgW2xhYmVsXT1cIidTZWxlY3Qgc3RvcmUnXCIgW2FjdGlvbl09XCJ0cnVlXCIgKGFjdGlvbkNsaWNrKT1cImFkZE5ld1N0b3JlKClcIlxyXG4gICAgICAgICAgICBbYWN0aW9uTGFiZWxdPVwiJ0NyZWF0ZSBuZXcgc3RvcmUnXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25TdG9yZUNoYW5nZSgpXCIgW2Rpc2FibGVkXT1cImlzQnV0dG9uTG9hZGluZ1wiPlxyXG4gICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxyXG4gICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEZsb29yXCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cImZsb29yTGlzdFwiXHJcbiAgICAgICAgICAgIFtsYWJlbF09XCInU2VsZWN0IGZsb29yJ1wiIChuZ01vZGVsQ2hhbmdlKT1cIm9uRmxvb3JDaGFuZ2UoKVwiIFtkaXNhYmxlZF09XCJpc0J1dHRvbkxvYWRpbmdcIj5cclxuICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LWV4aXN0LXdyYXBwZXJcIiBbY2xhc3Muc2hvd109XCJpc0xheW91dEV4aXN0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxheW91dC1leGlzdC13YXJuaW5nIG1iLTRcIj5cclxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgIGQ9XCJNOS45OTk2NSA2LjY2NjY3VjEwTTkuOTk5NjUgMTMuMzMzM0gxMC4wMDhNOC41NzQ2NSAyLjM4MzM0TDEuNTE2MzIgMTQuMTY2N0MxLjM3MDc5IDE0LjQxODcgMS4yOTM3OSAxNC43MDQ0IDEuMjkyOTggMTQuOTk1NEMxLjI5MjE2IDE1LjI4NjUgMS4zNjc1NiAxNS41NzI2IDEuNTExNjcgMTUuODI1NEMxLjY1NTc5IDE2LjA3ODMgMS44NjM1OSAxNi4yODkgMi4xMTQ0MSAxNi40MzY2QzIuMzY1MjMgMTYuNTg0MSAyLjY1MDMyIDE2LjY2MzUgMi45NDEzMiAxNi42NjY3SDE3LjA1OEMxNy4zNDkgMTYuNjYzNSAxNy42MzQxIDE2LjU4NDEgMTcuODg0OSAxNi40MzY2QzE4LjEzNTcgMTYuMjg5IDE4LjM0MzUgMTYuMDc4MyAxOC40ODc2IDE1LjgyNTRDMTguNjMxNyAxNS41NzI2IDE4LjcwNzEgMTUuMjg2NSAxOC43MDYzIDE0Ljk5NTRDMTguNzA1NSAxNC43MDQ0IDE4LjYyODUgMTQuNDE4NyAxOC40ODMgMTQuMTY2N0wxMS40MjQ3IDIuMzgzMzRDMTEuMjc2MSAyLjEzODQzIDExLjA2NjkgMS45MzU5NCAxMC44MTczIDEuNzk1NDFDMTAuNTY3NyAxLjY1NDg4IDEwLjI4NjEgMS41ODEwNSA5Ljk5OTY1IDEuNTgxMDVDOS43MTMyMSAxLjU4MTA1IDkuNDMxNTkgMS42NTQ4OCA5LjE4MTk5IDEuNzk1NDFDOC45MzIzOCAxLjkzNTk0IDguNzIzMjEgMi4xMzg0MyA4LjU3NDY1IDIuMzgzMzRaXCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjRjA0NDM4XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgICBUaGlzIHN0b3JlIGFscmVhZHkgaGFzIGEgRmxvb3Ige3tzZWxlY3RlZEZsb29yfX0gcGxhbm9ncmFtLiBPdmVyd3JpdGUgaXQ/IFRoaXMgY2Fu4oCZdCBiZSB1bmRvbmUuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgPGZpbGUtdXBsb2FkIFtkaXNhYmxlZF09XCJpc0J1dHRvbkxvYWRpbmdcIiAoZmlsZUNoYW5nZSk9XCJvbkZpbGVDaGFuZ2UoJGV2ZW50KVwiPjwvZmlsZS11cGxvYWQ+XHJcbiAgICA8L2Rpdj5cclxuICB9XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWFjdGlvbnNcIj5cclxuICAgIEBpZihpc0NyZWF0ZVN0b3JlTW9kZSl7XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saW5rIG1lLWF1dG9cIiAoY2xpY2spPVwib25CYWNrKClcIj5CYWNrPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgXCIgW2Rpc2FibGVkXT1cImNyZWF0ZVN0b3JlRm9ybS5pbnZhbGlkXCIgKGNsaWNrKT1cIm9uQ3JlYXRlU3RvcmUoKVwiPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzQnV0dG9uTG9hZGluZ1wiPlxyXG4gICAgICAgICAgTmV4dFxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8c3ZnICpuZ0lmPVwiaXNCdXR0b25Mb2FkaW5nXCIgY2xhc3M9XCJzcGlubmVyXCIgdmlld0JveD1cIjAgMCA1MCA1MFwiPlxyXG4gICAgICAgICAgPGNpcmNsZSBjbGFzcz1cInBhdGhcIiBjeD1cIjI1XCIgY3k9XCIyNVwiIHI9XCIyMFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiNFwiPjwvY2lyY2xlPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIH1AZWxzZSB7XHJcbiAgICAgIDxidXR0b24gKm5nSWY9XCJuZXdTdG9yZURldGFpbHNcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpbmsgbWUtYXV0b1wiIChjbGljayk9XCJvbkJhY2soKVwiPkJhY2s8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwib25DYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBcIiBbZGlzYWJsZWRdPVwiIWlzVmFsaWRUb0NyZWF0ZVBsYW5vIHx8IGlzQnV0dG9uTG9hZGluZ1wiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ3JlYXRlTGF5b3V0UGxhbm8oKVwiPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzQnV0dG9uTG9hZGluZ1wiPlxyXG4gICAgICAgICAge3tpc0xheW91dEV4aXN0ID8gICdPdmVyd3JpdGUnIDogJ0NyZWF0ZSd9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgPHN2ZyAqbmdJZj1cImlzQnV0dG9uTG9hZGluZ1wiIGNsYXNzPVwic3Bpbm5lclwiIHZpZXdCb3g9XCIwIDAgNTAgNTBcIj5cclxuICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJwYXRoXCIgY3g9XCIyNVwiIGN5PVwiMjVcIiByPVwiMjBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjRcIj48L2NpcmNsZT5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
|