@smarterplan/ngx-smarterplan-admin 0.1.27

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.
Files changed (46) hide show
  1. package/README.md +24 -0
  2. package/esm2020/lib/admin/admin.component.mjs +33 -0
  3. package/esm2020/lib/chevron/chevron.component.mjs +19 -0
  4. package/esm2020/lib/guest-link/guest-link.component.mjs +62 -0
  5. package/esm2020/lib/guide.guard.mjs +25 -0
  6. package/esm2020/lib/name-from-id.pipe.mjs +29 -0
  7. package/esm2020/lib/ngx-smarterplan-admin-routing.module.mjs +47 -0
  8. package/esm2020/lib/ngx-smarterplan-admin.module.mjs +90 -0
  9. package/esm2020/lib/ngx-smarterplan-admin.service.mjs +14 -0
  10. package/esm2020/lib/organisation/organisation.component.mjs +166 -0
  11. package/esm2020/lib/sp-admin.guard.mjs +31 -0
  12. package/esm2020/lib/user/detail-organisation/detail-organisation.component.mjs +160 -0
  13. package/esm2020/lib/user/form-mission/form-mission.component.mjs +205 -0
  14. package/esm2020/lib/user/form-organisation/form-organisation.component.mjs +125 -0
  15. package/esm2020/lib/user/user-mission-form/user-mission-form.component.mjs +106 -0
  16. package/esm2020/lib/user/user.component.mjs +325 -0
  17. package/esm2020/lib/visitor/create-batch/create-batch.component.mjs +108 -0
  18. package/esm2020/lib/visitor/template/template.component.mjs +219 -0
  19. package/esm2020/lib/visitor/visitor.component.mjs +284 -0
  20. package/esm2020/public-api.mjs +6 -0
  21. package/esm2020/smarterplan-ngx-smarterplan-admin.mjs +5 -0
  22. package/fesm2015/smarterplan-ngx-smarterplan-admin.mjs +2026 -0
  23. package/fesm2015/smarterplan-ngx-smarterplan-admin.mjs.map +1 -0
  24. package/fesm2020/smarterplan-ngx-smarterplan-admin.mjs +1921 -0
  25. package/fesm2020/smarterplan-ngx-smarterplan-admin.mjs.map +1 -0
  26. package/lib/admin/admin.component.d.ts +13 -0
  27. package/lib/chevron/chevron.component.d.ts +9 -0
  28. package/lib/guest-link/guest-link.component.d.ts +20 -0
  29. package/lib/guide.guard.d.ts +11 -0
  30. package/lib/name-from-id.pipe.d.ts +11 -0
  31. package/lib/ngx-smarterplan-admin-routing.module.d.ts +7 -0
  32. package/lib/ngx-smarterplan-admin.module.d.ts +26 -0
  33. package/lib/ngx-smarterplan-admin.service.d.ts +6 -0
  34. package/lib/organisation/organisation.component.d.ts +53 -0
  35. package/lib/sp-admin.guard.d.ts +12 -0
  36. package/lib/user/detail-organisation/detail-organisation.component.d.ts +39 -0
  37. package/lib/user/form-mission/form-mission.component.d.ts +54 -0
  38. package/lib/user/form-organisation/form-organisation.component.d.ts +32 -0
  39. package/lib/user/user-mission-form/user-mission-form.component.d.ts +28 -0
  40. package/lib/user/user.component.d.ts +100 -0
  41. package/lib/visitor/create-batch/create-batch.component.d.ts +23 -0
  42. package/lib/visitor/template/template.component.d.ts +52 -0
  43. package/lib/visitor/visitor.component.d.ts +65 -0
  44. package/package.json +39 -0
  45. package/public-api.d.ts +2 -0
  46. package/smarterplan-ngx-smarterplan-admin.d.ts +5 -0
