@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,108 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { validEmail, RoleStatus } from 'ngx-smarterplan-core';
3
+ import * as Papa from 'papaparse';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "ngx-smarterplan-core";
6
+ import * as i2 from "@ngx-translate/core";
7
+ import * as i3 from "@angular/common";
8
+ export class CreateBatchComponent {
9
+ constructor(missionService, userService, translate) {
10
+ this.missionService = missionService;
11
+ this.userService = userService;
12
+ this.translate = translate;
13
+ this.createdMissions = new EventEmitter();
14
+ this.addedEmails = [];
15
+ this.working = false;
16
+ }
17
+ ngOnInit() { }
18
+ onAddEmail(value) {
19
+ if (value) {
20
+ if (validEmail(value)) {
21
+ this.addedEmails.push(value);
22
+ }
23
+ else {
24
+ alert("Please, enter a valid email address");
25
+ }
26
+ }
27
+ }
28
+ onDelete(index) {
29
+ this.addedEmails.splice(index, 1);
30
+ }
31
+ onCancel() {
32
+ this.createdMissions.emit(null);
33
+ }
34
+ async onCreateMissions() {
35
+ const createdMissions = [];
36
+ let user;
37
+ this.working = true;
38
+ await Promise.all(this.addedEmails.map(async (mail) => {
39
+ user = await this.userService.profileForMail(mail);
40
+ if (!user) {
41
+ try {
42
+ const profile = await this.userService.createUserAWSandProfile({
43
+ email: mail,
44
+ lastName: mail,
45
+ firstName: "",
46
+ phone: "",
47
+ }, true);
48
+ user = profile;
49
+ }
50
+ catch (error) {
51
+ alert(`Error creating users: ${this.translate.instant(error)}`);
52
+ this.working = false;
53
+ return;
54
+ }
55
+ }
56
+ if (user) {
57
+ const missionInput = {
58
+ organisationID: this.template.organisationID,
59
+ orderedOrganisationID: this.template.organisationID,
60
+ level: this.template.level,
61
+ role: RoleStatus.VISITOR_MUSEUM,
62
+ description: "Generated from template",
63
+ userID: user.id,
64
+ startDateTime: this.template.startDateTime,
65
+ endDateTime: this.template.endDateTime,
66
+ spaceID: this.template.spaceID,
67
+ zoneID: this.template.zoneID,
68
+ templateMissionID: this.template.id,
69
+ hashtags: this.template.hashtags,
70
+ };
71
+ const mission = await this.missionService.create(missionInput);
72
+ createdMissions.push(mission);
73
+ }
74
+ }));
75
+ this.working = false;
76
+ this.createdMissions.emit(createdMissions);
77
+ this.addedEmails = [];
78
+ }
79
+ async handleFileInput(eventTarget) {
80
+ const files = eventTarget.files;
81
+ const uploaded = files.item(0);
82
+ if (uploaded.name.includes(".csv")) {
83
+ Papa.parse(uploaded, {
84
+ complete: function onComplete(results) {
85
+ for (const mail of results.data) {
86
+ this.addedEmails.push(mail[0]);
87
+ }
88
+ console.log(this.addedEmails);
89
+ // eslint-disable-next-line no-extra-bind
90
+ }.bind(this),
91
+ });
92
+ }
93
+ else {
94
+ alert("Not a csv file");
95
+ }
96
+ }
97
+ }
98
+ CreateBatchComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: CreateBatchComponent, deps: [{ token: i1.MissionService }, { token: i1.BaseUserService }, { token: i2.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
99
+ CreateBatchComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: CreateBatchComponent, selector: "lib-create-batch", inputs: { template: "template" }, outputs: { createdMissions: "createdMissions" }, ngImport: i0, template: "<div>\r\n <h4>{{'Add email address' | translate}}</h4>\r\n <div class=\"row\">\r\n <input class=\"form-control custom-form\" #box (keyup.enter)=\"onAddEmail(box.value); box.value=''\"\r\n placeholder=\"me@example.com\">\r\n <div class=\"outer_circle\" style='margin-left: 1.1em;'>\r\n <button id='btn-icon' (click)=\"onAddEmail(box.value); box.value=''\"></button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mt-3\">\r\n <label for=\"file\" class=\"btn btn-label-file rounded-pill\">\r\n <input type=\"file\" id=\"file\" (change)=\"handleFileInput($event.target)\" />\r\n {{'Upload from csv' | translate}}</label>\r\n </div>\r\n\r\n <ul *ngIf=\"addedEmails.length > 0\">\r\n <li class=\"list_item\" *ngFor=\"let mail of addedEmails; index as index\">{{mail}}\r\n <div class=\"icon-container\" (click)=\"onDelete(index)\">\r\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\r\n </div>\r\n </li>\r\n </ul>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div class=\"row action-button-container\">\r\n <button class=\"btn btn-outline-primary rounded-pill mr-2 mt-3 action-button\" (click)=\"onCreateMissions()\">\r\n {{'Create users' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill mr-2 mt-3 action-button\" (click)=\"onCancel()\">\r\n {{'Cancel' | translate}}</button>\r\n </div>\r\n\r\n</div>", styles: ["#btn-icon{width:30px;height:30px;background:url(../../../../assets/icons/plus.svg);border:none;vertical-align:middle}#btn-icon:hover{background:url(../../../../assets/icons/plus-over.svg)}#btn-icon[disabled]:hover{background:url(../../../../assets/icons/plus.svg)}.outer_circle{background-color:#ebebeb;border-radius:50%;width:32px;height:32px;padding:1px;margin-left:5px}.custom-form{width:80%}h4{color:var(--smarterplan-primary)}.pointer{cursor:pointer}.list_item{display:flex;font-size:1.1em}.icon-container{cursor:pointer;margin-left:5px}input[type=file]{display:none}.form-group{margin:1.5rem 0}label.col-sm-4.col-form-label{width:200px;min-width:200px}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"], components: [{ type: i1.LoaderComponent, selector: "lib-loader" }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "translate": i2.TranslatePipe } });
100
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: CreateBatchComponent, decorators: [{
101
+ type: Component,
102
+ args: [{ selector: 'lib-create-batch', template: "<div>\r\n <h4>{{'Add email address' | translate}}</h4>\r\n <div class=\"row\">\r\n <input class=\"form-control custom-form\" #box (keyup.enter)=\"onAddEmail(box.value); box.value=''\"\r\n placeholder=\"me@example.com\">\r\n <div class=\"outer_circle\" style='margin-left: 1.1em;'>\r\n <button id='btn-icon' (click)=\"onAddEmail(box.value); box.value=''\"></button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mt-3\">\r\n <label for=\"file\" class=\"btn btn-label-file rounded-pill\">\r\n <input type=\"file\" id=\"file\" (change)=\"handleFileInput($event.target)\" />\r\n {{'Upload from csv' | translate}}</label>\r\n </div>\r\n\r\n <ul *ngIf=\"addedEmails.length > 0\">\r\n <li class=\"list_item\" *ngFor=\"let mail of addedEmails; index as index\">{{mail}}\r\n <div class=\"icon-container\" (click)=\"onDelete(index)\">\r\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\r\n </div>\r\n </li>\r\n </ul>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div class=\"row action-button-container\">\r\n <button class=\"btn btn-outline-primary rounded-pill mr-2 mt-3 action-button\" (click)=\"onCreateMissions()\">\r\n {{'Create users' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill mr-2 mt-3 action-button\" (click)=\"onCancel()\">\r\n {{'Cancel' | translate}}</button>\r\n </div>\r\n\r\n</div>", styles: ["#btn-icon{width:30px;height:30px;background:url(../../../../assets/icons/plus.svg);border:none;vertical-align:middle}#btn-icon:hover{background:url(../../../../assets/icons/plus-over.svg)}#btn-icon[disabled]:hover{background:url(../../../../assets/icons/plus.svg)}.outer_circle{background-color:#ebebeb;border-radius:50%;width:32px;height:32px;padding:1px;margin-left:5px}.custom-form{width:80%}h4{color:var(--smarterplan-primary)}.pointer{cursor:pointer}.list_item{display:flex;font-size:1.1em}.icon-container{cursor:pointer;margin-left:5px}input[type=file]{display:none}.form-group{margin:1.5rem 0}label.col-sm-4.col-form-label{width:200px;min-width:200px}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"] }]
103
+ }], ctorParameters: function () { return [{ type: i1.MissionService }, { type: i1.BaseUserService }, { type: i2.TranslateService }]; }, propDecorators: { template: [{
104
+ type: Input
105
+ }], createdMissions: [{
106
+ type: Output
107
+ }] } });
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWJhdGNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1hZG1pbi9zcmMvbGliL3Zpc2l0b3IvY3JlYXRlLWJhdGNoL2NyZWF0ZS1iYXRjaC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi92aXNpdG9yL2NyZWF0ZS1iYXRjaC9jcmVhdGUtYmF0Y2guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvRSxPQUFPLEVBQXFELFVBQVUsRUFBaUIsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEksT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUM7Ozs7O0FBT2xDLE1BQU0sT0FBTyxvQkFBb0I7SUFXN0IsWUFDWSxjQUE4QixFQUM5QixXQUE0QixFQUM1QixTQUEyQjtRQUYzQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBQzVCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBWDdCLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQUUxRCxnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQUkzQixZQUFPLEdBQUcsS0FBSyxDQUFDO0lBTWIsQ0FBQztJQUVKLFFBQVEsS0FBVSxDQUFDO0lBRW5CLFVBQVUsQ0FBQyxLQUFhO1FBQ3BCLElBQUksS0FBSyxFQUFFO1lBQ1AsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2hDO2lCQUFNO2dCQUNILEtBQUssQ0FB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LFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFO2dCQUNqQixRQUFRLEVBQUUsU0FBUyxVQUFVLENBQUMsT0FBTztvQkFDakMsS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFO3dCQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDbEM7b0JBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQzlCLHlDQUF5QztnQkFDN0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDZixDQUFDLENBQUM7U0FDTjthQUFNO1lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDM0I7SUFDTCxDQUFDOztpSEE5R1Esb0JBQW9CO3FHQUFwQixvQkFBb0IsMklDVmpDLDhrREFpQ007MkZEdkJPLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxrQkFBa0I7a0tBS2pCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUksZUFBZTtzQkFBeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBNaXNzaW9uLCBNaXNzaW9uU2VydmljZSwgQmFzZVVzZXJTZXJ2aWNlLCBQcm9maWxlLCB2YWxpZEVtYWlsLCBWaXNpdFRlbXBsYXRlLCBSb2xlU3RhdHVzIH0gZnJvbSAnbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xyXG5pbXBvcnQgKiBhcyBQYXBhIGZyb20gJ3BhcGFwYXJzZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1jcmVhdGUtYmF0Y2gnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jcmVhdGUtYmF0Y2guY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NyZWF0ZS1iYXRjaC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDcmVhdGVCYXRjaENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgICBASW5wdXQoKSB0ZW1wbGF0ZTogVmlzaXRUZW1wbGF0ZTtcclxuXHJcbiAgICBAT3V0cHV0KCkgY3JlYXRlZE1pc3Npb25zID0gbmV3IEV2ZW50RW1pdHRlcjxNaXNzaW9uW10+KCk7XHJcblxyXG4gICAgYWRkZWRFbWFpbHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgY3N2RmlsZTogRmlsZTtcclxuXHJcbiAgICB3b3JraW5nID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBtaXNzaW9uU2VydmljZTogTWlzc2lvblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB1c2VyU2VydmljZTogQmFzZVVzZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgKSB7fVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge31cclxuXHJcbiAgICBvbkFkZEVtYWlsKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgaWYgKHZhbGlkRW1haWwodmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZGVkRW1haWxzLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYWxlcnQoXCJQbGVhc2UsIGVudGVyIGEgdmFsaWQgZW1haWwgYWRkcmVzc1wiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkRlbGV0ZShpbmRleCkge1xyXG4gICAgICAgIHRoaXMuYWRkZWRFbWFpbHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNhbmNlbCgpIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZWRNaXNzaW9ucy5lbWl0KG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQ3JlYXRlTWlzc2lvbnMoKSB7XHJcbiAgICAgICAgY29uc3QgY3JlYXRlZE1pc3Npb25zID0gW107XHJcbiAgICAgICAgbGV0IHVzZXI6IFByb2ZpbGU7XHJcbiAgICAgICAgdGhpcy53b3JraW5nID0gdHJ1ZTtcclxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAgICAgdGhpcy5hZGRlZEVtYWlscy5tYXAoYXN5bmMgKG1haWwpID0+IHtcclxuICAgICAgICAgICAgICAgIHVzZXIgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLnByb2ZpbGVGb3JNYWlsKG1haWwpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF1c2VyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvZmlsZSA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmNyZWF0ZVVzZXJBV1NhbmRQcm9maWxlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1haWw6IG1haWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3ROYW1lOiBtYWlsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdE5hbWU6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob25lOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgPSBwcm9maWxlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIGNyZWF0aW5nIHVzZXJzOiAke3RoaXMudHJhbnNsYXRlLmluc3RhbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1gLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndvcmtpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh1c2VyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWlzc2lvbklucHV0OiBNaXNzaW9uID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmdhbmlzYXRpb25JRDogdGhpcy50ZW1wbGF0ZS5vcmdhbmlzYXRpb25JRCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZE9yZ2FuaXNhdGlvbklEOiB0aGlzLnRlbXBsYXRlLm9yZ2FuaXNhdGlvbklELFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogdGhpcy50ZW1wbGF0ZS5sZXZlbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZTogUm9sZVN0YXR1cy5WSVNJVE9SX01VU0VVTSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiR2VuZXJhdGVkIGZyb20gdGVtcGxhdGVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlcklEOiB1c2VyLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydERhdGVUaW1lOiB0aGlzLnRlbXBsYXRlLnN0YXJ0RGF0ZVRpbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZERhdGVUaW1lOiB0aGlzLnRlbXBsYXRlLmVuZERhdGVUaW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFjZUlEOiB0aGlzLnRlbXBsYXRlLnNwYWNlSUQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHpvbmVJRDogdGhpcy50ZW1wbGF0ZS56b25lSUQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlTWlzc2lvbklEOiB0aGlzLnRlbXBsYXRlLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNodGFnczogdGhpcy50ZW1wbGF0ZS5oYXNodGFncyxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pc3Npb24gPSBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLmNyZWF0ZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2lvbklucHV0LFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZE1pc3Npb25zLnB1c2gobWlzc2lvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy53b3JraW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVkTWlzc2lvbnMuZW1pdChjcmVhdGVkTWlzc2lvbnMpO1xyXG4gICAgICAgIHRoaXMuYWRkZWRFbWFpbHMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBoYW5kbGVGaWxlSW5wdXQoZXZlbnRUYXJnZXQ6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGZpbGVzPSBldmVudFRhcmdldC5maWxlcztcclxuICAgICAgICBjb25zdCB1cGxvYWRlZCA9IGZpbGVzLml0ZW0oMCk7XHJcbiAgICAgICAgaWYgKHVwbG9hZGVkLm5hbWUuaW5jbHVkZXMoXCIuY3N2XCIpKSB7XHJcbiAgICAgICAgICAgIFBhcGEucGFyc2UodXBsb2FkZWQsIHtcclxuICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiBvbkNvbXBsZXRlKHJlc3VsdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1haWwgb2YgcmVzdWx0cy5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkZWRFbWFpbHMucHVzaChtYWlsWzBdKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5hZGRlZEVtYWlscyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLWJpbmRcclxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYWxlcnQoXCJOb3QgYSBjc3YgZmlsZVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59XHJcbiIsIjxkaXY+XHJcbiAgICA8aDQ+e3snQWRkIGVtYWlsIGFkZHJlc3MnIHwgdHJhbnNsYXRlfX08L2g0PlxyXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBjdXN0b20tZm9ybVwiICNib3ggKGtleXVwLmVudGVyKT1cIm9uQWRkRW1haWwoYm94LnZhbHVlKTsgYm94LnZhbHVlPScnXCJcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJtZUBleGFtcGxlLmNvbVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJvdXRlcl9jaXJjbGVcIiBzdHlsZT0nbWFyZ2luLWxlZnQ6IDEuMWVtOyc+XHJcbiAgICAgICAgICAgIDxidXR0b24gaWQ9J2J0bi1pY29uJyAoY2xpY2spPVwib25BZGRFbWFpbChib3gudmFsdWUpOyBib3gudmFsdWU9JydcIj48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtM1wiPlxyXG4gICAgICAgIDxsYWJlbCBmb3I9XCJmaWxlXCIgY2xhc3M9XCJidG4gYnRuLWxhYmVsLWZpbGUgcm91bmRlZC1waWxsXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiZmlsZVwiIChjaGFuZ2UpPVwiaGFuZGxlRmlsZUlucHV0KCRldmVudC50YXJnZXQpXCIgLz5cclxuICAgICAgICAgICAge3snVXBsb2FkIGZyb20gY3N2JyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDx1bCAqbmdJZj1cImFkZGVkRW1haWxzLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICA8bGkgY2xhc3M9XCJsaXN0X2l0ZW1cIiAqbmdGb3I9XCJsZXQgbWFpbCBvZiBhZGRlZEVtYWlsczsgaW5kZXggYXMgaW5kZXhcIj57e21haWx9fVxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1jb250YWluZXJcIiAoY2xpY2spPVwib25EZWxldGUoaW5kZXgpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25pZnlcIiBkYXRhLWljb249XCJtZGk6dHJhc2gtY2FuLW91dGxpbmVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbGk+XHJcbiAgICA8L3VsPlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgKm5nSWY9XCJ3b3JraW5nXCI+XHJcbiAgICAgICAgPGxpYi1sb2FkZXI+PC9saWItbG9hZGVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93IGFjdGlvbi1idXR0b24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtci0yIG10LTMgYWN0aW9uLWJ1dHRvblwiIChjbGljayk9XCJvbkNyZWF0ZU1pc3Npb25zKClcIj5cclxuICAgICAgICAgICAge3snQ3JlYXRlIHVzZXJzJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtci0yIG10LTMgYWN0aW9uLWJ1dHRvblwiIChjbGljayk9XCJvbkNhbmNlbCgpXCI+XHJcbiAgICAgICAgICAgIHt7J0NhbmNlbCcgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG48L2Rpdj4iXX0=
@@ -0,0 +1,219 @@
1
+ import { Component } from '@angular/core';
2
+ import { Validators } from '@angular/forms';
3
+ import { LevelStatus, Locale, stringLocaleToEnum, enumToArray, sortAlphabeticallyOnName } from 'ngx-smarterplan-core';
4
+ import { DateTime } from "luxon";
5
+ import { Input } from '@angular/core';
6
+ import { Output } from '@angular/core';
7
+ import { EventEmitter } from '@angular/core';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/router";
10
+ import * as i2 from "@angular/forms";
11
+ import * as i3 from "ngx-smarterplan-core";
12
+ import * as i4 from "@angular/common";
13
+ import * as i5 from "@ngx-translate/core";
14
+ import * as i6 from "@ng-bootstrap/ng-bootstrap";
15
+ export class TemplateComponent {
16
+ constructor(route, fb, userService, spaceService, zoneService, location, hashtagService, translate, templateService) {
17
+ this.route = route;
18
+ this.fb = fb;
19
+ this.userService = userService;
20
+ this.spaceService = spaceService;
21
+ this.zoneService = zoneService;
22
+ this.location = location;
23
+ this.hashtagService = hashtagService;
24
+ this.translate = translate;
25
+ this.templateService = templateService;
26
+ this.updatedTemplate = new EventEmitter();
27
+ this.createdTemplate = new EventEmitter();
28
+ this.working = false;
29
+ this.missionTimeStart = 12 * 60 * 60000; // midday in milliseconds
30
+ this.missionTimeEnd = 12 * 60 * 60000;
31
+ this.availableHashtags = [];
32
+ this.addedHashtags = [];
33
+ this.userService.isChanged.subscribe(() => {
34
+ this.updateUserInfo();
35
+ });
36
+ }
37
+ ngOnInit() {
38
+ this.setup();
39
+ const lang = this.translate.currentLang
40
+ ? this.translate.currentLang
41
+ : this.translate.defaultLang;
42
+ /** Transforme '_fr' to 'fr' */
43
+ this.currentLocale = stringLocaleToEnum(lang.slice(1)); // to match enum Locale
44
+ this.locales = enumToArray(Locale);
45
+ }
46
+ async setup() {
47
+ this.initForm();
48
+ if (this.zoneID) {
49
+ this.inputZone = await this.zoneService.getZone(this.zoneID);
50
+ await this.setHashtags(this.inputZone.spaceID);
51
+ }
52
+ if (this.editTemplate) {
53
+ // we are editing a template
54
+ this.onSpaceClick();
55
+ }
56
+ await this.updateUserInfo();
57
+ }
58
+ async updateUserInfo() {
59
+ if (this.userService.cu) {
60
+ this.availableLevels =
61
+ this.userService.getAvalableLevelsForCurrentUser();
62
+ this.currentOrg = this.userService.currentOrganisation();
63
+ this.availableSpaces = await this.spaceService.getSpacesForOrg(this.currentOrg.id);
64
+ }
65
+ }
66
+ initForm() {
67
+ if (this.editTemplate) {
68
+ this.form = this.fb.group({
69
+ title: [this.editTemplate.title],
70
+ level: [this.editTemplate.level],
71
+ organisationID: [this.editTemplate.organisationID],
72
+ space: [this.editTemplate.spaceID],
73
+ description: [this.editTemplate.description],
74
+ zone: [
75
+ this.editTemplate.zoneID,
76
+ Validators.required,
77
+ ],
78
+ locale: [this.editTemplate.locale],
79
+ });
80
+ if (this.editTemplate.startDateTime) {
81
+ const date = DateTime.fromISO(this.editTemplate.startDateTime);
82
+ this.missionTimeStart = (date.hour * 60 + date.minute) * 60 * 1000;
83
+ this.startDate = date.toMillis() - this.missionTimeStart;
84
+ }
85
+ if (this.editTemplate.endDateTime) {
86
+ const date = DateTime.fromISO(this.editTemplate.endDateTime);
87
+ this.missionTimeEnd = (date.hour * 60 + date.minute) * 60 * 1000;
88
+ this.endDate = date.toMillis() - this.missionTimeEnd;
89
+ }
90
+ }
91
+ else {
92
+ this.form = this.fb.group({
93
+ title: [""],
94
+ level: [LevelStatus.MINIMUM],
95
+ organisationID: this.currentOrg.id,
96
+ space: this.inputZone ? this.inputZone.spaceID : [null],
97
+ description: [null],
98
+ zone: [
99
+ this.inputZone ? this.inputZone.id : null,
100
+ Validators.required,
101
+ ],
102
+ locale: [this.currentLocale],
103
+ });
104
+ }
105
+ }
106
+ async onSubmit() {
107
+ this.working = true;
108
+ const formValue = this.form.getRawValue();
109
+ let startDateString;
110
+ let endDateString;
111
+ if (this.startDate) {
112
+ const dateHourStartNumber = this.startDate + this.missionTimeStart;
113
+ const startDate = DateTime.fromMillis(dateHourStartNumber);
114
+ startDateString = startDate.toISO();
115
+ }
116
+ if (this.endDate) {
117
+ const dateHourEndNumber = this.endDate + this.missionTimeEnd;
118
+ const endDate = DateTime.fromMillis(dateHourEndNumber);
119
+ endDateString = endDate.toISO();
120
+ }
121
+ try {
122
+ if (this.editTemplate) {
123
+ // update
124
+ const template = {
125
+ id: this.editTemplate.id,
126
+ title: formValue.title,
127
+ level: formValue.level,
128
+ description: formValue.description,
129
+ organisationID: formValue.organisationID,
130
+ startDateTime: startDateString,
131
+ endDateTime: endDateString,
132
+ hashtags: this.addedHashtags.map((hashtag) => hashtag.id),
133
+ locale: formValue.locale,
134
+ };
135
+ if (formValue.space) {
136
+ template.spaceID = formValue.space;
137
+ }
138
+ if (formValue.zone) {
139
+ template.zoneID = formValue.zone;
140
+ }
141
+ this.updatedTemplate.emit(template);
142
+ }
143
+ else {
144
+ //create
145
+ if (this.currentOrg) {
146
+ const template = {
147
+ title: formValue.title,
148
+ organisationID: this.currentOrg.id,
149
+ level: formValue.level,
150
+ description: formValue.description,
151
+ startDateTime: startDateString,
152
+ endDateTime: endDateString,
153
+ hashtags: this.addedHashtags.map((hashtag) => hashtag.id),
154
+ locale: formValue.locale,
155
+ };
156
+ if (formValue.space) {
157
+ template.spaceID = formValue.space;
158
+ }
159
+ if (formValue.zone) {
160
+ template.zoneID = formValue.zone;
161
+ }
162
+ this.createdTemplate.emit(template);
163
+ }
164
+ }
165
+ }
166
+ catch (error) {
167
+ console.error(error);
168
+ }
169
+ }
170
+ onCancel() {
171
+ this.form = null;
172
+ if (this.editTemplate) {
173
+ this.updatedTemplate.emit(null);
174
+ }
175
+ else {
176
+ this.createdTemplate.emit(null);
177
+ }
178
+ }
179
+ get title() {
180
+ return this.form.get("title");
181
+ }
182
+ get spaceID() {
183
+ return this.form.get("space");
184
+ }
185
+ async onSpaceClick() {
186
+ const zones = await this.zoneService.getZonesBySpace(this.spaceID.value);
187
+ const museumZones = zones.filter((zone) => zone.isMuseumVisitZone);
188
+ this.zonesForSpace = sortAlphabeticallyOnName(museumZones);
189
+ await this.setHashtags(this.spaceID.value);
190
+ }
191
+ onHashtagClick(hashtag) {
192
+ if (!this.addedHashtags.includes(hashtag)) {
193
+ this.addedHashtags.push(hashtag);
194
+ }
195
+ else {
196
+ this.addedHashtags.splice(this.addedHashtags.indexOf(hashtag), 1);
197
+ }
198
+ }
199
+ async setHashtags(spaceID) {
200
+ this.availableHashtags = await this.hashtagService.getHashtagsForSpace(spaceID);
201
+ }
202
+ }
203
+ TemplateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: TemplateComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.FormBuilder }, { token: i3.BaseUserService }, { token: i3.SpaceService }, { token: i3.ZoneService }, { token: i4.Location }, { token: i3.HashtagService }, { token: i5.TranslateService }, { token: i3.TemplateService }], target: i0.ɵɵFactoryTarget.Component });
204
+ TemplateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: TemplateComponent, selector: "lib-template", inputs: { currentOrg: "currentOrg", editTemplate: "editTemplate", zoneID: "zoneID" }, outputs: { updatedTemplate: "updatedTemplate", createdTemplate: "createdTemplate" }, ngImport: i0, template: "<div class=\"form-container\" *ngIf=\"form\">\r\n <div>\r\n <h4>{{ 'Visit Template' | translate }}</h4>\r\n </div>\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Visit Title' | translate}} *</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\"\r\n placeholder=\"Edvard Munch - \u00AB Un po\u00E8me d\u2019amour, de vie et de mort \u00BB\"\r\n [class.is-invalid]=\"title.invalid && title.touched\" required\r\n formControlName=\"title\">\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Description' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <textarea class=\"form-control\" formControlName=\"description\" style=\"height:200px\"\r\n placeholder=\"Cette visite d\u20191h30 vous pr\u00E9sentera les \u0153uvres embl\u00E9matiques du c\u00E9l\u00E8bre peintre norv\u00E9gien Edvard Munch (1863-1944)...\"></textarea>\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\">{{'Language' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" formControlName=\"locale\">\r\n <option [ngValue]=\"null\">{{'Not applicable' | translate}}</option>\r\n <option *ngFor=\"let locale of locales\" [ngValue]=\"locale\">\r\n {{ locale }}\r\n </option>\r\n </select>\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\">{{'Level' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"level\">\r\n <option *ngFor=\"let level of availableLevels\" [ngValue]=\"level\">\r\n {{ level }}\r\n </option>\r\n </select>\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\">{{ 'Authorized location' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"availableSpaces && !inputZone\">\r\n <select class=\"form-control\" required formControlName=\"space\" (change)=\"onSpaceClick()\">\r\n <option *ngFor=\"let space of availableSpaces\" [ngValue]=\"space.id\">\r\n {{ space.name }}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!availableSpaces\">\r\n {{ 'No locations available' | translate}}\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"inputZone\">\r\n <input type=\"text\" class=\"form-control\" [value]=\"inputZone.space.name\" disabled>\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\">{{ 'Authorized zone' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace && zonesForSpace.length > 0 && !inputZone\">\r\n <select class=\"form-control\" required formControlName=\"zone\">\r\n <option *ngFor=\"let zone of zonesForSpace\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace && zonesForSpace.length === 0 && !inputZone\">\r\n <p class=\"warning col-form-label\">{{\"No Museum Zones found for this location\"| translate}}</p>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"inputZone\">\r\n <input type=\"text\" class=\"form-control\" [value]=\"inputZone.name\" disabled>\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\">{{'Hashtags' | translate}}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"spaceID.value\">\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length > 0\">{{'Available hashtags' | translate}}\r\n </p>\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length === 0\">{{'No hashtags created for this\r\n location' | translate}} </p>\r\n <div *ngIf=\"availableHashtags.length > 0\">\r\n <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li [class]=\"addedHashtags.includes(hashtag) ? 'keywordsItem added' : 'keywordsItem'\"\r\n *ngFor=\"let hashtag of availableHashtags\" (click)=\"onHashtagClick(hashtag)\"\r\n style=\"cursor: pointer;\"\r\n ngbTooltip=\"{{addedHashtags.includes(hashtag) ? ('Remove'|translate) : ('Add'|translate) }}\">\r\n {{hashtag.name}}</li>\r\n </div>\r\n </ul>\r\n <p class=\"keywordsRules\">{{'Added hashtags' | translate}} </p>\r\n <ul class=\"keywordsDisplay\">\r\n <div class=\"keywordsdisplayContainer\" *ngIf=\"addedHashtags.length> 0\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of addedHashtags\">{{ hashtag.name }}</li>\r\n </div>\r\n </ul>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!spaceID.value\">\r\n <p class=\"keywordsRules\">{{'You need to choose the location first' | translate}} </p>\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\">{{'Start Date' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" [(ngModel)]=\"startDate\" ngbDatepicker\r\n #d1=\"ngbDatepicker\" [ngModelOptions]=\"{standalone: true}\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d1.toggle()\" type=\"button\"></button>\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\">{{'Start Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeStart\" [ngModelOptions]=\"{standalone: true}\">\r\n </ngb-timepicker>\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\">{{'End Date' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" [(ngModel)]=\"endDate\" ngbDatepicker\r\n #d2=\"ngbDatepicker\" [ngModelOptions]=\"{standalone: true}\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d2.toggle()\" type=\"button\"></button>\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\">{{'End Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeEnd\" [ngModelOptions]=\"{standalone: true}\"></ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"btn-control-div action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"this.working || form.invalid\">{{'Save' | translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" [disabled]=\"this.working\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n\r\n </form>\r\n</div>", styles: [".form-container{margin:2rem 0rem}.form-container .btn-control-div .btn{width:8rem}.warning{margin:0;color:red}.keywordsDisplay{min-height:40px}.keywordsRules{margin-bottom:2px}.form-group{margin:1.5rem 0}label.col-sm-4.col-form-label{width:200px;min-width:200px}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px!important}\n"], components: [{ type: i6.NgbTimepicker, selector: "ngb-timepicker", inputs: ["meridian", "spinners", "seconds", "hourStep", "minuteStep", "secondStep", "readonlyInputs", "size"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i6.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "translate": i5.TranslatePipe } });
205
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: TemplateComponent, decorators: [{
206
+ type: Component,
207
+ args: [{ selector: 'lib-template', template: "<div class=\"form-container\" *ngIf=\"form\">\r\n <div>\r\n <h4>{{ 'Visit Template' | translate }}</h4>\r\n </div>\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Visit Title' | translate}} *</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\"\r\n placeholder=\"Edvard Munch - \u00AB Un po\u00E8me d\u2019amour, de vie et de mort \u00BB\"\r\n [class.is-invalid]=\"title.invalid && title.touched\" required\r\n formControlName=\"title\">\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Description' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <textarea class=\"form-control\" formControlName=\"description\" style=\"height:200px\"\r\n placeholder=\"Cette visite d\u20191h30 vous pr\u00E9sentera les \u0153uvres embl\u00E9matiques du c\u00E9l\u00E8bre peintre norv\u00E9gien Edvard Munch (1863-1944)...\"></textarea>\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\">{{'Language' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" formControlName=\"locale\">\r\n <option [ngValue]=\"null\">{{'Not applicable' | translate}}</option>\r\n <option *ngFor=\"let locale of locales\" [ngValue]=\"locale\">\r\n {{ locale }}\r\n </option>\r\n </select>\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\">{{'Level' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"level\">\r\n <option *ngFor=\"let level of availableLevels\" [ngValue]=\"level\">\r\n {{ level }}\r\n </option>\r\n </select>\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\">{{ 'Authorized location' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"availableSpaces && !inputZone\">\r\n <select class=\"form-control\" required formControlName=\"space\" (change)=\"onSpaceClick()\">\r\n <option *ngFor=\"let space of availableSpaces\" [ngValue]=\"space.id\">\r\n {{ space.name }}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!availableSpaces\">\r\n {{ 'No locations available' | translate}}\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"inputZone\">\r\n <input type=\"text\" class=\"form-control\" [value]=\"inputZone.space.name\" disabled>\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\">{{ 'Authorized zone' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace && zonesForSpace.length > 0 && !inputZone\">\r\n <select class=\"form-control\" required formControlName=\"zone\">\r\n <option *ngFor=\"let zone of zonesForSpace\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace && zonesForSpace.length === 0 && !inputZone\">\r\n <p class=\"warning col-form-label\">{{\"No Museum Zones found for this location\"| translate}}</p>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"inputZone\">\r\n <input type=\"text\" class=\"form-control\" [value]=\"inputZone.name\" disabled>\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\">{{'Hashtags' | translate}}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"spaceID.value\">\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length > 0\">{{'Available hashtags' | translate}}\r\n </p>\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length === 0\">{{'No hashtags created for this\r\n location' | translate}} </p>\r\n <div *ngIf=\"availableHashtags.length > 0\">\r\n <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li [class]=\"addedHashtags.includes(hashtag) ? 'keywordsItem added' : 'keywordsItem'\"\r\n *ngFor=\"let hashtag of availableHashtags\" (click)=\"onHashtagClick(hashtag)\"\r\n style=\"cursor: pointer;\"\r\n ngbTooltip=\"{{addedHashtags.includes(hashtag) ? ('Remove'|translate) : ('Add'|translate) }}\">\r\n {{hashtag.name}}</li>\r\n </div>\r\n </ul>\r\n <p class=\"keywordsRules\">{{'Added hashtags' | translate}} </p>\r\n <ul class=\"keywordsDisplay\">\r\n <div class=\"keywordsdisplayContainer\" *ngIf=\"addedHashtags.length> 0\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of addedHashtags\">{{ hashtag.name }}</li>\r\n </div>\r\n </ul>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!spaceID.value\">\r\n <p class=\"keywordsRules\">{{'You need to choose the location first' | translate}} </p>\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\">{{'Start Date' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" [(ngModel)]=\"startDate\" ngbDatepicker\r\n #d1=\"ngbDatepicker\" [ngModelOptions]=\"{standalone: true}\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d1.toggle()\" type=\"button\"></button>\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\">{{'Start Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeStart\" [ngModelOptions]=\"{standalone: true}\">\r\n </ngb-timepicker>\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\">{{'End Date' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" [(ngModel)]=\"endDate\" ngbDatepicker\r\n #d2=\"ngbDatepicker\" [ngModelOptions]=\"{standalone: true}\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d2.toggle()\" type=\"button\"></button>\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\">{{'End Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeEnd\" [ngModelOptions]=\"{standalone: true}\"></ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"btn-control-div action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"this.working || form.invalid\">{{'Save' | translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" [disabled]=\"this.working\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n\r\n </form>\r\n</div>", styles: [".form-container{margin:2rem 0rem}.form-container .btn-control-div .btn{width:8rem}.warning{margin:0;color:red}.keywordsDisplay{min-height:40px}.keywordsRules{margin-bottom:2px}.form-group{margin:1.5rem 0}label.col-sm-4.col-form-label{width:200px;min-width:200px}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px!important}\n"] }]
208
+ }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.FormBuilder }, { type: i3.BaseUserService }, { type: i3.SpaceService }, { type: i3.ZoneService }, { type: i4.Location }, { type: i3.HashtagService }, { type: i5.TranslateService }, { type: i3.TemplateService }]; }, propDecorators: { currentOrg: [{
209
+ type: Input
210
+ }], editTemplate: [{
211
+ type: Input
212
+ }], zoneID: [{
213
+ type: Input
214
+ }], updatedTemplate: [{
215
+ type: Output
216
+ }], createdTemplate: [{
217
+ type: Output
218
+ }] } });
219
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWFkbWluL3NyYy9saWIvdmlzaXRvci90ZW1wbGF0ZS90ZW1wbGF0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi92aXNpdG9yL3RlbXBsYXRlL3RlbXBsYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUEwQixVQUFVLEVBQW1CLE1BQU0sZ0JBQWdCLENBQUM7QUFHckYsT0FBTyxFQUFnQixXQUFXLEVBQXdCLE1BQU0sRUFBOEMsa0JBQWtCLEVBQUUsV0FBVyxFQUFjLHdCQUF3QixFQUEyRCxNQUFNLHNCQUFzQixDQUFDO0FBQzNRLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFFakMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7O0FBTzdDLE1BQU0sT0FBTyxpQkFBaUI7SUF3QzFCLFlBQ1ksS0FBcUIsRUFDckIsRUFBZSxFQUNmLFdBQTRCLEVBQzVCLFlBQTBCLEVBQzFCLFdBQXdCLEVBQ3hCLFFBQWtCLEVBQ2xCLGNBQThCLEVBQzlCLFNBQTJCLEVBQzNCLGVBQWdDO1FBUmhDLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZixnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFDNUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsZ0JBQVcsR0FBWCxX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TUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMsIEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IE9yZ2FuaXNhdGlvbiwgTGV2ZWxTdGF0dXMsIFpvbmUsIFNwYWNlLCBIYXNodGFnLCBMb2NhbGUsIEJhc2VVc2VyU2VydmljZSwgU3BhY2VTZXJ2aWNlLCBab25lU2VydmljZSwgc3RyaW5nTG9jYWxlVG9FbnVtLCBlbnVtVG9BcnJheSwgUm9sZVN0YXR1cywgc29ydEFscGhhYmV0aWNhbGx5T25OYW1lLCBIYXNodGFnU2VydmljZSwgTWlzc2lvbiwgVmlzaXRUZW1wbGF0ZSwgVGVtcGxhdGVTZXJ2aWNlIH0gZnJvbSAnbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xyXG5pbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gXCJsdXhvblwiO1xyXG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdsaWItdGVtcGxhdGUnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RlbXBsYXRlLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL3RlbXBsYXRlLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICAgIEBJbnB1dCgpIGN1cnJlbnRPcmc6IE9yZ2FuaXNhdGlvbjtcclxuXHJcbiAgICBASW5wdXQoKSBlZGl0VGVtcGxhdGU6IFZpc2l0VGVtcGxhdGU7XHJcblxyXG4gICAgQElucHV0KCkgem9uZUlEOiBzdHJpbmc7XHJcblxyXG4gICAgQE91dHB1dCgpIHVwZGF0ZWRUZW1wbGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8VmlzaXRUZW1wbGF0ZT4oKTtcclxuXHJcbiAgICBAT3V0cHV0KCkgY3JlYXRlZFRlbXBsYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxWaXNpdFRlbXBsYXRlPigpO1xyXG5cclxuICAgIGZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgICB3b3JraW5nID0gZmFsc2U7XHJcblxyXG4gICAgc3RhcnREYXRlOiBudW1iZXI7XHJcblxyXG4gICAgZW5kRGF0ZTogbnVtYmVyO1xyXG5cclxuICAgIHpvbmVzRm9yU3BhY2U6IFpvbmVbXTtcclxuXHJcbiAgICBhdmFpbGFibGVMZXZlbHM6IExldmVsU3RhdHVzW107XHJcblxyXG4gICAgYXZhaWxhYmxlU3BhY2VzOiBTcGFjZVtdO1xyXG5cclxuICAgIG1pc3Npb25UaW1lU3RhcnQ6IG51bWJlciA9IDEyICogNjAgKiA2MDAwMDsgLy8gbWlkZGF5IGluIG1pbGxpc2Vjb25kc1xyXG5cclxuICAgIG1pc3Npb25UaW1lRW5kOiBudW1iZXIgPSAxMiAqIDYwICogNjAwMDA7XHJcblxyXG4gICAgaW5wdXRab25lOiBab25lO1xyXG5cclxuICAgIGF2YWlsYWJsZUhhc2h0YWdzOiBIYXNodGFnW10gPSBbXTtcclxuXHJcbiAgICBhZGRlZEhhc2h0YWdzOiBIYXNodGFnW10gPSBbXTtcclxuXHJcbiAgICBjdXJyZW50TG9jYWxlOiBMb2NhbGU7XHJcblxyXG4gICAgbG9jYWxlczogc3RyaW5nW107XHJcblxyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHNwYWNlU2VydmljZTogU3BhY2VTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgem9uZVNlcnZpY2U6IFpvbmVTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uLFxyXG4gICAgICAgIHByaXZhdGUgaGFzaHRhZ1NlcnZpY2U6IEhhc2h0YWdTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdGVtcGxhdGVTZXJ2aWNlOiBUZW1wbGF0ZVNlcnZpY2UsXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlLmlzQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVVzZXJJbmZvKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXR1cCgpO1xyXG4gICAgICAgIGNvbnN0IGxhbmcgPSB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZ1xyXG4gICAgICAgICAgICA/IHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nXHJcbiAgICAgICAgICAgIDogdGhpcy50cmFuc2xhdGUuZGVmYXVsdExhbmc7XHJcblxyXG4gICAgICAgIC8qKiBUcmFuc2Zvcm1lICdfZnInIHRvICdmcicgKi9cclxuICAgICAgICB0aGlzLmN1cnJlbnRMb2NhbGUgPSBzdHJpbmdMb2NhbGVUb0VudW0obGFuZy5zbGljZSgxKSk7IC8vIHRvIG1hdGNoIGVudW0gTG9jYWxlXHJcbiAgICAgICAgdGhpcy5sb2NhbGVzID0gZW51bVRvQXJyYXkoTG9jYWxlKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZXR1cCgpIHtcclxuICAgICAgICB0aGlzLmluaXRGb3JtKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuem9uZUlEKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5wdXRab25lID0gYXdhaXQgdGhpcy56b25lU2VydmljZS5nZXRab25lKHRoaXMuem9uZUlEKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRIYXNodGFncyh0aGlzLmlucHV0Wm9uZS5zcGFjZUlEKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZWRpdFRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgIC8vIHdlIGFyZSBlZGl0aW5nIGEgdGVtcGxhdGVcclxuICAgICAgICAgICAgdGhpcy5vblNwYWNlQ2xpY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVVc2VySW5mbygpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB1cGRhdGVVc2VySW5mbygpIHtcclxuICAgICAgICBpZiAodGhpcy51c2VyU2VydmljZS5jdSkge1xyXG4gICAgICAgICAgICB0aGlzLmF2YWlsYWJsZUxldmVscyA9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlLmdldEF2YWxhYmxlTGV2ZWxzRm9yQ3VycmVudFVzZXIoKTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50T3JnID0gdGhpcy51c2VyU2VydmljZS5jdXJyZW50T3JnYW5pc2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuYXZhaWxhYmxlU3BhY2VzID0gYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UuZ2V0U3BhY2VzRm9yT3JnKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50T3JnLmlkLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbml0Rm9ybSgpIHtcclxuICAgICAgICBpZiAodGhpcy5lZGl0VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgICAgICB0aXRsZTogW3RoaXMuZWRpdFRlbXBsYXRlLnRpdGxlXSxcclxuICAgICAgICAgICAgICAgIGxldmVsOiBbdGhpcy5lZGl0VGVtcGxhdGUubGV2ZWxdLFxyXG4gICAgICAgICAgICAgICAgb3JnYW5pc2F0aW9uSUQ6IFt0aGlzLmVkaXRUZW1wbGF0ZS5vcmdhbmlzYXRpb25JRF0sXHJcbiAgICAgICAgICAgICAgICBzcGFjZTogW3RoaXMuZWRpdFRlbXBsYXRlLnNwYWNlSURdLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFt0aGlzLmVkaXRUZW1wbGF0ZS5kZXNjcmlwdGlvbl0sXHJcbiAgICAgICAgICAgICAgICB6b25lOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0VGVtcGxhdGUuem9uZUlELFxyXG4gICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgbG9jYWxlOiBbdGhpcy5lZGl0VGVtcGxhdGUubG9jYWxlXSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRUZW1wbGF0ZS5zdGFydERhdGVUaW1lKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gRGF0ZVRpbWUuZnJvbUlTTyh0aGlzLmVkaXRUZW1wbGF0ZS5zdGFydERhdGVUaW1lKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubWlzc2lvblRpbWVTdGFydCA9IChkYXRlLmhvdXIgKiA2MCArIGRhdGUubWludXRlKSAqIDYwICogMTAwMDtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlID0gZGF0ZS50b01pbGxpcygpIC0gdGhpcy5taXNzaW9uVGltZVN0YXJ0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRUZW1wbGF0ZS5lbmREYXRlVGltZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IERhdGVUaW1lLmZyb21JU08odGhpcy5lZGl0VGVtcGxhdGUuZW5kRGF0ZVRpbWUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5taXNzaW9uVGltZUVuZCA9IChkYXRlLmhvdXIgKiA2MCArIGRhdGUubWludXRlKSAqIDYwICogMTAwMDtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW5kRGF0ZSA9IGRhdGUudG9NaWxsaXMoKSAtIHRoaXMubWlzc2lvblRpbWVFbmQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBbXCJcIl0sXHJcbiAgICAgICAgICAgICAgICBsZXZlbDogW0xldmVsU3RhdHVzLk1JTklNVU1dLFxyXG4gICAgICAgICAgICAgICAgb3JnYW5pc2F0aW9uSUQ6IHRoaXMuY3VycmVudE9yZy5pZCxcclxuICAgICAgICAgICAgICAgIHNwYWNlOiB0aGlzLmlucHV0Wm9uZSA/IHRoaXMuaW5wdXRab25lLnNwYWNlSUQgOiBbbnVsbF0sXHJcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogW251bGxdLFxyXG4gICAgICAgICAgICAgICAgem9uZTogW1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRab25lID8gdGhpcy5pbnB1dFpvbmUuaWQgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgbG9jYWxlOiBbdGhpcy5jdXJyZW50TG9jYWxlXSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblN1Ym1pdCgpIHtcclxuICAgICAgICB0aGlzLndvcmtpbmcgPSB0cnVlO1xyXG4gICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpO1xyXG4gICAgICAgIGxldCBzdGFydERhdGVTdHJpbmc6IHN0cmluZztcclxuICAgICAgICBsZXQgZW5kRGF0ZVN0cmluZzogc3RyaW5nO1xyXG4gICAgICAgIGlmICh0aGlzLnN0YXJ0RGF0ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlSG91clN0YXJ0TnVtYmVyID0gdGhpcy5zdGFydERhdGUgKyB0aGlzLm1pc3Npb25UaW1lU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IERhdGVUaW1lLmZyb21NaWxsaXMoZGF0ZUhvdXJTdGFydE51bWJlcik7XHJcbiAgICAgICAgICAgIHN0YXJ0RGF0ZVN0cmluZyA9IHN0YXJ0RGF0ZS50b0lTTygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5lbmREYXRlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGVIb3VyRW5kTnVtYmVyID0gdGhpcy5lbmREYXRlICsgdGhpcy5taXNzaW9uVGltZUVuZDtcclxuICAgICAgICAgICAgY29uc3QgZW5kRGF0ZSA9IERhdGVUaW1lLmZyb21NaWxsaXMoZGF0ZUhvdXJFbmROdW1iZXIpO1xyXG4gICAgICAgICAgICBlbmREYXRlU3RyaW5nID0gZW5kRGF0ZS50b0lTTygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcGxhdGU6IFZpc2l0VGVtcGxhdGUgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuZWRpdFRlbXBsYXRlLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBmb3JtVmFsdWUudGl0bGUsXHJcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGZvcm1WYWx1ZS5sZXZlbCxcclxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZm9ybVZhbHVlLmRlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIG9yZ2FuaXNhdGlvbklEOiBmb3JtVmFsdWUub3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlVGltZTogc3RhcnREYXRlU3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgIGVuZERhdGVUaW1lOiBlbmREYXRlU3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgIGhhc2h0YWdzOiB0aGlzLmFkZGVkSGFzaHRhZ3MubWFwKChoYXNodGFnKSA9PiBoYXNodGFnLmlkKSxcclxuICAgICAgICAgICAgICAgICAgICBsb2NhbGU6IGZvcm1WYWx1ZS5sb2NhbGUsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1WYWx1ZS5zcGFjZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLnNwYWNlSUQgPSBmb3JtVmFsdWUuc3BhY2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZm9ybVZhbHVlLnpvbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS56b25lSUQgPSBmb3JtVmFsdWUuem9uZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlZFRlbXBsYXRlLmVtaXQodGVtcGxhdGUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9jcmVhdGVcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRPcmcpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZTogVmlzaXRUZW1wbGF0ZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGZvcm1WYWx1ZS50aXRsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3JnYW5pc2F0aW9uSUQ6IHRoaXMuY3VycmVudE9yZy5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGZvcm1WYWx1ZS5sZXZlbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGZvcm1WYWx1ZS5kZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlVGltZTogc3RhcnREYXRlU3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmREYXRlVGltZTogZW5kRGF0ZVN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzaHRhZ3M6IHRoaXMuYWRkZWRIYXNodGFncy5tYXAoKGhhc2h0YWcpID0+IGhhc2h0YWcuaWQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGU6IGZvcm1WYWx1ZS5sb2NhbGUsXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybVZhbHVlLnNwYWNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLnNwYWNlSUQgPSBmb3JtVmFsdWUuc3BhY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtVmFsdWUuem9uZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS56b25lSUQgPSBmb3JtVmFsdWUuem9uZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVkVGVtcGxhdGUuZW1pdCh0ZW1wbGF0ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25DYW5jZWwoKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtID0gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5lZGl0VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVkVGVtcGxhdGUuZW1pdChudWxsKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZWRUZW1wbGF0ZS5lbWl0KG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgdGl0bGUoKTogQWJzdHJhY3RDb250cm9sIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtLmdldChcInRpdGxlXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzcGFjZUlEKCk6IEFic3RyYWN0Q29udHJvbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoXCJzcGFjZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblNwYWNlQ2xpY2soKSB7XHJcbiAgICAgICAgY29uc3Qgem9uZXMgPSBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLmdldFpvbmVzQnlTcGFjZShcclxuICAgICAgICAgICAgdGhpcy5zcGFjZUlELnZhbHVlLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgbXVzZXVtWm9uZXMgPSB6b25lcy5maWx0ZXIoKHpvbmUpID0+IHpvbmUuaXNNdXNldW1WaXNpdFpvbmUpO1xyXG4gICAgICAgIHRoaXMuem9uZXNGb3JTcGFjZSA9IHNvcnRBbHBoYWJldGljYWxseU9uTmFtZShtdXNldW1ab25lcyk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRIYXNodGFncyh0aGlzLnNwYWNlSUQudmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uSGFzaHRhZ0NsaWNrKGhhc2h0YWc6IEhhc2h0YWcpIHtcclxuICAgICAgICBpZiAoIXRoaXMuYWRkZWRIYXNodGFncy5pbmNsdWRlcyhoYXNodGFnKSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZGVkSGFzaHRhZ3MucHVzaChoYXNodGFnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFkZGVkSGFzaHRhZ3Muc3BsaWNlKHRoaXMuYWRkZWRIYXNodGFncy5pbmRleE9mKGhhc2h0YWcpLCAxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0SGFzaHRhZ3Moc3BhY2VJRDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVIYXNodGFncyA9IGF3YWl0IHRoaXMuaGFzaHRhZ1NlcnZpY2UuZ2V0SGFzaHRhZ3NGb3JTcGFjZShcclxuICAgICAgICAgICAgc3BhY2VJRCxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW5lclwiICpuZ0lmPVwiZm9ybVwiPlxyXG4gICAgPGRpdj5cclxuICAgICAgICA8aDQ+e3sgJ1Zpc2l0IFRlbXBsYXRlJyB8IHRyYW5zbGF0ZSB9fTwvaDQ+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxmb3JtIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdCgpXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J1Zpc2l0IFRpdGxlJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVkdmFyZCBNdW5jaCAtIMKrIFVuIHBvw6htZSBk4oCZYW1vdXIsIGRlIHZpZSBldCBkZSBtb3J0IMK7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwidGl0bGUuaW52YWxpZCAmJiB0aXRsZS50b3VjaGVkXCIgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0Rlc2NyaXB0aW9uJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCIgc3R5bGU9XCJoZWlnaHQ6MjAwcHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkNldHRlIHZpc2l0ZSBk4oCZMWgzMCB2b3VzIHByw6lzZW50ZXJhIGxlcyDFk3V2cmVzIGVtYmzDqW1hdGlxdWVzIGR1IGPDqWzDqGJyZSBwZWludHJlIG5vcnbDqWdpZW4gRWR2YXJkIE11bmNoICgxODYzLTE5NDQpLi4uXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydMYW5ndWFnZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwibG9jYWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwibnVsbFwiPnt7J05vdCBhcHBsaWNhYmxlJyB8IHRyYW5zbGF0ZX19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGxvY2FsZSBvZiBsb2NhbGVzXCIgW25nVmFsdWVdPVwibG9jYWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsb2NhbGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snTGV2ZWwnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJlcXVpcmVkIGZvcm1Db250cm9sTmFtZT1cImxldmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGxldmVsIG9mIGF2YWlsYWJsZUxldmVsc1wiIFtuZ1ZhbHVlXT1cImxldmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsZXZlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eyAnQXV0aG9yaXplZCBsb2NhdGlvbicgfCB0cmFuc2xhdGUgfX0qPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiICpuZ0lmPVwiYXZhaWxhYmxlU3BhY2VzICYmICFpbnB1dFpvbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVxdWlyZWQgZm9ybUNvbnRyb2xOYW1lPVwic3BhY2VcIiAoY2hhbmdlKT1cIm9uU3BhY2VDbGljaygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHNwYWNlIG9mIGF2YWlsYWJsZVNwYWNlc1wiIFtuZ1ZhbHVlXT1cInNwYWNlLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzcGFjZS5uYW1lIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cIiFhdmFpbGFibGVTcGFjZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyAnTm8gbG9jYXRpb25zIGF2YWlsYWJsZScgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cImlucHV0Wm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW3ZhbHVlXT1cImlucHV0Wm9uZS5zcGFjZS5uYW1lXCIgZGlzYWJsZWQ+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3sgJ0F1dGhvcml6ZWQgem9uZScgfCB0cmFuc2xhdGUgfX0qPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiICpuZ0lmPVwiem9uZXNGb3JTcGFjZSAmJiB6b25lc0ZvclNwYWNlLmxlbmd0aCA+IDAgJiYgIWlucHV0Wm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZXF1aXJlZCBmb3JtQ29udHJvbE5hbWU9XCJ6b25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHpvbmUgb2Ygem9uZXNGb3JTcGFjZVwiIFtuZ1ZhbHVlXT1cInpvbmUuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHpvbmUubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCIgKm5nSWY9XCJ6b25lc0ZvclNwYWNlICYmIHpvbmVzRm9yU3BhY2UubGVuZ3RoID09PSAwICYmICFpbnB1dFpvbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIndhcm5pbmcgY29sLWZvcm0tbGFiZWxcIj57e1wiTm8gTXVzZXVtIFpvbmVzIGZvdW5kIGZvciB0aGlzIGxvY2F0aW9uXCJ8IHRyYW5zbGF0ZX19PC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cImlucHV0Wm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW3ZhbHVlXT1cImlucHV0Wm9uZS5uYW1lXCIgZGlzYWJsZWQ+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snSGFzaHRhZ3MnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCIgKm5nSWY9XCJzcGFjZUlELnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJrZXl3b3Jkc1J1bGVzXCIgKm5nSWY9XCJhdmFpbGFibGVIYXNodGFncy5sZW5ndGggPiAwXCI+e3snQXZhaWxhYmxlIGhhc2h0YWdzJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwia2V5d29yZHNSdWxlc1wiICpuZ0lmPVwiYXZhaWxhYmxlSGFzaHRhZ3MubGVuZ3RoID09PSAwXCI+e3snTm8gaGFzaHRhZ3MgY3JlYXRlZCBmb3IgdGhpc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbicgfCB0cmFuc2xhdGV9fSA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImF2YWlsYWJsZUhhc2h0YWdzLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwia2V5d29yZHNEaXNwbGF5IG5vLWJvcmRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleXdvcmRzZGlzcGxheUNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBbY2xhc3NdPVwiYWRkZWRIYXNodGFncy5pbmNsdWRlcyhoYXNodGFnKSA/ICdrZXl3b3Jkc0l0ZW0gYWRkZWQnIDogJ2tleXdvcmRzSXRlbSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaGFzaHRhZyBvZiBhdmFpbGFibGVIYXNodGFnc1wiIChjbGljayk9XCJvbkhhc2h0YWdDbGljayhoYXNodGFnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJ7e2FkZGVkSGFzaHRhZ3MuaW5jbHVkZXMoaGFzaHRhZykgPyAoJ1JlbW92ZSd8dHJhbnNsYXRlKSA6ICgnQWRkJ3x0cmFuc2xhdGUpIH19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aGFzaHRhZy5uYW1lfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwia2V5d29yZHNSdWxlc1wiPnt7J0FkZGVkIGhhc2h0YWdzJyB8IHRyYW5zbGF0ZX19IDwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwia2V5d29yZHNEaXNwbGF5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2V5d29yZHNkaXNwbGF5Q29udGFpbmVyXCIgKm5nSWY9XCJhZGRlZEhhc2h0YWdzLmxlbmd0aD4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImtleXdvcmRzSXRlbVwiICpuZ0Zvcj1cImxldCBoYXNodGFnIG9mIGFkZGVkSGFzaHRhZ3NcIj57eyBoYXNodGFnLm5hbWUgfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiICpuZ0lmPVwiIXNwYWNlSUQudmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImtleXdvcmRzUnVsZXNcIj57eydZb3UgbmVlZCB0byBjaG9vc2UgdGhlIGxvY2F0aW9uIGZpcnN0JyB8IHRyYW5zbGF0ZX19IDwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydTdGFydCBEYXRlJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHBsYWNlaG9sZGVyPVwiZGQvbW0veXl5eVwiIFsobmdNb2RlbCldPVwic3RhcnREYXRlXCIgbmdiRGF0ZXBpY2tlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAjZDE9XCJuZ2JEYXRlcGlja2VyXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1hcHBlbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgY2FsZW5kYXJcIiAoY2xpY2spPVwiZDEudG9nZ2xlKClcIiB0eXBlPVwiYnV0dG9uXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snU3RhcnQgVGltZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmdiLXRpbWVwaWNrZXIgWyhuZ01vZGVsKV09XCJtaXNzaW9uVGltZVN0YXJ0XCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmdiLXRpbWVwaWNrZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snRW5kIERhdGUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcGxhY2Vob2xkZXI9XCJkZC9tbS95eXl5XCIgWyhuZ01vZGVsKV09XCJlbmREYXRlXCIgbmdiRGF0ZXBpY2tlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAjZDI9XCJuZ2JEYXRlcGlja2VyXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1hcHBlbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgY2FsZW5kYXJcIiAoY2xpY2spPVwiZDIudG9nZ2xlKClcIiB0eXBlPVwiYnV0dG9uXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snRW5kIFRpbWUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nYi10aW1lcGlja2VyIFsobmdNb2RlbCldPVwibWlzc2lvblRpbWVFbmRcIiBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCI+PC9uZ2ItdGltZXBpY2tlcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1jb250cm9sLWRpdiBhY3Rpb24tYnV0dG9uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBhY3Rpb24tYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ0aGlzLndvcmtpbmcgfHwgZm9ybS5pbnZhbGlkXCI+e3snU2F2ZScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25DYW5jZWwoKVwiIFtkaXNhYmxlZF09XCJ0aGlzLndvcmtpbmdcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgYWN0aW9uLWJ1dHRvblwiPnt7J0NhbmNlbCcgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZm9ybT5cclxuPC9kaXY+Il19