@posiwise/resource-contact-us 0.0.10 → 0.0.11
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/fesm2022/posiwise-resource-contact-us.mjs +17 -17
- package/fesm2022/posiwise-resource-contact-us.mjs.map +1 -1
- package/package.json +3 -5
- package/esm2022/index.mjs +0 -6
- package/esm2022/lib/demo-cards/demo-cards.component.mjs +0 -101
- package/esm2022/lib/demo-cards/demo-cards.module.mjs +0 -44
- package/esm2022/lib/resource-contact-us/resource-contact-us.component.mjs +0 -562
- package/esm2022/lib/resource-contact-us/resource-contact-us.module.mjs +0 -94
- package/esm2022/lib/shared/resource-modal.interface.mjs +0 -2
- package/esm2022/posiwise-resource-contact-us.mjs +0 -5
|
@@ -1,562 +0,0 @@
|
|
|
1
|
-
import { moveItemInArray } from '@angular/cdk/drag-drop';
|
|
2
|
-
import { DOCUMENT } from '@angular/common';
|
|
3
|
-
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Inject, Injector, Input, TemplateRef, ViewChild } from '@angular/core';
|
|
4
|
-
import { UntypedFormBuilder, Validators } from '@angular/forms';
|
|
5
|
-
import { DomSanitizer } from '@angular/platform-browser';
|
|
6
|
-
import { AdminService } from '@posiwise/admin-module-utils';
|
|
7
|
-
import { AppBaseComponent } from '@posiwise/app-base-component';
|
|
8
|
-
import { AbTestService, AuthService, ValidationService } from '@posiwise/common-services';
|
|
9
|
-
import { HelperService } from '@posiwise/helper-service';
|
|
10
|
-
import { CrmService } from '@posiwise/smart-crm-shared';
|
|
11
|
-
import { CustomUploaderComponent } from '@posiwise/utils';
|
|
12
|
-
import { StatusCodes } from 'http-status-codes';
|
|
13
|
-
import Swal from 'sweetalert2';
|
|
14
|
-
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
|
|
15
|
-
import * as i0 from "@angular/core";
|
|
16
|
-
import * as i1 from "@angular/forms";
|
|
17
|
-
import * as i2 from "@posiwise/common-services";
|
|
18
|
-
import * as i3 from "@posiwise/smart-crm-shared";
|
|
19
|
-
import * as i4 from "@angular/platform-browser";
|
|
20
|
-
import * as i5 from "@posiwise/admin-module-utils";
|
|
21
|
-
import * as i6 from "@ng-bootstrap/ng-bootstrap";
|
|
22
|
-
import * as i7 from "@angular/common";
|
|
23
|
-
import * as i8 from "@posiwise/utils";
|
|
24
|
-
import * as i9 from "primeng/dropdown";
|
|
25
|
-
import * as i10 from "ngx-captcha";
|
|
26
|
-
import * as i11 from "@angular/router";
|
|
27
|
-
import * as i12 from "@posiwise/directives";
|
|
28
|
-
import * as i13 from "@jsverse/transloco";
|
|
29
|
-
export class Trial4ContactUsComponent extends AppBaseComponent {
|
|
30
|
-
// Footer is always visible to prevent layout shift
|
|
31
|
-
// Removed IntersectionObserver lazy loading
|
|
32
|
-
openQuestionsEditModal() {
|
|
33
|
-
this.editingQuestions = JSON.parse(JSON.stringify(this.editingQuestions ?? []));
|
|
34
|
-
this.modalService.open(this.questionsEditModal, { centered: true, size: 'lg' });
|
|
35
|
-
}
|
|
36
|
-
constructor(fb, authService, crmService, sanitizer, adminService, injector, abTestService, modalService, cdr, document) {
|
|
37
|
-
super(injector);
|
|
38
|
-
this.fb = fb;
|
|
39
|
-
this.authService = authService;
|
|
40
|
-
this.crmService = crmService;
|
|
41
|
-
this.sanitizer = sanitizer;
|
|
42
|
-
this.adminService = adminService;
|
|
43
|
-
this.abTestService = abTestService;
|
|
44
|
-
this.modalService = modalService;
|
|
45
|
-
this.cdr = cdr;
|
|
46
|
-
this.document = document;
|
|
47
|
-
this.editingQuestions = [];
|
|
48
|
-
this.recaptcha = null;
|
|
49
|
-
this.subscriptionId = this.appConfig.crm.subscription_id;
|
|
50
|
-
this.sourceId = this.appConfig.crm.source_id;
|
|
51
|
-
this.masterSubscriptionId = this.appConfig.master_subscription.subscription_id;
|
|
52
|
-
this.canEditResourcesValue = false;
|
|
53
|
-
this.logo = this.appConfig?.company?.logos?.main_contrast?.url;
|
|
54
|
-
this.trialBgImage2 = this.appConfig?.signup_config.trial?.image_bg2?.url;
|
|
55
|
-
this.tosId = this.appConfig?.main_tos_id;
|
|
56
|
-
this.description = this.appConfig.company.description;
|
|
57
|
-
this.email = this.appConfig.company.email;
|
|
58
|
-
this.companyName = this.appConfig.company.name;
|
|
59
|
-
this.street = this.appConfig.company.street;
|
|
60
|
-
this.questions = this.appConfig?.pages_config?.contact_us?.questions;
|
|
61
|
-
this.hubspot = this.appConfig?.pages_config?.contact_us?.hubspot;
|
|
62
|
-
this.footerLinks = this.appConfig?.pages_config?.footer_links?.items;
|
|
63
|
-
this.footerLinksData = this.appConfig?.pages_config?.footer_links;
|
|
64
|
-
this.youtubeUrl = this.appConfig.social?.youtube_url;
|
|
65
|
-
this.linkedInUrl = this.appConfig.social?.linkedin_url;
|
|
66
|
-
this.domainId = this.appConfig.domain_id;
|
|
67
|
-
this.editingEmail = this.email;
|
|
68
|
-
this.isEditingEmail = false;
|
|
69
|
-
this.submitted = false;
|
|
70
|
-
this.isCaptchaVerified = false;
|
|
71
|
-
this.isEmailValid = true;
|
|
72
|
-
this.isEditingStreet = false;
|
|
73
|
-
this.editingFooterLinks = {
|
|
74
|
-
items: []
|
|
75
|
-
};
|
|
76
|
-
this.captchaKeyV2 = this.appConfig.integrations.captcha_key_V2;
|
|
77
|
-
this.contactUsForm();
|
|
78
|
-
}
|
|
79
|
-
ngOnInit() {
|
|
80
|
-
// Defer Hubspot ready state to avoid blocking initial render
|
|
81
|
-
// Use requestIdleCallback if available, otherwise setTimeout with longer delay
|
|
82
|
-
if ('requestIdleCallback' in window) {
|
|
83
|
-
requestIdleCallback(() => {
|
|
84
|
-
setTimeout(() => (this.isHubspotReady = true), 0);
|
|
85
|
-
this.cdr.markForCheck();
|
|
86
|
-
}, { timeout: 2000 });
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
setTimeout(() => {
|
|
90
|
-
this.isHubspotReady = true;
|
|
91
|
-
this.cdr.markForCheck();
|
|
92
|
-
}, 2000);
|
|
93
|
-
}
|
|
94
|
-
if (this.userLoggedIn) {
|
|
95
|
-
this.localStorage.getItem$('product').subscribe(res => {
|
|
96
|
-
const data = res ? JSON.parse(res) : null;
|
|
97
|
-
this.id = data?.subscriptionId;
|
|
98
|
-
this.cdr.markForCheck();
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
this.previewData = {
|
|
102
|
-
url: this.logo,
|
|
103
|
-
name: 'logo_main_contrast.png'
|
|
104
|
-
};
|
|
105
|
-
this.editingStreet = this.street;
|
|
106
|
-
if (Array.isArray(this.appConfig.pages_config?.ab_tests)) {
|
|
107
|
-
this.abTests = this.appConfig.pages_config.ab_tests.find(test => test.description === 'contact-us');
|
|
108
|
-
this.microserviceName = this.abTests?.microservice_name;
|
|
109
|
-
this.experimentName = this.abTests?.experiment_name;
|
|
110
|
-
this.shardName = this.abTests?.db_shard;
|
|
111
|
-
}
|
|
112
|
-
const footerItem = this.getFooterHubspotForm();
|
|
113
|
-
if (footerItem?.div) {
|
|
114
|
-
// NOSONAR: Trusted HTML content is handled safely here
|
|
115
|
-
this.hubspotHtml = this.sanitizer.bypassSecurityTrustHtml(footerItem.div); // NOSONAR
|
|
116
|
-
}
|
|
117
|
-
this.editingQuestions = this.questions;
|
|
118
|
-
this.question = this.questions?.[0]?.question;
|
|
119
|
-
this.psaOptions = [
|
|
120
|
-
{ label: 'Select PSA', value: '' },
|
|
121
|
-
...(this.questions?.[0]?.options ?? [])
|
|
122
|
-
.filter(q => q.option?.trim())
|
|
123
|
-
.map(q => ({
|
|
124
|
-
label: q.option,
|
|
125
|
-
value: q.option
|
|
126
|
-
}))
|
|
127
|
-
];
|
|
128
|
-
}
|
|
129
|
-
ngOnChanges(changes) {
|
|
130
|
-
if (changes['user'] || changes['userLoggedIn']) {
|
|
131
|
-
if (this.userLoggedIn && this.user) {
|
|
132
|
-
this.updateCanEditResourcesValue();
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
openLogoEditModal() {
|
|
137
|
-
this.modalService.open(this.logoModal, {
|
|
138
|
-
centered: true,
|
|
139
|
-
size: 'md'
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
onSaveFile(event) {
|
|
143
|
-
const formData = new FormData();
|
|
144
|
-
const data = { subscription_id: this.subscriptionId };
|
|
145
|
-
if (event.file instanceof File) {
|
|
146
|
-
data[event.name] = event.file;
|
|
147
|
-
}
|
|
148
|
-
else if (event.file === null) {
|
|
149
|
-
data[`remove_${event.name}`] = true;
|
|
150
|
-
}
|
|
151
|
-
for (const key in data) {
|
|
152
|
-
formData.append(key, data[key]);
|
|
153
|
-
}
|
|
154
|
-
this.adminService.updateDomainConfig(this.domainId, formData).subscribe(() => {
|
|
155
|
-
if (event.file) {
|
|
156
|
-
this.logo = URL.createObjectURL(event.file);
|
|
157
|
-
this.modalService.dismissAll();
|
|
158
|
-
}
|
|
159
|
-
this.toast.success(event.file ? 'Logo updated' : 'Logo removed');
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
saveQuestions(modal) {
|
|
163
|
-
const updateData = {
|
|
164
|
-
contact_us: {
|
|
165
|
-
...this.appConfig.pages_config?.contact_us,
|
|
166
|
-
questions: this.editingQuestions
|
|
167
|
-
},
|
|
168
|
-
subscription_id: this.id
|
|
169
|
-
};
|
|
170
|
-
this.adminService.updateDomainConfig(this.domainId, updateData).subscribe(() => {
|
|
171
|
-
this.questions = this.editingQuestions;
|
|
172
|
-
this.toast.success('Questions updated');
|
|
173
|
-
this.question = this.editingQuestions?.[0]?.question;
|
|
174
|
-
if (this.editingQuestions?.[0]?.options?.length > 0) {
|
|
175
|
-
this.psaOptions = [
|
|
176
|
-
{ label: 'Select PSA', value: '' },
|
|
177
|
-
...(this.questions?.[0]?.options ?? [])
|
|
178
|
-
.filter(q => q.option?.trim())
|
|
179
|
-
.map(q => ({
|
|
180
|
-
label: q.option,
|
|
181
|
-
value: q.option
|
|
182
|
-
}))
|
|
183
|
-
];
|
|
184
|
-
}
|
|
185
|
-
else {
|
|
186
|
-
this.psaOptions = [];
|
|
187
|
-
}
|
|
188
|
-
modal.close();
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
addNewQuestion() {
|
|
192
|
-
this.editingQuestions.push({ question: '', options: [] });
|
|
193
|
-
}
|
|
194
|
-
addQuestionOption(qIndex) {
|
|
195
|
-
this.editingQuestions[qIndex].options.push({ option: '' });
|
|
196
|
-
}
|
|
197
|
-
removeQuestionOption(qIndex, optIndex) {
|
|
198
|
-
this.editingQuestions[qIndex].options.splice(optIndex, 1);
|
|
199
|
-
}
|
|
200
|
-
dropQuestions(event) {
|
|
201
|
-
moveItemInArray(this.editingQuestions, event.previousIndex, event.currentIndex);
|
|
202
|
-
}
|
|
203
|
-
dropQuestionOptions(qIndex, event) {
|
|
204
|
-
moveItemInArray(this.editingQuestions[qIndex].options, event.previousIndex, event.currentIndex);
|
|
205
|
-
}
|
|
206
|
-
openSocialEditModal() {
|
|
207
|
-
this.editingYoutubeUrl = this.youtubeUrl;
|
|
208
|
-
this.editingLinkedInUrl = this.linkedInUrl;
|
|
209
|
-
this.editingCompanyName = this.companyName;
|
|
210
|
-
this.modalService.open(this.socialEditModal, { centered: true, size: 'lg' });
|
|
211
|
-
}
|
|
212
|
-
saveSocialLinks(modal) {
|
|
213
|
-
const updateData = {
|
|
214
|
-
youtube_url: this.editingYoutubeUrl,
|
|
215
|
-
linkedin_url: this.editingLinkedInUrl,
|
|
216
|
-
company_name: this.editingCompanyName,
|
|
217
|
-
subscription_id: this.id
|
|
218
|
-
};
|
|
219
|
-
this.adminService.updateDomainConfig(this.domainId, updateData).subscribe(() => {
|
|
220
|
-
this.youtubeUrl = this.editingYoutubeUrl;
|
|
221
|
-
this.linkedInUrl = this.editingLinkedInUrl;
|
|
222
|
-
this.companyName = this.editingCompanyName;
|
|
223
|
-
this.toast.success('Social links and company name updated');
|
|
224
|
-
modal.close();
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
hasValidOptions() {
|
|
228
|
-
return this.questions?.[0]?.options?.some(opt => opt.option?.trim());
|
|
229
|
-
}
|
|
230
|
-
ngAfterViewInit() {
|
|
231
|
-
// Defer iframe watching to avoid blocking initial render
|
|
232
|
-
// Use requestIdleCallback or setTimeout to defer to next event loop
|
|
233
|
-
if ('requestIdleCallback' in window) {
|
|
234
|
-
requestIdleCallback(() => {
|
|
235
|
-
this.watchIframeHeightChange();
|
|
236
|
-
}, { timeout: 1000 });
|
|
237
|
-
}
|
|
238
|
-
else {
|
|
239
|
-
setTimeout(() => {
|
|
240
|
-
this.watchIframeHeightChange();
|
|
241
|
-
}, 0);
|
|
242
|
-
}
|
|
243
|
-
// Removed IntersectionObserver to prevent layout shift
|
|
244
|
-
// Footer is now visible immediately, space is reserved via CSS min-height
|
|
245
|
-
}
|
|
246
|
-
openEditFooterLinksModal(content) {
|
|
247
|
-
this.footerLinksData = this.footerLinksData ?? {};
|
|
248
|
-
this.footerLinksData.items = this.footerLinksData.items ?? [];
|
|
249
|
-
this.editingFooterLinks = JSON.parse(JSON.stringify(this.footerLinksData));
|
|
250
|
-
this.modalService.open(content, {
|
|
251
|
-
size: 'lg',
|
|
252
|
-
centered: true,
|
|
253
|
-
windowClass: 'modal-holder'
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
watchIframeHeightChange() {
|
|
257
|
-
const iframe = this.document.querySelector('.hubspot-container');
|
|
258
|
-
if (!iframe)
|
|
259
|
-
return;
|
|
260
|
-
// Use requestAnimationFrame for better performance instead of setInterval
|
|
261
|
-
// This reduces blocking time and is more efficient
|
|
262
|
-
let lastHeight = 0;
|
|
263
|
-
let checkCount = 0;
|
|
264
|
-
const maxChecks = 20; // Stop after ~10 seconds (20 * 500ms)
|
|
265
|
-
const checkHeight = () => {
|
|
266
|
-
checkCount++;
|
|
267
|
-
const newHeight = iframe['offsetHeight'];
|
|
268
|
-
if (newHeight === 250 && newHeight !== lastHeight) {
|
|
269
|
-
this.callAbTestFinish();
|
|
270
|
-
return; // Stop checking once target height is reached
|
|
271
|
-
}
|
|
272
|
-
lastHeight = newHeight;
|
|
273
|
-
// Check less frequently (every ~500ms equivalent) using requestAnimationFrame
|
|
274
|
-
// Only continue if height hasn't reached target and we haven't exceeded max checks
|
|
275
|
-
if (newHeight !== 250 && checkCount < maxChecks) {
|
|
276
|
-
this.heightCheckTimeout = setTimeout(() => {
|
|
277
|
-
requestAnimationFrame(checkHeight);
|
|
278
|
-
}, 500);
|
|
279
|
-
}
|
|
280
|
-
};
|
|
281
|
-
// Start checking after a short delay to avoid blocking initial render
|
|
282
|
-
this.heightCheckTimeout = setTimeout(() => {
|
|
283
|
-
requestAnimationFrame(checkHeight);
|
|
284
|
-
}, 100);
|
|
285
|
-
}
|
|
286
|
-
ngOnDestroy() {
|
|
287
|
-
// Clean up timeouts to prevent memory leaks
|
|
288
|
-
if (this.heightCheckTimeout) {
|
|
289
|
-
clearTimeout(this.heightCheckTimeout);
|
|
290
|
-
}
|
|
291
|
-
if (this.hubspotReadyTimeout) {
|
|
292
|
-
clearTimeout(this.hubspotReadyTimeout);
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
// New method to handle Hubspot content loading
|
|
296
|
-
onHubspotLoad(event) {
|
|
297
|
-
const container = event.target;
|
|
298
|
-
container.classList.add('content-loaded');
|
|
299
|
-
// Defer layout recalculation to avoid blocking
|
|
300
|
-
if ('requestIdleCallback' in window) {
|
|
301
|
-
requestIdleCallback(() => {
|
|
302
|
-
window.dispatchEvent(new Event('resize'));
|
|
303
|
-
});
|
|
304
|
-
}
|
|
305
|
-
else {
|
|
306
|
-
setTimeout(() => {
|
|
307
|
-
window.dispatchEvent(new Event('resize'));
|
|
308
|
-
}, 100);
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
callAbTestFinish() {
|
|
312
|
-
if (this.experimentName && this.microserviceName) {
|
|
313
|
-
this.abTestService
|
|
314
|
-
.finishABExperiment(this.experimentName, this.microserviceName)
|
|
315
|
-
.subscribe(() => {
|
|
316
|
-
this.modalService.open(this.content, {
|
|
317
|
-
centered: true,
|
|
318
|
-
windowClass: 'modal-holder'
|
|
319
|
-
});
|
|
320
|
-
});
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
contactUsForm() {
|
|
324
|
-
this.form = this.fb.group({
|
|
325
|
-
first_name: ['', Validators.required],
|
|
326
|
-
last_name: [''],
|
|
327
|
-
company: [''],
|
|
328
|
-
psa: [''],
|
|
329
|
-
enquiry: ['', Validators.required],
|
|
330
|
-
email: ['', Validators.required]
|
|
331
|
-
});
|
|
332
|
-
}
|
|
333
|
-
onSubmit() {
|
|
334
|
-
this.submitted = true;
|
|
335
|
-
if (this.form.valid) {
|
|
336
|
-
this.isCaptchaVerified = true;
|
|
337
|
-
this.submitted = false;
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
handleSuccess(token) {
|
|
341
|
-
if (token) {
|
|
342
|
-
this.authService.validateReCaptcha(token).subscribe((isSuccess) => {
|
|
343
|
-
if (isSuccess && this.form.valid) {
|
|
344
|
-
const data = { ...this.form.getRawValue() };
|
|
345
|
-
const formattedEnquiry = `${data.enquiry}; Question: ${this.question}; Answer: ${data.psa}`;
|
|
346
|
-
const postData = {
|
|
347
|
-
first_name: `${data.first_name}`,
|
|
348
|
-
last_name: `${data.first_name}`,
|
|
349
|
-
company: `${data.first_name}`,
|
|
350
|
-
email: `${data.email}`,
|
|
351
|
-
enquiry: this.psaOptions.length ? formattedEnquiry : `${data.enquiry}`,
|
|
352
|
-
psa: data.psa,
|
|
353
|
-
subscription_id: this.subscriptionId,
|
|
354
|
-
crm_source_id: this.sourceId,
|
|
355
|
-
master_subscription_id: this.masterSubscriptionId,
|
|
356
|
-
notify_user: false,
|
|
357
|
-
is_manual: false
|
|
358
|
-
};
|
|
359
|
-
this.crmService.postCrmLead(this.subscriptionId, postData).subscribe(resp => {
|
|
360
|
-
// example of snippet to close the experiment and track in GA
|
|
361
|
-
if (resp?.status === StatusCodes.OK) {
|
|
362
|
-
this.googleAnalyticsService.sendEvent('new-lead-registration', // category, eg: videos
|
|
363
|
-
'subscribe-success', // action, eg: Play
|
|
364
|
-
'coming-soon-three', // label, eg: Chappy
|
|
365
|
-
1 // value, eg: 10
|
|
366
|
-
);
|
|
367
|
-
if (this.experimentName && this.microserviceName) {
|
|
368
|
-
this.abTestService
|
|
369
|
-
.finishABExperiment(this.experimentName, this.microserviceName)
|
|
370
|
-
.subscribe(() => {
|
|
371
|
-
this.modalService.open(this.content, {
|
|
372
|
-
centered: true,
|
|
373
|
-
windowClass: 'modal-holder'
|
|
374
|
-
});
|
|
375
|
-
});
|
|
376
|
-
}
|
|
377
|
-
else {
|
|
378
|
-
Swal.fire(resp.message);
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
this.form.reset();
|
|
382
|
-
this.isCaptchaVerified = false;
|
|
383
|
-
});
|
|
384
|
-
}
|
|
385
|
-
});
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
scrollToTop() {
|
|
389
|
-
this.document.documentElement.scrollTop = 0;
|
|
390
|
-
}
|
|
391
|
-
getFooterHubspotForm() {
|
|
392
|
-
if (!this.hubspot?.length) {
|
|
393
|
-
return null;
|
|
394
|
-
}
|
|
395
|
-
return this.hubspot.find(item => item.position === 'footer') ?? null;
|
|
396
|
-
}
|
|
397
|
-
navigateToBookMeeting() {
|
|
398
|
-
const bookDemoUrl = this.appConfig?.signup_config?.trial?.book_demo_url ??
|
|
399
|
-
'https://calendly.com/cloudolive';
|
|
400
|
-
window.open(bookDemoUrl, '_blank', 'noreferrer noopener');
|
|
401
|
-
}
|
|
402
|
-
validateEmail() {
|
|
403
|
-
const email = this.form.get('email').value;
|
|
404
|
-
if (email) {
|
|
405
|
-
this.isEmailValid = ValidationService.email(email);
|
|
406
|
-
}
|
|
407
|
-
else {
|
|
408
|
-
this.isEmailValid = true;
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
addFooterLink() {
|
|
412
|
-
this.editingFooterLinks.items.push({
|
|
413
|
-
title: '',
|
|
414
|
-
path: '',
|
|
415
|
-
subtitles: []
|
|
416
|
-
});
|
|
417
|
-
}
|
|
418
|
-
removeFooterLink(index) {
|
|
419
|
-
this.editingFooterLinks.items.splice(index, 1);
|
|
420
|
-
}
|
|
421
|
-
addSubtitle(footerIndex) {
|
|
422
|
-
this.editingFooterLinks.items[footerIndex].subtitles.push({
|
|
423
|
-
title: '',
|
|
424
|
-
path: ''
|
|
425
|
-
});
|
|
426
|
-
}
|
|
427
|
-
removeSubtitle(footerIndex, subtitleIndex) {
|
|
428
|
-
this.editingFooterLinks.items[footerIndex].subtitles.splice(subtitleIndex, 1);
|
|
429
|
-
}
|
|
430
|
-
dropFooterLinks(event) {
|
|
431
|
-
moveItemInArray(this.editingFooterLinks.items, event.previousIndex, event.currentIndex);
|
|
432
|
-
}
|
|
433
|
-
dropSubtitles(footerIndex, event) {
|
|
434
|
-
moveItemInArray(this.editingFooterLinks.items[footerIndex].subtitles, event.previousIndex, event.currentIndex);
|
|
435
|
-
}
|
|
436
|
-
saveFooterLinks(modal) {
|
|
437
|
-
const updatedConfig = {
|
|
438
|
-
footer_links: this.editingFooterLinks,
|
|
439
|
-
subscription_id: this.id
|
|
440
|
-
};
|
|
441
|
-
this.adminService
|
|
442
|
-
.updateDomainConfig(this.appConfig?.domain_id, updatedConfig)
|
|
443
|
-
.subscribe(() => {
|
|
444
|
-
this.toast.success('Footer links updated');
|
|
445
|
-
this.footerLinks = [...this.editingFooterLinks.items];
|
|
446
|
-
this.footerLinksData = { ...this.editingFooterLinks };
|
|
447
|
-
modal.close();
|
|
448
|
-
});
|
|
449
|
-
}
|
|
450
|
-
saveEmail() {
|
|
451
|
-
this.email = this.editingEmail;
|
|
452
|
-
this.adminService
|
|
453
|
-
.updateDomainConfig(this.appConfig?.domain_id, {
|
|
454
|
-
company_email: this.editingEmail,
|
|
455
|
-
subscription_id: this.id
|
|
456
|
-
})
|
|
457
|
-
.subscribe(() => {
|
|
458
|
-
this.toast.success('Email updated');
|
|
459
|
-
this.isEditingEmail = false;
|
|
460
|
-
});
|
|
461
|
-
}
|
|
462
|
-
saveStreet() {
|
|
463
|
-
this.adminService
|
|
464
|
-
.updateDomainConfig(this.appConfig?.domain_id, {
|
|
465
|
-
company_address: this.editingStreet,
|
|
466
|
-
subscription_id: this.id
|
|
467
|
-
})
|
|
468
|
-
.subscribe(() => {
|
|
469
|
-
this.toast.success('Street updated');
|
|
470
|
-
this.street = this.editingStreet;
|
|
471
|
-
this.isEditingStreet = false;
|
|
472
|
-
});
|
|
473
|
-
}
|
|
474
|
-
cancelStreet() {
|
|
475
|
-
this.editingStreet = this.street;
|
|
476
|
-
this.isEditingStreet = false;
|
|
477
|
-
}
|
|
478
|
-
openHubspotEditModal(footerItem) {
|
|
479
|
-
this.editingHubspotHtml = footerItem.div;
|
|
480
|
-
this.editingHubspotId = footerItem.id;
|
|
481
|
-
this.modalService.open(this.hubspotEditModal, { centered: true, size: 'lg' });
|
|
482
|
-
}
|
|
483
|
-
saveHubspotHtml(modal) {
|
|
484
|
-
const updatedConfig = {
|
|
485
|
-
contact_us: {
|
|
486
|
-
...this.appConfig?.pages_config?.contact_us,
|
|
487
|
-
hubspot: [
|
|
488
|
-
{
|
|
489
|
-
id: '7423639',
|
|
490
|
-
position: 'footer',
|
|
491
|
-
div: this.editingHubspotHtml
|
|
492
|
-
}
|
|
493
|
-
]
|
|
494
|
-
},
|
|
495
|
-
subscription_id: this.id
|
|
496
|
-
};
|
|
497
|
-
this.adminService
|
|
498
|
-
.updateDomainConfig(this.appConfig?.domain_id, updatedConfig)
|
|
499
|
-
.subscribe(() => {
|
|
500
|
-
// NOSONAR: Trusted HTML content is handled safely here
|
|
501
|
-
this.hubspotHtml = this.sanitizer.bypassSecurityTrustHtml(this.editingHubspotHtml); // NOSONAR
|
|
502
|
-
this.toast.success('Hubspot Embed updated');
|
|
503
|
-
modal.close();
|
|
504
|
-
});
|
|
505
|
-
}
|
|
506
|
-
updateCanEditResourcesValue() {
|
|
507
|
-
this.canEditResourcesValue = HelperService.canEditResources(this.user, this.userLoggedIn, this.permissionService);
|
|
508
|
-
}
|
|
509
|
-
canEditResources() {
|
|
510
|
-
return this.canEditResourcesValue;
|
|
511
|
-
}
|
|
512
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: Trial4ContactUsComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i2.AuthService }, { token: i3.CrmService }, { token: i4.DomSanitizer }, { token: i5.AdminService }, { token: i0.Injector }, { token: i2.AbTestService }, { token: i6.NgbModal }, { token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
513
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: Trial4ContactUsComponent, selector: "pw-trial-4-contact-us", inputs: { subscriptionId: "subscriptionId", sourceId: "sourceId", masterSubscriptionId: "masterSubscriptionId", experimentName: "experimentName", microserviceName: "microserviceName", shardName: "shardName", user: "user", userLoggedIn: "userLoggedIn" }, viewQueries: [{ propertyName: "footerSection", first: true, predicate: ["footerSection"], descendants: true, static: true }, { propertyName: "content", first: true, predicate: ["bookMeeting"], descendants: true, static: true }, { propertyName: "editFooterLinksModal", first: true, predicate: ["editFooterLinksModal"], descendants: true }, { propertyName: "logoModal", first: true, predicate: ["logoModal"], descendants: true }, { propertyName: "logoUploader", first: true, predicate: ["logoUploader"], descendants: true }, { propertyName: "hubspotEditModal", first: true, predicate: ["hubspotEditModal"], descendants: true }, { propertyName: "socialEditModal", first: true, predicate: ["socialEditModal"], descendants: true }, { propertyName: "questionsEditModal", first: true, predicate: ["questionsEditModal"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<section #footerSection class=\"bg-black text-white py-5 footer-section\">\n <div class=\"container\">\n <div class=\"row\">\n\n <!-- LEFT COLUMN -->\n <div class=\"col-md-6 mb-4 d-flex flex-column justify-content-between\" [ngClass]=\"{ 'site-column': getFooterHubspotForm() }\">\n <div>\n <h3 class=\"mb-4 d-flex align-items-center\">\n <span class=\"me-2 text-white\">Site Map:</span>\n <i *ngIf=\"canEditResourcesValue\" class=\"fa fa-edit in-page-edit-icon cursor-pointer text-white ms-3\" (click)=\"openEditFooterLinksModal(editFooterLinksModal)\" (keydown.enter)=\"openEditFooterLinksModal(editFooterLinksModal)\" (keydown.space)=\"openEditFooterLinksModal(editFooterLinksModal)\" ngbTooltip=\"Edit Footer Links\"></i>\n </h3>\n <ul class=\"mt-4\">\n <li routerLink=\"/\"\n class=\"cursor-pointer user-info-label link-label\"> Home </li>\n <li *ngFor=\"let link of footerLinks\" [routerLink]=\"link?.path\"\n class=\"cursor-pointer user-info-label link-label mt-4\"><span *ngIf=\"link?.title\">{{link?.title}}</span> </li>\n <li routerLink=\"/login\"\n class=\"cursor-pointer user-info-label mt-4 link-label\"> Log in </li>\n <li [routerLink]=\"'/privacy-and-tos/' + tosId\"\n class=\"cursor-pointer user-info-label mt-4 link-label\"> Privacy statement </li>\n </ul>\n <p class=\"address-section email-section mb-4\">\n <span class=\"user-info-label\">Email: </span>\n <ng-container *ngIf=\"!isEditingEmail; else editEmail\">\n <span class=\"user-info\">{{ email }}</span>\n <i *ngIf=\"canEditResourcesValue\" class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3\" (click)=\"isEditingEmail = true\" (keydown.enter)=\"isEditingEmail = true\" (keydown.space)=\"isEditingEmail = true\"></i>\n </ng-container>\n\n <ng-template #editEmail>\n <input\n class=\"form-control d-inline w-auto\"\n [(ngModel)]=\"editingEmail\"\n />\n <button class=\"btn btn-sm btn-primary ms-2\" (click)=\"saveEmail()\">Save</button>\n <button class=\"btn btn-sm btn-secondary ms-2\" (click)=\"isEditingEmail = false\">Cancel</button>\n </ng-template>\n </p>\n <span class=\"email-section mt-3 address-text\">\n <span class=\"user-info-label\">\n Address:\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon cursor-pointer ms-2 text-white\"\n title=\"Edit Address\"\n (click)=\"isEditingStreet = true\"\n (keydown.enter)=\"isEditingStreet = true\"\n (keydown.space)=\"isEditingStreet = true\"></i>\n </span><br/>\n\n <ng-container *ngIf=\"!isEditingStreet; else editStreetBlock\">\n <span class=\"address-text user-info\">{{ street }}</span>\n </ng-container>\n\n <ng-template #editStreetBlock>\n <div class=\"d-flex align-items-center mt-3\">\n <input class=\"form-control form-control-sm\" [(ngModel)]=\"editingStreet\" />\n <button class=\"btn btn-sm btn-primary ms-2\" (click)=\"saveStreet()\">Save</button>\n <button class=\"btn btn-sm btn-secondary ms-2\" (click)=\"cancelStreet()\">Cancel</button>\n </div>\n </ng-template>\n\n </span>\n\n </div>\n <div class=\"d-flex\">\n <img [src]=\"logo\"\n alt=\"Company logo\"\n class=\"img-fluid mt-4 logo-image cursor-pointer\"\n width=\"160\"\n height=\"35\"\n (click)=\"scrollToTop()\"\n (keydown.enter)=\"scrollToTop()\"\n (keydown.space)=\"scrollToTop()\"\n title=\"Click to go to top of page\" />\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon fa-sm ms-3 cursor-pointer text-white align-self-center mt-3\"\n (click)=\"openLogoEditModal()\"\n (keydown.enter)=\"openLogoEditModal()\"\n (keydown.space)=\"openLogoEditModal()\"\n title=\"Edit Logo\"></i>\n </div>\n </div>\n\n <!-- RIGHT COLUMN -->\n <div class=\"col-md-6\">\n <ng-container *ngIf=\"getFooterHubspotForm() as footerItem; else defaultForm\">\n <div class=\"d-flex\">\n <div\n class=\"hubspot-container w-100 content-loaded\"\n [innerHTML]=\"hubspotHtml\"\n (load)=\"onHubspotLoad($event)\">\n </div>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer\"\n (click)=\"openHubspotEditModal(footerItem)\"\n (keydown.enter)=\"openHubspotEditModal(footerItem)\"\n (keydown.space)=\"openHubspotEditModal(footerItem)\"\n title=\"Edit Hubspot Embed\"></i>\n </div>\n </ng-container>\n\n <ng-template #defaultForm>\n <div class=\"d-flex\">\n <h3 class=\"text-white mb-4\"> <span class=\"text-white\">Get in touch:</span></h3>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3 mt-2\"\n (click)=\"openQuestionsEditModal()\"\n (keydown.enter)=\"openQuestionsEditModal()\"\n (keydown.space)=\"openQuestionsEditModal()\"\n title=\"Edit Questions\"></i>\n </div>\n <div class=\"contact-form\">\n <form [formGroup]=\"form\">\n <div class=\"mb-3\">\n <div class=\"email\">\n <div class=\"form-field\">\n <label for=\"email\">Email:</label>\n <div class=\"w-100\">\n <input type=\"text\"\n class=\"mb-1\"\n id=\"email\"\n formControlName=\"email\" />\n <pw-field-error-display [displayError]=\"\n !form.get('email').valid && (form.get('email').touched || submitted)\n \"\n errorMsg=\"Email is required\">\n </pw-field-error-display>\n </div>\n </div>\n <div class=\"form-field\">\n <label for=\"first_name\">First name:</label>\n <div class=\"w-100\">\n <input input type=\"text\"\n id=\"first_name\"\n formControlName=\"first_name\" />\n <pw-field-error-display [displayError]=\"\n !form.get('first_name').valid && (form.get('first_name').touched || submitted)\n \"\n errorMsg=\"First name is required\">\n </pw-field-error-display>\n </div>\n </div>\n <div class=\"form-field\">\n <label for=\"last_name\">Last name:</label>\n <input type=\"text\"\n id=\"last_name\"\n formControlName=\"last_name\" />\n </div>\n <div class=\"form-field\">\n <label for=\"company\">Company:</label>\n <input type=\"text\"\n id=\"company\"\n formControlName=\"company\" />\n </div>\n <div class=\"form-field\" *ngIf=\"hasValidOptions()\">\n <label for=\"psa\" class=\"select-label\">{{question}}</label>\n <p-dropdown\n formControlName=\"psa\"\n [options]=\"psaOptions\"\n [placeholder]=\"'Select PSA'\"\n styleClass=\"input-select\">\n </p-dropdown>\n </div>\n <div class=\"form-field\">\n <label for=\"enquiry\" class=\"select-label\">How can we help you?</label>\n <div class=\"enquiry-field\">\n <textarea id=\"enquiry\" formControlName=\"enquiry\" class=\"\">\n </textarea>\n <pw-field-error-display [displayError]=\"\n !form.get('enquiry').valid && (form.get('enquiry').touched || submitted)\n \"\n errorMsg=\"Enquiry is required\">\n </pw-field-error-display>\n </div>\n </div>\n </div>\n </div>\n <div class=\"text-end\">\n <div class=\"captcha-wrapper-container\"\n *ngIf=\"isCaptchaVerified\">\n <ngx-recaptcha2 [ngModelOptions]=\"{ standalone: true }\"\n [siteKey]=\"captchaKeyV2\"\n size=\"normal\"\n [(ngModel)]=\"recaptcha\"\n (success)=\"handleSuccess($event)\">\n </ngx-recaptcha2>\n </div>\n <button type=\"submit\"\n (click)=\"onSubmit()\"\n *ngIf=\"!isCaptchaVerified\"\n class=\"sign-btn sign-header-btn mt-3\">\n {{ 'Button.Submit' | transloco }}\n </button>\n </div>\n\n <div class=\"d-flex align-items-center mt-4\">\n <div class=\"icons d-flex align-items-center\">\n <a [eventTracker]=\"{\n category: 'youtube',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n [href]=\"youtubeUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\">\n <img src=\"/assets/img/icons/youtube.png\"\n class=\"img-fluid youtube-icon\"\n width=\"54\"\n height=\"54\"\n alt=\"\" />\n </a>\n <a [eventTracker]=\"{\n category: 'linkedin',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n [href]=\"linkedInUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"ms-3\">\n <img src=\"/assets/img/icons/social/linkedin.svg\"\n class=\"img-fluid linkedin-icon\"\n width=\"48\"\n height=\"48\"\n alt=\"\" />\n </a>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3\"\n (click)=\"openSocialEditModal()\"\n (keydown.enter)=\"openSocialEditModal()\"\n (keydown.space)=\"openSocialEditModal()\"\n title=\"Edit Social Links & Company Name\"></i>\n </div>\n <div class=\"copyright text-white\">\n 2025 {{companyName}}.\n </div>\n </div>\n </form>\n </div>\n </ng-template>\n </div>\n </div>\n </div>\n</section>\n\n\n\n<ng-template #bookMeeting\n let-modal>\n <div class=\"modal-header\">\n <button type=\"button\"\n class=\"btn-close float-end\"\n aria-label=\"Close\"\n (click)=\"modal.dismiss()\">\n </button>\n </div>\n <div class=\"modal-body\">\n <h3 class=\"text-center modal-basic-title\">\n Thanks for getting in touch! Our team will be in contact shortly, or we\n can compare calendars now & schedule a time\n </h3>\n <button type=\"button\"\n [eventTracker]=\"{\n category: 'request-demo',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n (click)=\"navigateToBookMeeting()\"\n class=\"sign-btn sign-header-btn mx-auto d-block mb-3\">\n Let's do it\n </button>\n </div>\n</ng-template>\n\n\n<ng-template #editFooterLinksModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Footer Links</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n\n <div class=\"modal-body\">\n <h4 class=\"mb-3\">Footer Links Section</h4>\n <div cdkDropList (cdkDropListDropped)=\"dropFooterLinks($event)\">\n <div *ngFor=\"let footer of editingFooterLinks.items; let i = index\" class=\"border p-3 mb-3\" cdkDrag>\n <div class=\"row\">\n <div class=\"col-md-5 mb-2\">\n <label for=\"footerTitle{{i}}\" class=\"form-label\">Title</label>\n <input id=\"footerTitle{{i}}\" class=\"form-control\" [(ngModel)]=\"footer.title\" />\n </div>\n <div class=\"col-md-5 mb-2\">\n <label for=\"footerPath{{i}}\" class=\"form-label\">Path</label>\n <input id=\"footerPath{{i}}\" class=\"form-control\" [(ngModel)]=\"footer.path\" />\n </div>\n <div class=\"col-md-2 d-flex justify-content-between align-items-center mt-4\">\n <i class=\"fa fa-trash in-page-trash-icon text-danger cursor-pointer\" (click)=\"removeFooterLink(i)\" (keydown.enter)=\"removeFooterLink(i)\" (keydown.space)=\"removeFooterLink(i)\"></i>\n <i class=\"fa fa-bars in-page-bars-icon cursor-move\" cdkDragHandle></i>\n </div>\n </div>\n\n <!-- Subtitles -->\n <div cdkDropList (cdkDropListDropped)=\"dropSubtitles(i, $event)\">\n <div *ngFor=\"let sub of footer.subtitles; let j = index\" class=\"row border p-3 mb-2 align-items-center\" cdkDrag>\n <div class=\"col-md-5\">\n <label for=\"subtitleTitle{{i}}{{j}}\" class=\"form-label\">Subtitle Title</label>\n <input id=\"subtitleTitle{{i}}{{j}}\" class=\"form-control\" [(ngModel)]=\"sub.title\" />\n </div>\n <div class=\"col-md-5\">\n <label for=\"subtitlePath{{i}}{{j}}\" class=\"form-label\">Subtitle Path</label>\n <input id=\"subtitlePath{{i}}{{j}}\" class=\"form-control\" [(ngModel)]=\"sub.path\" />\n </div>\n <div class=\"col-md-2 d-flex justify-content-between align-items-center mt-4\">\n <i class=\"fa fa-trash in-page-trash-icon text-danger cursor-pointer\" (click)=\"removeSubtitle(i, j)\" (keydown.enter)=\"removeSubtitle(i, j)\" (keydown.space)=\"removeSubtitle(i, j)\"></i>\n <i class=\"fa fa-bars cursor-move in-page-bars-icon\" cdkDragHandle></i>\n </div>\n </div>\n </div>\n\n <button class=\"btn btn-outline-primary btn-sm mt-2\" (click)=\"addSubtitle(i)\">\n + Add Subtitle\n </button>\n </div>\n </div>\n\n <button class=\"btn btn-primary mt-3\" (click)=\"addFooterLink()\">\n + Add Footer Link\n </button>\n </div>\n\n <div class=\"modal-footer\">\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n <button class=\"btn btn-primary\" (click)=\"saveFooterLinks(modal)\">Save</button>\n </div>\n</ng-template>\n\n\n\n\n\n<ng-template #logoModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Upload Logo</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <pw-custom-uploader\n [aspectRatio]=\"'fullLogo'\"\n [title]=\"'Main Contrast Logo'\"\n [controlName]=\"'logo_main_contrast'\"\n [previewData]=\"previewData\"\n (saveEvent)=\"onSaveFile($event)\">\n </pw-custom-uploader>\n </div>\n</ng-template>\n\n\n\n<ng-template #hubspotEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Hubspot Embed</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label for=\"hubspotId\" class=\"form-label\">Hubspot ID</label>\n <input id=\"hubspotId\" [(ngModel)]=\"editingHubspotId\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"hubspotEmbedDiv\" class=\"form-label\">Embed DIV</label>\n <textarea id=\"hubspotEmbedDiv\" [(ngModel)]=\"editingHubspotHtml\" rows=\"8\" class=\"form-control\"></textarea>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"saveHubspotHtml(modal)\">Save</button>\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n </div>\n</ng-template>\n\n\n<ng-template #socialEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Social Links & Company Name</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label for=\"youtubeUrl\" class=\"form-label\">YouTube URL</label>\n <input id=\"youtubeUrl\" [(ngModel)]=\"editingYoutubeUrl\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"linkedinUrl\" class=\"form-label\">LinkedIn URL</label>\n <input id=\"linkedinUrl\" [(ngModel)]=\"editingLinkedInUrl\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"companyName\" class=\"form-label\">Company Name</label>\n <input id=\"companyName\" [(ngModel)]=\"editingCompanyName\" class=\"form-control\" />\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"saveSocialLinks(modal)\">Save</button>\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n </div>\n</ng-template>\n\n\n\n<ng-template #questionsEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Questions</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n\n <div class=\"modal-body\">\n <h4 class=\"mb-3\">Questions Section</h4>\n <div cdkDropList (cdkDropListDropped)=\"dropQuestions($event)\">\n <div *ngFor=\"let q of editingQuestions; let i = index\" class=\"border p-3 mb-3\" cdkDrag>\n <div class=\"row\">\n <div class=\"col-md-11 mb-2\">\n <label for=\"questionText{{i}}\" class=\"form-label\">Question</label>\n <input id=\"questionText{{i}}\" class=\"form-control\" [(ngModel)]=\"q.question\" placeholder=\"Enter question\" />\n </div>\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-4\">\n <i class=\"fa fa-bars in-page-bars-icon cursor-move\" cdkDragHandle></i>\n </div>\n </div>\n\n <!-- Options Section -->\n <div cdkDropList (cdkDropListDropped)=\"dropQuestionOptions(i, $event)\">\n <div *ngFor=\"let opt of q.options; let j = index\" class=\"row border p-3 mb-2 align-items-center\" cdkDrag>\n <div class=\"col-md-7 mb-2\">\n <label for=\"questionOption{{i}}{{j}}\" class=\"form-label\">Option</label>\n <input id=\"questionOption{{i}}{{j}}\" class=\"form-control\" [(ngModel)]=\"opt.option\" placeholder=\"Enter option\" />\n </div>\n <div class=\"col-md-2 d-flex justify-content-between align-items-center mt-4\">\n <i class=\"fa fa-trash in-page-trash-icon text-danger cursor-pointer\" (click)=\"removeQuestionOption(i, j)\" (keydown.enter)=\"removeQuestionOption(i, j)\" (keydown.enter)=\"removeQuestionOption(i, j)\"></i>\n <i class=\"fa fa-bars in-page-bars-icon cursor-move\" cdkDragHandle></i>\n </div>\n </div>\n </div>\n\n <button class=\"btn btn-outline-primary btn-sm mt-2\" (click)=\"addQuestionOption(i)\">+ Add Option</button>\n </div>\n </div>\n\n <button class=\"btn btn-primary mt-3\" (click)=\"addNewQuestion()\">+ Add Question</button>\n </div>\n\n <div class=\"modal-footer\">\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n <button class=\"btn btn-primary\" (click)=\"saveQuestions(modal)\">Save</button>\n </div>\n</ng-template>\n\n\n\n", styles: [".product-explainer-section{background-color:#000}.footer-section{min-height:500px}@media (min-width: 768px){.footer-section{min-height:600px}}.footer-section .container{transition:opacity .3s ease,visibility .3s ease}.footer-section input.form-control,.footer-section select.form-control,.footer-section textarea.form-control{background-color:#fff;border:none;color:#000;font-size:14px}.btn-primary{background-color:#007bff;border:none}.site-column{margin-top:2.9rem}.email-section{color:#fff;font-size:2rem}.address-section{margin-top:5rem}.address-text{line-height:2.2rem}.user-info{font-size:1.5rem}.user-info-label{font-size:1.7rem;font-weight:700}.contact-form form .form-field{display:flex;align-items:center;margin-bottom:1.2rem}.contact-form form .form-field label{width:130px;min-width:130px;margin:0;font-size:14px;color:#fff;font-weight:600;text-transform:uppercase;letter-spacing:1px}.contact-form form .form-field p-dropdown{width:100%}.contact-form form .form-field input,.contact-form form .form-field select,.contact-form form .form-field textarea,.contact-form form .form-field ::ng-deep p-dropdown .p-inputwrapper{flex:1;border:none;border-radius:30px;padding:12px 20px;font-size:14px;width:100%!important;max-width:100%;color:#000}.contact-form form .form-field textarea{resize:vertical}.contact-form form .submit-button{background-color:#3b82f6;border:none;border-radius:30px;font-size:16px;font-weight:500;padding:10px 24px;margin-top:1.2rem}.input-select{height:43px}.select-label{width:210px!important}.copyright{margin-top:2rem;margin-left:4rem;font-size:19px;font-weight:700}.d-flex img{margin-right:0!important}.youtube-icon{height:38px}.enquiry-field{margin-left:.5rem;width:63%}::ng-deep .text-danger{margin-top:.25rem!important;margin-left:.5rem!important}.hubspot-container{min-height:400px;transition:opacity .3s ease}.hubspot-container:not(.content-loaded){opacity:0;pointer-events:none}.hubspot-container.content-loaded{opacity:1}@media (min-width: 768px){.hubspot-container{margin-top:-3rem}}@media (min-width: 768px) and (max-width: 1200px){.container{padding:0rem 6rem!important}}.link-label{cursor:pointer;transition:color .3s}.link-label:hover{color:var(--first)}.icons img{transition:transform .3s ease,filter .3s ease;cursor:pointer}.icons img:hover{transform:scale(1.1);filter:brightness(1.2)}.logo-image{max-width:160px;width:160px;height:35px;object-fit:contain;aspect-ratio:160/35}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i8.FieldErrorDisplayComponent, selector: "pw-field-error-display", inputs: ["errorMsg", "displayError"] }, { kind: "component", type: i9.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i10.ReCaptcha2Component, selector: "ngx-recaptcha2", inputs: ["theme", "size"] }, { kind: "directive", type: i11.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i12.EventTrackerDirective, selector: "[eventTracker]", inputs: ["eventTracker"] }, { kind: "directive", type: i12.LazyImgDirective, selector: "img" }, { kind: "pipe", type: i13.TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
514
|
-
}
|
|
515
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: Trial4ContactUsComponent, decorators: [{
|
|
516
|
-
type: Component,
|
|
517
|
-
args: [{ selector: 'pw-trial-4-contact-us', changeDetection: ChangeDetectionStrategy.OnPush, template: "<section #footerSection class=\"bg-black text-white py-5 footer-section\">\n <div class=\"container\">\n <div class=\"row\">\n\n <!-- LEFT COLUMN -->\n <div class=\"col-md-6 mb-4 d-flex flex-column justify-content-between\" [ngClass]=\"{ 'site-column': getFooterHubspotForm() }\">\n <div>\n <h3 class=\"mb-4 d-flex align-items-center\">\n <span class=\"me-2 text-white\">Site Map:</span>\n <i *ngIf=\"canEditResourcesValue\" class=\"fa fa-edit in-page-edit-icon cursor-pointer text-white ms-3\" (click)=\"openEditFooterLinksModal(editFooterLinksModal)\" (keydown.enter)=\"openEditFooterLinksModal(editFooterLinksModal)\" (keydown.space)=\"openEditFooterLinksModal(editFooterLinksModal)\" ngbTooltip=\"Edit Footer Links\"></i>\n </h3>\n <ul class=\"mt-4\">\n <li routerLink=\"/\"\n class=\"cursor-pointer user-info-label link-label\"> Home </li>\n <li *ngFor=\"let link of footerLinks\" [routerLink]=\"link?.path\"\n class=\"cursor-pointer user-info-label link-label mt-4\"><span *ngIf=\"link?.title\">{{link?.title}}</span> </li>\n <li routerLink=\"/login\"\n class=\"cursor-pointer user-info-label mt-4 link-label\"> Log in </li>\n <li [routerLink]=\"'/privacy-and-tos/' + tosId\"\n class=\"cursor-pointer user-info-label mt-4 link-label\"> Privacy statement </li>\n </ul>\n <p class=\"address-section email-section mb-4\">\n <span class=\"user-info-label\">Email: </span>\n <ng-container *ngIf=\"!isEditingEmail; else editEmail\">\n <span class=\"user-info\">{{ email }}</span>\n <i *ngIf=\"canEditResourcesValue\" class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3\" (click)=\"isEditingEmail = true\" (keydown.enter)=\"isEditingEmail = true\" (keydown.space)=\"isEditingEmail = true\"></i>\n </ng-container>\n\n <ng-template #editEmail>\n <input\n class=\"form-control d-inline w-auto\"\n [(ngModel)]=\"editingEmail\"\n />\n <button class=\"btn btn-sm btn-primary ms-2\" (click)=\"saveEmail()\">Save</button>\n <button class=\"btn btn-sm btn-secondary ms-2\" (click)=\"isEditingEmail = false\">Cancel</button>\n </ng-template>\n </p>\n <span class=\"email-section mt-3 address-text\">\n <span class=\"user-info-label\">\n Address:\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon cursor-pointer ms-2 text-white\"\n title=\"Edit Address\"\n (click)=\"isEditingStreet = true\"\n (keydown.enter)=\"isEditingStreet = true\"\n (keydown.space)=\"isEditingStreet = true\"></i>\n </span><br/>\n\n <ng-container *ngIf=\"!isEditingStreet; else editStreetBlock\">\n <span class=\"address-text user-info\">{{ street }}</span>\n </ng-container>\n\n <ng-template #editStreetBlock>\n <div class=\"d-flex align-items-center mt-3\">\n <input class=\"form-control form-control-sm\" [(ngModel)]=\"editingStreet\" />\n <button class=\"btn btn-sm btn-primary ms-2\" (click)=\"saveStreet()\">Save</button>\n <button class=\"btn btn-sm btn-secondary ms-2\" (click)=\"cancelStreet()\">Cancel</button>\n </div>\n </ng-template>\n\n </span>\n\n </div>\n <div class=\"d-flex\">\n <img [src]=\"logo\"\n alt=\"Company logo\"\n class=\"img-fluid mt-4 logo-image cursor-pointer\"\n width=\"160\"\n height=\"35\"\n (click)=\"scrollToTop()\"\n (keydown.enter)=\"scrollToTop()\"\n (keydown.space)=\"scrollToTop()\"\n title=\"Click to go to top of page\" />\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon fa-sm ms-3 cursor-pointer text-white align-self-center mt-3\"\n (click)=\"openLogoEditModal()\"\n (keydown.enter)=\"openLogoEditModal()\"\n (keydown.space)=\"openLogoEditModal()\"\n title=\"Edit Logo\"></i>\n </div>\n </div>\n\n <!-- RIGHT COLUMN -->\n <div class=\"col-md-6\">\n <ng-container *ngIf=\"getFooterHubspotForm() as footerItem; else defaultForm\">\n <div class=\"d-flex\">\n <div\n class=\"hubspot-container w-100 content-loaded\"\n [innerHTML]=\"hubspotHtml\"\n (load)=\"onHubspotLoad($event)\">\n </div>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer\"\n (click)=\"openHubspotEditModal(footerItem)\"\n (keydown.enter)=\"openHubspotEditModal(footerItem)\"\n (keydown.space)=\"openHubspotEditModal(footerItem)\"\n title=\"Edit Hubspot Embed\"></i>\n </div>\n </ng-container>\n\n <ng-template #defaultForm>\n <div class=\"d-flex\">\n <h3 class=\"text-white mb-4\"> <span class=\"text-white\">Get in touch:</span></h3>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3 mt-2\"\n (click)=\"openQuestionsEditModal()\"\n (keydown.enter)=\"openQuestionsEditModal()\"\n (keydown.space)=\"openQuestionsEditModal()\"\n title=\"Edit Questions\"></i>\n </div>\n <div class=\"contact-form\">\n <form [formGroup]=\"form\">\n <div class=\"mb-3\">\n <div class=\"email\">\n <div class=\"form-field\">\n <label for=\"email\">Email:</label>\n <div class=\"w-100\">\n <input type=\"text\"\n class=\"mb-1\"\n id=\"email\"\n formControlName=\"email\" />\n <pw-field-error-display [displayError]=\"\n !form.get('email').valid && (form.get('email').touched || submitted)\n \"\n errorMsg=\"Email is required\">\n </pw-field-error-display>\n </div>\n </div>\n <div class=\"form-field\">\n <label for=\"first_name\">First name:</label>\n <div class=\"w-100\">\n <input input type=\"text\"\n id=\"first_name\"\n formControlName=\"first_name\" />\n <pw-field-error-display [displayError]=\"\n !form.get('first_name').valid && (form.get('first_name').touched || submitted)\n \"\n errorMsg=\"First name is required\">\n </pw-field-error-display>\n </div>\n </div>\n <div class=\"form-field\">\n <label for=\"last_name\">Last name:</label>\n <input type=\"text\"\n id=\"last_name\"\n formControlName=\"last_name\" />\n </div>\n <div class=\"form-field\">\n <label for=\"company\">Company:</label>\n <input type=\"text\"\n id=\"company\"\n formControlName=\"company\" />\n </div>\n <div class=\"form-field\" *ngIf=\"hasValidOptions()\">\n <label for=\"psa\" class=\"select-label\">{{question}}</label>\n <p-dropdown\n formControlName=\"psa\"\n [options]=\"psaOptions\"\n [placeholder]=\"'Select PSA'\"\n styleClass=\"input-select\">\n </p-dropdown>\n </div>\n <div class=\"form-field\">\n <label for=\"enquiry\" class=\"select-label\">How can we help you?</label>\n <div class=\"enquiry-field\">\n <textarea id=\"enquiry\" formControlName=\"enquiry\" class=\"\">\n </textarea>\n <pw-field-error-display [displayError]=\"\n !form.get('enquiry').valid && (form.get('enquiry').touched || submitted)\n \"\n errorMsg=\"Enquiry is required\">\n </pw-field-error-display>\n </div>\n </div>\n </div>\n </div>\n <div class=\"text-end\">\n <div class=\"captcha-wrapper-container\"\n *ngIf=\"isCaptchaVerified\">\n <ngx-recaptcha2 [ngModelOptions]=\"{ standalone: true }\"\n [siteKey]=\"captchaKeyV2\"\n size=\"normal\"\n [(ngModel)]=\"recaptcha\"\n (success)=\"handleSuccess($event)\">\n </ngx-recaptcha2>\n </div>\n <button type=\"submit\"\n (click)=\"onSubmit()\"\n *ngIf=\"!isCaptchaVerified\"\n class=\"sign-btn sign-header-btn mt-3\">\n {{ 'Button.Submit' | transloco }}\n </button>\n </div>\n\n <div class=\"d-flex align-items-center mt-4\">\n <div class=\"icons d-flex align-items-center\">\n <a [eventTracker]=\"{\n category: 'youtube',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n [href]=\"youtubeUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\">\n <img src=\"/assets/img/icons/youtube.png\"\n class=\"img-fluid youtube-icon\"\n width=\"54\"\n height=\"54\"\n alt=\"\" />\n </a>\n <a [eventTracker]=\"{\n category: 'linkedin',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n [href]=\"linkedInUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"ms-3\">\n <img src=\"/assets/img/icons/social/linkedin.svg\"\n class=\"img-fluid linkedin-icon\"\n width=\"48\"\n height=\"48\"\n alt=\"\" />\n </a>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3\"\n (click)=\"openSocialEditModal()\"\n (keydown.enter)=\"openSocialEditModal()\"\n (keydown.space)=\"openSocialEditModal()\"\n title=\"Edit Social Links & Company Name\"></i>\n </div>\n <div class=\"copyright text-white\">\n 2025 {{companyName}}.\n </div>\n </div>\n </form>\n </div>\n </ng-template>\n </div>\n </div>\n </div>\n</section>\n\n\n\n<ng-template #bookMeeting\n let-modal>\n <div class=\"modal-header\">\n <button type=\"button\"\n class=\"btn-close float-end\"\n aria-label=\"Close\"\n (click)=\"modal.dismiss()\">\n </button>\n </div>\n <div class=\"modal-body\">\n <h3 class=\"text-center modal-basic-title\">\n Thanks for getting in touch! Our team will be in contact shortly, or we\n can compare calendars now & schedule a time\n </h3>\n <button type=\"button\"\n [eventTracker]=\"{\n category: 'request-demo',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n (click)=\"navigateToBookMeeting()\"\n class=\"sign-btn sign-header-btn mx-auto d-block mb-3\">\n Let's do it\n </button>\n </div>\n</ng-template>\n\n\n<ng-template #editFooterLinksModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Footer Links</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n\n <div class=\"modal-body\">\n <h4 class=\"mb-3\">Footer Links Section</h4>\n <div cdkDropList (cdkDropListDropped)=\"dropFooterLinks($event)\">\n <div *ngFor=\"let footer of editingFooterLinks.items; let i = index\" class=\"border p-3 mb-3\" cdkDrag>\n <div class=\"row\">\n <div class=\"col-md-5 mb-2\">\n <label for=\"footerTitle{{i}}\" class=\"form-label\">Title</label>\n <input id=\"footerTitle{{i}}\" class=\"form-control\" [(ngModel)]=\"footer.title\" />\n </div>\n <div class=\"col-md-5 mb-2\">\n <label for=\"footerPath{{i}}\" class=\"form-label\">Path</label>\n <input id=\"footerPath{{i}}\" class=\"form-control\" [(ngModel)]=\"footer.path\" />\n </div>\n <div class=\"col-md-2 d-flex justify-content-between align-items-center mt-4\">\n <i class=\"fa fa-trash in-page-trash-icon text-danger cursor-pointer\" (click)=\"removeFooterLink(i)\" (keydown.enter)=\"removeFooterLink(i)\" (keydown.space)=\"removeFooterLink(i)\"></i>\n <i class=\"fa fa-bars in-page-bars-icon cursor-move\" cdkDragHandle></i>\n </div>\n </div>\n\n <!-- Subtitles -->\n <div cdkDropList (cdkDropListDropped)=\"dropSubtitles(i, $event)\">\n <div *ngFor=\"let sub of footer.subtitles; let j = index\" class=\"row border p-3 mb-2 align-items-center\" cdkDrag>\n <div class=\"col-md-5\">\n <label for=\"subtitleTitle{{i}}{{j}}\" class=\"form-label\">Subtitle Title</label>\n <input id=\"subtitleTitle{{i}}{{j}}\" class=\"form-control\" [(ngModel)]=\"sub.title\" />\n </div>\n <div class=\"col-md-5\">\n <label for=\"subtitlePath{{i}}{{j}}\" class=\"form-label\">Subtitle Path</label>\n <input id=\"subtitlePath{{i}}{{j}}\" class=\"form-control\" [(ngModel)]=\"sub.path\" />\n </div>\n <div class=\"col-md-2 d-flex justify-content-between align-items-center mt-4\">\n <i class=\"fa fa-trash in-page-trash-icon text-danger cursor-pointer\" (click)=\"removeSubtitle(i, j)\" (keydown.enter)=\"removeSubtitle(i, j)\" (keydown.space)=\"removeSubtitle(i, j)\"></i>\n <i class=\"fa fa-bars cursor-move in-page-bars-icon\" cdkDragHandle></i>\n </div>\n </div>\n </div>\n\n <button class=\"btn btn-outline-primary btn-sm mt-2\" (click)=\"addSubtitle(i)\">\n + Add Subtitle\n </button>\n </div>\n </div>\n\n <button class=\"btn btn-primary mt-3\" (click)=\"addFooterLink()\">\n + Add Footer Link\n </button>\n </div>\n\n <div class=\"modal-footer\">\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n <button class=\"btn btn-primary\" (click)=\"saveFooterLinks(modal)\">Save</button>\n </div>\n</ng-template>\n\n\n\n\n\n<ng-template #logoModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Upload Logo</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <pw-custom-uploader\n [aspectRatio]=\"'fullLogo'\"\n [title]=\"'Main Contrast Logo'\"\n [controlName]=\"'logo_main_contrast'\"\n [previewData]=\"previewData\"\n (saveEvent)=\"onSaveFile($event)\">\n </pw-custom-uploader>\n </div>\n</ng-template>\n\n\n\n<ng-template #hubspotEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Hubspot Embed</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label for=\"hubspotId\" class=\"form-label\">Hubspot ID</label>\n <input id=\"hubspotId\" [(ngModel)]=\"editingHubspotId\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"hubspotEmbedDiv\" class=\"form-label\">Embed DIV</label>\n <textarea id=\"hubspotEmbedDiv\" [(ngModel)]=\"editingHubspotHtml\" rows=\"8\" class=\"form-control\"></textarea>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"saveHubspotHtml(modal)\">Save</button>\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n </div>\n</ng-template>\n\n\n<ng-template #socialEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Social Links & Company Name</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label for=\"youtubeUrl\" class=\"form-label\">YouTube URL</label>\n <input id=\"youtubeUrl\" [(ngModel)]=\"editingYoutubeUrl\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"linkedinUrl\" class=\"form-label\">LinkedIn URL</label>\n <input id=\"linkedinUrl\" [(ngModel)]=\"editingLinkedInUrl\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"companyName\" class=\"form-label\">Company Name</label>\n <input id=\"companyName\" [(ngModel)]=\"editingCompanyName\" class=\"form-control\" />\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"saveSocialLinks(modal)\">Save</button>\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n </div>\n</ng-template>\n\n\n\n<ng-template #questionsEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Questions</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n\n <div class=\"modal-body\">\n <h4 class=\"mb-3\">Questions Section</h4>\n <div cdkDropList (cdkDropListDropped)=\"dropQuestions($event)\">\n <div *ngFor=\"let q of editingQuestions; let i = index\" class=\"border p-3 mb-3\" cdkDrag>\n <div class=\"row\">\n <div class=\"col-md-11 mb-2\">\n <label for=\"questionText{{i}}\" class=\"form-label\">Question</label>\n <input id=\"questionText{{i}}\" class=\"form-control\" [(ngModel)]=\"q.question\" placeholder=\"Enter question\" />\n </div>\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-4\">\n <i class=\"fa fa-bars in-page-bars-icon cursor-move\" cdkDragHandle></i>\n </div>\n </div>\n\n <!-- Options Section -->\n <div cdkDropList (cdkDropListDropped)=\"dropQuestionOptions(i, $event)\">\n <div *ngFor=\"let opt of q.options; let j = index\" class=\"row border p-3 mb-2 align-items-center\" cdkDrag>\n <div class=\"col-md-7 mb-2\">\n <label for=\"questionOption{{i}}{{j}}\" class=\"form-label\">Option</label>\n <input id=\"questionOption{{i}}{{j}}\" class=\"form-control\" [(ngModel)]=\"opt.option\" placeholder=\"Enter option\" />\n </div>\n <div class=\"col-md-2 d-flex justify-content-between align-items-center mt-4\">\n <i class=\"fa fa-trash in-page-trash-icon text-danger cursor-pointer\" (click)=\"removeQuestionOption(i, j)\" (keydown.enter)=\"removeQuestionOption(i, j)\" (keydown.enter)=\"removeQuestionOption(i, j)\"></i>\n <i class=\"fa fa-bars in-page-bars-icon cursor-move\" cdkDragHandle></i>\n </div>\n </div>\n </div>\n\n <button class=\"btn btn-outline-primary btn-sm mt-2\" (click)=\"addQuestionOption(i)\">+ Add Option</button>\n </div>\n </div>\n\n <button class=\"btn btn-primary mt-3\" (click)=\"addNewQuestion()\">+ Add Question</button>\n </div>\n\n <div class=\"modal-footer\">\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n <button class=\"btn btn-primary\" (click)=\"saveQuestions(modal)\">Save</button>\n </div>\n</ng-template>\n\n\n\n", styles: [".product-explainer-section{background-color:#000}.footer-section{min-height:500px}@media (min-width: 768px){.footer-section{min-height:600px}}.footer-section .container{transition:opacity .3s ease,visibility .3s ease}.footer-section input.form-control,.footer-section select.form-control,.footer-section textarea.form-control{background-color:#fff;border:none;color:#000;font-size:14px}.btn-primary{background-color:#007bff;border:none}.site-column{margin-top:2.9rem}.email-section{color:#fff;font-size:2rem}.address-section{margin-top:5rem}.address-text{line-height:2.2rem}.user-info{font-size:1.5rem}.user-info-label{font-size:1.7rem;font-weight:700}.contact-form form .form-field{display:flex;align-items:center;margin-bottom:1.2rem}.contact-form form .form-field label{width:130px;min-width:130px;margin:0;font-size:14px;color:#fff;font-weight:600;text-transform:uppercase;letter-spacing:1px}.contact-form form .form-field p-dropdown{width:100%}.contact-form form .form-field input,.contact-form form .form-field select,.contact-form form .form-field textarea,.contact-form form .form-field ::ng-deep p-dropdown .p-inputwrapper{flex:1;border:none;border-radius:30px;padding:12px 20px;font-size:14px;width:100%!important;max-width:100%;color:#000}.contact-form form .form-field textarea{resize:vertical}.contact-form form .submit-button{background-color:#3b82f6;border:none;border-radius:30px;font-size:16px;font-weight:500;padding:10px 24px;margin-top:1.2rem}.input-select{height:43px}.select-label{width:210px!important}.copyright{margin-top:2rem;margin-left:4rem;font-size:19px;font-weight:700}.d-flex img{margin-right:0!important}.youtube-icon{height:38px}.enquiry-field{margin-left:.5rem;width:63%}::ng-deep .text-danger{margin-top:.25rem!important;margin-left:.5rem!important}.hubspot-container{min-height:400px;transition:opacity .3s ease}.hubspot-container:not(.content-loaded){opacity:0;pointer-events:none}.hubspot-container.content-loaded{opacity:1}@media (min-width: 768px){.hubspot-container{margin-top:-3rem}}@media (min-width: 768px) and (max-width: 1200px){.container{padding:0rem 6rem!important}}.link-label{cursor:pointer;transition:color .3s}.link-label:hover{color:var(--first)}.icons img{transition:transform .3s ease,filter .3s ease;cursor:pointer}.icons img:hover{transform:scale(1.1);filter:brightness(1.2)}.logo-image{max-width:160px;width:160px;height:35px;object-fit:contain;aspect-ratio:160/35}\n"] }]
|
|
518
|
-
}], ctorParameters: () => [{ type: i1.UntypedFormBuilder }, { type: i2.AuthService }, { type: i3.CrmService }, { type: i4.DomSanitizer }, { type: i5.AdminService }, { type: i0.Injector }, { type: i2.AbTestService }, { type: i6.NgbModal }, { type: i0.ChangeDetectorRef }, { type: Document, decorators: [{
|
|
519
|
-
type: Inject,
|
|
520
|
-
args: [DOCUMENT]
|
|
521
|
-
}] }], propDecorators: { footerSection: [{
|
|
522
|
-
type: ViewChild,
|
|
523
|
-
args: ['footerSection', { static: true }]
|
|
524
|
-
}], content: [{
|
|
525
|
-
type: ViewChild,
|
|
526
|
-
args: ['bookMeeting', { static: true }]
|
|
527
|
-
}], editFooterLinksModal: [{
|
|
528
|
-
type: ViewChild,
|
|
529
|
-
args: ['editFooterLinksModal']
|
|
530
|
-
}], logoModal: [{
|
|
531
|
-
type: ViewChild,
|
|
532
|
-
args: ['logoModal']
|
|
533
|
-
}], logoUploader: [{
|
|
534
|
-
type: ViewChild,
|
|
535
|
-
args: ['logoUploader']
|
|
536
|
-
}], hubspotEditModal: [{
|
|
537
|
-
type: ViewChild,
|
|
538
|
-
args: ['hubspotEditModal']
|
|
539
|
-
}], socialEditModal: [{
|
|
540
|
-
type: ViewChild,
|
|
541
|
-
args: ['socialEditModal']
|
|
542
|
-
}], questionsEditModal: [{
|
|
543
|
-
type: ViewChild,
|
|
544
|
-
args: ['questionsEditModal']
|
|
545
|
-
}], subscriptionId: [{
|
|
546
|
-
type: Input
|
|
547
|
-
}], sourceId: [{
|
|
548
|
-
type: Input
|
|
549
|
-
}], masterSubscriptionId: [{
|
|
550
|
-
type: Input
|
|
551
|
-
}], experimentName: [{
|
|
552
|
-
type: Input
|
|
553
|
-
}], microserviceName: [{
|
|
554
|
-
type: Input
|
|
555
|
-
}], shardName: [{
|
|
556
|
-
type: Input
|
|
557
|
-
}], user: [{
|
|
558
|
-
type: Input
|
|
559
|
-
}], userLoggedIn: [{
|
|
560
|
-
type: Input
|
|
561
|
-
}] } });
|
|
562
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtY29udGFjdC11cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3Jlc291cmNlLWNvbnRhY3QtdXMvc3JjL2xpYi9yZXNvdXJjZS1jb250YWN0LXVzL3Jlc291cmNlLWNvbnRhY3QtdXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9yZXNvdXJjZS1jb250YWN0LXVzL3NyYy9saWIvcmVzb3VyY2UtY29udGFjdC11cy9yZXNvdXJjZS1jb250YWN0LXVzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUVILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFLTCxXQUFXLEVBQ1gsU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBb0IsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXpELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTFGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDeEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sSUFBSSxNQUFNLGFBQWEsQ0FBQztBQUUvQixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQVV0RCxNQUFNLE9BQU8sd0JBQ1QsU0FBUSxnQkFBZ0I7SUFpQnhCLG1EQUFtRDtJQUNuRCw0Q0FBNEM7SUFFNUMsc0JBQXNCO1FBQ2xCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBa0VELFlBQ3FCLEVBQXNCLEVBQ3RCLFdBQXdCLEVBQ3hCLFVBQXNCLEVBQ3RCLFNBQXVCLEVBQ3ZCLFlBQTBCLEVBQzNDLFFBQWtCLEVBQ0QsYUFBNEIsRUFDNUIsWUFBc0IsRUFDdEIsR0FBc0IsRUFDSixRQUFrQjtRQUVyRCxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFYQyxPQUFFLEdBQUYsRUFBRSxDQUFvQjtRQUN0QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFDdkIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFFMUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsaUJBQVksR0FBWixZQUFZLENBQVU7UUFDdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDSixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBdkZ6RCxxQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFtQnRCLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFJUixtQkFBYyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQztRQUNwRCxhQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDO1FBQ3hDLHlCQUFvQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDO1FBTW5GLDBCQUFxQixHQUFHLEtBQUssQ0FBQztRQUs5QixTQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxHQUFHLENBQUM7UUFDMUQsa0JBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQztRQUNwRSxVQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUM7UUFDcEMsZ0JBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDakQsVUFBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNyQyxnQkFBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUMxQyxXQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQ3ZDLGNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDO1FBQ2hFLFlBQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDO1FBQzVELGdCQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQztRQUVoRSxvQkFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQztRQUU3RCxlQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDO1FBQ2hELGdCQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDO1FBQ2xELGFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztRQUVwQyxpQkFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDMUIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFTdkIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDMUIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFNeEIsdUJBQWtCLEdBQUc7WUFDakIsS0FBSyxFQUFFLEVBQUU7U0FDWixDQUFDO1FBZ0JFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDO1FBQy9ELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsUUFBUTtRQUNKLDZEQUE2RDtRQUM3RCwrRUFBK0U7UUFDL0UsSUFBSSxxQkFBcUIsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNsQyxtQkFBbUIsQ0FDZixHQUFHLEVBQUU7Z0JBQ0QsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM1QixDQUFDLEVBQ0QsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQ3BCLENBQUM7UUFDTixDQUFDO2FBQU0sQ0FBQztZQUNKLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDNUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2IsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDbEQsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLGNBQWMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM1QixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHO1lBQ2YsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2QsSUFBSSxFQUFFLHdCQUF3QjtTQUNqQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ2pDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3ZELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FDcEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxLQUFLLFlBQVksQ0FDNUMsQ0FBQztZQUNGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLGlCQUFpQixDQUFDO1lBQ3hELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUM7WUFDcEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQztRQUM1QyxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDL0MsSUFBSSxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDbEIsdURBQXVEO1lBQ3ZELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVO1FBQ3pGLENBQUM7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN2QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUM7UUFDOUMsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNkLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2xDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQztpQkFDbEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztpQkFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDUCxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU07Z0JBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNO2FBQ2xCLENBQUMsQ0FBQztTQUNWLENBQUM7SUFDTixDQUFDO0lBQ0QsV0FBVyxDQUFDLE9BQXNCO1FBQzlCLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQzdDLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1lBQ3ZDLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVELGlCQUFpQjtRQUNiLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbkMsUUFBUSxFQUFFLElBQUk7WUFDZCxJQUFJLEVBQUUsSUFBSTtTQUNiLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBSztRQUNaLE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7UUFDaEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXRELElBQUksS0FBSyxDQUFDLElBQUksWUFBWSxJQUFJLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDbEMsQ0FBQzthQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsVUFBVSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDeEMsQ0FBQztRQUVELEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDckIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ3pFLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNiLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbkMsQ0FBQztZQUNELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckUsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQUs7UUFDZixNQUFNLFVBQVUsR0FBRztZQUNmLFVBQVUsRUFBRTtnQkFDUixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLFVBQVU7Z0JBQzFDLFNBQVMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO2FBQ25DO1lBQ0QsZUFBZSxFQUFFLElBQUksQ0FBQyxFQUFFO1NBQzNCLENBQUM7UUFFRixJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUMzRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztZQUN2QyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDO1lBQ3JELElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLFVBQVUsR0FBRztvQkFDZCxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtvQkFDbEMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO3lCQUNsQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO3lCQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUNQLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTTt3QkFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU07cUJBQ2xCLENBQUMsQ0FBQztpQkFDVixDQUFDO1lBQ04sQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLENBQUM7WUFFRCxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsY0FBYztRQUNWLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxNQUFjO1FBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELG9CQUFvQixDQUFDLE1BQWMsRUFBRSxRQUFnQjtRQUNqRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFLO1FBQ2YsZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRUQsbUJBQW1CLENBQUMsTUFBYyxFQUFFLEtBQUs7UUFDckMsZUFBZSxDQUNYLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQ3JDLEtBQUssQ0FBQyxhQUFhLEVBQ25CLEtBQUssQ0FBQyxZQUFZLENBQ3JCLENBQUM7SUFDTixDQUFDO0lBRUQsbUJBQW1CO1FBQ2YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDekMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDM0MsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFFM0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFLO1FBQ2pCLE1BQU0sVUFBVSxHQUFHO1lBQ2YsV0FBVyxFQUFFLElBQUksQ0FBQyxpQkFBaUI7WUFDbkMsWUFBWSxFQUFFLElBQUksQ0FBQyxrQkFBa0I7WUFDckMsWUFBWSxFQUFFLElBQUksQ0FBQyxrQkFBa0I7WUFDckMsZUFBZSxFQUFFLElBQUksQ0FBQyxFQUFFO1NBQzNCLENBQUM7UUFFRixJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUMzRSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUN6QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztZQUMzQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztZQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1lBQzVELEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxlQUFlO1FBQ1gsT0FBTyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsZUFBZTtRQUNYLHlEQUF5RDtRQUN6RCxvRUFBb0U7UUFDcEUsSUFBSSxxQkFBcUIsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNsQyxtQkFBbUIsQ0FDZixHQUFHLEVBQUU7Z0JBQ0QsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDbkMsQ0FBQyxFQUNELEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUNwQixDQUFDO1FBQ04sQ0FBQzthQUFNLENBQUM7WUFDSixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNaLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ25DLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNWLENBQUM7UUFDRCx1REFBdUQ7UUFDdkQsMEVBQTBFO0lBQzlFLENBQUM7SUFFRCx3QkFBd0IsQ0FBQyxPQUFPO1FBQzVCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsSUFBSSxFQUFFLENBQUM7UUFDbEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzlELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFFM0UsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQzVCLElBQUksRUFBRSxJQUFJO1lBQ1YsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsY0FBYztTQUM5QixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sdUJBQXVCO1FBQzNCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBRXBCLDBFQUEwRTtRQUMxRSxtREFBbUQ7UUFDbkQsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNuQixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQyxzQ0FBc0M7UUFFNUQsTUFBTSxXQUFXLEdBQUcsR0FBRyxFQUFFO1lBQ3JCLFVBQVUsRUFBRSxDQUFDO1lBQ2IsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksU0FBUyxLQUFLLEdBQUcsSUFBSSxTQUFTLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUN4QixPQUFPLENBQUMsOENBQThDO1lBQzFELENBQUM7WUFDRCxVQUFVLEdBQUcsU0FBUyxDQUFDO1lBQ3ZCLDhFQUE4RTtZQUM5RSxtRkFBbUY7WUFDbkYsSUFBSSxTQUFTLEtBQUssR0FBRyxJQUFJLFVBQVUsR0FBRyxTQUFTLEVBQUUsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ3RDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN2QyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDWixDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBRUYsc0VBQXNFO1FBQ3RFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ3RDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNaLENBQUM7SUFFUSxXQUFXO1FBQ2hCLDRDQUE0QztRQUM1QyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLFlBQVksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMzQixZQUFZLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDM0MsQ0FBQztJQUNMLENBQUM7SUFFRCwrQ0FBK0M7SUFDL0MsYUFBYSxDQUFDLEtBQVk7UUFDdEIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQXdCLENBQUM7UUFDakQsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUUxQywrQ0FBK0M7UUFDL0MsSUFBSSxxQkFBcUIsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNsQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3JCLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUM5QyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7YUFBTSxDQUFDO1lBQ0osVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDWixNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDOUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ1osQ0FBQztJQUNMLENBQUM7SUFFTyxnQkFBZ0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxhQUFhO2lCQUNiLGtCQUFrQixDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDO2lCQUM5RCxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNaLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQ2pDLFFBQVEsRUFBRSxJQUFJO29CQUNkLFdBQVcsRUFBRSxjQUFjO2lCQUM5QixDQUFDLENBQUM7WUFDUCxDQUFDLENBQUMsQ0FBQztRQUNYLENBQUM7SUFDTCxDQUFDO0lBRUQsYUFBYTtRQUNULElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDdEIsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDckMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2YsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2IsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ1QsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDbEMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7U0FDbkMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFFBQVE7UUFDSixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztZQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUMzQixDQUFDO0lBQ0wsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFhO1FBQ3ZCLElBQUksS0FBSyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQWtCLEVBQUUsRUFBRTtnQkFDdkUsSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDL0IsTUFBTSxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztvQkFDNUMsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLGVBQWUsSUFBSSxDQUFDLFFBQVEsYUFBYSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQzVGLE1BQU0sUUFBUSxHQUFHO3dCQUNiLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUU7d0JBQ2hDLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUU7d0JBQy9CLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUU7d0JBQzdCLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUU7d0JBQ3RCLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRTt3QkFDdEUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO3dCQUNiLGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYzt3QkFDcEMsYUFBYSxFQUFFLElBQUksQ0FBQyxRQUFRO3dCQUM1QixzQkFBc0IsRUFBRSxJQUFJLENBQUMsb0JBQW9CO3dCQUNqRCxXQUFXLEVBQUUsS0FBSzt3QkFDbEIsU0FBUyxFQUFFLEtBQUs7cUJBQ25CLENBQUM7b0JBRUYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQ3hFLDhEQUE4RDt3QkFDOUQsSUFBSSxJQUFJLEVBQUUsTUFBTSxLQUFLLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs0QkFDbEMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FDakMsdUJBQXVCLEVBQUUsdUJBQXVCOzRCQUNoRCxtQkFBbUIsRUFBRSxtQkFBbUI7NEJBQ3hDLG1CQUFtQixFQUFFLG9CQUFvQjs0QkFDekMsQ0FBQyxDQUFDLGdCQUFnQjs2QkFDckIsQ0FBQzs0QkFDRixJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0NBQy9DLElBQUksQ0FBQyxhQUFhO3FDQUNiLGtCQUFrQixDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDO3FDQUM5RCxTQUFTLENBQUMsR0FBRyxFQUFFO29DQUNaLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7d0NBQ2pDLFFBQVEsRUFBRSxJQUFJO3dDQUNkLFdBQVcsRUFBRSxjQUFjO3FDQUM5QixDQUFDLENBQUM7Z0NBQ1AsQ0FBQyxDQUFDLENBQUM7NEJBQ1gsQ0FBQztpQ0FBTSxDQUFDO2dDQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDOzRCQUM1QixDQUFDO3dCQUNMLENBQUM7d0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDbEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztvQkFDbkMsQ0FBQyxDQUFDLENBQUM7Z0JBQ1AsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsb0JBQW9CO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDekUsQ0FBQztJQUVELHFCQUFxQjtRQUNqQixNQUFNLFdBQVcsR0FDYixJQUFJLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsYUFBYTtZQUNuRCxpQ0FBaUMsQ0FBQztRQUN0QyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUscUJBQXFCLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsYUFBYTtRQUNULE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUMzQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkQsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUM3QixDQUFDO0lBQ0wsQ0FBQztJQUVELGFBQWE7UUFDVCxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUMvQixLQUFLLEVBQUUsRUFBRTtZQUNULElBQUksRUFBRSxFQUFFO1lBQ1IsU0FBUyxFQUFFLEVBQUU7U0FDaEIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQWE7UUFDMUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxXQUFXLENBQUMsV0FBbUI7UUFDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQ3RELEtBQUssRUFBRSxFQUFFO1lBQ1QsSUFBSSxFQUFFLEVBQUU7U0FDWCxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsY0FBYyxDQUFDLFdBQW1CLEVBQUUsYUFBcUI7UUFDckQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQUs7UUFDakIsZUFBZSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUVELGFBQWEsQ0FBQyxXQUFtQixFQUFFLEtBQUs7UUFDcEMsZUFBZSxDQUNYLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsU0FBUyxFQUNwRCxLQUFLLENBQUMsYUFBYSxFQUNuQixLQUFLLENBQUMsWUFBWSxDQUNyQixDQUFDO0lBQ04sQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFLO1FBQ2pCLE1BQU0sYUFBYSxHQUFHO1lBQ2xCLFlBQVksRUFBRSxJQUFJLENBQUMsa0JBQWtCO1lBQ3JDLGVBQWUsRUFBRSxJQUFJLENBQUMsRUFBRTtTQUMzQixDQUFDO1FBRUYsSUFBSSxDQUFDLFlBQVk7YUFDWixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxhQUFhLENBQUM7YUFDNUQsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3RELEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxTQUFTO1FBQ0wsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBRS9CLElBQUksQ0FBQyxZQUFZO2FBQ1osa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUU7WUFDM0MsYUFBYSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQ2hDLGVBQWUsRUFBRSxJQUFJLENBQUMsRUFBRTtTQUMzQixDQUFDO2FBQ0QsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELFVBQVU7UUFDTixJQUFJLENBQUMsWUFBWTthQUNaLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFO1lBQzNDLGVBQWUsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUNuQyxlQUFlLEVBQUUsSUFBSSxDQUFDLEVBQUU7U0FDM0IsQ0FBQzthQUNELFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUNqQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxZQUFZO1FBQ1IsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxVQUFVO1FBQzNCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFLO1FBQ2pCLE1BQU0sYUFBYSxHQUFHO1lBQ2xCLFVBQVUsRUFBRTtnQkFDUixHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVU7Z0JBQzNDLE9BQU8sRUFBRTtvQkFDTDt3QkFDSSxFQUFFLEVBQUUsU0FBUzt3QkFDYixRQUFRLEVBQUUsUUFBUTt3QkFDbEIsR0FBRyxFQUFFLElBQUksQ0FBQyxrQkFBa0I7cUJBQy9CO2lCQUNKO2FBQ0o7WUFDRCxlQUFlLEVBQUUsSUFBSSxDQUFDLEVBQUU7U0FDM0IsQ0FBQztRQUVGLElBQUksQ0FBQyxZQUFZO2FBQ1osa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsYUFBYSxDQUFDO2FBQzVELFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDWix1REFBdUQ7WUFDdkQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsVUFBVTtZQUM5RixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQzVDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFDTywyQkFBMkI7UUFDL0IsSUFBSSxDQUFDLHFCQUFxQixHQUFHLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FDdkQsSUFBSSxDQUFDLElBQUksRUFDVCxJQUFJLENBQUMsWUFBWSxFQUNqQixJQUFJLENBQUMsaUJBQWlCLENBQ3pCLENBQUM7SUFDTixDQUFDO0lBRUQsZ0JBQWdCO1FBQ1osT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUM7SUFDdEMsQ0FBQzsrR0FobUJRLHdCQUF3QiwrUUFvR3JCLFFBQVE7bUdBcEdYLHdCQUF3QiwwcUNDMUNyQyxndnBCQXljQTs7NEZEL1phLHdCQUF3QjtrQkFOcEMsU0FBUzsrQkFDSSx1QkFBdUIsbUJBR2hCLHVCQUF1QixDQUFDLE1BQU07OzBCQXNHMUMsTUFBTTsyQkFBQyxRQUFRO3lDQWhHMEIsYUFBYTtzQkFBMUQsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNBLE9BQU87c0JBQWxELFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDUCxvQkFBb0I7c0JBQXRELFNBQVM7dUJBQUMsc0JBQXNCO2dCQUNULFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDSyxZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ00sZ0JBQWdCO3NCQUE5QyxTQUFTO3VCQUFDLGtCQUFrQjtnQkFDQyxlQUFlO3NCQUE1QyxTQUFTO3VCQUFDLGlCQUFpQjtnQkFDSyxrQkFBa0I7c0JBQWxELFNBQVM7dUJBQUMsb0JBQW9CO2dCQXlCdEIsY0FBYztzQkFBdEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFHRyxZQUFZO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbW92ZUl0ZW1JbkFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSW5qZWN0LFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbmltcG9ydCB7IEFkbWluU2VydmljZSB9IGZyb20gJ0Bwb3Npd2lzZS9hZG1pbi1tb2R1bGUtdXRpbHMnO1xuaW1wb3J0IHsgQXBwQmFzZUNvbXBvbmVudCB9IGZyb20gJ0Bwb3Npd2lzZS9hcHAtYmFzZS1jb21wb25lbnQnO1xuaW1wb3J0IHsgQWJUZXN0U2VydmljZSwgQXV0aFNlcnZpY2UsIFZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL2NvbW1vbi1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnQHBvc2l3aXNlL2NvbW1vbi11dGlsaXRpZXMnO1xuaW1wb3J0IHsgSGVscGVyU2VydmljZSB9IGZyb20gJ0Bwb3Npd2lzZS9oZWxwZXItc2VydmljZSc7XG5pbXBvcnQgeyBDcm1TZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL3NtYXJ0LWNybS1zaGFyZWQnO1xuaW1wb3J0IHsgQ3VzdG9tVXBsb2FkZXJDb21wb25lbnQgfSBmcm9tICdAcG9zaXdpc2UvdXRpbHMnO1xuXG5pbXBvcnQgeyBTdGF0dXNDb2RlcyB9IGZyb20gJ2h0dHAtc3RhdHVzLWNvZGVzJztcbmltcG9ydCBTd2FsIGZyb20gJ3N3ZWV0YWxlcnQyJztcblxuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5cbmltcG9ydCB7IFJlc291cmNlTW9kYWxDb250ZXh0IH0gZnJvbSAnLi4vc2hhcmVkL3Jlc291cmNlLW1vZGFsLmludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncHctdHJpYWwtNC1jb250YWN0LXVzJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcmVzb3VyY2UtY29udGFjdC11cy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vcmVzb3VyY2UtY29udGFjdC11cy5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFRyaWFsNENvbnRhY3RVc0NvbXBvbmVudFxuICAgIGV4dGVuZHMgQXBwQmFzZUNvbXBvbmVudFxuICAgIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveVxue1xuICAgIEBWaWV3Q2hpbGQoJ2Zvb3RlclNlY3Rpb24nLCB7IHN0YXRpYzogdHJ1ZSB9KSBmb290ZXJTZWN0aW9uITogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdib29rTWVldGluZycsIHsgc3RhdGljOiB0cnVlIH0pIGNvbnRlbnQ6IFRlbXBsYXRlUmVmPFJlc291cmNlTW9kYWxDb250ZXh0PjtcbiAgICBAVmlld0NoaWxkKCdlZGl0Rm9vdGVyTGlua3NNb2RhbCcpIGVkaXRGb290ZXJMaW5rc01vZGFsOiBUZW1wbGF0ZVJlZjxDdXN0b21VcGxvYWRlckNvbXBvbmVudD47XG4gICAgQFZpZXdDaGlsZCgnbG9nb01vZGFsJykgbG9nb01vZGFsOiBUZW1wbGF0ZVJlZjxDdXN0b21VcGxvYWRlckNvbXBvbmVudD47XG4gICAgQFZpZXdDaGlsZCgnbG9nb1VwbG9hZGVyJykgbG9nb1VwbG9hZGVyOiBDdXN0b21VcGxvYWRlckNvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKCdodWJzcG90RWRpdE1vZGFsJykgaHVic3BvdEVkaXRNb2RhbDogVGVtcGxhdGVSZWY8UmVzb3VyY2VNb2RhbENvbnRleHQ+O1xuICAgIEBWaWV3Q2hpbGQoJ3NvY2lhbEVkaXRNb2RhbCcpIHNvY2lhbEVkaXRNb2RhbDogVGVtcGxhdGVSZWY8Q3VzdG9tVXBsb2FkZXJDb21wb25lbnQ+O1xuICAgIEBWaWV3Q2hpbGQoJ3F1ZXN0aW9uc0VkaXRNb2RhbCcpIHF1ZXN0aW9uc0VkaXRNb2RhbDogVGVtcGxhdGVSZWY8Q3VzdG9tVXBsb2FkZXJDb21wb25lbnQ+O1xuXG4gICAgZWRpdGluZ1F1ZXN0aW9ucyA9IFtdO1xuICAgIGlzSHVic3BvdFJlYWR5OiBib29sZWFuO1xuICAgIHByaXZhdGUgaGVpZ2h0Q2hlY2tUaW1lb3V0O1xuICAgIHByaXZhdGUgaHVic3BvdFJlYWR5VGltZW91dDtcblxuICAgIC8vIEZvb3RlciBpcyBhbHdheXMgdmlzaWJsZSB0byBwcmV2ZW50IGxheW91dCBzaGlmdFxuICAgIC8vIFJlbW92ZWQgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgbGF6eSBsb2FkaW5nXG5cbiAgICBvcGVuUXVlc3Rpb25zRWRpdE1vZGFsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRpbmdRdWVzdGlvbnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZWRpdGluZ1F1ZXN0aW9ucyA/PyBbXSkpO1xuICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMucXVlc3Rpb25zRWRpdE1vZGFsLCB7IGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbGcnIH0pO1xuICAgIH1cblxuICAgIGVkaXRpbmdZb3V0dWJlVXJsOiBzdHJpbmc7XG4gICAgZWRpdGluZ0xpbmtlZEluVXJsOiBzdHJpbmc7XG4gICAgZWRpdGluZ0NvbXBhbnlOYW1lOiBzdHJpbmc7XG5cbiAgICBmb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xuXG4gICAgcmVjYXB0Y2hhID0gbnVsbDtcblxuICAgIHByZXZpZXdEYXRhO1xuXG4gICAgQElucHV0KCkgc3Vic2NyaXB0aW9uSWQgPSB0aGlzLmFwcENvbmZpZy5jcm0uc3Vic2NyaXB0aW9uX2lkO1xuICAgIEBJbnB1dCgpIHNvdXJjZUlkID0gdGhpcy5hcHBDb25maWcuY3JtLnNvdXJjZV9pZDtcbiAgICBASW5wdXQoKSBtYXN0ZXJTdWJzY3JpcHRpb25JZCA9IHRoaXMuYXBwQ29uZmlnLm1hc3Rlcl9zdWJzY3JpcHRpb24uc3Vic2NyaXB0aW9uX2lkO1xuICAgIEBJbnB1dCgpIGV4cGVyaW1lbnROYW1lO1xuICAgIEBJbnB1dCgpIG1pY3Jvc2VydmljZU5hbWU7XG4gICAgQElucHV0KCkgc2hhcmROYW1lO1xuICAgIEBJbnB1dCgpIHVzZXI6IFVzZXI7XG5cbiAgICBjYW5FZGl0UmVzb3VyY2VzVmFsdWUgPSBmYWxzZTtcbiAgICBASW5wdXQoKSB1c2VyTG9nZ2VkSW46IGJvb2xlYW47XG5cbiAgICBpZDtcblxuICAgIGxvZ28gPSB0aGlzLmFwcENvbmZpZz8uY29tcGFueT8ubG9nb3M/Lm1haW5fY29udHJhc3Q/LnVybDtcbiAgICB0cmlhbEJnSW1hZ2UyID0gdGhpcy5hcHBDb25maWc/LnNpZ251cF9jb25maWcudHJpYWw/LmltYWdlX2JnMj8udXJsO1xuICAgIHRvc0lkID0gdGhpcy5hcHBDb25maWc/Lm1haW5fdG9zX2lkO1xuICAgIGRlc2NyaXB0aW9uID0gdGhpcy5hcHBDb25maWcuY29tcGFueS5kZXNjcmlwdGlvbjtcbiAgICBlbWFpbCA9IHRoaXMuYXBwQ29uZmlnLmNvbXBhbnkuZW1haWw7XG4gICAgY29tcGFueU5hbWUgPSB0aGlzLmFwcENvbmZpZy5jb21wYW55Lm5hbWU7XG4gICAgc3RyZWV0ID0gdGhpcy5hcHBDb25maWcuY29tcGFueS5zdHJlZXQ7XG4gICAgcXVlc3Rpb25zID0gdGhpcy5hcHBDb25maWc/LnBhZ2VzX2NvbmZpZz8uY29udGFjdF91cz8ucXVlc3Rpb25zO1xuICAgIGh1YnNwb3QgPSB0aGlzLmFwcENvbmZpZz8ucGFnZXNfY29uZmlnPy5jb250YWN0X3VzPy5odWJzcG90O1xuICAgIGZvb3RlckxpbmtzID0gdGhpcy5hcHBDb25maWc/LnBhZ2VzX2NvbmZpZz8uZm9vdGVyX2xpbmtzPy5pdGVtcztcblxuICAgIGZvb3RlckxpbmtzRGF0YSA9IHRoaXMuYXBwQ29uZmlnPy5wYWdlc19jb25maWc/LmZvb3Rlcl9saW5rcztcblxuICAgIHlvdXR1YmVVcmwgPSB0aGlzLmFwcENvbmZpZy5zb2NpYWw/LnlvdXR1YmVfdXJsO1xuICAgIGxpbmtlZEluVXJsID0gdGhpcy5hcHBDb25maWcuc29jaWFsPy5saW5rZWRpbl91cmw7XG4gICAgZG9tYWluSWQgPSB0aGlzLmFwcENvbmZpZy5kb21haW5faWQ7XG5cbiAgICBlZGl0aW5nRW1haWwgPSB0aGlzLmVtYWlsO1xuICAgIGlzRWRpdGluZ0VtYWlsID0gZmFsc2U7XG5cbiAgICBlZGl0aW5nSHVic3BvdEh0bWw6IHN0cmluZztcbiAgICBlZGl0aW5nSHVic3BvdElkOiBzdHJpbmc7XG4gICAgY2FwdGNoYUtleVYyOiBzdHJpbmc7XG4gICAgaHVic3BvdEh0bWw7XG5cbiAgICBhYlRlc3RzO1xuXG4gICAgc3VibWl0dGVkID0gZmFsc2U7XG4gICAgaXNDYXB0Y2hhVmVyaWZpZWQgPSBmYWxzZTtcbiAgICBpc0VtYWlsVmFsaWQgPSB0cnVlO1xuICAgIGlzRWRpdGluZ1N0cmVldCA9IGZhbHNlO1xuXG4gICAgcHNhT3B0aW9ucztcblxuICAgIHF1ZXN0aW9uO1xuXG4gICAgZWRpdGluZ0Zvb3RlckxpbmtzID0ge1xuICAgICAgICBpdGVtczogW11cbiAgICB9O1xuICAgIGVkaXRpbmdTdHJlZXQ6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGZiOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGNybVNlcnZpY2U6IENybVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYWRtaW5TZXJ2aWNlOiBBZG1pblNlcnZpY2UsXG4gICAgICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBhYlRlc3RTZXJ2aWNlOiBBYlRlc3RTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG1vZGFsU2VydmljZTogTmdiTW9kYWwsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudDogRG9jdW1lbnRcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xuICAgICAgICB0aGlzLmNhcHRjaGFLZXlWMiA9IHRoaXMuYXBwQ29uZmlnLmludGVncmF0aW9ucy5jYXB0Y2hhX2tleV9WMjtcbiAgICAgICAgdGhpcy5jb250YWN0VXNGb3JtKCk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIC8vIERlZmVyIEh1YnNwb3QgcmVhZHkgc3RhdGUgdG8gYXZvaWQgYmxvY2tpbmcgaW5pdGlhbCByZW5kZXJcbiAgICAgICAgLy8gVXNlIHJlcXVlc3RJZGxlQ2FsbGJhY2sgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2Ugc2V0VGltZW91dCB3aXRoIGxvbmdlciBkZWxheVxuICAgICAgICBpZiAoJ3JlcXVlc3RJZGxlQ2FsbGJhY2snIGluIHdpbmRvdykge1xuICAgICAgICAgICAgcmVxdWVzdElkbGVDYWxsYmFjayhcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMuaXNIdWJzcG90UmVhZHkgPSB0cnVlKSwgMCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeyB0aW1lb3V0OiAyMDAwIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzSHVic3BvdFJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIH0sIDIwMDApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudXNlckxvZ2dlZEluKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZS5nZXRJdGVtJCgncHJvZHVjdCcpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSByZXMgPyBKU09OLnBhcnNlKHJlcykgOiBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuaWQgPSBkYXRhPy5zdWJzY3JpcHRpb25JZDtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJldmlld0RhdGEgPSB7XG4gICAgICAgICAgICB1cmw6IHRoaXMubG9nbyxcbiAgICAgICAgICAgIG5hbWU6ICdsb2dvX21haW5fY29udHJhc3QucG5nJ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVkaXRpbmdTdHJlZXQgPSB0aGlzLnN0cmVldDtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5hcHBDb25maWcucGFnZXNfY29uZmlnPy5hYl90ZXN0cykpIHtcbiAgICAgICAgICAgIHRoaXMuYWJUZXN0cyA9IHRoaXMuYXBwQ29uZmlnLnBhZ2VzX2NvbmZpZy5hYl90ZXN0cy5maW5kKFxuICAgICAgICAgICAgICAgIHRlc3QgPT4gdGVzdC5kZXNjcmlwdGlvbiA9PT0gJ2NvbnRhY3QtdXMnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5taWNyb3NlcnZpY2VOYW1lID0gdGhpcy5hYlRlc3RzPy5taWNyb3NlcnZpY2VfbmFtZTtcbiAgICAgICAgICAgIHRoaXMuZXhwZXJpbWVudE5hbWUgPSB0aGlzLmFiVGVzdHM/LmV4cGVyaW1lbnRfbmFtZTtcbiAgICAgICAgICAgIHRoaXMuc2hhcmROYW1lID0gdGhpcy5hYlRlc3RzPy5kYl9zaGFyZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvb3Rlckl0ZW0gPSB0aGlzLmdldEZvb3Rlckh1YnNwb3RGb3JtKCk7XG4gICAgICAgIGlmIChmb290ZXJJdGVtPy5kaXYpIHtcbiAgICAgICAgICAgIC8vIE5PU09OQVI6IFRydXN0ZWQgSFRNTCBjb250ZW50IGlzIGhhbmRsZWQgc2FmZWx5IGhlcmVcbiAgICAgICAgICAgIHRoaXMuaHVic3BvdEh0bWwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChmb290ZXJJdGVtLmRpdik7IC8vIE5PU09OQVJcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRpbmdRdWVzdGlvbnMgPSB0aGlzLnF1ZXN0aW9ucztcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IHRoaXMucXVlc3Rpb25zPy5bMF0/LnF1ZXN0aW9uO1xuICAgICAgICB0aGlzLnBzYU9wdGlvbnMgPSBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnU2VsZWN0IFBTQScsIHZhbHVlOiAnJyB9LFxuICAgICAgICAgICAgLi4uKHRoaXMucXVlc3Rpb25zPy5bMF0/Lm9wdGlvbnMgPz8gW10pXG4gICAgICAgICAgICAgICAgLmZpbHRlcihxID0+IHEub3B0aW9uPy50cmltKCkpXG4gICAgICAgICAgICAgICAgLm1hcChxID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBxLm9wdGlvbixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHEub3B0aW9uXG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgIF07XG4gICAgfVxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgaWYgKGNoYW5nZXNbJ3VzZXInXSB8fCBjaGFuZ2VzWyd1c2VyTG9nZ2VkSW4nXSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudXNlckxvZ2dlZEluICYmIHRoaXMudXNlcikge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FuRWRpdFJlc291cmNlc1ZhbHVlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvcGVuTG9nb0VkaXRNb2RhbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLmxvZ29Nb2RhbCwge1xuICAgICAgICAgICAgY2VudGVyZWQ6IHRydWUsXG4gICAgICAgICAgICBzaXplOiAnbWQnXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uU2F2ZUZpbGUoZXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHsgc3Vic2NyaXB0aW9uX2lkOiB0aGlzLnN1YnNjcmlwdGlvbklkIH07XG5cbiAgICAgICAgaWYgKGV2ZW50LmZpbGUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgICAgICBkYXRhW2V2ZW50Lm5hbWVdID0gZXZlbnQuZmlsZTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5maWxlID09PSBudWxsKSB7XG4gICAgICAgICAgICBkYXRhW2ByZW1vdmVfJHtldmVudC5uYW1lfWBdID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIGRhdGFba2V5XSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFkbWluU2VydmljZS51cGRhdGVEb21haW5Db25maWcodGhpcy5kb21haW5JZCwgZm9ybURhdGEpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZmlsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nbyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZXZlbnQuZmlsZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2UuZGlzbWlzc0FsbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50b2FzdC5zdWNjZXNzKGV2ZW50LmZpbGUgPyAnTG9nbyB1cGRhdGVkJyA6ICdMb2dvIHJlbW92ZWQnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2F2ZVF1ZXN0aW9ucyhtb2RhbCk6IHZvaWQge1xuICAgICAgICBjb25zdCB1cGRhdGVEYXRhID0ge1xuICAgICAgICAgICAgY29udGFjdF91czoge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuYXBwQ29uZmlnLnBhZ2VzX2NvbmZpZz8uY29udGFjdF91cyxcbiAgICAgICAgICAgICAgICBxdWVzdGlvbnM6IHRoaXMuZWRpdGluZ1F1ZXN0aW9uc1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbl9pZDogdGhpcy5pZFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuYWRtaW5TZXJ2aWNlLnVwZGF0ZURvbWFpbkNvbmZpZyh0aGlzLmRvbWFpbklkLCB1cGRhdGVEYXRhKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbnMgPSB0aGlzLmVkaXRpbmdRdWVzdGlvbnM7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LnN1Y2Nlc3MoJ1F1ZXN0aW9ucyB1cGRhdGVkJyk7XG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uID0gdGhpcy5lZGl0aW5nUXVlc3Rpb25zPy5bMF0/LnF1ZXN0aW9uO1xuICAgICAgICAgICAgaWYgKHRoaXMuZWRpdGluZ1F1ZXN0aW9ucz8uWzBdPy5vcHRpb25zPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wc2FPcHRpb25zID0gW1xuICAgICAgICAgICAgICAgICAgICB7IGxhYmVsOiAnU2VsZWN0IFBTQScsIHZhbHVlOiAnJyB9LFxuICAgICAgICAgICAgICAgICAgICAuLi4odGhpcy5xdWVzdGlvbnM/LlswXT8ub3B0aW9ucyA/PyBbXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIocSA9PiBxLm9wdGlvbj8udHJpbSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChxID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHEub3B0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBxLm9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wc2FPcHRpb25zID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1vZGFsLmNsb3NlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFkZE5ld1F1ZXN0aW9uKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRpbmdRdWVzdGlvbnMucHVzaCh7IHF1ZXN0aW9uOiAnJywgb3B0aW9uczogW10gfSk7XG4gICAgfVxuXG4gICAgYWRkUXVlc3Rpb25PcHRpb24ocUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0aW5nUXVlc3Rpb25zW3FJbmRleF0ub3B0aW9ucy5wdXNoKHsgb3B0aW9uOiAnJyB9KTtcbiAgICB9XG5cbiAgICByZW1vdmVRdWVzdGlvbk9wdGlvbihxSW5kZXg6IG51bWJlciwgb3B0SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRpbmdRdWVzdGlvbnNbcUluZGV4XS5vcHRpb25zLnNwbGljZShvcHRJbmRleCwgMSk7XG4gICAgfVxuXG4gICAgZHJvcFF1ZXN0aW9ucyhldmVudCk6IHZvaWQge1xuICAgICAgICBtb3ZlSXRlbUluQXJyYXkodGhpcy5lZGl0aW5nUXVlc3Rpb25zLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuICAgIH1cblxuICAgIGRyb3BRdWVzdGlvbk9wdGlvbnMocUluZGV4OiBudW1iZXIsIGV2ZW50KTogdm9pZCB7XG4gICAgICAgIG1vdmVJdGVtSW5BcnJheShcbiAgICAgICAgICAgIHRoaXMuZWRpdGluZ1F1ZXN0aW9uc1txSW5kZXhdLm9wdGlvbnMsXG4gICAgICAgICAgICBldmVudC5wcmV2aW91c0luZGV4LFxuICAgICAgICAgICAgZXZlbnQuY3VycmVudEluZGV4XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgb3BlblNvY2lhbEVkaXRNb2RhbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0aW5nWW91dHViZVVybCA9IHRoaXMueW91dHViZVVybDtcbiAgICAgICAgdGhpcy5lZGl0aW5nTGlua2VkSW5VcmwgPSB0aGlzLmxpbmtlZEluVXJsO1xuICAgICAgICB0aGlzLmVkaXRpbmdDb21wYW55TmFtZSA9IHRoaXMuY29tcGFueU5hbWU7XG5cbiAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLnNvY2lhbEVkaXRNb2RhbCwgeyBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ2xnJyB9KTtcbiAgICB9XG5cbiAgICBzYXZlU29jaWFsTGlua3MobW9kYWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdXBkYXRlRGF0YSA9IHtcbiAgICAgICAgICAgIHlvdXR1YmVfdXJsOiB0aGlzLmVkaXRpbmdZb3V0dWJlVXJsLFxuICAgICAgICAgICAgbGlua2VkaW5fdXJsOiB0aGlzLmVkaXRpbmdMaW5rZWRJblVybCxcbiAgICAgICAgICAgIGNvbXBhbnlfbmFtZTogdGhpcy5lZGl0aW5nQ29tcGFueU5hbWUsXG4gICAgICAgICAgICBzdWJzY3JpcHRpb25faWQ6IHRoaXMuaWRcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmFkbWluU2VydmljZS51cGRhdGVEb21haW5Db25maWcodGhpcy5kb21haW5JZCwgdXBkYXRlRGF0YSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMueW91dHViZVVybCA9IHRoaXMuZWRpdGluZ1lvdXR1YmVVcmw7XG4gICAgICAgICAgICB0aGlzLmxpbmtlZEluVXJsID0gdGhpcy5lZGl0aW5nTGlua2VkSW5Vcmw7XG4gICAgICAgICAgICB0aGlzLmNvbXBhbnlOYW1lID0gdGhpcy5lZGl0aW5nQ29tcGFueU5hbWU7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LnN1Y2Nlc3MoJ1NvY2lhbCBsaW5rcyBhbmQgY29tcGFueSBuYW1lIHVwZGF0ZWQnKTtcbiAgICAgICAgICAgIG1vZGFsLmNsb3NlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGhhc1ZhbGlkT3B0aW9ucygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb25zPy5bMF0/Lm9wdGlvbnM/LnNvbWUob3B0ID0+IG9wdC5vcHRpb24/LnRyaW0oKSk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICAvLyBEZWZlciBpZnJhbWUgd2F0Y2hpbmcgdG8gYXZvaWQgYmxvY2tpbmcgaW5pdGlhbCByZW5kZXJcbiAgICAgICAgLy8gVXNlIHJlcXVlc3RJZGxlQ2FsbGJhY2sgb3Igc2V0VGltZW91dCB0byBkZWZlciB0byBuZXh0IGV2ZW50IGxvb3BcbiAgICAgICAgaWYgKCdyZXF1ZXN0SWRsZUNhbGxiYWNrJyBpbiB3aW5kb3cpIHtcbiAgICAgICAgICAgIHJlcXVlc3RJZGxlQ2FsbGJhY2soXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndhdGNoSWZyYW1lSGVpZ2h0Q2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7IHRpbWVvdXQ6IDEwMDAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMud2F0Y2hJZnJhbWVIZWlnaHRDaGFuZ2UoKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlbW92ZWQgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgdG8gcHJldmVudCBsYXlvdXQgc2hpZnRcbiAgICAgICAgLy8gRm9vdGVyIGlzIG5vdyB2aXNpYmxlIGltbWVkaWF0ZWx5LCBzcGFjZSBpcyByZXNlcnZlZCB2aWEgQ1NTIG1pbi1oZWlnaHRcbiAgICB9XG5cbiAgICBvcGVuRWRpdEZvb3RlckxpbmtzTW9kYWwoY29udGVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvb3RlckxpbmtzRGF0YSA9IHRoaXMuZm9vdGVyTGlua3NEYXRhID8/IHt9O1xuICAgICAgICB0aGlzLmZvb3RlckxpbmtzRGF0YS5pdGVtcyA9IHRoaXMuZm9vdGVyTGlua3NEYXRhLml0ZW1zID8/IFtdO1xuICAgICAgICB0aGlzLmVkaXRpbmdGb290ZXJMaW5rcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5mb290ZXJMaW5rc0RhdGEpKTtcblxuICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKGNvbnRlbnQsIHtcbiAgICAgICAgICAgIHNpemU6ICdsZycsXG4gICAgICAgICAgICBjZW50ZXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIHdpbmRvd0NsYXNzOiAnbW9kYWwtaG9sZGVyJ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdhdGNoSWZyYW1lSGVpZ2h0Q2hhbmdlKCkge1xuICAgICAgICBjb25zdCBpZnJhbWUgPSB0aGlzLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5odWJzcG90LWNvbnRhaW5lcicpO1xuICAgICAgICBpZiAoIWlmcmFtZSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFVzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgZm9yIGJldHRlciBwZXJmb3JtYW5jZSBpbnN0ZWFkIG9mIHNldEludGVydmFsXG4gICAgICAgIC8vIFRoaXMgcmVkdWNlcyBibG9ja2luZyB0aW1lIGFuZCBpcyBtb3JlIGVmZmljaWVudFxuICAgICAgICBsZXQgbGFzdEhlaWdodCA9IDA7XG4gICAgICAgIGxldCBjaGVja0NvdW50ID0gMDtcbiAgICAgICAgY29uc3QgbWF4Q2hlY2tzID0gMjA7IC8vIFN0b3AgYWZ0ZXIgfjEwIHNlY29uZHMgKDIwICogNTAwbXMpXG5cbiAgICAgICAgY29uc3QgY2hlY2tIZWlnaHQgPSAoKSA9PiB7XG4gICAgICAgICAgICBjaGVja0NvdW50Kys7XG4gICAgICAgICAgICBjb25zdCBuZXdIZWlnaHQgPSBpZnJhbWVbJ29mZnNldEhlaWdodCddO1xuICAgICAgICAgICAgaWYgKG5ld0hlaWdodCA9PT0gMjUwICYmIG5ld0hlaWdodCAhPT0gbGFzdEhlaWdodCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFiVGVzdEZpbmlzaCgpO1xuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gU3RvcCBjaGVja2luZyBvbmNlIHRhcmdldCBoZWlnaHQgaXMgcmVhY2hlZFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdEhlaWdodCA9IG5ld0hlaWdodDtcbiAgICAgICAgICAgIC8vIENoZWNrIGxlc3MgZnJlcXVlbnRseSAoZXZlcnkgfjUwMG1zIGVxdWl2YWxlbnQpIHVzaW5nIHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICAgICAgLy8gT25seSBjb250aW51ZSBpZiBoZWlnaHQgaGFzbid0IHJlYWNoZWQgdGFyZ2V0IGFuZCB3ZSBoYXZlbid0IGV4Y2VlZGVkIG1heCBjaGVja3NcbiAgICAgICAgICAgIGlmIChuZXdIZWlnaHQgIT09IDI1MCAmJiBjaGVja0NvdW50IDwgbWF4Q2hlY2tzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWlnaHRDaGVja1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNoZWNrSGVpZ2h0KTtcbiAgICAgICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFN0YXJ0IGNoZWNraW5nIGFmdGVyIGEgc2hvcnQgZGVsYXkgdG8gYXZvaWQgYmxvY2tpbmcgaW5pdGlhbCByZW5kZXJcbiAgICAgICAgdGhpcy5oZWlnaHRDaGVja1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShjaGVja0hlaWdodCk7XG4gICAgICAgIH0sIDEwMCk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIC8vIENsZWFuIHVwIHRpbWVvdXRzIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzXG4gICAgICAgIGlmICh0aGlzLmhlaWdodENoZWNrVGltZW91dCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaGVpZ2h0Q2hlY2tUaW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5odWJzcG90UmVhZHlUaW1lb3V0KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5odWJzcG90UmVhZHlUaW1lb3V0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5ldyBtZXRob2QgdG8gaGFuZGxlIEh1YnNwb3QgY29udGVudCBsb2FkaW5nXG4gICAgb25IdWJzcG90TG9hZChldmVudDogRXZlbnQpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxEaXZFbGVtZW50O1xuICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnY29udGVudC1sb2FkZWQnKTtcblxuICAgICAgICAvLyBEZWZlciBsYXlvdXQgcmVjYWxjdWxhdGlvbiB0byBhdm9pZCBibG9ja2luZ1xuICAgICAgICBpZiAoJ3JlcXVlc3RJZGxlQ2FsbGJhY2snIGluIHdpbmRvdykge1xuICAgICAgICAgICAgcmVxdWVzdElkbGVDYWxsYmFjaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdyZXNpemUnKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgncmVzaXplJykpO1xuICAgICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2FsbEFiVGVzdEZpbmlzaCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZXhwZXJpbWVudE5hbWUgJiYgdGhpcy5taWNyb3NlcnZpY2VOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmFiVGVzdFNlcnZpY2VcbiAgICAgICAgICAgICAgICAuZmluaXNoQUJFeHBlcmltZW50KHRoaXMuZXhwZXJpbWVudE5hbWUsIHRoaXMubWljcm9zZXJ2aWNlTmFtZSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLmNvbnRlbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Q2xhc3M6ICdtb2RhbC1ob2xkZXInXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29udGFjdFVzRm9ybSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICBmaXJzdF9uYW1lOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgICAgbGFzdF9uYW1lOiBbJyddLFxuICAgICAgICAgICAgY29tcGFueTogWycnXSxcbiAgICAgICAgICAgIHBzYTogWycnXSxcbiAgICAgICAgICAgIGVucXVpcnk6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgICAgICBlbWFpbDogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvblN1Ym1pdCgpIHtcbiAgICAgICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5mb3JtLnZhbGlkKSB7XG4gICAgICAgICAgICB0aGlzLmlzQ2FwdGNoYVZlcmlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0dGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVTdWNjZXNzKHRva2VuOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLnZhbGlkYXRlUmVDYXB0Y2hhKHRva2VuKS5zdWJzY3JpYmUoKGlzU3VjY2VzczogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpc1N1Y2Nlc3MgJiYgdGhpcy5mb3JtLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7IC4uLnRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpIH07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZEVucXVpcnkgPSBgJHtkYXRhLmVucXVpcnl9OyBRdWVzdGlvbjogJHt0aGlzLnF1ZXN0aW9ufTsgQW5zd2VyOiAke2RhdGEucHNhfWA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvc3REYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfbmFtZTogYCR7ZGF0YS5maXJzdF9uYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0X25hbWU6IGAke2RhdGEuZmlyc3RfbmFtZX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFueTogYCR7ZGF0YS5maXJzdF9uYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbWFpbDogYCR7ZGF0YS5lbWFpbH1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5xdWlyeTogdGhpcy5wc2FPcHRpb25zLmxlbmd0aCA/IGZvcm1hdHRlZEVucXVpcnkgOiBgJHtkYXRhLmVucXVpcnl9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBzYTogZGF0YS5wc2EsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25faWQ6IHRoaXMuc3Vic2NyaXB0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjcm1fc291cmNlX2lkOiB0aGlzLnNvdXJjZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFzdGVyX3N1YnNjcmlwdGlvbl9pZDogdGhpcy5tYXN0ZXJTdWJzY3JpcHRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeV91c2VyOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzX21hbnVhbDogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNybVNlcnZpY2UucG9zdENybUxlYWQodGhpcy5zdWJzY3JpcHRpb25JZCwgcG9zdERhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICBleGFtcGxlIG9mIHNuaXBwZXQgdG8gY2xvc2UgdGhlIGV4cGVyaW1lbnQgYW5kIHRyYWNrIGluIEdBXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcD8uc3RhdHVzID09PSBTdGF0dXNDb2Rlcy5PSykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ29vZ2xlQW5hbHl0aWNzU2VydmljZS5zZW5kRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduZXctbGVhZC1yZWdpc3RyYXRpb24nLCAvLyBjYXRlZ29yeSwgZWc6IHZpZGVvc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3Vic2NyaWJlLXN1Y2Nlc3MnLCAvLyBhY3Rpb24sIGVnOiBQbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb21pbmctc29vbi10aHJlZScsIC8vIGxhYmVsLCBlZzogQ2hhcHB5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLy8gdmFsdWUsIGVnOiAxMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZXhwZXJpbWVudE5hbWUgJiYgdGhpcy5taWNyb3NlcnZpY2VOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWJUZXN0U2VydmljZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmlzaEFCRXhwZXJpbWVudCh0aGlzLmV4cGVyaW1lbnROYW1lLCB0aGlzLm1pY3Jvc2VydmljZU5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMuY29udGVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Q2xhc3M6ICdtb2RhbC1ob2xkZXInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2FsLmZpcmUocmVzcC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0ucmVzZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNDYXB0Y2hhVmVyaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzY3JvbGxUb1RvcCgpIHtcbiAgICAgICAgdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgICB9XG5cbiAgICBnZXRGb290ZXJIdWJzcG90Rm9ybSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmh1YnNwb3Q/Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaHVic3BvdC5maW5kKGl0ZW0gPT4gaXRlbS5wb3NpdGlvbiA9PT0gJ2Zvb3RlcicpID8/IG51bGw7XG4gICAgfVxuXG4gICAgbmF2aWdhdGVUb0Jvb2tNZWV0aW5nKCkge1xuICAgICAgICBjb25zdCBib29rRGVtb1VybCA9XG4gICAgICAgICAgICB0aGlzLmFwcENvbmZpZz8uc2lnbnVwX2NvbmZpZz8udHJpYWw/LmJvb2tfZGVtb191cmwgPz9cbiAgICAgICAgICAgICdodHRwczovL2NhbGVuZGx5LmNvbS9jbG91ZG9saXZlJztcbiAgICAgICAgd2luZG93Lm9wZW4oYm9va0RlbW9VcmwsICdfYmxhbmsnLCAnbm9yZWZlcnJlciBub29wZW5lcicpO1xuICAgIH1cblxuICAgIHZhbGlkYXRlRW1haWwoKSB7XG4gICAgICAgIGNvbnN0IGVtYWlsID0gdGhpcy5mb3JtLmdldCgnZW1haWwnKS52YWx1ZTtcbiAgICAgICAgaWYgKGVtYWlsKSB7XG4gICAgICAgICAgICB0aGlzLmlzRW1haWxWYWxpZCA9IFZhbGlkYXRpb25TZXJ2aWNlLmVtYWlsKGVtYWlsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaXNFbWFpbFZhbGlkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZEZvb3RlckxpbmsoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWRpdGluZ0Zvb3RlckxpbmtzLml0ZW1zLnB1c2goe1xuICAgICAgICAgICAgdGl0bGU6ICcnLFxuICAgICAgICAgICAgcGF0aDogJycsXG4gICAgICAgICAgICBzdWJ0aXRsZXM6IFtdXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbW92ZUZvb3RlckxpbmsoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRpbmdGb290ZXJMaW5rcy5pdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIGFkZFN1YnRpdGxlKGZvb3RlckluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0aW5nRm9vdGVyTGlua3MuaXRlbXNbZm9vdGVySW5kZXhdLnN1YnRpdGxlcy5wdXNoKHtcbiAgICAgICAgICAgIHRpdGxlOiAnJyxcbiAgICAgICAgICAgIHBhdGg6ICcnXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbW92ZVN1YnRpdGxlKGZvb3RlckluZGV4OiBudW1iZXIsIHN1YnRpdGxlSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRpbmdGb290ZXJMaW5rcy5pdGVtc1tmb290ZXJJbmRleF0uc3VidGl0bGVzLnNwbGljZShzdWJ0aXRsZUluZGV4LCAxKTtcbiAgICB9XG5cbiAgICBkcm9wRm9vdGVyTGlua3MoZXZlbnQpIHtcbiAgICAgICAgbW92ZUl0ZW1JbkFycmF5KHRoaXMuZWRpdGluZ0Zvb3RlckxpbmtzLml0ZW1zLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuICAgIH1cblxuICAgIGRyb3BTdWJ0aXRsZXMoZm9vdGVySW5kZXg6IG51bWJlciwgZXZlbnQpIHtcbiAgICAgICAgbW92ZUl0ZW1JbkFycmF5KFxuICAgICAgICAgICAgdGhpcy5lZGl0aW5nRm9vdGVyTGlua3MuaXRlbXNbZm9vdGVySW5kZXhdLnN1YnRpdGxlcyxcbiAgICAgICAgICAgIGV2ZW50LnByZXZpb3VzSW5kZXgsXG4gICAgICAgICAgICBldmVudC5jdXJyZW50SW5kZXhcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzYXZlRm9vdGVyTGlua3MobW9kYWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdXBkYXRlZENvbmZpZyA9IHtcbiAgICAgICAgICAgIGZvb3Rlcl9saW5rczogdGhpcy5lZGl0aW5nRm9vdGVyTGlua3MsXG4gICAgICAgICAgICBzdWJzY3JpcHRpb25faWQ6IHRoaXMuaWRcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmFkbWluU2VydmljZVxuICAgICAgICAgICAgLnVwZGF0ZURvbWFpbkNvbmZpZyh0aGlzLmFwcENvbmZpZz8uZG9tYWluX2lkLCB1cGRhdGVkQ29uZmlnKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zdWNjZXNzKCdGb290ZXIgbGlua3MgdXBkYXRlZCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9vdGVyTGlua3MgPSBbLi4udGhpcy5lZGl0aW5nRm9vdGVyTGlua3MuaXRlbXNdO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9vdGVyTGlua3NEYXRhID0geyAuLi50aGlzLmVkaXRpbmdGb290ZXJMaW5rcyB9O1xuICAgICAgICAgICAgICAgIG1vZGFsLmNsb3NlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzYXZlRW1haWwoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW1haWwgPSB0aGlzLmVkaXRpbmdFbWFpbDtcblxuICAgICAgICB0aGlzLmFkbWluU2VydmljZVxuICAgICAgICAgICAgLnVwZGF0ZURvbWFpbkNvbmZpZyh0aGlzLmFwcENvbmZpZz8uZG9tYWluX2lkLCB7XG4gICAgICAgICAgICAgICAgY29tcGFueV9lbWFpbDogdGhpcy5lZGl0aW5nRW1haWwsXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uX2lkOiB0aGlzLmlkXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zdWNjZXNzKCdFbWFpbCB1cGRhdGVkJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0VkaXRpbmdFbWFpbCA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2F2ZVN0cmVldCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hZG1pblNlcnZpY2VcbiAgICAgICAgICAgIC51cGRhdGVEb21haW5Db25maWcodGhpcy5hcHBDb25maWc/LmRvbWFpbl9pZCwge1xuICAgICAgICAgICAgICAgIGNvbXBhbnlfYWRkcmVzczogdGhpcy5lZGl0aW5nU3RyZWV0LFxuICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbl9pZDogdGhpcy5pZFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcygnU3RyZWV0IHVwZGF0ZWQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmVldCA9IHRoaXMuZWRpdGluZ1N0cmVldDtcbiAgICAgICAgICAgICAgICB0aGlzLmlzRWRpdGluZ1N0cmVldCA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2FuY2VsU3RyZWV0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRpbmdTdHJlZXQgPSB0aGlzLnN0cmVldDtcbiAgICAgICAgdGhpcy5pc0VkaXRpbmdTdHJlZXQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBvcGVuSHVic3BvdEVkaXRNb2RhbChmb290ZXJJdGVtKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWRpdGluZ0h1YnNwb3RIdG1sID0gZm9vdGVySXRlbS5kaXY7XG4gICAgICAgIHRoaXMuZWRpdGluZ0h1YnNwb3RJZCA9IGZvb3Rlckl0ZW0uaWQ7XG4gICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4odGhpcy5odWJzcG90RWRpdE1vZGFsLCB7IGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbGcnIH0pO1xuICAgIH1cblxuICAgIHNhdmVIdWJzcG90SHRtbChtb2RhbCk6IHZvaWQge1xuICAgICAgICBjb25zdCB1cGRhdGVkQ29uZmlnID0ge1xuICAgICAgICAgICAgY29udGFjdF91czoge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuYXBwQ29uZmlnPy5wYWdlc19jb25maWc/LmNvbnRhY3RfdXMsXG4gICAgICAgICAgICAgICAgaHVic3BvdDogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogJzc0MjM2MzknLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICdmb290ZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGl2OiB0aGlzLmVkaXRpbmdIdWJzcG90SHRtbFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbl9pZDogdGhpcy5pZFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuYWRtaW5TZXJ2aWNlXG4gICAgICAgICAgICAudXBkYXRlRG9tYWluQ29uZmlnKHRoaXMuYXBwQ29uZmlnPy5kb21haW5faWQsIHVwZGF0ZWRDb25maWcpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBOT1NPTkFSOiBUcnVzdGVkIEhUTUwgY29udGVudCBpcyBoYW5kbGVkIHNhZmVseSBoZXJlXG4gICAgICAgICAgICAgICAgdGhpcy5odWJzcG90SHRtbCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKHRoaXMuZWRpdGluZ0h1YnNwb3RIdG1sKTsgLy8gTk9TT05BUlxuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcygnSHVic3BvdCBFbWJlZCB1cGRhdGVkJyk7XG4gICAgICAgICAgICAgICAgbW9kYWwuY2xvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbiAgICBwcml2YXRlIHVwZGF0ZUNhbkVkaXRSZXNvdXJjZXNWYWx1ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jYW5FZGl0UmVzb3VyY2VzVmFsdWUgPSBIZWxwZXJTZXJ2aWNlLmNhbkVkaXRSZXNvdXJjZXMoXG4gICAgICAgICAgICB0aGlzLnVzZXIsXG4gICAgICAgICAgICB0aGlzLnVzZXJMb2dnZWRJbixcbiAgICAgICAgICAgIHRoaXMucGVybWlzc2lvblNlcnZpY2VcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjYW5FZGl0UmVzb3VyY2VzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW5FZGl0UmVzb3VyY2VzVmFsdWU7XG4gICAgfVxufVxuIiwiPHNlY3Rpb24gICNmb290ZXJTZWN0aW9uIGNsYXNzPVwiYmctYmxhY2sgdGV4dC13aGl0ZSBweS01IGZvb3Rlci1zZWN0aW9uXCI+XG4gIDxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG5cbiAgICAgIDwhLS0gTEVGVCBDT0xVTU4gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgbWItNCBkLWZsZXggZmxleC1jb2x1bW4ganVzdGlmeS1jb250ZW50LWJldHdlZW5cIiBbbmdDbGFzc109XCJ7ICdzaXRlLWNvbHVtbic6IGdldEZvb3Rlckh1YnNwb3RGb3JtKCkgfVwiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxoMyBjbGFzcz1cIm1iLTQgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0yIHRleHQtd2hpdGVcIj5TaXRlIE1hcDo8L3NwYW4+XG4gICAgICAgICAgICA8aSAqbmdJZj1cImNhbkVkaXRSZXNvdXJjZXNWYWx1ZVwiIGNsYXNzPVwiZmEgZmEtZWRpdCBpbi1wYWdlLWVkaXQtaWNvbiBjdXJzb3ItcG9pbnRlciB0ZXh0LXdoaXRlIG1zLTNcIiAoY2xpY2spPVwib3BlbkVkaXRGb290ZXJMaW5rc01vZGFsKGVkaXRGb290ZXJMaW5rc01vZGFsKVwiIChrZXlkb3duLmVudGVyKT1cIm9wZW5FZGl0Rm9vdGVyTGlua3NNb2RhbChlZGl0Rm9vdGVyTGlua3NNb2RhbClcIiAoa2V5ZG93bi5zcGFjZSk9XCJvcGVuRWRpdEZvb3RlckxpbmtzTW9kYWwoZWRpdEZvb3RlckxpbmtzTW9kYWwpXCIgbmdiVG9vbHRpcD1cIkVkaXQgRm9vdGVyIExpbmtzXCI+PC9pPlxuICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgPHVsIGNsYXNzPVwibXQtNFwiPlxuICAgICAgICAgICAgPGxpIHJvdXRlckxpbms9XCIvXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgdXNlci1pbmZvLWxhYmVsIGxpbmstbGFiZWxcIj4gSG9tZSA8L2xpPlxuICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBsaW5rIG9mIGZvb3RlckxpbmtzXCIgW3JvdXRlckxpbmtdPVwibGluaz8ucGF0aFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgdXNlci1pbmZvLWxhYmVsIGxpbmstbGFiZWwgbXQtNFwiPjxzcGFuICAqbmdJZj1cImxpbms/LnRpdGxlXCI+e3tsaW5rPy50aXRsZX19PC9zcGFuPiA8L2xpPlxuICAgICAgICAgICAgPGxpIHJvdXRlckxpbms9XCIvbG9naW5cIlxuICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIHVzZXItaW5mby1sYWJlbCBtdC00IGxpbmstbGFiZWxcIj4gTG9nIGluIDwvbGk+XG4gICAgICAgICAgICA8bGkgW3JvdXRlckxpbmtdPVwiJy9wcml2YWN5LWFuZC10b3MvJyArIHRvc0lkXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciB1c2VyLWluZm8tbGFiZWwgbXQtNCBsaW5rLWxhYmVsXCI+IFByaXZhY3kgc3RhdGVtZW50IDwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgICA8cCBjbGFzcz1cImFkZHJlc3Mtc2VjdGlvbiBlbWFpbC1zZWN0aW9uIG1iLTRcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidXNlci1pbmZvLWxhYmVsXCI+RW1haWw6IDwvc3Bhbj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNFZGl0aW5nRW1haWw7IGVsc2UgZWRpdEVtYWlsXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidXNlci1pbmZvXCI+e3sgZW1haWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxpICpuZ0lmPVwiY2FuRWRpdFJlc291cmNlc1ZhbHVlXCIgY2xhc3M9XCJmYSBmYS1lZGl0IGluLXBhZ2UtZWRpdC1pY29uIHRleHQtd2hpdGUgY3Vyc29yLXBvaW50ZXIgbXMtM1wiIChjbGljayk9XCJpc0VkaXRpbmdFbWFpbCA9IHRydWVcIiAoa2V5ZG93bi5lbnRlcik9XCJpc0VkaXRpbmdFbWFpbCA9IHRydWVcIiAoa2V5ZG93bi5zcGFjZSk9XCJpc0VkaXRpbmdFbWFpbCA9IHRydWVcIj48L2k+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlZGl0RW1haWw+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGQtaW5saW5lIHctYXV0b1wiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJlZGl0aW5nRW1haWxcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tcHJpbWFyeSBtcy0yXCIgKGNsaWNrKT1cInNhdmVFbWFpbCgpXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5IG1zLTJcIiAoY2xpY2spPVwiaXNFZGl0aW5nRW1haWwgPSBmYWxzZVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW1haWwtc2VjdGlvbiBtdC0zIGFkZHJlc3MtdGV4dFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1c2VyLWluZm8tbGFiZWxcIj5cbiAgICAgICAgICAgICAgQWRkcmVzczpcbiAgICAgICAgICAgICAgPGkgKm5nSWY9XCJjYW5FZGl0UmVzb3VyY2VzVmFsdWVcIlxuICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLWVkaXQgaW4tcGFnZS1lZGl0LWljb24gY3Vyc29yLXBvaW50ZXIgbXMtMiB0ZXh0LXdoaXRlXCJcbiAgICAgICAgICAgICAgICAgdGl0bGU9XCJFZGl0IEFkZHJlc3NcIlxuICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaXNFZGl0aW5nU3RyZWV0ID0gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImlzRWRpdGluZ1N0cmVldCA9IHRydWVcIlxuICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJpc0VkaXRpbmdTdHJlZXQgPSB0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPC9zcGFuPjxici8+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNFZGl0aW5nU3RyZWV0OyBlbHNlIGVkaXRTdHJlZXRCbG9ja1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFkZHJlc3MtdGV4dCB1c2VyLWluZm9cIj57eyBzdHJlZXQgfX08L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlZGl0U3RyZWV0QmxvY2s+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG10LTNcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgWyhuZ01vZGVsKV09XCJlZGl0aW5nU3RyZWV0XCIgLz5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tcHJpbWFyeSBtcy0yXCIgKGNsaWNrKT1cInNhdmVTdHJlZXQoKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5IG1zLTJcIiAoY2xpY2spPVwiY2FuY2VsU3RyZWV0KClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgICAgPGltZyBbc3JjXT1cImxvZ29cIlxuICAgICAgICAgICAgICAgYWx0PVwiQ29tcGFueSBsb2dvXCJcbiAgICAgICAgICAgICAgIGNsYXNzPVwiaW1nLWZsdWlkIG10LTQgbG9nby1pbWFnZSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICB3aWR0aD1cIjE2MFwiXG4gICAgICAgICAgICAgICBoZWlnaHQ9XCIzNVwiXG4gICAgICAgICAgICAgICAoY2xpY2spPVwic2Nyb2xsVG9Ub3AoKVwiXG4gICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzY3JvbGxUb1RvcCgpXCJcbiAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cInNjcm9sbFRvVG9wKClcIlxuICAgICAgICAgICAgICAgdGl0bGU9XCJDbGljayB0byBnbyB0byB0b3Agb2YgcGFnZVwiIC8+XG4gICAgICAgICAgPGkgKm5nSWY9XCJjYW5FZGl0UmVzb3VyY2VzVmFsdWVcIlxuICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtZWRpdCBpbi1wYWdlLWVkaXQtaWNvbiBmYS1zbSBtcy0zIGN1cnNvci1wb2ludGVyIHRleHQtd2hpdGUgYWxpZ24tc2VsZi1jZW50ZXIgbXQtM1wiXG4gICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5Mb2dvRWRpdE1vZGFsKClcIlxuICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9wZW5Mb2dvRWRpdE1vZGFsKClcIlxuICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIm9wZW5Mb2dvRWRpdE1vZGFsKClcIlxuICAgICAgICAgICAgIHRpdGxlPVwiRWRpdCBMb2dvXCI+PC9pPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFJJR0hUIENPTFVNTiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Rm9vdGVySHVic3BvdEZvcm0oKSBhcyBmb290ZXJJdGVtOyBlbHNlIGRlZmF1bHRGb3JtXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImh1YnNwb3QtY29udGFpbmVyIHctMTAwIGNvbnRlbnQtbG9hZGVkXCJcbiAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImh1YnNwb3RIdG1sXCJcbiAgICAgICAgICAgICAgICAobG9hZCk9XCJvbkh1YnNwb3RMb2FkKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxpICpuZ0lmPVwiY2FuRWRpdFJlc291cmNlc1ZhbHVlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS1lZGl0IGluLXBhZ2UtZWRpdC1pY29uIHRleHQtd2hpdGUgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib3Blbkh1YnNwb3RFZGl0TW9kYWwoZm9vdGVySXRlbSlcIlxuICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJvcGVuSHVic3BvdEVkaXRNb2RhbChmb290ZXJJdGVtKVwiXG4gICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIm9wZW5IdWJzcG90RWRpdE1vZGFsKGZvb3Rlckl0ZW0pXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJFZGl0IEh1YnNwb3QgRW1iZWRcIj48L2k+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEZvcm0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInRleHQtd2hpdGUgbWItNFwiPiA8c3BhbiBjbGFzcz1cInRleHQtd2hpdGVcIj5HZXQgaW4gdG91Y2g6PC9zcGFuPjwvaDM+XG4gICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJjYW5FZGl0UmVzb3VyY2VzVmFsdWVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtZWRpdCBpbi1wYWdlLWVkaXQtaWNvbiB0ZXh0LXdoaXRlIGN1cnNvci1wb2ludGVyIG1zLTMgbXQtMlwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5RdWVzdGlvbnNFZGl0TW9kYWwoKVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib3BlblF1ZXN0aW9uc0VkaXRNb2RhbCgpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJvcGVuUXVlc3Rpb25zRWRpdE1vZGFsKClcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwiRWRpdCBRdWVzdGlvbnNcIj48L2k+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWZvcm1cIj5cbiAgICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbWFpbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlbWFpbFwiPkVtYWlsOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1iLTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImVtYWlsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZW1haWxcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cHctZmllbGQtZXJyb3ItZGlzcGxheSBbZGlzcGxheUVycm9yXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhZm9ybS5nZXQoJ2VtYWlsJykudmFsaWQgJiYgKGZvcm0uZ2V0KCdlbWFpbCcpLnRvdWNoZWQgfHwgc3VibWl0dGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yTXNnPVwiRW1haWwgaXMgcmVxdWlyZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9wdy1maWVsZC1lcnJvci1kaXNwbGF5PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZmlyc3RfbmFtZVwiPkZpcnN0IG5hbWU6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpbnB1dCB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImZpcnN0X25hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZmlyc3RfbmFtZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwdy1maWVsZC1lcnJvci1kaXNwbGF5IFtkaXNwbGF5RXJyb3JdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFmb3JtLmdldCgnZmlyc3RfbmFtZScpLnZhbGlkICYmIChmb3JtLmdldCgnZmlyc3RfbmFtZScpLnRvdWNoZWQgfHwgc3VibWl0dGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yTXNnPVwiRmlyc3QgbmFtZSBpcyByZXF1aXJlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8L3B3LWZpZWxkLWVycm9yLWRpc3BsYXk+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJsYXN0X25hbWVcIj5MYXN0IG5hbWU6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJsYXN0X25hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibGFzdF9uYW1lXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNvbXBhbnlcIj5Db21wYW55OjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiY29tcGFueVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb21wYW55XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCIgKm5nSWY9XCJoYXNWYWxpZE9wdGlvbnMoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwc2FcIiBjbGFzcz1cInNlbGVjdC1sYWJlbFwiPnt7cXVlc3Rpb259fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInBzYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJwc2FPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU2VsZWN0IFBTQSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cImlucHV0LXNlbGVjdFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVucXVpcnlcIiBjbGFzcz1cInNlbGVjdC1sYWJlbFwiPkhvdyBjYW4gd2UgaGVscCB5b3U/PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW5xdWlyeS1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhICBpZD1cImVucXVpcnlcIiBmb3JtQ29udHJvbE5hbWU9XCJlbnF1aXJ5XCIgY2xhc3M9XCJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHB3LWZpZWxkLWVycm9yLWRpc3BsYXkgW2Rpc3BsYXlFcnJvcl09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIWZvcm0uZ2V0KCdlbnF1aXJ5JykudmFsaWQgJiYgKGZvcm0uZ2V0KCdlbnF1aXJ5JykudG91Y2hlZCB8fCBzdWJtaXR0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3JNc2c9XCJFbnF1aXJ5IGlzIHJlcXVpcmVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvcHctZmllbGQtZXJyb3ItZGlzcGxheT5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1lbmRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXB0Y2hhLXdyYXBwZXItY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNDYXB0Y2hhVmVyaWZpZWRcIj5cbiAgICAgICAgICAgICAgICAgIDxuZ3gtcmVjYXB0Y2hhMiBbbmdNb2RlbE9wdGlvbnNdPVwieyBzdGFuZGFsb25lOiB0cnVlIH1cIlxuICAgICAgICAgICAgICAgICAgICBbc2l0ZUtleV09XCJjYXB0Y2hhS2V5VjJcIlxuICAgICAgICAgICAgICAgICAgICBzaXplPVwibm9ybWFsXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyZWNhcHRjaGFcIlxuICAgICAgICAgICAgICAgICAgICAoc3VjY2Vzcyk9XCJoYW5kbGVTdWNjZXNzKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgIDwvbmd4LXJlY2FwdGNoYTI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25TdWJtaXQoKVwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWlzQ2FwdGNoYVZlcmlmaWVkXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzaWduLWJ0biBzaWduLWhlYWRlci1idG4gbXQtM1wiPlxuICAgICAgICAgICAgICAgICAgICB7eyAnQnV0dG9uLlN1Ym1pdCcgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtNFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb25zIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGEgW2V2ZW50VHJhY2tlcl09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeTogJ3lvdXR1YmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnY2xpY2snLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdjbG91ZG9saXZlLWxhbmRpbmctcGFnZS1iJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAxXG4gICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2hyZWZdPVwieW91dHViZVVybFwiXG4gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ltZy9pY29ucy95b3V0dWJlLnBuZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImltZy1mbHVpZCB5b3V0dWJlLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCI1NFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCI1NFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDxhIFtldmVudFRyYWNrZXJdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk6ICdsaW5rZWRpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdjbGljaycsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ2Nsb3Vkb2xpdmUtbGFuZGluZy1wYWdlLWInLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDFcbiAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICBbaHJlZl09XCJsaW5rZWRJblVybFwiXG4gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1zLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaW1nL2ljb25zL3NvY2lhbC9saW5rZWRpbi5zdmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbWctZmx1aWQgbGlua2VkaW4taWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjQ4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjQ4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIlwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJjYW5FZGl0UmVzb3VyY2VzVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLWVkaXQgaW4tcGFnZS1lZGl0LWljb24gdGV4dC13aGl0ZSBjdXJzb3ItcG9pbnRlciBtcy0zXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5Tb2NpYWxFZGl0TW9kYWwoKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9wZW5Tb2NpYWxFZGl0TW9kYWwoKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIm9wZW5Tb2NpYWxFZGl0TW9kYWwoKVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiRWRpdCBTb2NpYWwgTGlua3MgJiBDb21wYW55IE5hbWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3B5cmlnaHQgdGV4dC13aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAyMDI1IHt7Y29tcGFueU5hbWV9fS5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3NlY3Rpb24+XG5cblxuXG48bmctdGVtcGxhdGUgI2Jvb2tNZWV0aW5nXG4gIGxldC1tb2RhbD5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImJ0bi1jbG9zZSBmbG9hdC1lbmRcIlxuICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlXCJcbiAgICAgIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKClcIj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gICAgPGgzIGNsYXNzPVwidGV4dC1jZW50ZXIgbW9kYWwtYmFzaWMtdGl0bGVcIj5cbiAgICAgIFRoYW5rcyBmb3IgZ2V0dGluZyBpbiB0b3VjaCEgT3VyIHRlYW0gd2lsbCBiZSBpbiBjb250YWN0IHNob3J0bHksIG9yIHdlXG4gICAgICBjYW4gY29tcGFyZSBjYWxlbmRhcnMgbm93ICZhbXA7IHNjaGVkdWxlIGEgdGltZVxuICAgIDwvaDM+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIFtldmVudFRyYWNrZXJdPVwie1xuICAgICAgICBjYXRlZ29yeTogJ3JlcXVlc3QtZGVtbycsXG4gICAgICAgIGFjdGlvbjogJ2NsaWNrJyxcbiAgICAgICAgbGFiZWw6ICdjbG91ZG9saXZlLWxhbmRpbmctcGFnZS1iJyxcbiAgICAgICAgdmFsdWU6IDFcbiAgICAgIH1cIlxuICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlVG9Cb29rTWVldGluZygpXCJcbiAgICAgIGNsYXNzPVwic2lnbi1idG4gc2lnbi1oZWFkZXItYnRuIG14LWF1dG8gZC1ibG9jayBtYi0zXCI+XG4gICAgICBMZXQncyBkbyBpdFxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cblxuPG5nLXRlbXBsYXRlICNlZGl0Rm9vdGVyTGlua3NNb2RhbCBsZXQtbW9kYWw+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiPkVkaXQgRm9vdGVyIExpbmtzPC9oNT5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKClcIj48L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICA8aDQgY2xhc3M9XCJtYi0zXCI+Rm9vdGVyIExpbmtzIFNlY3Rpb248L2g0PlxuICAgIDxkaXYgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wRm9vdGVyTGlua3MoJGV2ZW50KVwiPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZm9vdGVyIG9mIGVkaXRpbmdGb290ZXJMaW5rcy5pdGVtczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiYm9yZGVyIHAtMyBtYi0zXCIgY2RrRHJhZz5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNSBtYi0yXCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiZm9vdGVyVGl0bGV7e2l9fVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlRpdGxlPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCBpZD1cImZvb3RlclRpdGxle3tpfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwiZm9vdGVyLnRpdGxlXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTUgbWItMlwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImZvb3RlclBhdGh7e2l9fVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBhdGg8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IGlkPVwiZm9vdGVyUGF0aHt7aX19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cImZvb3Rlci5wYXRoXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC00XCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRyYXNoIGluLXBhZ2UtdHJhc2gtaWNvbiB0ZXh0LWRhbmdlciBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJyZW1vdmVGb290ZXJMaW5rKGkpXCIgKGtleWRvd24uZW50ZXIpPVwicmVtb3ZlRm9vdGVyTGluayhpKVwiIChrZXlkb3duLnNwYWNlKT1cInJlbW92ZUZvb3RlckxpbmsoaSlcIj48L2k+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWJhcnMgaW4tcGFnZS1iYXJzLWljb24gY3Vyc29yLW1vdmVcIiBjZGtEcmFnSGFuZGxlPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBTdWJ0aXRsZXMgLS0+XG4gICAgICAgIDxkaXYgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wU3VidGl0bGVzKGksICRldmVudClcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzdWIgb2YgZm9vdGVyLnN1YnRpdGxlczsgbGV0IGogPSBpbmRleFwiIGNsYXNzPVwicm93IGJvcmRlciBwLTMgbWItMiBhbGlnbi1pdGVtcy1jZW50ZXJcIiBjZGtEcmFnPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC01XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzdWJ0aXRsZVRpdGxle3tpfX17e2p9fVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlN1YnRpdGxlIFRpdGxlPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IGlkPVwic3VidGl0bGVUaXRsZXt7aX19e3tqfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwic3ViLnRpdGxlXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC01XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzdWJ0aXRsZVBhdGh7e2l9fXt7an19XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+U3VidGl0bGUgUGF0aDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCBpZD1cInN1YnRpdGxlUGF0aHt7aX19e3tqfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwic3ViLnBhdGhcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC00XCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJhc2ggaW4tcGFnZS10cmFzaC1pY29uIHRleHQtZGFuZ2VyIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInJlbW92ZVN1YnRpdGxlKGksIGopXCIgKGtleWRvd24uZW50ZXIpPVwicmVtb3ZlU3VidGl0bGUoaSwgailcIiAoa2V5ZG93bi5zcGFjZSk9XCJyZW1vdmVTdWJ0aXRsZShpLCBqKVwiPjwvaT5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1iYXJzIGN1cnNvci1tb3ZlIGluLXBhZ2UtYmFycy1pY29uXCIgY2RrRHJhZ0hhbmRsZT48L2k+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IGJ0bi1zbSBtdC0yXCIgKGNsaWNrKT1cImFkZFN1YnRpdGxlKGkpXCI+XG4gICAgICAgICAgKyBBZGQgU3VidGl0bGVcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXQtM1wiIChjbGljayk9XCJhZGRGb290ZXJMaW5rKClcIj5cbiAgICAgICsgQWRkIEZvb3RlciBMaW5rXG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJzYXZlRm9vdGVyTGlua3MobW9kYWwpXCI+U2F2ZTwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cblxuXG5cblxuPG5nLXRlbXBsYXRlICNsb2dvTW9kYWwgbGV0LW1vZGFsPlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5VcGxvYWQgTG9nbzwvaDU+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+PC9idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxuICAgIDxwdy1jdXN0b20tdXBsb2FkZXJcbiAgICAgIFthc3BlY3RSYXRpb109XCInZnVsbExvZ28nXCJcbiAgICAgIFt0aXRsZV09XCInTWFpbiBDb250cmFzdCBMb2dvJ1wiXG4gICAgICBbY29udHJvbE5hbWVdPVwiJ2xvZ29fbWFpbl9jb250cmFzdCdcIlxuICAgICAgW3ByZXZpZXdEYXRhXT1cInByZXZpZXdEYXRhXCJcbiAgICAgIChzYXZlRXZlbnQpPVwib25TYXZlRmlsZSgkZXZlbnQpXCI+XG4gICAgPC9wdy1jdXN0b20tdXBsb2FkZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuXG5cbjxuZy10ZW1wbGF0ZSAjaHVic3BvdEVkaXRNb2RhbCBsZXQtbW9kYWw+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiPkVkaXQgSHVic3BvdCBFbWJlZDwvaDU+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+PC9idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxuICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICA8bGFiZWwgZm9yPVwiaHVic3BvdElkXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+SHVic3BvdCBJRDwvbGFiZWw+XG4gICAgICA8aW5wdXQgaWQ9XCJodWJzcG90SWRcIiBbKG5nTW9kZWwpXT1cImVkaXRpbmdIdWJzcG90SWRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIC8+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgIDxsYWJlbCBmb3I9XCJodWJzcG90RW1iZWREaXZcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5FbWJlZCBESVY8L2xhYmVsPlxuICAgICAgPHRleHRhcmVhIGlkPVwiaHVic3BvdEVtYmVkRGl2XCIgWyhuZ01vZGVsKV09XCJlZGl0aW5nSHVic3BvdEh0bWxcIiByb3dzPVwiOFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCI+PC90ZXh0YXJlYT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cInNhdmVIdWJzcG90SHRtbChtb2RhbClcIj5TYXZlPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cblxuPG5nLXRlbXBsYXRlICNzb2NpYWxFZGl0TW9kYWwgbGV0LW1vZGFsPlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5FZGl0IFNvY2lhbCBMaW5rcyAmIENvbXBhbnkgTmFtZTwvaDU+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+PC9idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxuICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICA8bGFiZWwgZm9yPVwieW91dHViZVVybFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPllvdVR1YmUgVVJMPC9sYWJlbD5cbiAgICAgIDxpbnB1dCBpZD1cInlvdXR1YmVVcmxcIiBbKG5nTW9kZWwpXT1cImVkaXRpbmdZb3V0dWJlVXJsXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiAvPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICA8bGFiZWwgZm9yPVwibGlua2VkaW5VcmxcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5MaW5rZWRJbiBVUkw8L2xhYmVsPlxuICAgICAgPGlucHV0IGlkPVwibGlua2VkaW5VcmxcIiBbKG5nTW9kZWwpXT1cImVkaXRpbmdMaW5rZWRJblVybFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgLz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgPGxhYmVsIGZvcj1cImNvbXBhbnlOYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+Q29tcGFueSBOYW1lPC9sYWJlbD5cbiAgICAgIDxpbnB1dCBpZD1cImNvbXBhbnlOYW1lXCIgWyhuZ01vZGVsKV09XCJlZGl0aW5nQ29tcGFueU5hbWVcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIC8+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJzYXZlU29jaWFsTGlua3MobW9kYWwpXCI+U2F2ZTwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG5cblxuPG5nLXRlbXBsYXRlICNxdWVzdGlvbnNFZGl0TW9kYWwgbGV0LW1vZGFsPlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5FZGl0IFF1ZXN0aW9uczwvaDU+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+PC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gICAgPGg0IGNsYXNzPVwibWItM1wiPlF1ZXN0aW9ucyBTZWN0aW9uPC9oND5cbiAgICA8ZGl2IGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcFF1ZXN0aW9ucygkZXZlbnQpXCI+XG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBxIG9mIGVkaXRpbmdRdWVzdGlvbnM7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImJvcmRlciBwLTMgbWItM1wiIGNka0RyYWc+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTExIG1iLTJcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJxdWVzdGlvblRleHR7e2l9fVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlF1ZXN0aW9uPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCBpZD1cInF1ZXN0aW9uVGV4dHt7aX19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInEucXVlc3Rpb25cIiBwbGFjZWhvbGRlcj1cIkVudGVyIHF1ZXN0aW9uXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtc3RhcnQgbXQtNFwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1iYXJzIGluLXBhZ2UtYmFycy1pY29uIGN1cnNvci1tb3ZlXCIgY2RrRHJhZ0hhbmRsZT48L2k+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gT3B0aW9ucyBTZWN0aW9uIC0tPlxuICAgICAgICA8ZGl2IGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcFF1ZXN0aW9uT3B0aW9ucyhpLCAkZXZlbnQpXCI+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0IG9mIHEub3B0aW9uczsgbGV0IGogPSBpbmRleFwiIGNsYXNzPVwicm93IGJvcmRlciBwLTMgbWItMiBhbGlnbi1pdGVtcy1jZW50ZXJcIiBjZGtEcmFnPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC03IG1iLTJcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInF1ZXN0aW9uT3B0aW9ue3tpfX17e2p9fVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPk9wdGlvbjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCBpZD1cInF1ZXN0aW9uT3B0aW9ue3tpfX17e2p9fVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJvcHQub3B0aW9uXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBvcHRpb25cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC00XCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJhc2ggaW4tcGFnZS10cmFzaC1pY29uIHRleHQtZGFuZ2VyIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInJlbW92ZVF1ZXN0aW9uT3B0aW9uKGksIGopXCIgKGtleWRvd24uZW50ZXIpPVwicmVtb3ZlUXVlc3Rpb25PcHRpb24oaSwgailcIiAoa2V5ZG93bi5lbnRlcik9XCJyZW1vdmVRdWVzdGlvbk9wdGlvbihpLCBqKVwiPjwvaT5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1iYXJzIGluLXBhZ2UtYmFycy1pY29uIGN1cnNvci1tb3ZlXCIgY2RrRHJhZ0hhbmRsZT48L2k+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IGJ0bi1zbSBtdC0yXCIgKGNsaWNrKT1cImFkZFF1ZXN0aW9uT3B0aW9uKGkpXCI+KyBBZGQgT3B0aW9uPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXQtM1wiIChjbGljayk9XCJhZGROZXdRdWVzdGlvbigpXCI+KyBBZGQgUXVlc3Rpb248L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cInNhdmVRdWVzdGlvbnMobW9kYWwpXCI+U2F2ZTwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cblxuXG4iXX0=
|