@@ -0,0 +1,106 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { Validators } from '@angular/forms';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/forms";
5
+ import * as i2 from "ngx-smarterplan-core";
6
+ import * as i3 from "@ngx-translate/core";
7
+ import * as i4 from "../form-mission/form-mission.component";
8
+ import * as i5 from "@ng-bootstrap/ng-bootstrap";
9
+ import * as i6 from "@angular/common";
10
+ export class UserMissionFormComponent {
11
+ constructor(fb, userService, translate) {
12
+ this.fb = fb;
13
+ this.userService = userService;
14
+ this.translate = translate;
15
+ this.createForExistingUser = false;
16
+ this.added = new EventEmitter();
17
+ this.working = false;
18
+ }
19
+ ngOnInit() {
20
+ this.onAddNewUserMissionToOrg();
21
+ }
22
+ async onAddNewUserMissionToOrg() {
23
+ this.form = this.fb.group({
24
+ email: [null, [Validators.required]],
25
+ lastName: [""],
26
+ firstName: [""],
27
+ });
28
+ }
29
+ onCancel() {
30
+ this.added.emit(false);
31
+ }
32
+ get email() {
33
+ return this.form.get("email");
34
+ }
35
+ async onSubmit() {
36
+ this.working = true;
37
+ let p;
38
+ try {
39
+ const formValue = this.form.value;
40
+ p = await this.userService.profileForMail(formValue.email);
41
+ if (p) {
42
+ alert("User with this email exists already!");
43
+ this.working = false;
44
+ return;
45
+ }
46
+ try {
47
+ const profile = await this.userService.createUserAWSandProfile(formValue, true);
48
+ console.log("User created!", profile.metadata);
49
+ this.createdUser = profile;
50
+ }
51
+ catch (error) {
52
+ this.working = false;
53
+ alert(this.translate.instant(JSON.stringify(error)));
54
+ return;
55
+ }
56
+ }
57
+ catch (error) {
58
+ console.error(error);
59
+ }
60
+ this.working = false;
61
+ }
62
+ // async updateAllMissionsFromTemplate(missionInput: UpdateMissionInput) {
63
+ // // all missions of this organisation
64
+ // const missionsFromTemplate =
65
+ // await this.missionService.getMissionsByTemplate(
66
+ // this.missionToEdit.id,
67
+ // );
68
+ // await Promise.all(
69
+ // missionsFromTemplate.map(async (mission) => {
70
+ // const missionTemplate = { ...missionInput };
71
+ // if (this.sendUpdate) {
72
+ // missionTemplate.emailStatus = EmailStatus.UPDATE_TO_DELIVER;
73
+ // }
74
+ // missionTemplate.id = mission.id;
75
+ // await this.missionService.update(missionTemplate);
76
+ // }),
77
+ // );
78
+ // }
79
+ async onMissionInput(mission) {
80
+ if (mission) {
81
+ this.missionInput = mission;
82
+ await this.userService.createOrUpdateMissionForOrgWithProperty(this.missionInput, this.missionInput.organisationID);
83
+ this.added.emit(true);
84
+ }
85
+ else {
86
+ this.added.emit(false);
87
+ }
88
+ }
89
+ }
90
+ UserMissionFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: UserMissionFormComponent, deps: [{ token: i1.FormBuilder }, { token: i2.BaseUserService }, { token: i3.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
91
+ UserMissionFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: UserMissionFormComponent, selector: "lib-user-mission-form", inputs: { addToOrganisation: "addToOrganisation", isSP: "isSP", createForExistingUser: "createForExistingUser", currentOrg: "currentOrg" }, outputs: { added: "added" }, ngImport: i0, template: "<div *ngIf=\"form\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div id=\"personalInfo\">\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'User Personal Information' | translate }}</h4>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Email' | translate}} *</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" [class.is-invalid]=\"email.invalid && email.touched\" required\r\n formControlName=\"email\">\r\n <div class=\"invalid-feedback\">\r\n {{'An email is required' | translate}}.\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Last name' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"lastName\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'First name' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"firstName\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n\r\n <div *ngIf=\"createdUser; else waitingForUser\">\r\n <div class=\"alert alert-info\">\r\n {{'User successfully created' | translate}}\r\n </div>\r\n <lib-form-mission [organisationForMission]=\"addToOrganisation\" [userForMissionID]=\"createdUser.id\"\r\n [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\" (addedMissionInput)=\"onMissionInput($event)\">\r\n </lib-form-mission>\r\n </div>\r\n <ng-template #waitingForUser>\r\n <div class=\"action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n [disabled]=\"working || form.invalid\">{{'Create user' | translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" [disabled]=\"working\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'Mission details' | translate }}</h4>\r\n </div>\r\n <ngb-alert type=\"warning\" [dismissible]=\"false\">{{'Please create a user first' | translate}}.</ngb-alert>\r\n\r\n </ng-template>\r\n </form>\r\n</div>", styles: [".form-group{margin:1.5rem 0}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"], components: [{ type: i2.LoaderComponent, selector: "lib-loader" }, { type: i4.FormMissionComponent, selector: "lib-form-mission", inputs: ["missionToEdit", "organisationForMission", "isSP", "userForMissionID", "currentUserOrganisation"], outputs: ["addedMissionInput"] }, { type: i5.NgbAlert, selector: "ngb-alert", inputs: ["animation", "dismissible", "type"], outputs: ["closed"], exportAs: ["ngbAlert"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }], pipes: { "translate": i3.TranslatePipe } });
92
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: UserMissionFormComponent, decorators: [{
93
+ type: Component,
94
+ args: [{ selector: 'lib-user-mission-form', template: "<div *ngIf=\"form\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div id=\"personalInfo\">\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'User Personal Information' | translate }}</h4>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Email' | translate}} *</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" [class.is-invalid]=\"email.invalid && email.touched\" required\r\n formControlName=\"email\">\r\n <div class=\"invalid-feedback\">\r\n {{'An email is required' | translate}}.\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Last name' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"lastName\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'First name' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"firstName\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n\r\n <div *ngIf=\"createdUser; else waitingForUser\">\r\n <div class=\"alert alert-info\">\r\n {{'User successfully created' | translate}}\r\n </div>\r\n <lib-form-mission [organisationForMission]=\"addToOrganisation\" [userForMissionID]=\"createdUser.id\"\r\n [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\" (addedMissionInput)=\"onMissionInput($event)\">\r\n </lib-form-mission>\r\n </div>\r\n <ng-template #waitingForUser>\r\n <div class=\"action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n [disabled]=\"working || form.invalid\">{{'Create user' | translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" [disabled]=\"working\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'Mission details' | translate }}</h4>\r\n </div>\r\n <ngb-alert type=\"warning\" [dismissible]=\"false\">{{'Please create a user first' | translate}}.</ngb-alert>\r\n\r\n </ng-template>\r\n </form>\r\n</div>", styles: [".form-group{margin:1.5rem 0}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"] }]
95
+ }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.BaseUserService }, { type: i3.TranslateService }]; }, propDecorators: { addToOrganisation: [{
96
+ type: Input
97
+ }], isSP: [{
98
+ type: Input
99
+ }], createForExistingUser: [{
100
+ type: Input
101
+ }], currentOrg: [{
102
+ type: Input
103
+ }], added: [{
104
+ type: Output
105
+ }] } });
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1taXNzaW9uLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWFkbWluL3NyYy9saWIvdXNlci91c2VyLW1pc3Npb24tZm9ybS91c2VyLW1pc3Npb24tZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL3VzZXItbWlzc2lvbi1mb3JtL3VzZXItbWlzc2lvbi1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUEwQixVQUFVLEVBQW1CLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7O0FBU3JGLE1BQU0sT0FBTyx3QkFBd0I7SUFvQmpDLFlBQ1ksRUFBZSxFQUNmLFdBQTRCLEVBQzVCLFNBQTJCO1FBRjNCLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZixnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFDNUIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFqQjlCLDBCQUFxQixHQUFHLEtBQUssQ0FBQztRQU03QixVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUU5QyxZQUFPLEdBQUcsS0FBSyxDQUFDO0lBVWIsQ0FBQztJQUVKLFFBQVE7UUFDSixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsS0FBSyxDQUFDLHdCQUF3QjtRQUMxQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ3RCLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNwQyxRQUFR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RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMsIEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBPcmdhbmlzYXRpb24sIE1pc3Npb24sIFByb2ZpbGUsIEJhc2VVc2VyU2VydmljZSB9IGZyb20gJ25neC1zbWFydGVycGxhbi1jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXVzZXItbWlzc2lvbi1mb3JtJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1taXNzaW9uLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3VzZXItbWlzc2lvbi1mb3JtLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFVzZXJNaXNzaW9uRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgICBcclxuICAgIEBJbnB1dCgpIGFkZFRvT3JnYW5pc2F0aW9uOiBPcmdhbmlzYXRpb247XHJcblxyXG4gICAgQElucHV0KCkgaXNTUDogYm9vbGVhbjtcclxuXHJcbiAgICBASW5wdXQoKSBjcmVhdGVGb3JFeGlzdGluZ1VzZXIgPSBmYWxzZTtcclxuXHJcbiAgICBmb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gICAgQElucHV0KCkgY3VycmVudE9yZzogT3JnYW5pc2F0aW9uO1xyXG5cclxuICAgIEBPdXRwdXQoKSBhZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgICB3b3JraW5nID0gZmFsc2U7XHJcblxyXG4gICAgbWlzc2lvbklucHV0OiBNaXNzaW9uO1xyXG5cclxuICAgIGNyZWF0ZWRVc2VyOiBQcm9maWxlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgICkge31cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLm9uQWRkTmV3VXNlck1pc3Npb25Ub09yZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQWRkTmV3VXNlck1pc3Npb25Ub09yZygpIHtcclxuICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgICAgZW1haWw6IFtudWxsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICAgICAgICBsYXN0TmFtZTogW1wiXCJdLFxyXG4gICAgICAgICAgICBmaXJzdE5hbWU6IFtcIlwiXSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNhbmNlbCgpIHtcclxuICAgICAgICB0aGlzLmFkZGVkLmVtaXQoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBlbWFpbCgpOiBBYnN0cmFjdENvbnRyb2wge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KFwiZW1haWxcIik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdWJtaXQoKSB7XHJcbiAgICAgICAgdGhpcy53b3JraW5nID0gdHJ1ZTtcclxuICAgICAgICBsZXQgcDogUHJvZmlsZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmZvcm0udmFsdWU7XHJcbiAgICAgICAgICAgIHAgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLnByb2ZpbGVGb3JNYWlsKGZvcm1WYWx1ZS5lbWFpbCk7XHJcbiAgICAgICAgICAgIGlmIChwKSB7XHJcbiAgICAgICAgICAgICAgICBhbGVydChcIlVzZXIgd2l0aCB0aGlzIGVtYWlsIGV4aXN0cyBhbHJlYWR5IVwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMud29ya2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5jcmVhdGVVc2VyQVdTYW5kUHJvZmlsZShcclxuICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlVzZXIgY3JlYXRlZCFcIiwgcHJvZmlsZS5tZXRhZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZWRVc2VyID0gcHJvZmlsZTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMud29ya2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYWxlcnQodGhpcy50cmFuc2xhdGUuaW5zdGFudChKU09OLnN0cmluZ2lmeShlcnJvcikpKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLndvcmtpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhc3luYyB1cGRhdGVBbGxNaXNzaW9uc0Zyb21UZW1wbGF0ZShtaXNzaW9uSW5wdXQ6IFVwZGF0ZU1pc3Npb25JbnB1dCkge1xyXG4gICAgLy8gICAgIC8vIGFsbCBtaXNzaW9ucyBvZiB0aGlzIG9yZ2FuaXNhdGlvblxyXG4gICAgLy8gICAgIGNvbnN0IG1pc3Npb25zRnJvbVRlbXBsYXRlID1cclxuICAgIC8vICAgICAgICAgYXdhaXQgdGhpcy5taXNzaW9uU2VydmljZS5nZXRNaXNzaW9uc0J5VGVtcGxhdGUoXHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLm1pc3Npb25Ub0VkaXQuaWQsXHJcbiAgICAvLyAgICAgICAgICk7XHJcbiAgICAvLyAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAvLyAgICAgICAgIG1pc3Npb25zRnJvbVRlbXBsYXRlLm1hcChhc3luYyAobWlzc2lvbikgPT4ge1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgbWlzc2lvblRlbXBsYXRlID0geyAuLi5taXNzaW9uSW5wdXQgfTtcclxuICAgIC8vICAgICAgICAgICAgIGlmICh0aGlzLnNlbmRVcGRhdGUpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBtaXNzaW9uVGVtcGxhdGUuZW1haWxTdGF0dXMgPSBFbWFpbFN0YXR1cy5VUERBVEVfVE9fREVMSVZFUjtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgIG1pc3Npb25UZW1wbGF0ZS5pZCA9IG1pc3Npb24uaWQ7XHJcbiAgICAvLyAgICAgICAgICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLnVwZGF0ZShtaXNzaW9uVGVtcGxhdGUpO1xyXG4gICAgLy8gICAgICAgICB9KSxcclxuICAgIC8vICAgICApO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIGFzeW5jIG9uTWlzc2lvbklucHV0KG1pc3Npb246IE1pc3Npb24pIHtcclxuICAgICAgICBpZiAobWlzc2lvbikge1xyXG4gICAgICAgICAgICB0aGlzLm1pc3Npb25JbnB1dCA9IG1pc3Npb247XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudXNlclNlcnZpY2UuY3JlYXRlT3JVcGRhdGVNaXNzaW9uRm9yT3JnV2l0aFByb3BlcnR5KFxyXG4gICAgICAgICAgICAgICAgdGhpcy5taXNzaW9uSW5wdXQgYXMgTWlzc2lvbixcclxuICAgICAgICAgICAgICAgIHRoaXMubWlzc2lvbklucHV0Lm9yZ2FuaXNhdGlvbklELFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLmFkZGVkLmVtaXQodHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRlZC5lbWl0KGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiAqbmdJZj1cImZvcm1cIj5cclxuICAgIDxmb3JtIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdCgpXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XHJcbiAgICAgICAgPGRpdiBpZD1cInBlcnNvbmFsSW5mb1wiPlxyXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTtcIj5cclxuICAgICAgICAgICAgICAgIDxoND57eyAnVXNlciBQZXJzb25hbCBJbmZvcm1hdGlvbicgfCB0cmFuc2xhdGUgfX08L2g0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0VtYWlsJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbY2xhc3MuaXMtaW52YWxpZF09XCJlbWFpbC5pbnZhbGlkICYmIGVtYWlsLnRvdWNoZWRcIiByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJlbWFpbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J0FuIGVtYWlsIGlzIHJlcXVpcmVkJyB8IHRyYW5zbGF0ZX19LlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0xhc3QgbmFtZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImxhc3ROYW1lXCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snRmlyc3QgbmFtZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImZpcnN0TmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiICpuZ0lmPVwid29ya2luZ1wiPlxyXG4gICAgICAgICAgICA8bGliLWxvYWRlcj48L2xpYi1sb2FkZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJjcmVhdGVkVXNlcjsgZWxzZSB3YWl0aW5nRm9yVXNlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAge3snVXNlciBzdWNjZXNzZnVsbHkgY3JlYXRlZCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGxpYi1mb3JtLW1pc3Npb24gW29yZ2FuaXNhdGlvbkZvck1pc3Npb25dPVwiYWRkVG9PcmdhbmlzYXRpb25cIiBbdXNlckZvck1pc3Npb25JRF09XCJjcmVhdGVkVXNlci5pZFwiXHJcbiAgICAgICAgICAgICAgICBbY3VycmVudFVzZXJPcmdhbmlzYXRpb25dPVwiY3VycmVudE9yZ1wiIFtpc1NQXT1cImlzU1BcIiAoYWRkZWRNaXNzaW9uSW5wdXQpPVwib25NaXNzaW9uSW5wdXQoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8L2xpYi1mb3JtLW1pc3Npb24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICN3YWl0aW5nRm9yVXNlcj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1idXR0b24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtci0zIGFjdGlvbi1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ3b3JraW5nIHx8IGZvcm0uaW52YWxpZFwiPnt7J0NyZWF0ZSB1c2VyJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25DYW5jZWwoKVwiIFtkaXNhYmxlZF09XCJ3b3JraW5nXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBhY3Rpb24tYnV0dG9uXCI+e3snQ2FuY2VsJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTtcIj5cclxuICAgICAgICAgICAgICAgIDxoND57eyAnTWlzc2lvbiBkZXRhaWxzJyB8IHRyYW5zbGF0ZSB9fTwvaDQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmdiLWFsZXJ0IHR5cGU9XCJ3YXJuaW5nXCIgW2Rpc21pc3NpYmxlXT1cImZhbHNlXCI+e3snUGxlYXNlIGNyZWF0ZSBhIHVzZXIgZmlyc3QnIHwgdHJhbnNsYXRlfX0uPC9uZ2ItYWxlcnQ+XHJcblxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L2Zvcm0+XHJcbjwvZGl2PiJdfQ==
@@ -0,0 +1,325 @@
1
+ import { Component } from '@angular/core';
2
+ import { DomainType, filterUniqueArrayByID, ProfileEntity, } from 'ngx-smarterplan-core';
3
+ import { Subject, takeUntil } from 'rxjs';
4
+ import { GuestLinkComponent } from '../guest-link/guest-link.component';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "ngx-smarterplan-core";
7
+ import * as i2 from "@ng-bootstrap/ng-bootstrap";
8
+ import * as i3 from "@ngx-translate/core";
9
+ import * as i4 from "../chevron/chevron.component";
10
+ import * as i5 from "./user-mission-form/user-mission-form.component";
11
+ import * as i6 from "./form-mission/form-mission.component";
12
+ import * as i7 from "./form-organisation/form-organisation.component";
13
+ import * as i8 from "./detail-organisation/detail-organisation.component";
14
+ import * as i9 from "@angular/common";
15
+ export class UserComponent {
16
+ constructor(userService, missionService, domainService, organisationService, modalService, translate) {
17
+ this.userService = userService;
18
+ this.missionService = missionService;
19
+ this.domainService = domainService;
20
+ this.organisationService = organisationService;
21
+ this.modalService = modalService;
22
+ this.translate = translate;
23
+ this.detailsUser = '-1';
24
+ this.detailsOrg = '-1';
25
+ this.query = '';
26
+ this.create = false;
27
+ this.edit = false;
28
+ this.working = false;
29
+ this.createForExistingUser = false;
30
+ this.isAddingOrg = false;
31
+ this.isAddingToExistingOrg = false;
32
+ this.isManager = false;
33
+ this.hideList = false;
34
+ this.orgsUsersMissions = [];
35
+ this.isSP = false;
36
+ this.isGuide = false;
37
+ this.clientsSP = [];
38
+ this.prestataireClients = [];
39
+ this.loading = false;
40
+ this.destroy$ = new Subject();
41
+ this.userService.isChanged
42
+ .pipe(takeUntil(this.destroy$))
43
+ .subscribe((isConnected) => {
44
+ if (isConnected) {
45
+ this.initInfo();
46
+ }
47
+ });
48
+ }
49
+ // @todo list my org and sub orgs
50
+ /**
51
+ * resetList fetches a fresh user list from server
52
+ */
53
+ async resetList() {
54
+ this.orgsUsersMissions = [];
55
+ let allMissions = [];
56
+ this.loading = true;
57
+ if (this.isSP) {
58
+ this.orgsUsersMissions = await this.initListForSP();
59
+ this.filteredOrgsUsersMissions = this.orgsUsersMissions;
60
+ this.loading = false;
61
+ return;
62
+ }
63
+ allMissions = await this.missionService.getMissionsByOrderedOrganisation(this.currentOrg.id);
64
+ const currentOrgMissions = await this.missionService.getMissionsByOrganisation(this.currentOrg.id);
65
+ allMissions = [...allMissions, ...currentOrgMissions];
66
+ allMissions = allMissions.filter((mission) => mission.user && !mission.user.deletedAt);
67
+ allMissions = filterUniqueArrayByID(allMissions);
68
+ if (allMissions) {
69
+ const orgs = allMissions.map((mis) => mis.organisation);
70
+ const profiles = allMissions.map((mis) => mis.user);
71
+ const uniqueOrg = filterUniqueArrayByID(orgs);
72
+ const uniqueUsers = filterUniqueArrayByID(profiles);
73
+ uniqueOrg.map((org) => {
74
+ const orgMissions = allMissions.filter((mis) => {
75
+ return mis.organisationID === org.id;
76
+ });
77
+ let users = this.getUsersForOrgMissions(uniqueUsers, orgMissions);
78
+ users = users.sort((user) => (user.user.email ? 0 : -1));
79
+ const object = {
80
+ org,
81
+ users,
82
+ };
83
+ this.orgsUsersMissions.push(object);
84
+ });
85
+ }
86
+ this.filteredOrgsUsersMissions = this.orgsUsersMissions;
87
+ this.loading = false;
88
+ }
89
+ async initInfo() {
90
+ const currentUser = this.userService.cu;
91
+ if (currentUser) {
92
+ this.me = currentUser;
93
+ this.currentOrg = this.userService.currentOrganisation();
94
+ this.isManager = this.userService.hasManagerRoleInAnyMission();
95
+ this.isSP = this.userService.isSPAdmin();
96
+ this.isGuide = this.userService.isGuide();
97
+ this.resetList();
98
+ this.setDomains();
99
+ }
100
+ }
101
+ async ngOnInit() {
102
+ this.initInfo();
103
+ }
104
+ ngOnDestroy() {
105
+ this.destroy$.next(true);
106
+ this.destroy$.complete();
107
+ }
108
+ async initListForSP() {
109
+ const results = [];
110
+ let allMissions = [];
111
+ let allOrgs = [];
112
+ allOrgs = await this.organisationService.listOrganisations();
113
+ await Promise.all(allOrgs.map(async (org) => {
114
+ const missions = await this.missionService.getMissionsByOrganisation(org.id);
115
+ allMissions = [...allMissions, ...missions];
116
+ }));
117
+ const profiles = allMissions
118
+ .map((mis) => mis.user)
119
+ .filter((user) => !user.deletedAt);
120
+ const uniqueUsers = filterUniqueArrayByID(profiles.filter((profile) => profile !== null));
121
+ allOrgs.map((org) => {
122
+ const orgMissions = allMissions.filter((mis) => {
123
+ return mis.organisationID === org.id;
124
+ });
125
+ if (orgMissions.length > 0) {
126
+ if (orgMissions.filter((m) => m.orderedOrganisationID === '6e28201f-4679-4c29-9d2d-8a325f57cee9').length > 0) {
127
+ this.clientsSP.push(org.id);
128
+ }
129
+ else {
130
+ this.prestataireClients.push({
131
+ orgOwner: orgMissions[0].orderedOrganisationID,
132
+ prestataire: org.id,
133
+ });
134
+ }
135
+ }
136
+ const users = this.getUsersForOrgMissions(uniqueUsers, orgMissions);
137
+ const object = {
138
+ org,
139
+ users,
140
+ };
141
+ results.push(object);
142
+ });
143
+ return results;
144
+ }
145
+ // eslint-disable-next-line class-methods-use-this
146
+ getUsersForOrgMissions(uniqueUsers, orgMissions) {
147
+ const users = uniqueUsers.map((user) => {
148
+ const userMissions = orgMissions.filter((m) => m.userID === user.id);
149
+ if (userMissions.length > 0) {
150
+ const userProfile = new ProfileEntity(user);
151
+ // once we got the user we check filter only active missions (not deleted)
152
+ const activeMissions = userMissions.filter((mis) => !mis.deletedAt);
153
+ return {
154
+ missions: activeMissions,
155
+ user: userProfile,
156
+ };
157
+ }
158
+ return null;
159
+ });
160
+ return users.filter((us) => us !== null);
161
+ }
162
+ async setDomains() {
163
+ const domains = await this.domainService.getDomainsForOrgExcludingTypes([DomainType.FEATURE, DomainType.BOOKING], this.currentOrg.id);
164
+ this.domains = domains;
165
+ }
166
+ /**
167
+ * onToggleDetail folds/unfolds details for a given organisation
168
+ * @param i index of the organisation to be toggled
169
+ */
170
+ onToggleDetailOrg(index, org) {
171
+ this.detailsOrg = index === this.detailsOrg ? '-1' : index;
172
+ this.orgSelectedDetails = this.detailsOrg === '-1' ? null : org;
173
+ }
174
+ onToggleDetailUser(index) {
175
+ this.detailsUser = index === this.detailsUser ? '-1' : index;
176
+ }
177
+ async onAdd(org) {
178
+ this.create = true;
179
+ this.hideList = true;
180
+ this.addToOrg = org;
181
+ }
182
+ async onEdit(m) {
183
+ this.edit = true;
184
+ this.hideList = true;
185
+ this.missionToEdit = m;
186
+ }
187
+ onCancel() {
188
+ this.working = false;
189
+ this.create = false;
190
+ this.missionToEdit = null;
191
+ this.createForExistingUser = false;
192
+ }
193
+ onAddForUser(org, user) {
194
+ this.hideList = true;
195
+ this.createForExistingUser = true;
196
+ this.userForAddingMission = user;
197
+ this.addToOrg = org;
198
+ }
199
+ onAddOrg() {
200
+ this.hideList = true;
201
+ this.isAddingOrg = true;
202
+ }
203
+ orgAdded(isAdded) {
204
+ this.hideList = false;
205
+ this.isAddingOrg = false;
206
+ this.isAddingToExistingOrg = false;
207
+ if (isAdded) {
208
+ this.resetList();
209
+ }
210
+ }
211
+ userAdded(isAdded) {
212
+ console.log(isAdded);
213
+ this.hideList = false;
214
+ this.create = false;
215
+ this.addToOrg = null;
216
+ this.createForExistingUser = false;
217
+ this.userForAddingMission = null;
218
+ if (isAdded) {
219
+ this.resetList();
220
+ }
221
+ }
222
+ async onMissionEdited(mission) {
223
+ this.edit = false;
224
+ this.missionToEdit = null;
225
+ if (mission) {
226
+ await this.userService.createOrUpdateMissionForOrgWithProperty(mission, mission.organisationID, false);
227
+ this.resetList();
228
+ }
229
+ this.hideList = false;
230
+ }
231
+ async onMissionCreated(mission) {
232
+ this.createForExistingUser = false;
233
+ this.userForAddingMission = null;
234
+ if (mission) {
235
+ await this.userService.createOrUpdateMissionForOrgWithProperty(mission, mission.organisationID);
236
+ this.resetList();
237
+ }
238
+ this.hideList = false;
239
+ }
240
+ getOrderedOrg(orgID) {
241
+ let name;
242
+ this.prestataireClients.map(async (presta) => {
243
+ if (presta.prestataire === orgID) {
244
+ const org = this.orgsUsersMissions.filter((object) => object.org.id === presta.orgOwner);
245
+ if (org.length > 0) {
246
+ name = org[0].org.name;
247
+ }
248
+ }
249
+ });
250
+ return name;
251
+ }
252
+ domainIdsToStringForMission(mission) {
253
+ let names = '';
254
+ for (const domainID of mission.domains) {
255
+ const domain = this.domains.find((dom) => dom.id === domainID);
256
+ if (domain) {
257
+ names = `${names} ${domain.name},`;
258
+ }
259
+ }
260
+ return names.slice(0, -1); // to remove last comma
261
+ }
262
+ async onDeleteMission(mission) {
263
+ const message = this.translate.instant('confirm.deleteMission');
264
+ if (window.confirm(message)) {
265
+ await this.missionService.softDeleteMission(mission.id);
266
+ this.resetList();
267
+ }
268
+ }
269
+ async onDeleteUser(user) {
270
+ const message = this.translate.instant('confirm.deleteUser');
271
+ if (window.confirm(message)) {
272
+ const userMissions = await this.missionService.getMissionsFromUserID(user.id);
273
+ if (userMissions.length > 0) {
274
+ const resultDelete = [];
275
+ await Promise.all(userMissions.map(async (mission) => {
276
+ if (mission.orderedOrganisationID === this.currentOrg.id ||
277
+ this.isSP) {
278
+ const deletedMission = await this.missionService.softDeleteMission(mission.id);
279
+ if (deletedMission) {
280
+ resultDelete.push(deletedMission);
281
+ }
282
+ }
283
+ }));
284
+ if (resultDelete.length > 0) {
285
+ await this.userService.softDeleteUser(user.id);
286
+ await this.resetList();
287
+ }
288
+ }
289
+ else {
290
+ await this.userService.softDeleteUser(user.id);
291
+ await this.resetList();
292
+ }
293
+ }
294
+ }
295
+ applyResultsSearchBar(results) {
296
+ this.orgSelectedDetails = null;
297
+ this.filteredOrgsUsersMissions = results || this.orgsUsersMissions;
298
+ }
299
+ onAddInExistingOrg() {
300
+ this.hideList = true;
301
+ this.isAddingToExistingOrg = true;
302
+ }
303
+ /**
304
+ * Creates encypted link and sets it for guestLink for Space.
305
+ * @param mis
306
+ */
307
+ onSetForShareableLink(user, mission) {
308
+ const modalReference = this.modalService.open(GuestLinkComponent);
309
+ modalReference.componentInstance.username = user.email;
310
+ modalReference.componentInstance.spaceID = mission.spaceID;
311
+ }
312
+ async onClearToken(user) {
313
+ await this.userService.clearUserToken(user.user.id);
314
+ const firstMessage = this.translate.instant('firstTokenMessage');
315
+ const secondMessage = this.translate.instant('secondTokenMessage');
316
+ alert(firstMessage + user.user.displayName + secondMessage);
317
+ }
318
+ }
319
+ UserComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: UserComponent, deps: [{ token: i1.BaseUserService }, { token: i1.MissionService }, { token: i1.DomainService }, { token: i1.OrganisationService }, { token: i2.NgbModal }, { token: i3.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
320
+ UserComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: UserComponent, selector: "lib-user", ngImport: i0, template: "<div class=\"dashboard-tab\">\r\n <div class=\"header-dashboard-tab\">\r\n <h3>{{'Users' | translate}}</h3>\r\n <!-- <app-search-bar *ngIf=\"!hideList\" [searchable]=\"orgsUsersMissions\" objectType=\"USER\"\r\n (searchEvent)=\"applyResultsSearchBar($event)\">\r\n </app-search-bar> -->\r\n <hr>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-8 col-lg-6\">\r\n <div class=\"row ml-0 mb-2\" *ngIf=\"!hideList\">\r\n <button class=\"btn btn-outline-primary rounded-pill add-button\" *ngIf=\"isManager && !isGuide\" (click)=\"onAddOrg()\">\r\n {{'Add user to new organisation' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div *ngIf=\"!hideList\">\r\n <ul class=\"list-group list-group-flush\" *ngIf=\"filteredOrgsUsersMissions\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let o of filteredOrgsUsersMissions\">\r\n <div class=\"d-flex justify-content-between align-items-center font-weight-bold\"\r\n ngbTooltip=\"See details and users\" style=\"cursor: pointer;\" (click)=\"onToggleDetailOrg(o.org.id, o.org)\">\r\n {{o.org.name}} <small *ngIf=\"o.org.id == currentOrg.id\">({{'My organisation' | translate}})</small>\r\n <small *ngIf=\"isSP && clientsSP.includes(o.org.id)\">({{'Client of SmarterPlan' | translate}})</small>\r\n <small *ngIf=\"isSP && getOrderedOrg(o.org.id)\">({{'Client of ' | translate}}\r\n {{getOrderedOrg(o.org.id)}})</small>\r\n <lib-chevron [conditionShowing]=\"detailsOrg==o.org.id\"></lib-chevron>\r\n </div>\r\n <div class=\"missions\" *ngIf=\"detailsOrg==o.org.id\">\r\n <div class='d-flex'>\r\n <button class=\"btn btn-outline-primary rounded-pill mt-3 mb-3\" (click)=\"onAdd(o.org)\">{{'Add user' |\r\n translate}}</button>\r\n </div>\r\n\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let a of o.users\"\r\n (click)=\"onToggleDetailUser(a.user.id)\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n {{a.user.displayName}}\r\n <lib-chevron [conditionShowing]=\"detailsUser==a.user.id\"></lib-chevron>\r\n </div>\r\n\r\n <div *ngIf=\"detailsUser==a.user.id\">\r\n <div class=\"ml-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{'Email' | translate}}: {{a.user.email }}\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\r\n (click)=\"onAddForUser(o.org, a.user)\">{{'Add new mission' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" (click)=\"onClearToken(a)\">\r\n {{'Clear Token' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\r\n (click)=\"onDeleteUser(a.user)\">{{'Delete user' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{ a.missions.length > 0 ? ('Current Missions' | translate) : ('No missions' | translate)}}\r\n </div>\r\n </div>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item\" *ngFor=\"let mis of a.missions\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.description\">\r\n {{'Description' | translate}}: {{mis.description}}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.templateMissionID\">\r\n {{'Attendee of tour' | translate}}: {{mis.templateMission.title}}</li>\r\n\r\n <li class=\"list-group-item bg-transparent\">{{'Role' | translate}}: {{ mis.role }}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.hashtags && mis.hashtags.length> 0\">\r\n {{'Hashtags' | translate}}: <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of mis.hashtags\">\r\n {{ hashtag | hashtagFromID | async }}</li>\r\n </div>\r\n </ul>\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Language' | translate }}: {{\r\n mis.locale ? mis.locale : ('Not applicable' | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate }}: {{\r\n mis.level}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Ordered by' | translate }}: {{\r\n mis.orderedOrganisation.name}}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.domains\">{{'Domains' | translate }}:\r\n {{mis.domains ?\r\n domainIdsToStringForMission(mis) : (\"No data\" | translate) }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Authorized location' | translate }}:\r\n {{ mis.space ? mis.space.name : \"No location\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Authorized zone' | translate }}:\r\n {{ mis.zone ? mis.zone.name : \"All zones allowed\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Starts' | translate }}:\r\n {{ mis.startDateTime ? (mis.startDateTime | timeDateString: \"day_time_zone\" | async) :\r\n \"No data\" | translate}}, {{'Ends' | translate}}: {{ mis.endDateTime\r\n ? (mis.endDateTime | timeDateString: \"day_time_zone\" | async)\r\n : \"No data\" | translate}}.\r\n </li>\r\n </ul>\r\n <div class=\"action-button-container\">\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill mr-2 action-button\"\r\n (click)=\"onEdit(mis)\">{{'Edit' |\r\n translate}}</button>\r\n <button type=\"button\" *ngIf=\"mis.role === 'VISITOR' || mis.role === 'VISITOR_MUSEUM'\"\r\n class=\"btn btn-outline-primary rounded-pill mr-2 action-button share-visitor-button\"\r\n (click)=\"onSetForShareableLink(a.user, mis)\">{{'Generate Shareable Link' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n (click)=\"onDeleteMission(mis)\">{{'Delete' | translate}}</button>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div *ngIf=\"create\">\r\n <lib-user-mission-form [addToOrganisation]=\"addToOrg\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\r\n (added)=\"userAdded($event)\">\r\n </lib-user-mission-form>\r\n </div>\r\n <div *ngIf=\"edit\">\r\n <lib-form-mission [missionToEdit]=\"missionToEdit\" [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\"\r\n (addedMissionInput)=\"onMissionEdited($event)\"></lib-form-mission>\r\n </div>\r\n <div *ngIf=\"createForExistingUser\">\r\n <lib-form-mission [organisationForMission]=\"addToOrg\" [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\"\r\n [userForMissionID]=\"userForAddingMission.id\" (addedMissionInput)=\"onMissionCreated($event)\">\r\n </lib-form-mission>\r\n </div>\r\n <div *ngIf=\"isAddingOrg || isAddingToExistingOrg\">\r\n <lib-form-organisation [currentOrg]=\"currentOrg\" [currentUser]=\"me\" [existing]=\"isAddingToExistingOrg\"\r\n (added)=\"orgAdded($event)\"></lib-form-organisation>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-4 col-lg-6\" *ngIf=\"orgSelectedDetails && !isGuide\">\r\n <lib-detail-organisation [org]=\"orgSelectedDetails\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\r\n (orgChanged)='orgAdded($event)'></lib-detail-organisation>\r\n </div>\r\n </div>\r\n</div>", styles: [".add-button{width:-moz-fit-content;width:fit-content;margin-left:.5rem}li.ml-4{margin-left:3rem}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}.action-button-container .share-visitor-button{width:-moz-fit-content;width:fit-content}\n"], components: [{ type: i1.LoaderComponent, selector: "lib-loader" }, { type: i4.ChevronComponent, selector: "lib-chevron", inputs: ["conditionShowing"] }, { type: i5.UserMissionFormComponent, selector: "lib-user-mission-form", inputs: ["addToOrganisation", "isSP", "createForExistingUser", "currentOrg"], outputs: ["added"] }, { type: i6.FormMissionComponent, selector: "lib-form-mission", inputs: ["missionToEdit", "organisationForMission", "isSP", "userForMissionID", "currentUserOrganisation"], outputs: ["addedMissionInput"] }, { type: i7.FormOrganisationComponent, selector: "lib-form-organisation", inputs: ["currentOrg", "currentUser", "existing"], outputs: ["added"] }, { type: i8.DetailOrganisationComponent, selector: "lib-detail-organisation", inputs: ["org", "currentOrg", "isSP"], outputs: ["orgChanged"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }], pipes: { "translate": i3.TranslatePipe, "async": i9.AsyncPipe, "hashtagFromID": i1.HashtagFromIdPipe, "timeDateString": i1.TimeDateToLocalStringPipe } });
321
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: UserComponent, decorators: [{
322
+ type: Component,
323
+ args: [{ selector: 'lib-user', template: "<div class=\"dashboard-tab\">\r\n <div class=\"header-dashboard-tab\">\r\n <h3>{{'Users' | translate}}</h3>\r\n <!-- <app-search-bar *ngIf=\"!hideList\" [searchable]=\"orgsUsersMissions\" objectType=\"USER\"\r\n (searchEvent)=\"applyResultsSearchBar($event)\">\r\n </app-search-bar> -->\r\n <hr>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-8 col-lg-6\">\r\n <div class=\"row ml-0 mb-2\" *ngIf=\"!hideList\">\r\n <button class=\"btn btn-outline-primary rounded-pill add-button\" *ngIf=\"isManager && !isGuide\" (click)=\"onAddOrg()\">\r\n {{'Add user to new organisation' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div *ngIf=\"!hideList\">\r\n <ul class=\"list-group list-group-flush\" *ngIf=\"filteredOrgsUsersMissions\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let o of filteredOrgsUsersMissions\">\r\n <div class=\"d-flex justify-content-between align-items-center font-weight-bold\"\r\n ngbTooltip=\"See details and users\" style=\"cursor: pointer;\" (click)=\"onToggleDetailOrg(o.org.id, o.org)\">\r\n {{o.org.name}} <small *ngIf=\"o.org.id == currentOrg.id\">({{'My organisation' | translate}})</small>\r\n <small *ngIf=\"isSP && clientsSP.includes(o.org.id)\">({{'Client of SmarterPlan' | translate}})</small>\r\n <small *ngIf=\"isSP && getOrderedOrg(o.org.id)\">({{'Client of ' | translate}}\r\n {{getOrderedOrg(o.org.id)}})</small>\r\n <lib-chevron [conditionShowing]=\"detailsOrg==o.org.id\"></lib-chevron>\r\n </div>\r\n <div class=\"missions\" *ngIf=\"detailsOrg==o.org.id\">\r\n <div class='d-flex'>\r\n <button class=\"btn btn-outline-primary rounded-pill mt-3 mb-3\" (click)=\"onAdd(o.org)\">{{'Add user' |\r\n translate}}</button>\r\n </div>\r\n\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let a of o.users\"\r\n (click)=\"onToggleDetailUser(a.user.id)\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n {{a.user.displayName}}\r\n <lib-chevron [conditionShowing]=\"detailsUser==a.user.id\"></lib-chevron>\r\n </div>\r\n\r\n <div *ngIf=\"detailsUser==a.user.id\">\r\n <div class=\"ml-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{'Email' | translate}}: {{a.user.email }}\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\r\n (click)=\"onAddForUser(o.org, a.user)\">{{'Add new mission' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" (click)=\"onClearToken(a)\">\r\n {{'Clear Token' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\r\n (click)=\"onDeleteUser(a.user)\">{{'Delete user' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{ a.missions.length > 0 ? ('Current Missions' | translate) : ('No missions' | translate)}}\r\n </div>\r\n </div>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item\" *ngFor=\"let mis of a.missions\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.description\">\r\n {{'Description' | translate}}: {{mis.description}}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.templateMissionID\">\r\n {{'Attendee of tour' | translate}}: {{mis.templateMission.title}}</li>\r\n\r\n <li class=\"list-group-item bg-transparent\">{{'Role' | translate}}: {{ mis.role }}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.hashtags && mis.hashtags.length> 0\">\r\n {{'Hashtags' | translate}}: <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of mis.hashtags\">\r\n {{ hashtag | hashtagFromID | async }}</li>\r\n </div>\r\n </ul>\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Language' | translate }}: {{\r\n mis.locale ? mis.locale : ('Not applicable' | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate }}: {{\r\n mis.level}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Ordered by' | translate }}: {{\r\n mis.orderedOrganisation.name}}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.domains\">{{'Domains' | translate }}:\r\n {{mis.domains ?\r\n domainIdsToStringForMission(mis) : (\"No data\" | translate) }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Authorized location' | translate }}:\r\n {{ mis.space ? mis.space.name : \"No location\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Authorized zone' | translate }}:\r\n {{ mis.zone ? mis.zone.name : \"All zones allowed\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Starts' | translate }}:\r\n {{ mis.startDateTime ? (mis.startDateTime | timeDateString: \"day_time_zone\" | async) :\r\n \"No data\" | translate}}, {{'Ends' | translate}}: {{ mis.endDateTime\r\n ? (mis.endDateTime | timeDateString: \"day_time_zone\" | async)\r\n : \"No data\" | translate}}.\r\n </li>\r\n </ul>\r\n <div class=\"action-button-container\">\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill mr-2 action-button\"\r\n (click)=\"onEdit(mis)\">{{'Edit' |\r\n translate}}</button>\r\n <button type=\"button\" *ngIf=\"mis.role === 'VISITOR' || mis.role === 'VISITOR_MUSEUM'\"\r\n class=\"btn btn-outline-primary rounded-pill mr-2 action-button share-visitor-button\"\r\n (click)=\"onSetForShareableLink(a.user, mis)\">{{'Generate Shareable Link' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n (click)=\"onDeleteMission(mis)\">{{'Delete' | translate}}</button>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div *ngIf=\"create\">\r\n <lib-user-mission-form [addToOrganisation]=\"addToOrg\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\r\n (added)=\"userAdded($event)\">\r\n </lib-user-mission-form>\r\n </div>\r\n <div *ngIf=\"edit\">\r\n <lib-form-mission [missionToEdit]=\"missionToEdit\" [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\"\r\n (addedMissionInput)=\"onMissionEdited($event)\"></lib-form-mission>\r\n </div>\r\n <div *ngIf=\"createForExistingUser\">\r\n <lib-form-mission [organisationForMission]=\"addToOrg\" [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\"\r\n [userForMissionID]=\"userForAddingMission.id\" (addedMissionInput)=\"onMissionCreated($event)\">\r\n </lib-form-mission>\r\n </div>\r\n <div *ngIf=\"isAddingOrg || isAddingToExistingOrg\">\r\n <lib-form-organisation [currentOrg]=\"currentOrg\" [currentUser]=\"me\" [existing]=\"isAddingToExistingOrg\"\r\n (added)=\"orgAdded($event)\"></lib-form-organisation>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-4 col-lg-6\" *ngIf=\"orgSelectedDetails && !isGuide\">\r\n <lib-detail-organisation [org]=\"orgSelectedDetails\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\r\n (orgChanged)='orgAdded($event)'></lib-detail-organisation>\r\n </div>\r\n </div>\r\n</div>", styles: [".add-button{width:-moz-fit-content;width:fit-content;margin-left:.5rem}li.ml-4{margin-left:3rem}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}.action-button-container .share-visitor-button{width:-moz-fit-content;width:fit-content}\n"] }]
324
+ }], ctorParameters: function () { return [{ type: i1.BaseUserService }, { type: i1.MissionService }, { type: i1.DomainService }, { type: i1.OrganisationService }, { type: i2.NgbModal }, { type: i3.TranslateService }]; } });
325
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL3VzZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWFkbWluL3NyYy9saWIvdXNlci91c2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFbEQsT0FBTyxFQUlMLFVBQVUsRUFDVixxQkFBcUIsRUFNckIsYUFBYSxHQUNkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7Ozs7O0FBUXhFLE1BQU0sT0FBTyxhQUFhO0lBbUV4QixZQUNVLFdBQTRCLEVBQzVCLGNBQThCLEVBQzlCLGFBQTRCLEVBQzVCLG1CQUF3QyxFQUN4QyxZQUFzQixFQUN0QixTQUEyQjtRQUwzQixnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFDNUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsaUJBQVksR0FBWixZQUFZLENBQVU7UUFDdEIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUF0RXJDLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBRW5CLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFFbEIsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUVYLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFFZixTQUFJLEdBQUcsS0FBSyxDQUFDO1FBRWIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUVoQiwwQkFBcUIs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QUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNqRSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ25FLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLENBQUM7SUFDOUQsQ0FBQzs7MEdBbGFVLGFBQWE7OEZBQWIsYUFBYSxnREN4QjFCLGt5U0E4SU07MkZEdEhPLGFBQWE7a0JBTHpCLFNBQVM7K0JBQ0UsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHtcclxuICBCYXNlVXNlclNlcnZpY2UsXHJcbiAgRG9tYWluLFxyXG4gIERvbWFpblNlcnZpY2UsXHJcbiAgRG9tYWluVHlwZSxcclxuICBmaWx0ZXJVbmlxdWVBcnJheUJ5SUQsXHJcbiAgTWlzc2lvbixcclxuICBNaXNzaW9uU2VydmljZSxcclxuICBPcmdhbmlzYXRpb24sXHJcbiAgT3JnYW5pc2F0aW9uU2VydmljZSxcclxuICBQcm9maWxlLFxyXG4gIFByb2ZpbGVFbnRpdHksXHJcbn0gZnJvbSAnbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgR3Vlc3RMaW5rQ29tcG9uZW50IH0gZnJvbSAnLi4vZ3Vlc3QtbGluay9ndWVzdC1saW5rLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItdXNlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3VzZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3VzZXIuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVzZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHVzZXJzOiBBcnJheTxNaXNzaW9uICYgeyBuYW1lOiBzdHJpbmcgfT47XHJcblxyXG4gIGRldGFpbHNVc2VyID0gJy0xJztcclxuXHJcbiAgZGV0YWlsc09yZyA9ICctMSc7XHJcblxyXG4gIHF1ZXJ5ID0gJyc7XHJcblxyXG4gIGNyZWF0ZSA9IGZhbHNlO1xyXG5cclxuICBlZGl0ID0gZmFsc2U7XHJcblxyXG4gIHdvcmtpbmcgPSBmYWxzZTtcclxuXHJcbiAgY3JlYXRlRm9yRXhpc3RpbmdVc2VyID0gZmFsc2U7XHJcblxyXG4gIGlzQWRkaW5nT3JnID0gZmFsc2U7XHJcblxyXG4gIGlzQWRkaW5nVG9FeGlzdGluZ09yZyA9IGZhbHNlO1xyXG5cclxuICB1c2VyRm9yQWRkaW5nTWlzc2lvbjogUHJvZmlsZUVudGl0eTtcclxuXHJcbiAgY3VycmVudE9yZzogT3JnYW5pc2F0aW9uO1xyXG5cclxuICBtZTogUHJvZmlsZUVudGl0eTtcclxuXHJcbiAgaXNNYW5hZ2VyID0gZmFsc2U7XHJcblxyXG4gIGhpZGVMaXN0ID0gZmFsc2U7XHJcblxyXG4gIG9yZ3NVc2Vyc01pc3Npb25zOiBBcnJheTx7XHJcbiAgICBvcmc6IE9yZ2FuaXNhdGlvbjtcclxuICAgIHVzZXJzOiBBcnJheTx7XHJcbiAgICAgIG1pc3Npb25zOiBNaXNzaW9uW107XHJcbiAgICAgIHVzZXI6IFByb2ZpbGVFbnRpdHk7XHJcbiAgICB9PjtcclxuICB9PiA9IFtdO1xyXG5cclxuICBtaXNzaW9uVG9FZGl0OiBNaXNzaW9uO1xyXG5cclxuICBpc1NQID0gZmFsc2U7XHJcblxyXG4gIGlzR3VpZGUgPSBmYWxzZTtcclxuXHJcbiAgY2xpZW50c1NQOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBwcmVzdGF0YWlyZUNsaWVudHM6IEFycmF5PHsgb3JnT3duZXI6IHN0cmluZzsgcHJlc3RhdGFpcmU6IHN0cmluZyB9PiA9IFtdO1xyXG5cclxuICBkb21haW5zOiBEb21haW5bXTtcclxuXHJcbiAgYWRkVG9Pcmc6IE9yZ2FuaXNhdGlvbjtcclxuXHJcbiAgb3JnU2VsZWN0ZWREZXRhaWxzOiBPcmdhbmlzYXRpb247XHJcblxyXG4gIGZpbHRlcmVkT3Jnc1VzZXJzTWlzc2lvbnM6IEFycmF5PHtcclxuICAgIG9yZzogT3JnYW5pc2F0aW9uO1xyXG4gICAgdXNlcnM6IEFycmF5PHtcclxuICAgICAgbWlzc2lvbnM6IE1pc3Npb25bXTtcclxuICAgICAgdXNlcjogUHJvZmlsZUVudGl0eTtcclxuICAgIH0+O1xyXG4gIH0+O1xyXG5cclxuICBsb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgbWlzc2lvblNlcnZpY2U6IE1pc3Npb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkb21haW5TZXJ2aWNlOiBEb21haW5TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBvcmdhbmlzYXRpb25TZXJ2aWNlOiBPcmdhbmlzYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsLFxyXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMudXNlclNlcnZpY2UuaXNDaGFuZ2VkXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoaXNDb25uZWN0ZWQpID0+IHtcclxuICAgICAgICBpZiAoaXNDb25uZWN0ZWQpIHtcclxuICAgICAgICAgIHRoaXMuaW5pdEluZm8oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gQHRvZG8gbGlzdCBteSBvcmcgYW5kIHN1YiBvcmdzXHJcblxyXG4gIC8qKlxyXG4gICAqIHJlc2V0TGlzdCBmZXRjaGVzIGEgZnJlc2ggdXNlciBsaXN0IGZyb20gc2VydmVyXHJcbiAgICovXHJcbiAgYXN5bmMgcmVzZXRMaXN0KCkge1xyXG4gICAgdGhpcy5vcmdzVXNlcnNNaXNzaW9ucyA9IFtdO1xyXG4gICAgbGV0IGFsbE1pc3Npb25zID0gW107XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuaXNTUCkge1xyXG4gICAgICB0aGlzLm9yZ3NVc2Vyc01pc3Npb25zID0gYXdhaXQgdGhpcy5pbml0TGlzdEZvclNQKCk7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRPcmdzVXNlcnNNaXNzaW9ucyA9IHRoaXMub3Jnc1VzZXJzTWlzc2lvbnM7XHJcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBhbGxNaXNzaW9ucyA9IGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2UuZ2V0TWlzc2lvbnNCeU9yZGVyZWRPcmdhbmlzYXRpb24oXHJcbiAgICAgIHRoaXMuY3VycmVudE9yZy5pZFxyXG4gICAgKTtcclxuICAgIGNvbnN0IGN1cnJlbnRPcmdNaXNzaW9ucyA9XHJcbiAgICAgIGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2UuZ2V0TWlzc2lvbnNCeU9yZ2FuaXNhdGlvbih0aGlzLmN1cnJlbnRPcmcuaWQpO1xyXG4gICAgYWxsTWlzc2lvbnMgPSBbLi4uYWxsTWlzc2lvbnMsIC4uLmN1cnJlbnRPcmdNaXNzaW9uc107XHJcbiAgICBhbGxNaXNzaW9ucyA9IGFsbE1pc3Npb25zLmZpbHRlcigobWlzc2lvbikgPT4gbWlzc2lvbi51c2VyICYmICFtaXNzaW9uLnVzZXIuZGVsZXRlZEF0KTtcclxuICAgIGFsbE1pc3Npb25zID0gZmlsdGVyVW5pcXVlQXJyYXlCeUlEKGFsbE1pc3Npb25zKTtcclxuXHJcbiAgICBpZiAoYWxsTWlzc2lvbnMpIHtcclxuICAgICAgY29uc3Qgb3JncyA9IGFsbE1pc3Npb25zLm1hcCgobWlzKSA9PiBtaXMub3JnYW5pc2F0aW9uKTtcclxuICAgICAgY29uc3QgcHJvZmlsZXMgPSBhbGxNaXNzaW9ucy5tYXAoKG1pcykgPT4gbWlzLnVzZXIpO1xyXG4gICAgICBjb25zdCB1bmlxdWVPcmcgPSBmaWx0ZXJVbmlxdWVBcnJheUJ5SUQob3Jncyk7XHJcbiAgICAgIGNvbnN0IHVuaXF1ZVVzZXJzID0gZmlsdGVyVW5pcXVlQXJyYXlCeUlEKHByb2ZpbGVzKTtcclxuICAgICAgdW5pcXVlT3JnLm1hcCgob3JnKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgb3JnTWlzc2lvbnMgPSBhbGxNaXNzaW9ucy5maWx0ZXIoKG1pcykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIG1pcy5vcmdhbmlzYXRpb25JRCA9PT0gb3JnLmlkO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGxldCB1c2VycyA9IHRoaXMuZ2V0VXNlcnNGb3JPcmdNaXNzaW9ucyh1bmlxdWVVc2Vycywgb3JnTWlzc2lvbnMpO1xyXG4gICAgICAgIHVzZXJzID0gdXNlcnMuc29ydCgodXNlcikgPT4gKHVzZXIudXNlci5lbWFpbCA/IDAgOiAtMSkpO1xyXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHtcclxuICAgICAgICAgIG9yZyxcclxuICAgICAgICAgIHVzZXJzLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5vcmdzVXNlcnNNaXNzaW9ucy5wdXNoKG9iamVjdCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5maWx0ZXJlZE9yZ3NVc2Vyc01pc3Npb25zID0gdGhpcy5vcmdzVXNlcnNNaXNzaW9ucztcclxuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgaW5pdEluZm8oKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VXNlciA9IHRoaXMudXNlclNlcnZpY2UuY3U7XHJcbiAgICBpZiAoY3VycmVudFVzZXIpIHtcclxuICAgICAgdGhpcy5tZSA9IGN1cnJlbnRVc2VyO1xyXG4gICAgICB0aGlzLmN1cnJlbnRPcmcgPSB0aGlzLnVzZXJTZXJ2aWNlLmN1cnJlbnRPcmdhbmlzYXRpb24oKTtcclxuICAgICAgdGhpcy5pc01hbmFnZXIgPSB0aGlzLnVzZXJTZXJ2aWNlLmhhc01hbmFnZXJSb2xlSW5BbnlNaXNzaW9uKCk7XHJcbiAgICAgIHRoaXMuaXNTUCA9IHRoaXMudXNlclNlcnZpY2UuaXNTUEFkbWluKCk7XHJcbiAgICAgIHRoaXMuaXNHdWlkZSA9IHRoaXMudXNlclNlcnZpY2UuaXNHdWlkZSgpO1xyXG4gICAgICB0aGlzLnJlc2V0TGlzdCgpO1xyXG4gICAgICB0aGlzLnNldERvbWFpbnMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5pbml0SW5mbygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBpbml0TGlzdEZvclNQKCk6IFByb21pc2U8YW55W10+IHtcclxuICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcclxuICAgIGxldCBhbGxNaXNzaW9ucyA9IFtdO1xyXG4gICAgbGV0IGFsbE9yZ3MgPSBbXTtcclxuICAgIGFsbE9yZ3MgPSBhd2FpdCB0aGlzLm9yZ2FuaXNhdGlvblNlcnZpY2UubGlzdE9yZ2FuaXNhdGlvbnMoKTtcclxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICBhbGxPcmdzLm1hcChhc3luYyAob3JnKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbWlzc2lvbnMgPSBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLmdldE1pc3Npb25zQnlPcmdhbmlzYXRpb24oXHJcbiAgICAgICAgICBvcmcuaWRcclxuICAgICAgICApO1xyXG4gICAgICAgIGFsbE1pc3Npb25zID0gWy4uLmFsbE1pc3Npb25zLCAuLi5taXNzaW9uc107XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHByb2ZpbGVzID0gYWxsTWlzc2lvbnNcclxuICAgICAgLm1hcCgobWlzKSA9PiBtaXMudXNlcilcclxuICAgICAgLmZpbHRlcigodXNlcikgPT4gIXVzZXIuZGVsZXRlZEF0KTtcclxuICAgIGNvbnN0IHVuaXF1ZVVzZXJzID0gZmlsdGVyVW5pcXVlQXJyYXlCeUlEKFxyXG4gICAgICBwcm9maWxlcy5maWx0ZXIoKHByb2ZpbGUpID0+IHByb2ZpbGUgIT09IG51bGwpXHJcbiAgICApO1xyXG4gICAgYWxsT3Jncy5tYXAoKG9yZykgPT4ge1xyXG4gICAgICBjb25zdCBvcmdNaXNzaW9ucyA9IGFsbE1pc3Npb25zLmZpbHRlcigobWlzKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG1pcy5vcmdhbmlzYXRpb25JRCA9PT0gb3JnLmlkO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmIChvcmdNaXNzaW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgb3JnTWlzc2lvbnMuZmlsdGVyKFxyXG4gICAgICAgICAgICAobSkgPT5cclxuICAgICAgICAgICAgICBtLm9yZGVyZWRPcmdhbmlzYXRpb25JRCA9PT0gJzZlMjgyMDFmLTQ2NzktNGMyOS05ZDJkLThhMzI1ZjU3Y2VlOSdcclxuICAgICAgICAgICkubGVuZ3RoID4gMFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5jbGllbnRzU1AucHVzaChvcmcuaWQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnByZXN0YXRhaXJlQ2xpZW50cy5wdXNoKHtcclxuICAgICAgICAgICAgb3JnT3duZXI6IG9yZ01pc3Npb25zWzBdLm9yZGVyZWRPcmdhbmlzYXRpb25JRCxcclxuICAgICAgICAgICAgcHJlc3RhdGFpcmU6IG9yZy5pZCxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjb25zdCB1c2VycyA9IHRoaXMuZ2V0VXNlcnNGb3JPcmdNaXNzaW9ucyh1bmlxdWVVc2Vycywgb3JnTWlzc2lvbnMpO1xyXG4gICAgICBjb25zdCBvYmplY3QgPSB7XHJcbiAgICAgICAgb3JnLFxyXG4gICAgICAgIHVzZXJzLFxyXG4gICAgICB9O1xyXG4gICAgICByZXN1bHRzLnB1c2gob2JqZWN0KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgfVxyXG5cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xyXG4gIGdldFVzZXJzRm9yT3JnTWlzc2lvbnMoXHJcbiAgICB1bmlxdWVVc2VyczogUHJvZmlsZVtdLFxyXG4gICAgb3JnTWlzc2lvbnM6IE1pc3Npb25bXVxyXG4gICk6IEFycmF5PHtcclxuICAgIG1pc3Npb25zOiBNaXNzaW9uW107XHJcbiAgICB1c2VyOiBQcm9maWxlRW50aXR5O1xyXG4gIH0+IHtcclxuICAgIGNvbnN0IHVzZXJzID0gdW5pcXVlVXNlcnMubWFwKCh1c2VyKSA9PiB7XHJcbiAgICAgIGNvbnN0IHVzZXJNaXNzaW9ucyA9IG9yZ01pc3Npb25zLmZpbHRlcigobSkgPT4gbS51c2VySUQgPT09IHVzZXIuaWQpO1xyXG4gICAgICBpZiAodXNlck1pc3Npb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCB1c2VyUHJvZmlsZSA9IG5ldyBQcm9maWxlRW50aXR5KHVzZXIpO1xyXG4gICAgICAgIC8vIG9uY2Ugd2UgZ290IHRoZSB1c2VyIHdlIGNoZWNrIGZpbHRlciBvbmx5IGFjdGl2ZSBtaXNzaW9ucyAobm90IGRlbGV0ZWQpXHJcbiAgICAgICAgY29uc3QgYWN0aXZlTWlzc2lvbnMgPSB1c2VyTWlzc2lvbnMuZmlsdGVyKChtaXMpID0+ICFtaXMuZGVsZXRlZEF0KTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgbWlzc2lvbnM6IGFjdGl2ZU1pc3Npb25zLFxyXG4gICAgICAgICAgdXNlcjogdXNlclByb2ZpbGUsXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHVzZXJzLmZpbHRlcigodXMpID0+IHVzICE9PSBudWxsKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHNldERvbWFpbnMoKSB7XHJcbiAgICBjb25zdCBkb21haW5zID0gYXdhaXQgdGhpcy5kb21haW5TZXJ2aWNlLmdldERvbWFpbnNGb3JPcmdFeGNsdWRpbmdUeXBlcyhcclxuICAgICAgW0RvbWFpblR5cGUuRkVBVFVSRSwgRG9tYWluVHlwZS5CT09LSU5HXSxcclxuICAgICAgdGhpcy5jdXJyZW50T3JnLmlkXHJcbiAgICApO1xyXG4gICAgdGhpcy5kb21haW5zID0gZG9tYWlucztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIG9uVG9nZ2xlRGV0YWlsIGZvbGRzL3VuZm9sZHMgZGV0YWlscyBmb3IgYSBnaXZlbiBvcmdhbmlzYXRpb25cclxuICAgKiBAcGFyYW0gaSBpbmRleCBvZiB0aGUgb3JnYW5pc2F0aW9uIHRvIGJlIHRvZ2dsZWRcclxuICAgKi9cclxuICBvblRvZ2dsZURldGFpbE9yZyhpbmRleCwgb3JnKSB7XHJcbiAgICB0aGlzLmRldGFpbHNPcmcgPSBpbmRleCA9PT0gdGhpcy5kZXRhaWxzT3JnID8gJy0xJyA6IGluZGV4O1xyXG4gICAgdGhpcy5vcmdTZWxlY3RlZERldGFpbHMgPSB0aGlzLmRldGFpbHNPcmcgPT09ICctMScgPyBudWxsIDogb3JnO1xyXG4gIH1cclxuXHJcbiAgb25Ub2dnbGVEZXRhaWxVc2VyKGluZGV4KSB7XHJcbiAgICB0aGlzLmRldGFpbHNVc2VyID0gaW5kZXggPT09IHRoaXMuZGV0YWlsc1VzZXIgPyAnLTEnIDogaW5kZXg7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkFkZChvcmc6IE9yZ2FuaXNhdGlvbikge1xyXG4gICAgdGhpcy5jcmVhdGUgPSB0cnVlO1xyXG4gICAgdGhpcy5oaWRlTGlzdCA9IHRydWU7XHJcbiAgICB0aGlzLmFkZFRvT3JnID0gb3JnO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25FZGl0KG06IE1pc3Npb24pIHtcclxuICAgIHRoaXMuZWRpdCA9IHRydWU7XHJcbiAgICB0aGlzLmhpZGVMaXN0ID0gdHJ1ZTtcclxuICAgIHRoaXMubWlzc2lvblRvRWRpdCA9IG07XHJcbiAgfVxyXG5cclxuICBvbkNhbmNlbCgpIHtcclxuICAgIHRoaXMud29ya2luZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5jcmVhdGUgPSBmYWxzZTtcclxuICAgIHRoaXMubWlzc2lvblRvRWRpdCA9IG51bGw7XHJcbiAgICB0aGlzLmNyZWF0ZUZvckV4aXN0aW5nVXNlciA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb25BZGRGb3JVc2VyKG9yZzogT3JnYW5pc2F0aW9uLCB1c2VyOiBQcm9maWxlRW50aXR5KSB7XHJcbiAgICB0aGlzLmhpZGVMaXN0ID0gdHJ1ZTtcclxuICAgIHRoaXMuY3JlYXRlRm9yRXhpc3RpbmdVc2VyID0gdHJ1ZTtcclxuICAgIHRoaXMudXNlckZvckFkZGluZ01pc3Npb24gPSB1c2VyO1xyXG4gICAgdGhpcy5hZGRUb09yZyA9IG9yZztcclxuICB9XHJcblxyXG4gIG9uQWRkT3JnKCkge1xyXG4gICAgdGhpcy5oaWRlTGlzdCA9IHRydWU7XHJcbiAgICB0aGlzLmlzQWRkaW5nT3JnID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIG9yZ0FkZGVkKGlzQWRkZWQ6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuaGlkZUxpc3QgPSBmYWxzZTtcclxuICAgIHRoaXMuaXNBZGRpbmdPcmcgPSBmYWxzZTtcclxuICAgIHRoaXMuaXNBZGRpbmdUb0V4aXN0aW5nT3JnID0gZmFsc2U7XHJcbiAgICBpZiAoaXNBZGRlZCkge1xyXG4gICAgICB0aGlzLnJlc2V0TGlzdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXNlckFkZGVkKGlzQWRkZWQ6IGJvb2xlYW4pIHtcclxuICAgIGNvbnNvbGUubG9nKGlzQWRkZWQpO1xyXG4gICAgdGhpcy5oaWRlTGlzdCA9IGZhbHNlO1xyXG4gICAgdGhpcy5jcmVhdGUgPSBmYWxzZTtcclxuICAgIHRoaXMuYWRkVG9PcmcgPSBudWxsO1xyXG4gICAgdGhpcy5jcmVhdGVGb3JFeGlzdGluZ1VzZXIgPSBmYWxzZTtcclxuICAgIHRoaXMudXNlckZvckFkZGluZ01pc3Npb24gPSBudWxsO1xyXG4gICAgaWYgKGlzQWRkZWQpIHtcclxuICAgICAgdGhpcy5yZXNldExpc3QoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG9uTWlzc2lvbkVkaXRlZChtaXNzaW9uOiBNaXNzaW9uKSB7XHJcbiAgICB0aGlzLmVkaXQgPSBmYWxzZTtcclxuICAgIHRoaXMubWlzc2lvblRvRWRpdCA9IG51bGw7XHJcbiAgICBpZiAobWlzc2lvbikge1xyXG4gICAgICBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmNyZWF0ZU9yVXBkYXRlTWlzc2lvbkZvck9yZ1dpdGhQcm9wZXJ0eShcclxuICAgICAgICBtaXNzaW9uLFxyXG4gICAgICAgIG1pc3Npb24ub3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgICAgZmFsc2VcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5yZXNldExpc3QoKTtcclxuICAgIH1cclxuICAgIHRoaXMuaGlkZUxpc3QgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uTWlzc2lvbkNyZWF0ZWQobWlzc2lvbjogTWlzc2lvbikge1xyXG4gICAgdGhpcy5jcmVhdGVGb3JFeGlzdGluZ1VzZXIgPSBmYWxzZTtcclxuICAgIHRoaXMudXNlckZvckFkZGluZ01pc3Npb24gPSBudWxsO1xyXG4gICAgaWYgKG1pc3Npb24pIHtcclxuICAgICAgYXdhaXQgdGhpcy51c2VyU2VydmljZS5jcmVhdGVPclVwZGF0ZU1pc3Npb25Gb3JPcmdXaXRoUHJvcGVydHkoXHJcbiAgICAgICAgbWlzc2lvbixcclxuICAgICAgICBtaXNzaW9uLm9yZ2FuaXNhdGlvbklEXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMucmVzZXRMaXN0KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmhpZGVMaXN0ID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXRPcmRlcmVkT3JnKG9yZ0lEOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGxldCBuYW1lO1xyXG4gICAgdGhpcy5wcmVzdGF0YWlyZUNsaWVudHMubWFwKGFzeW5jIChwcmVzdGEpID0+IHtcclxuICAgICAgaWYgKHByZXN0YS5wcmVzdGF0YWlyZSA9PT0gb3JnSUQpIHtcclxuICAgICAgICBjb25zdCBvcmcgPSB0aGlzLm9yZ3NVc2Vyc01pc3Npb25zLmZpbHRlcihcclxuICAgICAgICAgIChvYmplY3QpID0+IG9iamVjdC5vcmcuaWQgPT09IHByZXN0YS5vcmdPd25lclxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKG9yZy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBuYW1lID0gb3JnWzBdLm9yZy5uYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gbmFtZTtcclxuICB9XHJcblxyXG4gIGRvbWFpbklkc1RvU3RyaW5nRm9yTWlzc2lvbihtaXNzaW9uOiBNaXNzaW9uKTogc3RyaW5nIHtcclxuICAgIGxldCBuYW1lcyA9ICcnO1xyXG4gICAgZm9yIChjb25zdCBkb21haW5JRCBvZiBtaXNzaW9uLmRvbWFpbnMpIHtcclxuICAgICAgY29uc3QgZG9tYWluID0gdGhpcy5kb21haW5zLmZpbmQoKGRvbSkgPT4gZG9tLmlkID09PSBkb21haW5JRCk7XHJcbiAgICAgIGlmIChkb21haW4pIHtcclxuICAgICAgICBuYW1lcyA9IGAke25hbWVzfSAke2RvbWFpbi5uYW1lfSxgO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmFtZXMuc2xpY2UoMCwgLTEpOyAvLyB0byByZW1vdmUgbGFzdCBjb21tYVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25EZWxldGVNaXNzaW9uKG1pc3Npb246IE1pc3Npb24pIHtcclxuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdjb25maXJtLmRlbGV0ZU1pc3Npb24nKTtcclxuICAgIGlmICh3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xyXG4gICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLnNvZnREZWxldGVNaXNzaW9uKG1pc3Npb24uaWQpO1xyXG4gICAgICB0aGlzLnJlc2V0TGlzdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25EZWxldGVVc2VyKHVzZXIpIHtcclxuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdjb25maXJtLmRlbGV0ZVVzZXInKTtcclxuICAgIGlmICh3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xyXG4gICAgICBjb25zdCB1c2VyTWlzc2lvbnMgPSBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLmdldE1pc3Npb25zRnJvbVVzZXJJRChcclxuICAgICAgICB1c2VyLmlkXHJcbiAgICAgICk7XHJcbiAgICAgIGlmICh1c2VyTWlzc2lvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdERlbGV0ZSA9IFtdO1xyXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgdXNlck1pc3Npb25zLm1hcChhc3luYyAobWlzc2lvbikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgbWlzc2lvbi5vcmRlcmVkT3JnYW5pc2F0aW9uSUQgPT09IHRoaXMuY3VycmVudE9yZy5pZCB8fFxyXG4gICAgICAgICAgICAgIHRoaXMuaXNTUFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICBjb25zdCBkZWxldGVkTWlzc2lvbiA9XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLnNvZnREZWxldGVNaXNzaW9uKG1pc3Npb24uaWQpO1xyXG4gICAgICAgICAgICAgIGlmIChkZWxldGVkTWlzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0RGVsZXRlLnB1c2goZGVsZXRlZE1pc3Npb24pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChyZXN1bHREZWxldGUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy51c2VyU2VydmljZS5zb2Z0RGVsZXRlVXNlcih1c2VyLmlkKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMucmVzZXRMaXN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGF3YWl0IHRoaXMudXNlclNlcnZpY2Uuc29mdERlbGV0ZVVzZXIodXNlci5pZCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5yZXNldExpc3QoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXBwbHlSZXN1bHRzU2VhcmNoQmFyKHJlc3VsdHMpIHtcclxuICAgIHRoaXMub3JnU2VsZWN0ZWREZXRhaWxzID0gbnVsbDtcclxuICAgIHRoaXMuZmlsdGVyZWRPcmdzVXNlcnNNaXNzaW9ucyA9IHJlc3VsdHMgfHwgdGhpcy5vcmdzVXNlcnNNaXNzaW9ucztcclxuICB9XHJcblxyXG4gIG9uQWRkSW5FeGlzdGluZ09yZygpIHtcclxuICAgIHRoaXMuaGlkZUxpc3QgPSB0cnVlO1xyXG4gICAgdGhpcy5pc0FkZGluZ1RvRXhpc3RpbmdPcmcgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBlbmN5cHRlZCBsaW5rIGFuZCBzZXRzIGl0IGZvciBndWVzdExpbmsgZm9yIFNwYWNlLlxyXG4gICAqIEBwYXJhbSBtaXNcclxuICAgKi9cclxuICBvblNldEZvclNoYXJlYWJsZUxpbmsodXNlcjogUHJvZmlsZUVudGl0eSwgbWlzc2lvbjogTWlzc2lvbikge1xyXG4gICAgY29uc3QgbW9kYWxSZWZlcmVuY2UgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEd1ZXN0TGlua0NvbXBvbmVudCk7XHJcbiAgICBtb2RhbFJlZmVyZW5jZS5jb21wb25lbnRJbnN0YW5jZS51c2VybmFtZSA9IHVzZXIuZW1haWw7XHJcbiAgICBtb2RhbFJlZmVyZW5jZS5jb21wb25lbnRJbnN0YW5jZS5zcGFjZUlEID0gbWlzc2lvbi5zcGFjZUlEO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25DbGVhclRva2VuKHVzZXIpIHtcclxuICAgIGF3YWl0IHRoaXMudXNlclNlcnZpY2UuY2xlYXJVc2VyVG9rZW4odXNlci51c2VyLmlkKTtcclxuICAgIGNvbnN0IGZpcnN0TWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2ZpcnN0VG9rZW5NZXNzYWdlJyk7XHJcbiAgICBjb25zdCBzZWNvbmRNZXNzYWdlID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnc2Vjb25kVG9rZW5NZXNzYWdlJyk7XHJcbiAgICBhbGVydChmaXJzdE1lc3NhZ2UgKyB1c2VyLnVzZXIuZGlzcGxheU5hbWUgKyBzZWNvbmRNZXNzYWdlKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImRhc2hib2FyZC10YWJcIj5cclxuICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWRhc2hib2FyZC10YWJcIj5cclxuICAgIDxoMz57eydVc2VycycgfCB0cmFuc2xhdGV9fTwvaDM+XHJcbiAgICA8IS0tIDxhcHAtc2VhcmNoLWJhciAqbmdJZj1cIiFoaWRlTGlzdFwiIFtzZWFyY2hhYmxlXT1cIm9yZ3NVc2Vyc01pc3Npb25zXCIgb2JqZWN0VHlwZT1cIlVTRVJcIlxyXG4gICAgICAgIChzZWFyY2hFdmVudCk9XCJhcHBseVJlc3VsdHNTZWFyY2hCYXIoJGV2ZW50KVwiPlxyXG4gICAgICA8L2FwcC1zZWFyY2gtYmFyPiAtLT5cclxuICAgIDxocj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTggY29sLWxnLTZcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBtbC0wIG1iLTJcIiAqbmdJZj1cIiFoaWRlTGlzdFwiPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgYWRkLWJ1dHRvblwiICpuZ0lmPVwiaXNNYW5hZ2VyICYmICFpc0d1aWRlXCIgKGNsaWNrKT1cIm9uQWRkT3JnKClcIj5cclxuICAgICAgICAgIHt7J0FkZCB1c2VyIHRvIG5ldyBvcmdhbmlzYXRpb24nIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiICpuZ0lmPVwibG9hZGluZ1wiPlxyXG4gICAgICAgIDxsaWItbG9hZGVyPjwvbGliLWxvYWRlcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCIhaGlkZUxpc3RcIj5cclxuICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIiAqbmdJZj1cImZpbHRlcmVkT3Jnc1VzZXJzTWlzc2lvbnNcIj5cclxuICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBsaXN0LWdyb3VwLWl0ZW0tYWN0aW9uXCIgKm5nRm9yPVwibGV0IG8gb2YgZmlsdGVyZWRPcmdzVXNlcnNNaXNzaW9uc1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBmb250LXdlaWdodC1ib2xkXCJcclxuICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiU2VlIGRldGFpbHMgYW5kIHVzZXJzXCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCIgKGNsaWNrKT1cIm9uVG9nZ2xlRGV0YWlsT3JnKG8ub3JnLmlkLCBvLm9yZylcIj5cclxuICAgICAgICAgICAgICB7e28ub3JnLm5hbWV9fSA8c21hbGwgKm5nSWY9XCJvLm9yZy5pZCA9PSBjdXJyZW50T3JnLmlkXCI+KHt7J015IG9yZ2FuaXNhdGlvbicgfCB0cmFuc2xhdGV9fSk8L3NtYWxsPlxyXG4gICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cImlzU1AgJiYgY2xpZW50c1NQLmluY2x1ZGVzKG8ub3JnLmlkKVwiPih7eydDbGllbnQgb2YgU21hcnRlclBsYW4nIHwgdHJhbnNsYXRlfX0pPC9zbWFsbD5cclxuICAgICAgICAgICAgICA8c21hbGwgKm5nSWY9XCJpc1NQICYmIGdldE9yZGVyZWRPcmcoby5vcmcuaWQpXCI+KHt7J0NsaWVudCBvZiAnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgIHt7Z2V0T3JkZXJlZE9yZyhvLm9yZy5pZCl9fSk8L3NtYWxsPlxyXG4gICAgICAgICAgICAgIDxsaWItY2hldnJvbiBbY29uZGl0aW9uU2hvd2luZ109XCJkZXRhaWxzT3JnPT1vLm9yZy5pZFwiPjwvbGliLWNoZXZyb24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlzc2lvbnNcIiAqbmdJZj1cImRldGFpbHNPcmc9PW8ub3JnLmlkXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nZC1mbGV4Jz5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbXQtMyBtYi0zXCIgKGNsaWNrKT1cIm9uQWRkKG8ub3JnKVwiPnt7J0FkZCB1c2VyJyB8XHJcbiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGxpc3QtZ3JvdXAtaXRlbS1hY3Rpb25cIiAqbmdGb3I9XCJsZXQgYSBvZiBvLnVzZXJzXCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uVG9nZ2xlRGV0YWlsVXNlcihhLnVzZXIuaWQpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3thLnVzZXIuZGlzcGxheU5hbWV9fVxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItY2hldnJvbiBbY29uZGl0aW9uU2hvd2luZ109XCJkZXRhaWxzVXNlcj09YS51c2VyLmlkXCI+PC9saWItY2hldnJvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZGV0YWlsc1VzZXI9PWEudXNlci5pZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J0VtYWlsJyB8IHRyYW5zbGF0ZX19OiB7e2EudXNlci5lbWFpbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHJvdW5kZWQtcGlsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWRkRm9yVXNlcihvLm9yZywgYS51c2VyKVwiPnt7J0FkZCBuZXcgbWlzc2lvbicgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByb3VuZGVkLXBpbGxcIiAoY2xpY2spPVwib25DbGVhclRva2VuKGEpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3snQ2xlYXIgVG9rZW4nIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcm91bmRlZC1waWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGVVc2VyKGEudXNlcilcIj57eydEZWxldGUgdXNlcicgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGEubWlzc2lvbnMubGVuZ3RoID4gMCA/ICgnQ3VycmVudCBNaXNzaW9ucycgfCB0cmFuc2xhdGUpIDogKCdObyBtaXNzaW9ucycgfCB0cmFuc2xhdGUpfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtXCIgKm5nRm9yPVwibGV0IG1pcyBvZiBhLm1pc3Npb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiICpuZ0lmPVwibWlzLmRlc2NyaXB0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydEZXNjcmlwdGlvbicgfCB0cmFuc2xhdGV9fToge3ttaXMuZGVzY3JpcHRpb259fTwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCJtaXMudGVtcGxhdGVNaXNzaW9uSURcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0F0dGVuZGVlIG9mIHRvdXInIHwgdHJhbnNsYXRlfX06IHt7bWlzLnRlbXBsYXRlTWlzc2lvbi50aXRsZX19PC9saT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snUm9sZScgfCB0cmFuc2xhdGV9fToge3sgbWlzLnJvbGUgfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiICpuZ0lmPVwibWlzLmhhc2h0YWdzICYmIG1pcy5oYXNodGFncy5sZW5ndGg+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0hhc2h0YWdzJyB8IHRyYW5zbGF0ZX19OiA8dWwgY2xhc3M9XCJrZXl3b3Jkc0Rpc3BsYXkgbm8tYm9yZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrZXl3b3Jkc2Rpc3BsYXlDb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJrZXl3b3Jkc0l0ZW1cIiAqbmdGb3I9XCJsZXQgaGFzaHRhZyBvZiBtaXMuaGFzaHRhZ3NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGhhc2h0YWcgfCBoYXNodGFnRnJvbUlEIHwgYXN5bmMgfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydMYW5ndWFnZScgfCB0cmFuc2xhdGUgfX06IHt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXMubG9jYWxlID8gbWlzLmxvY2FsZSA6ICgnTm90IGFwcGxpY2FibGUnIHwgdHJhbnNsYXRlKX19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydBY2Nlc3MgbGV2ZWwnIHwgdHJhbnNsYXRlIH19OiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzLmxldmVsfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J09yZGVyZWQgYnknIHwgdHJhbnNsYXRlIH19OiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzLm9yZGVyZWRPcmdhbmlzYXRpb24ubmFtZX19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIiAqbmdJZj1cIm1pcy5kb21haW5zXCI+e3snRG9tYWlucycgfCB0cmFuc2xhdGUgfX06XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e21pcy5kb21haW5zID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbklkc1RvU3RyaW5nRm9yTWlzc2lvbihtaXMpIDogKFwiTm8gZGF0YVwiIHwgdHJhbnNsYXRlKSB9fTwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snQXV0aG9yaXplZCBsb2NhdGlvbicgfCB0cmFuc2xhdGUgfX06XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBtaXMuc3BhY2UgPyBtaXMuc3BhY2UubmFtZSA6IFwiTm8gbG9jYXRpb25cIiB8IHRyYW5zbGF0ZX19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydBdXRob3JpemVkIHpvbmUnIHwgdHJhbnNsYXRlIH19OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbWlzLnpvbmUgPyBtaXMuem9uZS5uYW1lIDogXCJBbGwgem9uZXMgYWxsb3dlZFwiIHwgdHJhbnNsYXRlfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J1N0YXJ0cycgfCB0cmFuc2xhdGUgfX06XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBtaXMuc3RhcnREYXRlVGltZSA/IChtaXMuc3RhcnREYXRlVGltZSB8IHRpbWVEYXRlU3RyaW5nOiBcImRheV90aW1lX3pvbmVcIiB8IGFzeW5jKSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZX19LCB7eydFbmRzJyB8IHRyYW5zbGF0ZX19OiB7eyBtaXMuZW5kRGF0ZVRpbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKG1pcy5lbmREYXRlVGltZSB8IHRpbWVEYXRlU3RyaW5nOiBcImRheV90aW1lX3pvbmVcIiB8IGFzeW5jKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZX19LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1yLTIgYWN0aW9uLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25FZGl0KG1pcylcIj57eydFZGl0JyB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0lmPVwibWlzLnJvbGUgPT09ICdWSVNJVE9SJyB8fCBtaXMucm9sZSA9PT0gJ1ZJU0lUT1JfTVVTRVVNJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtci0yIGFjdGlvbi1idXR0b24gc2hhcmUtdmlzaXRvci1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU2V0Rm9yU2hhcmVhYmxlTGluayhhLnVzZXIsIG1pcylcIj57eydHZW5lcmF0ZSBTaGFyZWFibGUgTGluaycgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBhY3Rpb24tYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRlbGV0ZU1pc3Npb24obWlzKVwiPnt7J0RlbGV0ZScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9saT5cclxuICAgICAgICA8L3VsPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJjcmVhdGVcIj5cclxuICAgICAgICA8bGliLXVzZXItbWlzc2lvbi1mb3JtIFthZGRUb09yZ2FuaXNhdGlvbl09XCJhZGRUb09yZ1wiIFtjdXJyZW50T3JnXT1cImN1cnJlbnRPcmdcIiBbaXNTUF09XCJpc1NQXCJcclxuICAgICAgICAgIChhZGRlZCk9XCJ1c2VyQWRkZWQoJGV2ZW50KVwiPlxyXG4gICAgICAgIDwvbGliLXVzZXItbWlzc2lvbi1mb3JtPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiAqbmdJZj1cImVkaXRcIj5cclxuICAgICAgICA8bGliLWZvcm0tbWlzc2lvbiBbbWlzc2lvblRvRWRpdF09XCJtaXNzaW9uVG9FZGl0XCIgW2N1cnJlbnRVc2VyT3JnYW5pc2F0aW9uXT1cImN1cnJlbnRPcmdcIiBbaXNTUF09XCJpc1NQXCJcclxuICAgICAgICAgIChhZGRlZE1pc3Npb25JbnB1dCk9XCJvbk1pc3Npb25FZGl0ZWQoJGV2ZW50KVwiPjwvbGliLWZvcm0tbWlzc2lvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJjcmVhdGVGb3JFeGlzdGluZ1VzZXJcIj5cclxuICAgICAgICA8bGliLWZvcm0tbWlzc2lvbiBbb3JnYW5pc2F0aW9uRm9yTWlzc2lvbl09XCJhZGRUb09yZ1wiIFtjdXJyZW50VXNlck9yZ2FuaXNhdGlvbl09XCJjdXJyZW50T3JnXCIgW2lzU1BdPVwiaXNTUFwiXHJcbiAgICAgICAgICBbdXNlckZvck1pc3Npb25JRF09XCJ1c2VyRm9yQWRkaW5nTWlzc2lvbi5pZFwiIChhZGRlZE1pc3Npb25JbnB1dCk9XCJvbk1pc3Npb25DcmVhdGVkKCRldmVudClcIj5cclxuICAgICAgICA8L2xpYi1mb3JtLW1pc3Npb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiaXNBZGRpbmdPcmcgfHwgaXNBZGRpbmdUb0V4aXN0aW5nT3JnXCI+XHJcbiAgICAgICAgPGxpYi1mb3JtLW9yZ2FuaXNhdGlvbiBbY3VycmVudE9yZ109XCJjdXJyZW50T3JnXCIgW2N1cnJlbnRVc2VyXT1cIm1lXCIgW2V4aXN0aW5nXT1cImlzQWRkaW5nVG9FeGlzdGluZ09yZ1wiXHJcbiAgICAgICAgICAoYWRkZWQpPVwib3JnQWRkZWQoJGV2ZW50KVwiPjwvbGliLWZvcm0tb3JnYW5pc2F0aW9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNCBjb2wtbGctNlwiICpuZ0lmPVwib3JnU2VsZWN0ZWREZXRhaWxzICYmICFpc0d1aWRlXCI+XHJcbiAgICAgIDxsaWItZGV0YWlsLW9yZ2FuaXNhdGlvbiBbb3JnXT1cIm9yZ1NlbGVjdGVkRGV0YWlsc1wiIFtjdXJyZW50T3JnXT1cImN1cnJlbnRPcmdcIiBbaXNTUF09XCJpc1NQXCJcclxuICAgICAgICAob3JnQ2hhbmdlZCk9J29yZ0FkZGVkKCRldmVudCknPjwvbGliLWRldGFpbC1vcmdhbmlzYXRpb24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+Il19