tango-app-ui-manage-users 3.4.0-alpha.7 → 3.4.0-alpha.9
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/tango-manage-users/add-user-popup/add-user-popup.component.mjs +3 -3
- package/esm2022/lib/components/tango-manage-users/assign-store-popup/assign-store-popup.component.mjs +3 -3
- package/esm2022/lib/components/tango-manage-users/audit-user/audit-user-earnings/audit-user-earnings.component.mjs +9 -5
- package/esm2022/lib/components/tango-manage-users/audit-user/audit-user-list/audit-user-list.component.mjs +9 -5
- package/esm2022/lib/components/tango-manage-users/brand-user/brand-user.component.mjs +3 -3
- package/esm2022/lib/components/tango-manage-users/roles-permission-table/roles-permission-table.component.mjs +3 -3
- package/esm2022/lib/components/tango-manage-users/tango-manage-users.component.mjs +3 -3
- package/esm2022/lib/components/tango-manage-users/user-table/alert-popup/alert-popup.component.mjs +3 -3
- package/esm2022/lib/components/tango-manage-users/user-table/user-table.component.mjs +5 -5
- package/esm2022/lib/components-v2/action-popup/action-popup.component.mjs +3 -3
- package/esm2022/lib/components-v2/add-users/add-users.component.mjs +6 -6
- package/esm2022/lib/components-v2/custom-select/custom-select.component.mjs +3 -3
- package/esm2022/lib/components-v2/teams-creation/teams-creation.component.mjs +3 -3
- package/esm2022/lib/components-v2/teams-list/teams-list.component.mjs +3 -3
- package/esm2022/lib/components-v2/users-list/users-list.component.mjs +3 -3
- package/esm2022/lib/components-v2/users-manage/users-manage.component.mjs +3 -3
- package/esm2022/lib/components-v2/viewteams-list/viewteams-list.component.mjs +3 -3
- package/esm2022/lib/services/excel.service.mjs +3 -3
- package/esm2022/lib/services/user.service.mjs +3 -3
- package/esm2022/lib/services-v2/manage-users.service.mjs +3 -3
- package/esm2022/lib/tango-manage-users-routing.module.mjs +4 -4
- package/esm2022/lib/tango-manage-users.module.mjs +4 -4
- package/fesm2022/tango-app-ui-manage-users.mjs +81 -73
- package/fesm2022/tango-app-ui-manage-users.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -15,10 +15,10 @@ export class ActionPopupComponent {
|
|
|
15
15
|
onSubmit() {
|
|
16
16
|
this.activeModal.close('submit');
|
|
17
17
|
}
|
|
18
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.
|
|
19
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.
|
|
18
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ActionPopupComponent, deps: [{ token: i1.NgbActiveModal }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
19
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ActionPopupComponent, selector: "lib-action-popup", inputs: { teamData: "teamData" }, ngImport: i0, template: "<div class=\"card group-delete py-0\">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"my-5\">\r\n <div class=\"symbol symbol-75px symbol-circle\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#FEE4E2\"/>\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#FEF3F2\" stroke-width=\"8\"/>\r\n <path d=\"M28 24V28M28 32H28.01M38 28C38 33.5228 33.5228 38 28 38C22.4772 38 18 33.5228 18 28C18 22.4772 22.4772 18 28 18C33.5228 18 38 22.4772 38 28Z\" stroke=\"#D92D20\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n \r\n </div>\r\n </div>\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Delete {{teamData?.teamName}} team?</a>\r\n <span class=\"sub-title fw-normal mt-2\">Are you sure you want to delete this team? This action cannot be undone.</span>\r\n\r\n <div class=\"mt-5 w-100\">\r\n <div role=\"group\" class=\"d-flex mt-3 mb-15\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button id=\"alert-toast\" class=\"btn btn-danger w-100 ms-3\" (click)=\"onSubmit()\">Delete</button> \r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>", styles: [".sub-title{font-size:14px!important}\n"] });
|
|
20
20
|
}
|
|
21
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.
|
|
21
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ActionPopupComponent, decorators: [{
|
|
22
22
|
type: Component,
|
|
23
23
|
args: [{ selector: 'lib-action-popup', template: "<div class=\"card group-delete py-0\">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"my-5\">\r\n <div class=\"symbol symbol-75px symbol-circle\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#FEE4E2\"/>\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#FEF3F2\" stroke-width=\"8\"/>\r\n <path d=\"M28 24V28M28 32H28.01M38 28C38 33.5228 33.5228 38 28 38C22.4772 38 18 33.5228 18 28C18 22.4772 22.4772 18 28 18C33.5228 18 38 22.4772 38 28Z\" stroke=\"#D92D20\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n \r\n </div>\r\n </div>\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Delete {{teamData?.teamName}} team?</a>\r\n <span class=\"sub-title fw-normal mt-2\">Are you sure you want to delete this team? This action cannot be undone.</span>\r\n\r\n <div class=\"mt-5 w-100\">\r\n <div role=\"group\" class=\"d-flex mt-3 mb-15\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button id=\"alert-toast\" class=\"btn btn-danger w-100 ms-3\" (click)=\"onSubmit()\">Delete</button> \r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>", styles: [".sub-title{font-size:14px!important}\n"] }]
|
|
24
24
|
}], ctorParameters: () => [{ type: i1.NgbActiveModal }, { type: i0.ChangeDetectorRef }], propDecorators: { teamData: [{
|
|
@@ -185,7 +185,7 @@ export class AddUsersComponent {
|
|
|
185
185
|
email: [res.data.result.email, Validators.compose([Validators.required,
|
|
186
186
|
Validators.pattern("^[a-zA-Z0-9]+([.-_]?[a-zA-Z0-9]+)*@[a-zA-Z0-9]+([.-_]?[a-zA-Z]+)*[.]{1}[a-zA-Z]{2,}$"),
|
|
187
187
|
])],
|
|
188
|
-
mobileNumber: [res.data.result.mobileNumber, [Validators.required, Validators.minLength(
|
|
188
|
+
mobileNumber: [res.data.result.mobileNumber, [Validators.required, Validators.minLength(8), Validators.maxLength(13)]],
|
|
189
189
|
role: [res.data.result.role, Validators.required],
|
|
190
190
|
userType: [res.data.result.userType, Validators.required],
|
|
191
191
|
rolespermission: this.fb.array([], Validators.required),
|
|
@@ -427,12 +427,12 @@ export class AddUsersComponent {
|
|
|
427
427
|
}
|
|
428
428
|
});
|
|
429
429
|
}
|
|
430
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.
|
|
431
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: AddUsersComponent, selector: "lib-add-users", inputs: { type: "type", user: "user", userType: "userType", data: "data" }, ngImport: i0, template: "<div class=\"card pt-0 pb-3 scroll\">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"my-5 d-flex\">\r\n <div class=\"symbol symbol-75px symbol-circle\">\r\n <img alt=\"Pic\" src=\"./assets/tango/Icons/add-store-icon.svg\">\r\n </div>\r\n\r\n </div>\r\n <div class=\"row w-100\">\r\n <div *ngIf=\"type!=='view' && type!=='edit'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Add\r\n User</a>\r\n <div class=\"sub-title\">Please add your user details</div>\r\n </div>\r\n <!-- <div *ngIf=\"type==='edit'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Edit User Details</a>\r\n <div class=\"sub-title\">Please Edit your user details</div>\r\n </div> -->\r\n <div *ngIf=\"type==='view' && type !=='edit'\" class=\"col-md-9\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">User Details</a>\r\n <div class=\"sub-title\">View your user details</div>\r\n </div>\r\n <ng-container *ngIf=\"operationType!=='view'\">\r\n <div\r\n *ngIf=\"(gs.userAccess |async)?.Global_User_isEdit && type ==='view' && type !=='edit' && user?.role !== 'superadmin'\"\r\n class=\"col-md-3 text-end px-0\" (click)=\"editUser()\">\r\n <button class=\"btn btn-outline\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_3833_85908)\">\r\n <path\r\n d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_3833_85908\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg></button>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"type==='edit' && type !=='view'\" class=\"col-md-9\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">User Details</a>\r\n <div class=\"sub-title\">Edit your user details</div>\r\n </div>\r\n <div class=\"w-100 h-0px scroll\">\r\n <div class=\"mt-5\" *ngIf=\"userForm\">\r\n <form [formGroup]=\"userForm\" novalidate=\"novalidate\" class=\"\">\r\n <div class=\"row px-0 me-3\">\r\n <!-- User Name Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"username\" class=\"form-label\">User Name <span\r\n class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"username\" formControlName=\"userName\" autocomplete=\"off\">\r\n <div *ngIf=\"userForm.get('userName')?.invalid && (userForm.get('userName')?.dirty)\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('userName')?.errors?.['required']\">User Name is required.</small>\r\n </div>\r\n </div>\r\n\r\n <!-- Email Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"email\" class=\"form-label\">Email <span class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"email\" class=\"form-control\" id=\"email\" formControlName=\"email\" autocomplete=\"off\">\r\n <div *ngIf=\"userForm.get('email')?.invalid && userForm.get('email')?.touched\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('email')?.errors?.['required']\">Email is required.</small>\r\n <small *ngIf=\"userForm.get('email')?.errors?.['pattern']\">Invalid email format.</small>\r\n </div>\r\n </div>\r\n\r\n <!-- Contact Number Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"contact\" class=\"form-label\">Contact Number <span\r\n class=\"alert-required text-danger\">*</span></label>\r\n <div class=\"row\">\r\n <div class=\"col-md-12 col-lg-4 col-xl-4\">\r\n <select class=\"form-select ps-3 pe-8\" id=\"inputGroupSelect01\" formControlName=\"countryCode\">\r\n <option *ngFor=\"let country of countryList\" [value]=\"country.phonecode\">\r\n {{country.name}} ({{country.phonecode}})\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-8 col-xl-8\">\r\n <input type=\"text\" class=\"form-control\" (keypress)=\"omit_special_char($event)\" id=\"mobileNumber\"\r\n autocomplete=\"off\" formControlName=\"mobileNumber\">\r\n <div *ngIf=\"userForm.get('mobileNumber')?.invalid && userForm.get('mobileNumber')?.touched\"\r\n class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['required']\">Contact Number is\r\n required.</small>\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['minlength']\">Contact Number must be at least\r\n 10 digits.</small>\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['maxlength']\">Contact Number cannot exceed 13\r\n digits.</small>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Role Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"role\" class=\"form-label\">Role <span class=\"alert-required text-danger\">*</span></label>\r\n <select class=\"form-select\" formControlName=\"role\" (change)=\"onRoleChange(userForm.get('role')?.value)\">\r\n <option value=\"admin\">Admin</option>\r\n <option value=\"user\">User</option>\r\n </select>\r\n <div *ngIf=\"userForm.get('role')?.invalid && userForm.get('role')?.touched\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('role')?.errors?.['required']\">Role is required.</small>\r\n </div>\r\n </div>\r\n\r\n <!-- User Type Field -->\r\n <div *ngIf=\"this.userType ==='tango'\" class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"tangoUserType\" class=\"form-label\">User Type <span\r\n class=\"alert-required text-danger\">*</span></label>\r\n <select class=\"form-select\" formControlName=\"tangoUserType\"\r\n (change)=\"onRoleChange(userForm.get('tangoUserType')?.value)\">\r\n <option value=\"dashboard\">Dashboard</option>\r\n <option value=\"audit\">Audit</option>\r\n </select>\r\n <div *ngIf=\"userForm.get('tangoUserType')?.invalid && userForm.get('tangoUserType')?.touched\"\r\n class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('tangoUserType')?.errors?.['required']\">User Type is required.</small>\r\n </div>\r\n </div>\r\n\r\n <!-- Add to Team Field -->\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\" *ngIf=\"this.userType !=='tango'\">\r\n <label for=\"teamLead\" class=\"form-label teams-title\">Add to a team</label>\r\n <team-select [items]=\"teamList\" [multi]=\"true\" [searchField]=\"'teamName'\" [idField]=\"'_id'\"\r\n (selected)=\"onStoreSelect($event)\" [selectedValues]=\"selectedUser\"></team-select>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"userForm.get('role')?.value === 'admin'\">\r\n\r\n <h3 class=\"teams-title\" *ngIf=\"getPermissions().length\">Access for Admin</h3>\r\n <ng-container *ngIf=\"getPermissions().length\">\r\n <ng-container formArrayName=\"rolespermission\">\r\n <ng-container *ngFor=\"let rolespermission of getPermissions().controls; let i = index\"\r\n [formGroupName]=\"i\">\r\n <div class=\"table-responsive my-2 me-3\">\r\n <div class=\"row w-100\">\r\n <div class=\"title-header mt-4 ms-2\">\r\n {{ camelCaseToText(rolespermission.get('featureName')?.value) }}\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"rolespermission.get('modules')\" formArrayName=\"modules\">\r\n <ng-container\r\n *ngFor=\"let modules of getFeaturePermissions(rolespermission)?.controls; let j = index\"\r\n [formGroupName]=\"j\">\r\n <table class=\"w-100\">\r\n <tbody>\r\n <tr *ngIf=\"rolespermission.get('featureName')?.value !== 'TangoAdmin'\">\r\n <td class=\"w-50\">{{ camelCaseToText(modules.get('name')?.value) }}</td>\r\n <td class=\"text-start\">\r\n <div class=\"d-inline-flex align-items-center\">\r\n <input type=\"checkbox\" formControlName=\"isAdd\" class=\"cursor-pointer\"\r\n (change)=\"handleViewChange(modules)\">\r\n <label class=\"global-label ms-2 mt-auto\">Add</label>\r\n </div>\r\n </td>\r\n <td class=\"text-start\">\r\n <div class=\"d-inline-flex align-items-center\">\r\n <input formControlName=\"isEdit\" type=\"checkbox\" class=\"cursor-pointer\"\r\n (change)=\"handleEditChange(modules)\">\r\n <label class=\"global-label ms-2 mt-auto\">Edit</label>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </ng-container>\r\n <div *ngIf=\"rolespermission.get('featureName')?.value === 'TangoAdmin'\"\r\n class=\"row w-100 text-nowrap\">\r\n <div class=\"col-md-4\"\r\n *ngFor=\"let modules of getFeaturePermissions(rolespermission)?.controls; let j = index\"\r\n [formGroupName]=\"j\">\r\n <div class=\"d-inline-flex mt-3\">\r\n <input type=\"checkbox\" class=\"cursor-pointer\" formControlName=\"isEdit\">\r\n <label class=\"global-label mb-5 mx-2 mt-1\" style=\"text-wrap:nowrap\">\r\n {{ camelCaseToText(modules.get('name')?.value) }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </div>\r\n <div *ngIf=\"type!=='view'\" class=\"d-flex my-10\" role=\"group\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-primary w-100 ms-3\" id=\"alert-toast\" (click)=\"onSubmit()\"\r\n [disabled]=\"userForm.invalid || type === 'view'\">Submit</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>", styles: [".scroll{overflow-y:auto;overflow-x:hidden}.title{color:var(--Gray-900, #101828)!important;font-size:18px!important;font-weight:600;line-height:28px}.sub-title{color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.teams-title{color:var(--Black, #101828)!important;font-size:18px!important;font-weight:600!important;line-height:28px}.title-header{border-radius:6px!important;border-bottom:2px solid var(--Gray-200, #EAECF0)!important;background:#f2f4f7!important;box-shadow:0 4px 10px #0000000d!important;color:var(--Black, #101828)!important;font-size:20px!important;font-weight:600;line-height:30px;padding:8px 16px}input[type=checkbox]{width:18px!important;height:18px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.5em;padding-left:0;padding-top:12px;padding-right:6px}.global-label{color:var(--Gray-700, #344054)!important;font-size:16px!important;font-weight:500;line-height:24px}.w-25{width:40%!important}td{color:var(--Black, #101828)!important;font-size:16px!important;font-weight:500!important;line-height:24px}tr,.add-team{border-bottom:1px solid var(--Gray-200, #EAECF0)!important}input[disabled]{pointer-events:none;opacity:.5}\n"], dependencies: [{ kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.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: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i3.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i8.CustomSelectComponent, selector: "team-select", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label"], outputs: ["selected", "deselected", "deselectedAll"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }] });
|
|
430
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AddUsersComponent, deps: [{ token: i1.ManageUsersService }, { token: i0.ChangeDetectorRef }, { token: i2.NgbActiveModal }, { token: i3.FormBuilder }, { token: i4.UserService }, { token: i5.ToastService }, { token: i6.GlobalStateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
431
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AddUsersComponent, selector: "lib-add-users", inputs: { type: "type", user: "user", userType: "userType", data: "data" }, ngImport: i0, template: "<div class=\"card pt-0 pb-3 scroll\">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"my-5 d-flex\">\r\n <div class=\"symbol symbol-75px symbol-circle\">\r\n <img alt=\"Pic\" src=\"./assets/tango/Icons/add-store-icon.svg\">\r\n </div>\r\n \r\n </div>\r\n <div class=\"row w-100\">\r\n <div *ngIf=\"type!=='view' && type!=='edit'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Add\r\n User</a>\r\n <div class=\"sub-title\">Please add your user details</div>\r\n </div>\r\n <!-- <div *ngIf=\"type==='edit'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Edit User Details</a>\r\n <div class=\"sub-title\">Please Edit your user details</div>\r\n </div> -->\r\n <div *ngIf=\"type==='view' && type !=='edit'\" class=\"col-md-9\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">User Details</a>\r\n <div class=\"sub-title\">View your user details</div>\r\n </div>\r\n <ng-container *ngIf=\"operationType!=='view'\">\r\n <div *ngIf=\"(gs.userAccess |async)?.Global_User_isEdit && type ==='view' && type !=='edit' && user?.role !== 'superadmin'\" class=\"col-md-3 text-end px-0\" (click)=\"editUser()\">\r\n <button class=\"btn btn-outline\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_3833_85908)\">\r\n <path\r\n d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_3833_85908\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg></button>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"type==='edit' && type !=='view'\" class=\"col-md-9\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">User Details</a>\r\n <div class=\"sub-title\">Edit your user details</div>\r\n </div>\r\n <div class=\"w-100 h-0px scroll\">\r\n <div class=\"mt-5\" *ngIf=\"userForm\">\r\n <form [formGroup]=\"userForm\" novalidate=\"novalidate\" class=\"\">\r\n <div class=\"row px-0 me-3\">\r\n <!-- User Name Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"username\" class=\"form-label\">User Name <span class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"username\" formControlName=\"userName\" autocomplete=\"off\">\r\n <div *ngIf=\"userForm.get('userName')?.invalid && (userForm.get('userName')?.dirty)\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('userName')?.errors?.['required']\">User Name is required.</small>\r\n </div>\r\n </div>\r\n \r\n <!-- Email Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"email\" class=\"form-label\">Email <span class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"email\" class=\"form-control\" id=\"email\" formControlName=\"email\" autocomplete=\"off\">\r\n <div *ngIf=\"userForm.get('email')?.invalid && userForm.get('email')?.touched\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('email')?.errors?.['required']\">Email is required.</small>\r\n <small *ngIf=\"userForm.get('email')?.errors?.['pattern']\">Invalid email format.</small>\r\n </div>\r\n </div>\r\n \r\n <!-- Contact Number Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"contact\" class=\"form-label\">Contact Number <span class=\"alert-required text-danger\">*</span></label>\r\n <div class=\"row\">\r\n <div class=\"col-md-12 col-lg-4 col-xl-4\">\r\n <select class=\"form-select ps-3 pe-8\" id=\"inputGroupSelect01\" formControlName=\"countryCode\">\r\n <option *ngFor=\"let country of countryList\" [value]=\"country.phonecode\">\r\n {{country.name}} ({{country.phonecode}})\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-8 col-xl-8\">\r\n <input type=\"text\" class=\"form-control\" (keypress)=\"omit_special_char($event)\"\r\n id=\"mobileNumber\" autocomplete=\"off\" formControlName=\"mobileNumber\">\r\n <div *ngIf=\"userForm.get('mobileNumber')?.invalid && userForm.get('mobileNumber')?.touched\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['required']\">Contact Number is required.</small>\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['minlength']\">Contact Number must be at least 8 digits.</small>\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['maxlength']\">Contact Number cannot exceed 13 digits.</small>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Role Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"role\" class=\"form-label\">Role <span class=\"alert-required text-danger\">*</span></label>\r\n <select class=\"form-select\" formControlName=\"role\" (change)=\"onRoleChange(userForm.get('role')?.value)\">\r\n <option value=\"admin\">Admin</option>\r\n <option value=\"user\">User</option>\r\n </select>\r\n <div *ngIf=\"userForm.get('role')?.invalid && userForm.get('role')?.touched\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('role')?.errors?.['required']\">Role is required.</small>\r\n </div>\r\n </div>\r\n \r\n <!-- Add to Team Field -->\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\" *ngIf=\"this.userType !=='tango'\">\r\n <label for=\"teamLead\" class=\"form-label teams-title\">Add to a team</label>\r\n <team-select [items]=\"teamList\" [multi]=\"true\" [searchField]=\"'teamName'\" [idField]=\"'_id'\" \r\n (selected)=\"onStoreSelect($event)\" [selectedValues]=\"selectedUser\"></team-select>\r\n </div>\r\n </div>\r\n \r\n <div *ngIf=\"userForm.get('role')?.value === 'admin'\">\r\n\r\n <h3 class=\"teams-title\" *ngIf=\"getPermissions().length\">Access for Admin</h3>\r\n <ng-container *ngIf=\"getPermissions().length\">\r\n <ng-container formArrayName=\"rolespermission\">\r\n <ng-container *ngFor=\"let rolespermission of getPermissions().controls; let i = index\" [formGroupName]=\"i\">\r\n <div class=\"table-responsive my-2 me-3\">\r\n <div class=\"row w-100\">\r\n <div class=\"title-header mt-4 ms-2\">\r\n {{ camelCaseToText(rolespermission.get('featureName')?.value) }}\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"rolespermission.get('modules')\" formArrayName=\"modules\">\r\n <ng-container *ngFor=\"let modules of getFeaturePermissions(rolespermission)?.controls; let j = index\" [formGroupName]=\"j\">\r\n <table class=\"w-100\">\r\n <tbody>\r\n <tr *ngIf=\"rolespermission.get('featureName')?.value !== 'TangoAdmin'\">\r\n <td class=\"w-50\">{{ camelCaseToText(modules.get('name')?.value) }}</td>\r\n <td class=\"text-start\">\r\n <div class=\"d-inline-flex align-items-center\">\r\n <input type=\"checkbox\" formControlName=\"isAdd\" class=\"cursor-pointer\" (change)=\"handleViewChange(modules)\">\r\n <label class=\"global-label ms-2 mt-auto\">Add</label>\r\n </div>\r\n </td>\r\n <td class=\"text-start\">\r\n <div class=\"d-inline-flex align-items-center\">\r\n <input formControlName=\"isEdit\" type=\"checkbox\" class=\"cursor-pointer\" (change)=\"handleEditChange(modules)\">\r\n <label class=\"global-label ms-2 mt-auto\">Edit</label>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </ng-container>\r\n <div *ngIf=\"rolespermission.get('featureName')?.value === 'TangoAdmin'\" class=\"row w-100 text-nowrap\">\r\n <div class=\"col-md-4\" *ngFor=\"let modules of getFeaturePermissions(rolespermission)?.controls; let j = index\" [formGroupName]=\"j\">\r\n <div class=\"d-inline-flex mt-3\">\r\n <input type=\"checkbox\" class=\"cursor-pointer\" formControlName=\"isEdit\">\r\n <label class=\"global-label mb-5 mx-2 mt-1\" style=\"text-wrap:nowrap\">\r\n {{ camelCaseToText(modules.get('name')?.value) }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n \r\n </div>\r\n <div *ngIf=\"type!=='view'\" class=\"d-flex my-10\" role=\"group\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-primary w-100 ms-3\" id=\"alert-toast\"\r\n (click)=\"onSubmit()\" [disabled]=\"userForm.invalid || type === 'view'\">Submit</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>", styles: [".scroll{overflow-y:auto;overflow-x:hidden}.title{color:var(--Gray-900, #101828)!important;font-size:18px!important;font-weight:600;line-height:28px}.sub-title{color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.teams-title{color:var(--Black, #101828)!important;font-size:18px!important;font-weight:600!important;line-height:28px}.title-header{border-radius:6px!important;border-bottom:2px solid var(--Gray-200, #EAECF0)!important;background:#f2f4f7!important;box-shadow:0 4px 10px #0000000d!important;color:var(--Black, #101828)!important;font-size:20px!important;font-weight:600;line-height:30px;padding:8px 16px}input[type=checkbox]{width:18px!important;height:18px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.5em;padding-left:0;padding-top:12px;padding-right:6px}.global-label{color:var(--Gray-700, #344054)!important;font-size:16px!important;font-weight:500;line-height:24px}.w-25{width:40%!important}td{color:var(--Black, #101828)!important;font-size:16px!important;font-weight:500!important;line-height:24px}tr,.add-team{border-bottom:1px solid var(--Gray-200, #EAECF0)!important}input[disabled]{pointer-events:none;opacity:.5}\n"], dependencies: [{ kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.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: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i3.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i8.CustomSelectComponent, selector: "team-select", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label"], outputs: ["selected", "deselected", "deselectedAll"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }] });
|
|
432
432
|
}
|
|
433
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.
|
|
433
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AddUsersComponent, decorators: [{
|
|
434
434
|
type: Component,
|
|
435
|
-
args: [{ selector: 'lib-add-users', template: "<div class=\"card pt-0 pb-3 scroll\">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"my-5 d-flex\">\r\n <div class=\"symbol symbol-75px symbol-circle\">\r\n <img alt=\"Pic\" src=\"./assets/tango/Icons/add-store-icon.svg\">\r\n </div>\r\n\r\n </div>\r\n <div class=\"row w-100\">\r\n <div *ngIf=\"type!=='view' && type!=='edit'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Add\r\n User</a>\r\n <div class=\"sub-title\">Please add your user details</div>\r\n </div>\r\n <!-- <div *ngIf=\"type==='edit'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Edit User Details</a>\r\n <div class=\"sub-title\">Please Edit your user details</div>\r\n </div> -->\r\n <div *ngIf=\"type==='view' && type !=='edit'\" class=\"col-md-9\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">User Details</a>\r\n <div class=\"sub-title\">View your user details</div>\r\n </div>\r\n <ng-container *ngIf=\"operationType!=='view'\">\r\n <div\r\n *ngIf=\"(gs.userAccess |async)?.Global_User_isEdit && type ==='view' && type !=='edit' && user?.role !== 'superadmin'\"\r\n class=\"col-md-3 text-end px-0\" (click)=\"editUser()\">\r\n <button class=\"btn btn-outline\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_3833_85908)\">\r\n <path\r\n d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_3833_85908\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg></button>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"type==='edit' && type !=='view'\" class=\"col-md-9\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">User Details</a>\r\n <div class=\"sub-title\">Edit your user details</div>\r\n </div>\r\n <div class=\"w-100 h-0px scroll\">\r\n <div class=\"mt-5\" *ngIf=\"userForm\">\r\n <form [formGroup]=\"userForm\" novalidate=\"novalidate\" class=\"\">\r\n <div class=\"row px-0 me-3\">\r\n <!-- User Name Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"username\" class=\"form-label\">User Name <span\r\n class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"username\" formControlName=\"userName\" autocomplete=\"off\">\r\n <div *ngIf=\"userForm.get('userName')?.invalid && (userForm.get('userName')?.dirty)\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('userName')?.errors?.['required']\">User Name is required.</small>\r\n </div>\r\n </div>\r\n\r\n <!-- Email Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"email\" class=\"form-label\">Email <span class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"email\" class=\"form-control\" id=\"email\" formControlName=\"email\" autocomplete=\"off\">\r\n <div *ngIf=\"userForm.get('email')?.invalid && userForm.get('email')?.touched\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('email')?.errors?.['required']\">Email is required.</small>\r\n <small *ngIf=\"userForm.get('email')?.errors?.['pattern']\">Invalid email format.</small>\r\n </div>\r\n </div>\r\n\r\n <!-- Contact Number Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"contact\" class=\"form-label\">Contact Number <span\r\n class=\"alert-required text-danger\">*</span></label>\r\n <div class=\"row\">\r\n <div class=\"col-md-12 col-lg-4 col-xl-4\">\r\n <select class=\"form-select ps-3 pe-8\" id=\"inputGroupSelect01\" formControlName=\"countryCode\">\r\n <option *ngFor=\"let country of countryList\" [value]=\"country.phonecode\">\r\n {{country.name}} ({{country.phonecode}})\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-8 col-xl-8\">\r\n <input type=\"text\" class=\"form-control\" (keypress)=\"omit_special_char($event)\" id=\"mobileNumber\"\r\n autocomplete=\"off\" formControlName=\"mobileNumber\">\r\n <div *ngIf=\"userForm.get('mobileNumber')?.invalid && userForm.get('mobileNumber')?.touched\"\r\n class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['required']\">Contact Number is\r\n required.</small>\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['minlength']\">Contact Number must be at least\r\n 10 digits.</small>\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['maxlength']\">Contact Number cannot exceed 13\r\n digits.</small>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Role Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"role\" class=\"form-label\">Role <span class=\"alert-required text-danger\">*</span></label>\r\n <select class=\"form-select\" formControlName=\"role\" (change)=\"onRoleChange(userForm.get('role')?.value)\">\r\n <option value=\"admin\">Admin</option>\r\n <option value=\"user\">User</option>\r\n </select>\r\n <div *ngIf=\"userForm.get('role')?.invalid && userForm.get('role')?.touched\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('role')?.errors?.['required']\">Role is required.</small>\r\n </div>\r\n </div>\r\n\r\n <!-- User Type Field -->\r\n <div *ngIf=\"this.userType ==='tango'\" class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"tangoUserType\" class=\"form-label\">User Type <span\r\n class=\"alert-required text-danger\">*</span></label>\r\n <select class=\"form-select\" formControlName=\"tangoUserType\"\r\n (change)=\"onRoleChange(userForm.get('tangoUserType')?.value)\">\r\n <option value=\"dashboard\">Dashboard</option>\r\n <option value=\"audit\">Audit</option>\r\n </select>\r\n <div *ngIf=\"userForm.get('tangoUserType')?.invalid && userForm.get('tangoUserType')?.touched\"\r\n class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('tangoUserType')?.errors?.['required']\">User Type is required.</small>\r\n </div>\r\n </div>\r\n\r\n <!-- Add to Team Field -->\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\" *ngIf=\"this.userType !=='tango'\">\r\n <label for=\"teamLead\" class=\"form-label teams-title\">Add to a team</label>\r\n <team-select [items]=\"teamList\" [multi]=\"true\" [searchField]=\"'teamName'\" [idField]=\"'_id'\"\r\n (selected)=\"onStoreSelect($event)\" [selectedValues]=\"selectedUser\"></team-select>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"userForm.get('role')?.value === 'admin'\">\r\n\r\n <h3 class=\"teams-title\" *ngIf=\"getPermissions().length\">Access for Admin</h3>\r\n <ng-container *ngIf=\"getPermissions().length\">\r\n <ng-container formArrayName=\"rolespermission\">\r\n <ng-container *ngFor=\"let rolespermission of getPermissions().controls; let i = index\"\r\n [formGroupName]=\"i\">\r\n <div class=\"table-responsive my-2 me-3\">\r\n <div class=\"row w-100\">\r\n <div class=\"title-header mt-4 ms-2\">\r\n {{ camelCaseToText(rolespermission.get('featureName')?.value) }}\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"rolespermission.get('modules')\" formArrayName=\"modules\">\r\n <ng-container\r\n *ngFor=\"let modules of getFeaturePermissions(rolespermission)?.controls; let j = index\"\r\n [formGroupName]=\"j\">\r\n <table class=\"w-100\">\r\n <tbody>\r\n <tr *ngIf=\"rolespermission.get('featureName')?.value !== 'TangoAdmin'\">\r\n <td class=\"w-50\">{{ camelCaseToText(modules.get('name')?.value) }}</td>\r\n <td class=\"text-start\">\r\n <div class=\"d-inline-flex align-items-center\">\r\n <input type=\"checkbox\" formControlName=\"isAdd\" class=\"cursor-pointer\"\r\n (change)=\"handleViewChange(modules)\">\r\n <label class=\"global-label ms-2 mt-auto\">Add</label>\r\n </div>\r\n </td>\r\n <td class=\"text-start\">\r\n <div class=\"d-inline-flex align-items-center\">\r\n <input formControlName=\"isEdit\" type=\"checkbox\" class=\"cursor-pointer\"\r\n (change)=\"handleEditChange(modules)\">\r\n <label class=\"global-label ms-2 mt-auto\">Edit</label>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </ng-container>\r\n <div *ngIf=\"rolespermission.get('featureName')?.value === 'TangoAdmin'\"\r\n class=\"row w-100 text-nowrap\">\r\n <div class=\"col-md-4\"\r\n *ngFor=\"let modules of getFeaturePermissions(rolespermission)?.controls; let j = index\"\r\n [formGroupName]=\"j\">\r\n <div class=\"d-inline-flex mt-3\">\r\n <input type=\"checkbox\" class=\"cursor-pointer\" formControlName=\"isEdit\">\r\n <label class=\"global-label mb-5 mx-2 mt-1\" style=\"text-wrap:nowrap\">\r\n {{ camelCaseToText(modules.get('name')?.value) }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </div>\r\n <div *ngIf=\"type!=='view'\" class=\"d-flex my-10\" role=\"group\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-primary w-100 ms-3\" id=\"alert-toast\" (click)=\"onSubmit()\"\r\n [disabled]=\"userForm.invalid || type === 'view'\">Submit</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>", styles: [".scroll{overflow-y:auto;overflow-x:hidden}.title{color:var(--Gray-900, #101828)!important;font-size:18px!important;font-weight:600;line-height:28px}.sub-title{color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.teams-title{color:var(--Black, #101828)!important;font-size:18px!important;font-weight:600!important;line-height:28px}.title-header{border-radius:6px!important;border-bottom:2px solid var(--Gray-200, #EAECF0)!important;background:#f2f4f7!important;box-shadow:0 4px 10px #0000000d!important;color:var(--Black, #101828)!important;font-size:20px!important;font-weight:600;line-height:30px;padding:8px 16px}input[type=checkbox]{width:18px!important;height:18px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.5em;padding-left:0;padding-top:12px;padding-right:6px}.global-label{color:var(--Gray-700, #344054)!important;font-size:16px!important;font-weight:500;line-height:24px}.w-25{width:40%!important}td{color:var(--Black, #101828)!important;font-size:16px!important;font-weight:500!important;line-height:24px}tr,.add-team{border-bottom:1px solid var(--Gray-200, #EAECF0)!important}input[disabled]{pointer-events:none;opacity:.5}\n"] }]
|
|
435
|
+
args: [{ selector: 'lib-add-users', template: "<div class=\"card pt-0 pb-3 scroll\">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"my-5 d-flex\">\r\n <div class=\"symbol symbol-75px symbol-circle\">\r\n <img alt=\"Pic\" src=\"./assets/tango/Icons/add-store-icon.svg\">\r\n </div>\r\n \r\n </div>\r\n <div class=\"row w-100\">\r\n <div *ngIf=\"type!=='view' && type!=='edit'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Add\r\n User</a>\r\n <div class=\"sub-title\">Please add your user details</div>\r\n </div>\r\n <!-- <div *ngIf=\"type==='edit'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Edit User Details</a>\r\n <div class=\"sub-title\">Please Edit your user details</div>\r\n </div> -->\r\n <div *ngIf=\"type==='view' && type !=='edit'\" class=\"col-md-9\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">User Details</a>\r\n <div class=\"sub-title\">View your user details</div>\r\n </div>\r\n <ng-container *ngIf=\"operationType!=='view'\">\r\n <div *ngIf=\"(gs.userAccess |async)?.Global_User_isEdit && type ==='view' && type !=='edit' && user?.role !== 'superadmin'\" class=\"col-md-3 text-end px-0\" (click)=\"editUser()\">\r\n <button class=\"btn btn-outline\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_3833_85908)\">\r\n <path\r\n d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_3833_85908\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg></button>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"type==='edit' && type !=='view'\" class=\"col-md-9\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">User Details</a>\r\n <div class=\"sub-title\">Edit your user details</div>\r\n </div>\r\n <div class=\"w-100 h-0px scroll\">\r\n <div class=\"mt-5\" *ngIf=\"userForm\">\r\n <form [formGroup]=\"userForm\" novalidate=\"novalidate\" class=\"\">\r\n <div class=\"row px-0 me-3\">\r\n <!-- User Name Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"username\" class=\"form-label\">User Name <span class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"username\" formControlName=\"userName\" autocomplete=\"off\">\r\n <div *ngIf=\"userForm.get('userName')?.invalid && (userForm.get('userName')?.dirty)\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('userName')?.errors?.['required']\">User Name is required.</small>\r\n </div>\r\n </div>\r\n \r\n <!-- Email Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"email\" class=\"form-label\">Email <span class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"email\" class=\"form-control\" id=\"email\" formControlName=\"email\" autocomplete=\"off\">\r\n <div *ngIf=\"userForm.get('email')?.invalid && userForm.get('email')?.touched\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('email')?.errors?.['required']\">Email is required.</small>\r\n <small *ngIf=\"userForm.get('email')?.errors?.['pattern']\">Invalid email format.</small>\r\n </div>\r\n </div>\r\n \r\n <!-- Contact Number Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"contact\" class=\"form-label\">Contact Number <span class=\"alert-required text-danger\">*</span></label>\r\n <div class=\"row\">\r\n <div class=\"col-md-12 col-lg-4 col-xl-4\">\r\n <select class=\"form-select ps-3 pe-8\" id=\"inputGroupSelect01\" formControlName=\"countryCode\">\r\n <option *ngFor=\"let country of countryList\" [value]=\"country.phonecode\">\r\n {{country.name}} ({{country.phonecode}})\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-8 col-xl-8\">\r\n <input type=\"text\" class=\"form-control\" (keypress)=\"omit_special_char($event)\"\r\n id=\"mobileNumber\" autocomplete=\"off\" formControlName=\"mobileNumber\">\r\n <div *ngIf=\"userForm.get('mobileNumber')?.invalid && userForm.get('mobileNumber')?.touched\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['required']\">Contact Number is required.</small>\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['minlength']\">Contact Number must be at least 8 digits.</small>\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['maxlength']\">Contact Number cannot exceed 13 digits.</small>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Role Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"role\" class=\"form-label\">Role <span class=\"alert-required text-danger\">*</span></label>\r\n <select class=\"form-select\" formControlName=\"role\" (change)=\"onRoleChange(userForm.get('role')?.value)\">\r\n <option value=\"admin\">Admin</option>\r\n <option value=\"user\">User</option>\r\n </select>\r\n <div *ngIf=\"userForm.get('role')?.invalid && userForm.get('role')?.touched\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('role')?.errors?.['required']\">Role is required.</small>\r\n </div>\r\n </div>\r\n \r\n <!-- Add to Team Field -->\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\" *ngIf=\"this.userType !=='tango'\">\r\n <label for=\"teamLead\" class=\"form-label teams-title\">Add to a team</label>\r\n <team-select [items]=\"teamList\" [multi]=\"true\" [searchField]=\"'teamName'\" [idField]=\"'_id'\" \r\n (selected)=\"onStoreSelect($event)\" [selectedValues]=\"selectedUser\"></team-select>\r\n </div>\r\n </div>\r\n \r\n <div *ngIf=\"userForm.get('role')?.value === 'admin'\">\r\n\r\n <h3 class=\"teams-title\" *ngIf=\"getPermissions().length\">Access for Admin</h3>\r\n <ng-container *ngIf=\"getPermissions().length\">\r\n <ng-container formArrayName=\"rolespermission\">\r\n <ng-container *ngFor=\"let rolespermission of getPermissions().controls; let i = index\" [formGroupName]=\"i\">\r\n <div class=\"table-responsive my-2 me-3\">\r\n <div class=\"row w-100\">\r\n <div class=\"title-header mt-4 ms-2\">\r\n {{ camelCaseToText(rolespermission.get('featureName')?.value) }}\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"rolespermission.get('modules')\" formArrayName=\"modules\">\r\n <ng-container *ngFor=\"let modules of getFeaturePermissions(rolespermission)?.controls; let j = index\" [formGroupName]=\"j\">\r\n <table class=\"w-100\">\r\n <tbody>\r\n <tr *ngIf=\"rolespermission.get('featureName')?.value !== 'TangoAdmin'\">\r\n <td class=\"w-50\">{{ camelCaseToText(modules.get('name')?.value) }}</td>\r\n <td class=\"text-start\">\r\n <div class=\"d-inline-flex align-items-center\">\r\n <input type=\"checkbox\" formControlName=\"isAdd\" class=\"cursor-pointer\" (change)=\"handleViewChange(modules)\">\r\n <label class=\"global-label ms-2 mt-auto\">Add</label>\r\n </div>\r\n </td>\r\n <td class=\"text-start\">\r\n <div class=\"d-inline-flex align-items-center\">\r\n <input formControlName=\"isEdit\" type=\"checkbox\" class=\"cursor-pointer\" (change)=\"handleEditChange(modules)\">\r\n <label class=\"global-label ms-2 mt-auto\">Edit</label>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </ng-container>\r\n <div *ngIf=\"rolespermission.get('featureName')?.value === 'TangoAdmin'\" class=\"row w-100 text-nowrap\">\r\n <div class=\"col-md-4\" *ngFor=\"let modules of getFeaturePermissions(rolespermission)?.controls; let j = index\" [formGroupName]=\"j\">\r\n <div class=\"d-inline-flex mt-3\">\r\n <input type=\"checkbox\" class=\"cursor-pointer\" formControlName=\"isEdit\">\r\n <label class=\"global-label mb-5 mx-2 mt-1\" style=\"text-wrap:nowrap\">\r\n {{ camelCaseToText(modules.get('name')?.value) }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n \r\n </div>\r\n <div *ngIf=\"type!=='view'\" class=\"d-flex my-10\" role=\"group\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-primary w-100 ms-3\" id=\"alert-toast\"\r\n (click)=\"onSubmit()\" [disabled]=\"userForm.invalid || type === 'view'\">Submit</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>", styles: [".scroll{overflow-y:auto;overflow-x:hidden}.title{color:var(--Gray-900, #101828)!important;font-size:18px!important;font-weight:600;line-height:28px}.sub-title{color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.teams-title{color:var(--Black, #101828)!important;font-size:18px!important;font-weight:600!important;line-height:28px}.title-header{border-radius:6px!important;border-bottom:2px solid var(--Gray-200, #EAECF0)!important;background:#f2f4f7!important;box-shadow:0 4px 10px #0000000d!important;color:var(--Black, #101828)!important;font-size:20px!important;font-weight:600;line-height:30px;padding:8px 16px}input[type=checkbox]{width:18px!important;height:18px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.5em;padding-left:0;padding-top:12px;padding-right:6px}.global-label{color:var(--Gray-700, #344054)!important;font-size:16px!important;font-weight:500;line-height:24px}.w-25{width:40%!important}td{color:var(--Black, #101828)!important;font-size:16px!important;font-weight:500!important;line-height:24px}tr,.add-team{border-bottom:1px solid var(--Gray-200, #EAECF0)!important}input[disabled]{pointer-events:none;opacity:.5}\n"] }]
|
|
436
436
|
}], ctorParameters: () => [{ type: i1.ManageUsersService }, { type: i0.ChangeDetectorRef }, { type: i2.NgbActiveModal }, { type: i3.FormBuilder }, { type: i4.UserService }, { type: i5.ToastService }, { type: i6.GlobalStateService }], propDecorators: { type: [{
|
|
437
437
|
type: Input
|
|
438
438
|
}], user: [{
|
|
@@ -442,4 +442,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
|
|
|
442
442
|
}], data: [{
|
|
443
443
|
type: Input
|
|
444
444
|
}] } });
|
|
445
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXVzZXJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS11c2Vycy9zcmMvbGliL2NvbXBvbmVudHMtdjIvYWRkLXVzZXJzL2FkZC11c2Vycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2UtdXNlcnMvc3JjL2xpYi9jb21wb25lbnRzLXYyL2FkZC11c2Vycy9hZGQtdXNlcnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUN2RixPQUFPLEVBQUUsT0FBTyxFQUFnQixTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHeEQsT0FBTyxFQUEwQixXQUFXLEVBQWEsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7QUFTNUYsTUFBTSxPQUFPLGlCQUFpQjtJQThEUjtJQUNWO0lBQ0Q7SUFDQztJQUNBO0lBQ0E7SUFDRDtJQW5FUSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUNoQyxJQUFJLENBQU07SUFDVixJQUFJLENBQU07SUFDVixRQUFRLENBQU07SUFDZCxJQUFJLENBQU07SUFDbkIsUUFBUSxDQUFZO0lBQ3BCLGFBQWEsR0FBVyxLQUFLLENBQUM7SUFDOUIsUUFBUSxHQUFRLEVBQUUsQ0FBQTtJQUNsQixXQUFXLENBQU07SUFDakIsWUFBWSxHQUFRLEVBQUUsQ0FBQztJQUN2QixVQUFVLEdBQVcsa0JBQWtCLENBQUM7SUFDeEMsVUFBVSxHQUFXLDRCQUE0QixDQUFDO0lBQ2xELFNBQVMsQ0FBTTtJQUNmLGNBQWMsQ0FBTTtJQUNILFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQzFDLGVBQWUsR0FBRztRQUNoQjtZQUNFLFdBQVcsRUFBRSxRQUFR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O29CQUN4QyxRQUFRLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztvQkFDeEMsVUFBVSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7aUJBQzdDLENBQUMsQ0FBQyxDQUFDO2FBQ0w7UUFFSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBamJVLGlCQUFpQjs0RkFBakIsaUJBQWlCLGlJQ2I5QixxeFpBd01ROzs0RkQzTEssaUJBQWlCO2tCQUw3QixTQUFTOytCQUNFLGVBQWU7b1FBTWhCLElBQUk7c0JBQVosS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0YWtlVW50aWwgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBNYW5hZ2VVc2Vyc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy12Mi9tYW5hZ2UtdXNlcnMuc2VydmljZSc7XHJcbmltcG9ydCB7IE5nYkFjdGl2ZU1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3VzZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItYWRkLXVzZXJzJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYWRkLXVzZXJzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vYWRkLXVzZXJzLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQWRkVXNlcnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uSW5pdCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95ID0gbmV3IFN1YmplY3QoKTtcclxuICBASW5wdXQoKSB0eXBlOiBhbnk7XHJcbiAgQElucHV0KCkgdXNlcjogYW55O1xyXG4gIEBJbnB1dCgpIHVzZXJUeXBlOiBhbnk7XHJcbiAgQElucHV0KCkgZGF0YTogYW55O1xyXG4gIHVzZXJGb3JtOiBGb3JtR3JvdXA7XHJcbiAgb3BlcmF0aW9uVHlwZTogc3RyaW5nID0gJ2FkZCc7XHJcbiAgdGVhbUxpc3Q6IGFueSA9IFtdXHJcbiAgY291bnRyeUxpc3Q6IGFueTtcclxuICBzZWxlY3RlZFVzZXI6IGFueSA9IFtdO1xyXG4gIHBob25lUmVnZXg6IFJlZ0V4cCA9IC9eKFxcZHszfSk/XFxkezE1fSQvO1xyXG4gIGVtYWlsUmVnZXg6IFJlZ0V4cCA9IC9eW15cXHNAXStAW15cXHNAXStcXC5bXlxcc0BdKyQvO1xyXG4gIHVzZXJfZGF0YTogYW55O1xyXG4gICRoZWFkZXJGaWx0ZXJzOiBhbnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgcGVybWlzc2lvbkFycmF5ID0gW1xyXG4gICAge1xyXG4gICAgICBmZWF0dXJlTmFtZTogXCJHbG9iYWxcIixcclxuICAgICAgbW9kdWxlczogW1xyXG4gICAgICAgIHsgbmFtZTogXCJTdG9yZVwiLCBpc0FkZDogZmFsc2UsIGlzRWRpdDogZmFsc2UgfSxcclxuICAgICAgICB7IG5hbWU6IFwiVXNlclwiLCBpc0FkZDogZmFsc2UsIGlzRWRpdDogZmFsc2UgfSxcclxuICAgICAgICB7IG5hbWU6IFwiQ2FtZXJhXCIsIGlzQWRkOiBmYWxzZSwgaXNFZGl0OiBmYWxzZSB9LFxyXG4gICAgICAgIHsgbmFtZTogXCJDb25maWd1cmF0aW9uXCIsIGlzQWRkOiBmYWxzZSwgaXNFZGl0OiBmYWxzZSB9LFxyXG4gICAgICAgIHsgbmFtZTogXCJTdWJzY3JpcHRpb25cIiwgaXNBZGQ6IGZhbHNlLCBpc0VkaXQ6IGZhbHNlIH0sXHJcbiAgICAgICAgeyBuYW1lOiBcIkJpbGxpbmdcIiwgaXNBZGQ6IGZhbHNlLCBpc0VkaXQ6IGZhbHNlIH0sXHJcbiAgICAgIF1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGZlYXR1cmVOYW1lOiBcIlRhbmdvRXllXCIsXHJcbiAgICAgIG1vZHVsZXM6IFtcclxuXHJcbiAgICAgICAgeyBuYW1lOiBcIlpvbmVUYWdcIiwgaXNBZGQ6IGZhbHNlLCBpc0VkaXQ6IGZhbHNlIH0sXHJcbiAgICAgIF1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGZlYXR1cmVOYW1lOiBcIlRhbmdvVHJheFwiLFxyXG4gICAgICBtb2R1bGVzOiBbXHJcbiAgICAgICAgeyBuYW1lOiBcImNoZWNrbGlzdFwiLCBpc0FkZDogZmFsc2UsIGlzRWRpdDogZmFsc2UgfSxcclxuICAgICAgICB7IG5hbWU6IFwiVGFza1wiLCBpc0FkZDogZmFsc2UsIGlzRWRpdDogZmFsc2UgfSxcclxuICAgICAgXVxyXG4gICAgfSxcclxuXHJcbiAgXTtcclxuXHJcbiAgaGFuZGxlVmlld0NoYW5nZShtb2R1bGVzOiBGb3JtR3JvdXAgfCBhbnkpOiB2b2lkIHtcclxuICAgIGlmICghbW9kdWxlcy5nZXQoXCJpc0FkZFwiKT8udmFsdWUpIHtcclxuICAgICAgbW9kdWxlcy5nZXQoXCJpc0RlbGV0ZVwiKT8uc2V0VmFsdWUoZmFsc2UpO1xyXG4gICAgICBtb2R1bGVzLmdldChcImlzRWRpdFwiKT8uc2V0VmFsdWUoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuICBoYW5kbGVFZGl0Q2hhbmdlKG1vZHVsZXM6IEZvcm1Hcm91cCB8IGFueSk6IHZvaWQge1xyXG4gICAgLy8gaWYgKCFtb2R1bGVzLmdldChcImlzQWRkXCIpPy52YWx1ZSkge1xyXG4gICAgLy8gICBtb2R1bGVzLmdldChcImlzRGVsZXRlXCIpPy5zZXRWYWx1ZShmYWxzZSk7XHJcbiAgICAvLyAgIG1vZHVsZXMuZ2V0KFwiaXNFZGl0XCIpPy5zZXRWYWx1ZShmYWxzZSk7XHJcbiAgICAvLyB9XHJcbiAgICBpZiAoIW1vZHVsZXMuZ2V0KFwiaXNFZGl0XCIpPy52YWx1ZSkge1xyXG4gICAgICAvLyBtb2R1bGVzLmdldCgnaXNEb3dubG9hZCcpPy5zZXRWYWx1ZShmYWxzZSk7XHJcbiAgICAgIG1vZHVsZXMuZ2V0KFwiaXNEZWxldGVcIik/LnNldFZhbHVlKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc2VydmljZTogTWFuYWdlVXNlcnNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwdWJsaWMgYWN0aXZlTW9kYWw6IE5nYkFjdGl2ZU1vZGFsLFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgdHM6IFRvYXN0U2VydmljZSxcclxuICAgIHB1YmxpYyBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICkge1xyXG5cclxuICB9XHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5kZXN0cm95Lm5leHQoZmFsc2UpO1xyXG4gICAgdGhpcy5kZXN0cm95LmNvbXBsZXRlKCk7XHJcblxyXG4gIH1cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMudHlwZSlcclxuICAgIGxldCBkYXRhOiBhbnk7XHJcbiAgICBpZiAoXCJoZWFkZXItZmlsdGVyc1wiIGluIGxvY2FsU3RvcmFnZSkge1xyXG4gICAgICBkYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnKSB8fCAnJyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVzZXJfZGF0YSA9IEpTT04/LnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyLWluZm8nKSB8fCAnJyk7XHJcbiAgICB0aGlzLiRoZWFkZXJGaWx0ZXJzID0gZGF0YSA/IGRhdGEgOiB0aGlzLnVzZXJfZGF0YTtcclxuICAgIHRoaXMuZ2V0Q291bnRyeUNvZGVzKCk7XHJcbiAgICB0aGlzLmdldFJvbGVzKCk7XHJcbiAgICB0aGlzLmdldEFsbFRlYW1zTGlzdCgpXHJcbiAgICBpZiAodGhpcy50eXBlID09PSBcInZpZXdcIiB8fCAodGhpcy50eXBlID09PSBcImVkaXRcIikpIHtcclxuICAgICAgLy8gdGhpcy5hZGRTaW5nbGVVc2VyKCk7XHJcbiAgICAgIHRoaXMubG9hZFVzZXJGb3JtKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmluaXRVc2VyRm9ybSgpO1xyXG4gICAgICAvLyB0aGlzLmdldEFsbFRlYW1zTGlzdCgpXHJcbiAgICAgIC8vIHRoaXMuc2hvd3NpbmdsZXVzZXIgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBnZXRSb2xlcygpIHtcclxuICAgIGlmICh0aGlzLnVzZXJUeXBlID09PSAndGFuZ28nKSB7XHJcbiAgICAgIHRoaXMucGVybWlzc2lvbkFycmF5LnB1c2goe1xyXG4gICAgICAgIGZlYXR1cmVOYW1lOiBcIlRhbmdvQWRtaW5cIixcclxuICAgICAgICBtb2R1bGVzOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiaW52b2ljZUFwcHJvdmFsXCIsIGlzQWRkOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNFZGl0OiBmYWxzZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogXCJFZGl0QmlsbGluZ1wiLCBpc0FkZDogZmFsc2UsXHJcbiAgICAgICAgICAgIGlzRWRpdDogZmFsc2VcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiVGlja2V0Q29uZmlndXJhdGlvblwiLCBpc0FkZDogZmFsc2UsXHJcbiAgICAgICAgICAgIGlzRWRpdDogZmFsc2VcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiUmVwb3J0c1wiLCBpc0FkZDogZmFsc2UsXHJcbiAgICAgICAgICAgIGlzRWRpdDogZmFsc2VcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXVxyXG4gICAgICB9LClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9taXRfc3BlY2lhbF9jaGFyKGV2ZW50OiBhbnkpIHtcclxuICAgIHZhciBrO1xyXG4gICAgayA9IGV2ZW50LmNoYXJDb2RlO1xyXG4gICAgcmV0dXJuIGsgPT0gOCB8fCBrID09IDMyIHx8IChrID49IDQ4ICYmIGsgPD0gNTcpO1xyXG4gIH1cclxuXHJcbiAgb25Sb2xlQ2hhbmdlKHJvbGU6IHN0cmluZykge1xyXG4gICAgdGhpcy5nZXRVc2VyUGVybWlzc2lvbkRhdGEocm9sZSwgdGhpcy51c2VyX2RhdGEudXNlclR5cGUpO1xyXG4gIH1cclxuICBnZXRDb3VudHJ5Q29kZXMoKSB7XHJcbiAgICB0aGlzLnNlcnZpY2UuZ2V0QWxsQ291bnRyaWVzKCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlcykgPT4ge1xyXG4gICAgICAgIHRoaXMuY291bnRyeUxpc3QgPSByZXMuZGF0YVxyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcblxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuICBvbnJvbGVjaGFuZ2UoZXZlbnQ6IGFueSkge1xyXG4gICAgY29uc29sZS5sb2coZXZlbnQudGFyZ2V0LnZhbHVlKVxyXG4gICAgaWYgKGV2ZW50LnRhcmdldC52YWx1ZSA9PT0gJ3VzZXInKSB7XHJcbiAgICAgIHRoaXMucG9wdWxhdGVQZXJtaXNzaW9uKHRoaXMucGVybWlzc2lvbkFycmF5KTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG4gIG9uU3RvcmVTZWxlY3QoZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFVzZXIgPSBldmVudFxyXG4gICAgY29uc3QgdGVhbUxlYWRBcnJheSA9IHRoaXMudXNlckZvcm0uZ2V0KCd0ZWFtTGVhZCcpIGFzIEZvcm1BcnJheTtcclxuICAgIHRlYW1MZWFkQXJyYXkuY2xlYXIoKTsgLy8gQ2xlYXJzIGV4aXN0aW5nIHZhbHVlc1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRVc2VyLmZvckVhY2goKHVzZXI6IGFueSkgPT4ge1xyXG4gICAgICB0ZWFtTGVhZEFycmF5LnB1c2gobmV3IEZvcm1Db250cm9sKHVzZXIpKTsgLy8gQWRkcyBlYWNoIHVzZXIgaW4gc2VsZWN0ZWRVc2VyIGFycmF5XHJcbiAgICB9KTtcclxuICAgIDtcclxuICAgIC8vIHRoaXMuc2V0VGVhbUxlYWRzKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIGNhbmNlbCgpIHtcclxuICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpO1xyXG4gICAgY29uc3QgdHJpZ2dlckJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0cmlnZ2VyQnV0dG9uSWQnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIHRyaWdnZXJCdXR0b24/LmZvY3VzKCk7XHJcbiAgfVxyXG4gIC8vIG9uU3VibWl0KCkge1xyXG4gIC8vICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnc3VibWl0Jyk7XHJcbiAgLy8gfVxyXG4gIGxvYWRVc2VyRm9ybSgpIHtcclxuICAgIHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcih0aGlzLnVzZXIuZW1haWwpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCAmJiByZXMuZGF0YS5yZXN1bHQpIHtcclxuICAgICAgICAgIHRoaXMudXNlckZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgICAgdXNlck5hbWU6IFtyZXMuZGF0YS5yZXN1bHQudXNlck5hbWUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICBlbWFpbDogW3Jlcy5kYXRhLnJlc3VsdC5lbWFpbCwgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICAgICAgICBWYWxpZGF0b3JzLnBhdHRlcm4oXCJeW2EtekEtWjAtOV0rKFsuLV9dP1thLXpBLVowLTldKykqQFthLXpBLVowLTldKyhbLi1fXT9bYS16QS1aXSspKlsuXXsxfVthLXpBLVpdezIsfSRcIiksXHJcbiAgICAgICAgICAgIF0pXSxcclxuICAgICAgICAgICAgbW9iaWxlTnVtYmVyOiBbcmVzLmRhdGEucmVzdWx0Lm1vYmlsZU51bWJlciwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDEwKSwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTMpXV0sXHJcbiAgICAgICAgICAgIHJvbGU6IFtyZXMuZGF0YS5yZXN1bHQucm9sZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICAgIHVzZXJUeXBlOiBbcmVzLmRhdGEucmVzdWx0LnVzZXJUeXBlLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgICAgcm9sZXNwZXJtaXNzaW9uOiB0aGlzLmZiLmFycmF5KFtdLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcclxuICAgICAgICAgICAgdGVhbUxlYWQ6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICAgICAgICBjb3VudHJ5Q29kZTogW3Jlcy5kYXRhLnJlc3VsdC5jb3VudHJ5Q29kZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHRoaXMudXBkYXRlVGFuZ291c2VyRmllbGQocmVzLmRhdGEucmVzdWx0LnRhbmdvVXNlclR5cGUpO1xyXG4gICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBcInZpZXdcIikge1xyXG4gICAgICAgICAgICB0aGlzLnVzZXJGb3JtLmRpc2FibGUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMudXNlckZvcm0uZ2V0KFwiZW1haWxcIik/LmRpc2FibGUoKTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VyID0gcmVzLmRhdGEudGVhbXNMaXN0XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFVzZXIubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VGVhbUxlYWRzKHRoaXMuc2VsZWN0ZWRVc2VyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgLy8gdGhpcy51c2VyRm9ybS5nZXQoJ3RlYW1MZWFkJyk/LnNldFZhbHVlKCk7XHJcbiAgICAgICAgICB0aGlzLnBvcHVsYXRlUGVybWlzc2lvbihyZXM/LmRhdGE/LnJlc3VsdD8ucm9sZXNwZXJtaXNzaW9uKTtcclxuICAgICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLm9wZXJhdGlvblR5cGUgPT0gXCJ2aWV3XCIpIHtcclxuICAgICAgICAgICAgdGhpcy51c2VyRm9ybS5kaXNhYmxlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnVzZXJGb3JtLmdldChcImVtYWlsXCIpPy5kaXNhYmxlKCk7XHJcbiAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgIC8vIHRoaXMuZ2V0VXNlclBlcm1pc3Npb25EYXRhKHJlcy5kYXRhLnJlc3VsdC5yb2xlLHJlcy5kYXRhLnJlc3VsdC51c2VyVHlwZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuaW5pdFVzZXJGb3JtKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaW5pdFVzZXJGb3JtKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7IH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVRhbmdvdXNlckZpZWxkKHRhbmdvVXNlclR5cGU6YW55KSB7XHJcbiAgICBpZiAodGhpcy51c2VyVHlwZSA9PT0gJ3RhbmdvJykge1xyXG4gICAgICBpZiAoIXRoaXMudXNlckZvcm0uY29udGFpbnMoJ3RhbmdvVXNlclR5cGUnKSkge1xyXG4gICAgICAgIHRoaXMudXNlckZvcm0uYWRkQ29udHJvbCgndGFuZ29Vc2VyVHlwZScsIHRoaXMuZmIuY29udHJvbCh0YW5nb1VzZXJUeXBlIHx8ICdkYXNoYm9hcmQnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLnVzZXJGb3JtLmNvbnRhaW5zKCd0YW5nb1VzZXJUeXBlJykpIHtcclxuICAgICAgICB0aGlzLnVzZXJGb3JtLnJlbW92ZUNvbnRyb2woJ3RhbmdvVXNlclR5cGUnKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdFVzZXJGb3JtKCkge1xyXG4gICAgdGhpcy51c2VyRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICB1c2VyTmFtZTogW1wiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBlbWFpbDogW1wiXCIsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgVmFsaWRhdG9ycy5wYXR0ZXJuKFwiXlthLXpBLVowLTldKyhbLi1fXT9bYS16QS1aMC05XSspKkBbYS16QS1aMC05XSsoWy4tX10/W2EtekEtWl0rKSpbLl17MX1bYS16QS1aXXsyLH0kXCIpLFxyXG4gICAgICBdKV0sXHJcbiAgICAgIG1vYmlsZU51bWJlcjogW1wiXCIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCgxMCksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDE1KV1dLFxyXG4gICAgICByb2xlOiBbXCJ1c2VyXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICB1c2VyVHlwZTogW3RoaXMudXNlclR5cGUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICByb2xlc3Blcm1pc3Npb246IHRoaXMuZmIuYXJyYXkoW10sIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxyXG4gICAgICB0ZWFtTGVhZDogdGhpcy5mYi5hcnJheShbXSksXHJcbiAgICAgIGNvdW50cnlDb2RlOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy51c2VyVHlwZSA9PT0gJ3RhbmdvJykge1xyXG4gICAgICBpZiAoIXRoaXMudXNlckZvcm0uY29udGFpbnMoJ3RhbmdvVXNlclR5cGUnKSkge1xyXG4gICAgICAgIHRoaXMudXNlckZvcm0uYWRkQ29udHJvbCgndGFuZ29Vc2VyVHlwZScsIHRoaXMuZmIuY29udHJvbCgnZGFzaGJvYXJkJywgVmFsaWRhdG9ycy5yZXF1aXJlZCkpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy51c2VyRm9ybS5jb250YWlucygndGFuZ29Vc2VyVHlwZScpKSB7XHJcbiAgICAgICAgdGhpcy51c2VyRm9ybS5yZW1vdmVDb250cm9sKCd0YW5nb1VzZXJUeXBlJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuZ2V0VXNlclBlcm1pc3Npb25EYXRhKFwidXNlclwiLCB0aGlzLnVzZXJfZGF0YS51c2VyVHlwZSk7XHJcbiAgfVxyXG4gIHBvcHVsYXRlUGVybWlzc2lvbihwZXJtaXNzaW9uc0RhdGE6IGFueVtdKSB7XHJcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IHRoaXMudXNlckZvcm0uZ2V0KFwicm9sZXNwZXJtaXNzaW9uXCIpIGFzIEZvcm1BcnJheTtcclxuICAgIHBlcm1pc3Npb25zLmNsZWFyKCk7ICAvLyBDbGVhciBleGlzdGluZyBlbnRyaWVzXHJcblxyXG4gICAgcGVybWlzc2lvbnNEYXRhLmZvckVhY2goKHJvbGVzcGVybWlzc2lvbjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGZlYXR1cmVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgIGZlYXR1cmVOYW1lOiBbcm9sZXNwZXJtaXNzaW9uPy5mZWF0dXJlTmFtZV0sXHJcbiAgICAgICAgbW9kdWxlczogdGhpcy5mYi5hcnJheShbXSksICAvLyBJbml0aWFsaXplIG1vZHVsZXMgYXMgYSBGb3JtQXJyYXlcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBtb2R1bGVzQXJyYXkgPSBmZWF0dXJlR3JvdXAuZ2V0KFwibW9kdWxlc1wiKSBhcyBGb3JtQXJyYXk7XHJcbiAgICAgIHJvbGVzcGVybWlzc2lvbi5tb2R1bGVzLmZvckVhY2goKG1vZHVsZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgbW9kdWxlR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgIG5hbWU6IFttb2R1bGUubmFtZV0sXHJcbiAgICAgICAgICBpc0FkZDogW3sgdmFsdWU6IG1vZHVsZS5pc0FkZCwgZGlzYWJsZWQ6IHRoaXMudHlwZSA9PT0gJ3ZpZXcnIH1dLCAvLyBTZXQgZGlzYWJsZWQgYmFzZWQgb24gdHlwZVxyXG4gICAgICAgICAgaXNFZGl0OiBbeyB2YWx1ZTogbW9kdWxlLmlzRWRpdCwgZGlzYWJsZWQ6IHRoaXMudHlwZSA9PT0gJ3ZpZXcnIH1dLCAvLyBTZXQgZGlzYWJsZWQgYmFzZWQgb24gdHlwZVxyXG4gICAgICAgICAgLy8gaXNEZWxldGU6IFttb2R1bGUuaXNEZWxldGVdLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG1vZHVsZXNBcnJheS5wdXNoKG1vZHVsZUdyb3VwKTsgIC8vIEFkZCBlYWNoIG1vZHVsZSB0byBtb2R1bGVzIGFycmF5XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcGVybWlzc2lvbnMucHVzaChmZWF0dXJlR3JvdXApOyAgLy8gQWRkIGVhY2ggZmVhdHVyZSBncm91cCB0byBwZXJtaXNzaW9uc1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gVHJpZ2dlciB2YWxpZGF0aW9uIGFmdGVyIHBvcHVsYXRpbmdcclxuICAgIHBlcm1pc3Npb25zLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICB9XHJcblxyXG4gIGdldFBlcm1pc3Npb25zKCk6IEZvcm1BcnJheSB7XHJcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnVzZXJGb3JtLnZhbHVlKVxyXG4gICAgcmV0dXJuIHRoaXMudXNlckZvcm0uZ2V0KFwicm9sZXNwZXJtaXNzaW9uXCIpIGFzIEZvcm1BcnJheTtcclxuXHJcbiAgfVxyXG4gIGdldEZlYXR1cmVQZXJtaXNzaW9ucyhyb2xlc3Blcm1pc3Npb246IEZvcm1Hcm91cCB8IGFueSk6IEZvcm1BcnJheSB7XHJcbiAgICByZXR1cm4gcm9sZXNwZXJtaXNzaW9uLmdldChcIm1vZHVsZXNcIikgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuICBnZXRVc2VyUGVybWlzc2lvbkRhdGEocm9sZU5hbWU6IHN0cmluZywgdXNlclR5cGU6IHN0cmluZykge1xyXG4gICAgKHRoaXMudXNlckZvcm0/LmdldChcInJvbGVzcGVybWlzc2lvblwiKSBhcyBGb3JtQXJyYXkpLmNsZWFyKCk7XHJcbiAgICB0aGlzLnBvcHVsYXRlUGVybWlzc2lvbih0aGlzLnBlcm1pc3Npb25BcnJheSk7XHJcbiAgfVxyXG4gIGNhbWVsQ2FzZVRvVGV4dChpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKC8oW0EtWl0pL2csICcgJDEnKVxyXG4gICAgICAucmVwbGFjZSgvXi4vLCAoc3RyKSA9PiBzdHIudG9VcHBlckNhc2UoKSlcclxuICAgICAgLnRyaW0oKTtcclxuICB9XHJcblxyXG4gIGFkZFVzZXJTdWJtaXQoKSB7XHJcbiAgICBsZXQgdmFsdWUgPSB0aGlzLnVwZGF0ZVBlcm1pc3Npb25zQmFzZWRPblVzZXJUeXBlKHRoaXMudXNlckZvcm0udmFsdWUpXHJcbiAgICBjb25zdCB1cGRhdGVkRGF0YSA9IHRoaXMucmVtb3ZlTnVsbFZhbHVlcyh2YWx1ZSk7XHJcbiAgICB0aGlzLnVzZXJTZXJ2aWNlLmNyZWF0ZVNpbmdsZVVzZXJzKHsgLi4udXBkYXRlZERhdGEsIC4uLnsgY2xpZW50SWQ6IHRoaXMuJGhlYWRlckZpbHRlcnMuY2xpZW50ID8gdGhpcy4kaGVhZGVyRmlsdGVycy5jbGllbnQgOiB0aGlzLnVzZXJfZGF0YS5jbGllbnRJZCB9IH0pLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLnRzLmdldFN1Y2Nlc3NUb2FzdChcIlVzZXIgY3JlYXRlZCBzdWNjZXNzZnVsbHkuXCIpO1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnc3VibWl0Jyk7XHJcbiAgICAgICAgICB0aGlzLmdzLm1hbmFnZVJlZnJlc2hUcmlnZ2VyLm5leHQodHJ1ZSlcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChcIlVuYWJsZSB0byBjcmVhdGUgVXNlciFcIik7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdzdWJtaXQnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3IgPyBlcnI/LmVycm9yPy5lcnJvciA6IFwiVW5hYmxlIHRvIGNyZWF0ZSBVc2VyIVwiKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7IH0sXHJcbiAgICB9KTtcclxuICB9XHJcbiAgb25TdWJtaXQoKSB7XHJcbiAgICBpZiAodGhpcy50eXBlID09IFwiZWRpdFwiKSB7XHJcbiAgICAgIHRoaXMudXNlclVwZGF0ZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hZGRVc2VyU3VibWl0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHVzZXJVcGRhdGUoKSB7XHJcbiAgICB0aGlzLnVzZXJGb3JtLmdldChcImVtYWlsXCIpPy5lbmFibGUoKTtcclxuICAgIGxldCB1c2VyOiBhbnkgPSB0aGlzLnVzZXJGb3JtLnZhbHVlO1xyXG4gICAgdGhpcy51c2VyRm9ybS5nZXQoXCJlbWFpbFwiKT8uZGlzYWJsZSgpO1xyXG4gICAgdGhpcy5zZXJ2aWNlLnVwZGF0ZVVzZXJzKHVzZXIpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLnRzLmdldFN1Y2Nlc3NUb2FzdChcclxuICAgICAgICAgICAgXCJVc2VyIGRldGFpbHMgdXBkYXRlZCBzdWNjZXNzZnVsbHkuXCJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdzdWJtaXQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KFwiVW5hYmxlIHRvIHVwZGF0ZSBVc2VyIVwiKTtcclxuICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yID8gZXJyPy5lcnJvcj8uZXJyb3IgOiBcIlVuYWJsZSB0byB1cGRhdGUgVXNlciFcIik7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgpO1xyXG4gICAgICB9LFxyXG4gICAgICBjb21wbGV0ZTogKCkgPT4geyB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHVwZGF0ZVBlcm1pc3Npb25zQmFzZWRPblVzZXJUeXBlKHVzZXI6IGFueSkge1xyXG4gICAgdXNlci5yb2xlc3Blcm1pc3Npb24uZm9yRWFjaCgoZmVhdHVyZTogYW55KSA9PiB7XHJcbiAgICAgIGZlYXR1cmUubW9kdWxlcy5mb3JFYWNoKChtb2R1bGVzOiBhbnkpID0+IHtcclxuICAgICAgICAvLyBpZiAodXNlci51c2VyVHlwZSA9PT0gXCJzdXBlckFkbWluXCIpIHtcclxuICAgICAgICAvLyAgIG1vZHVsZXMuaXNBZGQgPSB0cnVlO1xyXG4gICAgICAgIC8vICAgbW9kdWxlcy5pc0VkaXQgPSB0cnVlO1xyXG4gICAgICAgIC8vICAgLy8gbW9kdWxlcy5pc0RlbGV0ZSA9IHRydWU7XHJcbiAgICAgICAgLy8gfSBlbHNlIFxyXG4gICAgICAgIGlmICh1c2VyLnVzZXJUeXBlID09PSBcInVzZXJzXCIpIHtcclxuICAgICAgICAgIG1vZHVsZXMuaXNBZGQgPSBmYWxzZTtcclxuICAgICAgICAgIG1vZHVsZXMuaXNFZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAvLyBtb2R1bGVzLmlzRGVsZXRlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHVzZXI7XHJcbiAgfVxyXG4gIHJlbW92ZU51bGxWYWx1ZXMgPSAoZGF0YTogYW55KSA9PiB7XHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YS5yb2xlc3Blcm1pc3Npb24pKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlBlcm1pc3Npb24gaXMgbm90IGFuIGFycmF5XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE1hcCB0aHJvdWdoIHRoZSBwZXJtaXNzaW9ucyBhbmQgcHJvZHVjdHMgdG8gcmVtb3ZlIG51bGwgdmFsdWVzXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5kYXRhLFxyXG4gICAgICByb2xlc3Blcm1pc3Npb246IGRhdGEucm9sZXNwZXJtaXNzaW9uLm1hcCgoZmVhdHVyZTogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLmZlYXR1cmUsXHJcbiAgICAgICAgICBtb2R1bGVzOiBmZWF0dXJlLm1vZHVsZXMubWFwKChtb2R1bGVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbmV3UHJvZHVjdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtb2R1bGVzKSkge1xyXG4gICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgbmV3UHJvZHVjdFtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuZXdQcm9kdWN0O1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9O1xyXG4gICAgICB9KVxyXG4gICAgfTtcclxuICB9O1xyXG4gIGdldEFsbFRlYW1zTGlzdCgpIHtcclxuICAgIHRoaXMuc2VydmljZS5nZXRBbGxUZWFtc0xpc3QoeyBjbGllbnRJZDogdGhpcy4kaGVhZGVyRmlsdGVycy5jbGllbnQgfSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95KSkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMudGVhbUxpc3QgPSByZXMuZGF0YS5yZXN1bHRcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgfVxyXG4gIGVkaXRVc2VyKCkge1xyXG4gICAgaWYgKHRoaXMudXNlcj8uaXNBY3RpdmUpIHtcclxuICAgICAgdGhpcy50eXBlID0gXCJlZGl0XCI7XHJcbiAgICAgIHRoaXMudXNlckZvcm0uZW5hYmxlKCk7XHJcbiAgICAgIHRoaXMudXNlckZvcm0uZ2V0KFwiZW1haWxcIik/LmRpc2FibGUoKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy51c2VyPy5zdGF0dXMgPT09ICdhY3RpdmUnKSB7XHJcbiAgICAgIHRoaXMudHlwZSA9IFwidmlld1wiO1xyXG4gICAgICB0aGlzLnVzZXJGb3JtLmVuYWJsZSgpO1xyXG4gICAgICB0aGlzLnVzZXJGb3JtLmdldChcImVtYWlsXCIpPy5kaXNhYmxlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlzQnV0dG9uRGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB7IHRlYW1MZWFkLCAuLi5jb250cm9sc1RvQ2hlY2sgfSA9IHRoaXMudXNlckZvcm0uY29udHJvbHM7XHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhjb250cm9sc1RvQ2hlY2spLnNvbWUoY29udHJvbCA9PiBjb250cm9sLmludmFsaWQpO1xyXG4gIH1cclxuICBzZXRUZWFtTGVhZHModGVhbUxpc3Q6IGFueVtdKSB7XHJcbiAgICBjb25zdCB0ZWFtTGVhZEFycmF5ID0gdGhpcy51c2VyRm9ybS5nZXQoJ3RlYW1MZWFkJykgYXMgRm9ybUFycmF5O1xyXG4gICAgdGVhbUxpc3QuZm9yRWFjaCh0ZWFtID0+IHtcclxuICAgICAgLy8gUHVzaCBlYWNoIHRlYW0gb2JqZWN0IGFzIGEgbmV3IEZvcm1Hcm91cCBpbnRvIHRoZSB0ZWFtTGVhZCBGb3JtQXJyYXlcclxuICAgICAgaWYgKHRlYW0uY2xpZW50SWQpIHtcclxuICAgICAgICB0ZWFtTGVhZEFycmF5LnB1c2godGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICBfaWQ6IG5ldyBGb3JtQ29udHJvbCh0ZWFtLl9pZCksXHJcbiAgICAgICAgICBjbGllbnRJZDogbmV3IEZvcm1Db250cm9sKHRlYW0uY2xpZW50SWQpLFxyXG4gICAgICAgICAgdGVhbU5hbWU6IG5ldyBGb3JtQ29udHJvbCh0ZWFtLnRlYW1OYW1lKSxcclxuICAgICAgICAgIHVzZXJzQ291bnQ6IG5ldyBGb3JtQ29udHJvbCh0ZWFtLnVzZXJzQ291bnQpXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG59IiwiPGRpdiBjbGFzcz1cImNhcmQgcHQtMCBwYi0zIHNjcm9sbFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcHktMCBkLWZsZXggZmxleC1zdGFydCBmbGV4LWNvbHVtbiBwLTkgXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibXktNSBkLWZsZXhcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInN5bWJvbCBzeW1ib2wtNzVweCBzeW1ib2wtY2lyY2xlXCI+XHJcbiAgICAgICAgPGltZyBhbHQ9XCJQaWNcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9hZGQtc3RvcmUtaWNvbi5zdmdcIj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwXCI+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJ0eXBlIT09J3ZpZXcnICYmIHR5cGUhPT0nZWRpdCdcIiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgIDxhIGNsYXNzPVwiZnMtNCB0ZXh0LWdyYXktODAwIHRleHQtaG92ZXItcHJpbWFyeSBmdy1ib2xkIG1iLTAgdGl0bGUgY3Vyc29yLXBvaW50ZXJcIj5BZGRcclxuICAgICAgICAgIFVzZXI8L2E+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi10aXRsZVwiPlBsZWFzZSBhZGQgeW91ciB1c2VyIGRldGFpbHM8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDwhLS0gPGRpdiAqbmdJZj1cInR5cGU9PT0nZWRpdCdcIiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJmcy00IHRleHQtZ3JheS04MDAgdGV4dC1ob3Zlci1wcmltYXJ5IGZ3LWJvbGQgbWItMCB0aXRsZSBjdXJzb3ItcG9pbnRlclwiPkVkaXQgVXNlciBEZXRhaWxzPC9hPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi10aXRsZVwiPlBsZWFzZSBFZGl0IHlvdXIgdXNlciBkZXRhaWxzPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgPGRpdiAqbmdJZj1cInR5cGU9PT0ndmlldycgJiYgdHlwZSAhPT0nZWRpdCdcIiBjbGFzcz1cImNvbC1tZC05XCI+XHJcbiAgICAgICAgPGEgY2xhc3M9XCJmcy00IHRleHQtZ3JheS04MDAgdGV4dC1ob3Zlci1wcmltYXJ5IGZ3LWJvbGQgbWItMCB0aXRsZSBjdXJzb3ItcG9pbnRlclwiPlVzZXIgRGV0YWlsczwvYT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLXRpdGxlXCI+VmlldyB5b3VyIHVzZXIgZGV0YWlsczwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9wZXJhdGlvblR5cGUhPT0ndmlldydcIj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAqbmdJZj1cIihncy51c2VyQWNjZXNzIHxhc3luYyk/Lkdsb2JhbF9Vc2VyX2lzRWRpdCAmJiB0eXBlID09PSd2aWV3JyAgJiYgdHlwZSAhPT0nZWRpdCcgJiYgdXNlcj8ucm9sZSAhPT0gJ3N1cGVyYWRtaW4nXCJcclxuICAgICAgICAgIGNsYXNzPVwiY29sLW1kLTMgdGV4dC1lbmQgcHgtMFwiIChjbGljayk9XCJlZGl0VXNlcigpXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCI+PHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCJcclxuICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzM4MzNfODU5MDgpXCI+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICBkPVwiTTkuMTY2MDIgMy4zMzMySDMuMzMyNjhDMi44OTA2NSAzLjMzMzIgMi40NjY3MyAzLjUwODc5IDIuMTU0MTcgMy44MjEzNUMxLjg0MTYxIDQuMTMzOTEgMS42NjYwMiA0LjU1Nzg0IDEuNjY2MDIgNC45OTk4NlYxNi42NjY1QzEuNjY2MDIgMTcuMTA4NiAxLjg0MTYxIDE3LjUzMjUgMi4xNTQxNyAxNy44NDVDMi40NjY3MyAxOC4xNTc2IDIuODkwNjUgMTguMzMzMiAzLjMzMjY4IDE4LjMzMzJIMTQuOTk5M0MxNS40NDE0IDE4LjMzMzIgMTUuODY1MyAxOC4xNTc2IDE2LjE3NzkgMTcuODQ1QzE2LjQ5MDQgMTcuNTMyNSAxNi42NjYgMTcuMTA4NiAxNi42NjYgMTYuNjY2NVYxMC44MzMyTTE1LjQxNiAyLjA4MzJDMTUuNzQ3NSAxLjc1MTY4IDE2LjE5NzIgMS41NjU0MyAxNi42NjYgMS41NjU0M0MxNy4xMzQ5IDEuNTY1NDMgMTcuNTg0NSAxLjc1MTY4IDE3LjkxNiAyLjA4MzJDMTguMjQ3NSAyLjQxNDcyIDE4LjQzMzggMi44NjQzNiAxOC40MzM4IDMuMzMzMkMxOC40MzM4IDMuODAyMDQgMTguMjQ3NSA0LjI1MTY4IDE3LjkxNiA0LjU4MzJMOS45OTkzNSAxMi40OTk5TDYuNjY2MDIgMTMuMzMzMkw3LjQ5OTM1IDkuOTk5ODZMMTUuNDE2IDIuMDgzMlpcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMzgzM184NTkwOFwiPlxyXG4gICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgIDwvc3ZnPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPGRpdiAqbmdJZj1cInR5cGU9PT0nZWRpdCcgICYmIHR5cGUgIT09J3ZpZXcnXCIgY2xhc3M9XCJjb2wtbWQtOVwiPlxyXG4gICAgICAgIDxhIGNsYXNzPVwiZnMtNCB0ZXh0LWdyYXktODAwIHRleHQtaG92ZXItcHJpbWFyeSBmdy1ib2xkIG1iLTAgdGl0bGUgY3Vyc29yLXBvaW50ZXJcIj5Vc2VyIERldGFpbHM8L2E+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi10aXRsZVwiPkVkaXQgeW91ciB1c2VyIGRldGFpbHM8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBoLTBweCBzY3JvbGxcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNVwiICpuZ0lmPVwidXNlckZvcm1cIj5cclxuICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwidXNlckZvcm1cIiBub3ZhbGlkYXRlPVwibm92YWxpZGF0ZVwiIGNsYXNzPVwiXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgcHgtMCBtZS0zXCI+XHJcbiAgICAgICAgICAgICAgPCEtLSBVc2VyIE5hbWUgRmllbGQgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBjb2wteGwtNiBjb2wteHhsLTYgbWItN1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInVzZXJuYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+VXNlciBOYW1lIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhbGVydC1yZXF1aXJlZCB0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJ1c2VybmFtZVwiIGZvcm1Db250cm9sTmFtZT1cInVzZXJOYW1lXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidXNlckZvcm0uZ2V0KCd1c2VyTmFtZScpPy5pbnZhbGlkICYmICh1c2VyRm9ybS5nZXQoJ3VzZXJOYW1lJyk/LmRpcnR5KVwiIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwidXNlckZvcm0uZ2V0KCd1c2VyTmFtZScpPy5lcnJvcnM/LlsncmVxdWlyZWQnXVwiPlVzZXIgTmFtZSBpcyByZXF1aXJlZC48L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gRW1haWwgRmllbGQgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBjb2wteGwtNiBjb2wteHhsLTYgbWItN1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVtYWlsXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+RW1haWwgPHNwYW4gY2xhc3M9XCJhbGVydC1yZXF1aXJlZCB0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZW1haWxcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZW1haWxcIiBmb3JtQ29udHJvbE5hbWU9XCJlbWFpbFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVzZXJGb3JtLmdldCgnZW1haWwnKT8uaW52YWxpZCAmJiB1c2VyRm9ybS5nZXQoJ2VtYWlsJyk/LnRvdWNoZWRcIiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInVzZXJGb3JtLmdldCgnZW1haWwnKT8uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cIj5FbWFpbCBpcyByZXF1aXJlZC48L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICA8c21hbGwgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ2VtYWlsJyk/LmVycm9ycz8uWydwYXR0ZXJuJ11cIj5JbnZhbGlkIGVtYWlsIGZvcm1hdC48L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gQ29udGFjdCBOdW1iZXIgRmllbGQgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBjb2wteGwtNiBjb2wteHhsLTYgbWItN1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNvbnRhY3RcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Db250YWN0IE51bWJlciA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWxlcnQtcmVxdWlyZWQgdGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTQgY29sLXhsLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgcHMtMyBwZS04XCIgaWQ9XCJpbnB1dEdyb3VwU2VsZWN0MDFcIiBmb3JtQ29udHJvbE5hbWU9XCJjb3VudHJ5Q29kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgY291bnRyeSBvZiBjb3VudHJ5TGlzdFwiIFt2YWx1ZV09XCJjb3VudHJ5LnBob25lY29kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e2NvdW50cnkubmFtZX19ICh7e2NvdW50cnkucGhvbmVjb2RlfX0pXHJcbiAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTggY29sLXhsLThcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIChrZXlwcmVzcyk9XCJvbWl0X3NwZWNpYWxfY2hhcigkZXZlbnQpXCIgaWQ9XCJtb2JpbGVOdW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCIgZm9ybUNvbnRyb2xOYW1lPVwibW9iaWxlTnVtYmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVzZXJGb3JtLmdldCgnbW9iaWxlTnVtYmVyJyk/LmludmFsaWQgJiYgdXNlckZvcm0uZ2V0KCdtb2JpbGVOdW1iZXInKT8udG91Y2hlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ21vYmlsZU51bWJlcicpPy5lcnJvcnM/LlsncmVxdWlyZWQnXVwiPkNvbnRhY3QgTnVtYmVyIGlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkLjwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ21vYmlsZU51bWJlcicpPy5lcnJvcnM/LlsnbWlubGVuZ3RoJ11cIj5Db250YWN0IE51bWJlciBtdXN0IGJlIGF0IGxlYXN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDEwIGRpZ2l0cy48L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwidXNlckZvcm0uZ2V0KCdtb2JpbGVOdW1iZXInKT8uZXJyb3JzPy5bJ21heGxlbmd0aCddXCI+Q29udGFjdCBOdW1iZXIgY2Fubm90IGV4Y2VlZCAxM1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMuPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBSb2xlIEZpZWxkIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgY29sLXhsLTYgY29sLXh4bC02IG1iLTdcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJyb2xlXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+Um9sZSA8c3BhbiBjbGFzcz1cImFsZXJ0LXJlcXVpcmVkIHRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgZm9ybUNvbnRyb2xOYW1lPVwicm9sZVwiIChjaGFuZ2UpPVwib25Sb2xlQ2hhbmdlKHVzZXJGb3JtLmdldCgncm9sZScpPy52YWx1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFkbWluXCI+QWRtaW48L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInVzZXJcIj5Vc2VyPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ3JvbGUnKT8uaW52YWxpZCAmJiB1c2VyRm9ybS5nZXQoJ3JvbGUnKT8udG91Y2hlZFwiIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwidXNlckZvcm0uZ2V0KCdyb2xlJyk/LmVycm9ycz8uWydyZXF1aXJlZCddXCI+Um9sZSBpcyByZXF1aXJlZC48L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gVXNlciBUeXBlIEZpZWxkIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0aGlzLnVzZXJUeXBlID09PSd0YW5nbydcIiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBjb2wteGwtNiBjb2wteHhsLTYgbWItN1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInRhbmdvVXNlclR5cGVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Vc2VyIFR5cGUgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFsZXJ0LXJlcXVpcmVkIHRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgZm9ybUNvbnRyb2xOYW1lPVwidGFuZ29Vc2VyVHlwZVwiXHJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25Sb2xlQ2hhbmdlKHVzZXJGb3JtLmdldCgndGFuZ29Vc2VyVHlwZScpPy52YWx1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImRhc2hib2FyZFwiPkRhc2hib2FyZDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYXVkaXRcIj5BdWRpdDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidXNlckZvcm0uZ2V0KCd0YW5nb1VzZXJUeXBlJyk/LmludmFsaWQgJiYgdXNlckZvcm0uZ2V0KCd0YW5nb1VzZXJUeXBlJyk/LnRvdWNoZWRcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInVzZXJGb3JtLmdldCgndGFuZ29Vc2VyVHlwZScpPy5lcnJvcnM/LlsncmVxdWlyZWQnXVwiPlVzZXIgVHlwZSBpcyByZXF1aXJlZC48L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gQWRkIHRvIFRlYW0gRmllbGQgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctMTIgY29sLXhsLTEyIGNvbC14eGwtMTIgbWItNVwiICpuZ0lmPVwidGhpcy51c2VyVHlwZSAhPT0ndGFuZ28nXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidGVhbUxlYWRcIiBjbGFzcz1cImZvcm0tbGFiZWwgdGVhbXMtdGl0bGVcIj5BZGQgdG8gYSB0ZWFtPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDx0ZWFtLXNlbGVjdCBbaXRlbXNdPVwidGVhbUxpc3RcIiBbbXVsdGldPVwidHJ1ZVwiIFtzZWFyY2hGaWVsZF09XCIndGVhbU5hbWUnXCIgW2lkRmllbGRdPVwiJ19pZCdcIlxyXG4gICAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwib25TdG9yZVNlbGVjdCgkZXZlbnQpXCIgW3NlbGVjdGVkVmFsdWVzXT1cInNlbGVjdGVkVXNlclwiPjwvdGVhbS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVzZXJGb3JtLmdldCgncm9sZScpPy52YWx1ZSA9PT0gJ2FkbWluJ1wiPlxyXG5cclxuICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJ0ZWFtcy10aXRsZVwiICpuZ0lmPVwiZ2V0UGVybWlzc2lvbnMoKS5sZW5ndGhcIj5BY2Nlc3MgZm9yIEFkbWluPC9oMz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0UGVybWlzc2lvbnMoKS5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgZm9ybUFycmF5TmFtZT1cInJvbGVzcGVybWlzc2lvblwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCByb2xlc3Blcm1pc3Npb24gb2YgZ2V0UGVybWlzc2lvbnMoKS5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlIG15LTIgbWUtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGUtaGVhZGVyIG10LTQgbXMtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNhbWVsQ2FzZVRvVGV4dChyb2xlc3Blcm1pc3Npb24uZ2V0KCdmZWF0dXJlTmFtZScpPy52YWx1ZSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb2xlc3Blcm1pc3Npb24uZ2V0KCdtb2R1bGVzJylcIiBmb3JtQXJyYXlOYW1lPVwibW9kdWxlc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG1vZHVsZXMgb2YgZ2V0RmVhdHVyZVBlcm1pc3Npb25zKHJvbGVzcGVybWlzc2lvbik/LmNvbnRyb2xzOyBsZXQgaiA9IGluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJqXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwicm9sZXNwZXJtaXNzaW9uLmdldCgnZmVhdHVyZU5hbWUnKT8udmFsdWUgIT09ICdUYW5nb0FkbWluJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInctNTBcIj57eyBjYW1lbENhc2VUb1RleHQobW9kdWxlcy5nZXQoJ25hbWUnKT8udmFsdWUpIH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LXN0YXJ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1pbmxpbmUtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGZvcm1Db250cm9sTmFtZT1cImlzQWRkXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJoYW5kbGVWaWV3Q2hhbmdlKG1vZHVsZXMpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImdsb2JhbC1sYWJlbCBtcy0yIG10LWF1dG9cIj5BZGQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LXN0YXJ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1pbmxpbmUtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cImlzRWRpdFwiIHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlRWRpdENoYW5nZShtb2R1bGVzKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJnbG9iYWwtbGFiZWwgbXMtMiBtdC1hdXRvXCI+RWRpdDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJvbGVzcGVybWlzc2lvbi5nZXQoJ2ZlYXR1cmVOYW1lJyk/LnZhbHVlID09PSAnVGFuZ29BZG1pbidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm93IHctMTAwIHRleHQtbm93cmFwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBtb2R1bGVzIG9mIGdldEZlYXR1cmVQZXJtaXNzaW9ucyhyb2xlc3Blcm1pc3Npb24pPy5jb250cm9sczsgbGV0IGogPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJqXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1pbmxpbmUtZmxleCBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgZm9ybUNvbnRyb2xOYW1lPVwiaXNFZGl0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImdsb2JhbC1sYWJlbCBtYi01IG14LTIgbXQtMVwiIHN0eWxlPVwidGV4dC13cmFwOm5vd3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNhbWVsQ2FzZVRvVGV4dChtb2R1bGVzLmdldCgnbmFtZScpPy52YWx1ZSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0eXBlIT09J3ZpZXcnXCIgY2xhc3M9XCJkLWZsZXggbXktMTBcIiByb2xlPVwiZ3JvdXBcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHctMTAwIG1lLTNcIiAoY2xpY2spPVwiY2FuY2VsKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMTAwIG1zLTNcIiBpZD1cImFsZXJ0LXRvYXN0XCIgKGNsaWNrKT1cIm9uU3VibWl0KClcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInVzZXJGb3JtLmludmFsaWQgfHwgdHlwZSA9PT0gJ3ZpZXcnXCI+U3VibWl0PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PiJdfQ==
|
|
445
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXVzZXJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS11c2Vycy9zcmMvbGliL2NvbXBvbmVudHMtdjIvYWRkLXVzZXJzL2FkZC11c2Vycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2UtdXNlcnMvc3JjL2xpYi9jb21wb25lbnRzLXYyL2FkZC11c2Vycy9hZGQtdXNlcnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUN2RixPQUFPLEVBQUUsT0FBTyxFQUFnQixTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHeEQsT0FBTyxFQUEwQixXQUFXLEVBQWEsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7QUFTNUYsTUFBTSxPQUFPLGlCQUFpQjtJQThEUjtJQUNWO0lBQ0Q7SUFDQztJQUNBO0lBQ0E7SUFDRDtJQW5FUSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUNoQyxJQUFJLENBQU07SUFDVixJQUFJLENBQU07SUFDVixRQUFRLENBQU07SUFDZCxJQUFJLENBQU07SUFDbkIsUUFBUSxDQUFZO0lBQ3BCLGFBQWEsR0FBVyxLQUFLLENBQUM7SUFDOUIsUUFBUSxHQUFRLEVBQUUsQ0FBQTtJQUNsQixXQUFXLENBQU07SUFDakIsWUFBWSxHQUFRLEVBQUUsQ0FBQztJQUN2QixVQUFVLEdBQVcsa0JBQWtCLENBQUM7SUFDeEMsVUFBVSxHQUFXLDRCQUE0QixDQUFDO0lBQ2xELFNBQVMsQ0FBTTtJQUNmLGNBQWMsQ0FBTTtJQUNILFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQzFDLGVBQWUsR0FBRztRQUNoQjtZQUNFLFdBQVcsRUFBRSxRQUFR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O29CQUN4QyxRQUFRLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztvQkFDeEMsVUFBVSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7aUJBQzdDLENBQUMsQ0FBQyxDQUFDO2FBQ0w7UUFFSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBamJVLGlCQUFpQjs0RkFBakIsaUJBQWlCLGlJQ2I5QixnaWJBeUtVOzs0RkQ1SkcsaUJBQWlCO2tCQUw3QixTQUFTOytCQUNFLGVBQWU7b1FBTWhCLElBQUk7c0JBQVosS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0YWtlVW50aWwgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBNYW5hZ2VVc2Vyc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy12Mi9tYW5hZ2UtdXNlcnMuc2VydmljZSc7XHJcbmltcG9ydCB7IE5nYkFjdGl2ZU1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3VzZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItYWRkLXVzZXJzJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYWRkLXVzZXJzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vYWRkLXVzZXJzLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQWRkVXNlcnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uSW5pdCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95ID0gbmV3IFN1YmplY3QoKTtcclxuICBASW5wdXQoKSB0eXBlOiBhbnk7XHJcbiAgQElucHV0KCkgdXNlcjogYW55O1xyXG4gIEBJbnB1dCgpIHVzZXJUeXBlOiBhbnk7XHJcbiAgQElucHV0KCkgZGF0YTogYW55O1xyXG4gIHVzZXJGb3JtOiBGb3JtR3JvdXA7XHJcbiAgb3BlcmF0aW9uVHlwZTogc3RyaW5nID0gJ2FkZCc7XHJcbiAgdGVhbUxpc3Q6IGFueSA9IFtdXHJcbiAgY291bnRyeUxpc3Q6IGFueTtcclxuICBzZWxlY3RlZFVzZXI6IGFueSA9IFtdO1xyXG4gIHBob25lUmVnZXg6IFJlZ0V4cCA9IC9eKFxcZHszfSk/XFxkezE1fSQvO1xyXG4gIGVtYWlsUmVnZXg6IFJlZ0V4cCA9IC9eW15cXHNAXStAW15cXHNAXStcXC5bXlxcc0BdKyQvO1xyXG4gIHVzZXJfZGF0YTogYW55O1xyXG4gICRoZWFkZXJGaWx0ZXJzOiBhbnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgcGVybWlzc2lvbkFycmF5ID0gW1xyXG4gICAge1xyXG4gICAgICBmZWF0dXJlTmFtZTogXCJHbG9iYWxcIixcclxuICAgICAgbW9kdWxlczogW1xyXG4gICAgICAgIHsgbmFtZTogXCJTdG9yZVwiLCBpc0FkZDogZmFsc2UsIGlzRWRpdDogZmFsc2UgfSxcclxuICAgICAgICB7IG5hbWU6IFwiVXNlclwiLCBpc0FkZDogZmFsc2UsIGlzRWRpdDogZmFsc2UgfSxcclxuICAgICAgICB7IG5hbWU6IFwiQ2FtZXJhXCIsIGlzQWRkOiBmYWxzZSwgaXNFZGl0OiBmYWxzZSB9LFxyXG4gICAgICAgIHsgbmFtZTogXCJDb25maWd1cmF0aW9uXCIsIGlzQWRkOiBmYWxzZSwgaXNFZGl0OiBmYWxzZSB9LFxyXG4gICAgICAgIHsgbmFtZTogXCJTdWJzY3JpcHRpb25cIiwgaXNBZGQ6IGZhbHNlLCBpc0VkaXQ6IGZhbHNlIH0sXHJcbiAgICAgICAgeyBuYW1lOiBcIkJpbGxpbmdcIiwgaXNBZGQ6IGZhbHNlLCBpc0VkaXQ6IGZhbHNlIH0sXHJcbiAgICAgIF1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGZlYXR1cmVOYW1lOiBcIlRhbmdvRXllXCIsXHJcbiAgICAgIG1vZHVsZXM6IFtcclxuXHJcbiAgICAgICAgeyBuYW1lOiBcIlpvbmVUYWdcIiwgaXNBZGQ6IGZhbHNlLCBpc0VkaXQ6IGZhbHNlIH0sXHJcbiAgICAgIF1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGZlYXR1cmVOYW1lOiBcIlRhbmdvVHJheFwiLFxyXG4gICAgICBtb2R1bGVzOiBbXHJcbiAgICAgICAgeyBuYW1lOiBcImNoZWNrbGlzdFwiLCBpc0FkZDogZmFsc2UsIGlzRWRpdDogZmFsc2UgfSxcclxuICAgICAgICB7IG5hbWU6IFwiVGFza1wiLCBpc0FkZDogZmFsc2UsIGlzRWRpdDogZmFsc2UgfSxcclxuICAgICAgXVxyXG4gICAgfSxcclxuXHJcbiAgXTtcclxuXHJcbiAgaGFuZGxlVmlld0NoYW5nZShtb2R1bGVzOiBGb3JtR3JvdXAgfCBhbnkpOiB2b2lkIHtcclxuICAgIGlmICghbW9kdWxlcy5nZXQoXCJpc0FkZFwiKT8udmFsdWUpIHtcclxuICAgICAgbW9kdWxlcy5nZXQoXCJpc0RlbGV0ZVwiKT8uc2V0VmFsdWUoZmFsc2UpO1xyXG4gICAgICBtb2R1bGVzLmdldChcImlzRWRpdFwiKT8uc2V0VmFsdWUoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuICBoYW5kbGVFZGl0Q2hhbmdlKG1vZHVsZXM6IEZvcm1Hcm91cCB8IGFueSk6IHZvaWQge1xyXG4gICAgLy8gaWYgKCFtb2R1bGVzLmdldChcImlzQWRkXCIpPy52YWx1ZSkge1xyXG4gICAgLy8gICBtb2R1bGVzLmdldChcImlzRGVsZXRlXCIpPy5zZXRWYWx1ZShmYWxzZSk7XHJcbiAgICAvLyAgIG1vZHVsZXMuZ2V0KFwiaXNFZGl0XCIpPy5zZXRWYWx1ZShmYWxzZSk7XHJcbiAgICAvLyB9XHJcbiAgICBpZiAoIW1vZHVsZXMuZ2V0KFwiaXNFZGl0XCIpPy52YWx1ZSkge1xyXG4gICAgICAvLyBtb2R1bGVzLmdldCgnaXNEb3dubG9hZCcpPy5zZXRWYWx1ZShmYWxzZSk7XHJcbiAgICAgIG1vZHVsZXMuZ2V0KFwiaXNEZWxldGVcIik/LnNldFZhbHVlKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc2VydmljZTogTWFuYWdlVXNlcnNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwdWJsaWMgYWN0aXZlTW9kYWw6IE5nYkFjdGl2ZU1vZGFsLFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgdHM6IFRvYXN0U2VydmljZSxcclxuICAgIHB1YmxpYyBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICkge1xyXG5cclxuICB9XHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5kZXN0cm95Lm5leHQoZmFsc2UpO1xyXG4gICAgdGhpcy5kZXN0cm95LmNvbXBsZXRlKCk7XHJcblxyXG4gIH1cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMudHlwZSlcclxuICAgIGxldCBkYXRhOiBhbnk7XHJcbiAgICBpZiAoXCJoZWFkZXItZmlsdGVyc1wiIGluIGxvY2FsU3RvcmFnZSkge1xyXG4gICAgICBkYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnKSB8fCAnJyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVzZXJfZGF0YSA9IEpTT04/LnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyLWluZm8nKSB8fCAnJyk7XHJcbiAgICB0aGlzLiRoZWFkZXJGaWx0ZXJzID0gZGF0YSA/IGRhdGEgOiB0aGlzLnVzZXJfZGF0YTtcclxuICAgIHRoaXMuZ2V0Q291bnRyeUNvZGVzKCk7XHJcbiAgICB0aGlzLmdldFJvbGVzKCk7XHJcbiAgICB0aGlzLmdldEFsbFRlYW1zTGlzdCgpXHJcbiAgICBpZiAodGhpcy50eXBlID09PSBcInZpZXdcIiB8fCAodGhpcy50eXBlID09PSBcImVkaXRcIikpIHtcclxuICAgICAgLy8gdGhpcy5hZGRTaW5nbGVVc2VyKCk7XHJcbiAgICAgIHRoaXMubG9hZFVzZXJGb3JtKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmluaXRVc2VyRm9ybSgpO1xyXG4gICAgICAvLyB0aGlzLmdldEFsbFRlYW1zTGlzdCgpXHJcbiAgICAgIC8vIHRoaXMuc2hvd3NpbmdsZXVzZXIgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBnZXRSb2xlcygpIHtcclxuICAgIGlmICh0aGlzLnVzZXJUeXBlID09PSAndGFuZ28nKSB7XHJcbiAgICAgIHRoaXMucGVybWlzc2lvbkFycmF5LnB1c2goe1xyXG4gICAgICAgIGZlYXR1cmVOYW1lOiBcIlRhbmdvQWRtaW5cIixcclxuICAgICAgICBtb2R1bGVzOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiaW52b2ljZUFwcHJvdmFsXCIsIGlzQWRkOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNFZGl0OiBmYWxzZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogXCJFZGl0QmlsbGluZ1wiLCBpc0FkZDogZmFsc2UsXHJcbiAgICAgICAgICAgIGlzRWRpdDogZmFsc2VcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiVGlja2V0Q29uZmlndXJhdGlvblwiLCBpc0FkZDogZmFsc2UsXHJcbiAgICAgICAgICAgIGlzRWRpdDogZmFsc2VcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiUmVwb3J0c1wiLCBpc0FkZDogZmFsc2UsXHJcbiAgICAgICAgICAgIGlzRWRpdDogZmFsc2VcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXVxyXG4gICAgICB9LClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9taXRfc3BlY2lhbF9jaGFyKGV2ZW50OiBhbnkpIHtcclxuICAgIHZhciBrO1xyXG4gICAgayA9IGV2ZW50LmNoYXJDb2RlO1xyXG4gICAgcmV0dXJuIGsgPT0gOCB8fCBrID09IDMyIHx8IChrID49IDQ4ICYmIGsgPD0gNTcpO1xyXG4gIH1cclxuXHJcbiAgb25Sb2xlQ2hhbmdlKHJvbGU6IHN0cmluZykge1xyXG4gICAgdGhpcy5nZXRVc2VyUGVybWlzc2lvbkRhdGEocm9sZSwgdGhpcy51c2VyX2RhdGEudXNlclR5cGUpO1xyXG4gIH1cclxuICBnZXRDb3VudHJ5Q29kZXMoKSB7XHJcbiAgICB0aGlzLnNlcnZpY2UuZ2V0QWxsQ291bnRyaWVzKCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlcykgPT4ge1xyXG4gICAgICAgIHRoaXMuY291bnRyeUxpc3QgPSByZXMuZGF0YVxyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcblxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuICBvbnJvbGVjaGFuZ2UoZXZlbnQ6IGFueSkge1xyXG4gICAgY29uc29sZS5sb2coZXZlbnQudGFyZ2V0LnZhbHVlKVxyXG4gICAgaWYgKGV2ZW50LnRhcmdldC52YWx1ZSA9PT0gJ3VzZXInKSB7XHJcbiAgICAgIHRoaXMucG9wdWxhdGVQZXJtaXNzaW9uKHRoaXMucGVybWlzc2lvbkFycmF5KTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG4gIG9uU3RvcmVTZWxlY3QoZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFVzZXIgPSBldmVudFxyXG4gICAgY29uc3QgdGVhbUxlYWRBcnJheSA9IHRoaXMudXNlckZvcm0uZ2V0KCd0ZWFtTGVhZCcpIGFzIEZvcm1BcnJheTtcclxuICAgIHRlYW1MZWFkQXJyYXkuY2xlYXIoKTsgLy8gQ2xlYXJzIGV4aXN0aW5nIHZhbHVlc1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRVc2VyLmZvckVhY2goKHVzZXI6IGFueSkgPT4ge1xyXG4gICAgICB0ZWFtTGVhZEFycmF5LnB1c2gobmV3IEZvcm1Db250cm9sKHVzZXIpKTsgLy8gQWRkcyBlYWNoIHVzZXIgaW4gc2VsZWN0ZWRVc2VyIGFycmF5XHJcbiAgICB9KTtcclxuICAgIDtcclxuICAgIC8vIHRoaXMuc2V0VGVhbUxlYWRzKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIGNhbmNlbCgpIHtcclxuICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpO1xyXG4gICAgY29uc3QgdHJpZ2dlckJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0cmlnZ2VyQnV0dG9uSWQnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIHRyaWdnZXJCdXR0b24/LmZvY3VzKCk7XHJcbiAgfVxyXG4gIC8vIG9uU3VibWl0KCkge1xyXG4gIC8vICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnc3VibWl0Jyk7XHJcbiAgLy8gfVxyXG4gIGxvYWRVc2VyRm9ybSgpIHtcclxuICAgIHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcih0aGlzLnVzZXIuZW1haWwpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCAmJiByZXMuZGF0YS5yZXN1bHQpIHtcclxuICAgICAgICAgIHRoaXMudXNlckZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgICAgdXNlck5hbWU6IFtyZXMuZGF0YS5yZXN1bHQudXNlck5hbWUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICBlbWFpbDogW3Jlcy5kYXRhLnJlc3VsdC5lbWFpbCwgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICAgICAgICAgIFZhbGlkYXRvcnMucGF0dGVybihcIl5bYS16QS1aMC05XSsoWy4tX10/W2EtekEtWjAtOV0rKSpAW2EtekEtWjAtOV0rKFsuLV9dP1thLXpBLVpdKykqWy5dezF9W2EtekEtWl17Mix9JFwiKSxcclxuICAgICAgICAgIF0pXSxcclxuICAgICAgICAgICAgbW9iaWxlTnVtYmVyOiBbcmVzLmRhdGEucmVzdWx0Lm1vYmlsZU51bWJlciwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDgpLFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEzKV0gXSxcclxuICAgICAgICAgICAgcm9sZTogW3Jlcy5kYXRhLnJlc3VsdC5yb2xlLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgICAgdXNlclR5cGU6IFtyZXMuZGF0YS5yZXN1bHQudXNlclR5cGUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICByb2xlc3Blcm1pc3Npb246IHRoaXMuZmIuYXJyYXkoW10sIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxyXG4gICAgICAgICAgICB0ZWFtTGVhZDogdGhpcy5mYi5hcnJheShbXSksXHJcbiAgICAgICAgICAgIGNvdW50cnlDb2RlOiBbcmVzLmRhdGEucmVzdWx0LmNvdW50cnlDb2RlLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVUYW5nb3VzZXJGaWVsZChyZXMuZGF0YS5yZXN1bHQudGFuZ29Vc2VyVHlwZSk7XHJcbiAgICAgICAgICBpZiAodGhpcy50eXBlID09IFwidmlld1wiKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXNlckZvcm0uZGlzYWJsZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy51c2VyRm9ybS5nZXQoXCJlbWFpbFwiKT8uZGlzYWJsZSgpO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXIgPSByZXMuZGF0YS50ZWFtc0xpc3RcclxuICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkVXNlci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRUZWFtTGVhZHModGhpcy5zZWxlY3RlZFVzZXIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAvLyB0aGlzLnVzZXJGb3JtLmdldCgndGVhbUxlYWQnKT8uc2V0VmFsdWUoKTtcclxuICAgICAgICAgIHRoaXMucG9wdWxhdGVQZXJtaXNzaW9uKHJlcz8uZGF0YT8ucmVzdWx0Py5yb2xlc3Blcm1pc3Npb24pO1xyXG4gICAgICAgICAgLy8gfSk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9uVHlwZSA9PSBcInZpZXdcIikge1xyXG4gICAgICAgICAgICB0aGlzLnVzZXJGb3JtLmRpc2FibGUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMudXNlckZvcm0uZ2V0KFwiZW1haWxcIik/LmRpc2FibGUoKTtcclxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgLy8gdGhpcy5nZXRVc2VyUGVybWlzc2lvbkRhdGEocmVzLmRhdGEucmVzdWx0LnJvbGUscmVzLmRhdGEucmVzdWx0LnVzZXJUeXBlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5pbml0VXNlckZvcm0oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5pbml0VXNlckZvcm0oKTtcclxuICAgICAgfSxcclxuICAgICAgY29tcGxldGU6ICgpID0+IHsgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVGFuZ291c2VyRmllbGQodGFuZ29Vc2VyVHlwZTphbnkpIHtcclxuICAgIGlmICh0aGlzLnVzZXJUeXBlID09PSAndGFuZ28nKSB7XHJcbiAgICAgIGlmICghdGhpcy51c2VyRm9ybS5jb250YWlucygndGFuZ29Vc2VyVHlwZScpKSB7XHJcbiAgICAgICAgdGhpcy51c2VyRm9ybS5hZGRDb250cm9sKCd0YW5nb1VzZXJUeXBlJywgdGhpcy5mYi5jb250cm9sKHRhbmdvVXNlclR5cGUgfHwgJ2Rhc2hib2FyZCcsIFZhbGlkYXRvcnMucmVxdWlyZWQpKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMudXNlckZvcm0uY29udGFpbnMoJ3RhbmdvVXNlclR5cGUnKSkge1xyXG4gICAgICAgIHRoaXMudXNlckZvcm0ucmVtb3ZlQ29udHJvbCgndGFuZ29Vc2VyVHlwZScpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbml0VXNlckZvcm0oKSB7XHJcbiAgICB0aGlzLnVzZXJGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHVzZXJOYW1lOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIGVtYWlsOiBbXCJcIiwgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICBWYWxpZGF0b3JzLnBhdHRlcm4oXCJeW2EtekEtWjAtOV0rKFsuLV9dP1thLXpBLVowLTldKykqQFthLXpBLVowLTldKyhbLi1fXT9bYS16QS1aXSspKlsuXXsxfVthLXpBLVpdezIsfSRcIiksXHJcbiAgICAgIF0pXSxcclxuICAgICAgbW9iaWxlTnVtYmVyOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDEwKSwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTUpXV0sXHJcbiAgICAgIHJvbGU6IFtcInVzZXJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHVzZXJUeXBlOiBbdGhpcy51c2VyVHlwZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHJvbGVzcGVybWlzc2lvbjogdGhpcy5mYi5hcnJheShbXSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXHJcbiAgICAgIHRlYW1MZWFkOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgICAgY291bnRyeUNvZGU6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0aGlzLnVzZXJUeXBlID09PSAndGFuZ28nKSB7XHJcbiAgICAgIGlmICghdGhpcy51c2VyRm9ybS5jb250YWlucygndGFuZ29Vc2VyVHlwZScpKSB7XHJcbiAgICAgICAgdGhpcy51c2VyRm9ybS5hZGRDb250cm9sKCd0YW5nb1VzZXJUeXBlJywgdGhpcy5mYi5jb250cm9sKCdkYXNoYm9hcmQnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLnVzZXJGb3JtLmNvbnRhaW5zKCd0YW5nb1VzZXJUeXBlJykpIHtcclxuICAgICAgICB0aGlzLnVzZXJGb3JtLnJlbW92ZUNvbnRyb2woJ3RhbmdvVXNlclR5cGUnKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5nZXRVc2VyUGVybWlzc2lvbkRhdGEoXCJ1c2VyXCIsIHRoaXMudXNlcl9kYXRhLnVzZXJUeXBlKTtcclxuICB9XHJcbiAgcG9wdWxhdGVQZXJtaXNzaW9uKHBlcm1pc3Npb25zRGF0YTogYW55W10pIHtcclxuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gdGhpcy51c2VyRm9ybS5nZXQoXCJyb2xlc3Blcm1pc3Npb25cIikgYXMgRm9ybUFycmF5O1xyXG4gICAgcGVybWlzc2lvbnMuY2xlYXIoKTsgIC8vIENsZWFyIGV4aXN0aW5nIGVudHJpZXNcclxuXHJcbiAgICBwZXJtaXNzaW9uc0RhdGEuZm9yRWFjaCgocm9sZXNwZXJtaXNzaW9uOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgZmVhdHVyZUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgZmVhdHVyZU5hbWU6IFtyb2xlc3Blcm1pc3Npb24/LmZlYXR1cmVOYW1lXSxcclxuICAgICAgICBtb2R1bGVzOiB0aGlzLmZiLmFycmF5KFtdKSwgIC8vIEluaXRpYWxpemUgbW9kdWxlcyBhcyBhIEZvcm1BcnJheVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IG1vZHVsZXNBcnJheSA9IGZlYXR1cmVHcm91cC5nZXQoXCJtb2R1bGVzXCIpIGFzIEZvcm1BcnJheTtcclxuICAgICAgcm9sZXNwZXJtaXNzaW9uLm1vZHVsZXMuZm9yRWFjaCgobW9kdWxlOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBtb2R1bGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgbmFtZTogW21vZHVsZS5uYW1lXSxcclxuICAgICAgICAgIGlzQWRkOiBbeyB2YWx1ZTogbW9kdWxlLmlzQWRkLCBkaXNhYmxlZDogdGhpcy50eXBlID09PSAndmlldycgfV0sIC8vIFNldCBkaXNhYmxlZCBiYXNlZCBvbiB0eXBlXHJcbiAgICAgICAgICBpc0VkaXQ6IFt7IHZhbHVlOiBtb2R1bGUuaXNFZGl0LCBkaXNhYmxlZDogdGhpcy50eXBlID09PSAndmlldycgfV0sIC8vIFNldCBkaXNhYmxlZCBiYXNlZCBvbiB0eXBlXHJcbiAgICAgICAgICAvLyBpc0RlbGV0ZTogW21vZHVsZS5pc0RlbGV0ZV0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbW9kdWxlc0FycmF5LnB1c2gobW9kdWxlR3JvdXApOyAgLy8gQWRkIGVhY2ggbW9kdWxlIHRvIG1vZHVsZXMgYXJyYXlcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBwZXJtaXNzaW9ucy5wdXNoKGZlYXR1cmVHcm91cCk7ICAvLyBBZGQgZWFjaCBmZWF0dXJlIGdyb3VwIHRvIHBlcm1pc3Npb25zXHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBUcmlnZ2VyIHZhbGlkYXRpb24gYWZ0ZXIgcG9wdWxhdGluZ1xyXG4gICAgcGVybWlzc2lvbnMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0UGVybWlzc2lvbnMoKTogRm9ybUFycmF5IHtcclxuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMudXNlckZvcm0udmFsdWUpXHJcbiAgICByZXR1cm4gdGhpcy51c2VyRm9ybS5nZXQoXCJyb2xlc3Blcm1pc3Npb25cIikgYXMgRm9ybUFycmF5O1xyXG5cclxuICB9XHJcbiAgZ2V0RmVhdHVyZVBlcm1pc3Npb25zKHJvbGVzcGVybWlzc2lvbjogRm9ybUdyb3VwIHwgYW55KTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiByb2xlc3Blcm1pc3Npb24uZ2V0KFwibW9kdWxlc1wiKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG4gIGdldFVzZXJQZXJtaXNzaW9uRGF0YShyb2xlTmFtZTogc3RyaW5nLCB1c2VyVHlwZTogc3RyaW5nKSB7XHJcbiAgICAodGhpcy51c2VyRm9ybT8uZ2V0KFwicm9sZXNwZXJtaXNzaW9uXCIpIGFzIEZvcm1BcnJheSkuY2xlYXIoKTtcclxuICAgIHRoaXMucG9wdWxhdGVQZXJtaXNzaW9uKHRoaXMucGVybWlzc2lvbkFycmF5KTtcclxuICB9XHJcbiAgY2FtZWxDYXNlVG9UZXh0KGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoLyhbQS1aXSkvZywgJyAkMScpXHJcbiAgICAgIC5yZXBsYWNlKC9eLi8sIChzdHIpID0+IHN0ci50b1VwcGVyQ2FzZSgpKVxyXG4gICAgICAudHJpbSgpO1xyXG4gIH1cclxuXHJcbiAgYWRkVXNlclN1Ym1pdCgpIHtcclxuICAgIGxldCB2YWx1ZSA9IHRoaXMudXBkYXRlUGVybWlzc2lvbnNCYXNlZE9uVXNlclR5cGUodGhpcy51c2VyRm9ybS52YWx1ZSlcclxuICAgIGNvbnN0IHVwZGF0ZWREYXRhID0gdGhpcy5yZW1vdmVOdWxsVmFsdWVzKHZhbHVlKTtcclxuICAgIHRoaXMudXNlclNlcnZpY2UuY3JlYXRlU2luZ2xlVXNlcnMoeyAuLi51cGRhdGVkRGF0YSwgLi4ueyBjbGllbnRJZDogdGhpcy4kaGVhZGVyRmlsdGVycy5jbGllbnQgPyB0aGlzLiRoZWFkZXJGaWx0ZXJzLmNsaWVudCA6IHRoaXMudXNlcl9kYXRhLmNsaWVudElkIH0gfSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMudHMuZ2V0U3VjY2Vzc1RvYXN0KFwiVXNlciBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5cIik7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdzdWJtaXQnKTtcclxuICAgICAgICAgIHRoaXMuZ3MubWFuYWdlUmVmcmVzaFRyaWdnZXIubmV4dCh0cnVlKVxyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KFwiVW5hYmxlIHRvIGNyZWF0ZSBVc2VyIVwiKTtcclxuICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5lcnJvciA/IGVycj8uZXJyb3I/LmVycm9yIDogXCJVbmFibGUgdG8gY3JlYXRlIFVzZXIhXCIpO1xyXG4gICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoKTtcclxuICAgICAgfSxcclxuICAgICAgY29tcGxldGU6ICgpID0+IHsgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuICBvblN1Ym1pdCgpIHtcclxuICAgIGlmICh0aGlzLnR5cGUgPT0gXCJlZGl0XCIpIHtcclxuICAgICAgdGhpcy51c2VyVXBkYXRlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmFkZFVzZXJTdWJtaXQoKTtcclxuICAgIH1cclxuICB9XHJcbiAgdXNlclVwZGF0ZSgpIHtcclxuICAgIHRoaXMudXNlckZvcm0uZ2V0KFwiZW1haWxcIik/LmVuYWJsZSgpO1xyXG4gICAgbGV0IHVzZXI6IGFueSA9IHRoaXMudXNlckZvcm0udmFsdWU7XHJcbiAgICB0aGlzLnVzZXJGb3JtLmdldChcImVtYWlsXCIpPy5kaXNhYmxlKCk7XHJcbiAgICB0aGlzLnNlcnZpY2UudXBkYXRlVXNlcnModXNlcikuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMudHMuZ2V0U3VjY2Vzc1RvYXN0KFxyXG4gICAgICAgICAgICBcIlVzZXIgZGV0YWlscyB1cGRhdGVkIHN1Y2Nlc3NmdWxseS5cIlxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXCJVbmFibGUgdG8gdXBkYXRlIFVzZXIhXCIpO1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3IgPyBlcnI/LmVycm9yPy5lcnJvciA6IFwiVW5hYmxlIHRvIHVwZGF0ZSBVc2VyIVwiKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7IH0sXHJcbiAgICB9KTtcclxuICB9XHJcbiAgdXBkYXRlUGVybWlzc2lvbnNCYXNlZE9uVXNlclR5cGUodXNlcjogYW55KSB7XHJcbiAgICB1c2VyLnJvbGVzcGVybWlzc2lvbi5mb3JFYWNoKChmZWF0dXJlOiBhbnkpID0+IHtcclxuICAgICAgZmVhdHVyZS5tb2R1bGVzLmZvckVhY2goKG1vZHVsZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIC8vIGlmICh1c2VyLnVzZXJUeXBlID09PSBcInN1cGVyQWRtaW5cIikge1xyXG4gICAgICAgIC8vICAgbW9kdWxlcy5pc0FkZCA9IHRydWU7XHJcbiAgICAgICAgLy8gICBtb2R1bGVzLmlzRWRpdCA9IHRydWU7XHJcbiAgICAgICAgLy8gICAvLyBtb2R1bGVzLmlzRGVsZXRlID0gdHJ1ZTtcclxuICAgICAgICAvLyB9IGVsc2UgXHJcbiAgICAgICAgaWYgKHVzZXIudXNlclR5cGUgPT09IFwidXNlcnNcIikge1xyXG4gICAgICAgICAgbW9kdWxlcy5pc0FkZCA9IGZhbHNlO1xyXG4gICAgICAgICAgbW9kdWxlcy5pc0VkaXQgPSBmYWxzZTtcclxuICAgICAgICAgIC8vIG1vZHVsZXMuaXNEZWxldGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdXNlcjtcclxuICB9XHJcbiAgcmVtb3ZlTnVsbFZhbHVlcyA9IChkYXRhOiBhbnkpID0+IHtcclxuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhLnJvbGVzcGVybWlzc2lvbikpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGVybWlzc2lvbiBpcyBub3QgYW4gYXJyYXlcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTWFwIHRocm91Z2ggdGhlIHBlcm1pc3Npb25zIGFuZCBwcm9kdWN0cyB0byByZW1vdmUgbnVsbCB2YWx1ZXNcclxuICAgIHJldHVybiB7XHJcbiAgICAgIC4uLmRhdGEsXHJcbiAgICAgIHJvbGVzcGVybWlzc2lvbjogZGF0YS5yb2xlc3Blcm1pc3Npb24ubWFwKChmZWF0dXJlOiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgLi4uZmVhdHVyZSxcclxuICAgICAgICAgIG1vZHVsZXM6IGZlYXR1cmUubW9kdWxlcy5tYXAoKG1vZHVsZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBuZXdQcm9kdWN0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1vZHVsZXMpKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdQcm9kdWN0W2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5ld1Byb2R1Y3Q7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH07XHJcbiAgICAgIH0pXHJcbiAgICB9O1xyXG4gIH07XHJcbiAgZ2V0QWxsVGVhbXNMaXN0KCkge1xyXG4gICAgdGhpcy5zZXJ2aWNlLmdldEFsbFRlYW1zTGlzdCh7IGNsaWVudElkOiB0aGlzLiRoZWFkZXJGaWx0ZXJzLmNsaWVudCB9KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kpKS5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy50ZWFtTGlzdCA9IHJlcy5kYXRhLnJlc3VsdFxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICB9XHJcbiAgZWRpdFVzZXIoKSB7XHJcbiAgICBpZiAodGhpcy51c2VyPy5pc0FjdGl2ZSkge1xyXG4gICAgICB0aGlzLnR5cGUgPSBcImVkaXRcIjtcclxuICAgICAgdGhpcy51c2VyRm9ybS5lbmFibGUoKTtcclxuICAgICAgdGhpcy51c2VyRm9ybS5nZXQoXCJlbWFpbFwiKT8uZGlzYWJsZSgpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnVzZXI/LnN0YXR1cyA9PT0gJ2FjdGl2ZScpIHtcclxuICAgICAgdGhpcy50eXBlID0gXCJ2aWV3XCI7XHJcbiAgICAgIHRoaXMudXNlckZvcm0uZW5hYmxlKCk7XHJcbiAgICAgIHRoaXMudXNlckZvcm0uZ2V0KFwiZW1haWxcIik/LmRpc2FibGUoKTtcclxuICAgIH1cclxuICB9XHJcbiAgaXNCdXR0b25EaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHsgdGVhbUxlYWQsIC4uLmNvbnRyb2xzVG9DaGVjayB9ID0gdGhpcy51c2VyRm9ybS5jb250cm9scztcclxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKGNvbnRyb2xzVG9DaGVjaykuc29tZShjb250cm9sID0+IGNvbnRyb2wuaW52YWxpZCk7XHJcbiAgfVxyXG4gIHNldFRlYW1MZWFkcyh0ZWFtTGlzdDogYW55W10pIHtcclxuICAgIGNvbnN0IHRlYW1MZWFkQXJyYXkgPSB0aGlzLnVzZXJGb3JtLmdldCgndGVhbUxlYWQnKSBhcyBGb3JtQXJyYXk7XHJcbiAgICB0ZWFtTGlzdC5mb3JFYWNoKHRlYW0gPT4ge1xyXG4gICAgICAvLyBQdXNoIGVhY2ggdGVhbSBvYmplY3QgYXMgYSBuZXcgRm9ybUdyb3VwIGludG8gdGhlIHRlYW1MZWFkIEZvcm1BcnJheVxyXG4gICAgICBpZiAodGVhbS5jbGllbnRJZCkge1xyXG4gICAgICAgIHRlYW1MZWFkQXJyYXkucHVzaCh0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgIF9pZDogbmV3IEZvcm1Db250cm9sKHRlYW0uX2lkKSxcclxuICAgICAgICAgIGNsaWVudElkOiBuZXcgRm9ybUNvbnRyb2wodGVhbS5jbGllbnRJZCksXHJcbiAgICAgICAgICB0ZWFtTmFtZTogbmV3IEZvcm1Db250cm9sKHRlYW0udGVhbU5hbWUpLFxyXG4gICAgICAgICAgdXNlcnNDb3VudDogbmV3IEZvcm1Db250cm9sKHRlYW0udXNlcnNDb3VudClcclxuICAgICAgICB9KSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuICB9XHJcbn0iLCI8ZGl2ICBjbGFzcz1cImNhcmQgcHQtMCBwYi0zIHNjcm9sbFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBweS0wIGQtZmxleCBmbGV4LXN0YXJ0IGZsZXgtY29sdW1uIHAtOSBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibXktNSBkLWZsZXhcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN5bWJvbCBzeW1ib2wtNzVweCBzeW1ib2wtY2lyY2xlXCI+XHJcbiAgICAgICAgICAgICAgICA8aW1nIGFsdD1cIlBpY1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL2FkZC1zdG9yZS1pY29uLnN2Z1wiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgdy0xMDBcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInR5cGUhPT0ndmlldycgJiYgdHlwZSE9PSdlZGl0J1wiIGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImZzLTQgdGV4dC1ncmF5LTgwMCB0ZXh0LWhvdmVyLXByaW1hcnkgZnctYm9sZCBtYi0wIHRpdGxlIGN1cnNvci1wb2ludGVyXCI+QWRkXHJcbiAgICAgICAgICAgICAgICAgICAgVXNlcjwvYT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItdGl0bGVcIj5QbGVhc2UgYWRkIHlvdXIgdXNlciBkZXRhaWxzPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCJ0eXBlPT09J2VkaXQnXCIgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZnMtNCB0ZXh0LWdyYXktODAwIHRleHQtaG92ZXItcHJpbWFyeSBmdy1ib2xkIG1iLTAgdGl0bGUgY3Vyc29yLXBvaW50ZXJcIj5FZGl0IFVzZXIgRGV0YWlsczwvYT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItdGl0bGVcIj5QbGVhc2UgRWRpdCB5b3VyIHVzZXIgZGV0YWlsczwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0eXBlPT09J3ZpZXcnICYmIHR5cGUgIT09J2VkaXQnXCIgY2xhc3M9XCJjb2wtbWQtOVwiPlxyXG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJmcy00IHRleHQtZ3JheS04MDAgdGV4dC1ob3Zlci1wcmltYXJ5IGZ3LWJvbGQgbWItMCB0aXRsZSBjdXJzb3ItcG9pbnRlclwiPlVzZXIgRGV0YWlsczwvYT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItdGl0bGVcIj5WaWV3IHlvdXIgdXNlciBkZXRhaWxzPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib3BlcmF0aW9uVHlwZSE9PSd2aWV3J1wiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiKGdzLnVzZXJBY2Nlc3MgfGFzeW5jKT8uR2xvYmFsX1VzZXJfaXNFZGl0ICYmIHR5cGUgPT09J3ZpZXcnICAmJiB0eXBlICE9PSdlZGl0JyAmJiB1c2VyPy5yb2xlICE9PSAnc3VwZXJhZG1pbidcIiBjbGFzcz1cImNvbC1tZC0zIHRleHQtZW5kIHB4LTBcIiAoY2xpY2spPVwiZWRpdFVzZXIoKVwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiPjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzM4MzNfODU5MDgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOS4xNjYwMiAzLjMzMzJIMy4zMzI2OEMyLjg5MDY1IDMuMzMzMiAyLjQ2NjczIDMuNTA4NzkgMi4xNTQxNyAzLjgyMTM1QzEuODQxNjEgNC4xMzM5MSAxLjY2NjAyIDQuNTU3ODQgMS42NjYwMiA0Ljk5OTg2VjE2LjY2NjVDMS42NjYwMiAxNy4xMDg2IDEuODQxNjEgMTcuNTMyNSAyLjE1NDE3IDE3Ljg0NUMyLjQ2NjczIDE4LjE1NzYgMi44OTA2NSAxOC4zMzMyIDMuMzMyNjggMTguMzMzMkgxNC45OTkzQzE1LjQ0MTQgMTguMzMzMiAxNS44NjUzIDE4LjE1NzYgMTYuMTc3OSAxNy44NDVDMTYuNDkwNCAxNy41MzI1IDE2LjY2NiAxNy4xMDg2IDE2LjY2NiAxNi42NjY1VjEwLjgzMzJNMTUuNDE2IDIuMDgzMkMxNS43NDc1IDEuNzUxNjggMTYuMTk3MiAxLjU2NTQzIDE2LjY2NiAxLjU2NTQzQzE3LjEzNDkgMS41NjU0MyAxNy41ODQ1IDEuNzUxNjggMTcuOTE2IDIuMDgzMkMxOC4yNDc1IDIuNDE0NzIgMTguNDMzOCAyLjg2NDM2IDE4LjQzMzggMy4zMzMyQzE4LjQzMzggMy44MDIwNCAxOC4yNDc1IDQuMjUxNjggMTcuOTE2IDQuNTgzMkw5Ljk5OTM1IDEyLjQ5OTlMNi42NjYwMiAxMy4zMzMyTDcuNDk5MzUgOS45OTk4NkwxNS40MTYgMi4wODMyWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMzgzM184NTkwOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0eXBlPT09J2VkaXQnICAmJiB0eXBlICE9PSd2aWV3J1wiIGNsYXNzPVwiY29sLW1kLTlcIj5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZnMtNCB0ZXh0LWdyYXktODAwIHRleHQtaG92ZXItcHJpbWFyeSBmdy1ib2xkIG1iLTAgdGl0bGUgY3Vyc29yLXBvaW50ZXJcIj5Vc2VyIERldGFpbHM8L2E+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLXRpdGxlXCI+RWRpdCB5b3VyIHVzZXIgZGV0YWlsczwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIGgtMHB4IHNjcm9sbFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTVcIiAqbmdJZj1cInVzZXJGb3JtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJ1c2VyRm9ybVwiIG5vdmFsaWRhdGU9XCJub3ZhbGlkYXRlXCIgY2xhc3M9XCJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBweC0wIG1lLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVXNlciBOYW1lIEZpZWxkIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBjb2wteGwtNiBjb2wteHhsLTYgbWItN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidXNlcm5hbWVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Vc2VyIE5hbWUgPHNwYW4gY2xhc3M9XCJhbGVydC1yZXF1aXJlZCB0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInVzZXJuYW1lXCIgZm9ybUNvbnRyb2xOYW1lPVwidXNlck5hbWVcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVzZXJGb3JtLmdldCgndXNlck5hbWUnKT8uaW52YWxpZCAmJiAodXNlckZvcm0uZ2V0KCd1c2VyTmFtZScpPy5kaXJ0eSlcIiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwidXNlckZvcm0uZ2V0KCd1c2VyTmFtZScpPy5lcnJvcnM/LlsncmVxdWlyZWQnXVwiPlVzZXIgTmFtZSBpcyByZXF1aXJlZC48L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFbWFpbCBGaWVsZCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgY29sLXhsLTYgY29sLXh4bC02IG1iLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVtYWlsXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+RW1haWwgPHNwYW4gY2xhc3M9XCJhbGVydC1yZXF1aXJlZCB0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJlbWFpbFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJlbWFpbFwiIGZvcm1Db250cm9sTmFtZT1cImVtYWlsXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ2VtYWlsJyk/LmludmFsaWQgJiYgdXNlckZvcm0uZ2V0KCdlbWFpbCcpPy50b3VjaGVkXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInVzZXJGb3JtLmdldCgnZW1haWwnKT8uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cIj5FbWFpbCBpcyByZXF1aXJlZC48L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInVzZXJGb3JtLmdldCgnZW1haWwnKT8uZXJyb3JzPy5bJ3BhdHRlcm4nXVwiPkludmFsaWQgZW1haWwgZm9ybWF0Ljwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENvbnRhY3QgTnVtYmVyIEZpZWxkIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBjb2wteGwtNiBjb2wteHhsLTYgbWItN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY29udGFjdFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkNvbnRhY3QgTnVtYmVyIDxzcGFuIGNsYXNzPVwiYWxlcnQtcmVxdWlyZWQgdGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy00IGNvbC14bC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgcHMtMyBwZS04XCIgaWQ9XCJpbnB1dEdyb3VwU2VsZWN0MDFcIiBmb3JtQ29udHJvbE5hbWU9XCJjb3VudHJ5Q29kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjb3VudHJ5IG9mIGNvdW50cnlMaXN0XCIgW3ZhbHVlXT1cImNvdW50cnkucGhvbmVjb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb3VudHJ5Lm5hbWV9fSAoe3tjb3VudHJ5LnBob25lY29kZX19KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTggY29sLXhsLThcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgKGtleXByZXNzKT1cIm9taXRfc3BlY2lhbF9jaGFyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cIm1vYmlsZU51bWJlclwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGZvcm1Db250cm9sTmFtZT1cIm1vYmlsZU51bWJlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVzZXJGb3JtLmdldCgnbW9iaWxlTnVtYmVyJyk/LmludmFsaWQgJiYgdXNlckZvcm0uZ2V0KCdtb2JpbGVOdW1iZXInKT8udG91Y2hlZFwiIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwidXNlckZvcm0uZ2V0KCdtb2JpbGVOdW1iZXInKT8uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cIj5Db250YWN0IE51bWJlciBpcyByZXF1aXJlZC48L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ21vYmlsZU51bWJlcicpPy5lcnJvcnM/LlsnbWlubGVuZ3RoJ11cIj5Db250YWN0IE51bWJlciBtdXN0IGJlIGF0IGxlYXN0IDggZGlnaXRzLjwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInVzZXJGb3JtLmdldCgnbW9iaWxlTnVtYmVyJyk/LmVycm9ycz8uWydtYXhsZW5ndGgnXVwiPkNvbnRhY3QgTnVtYmVyIGNhbm5vdCBleGNlZWQgMTMgZGlnaXRzLjwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUm9sZSBGaWVsZCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgY29sLXhsLTYgY29sLXh4bC02IG1iLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInJvbGVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Sb2xlIDxzcGFuIGNsYXNzPVwiYWxlcnQtcmVxdWlyZWQgdGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGZvcm1Db250cm9sTmFtZT1cInJvbGVcIiAoY2hhbmdlKT1cIm9uUm9sZUNoYW5nZSh1c2VyRm9ybS5nZXQoJ3JvbGUnKT8udmFsdWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFkbWluXCI+QWRtaW48L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwidXNlclwiPlVzZXI8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ3JvbGUnKT8uaW52YWxpZCAmJiB1c2VyRm9ybS5nZXQoJ3JvbGUnKT8udG91Y2hlZFwiIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ3JvbGUnKT8uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cIj5Sb2xlIGlzIHJlcXVpcmVkLjwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCB0byBUZWFtIEZpZWxkIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctMTIgY29sLXhsLTEyIGNvbC14eGwtMTIgbWItNVwiICpuZ0lmPVwidGhpcy51c2VyVHlwZSAhPT0ndGFuZ28nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ0ZWFtTGVhZFwiIGNsYXNzPVwiZm9ybS1sYWJlbCB0ZWFtcy10aXRsZVwiPkFkZCB0byBhIHRlYW08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVhbS1zZWxlY3QgW2l0ZW1zXT1cInRlYW1MaXN0XCIgW211bHRpXT1cInRydWVcIiBbc2VhcmNoRmllbGRdPVwiJ3RlYW1OYW1lJ1wiIFtpZEZpZWxkXT1cIidfaWQnXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwib25TdG9yZVNlbGVjdCgkZXZlbnQpXCIgW3NlbGVjdGVkVmFsdWVzXT1cInNlbGVjdGVkVXNlclwiPjwvdGVhbS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVzZXJGb3JtLmdldCgncm9sZScpPy52YWx1ZSA9PT0gJ2FkbWluJ1wiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInRlYW1zLXRpdGxlXCIgICpuZ0lmPVwiZ2V0UGVybWlzc2lvbnMoKS5sZW5ndGhcIj5BY2Nlc3MgZm9yIEFkbWluPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRQZXJtaXNzaW9ucygpLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgZm9ybUFycmF5TmFtZT1cInJvbGVzcGVybWlzc2lvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcm9sZXNwZXJtaXNzaW9uIG9mIGdldFBlcm1pc3Npb25zKCkuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlIG15LTIgbWUtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZS1oZWFkZXIgbXQtNCBtcy0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNhbWVsQ2FzZVRvVGV4dChyb2xlc3Blcm1pc3Npb24uZ2V0KCdmZWF0dXJlTmFtZScpPy52YWx1ZSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb2xlc3Blcm1pc3Npb24uZ2V0KCdtb2R1bGVzJylcIiBmb3JtQXJyYXlOYW1lPVwibW9kdWxlc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbW9kdWxlcyBvZiBnZXRGZWF0dXJlUGVybWlzc2lvbnMocm9sZXNwZXJtaXNzaW9uKT8uY29udHJvbHM7IGxldCBqID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJqXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwicm9sZXNwZXJtaXNzaW9uLmdldCgnZmVhdHVyZU5hbWUnKT8udmFsdWUgIT09ICdUYW5nb0FkbWluJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ3LTUwXCI+e3sgY2FtZWxDYXNlVG9UZXh0KG1vZHVsZXMuZ2V0KCduYW1lJyk/LnZhbHVlKSB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtc3RhcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1pbmxpbmUtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBmb3JtQ29udHJvbE5hbWU9XCJpc0FkZFwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2hhbmdlKT1cImhhbmRsZVZpZXdDaGFuZ2UobW9kdWxlcylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImdsb2JhbC1sYWJlbCBtcy0yIG10LWF1dG9cIj5BZGQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LXN0YXJ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtaW5saW5lLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiaXNFZGl0XCIgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjaGFuZ2UpPVwiaGFuZGxlRWRpdENoYW5nZShtb2R1bGVzKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZ2xvYmFsLWxhYmVsIG1zLTIgbXQtYXV0b1wiPkVkaXQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm9sZXNwZXJtaXNzaW9uLmdldCgnZmVhdHVyZU5hbWUnKT8udmFsdWUgPT09ICdUYW5nb0FkbWluJ1wiIGNsYXNzPVwicm93IHctMTAwIHRleHQtbm93cmFwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiICpuZ0Zvcj1cImxldCBtb2R1bGVzIG9mIGdldEZlYXR1cmVQZXJtaXNzaW9ucyhyb2xlc3Blcm1pc3Npb24pPy5jb250cm9sczsgbGV0IGogPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImpcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1pbmxpbmUtZmxleCBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIGZvcm1Db250cm9sTmFtZT1cImlzRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZ2xvYmFsLWxhYmVsIG1iLTUgbXgtMiBtdC0xXCIgc3R5bGU9XCJ0ZXh0LXdyYXA6bm93cmFwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNhbWVsQ2FzZVRvVGV4dChtb2R1bGVzLmdldCgnbmFtZScpPy52YWx1ZSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidHlwZSE9PSd2aWV3J1wiIGNsYXNzPVwiZC1mbGV4IG15LTEwXCIgcm9sZT1cImdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHctMTAwIG1lLTNcIiAoY2xpY2spPVwiY2FuY2VsKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMTAwIG1zLTNcIiBpZD1cImFsZXJ0LXRvYXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25TdWJtaXQoKVwiIFtkaXNhYmxlZF09XCJ1c2VyRm9ybS5pbnZhbGlkIHx8IHR5cGUgPT09ICd2aWV3J1wiPlN1Ym1pdDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj4iXX0=
|