@smarterplan/ngx-smarterplan-admin 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/admin/admin.component.mjs +36 -0
- package/esm2022/lib/chevron/chevron.component.mjs +19 -0
- package/{esm2020 → esm2022}/lib/guest-link/guest-link.component.mjs +70 -62
- package/esm2022/lib/guide.guard.mjs +29 -0
- package/{esm2020 → esm2022}/lib/helpers.mjs +24 -24
- package/esm2022/lib/name-from-id.pipe.mjs +31 -0
- package/esm2022/lib/ngx-smarterplan-admin-routing.module.mjs +48 -0
- package/esm2022/lib/ngx-smarterplan-admin.module.mjs +89 -0
- package/esm2022/lib/ngx-smarterplan-admin.service.mjs +15 -0
- package/esm2022/lib/organisation/organisation.component.mjs +182 -0
- package/esm2022/lib/sp-admin.guard.mjs +29 -0
- package/esm2022/lib/user/detail-organisation/detail-organisation.component.mjs +207 -0
- package/esm2022/lib/user/form-mission/form-mission.component.mjs +290 -0
- package/esm2022/lib/user/form-organisation/form-organisation.component.mjs +139 -0
- package/esm2022/lib/user/user-mission-form/user-mission-form.component.mjs +132 -0
- package/esm2022/lib/user/user.component.mjs +353 -0
- package/esm2022/lib/visitor/create-batch/create-batch.component.mjs +112 -0
- package/esm2022/lib/visitor/template/template.component.mjs +295 -0
- package/esm2022/lib/visitor/visitor.component.mjs +318 -0
- package/{esm2020 → esm2022}/public-api.mjs +5 -5
- package/{esm2020 → esm2022}/smarterplan-ngx-smarterplan-admin.mjs +4 -4
- package/{fesm2020 → fesm2022}/smarterplan-ngx-smarterplan-admin.mjs +2205 -2065
- package/{fesm2015 → fesm2022}/smarterplan-ngx-smarterplan-admin.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/admin/admin.component.d.ts +13 -13
- package/lib/chevron/chevron.component.d.ts +9 -9
- package/lib/guest-link/guest-link.component.d.ts +20 -20
- package/lib/guide.guard.d.ts +11 -11
- package/lib/helpers.d.ts +2 -2
- package/lib/name-from-id.pipe.d.ts +11 -11
- package/lib/ngx-smarterplan-admin-routing.module.d.ts +7 -7
- package/lib/ngx-smarterplan-admin.module.d.ts +26 -26
- package/lib/ngx-smarterplan-admin.service.d.ts +6 -6
- package/lib/organisation/organisation.component.d.ts +54 -54
- package/lib/sp-admin.guard.d.ts +11 -11
- package/lib/user/detail-organisation/detail-organisation.component.d.ts +49 -49
- package/lib/user/form-mission/form-mission.component.d.ts +63 -63
- package/lib/user/form-organisation/form-organisation.component.d.ts +32 -32
- package/lib/user/user-mission-form/user-mission-form.component.d.ts +32 -32
- package/lib/user/user.component.d.ts +102 -102
- package/lib/visitor/create-batch/create-batch.component.d.ts +23 -23
- package/lib/visitor/template/template.component.d.ts +58 -58
- package/lib/visitor/visitor.component.d.ts +70 -70
- package/package.json +11 -17
- package/public-api.d.ts +2 -2
- package/esm2020/lib/admin/admin.component.mjs +0 -34
- package/esm2020/lib/chevron/chevron.component.mjs +0 -19
- package/esm2020/lib/guide.guard.mjs +0 -26
- package/esm2020/lib/name-from-id.pipe.mjs +0 -29
- package/esm2020/lib/ngx-smarterplan-admin-routing.module.mjs +0 -47
- package/esm2020/lib/ngx-smarterplan-admin.module.mjs +0 -88
- package/esm2020/lib/ngx-smarterplan-admin.service.mjs +0 -14
- package/esm2020/lib/organisation/organisation.component.mjs +0 -171
- package/esm2020/lib/sp-admin.guard.mjs +0 -26
- package/esm2020/lib/user/detail-organisation/detail-organisation.component.mjs +0 -191
- package/esm2020/lib/user/form-mission/form-mission.component.mjs +0 -265
- package/esm2020/lib/user/form-organisation/form-organisation.component.mjs +0 -125
- package/esm2020/lib/user/user-mission-form/user-mission-form.component.mjs +0 -121
- package/esm2020/lib/user/user.component.mjs +0 -336
- package/esm2020/lib/visitor/create-batch/create-batch.component.mjs +0 -106
- package/esm2020/lib/visitor/template/template.component.mjs +0 -277
- package/esm2020/lib/visitor/visitor.component.mjs +0 -299
- package/fesm2015/smarterplan-ngx-smarterplan-admin.mjs +0 -2245
- package/fesm2020/smarterplan-ngx-smarterplan-admin.mjs.map +0 -1
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { deleteFromS3, getSignedFile, removeNullKeysFromObject, uploadFileToS3 } from '@smarterplan/ngx-smarterplan-core';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@smarterplan/ngx-smarterplan-core";
|
|
5
|
+
import * as i2 from "@angular/forms";
|
|
6
|
+
import * as i3 from "@ngx-translate/core";
|
|
7
|
+
import * as i4 from "@angular/common";
|
|
8
|
+
class DetailOrganisationComponent {
|
|
9
|
+
organisationService;
|
|
10
|
+
formBuilder;
|
|
11
|
+
propertyService;
|
|
12
|
+
missionService;
|
|
13
|
+
translate;
|
|
14
|
+
org;
|
|
15
|
+
currentOrg;
|
|
16
|
+
isSP;
|
|
17
|
+
orgChanged = new EventEmitter();
|
|
18
|
+
myOrg;
|
|
19
|
+
tokenExpired;
|
|
20
|
+
loading = false;
|
|
21
|
+
connectingStripe = false;
|
|
22
|
+
modalRef;
|
|
23
|
+
errorMessage;
|
|
24
|
+
editForm;
|
|
25
|
+
fileToUpload;
|
|
26
|
+
signedLogo;
|
|
27
|
+
constructor(organisationService,
|
|
28
|
+
// private localStripe: StripeService,
|
|
29
|
+
formBuilder, propertyService, missionService, translate) {
|
|
30
|
+
this.organisationService = organisationService;
|
|
31
|
+
this.formBuilder = formBuilder;
|
|
32
|
+
this.propertyService = propertyService;
|
|
33
|
+
this.missionService = missionService;
|
|
34
|
+
this.translate = translate;
|
|
35
|
+
}
|
|
36
|
+
async ngOnInit() {
|
|
37
|
+
this.myOrg = this.currentOrg.id === this.org.id;
|
|
38
|
+
if (!this.org.connectedAccountStripeID && (this.myOrg || this.isSP)) {
|
|
39
|
+
this.setConnectStripeLink();
|
|
40
|
+
}
|
|
41
|
+
if (this.org.logoUrl) {
|
|
42
|
+
this.signedLogo = await getSignedFile(this.org.logoUrl);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
ngOnChanges() {
|
|
46
|
+
this.myOrg = this.currentOrg.id === this.org.id;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Tokens were supposed to be used if Organisation exists already (created by one account) and it should be resused (by another account) instead of creating a duplicate.
|
|
50
|
+
*/
|
|
51
|
+
// async onToken() {
|
|
52
|
+
// const token = uuidv4();
|
|
53
|
+
// const expires = new Date();
|
|
54
|
+
// expires.setDate(expires.getDate() + 7); // 7 days expiration
|
|
55
|
+
// this.org = await this.organisationService.updateOrganisation({
|
|
56
|
+
// id: this.org.id,
|
|
57
|
+
// shareToken: token,
|
|
58
|
+
// tokenExpiresAt: expires.getTime(),
|
|
59
|
+
// });
|
|
60
|
+
// this.orgChanged.emit(true);
|
|
61
|
+
// }
|
|
62
|
+
prettifyToken() {
|
|
63
|
+
const expirationDate = new Date(this.org.tokenExpiresAt);
|
|
64
|
+
const diffTime = expirationDate.getTime() - Date.now();
|
|
65
|
+
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
|
|
66
|
+
const expirationString = diffTime < 0 ? "expired!" : `expires in ${diffDays} days`;
|
|
67
|
+
return `${this.org.shareToken.slice(0, 6)}... ${expirationString}`;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Created New Stripe Account and launches onboarding procedure (mail, phone, business details..) by Stripe
|
|
71
|
+
* @returns null
|
|
72
|
+
*/
|
|
73
|
+
// async onCreateStripe() {
|
|
74
|
+
// this.loading = true;
|
|
75
|
+
// // Make the request
|
|
76
|
+
// const responseAccount = await API.post(
|
|
77
|
+
// "stripeApi",
|
|
78
|
+
// "/create/account",
|
|
79
|
+
// {},
|
|
80
|
+
// );
|
|
81
|
+
// console.log(responseAccount);
|
|
82
|
+
// if (responseAccount.err) {
|
|
83
|
+
// this.handleStripeError(responseAccount);
|
|
84
|
+
// return;
|
|
85
|
+
// }
|
|
86
|
+
// const { account } = responseAccount;
|
|
87
|
+
// // save account id to organisation
|
|
88
|
+
// await this.organisationService.update({
|
|
89
|
+
// id: this.org.id,
|
|
90
|
+
// connectedAccountStripeID: account.id,
|
|
91
|
+
// stripeOnBoardingCompleted: false,
|
|
92
|
+
// });
|
|
93
|
+
// const { origin } = document.location;
|
|
94
|
+
// const responseAccountLinks = await this.localStripe.createAccountLink(
|
|
95
|
+
// account.id,
|
|
96
|
+
// origin,
|
|
97
|
+
// );
|
|
98
|
+
// if (responseAccountLinks.err) {
|
|
99
|
+
// this.handleStripeError(responseAccountLinks);
|
|
100
|
+
// return;
|
|
101
|
+
// }
|
|
102
|
+
// window.location.href = responseAccountLinks.accountLinks.url;
|
|
103
|
+
// this.loading = false;
|
|
104
|
+
// }
|
|
105
|
+
// async onCompleteOnboardingStripe() {
|
|
106
|
+
// this.loading = true;
|
|
107
|
+
// const responseAccountLinks = await this.localStripe.createAccountLink(
|
|
108
|
+
// this.org.connectedAccountStripeID,
|
|
109
|
+
// origin,
|
|
110
|
+
// );
|
|
111
|
+
// if (responseAccountLinks.err) {
|
|
112
|
+
// this.handleStripeError(responseAccountLinks);
|
|
113
|
+
// return;
|
|
114
|
+
// }
|
|
115
|
+
// window.location.href = responseAccountLinks.accountLinks.url;
|
|
116
|
+
// this.loading = false;
|
|
117
|
+
// }
|
|
118
|
+
// handleStripeError(stripeResponse) {
|
|
119
|
+
// alert(stripeResponse.err.raw.message);
|
|
120
|
+
// this.loading = false;
|
|
121
|
+
// }
|
|
122
|
+
/**
|
|
123
|
+
* Generate link for Launching OAuth connection with Stripe: https://stripe.com/docs/connect/oauth-standard-accounts#integrating-oauth
|
|
124
|
+
*/
|
|
125
|
+
setConnectStripeLink() {
|
|
126
|
+
setTimeout(() => {
|
|
127
|
+
const hyperlink = document.querySelector("#linkStripe");
|
|
128
|
+
if (hyperlink) {
|
|
129
|
+
const clientID = "ca_KQhYOlgR1ipOxLBBQHfQeCLoaySRVD5P"; // TODO change for live Stripe Account
|
|
130
|
+
const { origin } = document.location;
|
|
131
|
+
const returnUrl = `${origin}/stripe/redirect`;
|
|
132
|
+
hyperlink.setAttribute("href", `https://connect.stripe.com/oauth/authorize?response_type=code&client_id=${clientID}&scope=read_write&redirect_uri=${returnUrl}&state=${this.org.id}`);
|
|
133
|
+
}
|
|
134
|
+
}, 200); // wait until the element is rendered
|
|
135
|
+
}
|
|
136
|
+
/** Edit */
|
|
137
|
+
onEdit() {
|
|
138
|
+
this.editForm = this.formBuilder.group({
|
|
139
|
+
id: this.org.id,
|
|
140
|
+
name: this.org.name,
|
|
141
|
+
siret: this.org.siret,
|
|
142
|
+
city: this.org.city,
|
|
143
|
+
address: this.org.address,
|
|
144
|
+
contactDetails: this.org.contactDetails,
|
|
145
|
+
postal: this.org.postal,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
get name() {
|
|
149
|
+
return this.editForm.get("name");
|
|
150
|
+
}
|
|
151
|
+
async onSubmit() {
|
|
152
|
+
const formValue = this.editForm.value;
|
|
153
|
+
removeNullKeysFromObject(formValue);
|
|
154
|
+
try {
|
|
155
|
+
const updatedOrg = await this.organisationService.updateOrganisation(formValue);
|
|
156
|
+
this.org = updatedOrg;
|
|
157
|
+
if (this.fileToUpload) {
|
|
158
|
+
if (this.org.logoUrl) {
|
|
159
|
+
// delete the previous
|
|
160
|
+
await deleteFromS3(this.org.logoUrl);
|
|
161
|
+
}
|
|
162
|
+
await uploadFileToS3("logos/", this.fileToUpload, this.org.id).then(async (url) => {
|
|
163
|
+
await this.organisationService.updateOrganisation({ id: this.org.id, logoUrl: url });
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
console.error(JSON.stringify(error));
|
|
169
|
+
}
|
|
170
|
+
this.editForm = null;
|
|
171
|
+
}
|
|
172
|
+
onCancel() {
|
|
173
|
+
this.editForm = null;
|
|
174
|
+
}
|
|
175
|
+
handleFileInput(event) {
|
|
176
|
+
const target = event.target;
|
|
177
|
+
this.fileToUpload = target.files.item(0);
|
|
178
|
+
}
|
|
179
|
+
async onDelete() {
|
|
180
|
+
const message = this.translate.instant("confirm.deleteOrganisation");
|
|
181
|
+
if (window.confirm(message) && this.org.id !== "6e28201f-4679-4c29-9d2d-8a325f57cee9") {
|
|
182
|
+
const propertiesToDelete = await this.propertyService.getPropertiesForOrganisation(this.org.id);
|
|
183
|
+
await this.organisationService.softDeteleOrg(this.org.id);
|
|
184
|
+
(await this.missionService.getMissionsByOrganisation(this.org.id)).map((m) => this.missionService.softDeleteMission(m.id));
|
|
185
|
+
await Promise.all(propertiesToDelete.map(async (property) => {
|
|
186
|
+
await this.propertyService.deleteProperty(property.id);
|
|
187
|
+
}));
|
|
188
|
+
this.orgChanged.emit(true);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DetailOrganisationComponent, deps: [{ token: i1.OrganisationService }, { token: i2.UntypedFormBuilder }, { token: i1.PropertyService }, { token: i1.MissionService }, { token: i3.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
192
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DetailOrganisationComponent, selector: "lib-detail-organisation", inputs: { org: "org", currentOrg: "currentOrg", isSP: "isSP" }, outputs: { orgChanged: "orgChanged" }, usesOnChanges: true, ngImport: i0, template: "<div>\r\n <h5>{{'Organisation Details' | translate }}</h5>\r\n <div *ngIf=\"!editForm\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{ org.name }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Logo' | translate }}: {{ org.logoUrl ? \"\" : \"No logo uploaded\"}} \r\n <img class=\"logo-img\" *ngIf=\"signedLogo\" [src]=\"signedLogo\">\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'SIRET' | translate }}: {{\r\n org.siret ? org.siret : (\"No data\" | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate }}: {{\r\n org.address ? org.address : (\"No data\" | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'City' | translate }}: {{org.city }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Contact information' | translate}}:\r\n {{ org.contactDetails ? org.contactDetails : (\"No data\" | translate)}}</li>\r\n <!-- <li class=\"list-group-item bg-transparent\" *ngIf=\"isSP\">\r\n <div class=\"row ml-0\">\r\n <div>\r\n {{'Active token' | translate }}:\r\n {{ org.shareToken ? prettifyToken() : ('No' | translate) }}\r\n </div>\r\n <div *ngIf=\"org.shareToken && !tokenExpired\" [cdkCopyToClipboard]=\"org.shareToken\"\r\n [style.cursor]=\"'pointer'\" style=\"margin-left: 5px; max-width: 20px;\" ngbTooltip=\"Copied!\"\r\n triggers=\"click:blur\">\r\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\r\n data-height=\"20\"></span>\r\n </div>\r\n </div>\r\n </li> -->\r\n </ul>\r\n <div class=\"action-button-container\">\r\n <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP || myOrg\"\r\n (click)=\"onEdit()\"> {{'Edit' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP\"\r\n (click)=\"onDelete()\"> {{'Delete' | translate}}</button>\r\n <!-- <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP\"\r\n (click)=\"onToken()\">{{'Generate token' | translate}}</button> -->\r\n </div>\r\n </div>\r\n\r\n <!--Edit Form-->\r\n <div *ngIf=\"editForm\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"editForm\">\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" [class.is-invalid]=\"name.invalid && name.touched\" required\r\n formControlName=\"name\">\r\n <div class=\"invalid-feedback\">\r\n {{'A name is required' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Contact information' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"contactDetails\"\r\n placeholder=\"{{'Name, phone, email' | translate}}\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Address' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"address\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'City' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"city\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Postal code' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"postal\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'SIRET' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"siret\">\r\n </div>\r\n </div>\r\n \r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Logo' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <label for=\"file\" class=\"btn btn-label-file rounded-pill\">\r\n <input type=\"file\" id=\"file\" (change)=\"handleFileInput($event)\" />\r\n {{'Add logo image' | translate}}</label>\r\n <p class=\"fileToUploadName\" *ngIf=\"fileToUpload\">{{fileToUpload.name}}</p>\r\n </div>\r\n \r\n </div>\r\n <div class=\"action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"editForm.invalid\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' |\r\n translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n <!--Loading-->\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n\r\n <!--Stripe-->\r\n <!-- <hr>\r\n <h5>{{'stripe.account' | translate }}</h5>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"(isSP || myOrg) && org.connectedAccountStripeID\">\r\n {{'stripe.connected' | translate }}: {{org.connectedAccountStripeID.substring(0, 15) }}...</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"(isSP || myOrg) && org.stripeOnBoardingCompleted !== null\">\r\n {{'stripe.completed' | translate }}: {{org.stripeOnBoardingCompleted }}</li>\r\n </ul> -->\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}.logo-img{height:100px;object-fit:contain;margin:4px 10px}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", 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]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i1.LoaderComponent, selector: "lib-loader", inputs: ["useLogo", "color"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
|
|
193
|
+
}
|
|
194
|
+
export { DetailOrganisationComponent };
|
|
195
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DetailOrganisationComponent, decorators: [{
|
|
196
|
+
type: Component,
|
|
197
|
+
args: [{ selector: 'lib-detail-organisation', template: "<div>\r\n <h5>{{'Organisation Details' | translate }}</h5>\r\n <div *ngIf=\"!editForm\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{ org.name }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Logo' | translate }}: {{ org.logoUrl ? \"\" : \"No logo uploaded\"}} \r\n <img class=\"logo-img\" *ngIf=\"signedLogo\" [src]=\"signedLogo\">\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'SIRET' | translate }}: {{\r\n org.siret ? org.siret : (\"No data\" | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate }}: {{\r\n org.address ? org.address : (\"No data\" | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'City' | translate }}: {{org.city }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Contact information' | translate}}:\r\n {{ org.contactDetails ? org.contactDetails : (\"No data\" | translate)}}</li>\r\n <!-- <li class=\"list-group-item bg-transparent\" *ngIf=\"isSP\">\r\n <div class=\"row ml-0\">\r\n <div>\r\n {{'Active token' | translate }}:\r\n {{ org.shareToken ? prettifyToken() : ('No' | translate) }}\r\n </div>\r\n <div *ngIf=\"org.shareToken && !tokenExpired\" [cdkCopyToClipboard]=\"org.shareToken\"\r\n [style.cursor]=\"'pointer'\" style=\"margin-left: 5px; max-width: 20px;\" ngbTooltip=\"Copied!\"\r\n triggers=\"click:blur\">\r\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\r\n data-height=\"20\"></span>\r\n </div>\r\n </div>\r\n </li> -->\r\n </ul>\r\n <div class=\"action-button-container\">\r\n <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP || myOrg\"\r\n (click)=\"onEdit()\"> {{'Edit' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP\"\r\n (click)=\"onDelete()\"> {{'Delete' | translate}}</button>\r\n <!-- <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP\"\r\n (click)=\"onToken()\">{{'Generate token' | translate}}</button> -->\r\n </div>\r\n </div>\r\n\r\n <!--Edit Form-->\r\n <div *ngIf=\"editForm\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"editForm\">\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" [class.is-invalid]=\"name.invalid && name.touched\" required\r\n formControlName=\"name\">\r\n <div class=\"invalid-feedback\">\r\n {{'A name is required' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Contact information' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"contactDetails\"\r\n placeholder=\"{{'Name, phone, email' | translate}}\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Address' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"address\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'City' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"city\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Postal code' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"postal\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'SIRET' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"siret\">\r\n </div>\r\n </div>\r\n \r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Logo' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <label for=\"file\" class=\"btn btn-label-file rounded-pill\">\r\n <input type=\"file\" id=\"file\" (change)=\"handleFileInput($event)\" />\r\n {{'Add logo image' | translate}}</label>\r\n <p class=\"fileToUploadName\" *ngIf=\"fileToUpload\">{{fileToUpload.name}}</p>\r\n </div>\r\n \r\n </div>\r\n <div class=\"action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"editForm.invalid\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' |\r\n translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n <!--Loading-->\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n\r\n <!--Stripe-->\r\n <!-- <hr>\r\n <h5>{{'stripe.account' | translate }}</h5>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"(isSP || myOrg) && org.connectedAccountStripeID\">\r\n {{'stripe.connected' | translate }}: {{org.connectedAccountStripeID.substring(0, 15) }}...</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"(isSP || myOrg) && org.stripeOnBoardingCompleted !== null\">\r\n {{'stripe.completed' | translate }}: {{org.stripeOnBoardingCompleted }}</li>\r\n </ul> -->\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}.logo-img{height:100px;object-fit:contain;margin:4px 10px}\n"] }]
|
|
198
|
+
}], ctorParameters: function () { return [{ type: i1.OrganisationService }, { type: i2.UntypedFormBuilder }, { type: i1.PropertyService }, { type: i1.MissionService }, { type: i3.TranslateService }]; }, propDecorators: { org: [{
|
|
199
|
+
type: Input
|
|
200
|
+
}], currentOrg: [{
|
|
201
|
+
type: Input
|
|
202
|
+
}], isSP: [{
|
|
203
|
+
type: Input
|
|
204
|
+
}], orgChanged: [{
|
|
205
|
+
type: Output
|
|
206
|
+
}] } });
|
|
207
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLW9yZ2FuaXNhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL2RldGFpbC1vcmdhbmlzYXRpb24vZGV0YWlsLW9yZ2FuaXNhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL2RldGFpbC1vcmdhbmlzYXRpb24vZGV0YWlsLW9yZ2FuaXNhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9FLE9BQU8sRUFDSCxZQUFZLEVBQUUsYUFBYSxFQUMzQix3QkFBd0IsRUFBRSxjQUFjLEVBQzNDLE1BQU0sbUNBQW1DLENBQUM7Ozs7OztBQUkzQyxNQUthLDJCQUEyQjtJQTRCeEI7SUFFQTtJQUNBO0lBQ0E7SUFDQTtJQWhDSCxHQUFHLENBQWU7SUFFbEIsVUFBVSxDQUFlO0lBRXpCLElBQUksQ0FBVTtJQUViLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0lBRW5ELEtBQUssQ0FBVTtJQUVmLFlBQVksQ0FBVTtJQUV0QixPQUFPLEdBQUcsS0FBSyxDQUFDO0lBRWhCLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUV6QixRQUFRLENBQUM7SUFFVCxZQUFZLENBQVM7SUFFckIsUUFBUSxDQUFtQjtJQUUzQixZQUFZLENBQU87SUFFbkIsVUFBVSxDQUFTO0lBRW5CLFlBQ1ksbUJBQXdDO0lBQ2hELHNDQUFzQztJQUM5QixXQUErQixFQUMvQixlQUFnQyxFQUNoQyxjQUE4QixFQUM5QixTQUEyQjtRQUwzQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FB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QTNCLDJCQUEyQiwyTENkeEMsMjBOQTJITTs7U0Q3R08sMkJBQTJCOzRGQUEzQiwyQkFBMkI7a0JBTHZDLFNBQVM7K0JBQ0kseUJBQXlCO3FPQUsxQixHQUFHO3NCQUFYLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVW50eXBlZEZvcm1Hcm91cCwgVW50eXBlZEZvcm1CdWlsZGVyLCBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7XHJcbiAgICBkZWxldGVGcm9tUzMsIGdldFNpZ25lZEZpbGUsIE9yZ2FuaXNhdGlvbiwgT3JnYW5pc2F0aW9uU2VydmljZSxcclxuICAgIHJlbW92ZU51bGxLZXlzRnJvbU9iamVjdCwgdXBsb2FkRmlsZVRvUzMsIFByb3BlcnR5U2VydmljZSwgTWlzc2lvblNlcnZpY2VcclxufSBmcm9tICdAc21hcnRlcnBsYW4vbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xyXG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tIFwidXVpZFwiO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdsaWItZGV0YWlsLW9yZ2FuaXNhdGlvbicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGV0YWlsLW9yZ2FuaXNhdGlvbi5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9kZXRhaWwtb3JnYW5pc2F0aW9uLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIERldGFpbE9yZ2FuaXNhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgICBASW5wdXQoKSBvcmc6IE9yZ2FuaXNhdGlvbjtcclxuXHJcbiAgICBASW5wdXQoKSBjdXJyZW50T3JnOiBPcmdhbmlzYXRpb247XHJcblxyXG4gICAgQElucHV0KCkgaXNTUDogYm9vbGVhbjtcclxuXHJcbiAgICBAT3V0cHV0KCkgb3JnQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgICBteU9yZzogYm9vbGVhbjtcclxuXHJcbiAgICB0b2tlbkV4cGlyZWQ6IGJvb2xlYW47XHJcblxyXG4gICAgbG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICAgIGNvbm5lY3RpbmdTdHJpcGUgPSBmYWxzZTtcclxuXHJcbiAgICBtb2RhbFJlZjtcclxuXHJcbiAgICBlcnJvck1lc3NhZ2U6IHN0cmluZztcclxuXHJcbiAgICBlZGl0Rm9ybTogVW50eXBlZEZvcm1Hcm91cDtcclxuXHJcbiAgICBmaWxlVG9VcGxvYWQ6IEZpbGU7XHJcblxyXG4gICAgc2lnbmVkTG9nbzogc3RyaW5nO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgb3JnYW5pc2F0aW9uU2VydmljZTogT3JnYW5pc2F0aW9uU2VydmljZSxcclxuICAgICAgICAvLyBwcml2YXRlIGxvY2FsU3RyaXBlOiBTdHJpcGVTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcclxuICAgICAgICBwcml2YXRlIHByb3BlcnR5U2VydmljZTogUHJvcGVydHlTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbWlzc2lvblNlcnZpY2U6IE1pc3Npb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgKSB7IH1cclxuXHJcbiAgICBhc3luYyBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLm15T3JnID0gdGhpcy5jdXJyZW50T3JnLmlkID09PSB0aGlzLm9yZy5pZDtcclxuICAgICAgICBpZiAoIXRoaXMub3JnLmNvbm5lY3RlZEFjY291bnRTdHJpcGVJRCAmJiAodGhpcy5teU9yZyB8fCB0aGlzLmlzU1ApKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0Q29ubmVjdFN0cmlwZUxpbmsoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3JnLmxvZ29VcmwpIHtcclxuICAgICAgICAgICAgdGhpcy5zaWduZWRMb2dvID0gYXdhaXQgZ2V0U2lnbmVkRmlsZSh0aGlzLm9yZy5sb2dvVXJsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKCkge1xyXG4gICAgICAgIHRoaXMubXlPcmcgPSB0aGlzLmN1cnJlbnRPcmcuaWQgPT09IHRoaXMub3JnLmlkO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUb2tlbnMgd2VyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGlmIE9yZ2FuaXNhdGlvbiBleGlzdHMgYWxyZWFkeSAoY3JlYXRlZCBieSBvbmUgYWNjb3VudCkgYW5kIGl0IHNob3VsZCBiZSByZXN1c2VkIChieSBhbm90aGVyIGFjY291bnQpIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBkdXBsaWNhdGUuXHJcbiAgICAgKi9cclxuICAgIC8vIGFzeW5jIG9uVG9rZW4oKSB7XHJcbiAgICAvLyAgICAgY29uc3QgdG9rZW4gPSB1dWlkdjQoKTtcclxuICAgIC8vICAgICBjb25zdCBleHBpcmVzID0gbmV3IERhdGUoKTtcclxuICAgIC8vICAgICBleHBpcmVzLnNldERhdGUoZXhwaXJlcy5nZXREYXRlKCkgKyA3KTsgLy8gNyBkYXlzIGV4cGlyYXRpb25cclxuICAgIC8vICAgICB0aGlzLm9yZyA9IGF3YWl0IHRoaXMub3JnYW5pc2F0aW9uU2VydmljZS51cGRhdGVPcmdhbmlzYXRpb24oe1xyXG4gICAgLy8gICAgICAgICBpZDogdGhpcy5vcmcuaWQsXHJcbiAgICAvLyAgICAgICAgIHNoYXJlVG9rZW46IHRva2VuLFxyXG4gICAgLy8gICAgICAgICB0b2tlbkV4cGlyZXNBdDogZXhwaXJlcy5nZXRUaW1lKCksXHJcbiAgICAvLyAgICAgfSk7XHJcbiAgICAvLyAgICAgdGhpcy5vcmdDaGFuZ2VkLmVtaXQodHJ1ZSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHJldHRpZnlUb2tlbigpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGV4cGlyYXRpb25EYXRlID0gbmV3IERhdGUodGhpcy5vcmcudG9rZW5FeHBpcmVzQXQpO1xyXG4gICAgICAgIGNvbnN0IGRpZmZUaW1lID0gZXhwaXJhdGlvbkRhdGUuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKTtcclxuICAgICAgICBjb25zdCBkaWZmRGF5cyA9IE1hdGguY2VpbChkaWZmVGltZSAvICgxMDAwICogNjAgKiA2MCAqIDI0KSk7XHJcbiAgICAgICAgY29uc3QgZXhwaXJhdGlvblN0cmluZyA9XHJcbiAgICAgICAgICAgIGRpZmZUaW1lIDwgMCA/IFwiZXhwaXJlZCFcIiA6IGBleHBpcmVzIGluICR7ZGlmZkRheXN9IGRheXNgO1xyXG4gICAgICAgIHJldHVybiBgJHt0aGlzLm9yZy5zaGFyZVRva2VuLnNsaWNlKDAsIDYpfS4uLiAke2V4cGlyYXRpb25TdHJpbmd9YDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZWQgTmV3IFN0cmlwZSBBY2NvdW50IGFuZCBsYXVuY2hlcyBvbmJvYXJkaW5nIHByb2NlZHVyZSAobWFpbCwgcGhvbmUsIGJ1c2luZXNzIGRldGFpbHMuLikgYnkgU3RyaXBlXHJcbiAgICAgKiBAcmV0dXJucyBudWxsXHJcbiAgICAgKi9cclxuICAgIC8vIGFzeW5jIG9uQ3JlYXRlU3RyaXBlKCkge1xyXG4gICAgLy8gICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICAvLyAgICAgLy8gTWFrZSB0aGUgcmVxdWVzdFxyXG4gICAgLy8gICAgIGNvbnN0IHJlc3BvbnNlQWNjb3VudCA9IGF3YWl0IEFQSS5wb3N0KFxyXG4gICAgLy8gICAgICAgICBcInN0cmlwZUFwaVwiLFxyXG4gICAgLy8gICAgICAgICBcIi9jcmVhdGUvYWNjb3VudFwiLFxyXG4gICAgLy8gICAgICAgICB7fSxcclxuICAgIC8vICAgICApO1xyXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlQWNjb3VudCk7XHJcbiAgICAvLyAgICAgaWYgKHJlc3BvbnNlQWNjb3VudC5lcnIpIHtcclxuICAgIC8vICAgICAgICAgdGhpcy5oYW5kbGVTdHJpcGVFcnJvcihyZXNwb25zZUFjY291bnQpO1xyXG4gICAgLy8gICAgICAgICByZXR1cm47XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICBjb25zdCB7IGFjY291bnQgfSA9IHJlc3BvbnNlQWNjb3VudDtcclxuICAgIC8vICAgICAvLyBzYXZlIGFjY291bnQgaWQgdG8gb3JnYW5pc2F0aW9uXHJcbiAgICAvLyAgICAgYXdhaXQgdGhpcy5vcmdhbmlzYXRpb25TZXJ2aWNlLnVwZGF0ZSh7XHJcbiAgICAvLyAgICAgICAgIGlkOiB0aGlzLm9yZy5pZCxcclxuICAgIC8vICAgICAgICAgY29ubmVjdGVkQWNjb3VudFN0cmlwZUlEOiBhY2NvdW50LmlkLFxyXG4gICAgLy8gICAgICAgICBzdHJpcGVPbkJvYXJkaW5nQ29tcGxldGVkOiBmYWxzZSxcclxuICAgIC8vICAgICB9KTtcclxuXHJcbiAgICAvLyAgICAgY29uc3QgeyBvcmlnaW4gfSA9IGRvY3VtZW50LmxvY2F0aW9uO1xyXG4gICAgLy8gICAgIGNvbnN0IHJlc3BvbnNlQWNjb3VudExpbmtzID0gYXdhaXQgdGhpcy5sb2NhbFN0cmlwZS5jcmVhdGVBY2NvdW50TGluayhcclxuICAgIC8vICAgICAgICAgYWNjb3VudC5pZCxcclxuICAgIC8vICAgICAgICAgb3JpZ2luLFxyXG4gICAgLy8gICAgICk7XHJcbiAgICAvLyAgICAgaWYgKHJlc3BvbnNlQWNjb3VudExpbmtzLmVycikge1xyXG4gICAgLy8gICAgICAgICB0aGlzLmhhbmRsZVN0cmlwZUVycm9yKHJlc3BvbnNlQWNjb3VudExpbmtzKTtcclxuICAgIC8vICAgICAgICAgcmV0dXJuO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHJlc3BvbnNlQWNjb3VudExpbmtzLmFjY291bnRMaW5rcy51cmw7XHJcbiAgICAvLyAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gYXN5bmMgb25Db21wbGV0ZU9uYm9hcmRpbmdTdHJpcGUoKSB7XHJcbiAgICAvLyAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIC8vICAgICBjb25zdCByZXNwb25zZUFjY291bnRMaW5rcyA9IGF3YWl0IHRoaXMubG9jYWxTdHJpcGUuY3JlYXRlQWNjb3VudExpbmsoXHJcbiAgICAvLyAgICAgICAgIHRoaXMub3JnLmNvbm5lY3RlZEFjY291bnRTdHJpcGVJRCxcclxuICAgIC8vICAgICAgICAgb3JpZ2luLFxyXG4gICAgLy8gICAgICk7XHJcbiAgICAvLyAgICAgaWYgKHJlc3BvbnNlQWNjb3VudExpbmtzLmVycikge1xyXG4gICAgLy8gICAgICAgICB0aGlzLmhhbmRsZVN0cmlwZUVycm9yKHJlc3BvbnNlQWNjb3VudExpbmtzKTtcclxuICAgIC8vICAgICAgICAgcmV0dXJuO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHJlc3BvbnNlQWNjb3VudExpbmtzLmFjY291bnRMaW5rcy51cmw7XHJcbiAgICAvLyAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gaGFuZGxlU3RyaXBlRXJyb3Ioc3RyaXBlUmVzcG9uc2UpIHtcclxuICAgIC8vICAgICBhbGVydChzdHJpcGVSZXNwb25zZS5lcnIucmF3Lm1lc3NhZ2UpO1xyXG4gICAgLy8gICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGUgbGluayBmb3IgTGF1bmNoaW5nIE9BdXRoIGNvbm5lY3Rpb24gd2l0aCBTdHJpcGU6IGh0dHBzOi8vc3RyaXBlLmNvbS9kb2NzL2Nvbm5lY3Qvb2F1dGgtc3RhbmRhcmQtYWNjb3VudHMjaW50ZWdyYXRpbmctb2F1dGhcclxuICAgICAqL1xyXG4gICAgc2V0Q29ubmVjdFN0cmlwZUxpbmsoKSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGh5cGVybGluayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgICAgICAgICBcIiNsaW5rU3RyaXBlXCIsXHJcbiAgICAgICAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmIChoeXBlcmxpbmspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudElEID0gXCJjYV9LUWhZT2xnUjFpcE94TEJCUUhmUWVDTG9heVNSVkQ1UFwiOyAvLyBUT0RPIGNoYW5nZSBmb3IgbGl2ZSBTdHJpcGUgQWNjb3VudFxyXG4gICAgICAgICAgICAgICAgY29uc3QgeyBvcmlnaW4gfSA9IGRvY3VtZW50LmxvY2F0aW9uO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuVXJsID0gYCR7b3JpZ2lufS9zdHJpcGUvcmVkaXJlY3RgO1xyXG4gICAgICAgICAgICAgICAgaHlwZXJsaW5rLnNldEF0dHJpYnV0ZShcclxuICAgICAgICAgICAgICAgICAgICBcImhyZWZcIixcclxuICAgICAgICAgICAgICAgICAgICBgaHR0cHM6Ly9jb25uZWN0LnN0cmlwZS5jb20vb2F1dGgvYXV0aG9yaXplP3Jlc3BvbnNlX3R5cGU9Y29kZSZjbGllbnRfaWQ9JHtjbGllbnRJRH0mc2NvcGU9cmVhZF93cml0ZSZyZWRpcmVjdF91cmk9JHtyZXR1cm5Vcmx9JnN0YXRlPSR7dGhpcy5vcmcuaWR9YCxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCAyMDApOyAvLyB3YWl0IHVudGlsIHRoZSBlbGVtZW50IGlzIHJlbmRlcmVkXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEVkaXQgKi9cclxuICAgIG9uRWRpdCgpIHtcclxuICAgICAgICB0aGlzLmVkaXRGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgICAgICAgIGlkOiB0aGlzLm9yZy5pZCxcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5vcmcubmFtZSxcclxuICAgICAgICAgICAgc2lyZXQ6IHRoaXMub3JnLnNpcmV0LFxyXG4gICAgICAgICAgICBjaXR5OiB0aGlzLm9yZy5jaXR5LFxyXG4gICAgICAgICAgICBhZGRyZXNzOiB0aGlzLm9yZy5hZGRyZXNzLFxyXG4gICAgICAgICAgICBjb250YWN0RGV0YWlsczogdGhpcy5vcmcuY29udGFjdERldGFpbHMsXHJcbiAgICAgICAgICAgIHBvc3RhbDogdGhpcy5vcmcucG9zdGFsLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBuYW1lKCk6IEFic3RyYWN0Q29udHJvbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdEZvcm0uZ2V0KFwibmFtZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblN1Ym1pdCgpIHtcclxuICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmVkaXRGb3JtLnZhbHVlO1xyXG4gICAgICAgIHJlbW92ZU51bGxLZXlzRnJvbU9iamVjdChmb3JtVmFsdWUpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRPcmcgPVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vcmdhbmlzYXRpb25TZXJ2aWNlLnVwZGF0ZU9yZ2FuaXNhdGlvbihmb3JtVmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLm9yZyA9IHVwZGF0ZWRPcmc7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbGVUb1VwbG9hZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3JnLmxvZ29VcmwpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUgdGhlIHByZXZpb3VzXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsZXRlRnJvbVMzKHRoaXMub3JnLmxvZ29VcmwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdXBsb2FkRmlsZVRvUzMoXCJsb2dvcy9cIiwgdGhpcy5maWxlVG9VcGxvYWQsIHRoaXMub3JnLmlkKS50aGVuKFxyXG4gICAgICAgICAgICAgICAgICAgIGFzeW5jICh1cmwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vcmdhbmlzYXRpb25TZXJ2aWNlLnVwZGF0ZU9yZ2FuaXNhdGlvbih7IGlkOiB0aGlzLm9yZy5pZCwgbG9nb1VybDogdXJsIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihKU09OLnN0cmluZ2lmeShlcnJvcikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVkaXRGb3JtID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBvbkNhbmNlbCgpIHtcclxuICAgICAgICB0aGlzLmVkaXRGb3JtID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVGaWxlSW5wdXQoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5maWxlVG9VcGxvYWQgPSB0YXJnZXQuZmlsZXMuaXRlbSgwKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkRlbGV0ZSgpIHtcclxuICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChcImNvbmZpcm0uZGVsZXRlT3JnYW5pc2F0aW9uXCIpO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgd2luZG93LmNvbmZpcm0obWVzc2FnZSkgJiYgdGhpcy5vcmcuaWQgIT09IFwiNmUyODIwMWYtNDY3OS00YzI5LTlkMmQtOGEzMjVmNTdjZWU5XCJcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllc1RvRGVsZXRlID1cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvcGVydHlTZXJ2aWNlLmdldFByb3BlcnRpZXNGb3JPcmdhbmlzYXRpb24odGhpcy5vcmcuaWQpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm9yZ2FuaXNhdGlvblNlcnZpY2Uuc29mdERldGVsZU9yZyh0aGlzLm9yZy5pZCk7XHJcbiAgICAgICAgICAgIChhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLmdldE1pc3Npb25zQnlPcmdhbmlzYXRpb24odGhpcy5vcmcuaWQpKS5tYXAoXHJcbiAgICAgICAgICAgICAgICAobSkgPT4gdGhpcy5taXNzaW9uU2VydmljZS5zb2Z0RGVsZXRlTWlzc2lvbihtLmlkKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVG9EZWxldGUubWFwKGFzeW5jIChwcm9wZXJ0eSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvcGVydHlTZXJ2aWNlLmRlbGV0ZVByb3BlcnR5KHByb3BlcnR5LmlkKTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLm9yZ0NoYW5nZWQuZW1pdCh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdj5cclxuICAgIDxoNT57eydPcmdhbmlzYXRpb24gRGV0YWlscycgfCB0cmFuc2xhdGUgfX08L2g1PlxyXG4gICAgPGRpdiAqbmdJZj1cIiFlZGl0Rm9ybVwiPlxyXG4gICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydOYW1lJyB8IHRyYW5zbGF0ZX19OiB7eyBvcmcubmFtZSB9fTwvbGk+XHJcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0xvZ28nIHwgdHJhbnNsYXRlIH19OiB7eyBvcmcubG9nb1VybCA/IFwiXCIgOiBcIk5vIGxvZ28gdXBsb2FkZWRcIn19IFxyXG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImxvZ28taW1nXCIgKm5nSWY9XCJzaWduZWRMb2dvXCIgW3NyY109XCJzaWduZWRMb2dvXCI+XHJcbiAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J1NJUkVUJyB8IHRyYW5zbGF0ZSB9fToge3tcclxuICAgICAgICAgICAgICAgIG9yZy5zaXJldCA/IG9yZy5zaXJldCA6IChcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZSl9fTwvbGk+XHJcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0FkZHJlc3MnIHwgdHJhbnNsYXRlIH19OiB7e1xyXG4gICAgICAgICAgICAgICAgb3JnLmFkZHJlc3MgPyBvcmcuYWRkcmVzcyA6IChcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZSl9fTwvbGk+XHJcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0NpdHknIHwgdHJhbnNsYXRlIH19OiB7e29yZy5jaXR5IH19PC9saT5cclxuICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snQ29udGFjdCBpbmZvcm1hdGlvbicgfCB0cmFuc2xhdGV9fTpcclxuICAgICAgICAgICAgICAgIHt7IG9yZy5jb250YWN0RGV0YWlscyA/IG9yZy5jb250YWN0RGV0YWlscyA6IChcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZSl9fTwvbGk+XHJcbiAgICAgICAgICAgIDwhLS0gPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCJpc1NQXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1sLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydBY3RpdmUgdG9rZW4nIHwgdHJhbnNsYXRlIH19OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBvcmcuc2hhcmVUb2tlbiA/IHByZXR0aWZ5VG9rZW4oKSA6ICgnTm8nIHwgdHJhbnNsYXRlKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJvcmcuc2hhcmVUb2tlbiAmJiAhdG9rZW5FeHBpcmVkXCIgW2Nka0NvcHlUb0NsaXBib2FyZF09XCJvcmcuc2hhcmVUb2tlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jdXJzb3JdPVwiJ3BvaW50ZXInXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogNXB4OyBtYXgtd2lkdGg6IDIwcHg7XCIgbmdiVG9vbHRpcD1cIkNvcGllZCFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2Vycz1cImNsaWNrOmJsdXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uaWZ5XCIgZGF0YS1pY29uPVwibWRpOmNvbnRlbnQtY29weVwiIGRhdGEtaW5saW5lPVwiZmFsc2VcIiBkYXRhLXdpZHRoPVwiMjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1oZWlnaHQ9XCIyMFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2xpPiAtLT5cclxuICAgICAgICA8L3VsPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG10LTIgbWwtMyBhY3Rpb24tYnV0dG9uXCIgKm5nSWY9XCJpc1NQIHx8IG15T3JnXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkVkaXQoKVwiPiB7eydFZGl0JyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbXQtMiBtbC0zIGFjdGlvbi1idXR0b25cIiAqbmdJZj1cImlzU1BcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlKClcIj4ge3snRGVsZXRlJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtdC0yIG1sLTMgYWN0aW9uLWJ1dHRvblwiICpuZ0lmPVwiaXNTUFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Ub2tlbigpXCI+e3snR2VuZXJhdGUgdG9rZW4nIHwgdHJhbnNsYXRlfX08L2J1dHRvbj4gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tRWRpdCBGb3JtLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiZWRpdEZvcm1cIj5cclxuICAgICAgICA8Zm9ybSAobmdTdWJtaXQpPVwib25TdWJtaXQoKVwiIFtmb3JtR3JvdXBdPVwiZWRpdEZvcm1cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J05hbWUnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFtjbGFzcy5pcy1pbnZhbGlkXT1cIm5hbWUuaW52YWxpZCAmJiBuYW1lLnRvdWNoZWRcIiByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3snQSBuYW1lIGlzIHJlcXVpcmVkJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydDb250YWN0IGluZm9ybWF0aW9uJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiY29udGFjdERldGFpbHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7J05hbWUsIHBob25lLCBlbWFpbCcgfCB0cmFuc2xhdGV9fVwiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J0FkZHJlc3MnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJhZGRyZXNzXCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snQ2l0eScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImNpdHlcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydQb3N0YWwgY29kZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInBvc3RhbFwiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J1NJUkVUJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwic2lyZXRcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydMb2dvJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImZpbGVcIiBjbGFzcz1cImJ0biBidG4tbGFiZWwtZmlsZSByb3VuZGVkLXBpbGxcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiZmlsZVwiIChjaGFuZ2UpPVwiaGFuZGxlRmlsZUlucHV0KCRldmVudClcIiAvPlxyXG4gICAgICAgICAgICAgICAge3snQWRkIGxvZ28gaW1hZ2UnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJmaWxlVG9VcGxvYWROYW1lXCIgKm5nSWY9XCJmaWxlVG9VcGxvYWRcIj57e2ZpbGVUb1VwbG9hZC5uYW1lfX08L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIGFjdGlvbi1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJlZGl0Rm9ybS5pbnZhbGlkXCI+e3snU2F2ZScgfFxyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25DYW5jZWwoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgYWN0aW9uLWJ1dHRvblwiPnt7J0NhbmNlbCcgfFxyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZm9ybT5cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLUxvYWRpbmctLT5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiICpuZ0lmPVwibG9hZGluZ1wiPlxyXG4gICAgICAgIDxsaWItbG9hZGVyPjwvbGliLWxvYWRlcj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS1TdHJpcGUtLT5cclxuICAgIDwhLS0gPGhyPlxyXG4gICAgPGg1Pnt7J3N0cmlwZS5hY2NvdW50JyB8IHRyYW5zbGF0ZSB9fTwvaDU+XHJcbiAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIj5cclxuICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIiAqbmdJZj1cIihpc1NQIHx8IG15T3JnKSAmJiBvcmcuY29ubmVjdGVkQWNjb3VudFN0cmlwZUlEXCI+XHJcbiAgICAgICAgICAgIHt7J3N0cmlwZS5jb25uZWN0ZWQnIHwgdHJhbnNsYXRlIH19OiB7e29yZy5jb25uZWN0ZWRBY2NvdW50U3RyaXBlSUQuc3Vic3RyaW5nKDAsIDE1KSB9fS4uLjwvbGk+XHJcbiAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCIoaXNTUCB8fCBteU9yZykgJiYgb3JnLnN0cmlwZU9uQm9hcmRpbmdDb21wbGV0ZWQgIT09IG51bGxcIj5cclxuICAgICAgICAgICAge3snc3RyaXBlLmNvbXBsZXRlZCcgfCB0cmFuc2xhdGUgfX06IHt7b3JnLnN0cmlwZU9uQm9hcmRpbmdDb21wbGV0ZWQgfX08L2xpPlxyXG4gICAgPC91bD4gLS0+XHJcbjwvZGl2PiJdfQ==
|