@posiwise/admin-module 0.0.180 → 0.0.181

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/fesm2022/posiwise-admin-module.mjs +463 -441
  2. package/fesm2022/posiwise-admin-module.mjs.map +1 -1
  3. package/lib/components/resources/resources-admin-details/resources-admin-details.component.d.ts +1 -1
  4. package/lib/components/subscriptions/subscription-users/subscription-users.component.d.ts +1 -1
  5. package/package.json +4 -6
  6. package/esm2022/index.mjs +0 -87
  7. package/esm2022/lib/admin-guard.service.mjs +0 -44
  8. package/esm2022/lib/admin-module.routing.mjs +0 -919
  9. package/esm2022/lib/admin.module.mjs +0 -485
  10. package/esm2022/lib/components/TOS/terms-of-service/terms-of-service.component.mjs +0 -93
  11. package/esm2022/lib/components/TOS/terms-of-service-details/terms-of-service-details.component.mjs +0 -98
  12. package/esm2022/lib/components/TOS/terms-of-service-tabs/terms-of-service-tabs.component.mjs +0 -26
  13. package/esm2022/lib/components/config/global-config-details/global-config-details.component.mjs +0 -75
  14. package/esm2022/lib/components/config/global-config-list/global-config-list.component.mjs +0 -92
  15. package/esm2022/lib/components/config/global-config-tabs/global-config-tabs.component.mjs +0 -24
  16. package/esm2022/lib/components/contact-us/contact-us-list/contact-us-list.component.mjs +0 -101
  17. package/esm2022/lib/components/contact-us/contact-us-tabs/contact-us-tabs.component.mjs +0 -25
  18. package/esm2022/lib/components/credentials/credentials/credentials.component.mjs +0 -88
  19. package/esm2022/lib/components/credentials/credentials-details/credentials-details.component.mjs +0 -79
  20. package/esm2022/lib/components/credentials/credentials-tab/credentials-tab.component.mjs +0 -31
  21. package/esm2022/lib/components/credentials/subscription-credentials/subscription-credentials.component.mjs +0 -92
  22. package/esm2022/lib/components/credentials/subscription-credentials-details/subscription-credentials-details.component.mjs +0 -102
  23. package/esm2022/lib/components/domain-config/domain-config-details/base-domain-config.component.mjs +0 -88
  24. package/esm2022/lib/components/domain-config/domain-config-details/domain-config-build/domain-config-build.component.mjs +0 -731
  25. package/esm2022/lib/components/domain-config/domain-config-details/domain-config-core/domain-config-core.component.mjs +0 -123
  26. package/esm2022/lib/components/domain-config/domain-config-details/domain-config-details.component.mjs +0 -57
  27. package/esm2022/lib/components/domain-config/domain-config-details/domain-config-integrations/domain-config-integrations.component.mjs +0 -91
  28. package/esm2022/lib/components/domain-config/domain-config-details/domain-config-interface/domain-config-interface.component.mjs +0 -144
  29. package/esm2022/lib/components/domain-config/domain-config-details/domain-config-organization/domain-config-organization.component.mjs +0 -30
  30. package/esm2022/lib/components/domain-config/domain-config-details/domain-config-security/domain-config-security.component.mjs +0 -31
  31. package/esm2022/lib/components/domain-config/domain-config-details/domain-config-social/domain-config-social.component.mjs +0 -30
  32. package/esm2022/lib/components/domain-config/domain-config-list/domain-config-list.component.mjs +0 -98
  33. package/esm2022/lib/components/domain-config/domain-config-tabs/domain-config-tabs.component.mjs +0 -25
  34. package/esm2022/lib/components/faqs/add-faq/add-faq.component.mjs +0 -218
  35. package/esm2022/lib/components/faqs/edit-faq/edit-faq.component.mjs +0 -204
  36. package/esm2022/lib/components/faqs/faqs-list/faqs-list.component.mjs +0 -277
  37. package/esm2022/lib/components/faqs/faqs-tabs/faqs-tabs.component.mjs +0 -25
  38. package/esm2022/lib/components/feedback-questions/feedback-questions-details/feedback-questions-details.component.mjs +0 -84
  39. package/esm2022/lib/components/feedback-questions/feedback-questions-list/feedback-questions-list.component.mjs +0 -98
  40. package/esm2022/lib/components/generic/generic-insight/generic-insight.component.mjs +0 -12
  41. package/esm2022/lib/components/generic/generic-misc/generic-misc.component.mjs +0 -127
  42. package/esm2022/lib/components/generic/generic-tabs/generic-tabs.component.mjs +0 -31
  43. package/esm2022/lib/components/incidents/add-edit-incident/add-edit-incident.component.mjs +0 -152
  44. package/esm2022/lib/components/incidents/incidents-list/incidents-list.component.mjs +0 -118
  45. package/esm2022/lib/components/incidents/incidents-tabs/incidents-tabs.component.mjs +0 -25
  46. package/esm2022/lib/components/login-notifications/login-notification-details/login-notification-details.component.mjs +0 -111
  47. package/esm2022/lib/components/login-notifications/login-notification-tabs/login-notification-tabs.component.mjs +0 -25
  48. package/esm2022/lib/components/login-notifications/login-notifications-list/login-notifications-list.component.mjs +0 -97
  49. package/esm2022/lib/components/mailer/mailer-details/mailer-details.component.mjs +0 -115
  50. package/esm2022/lib/components/mailer/mailer-list/mailer-list.component.mjs +0 -113
  51. package/esm2022/lib/components/mailer/mailer-tabs/mailer-tabs.component.mjs +0 -24
  52. package/esm2022/lib/components/newsletters/newsletter-details/newsletter-details.component.mjs +0 -87
  53. package/esm2022/lib/components/newsletters/newsletter-item-details/newsletter-item-details.component.mjs +0 -284
  54. package/esm2022/lib/components/newsletters/newsletter-users-list/newsletter-users-list.component.mjs +0 -76
  55. package/esm2022/lib/components/newsletters/newsletters-insight/newsletters-insight.component.mjs +0 -53
  56. package/esm2022/lib/components/newsletters/newsletters-items/newsletters-items-view-details/newsletters-items-view-details.component.mjs +0 -59
  57. package/esm2022/lib/components/newsletters/newsletters-items/newsletters-items.component.mjs +0 -179
  58. package/esm2022/lib/components/newsletters/newsletters-list/newsletters-list.component.mjs +0 -103
  59. package/esm2022/lib/components/newsletters/newsletters-tabs/newsletters-tabs.component.mjs +0 -38
  60. package/esm2022/lib/components/permissions/permissions-details/permissions-details.component.mjs +0 -109
  61. package/esm2022/lib/components/permissions/permissions-list/permissions-list.component.mjs +0 -87
  62. package/esm2022/lib/components/permissions/permissions-tabs/permissions-tabs.component.mjs +0 -31
  63. package/esm2022/lib/components/permissions/role-details/role-details.component.mjs +0 -140
  64. package/esm2022/lib/components/permissions/roles-list/roles-list.component.mjs +0 -93
  65. package/esm2022/lib/components/products/product-details/product-details.component.mjs +0 -370
  66. package/esm2022/lib/components/products/products-insight/products-insight.component.mjs +0 -52
  67. package/esm2022/lib/components/products/products-list/products-list.component.mjs +0 -144
  68. package/esm2022/lib/components/products/products-tabs/products-tabs.component.mjs +0 -28
  69. package/esm2022/lib/components/products/users-list-for-product/users-list-for-product.component.mjs +0 -55
  70. package/esm2022/lib/components/resources/resources-admin-details/resources-admin-details.component.mjs +0 -380
  71. package/esm2022/lib/components/resources/resources-admin-tabs/resources-admin-tabs.component.mjs +0 -33
  72. package/esm2022/lib/components/resources/resources-admin-tabs/resources-index/resources-index.component.mjs +0 -154
  73. package/esm2022/lib/components/resources/resources-admin-tabs/resources-insight/resources-insight.component.mjs +0 -54
  74. package/esm2022/lib/components/resources/resources-lists-insight/resources-lists-insight.component.mjs +0 -61
  75. package/esm2022/lib/components/subscriptions/subscription-agents/subscription-agents.component.mjs +0 -120
  76. package/esm2022/lib/components/subscriptions/subscription-agents-list/subscription-agents-list.component.mjs +0 -135
  77. package/esm2022/lib/components/subscriptions/subscription-details/subscription-details.component.mjs +0 -210
  78. package/esm2022/lib/components/subscriptions/subscription-product-details/subscription-product-details.component.mjs +0 -225
  79. package/esm2022/lib/components/subscriptions/subscription-products/subscription-products.component.mjs +0 -66
  80. package/esm2022/lib/components/subscriptions/subscription-users/add-members/add-members.component.mjs +0 -173
  81. package/esm2022/lib/components/subscriptions/subscription-users/subscription-users.component.mjs +0 -215
  82. package/esm2022/lib/components/subscriptions/subscriptions-insight/base-subscription-insight.component.mjs +0 -47
  83. package/esm2022/lib/components/subscriptions/subscriptions-insight/subscription-insight-average-price/subscription-insight-average-price.component.mjs +0 -34
  84. package/esm2022/lib/components/subscriptions/subscriptions-insight/subscription-insight-average-user/subscription-insight-average-user.component.mjs +0 -34
  85. package/esm2022/lib/components/subscriptions/subscriptions-insight/subscription-insight-churn/subscription-insight-churn.component.mjs +0 -55
  86. package/esm2022/lib/components/subscriptions/subscriptions-insight/subscription-insight-nps/subscription-insight-nps.component.mjs +0 -103
  87. package/esm2022/lib/components/subscriptions/subscriptions-insight/subscription-insight-product-session/subscription-insight-product-session.component.mjs +0 -34
  88. package/esm2022/lib/components/subscriptions/subscriptions-insight/subscription-insight-revenue/subscription-insight-revenue.component.mjs +0 -55
  89. package/esm2022/lib/components/subscriptions/subscriptions-insight/subscription-insight-tabs/subscription-insight-tabs.component.mjs +0 -23
  90. package/esm2022/lib/components/subscriptions/subscriptions-insight/subscription-insight-user-session/subscription-insight-user-session.component.mjs +0 -34
  91. package/esm2022/lib/components/subscriptions/subscriptions-insight/subscriptions-insight.component.mjs +0 -55
  92. package/esm2022/lib/components/subscriptions/subscriptions-list/invite-users/invite-users.component.mjs +0 -232
  93. package/esm2022/lib/components/subscriptions/subscriptions-list/subscriptions-list.component.mjs +0 -311
  94. package/esm2022/lib/components/subscriptions/subscriptions-tabs/subscriptions-tabs.component.mjs +0 -35
  95. package/esm2022/lib/components/tags/tags-category/tags-category.component.mjs +0 -153
  96. package/esm2022/lib/components/tags/tags-details/tags-details.component.mjs +0 -153
  97. package/esm2022/lib/components/tags/tags-list/tags-list.component.mjs +0 -145
  98. package/esm2022/lib/components/tags/tags-tabs/tags-tabs.component.mjs +0 -32
  99. package/esm2022/lib/components/tips/tip-detail/tip-detail.component.mjs +0 -88
  100. package/esm2022/lib/components/tips/tips-list/tips-list.component.mjs +0 -49
  101. package/esm2022/lib/components/tips/tips-tabs/tips-tabs.component.mjs +0 -25
  102. package/esm2022/lib/components/tracking/ahoy-events/ahoy-events.component.mjs +0 -216
  103. package/esm2022/lib/components/tracking/ahoy-messages/ahoy-messages.component.mjs +0 -200
  104. package/esm2022/lib/components/tracking/ahoy-visits/ahoy-visits.component.mjs +0 -198
  105. package/esm2022/lib/components/tracking/events/events.component.mjs +0 -198
  106. package/esm2022/lib/components/tracking/tracking-tabs/tracking-tabs.component.mjs +0 -49
  107. package/esm2022/lib/components/tracking/versions/versions.component.mjs +0 -208
  108. package/esm2022/lib/components/users/user-details/user-details.component.mjs +0 -167
  109. package/esm2022/lib/components/users/users-insight/users-insight.component.mjs +0 -53
  110. package/esm2022/lib/components/users/users-list/users-list.component.mjs +0 -338
  111. package/esm2022/lib/components/users/users-tabs/users-tabs.component.mjs +0 -32
  112. package/esm2022/lib/shared/interface/admin-module-shared.interface.mjs +0 -2
  113. package/esm2022/lib/shared/interface/api-response.interface.mjs +0 -2
  114. package/esm2022/lib/shared/interface/contact-us.interface.mjs +0 -2
  115. package/esm2022/lib/shared/interface/credential.interface.mjs +0 -2
  116. package/esm2022/lib/shared/interface/domain-config.interface.mjs +0 -2
  117. package/esm2022/lib/shared/interface/feedback-question.interface.mjs +0 -2
  118. package/esm2022/lib/shared/interface/global-config.interface.mjs +0 -2
  119. package/esm2022/lib/shared/interface/login-notification.interface.mjs +0 -2
  120. package/esm2022/lib/shared/interface/newsletter.interface.mjs +0 -2
  121. package/esm2022/lib/shared/interface/permission.interface.mjs +0 -2
  122. package/esm2022/lib/shared/interface/privacy-tos.interface.mjs +0 -2
  123. package/esm2022/lib/shared/interface/tip.interface.mjs +0 -2
  124. package/esm2022/lib/shared/interface/tracking.interface.mjs +0 -2
  125. package/esm2022/lib/shared/routers/routers.mjs +0 -40
  126. package/esm2022/posiwise-admin-module.mjs +0 -5
@@ -1,731 +0,0 @@
1
- import { __decorate, __metadata } from "tslib";
2
- import { moveItemInArray } from '@angular/cdk/drag-drop';
3
- import { Component, Injector, QueryList, ViewChild, ViewChildren } from '@angular/core';
4
- import { FormBuilder } from '@angular/forms';
5
- import { AdminService, AppAdmin } from '@posiwise/admin-module-utils';
6
- import { AppBaseComponent } from '@posiwise/app-base-component';
7
- import { PermissionService, ProductService } from '@posiwise/common-services';
8
- import { HelperService } from '@posiwise/helper-service';
9
- import { CustomUploaderComponent, ValidateForm } from '@posiwise/utils';
10
- import groupBy from 'lodash/groupBy';
11
- import { forkJoin } from 'rxjs';
12
- import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
13
- import { ROUTERS } from '../../../../shared/routers/routers';
14
- import * as i0 from "@angular/core";
15
- import * as i1 from "@posiwise/admin-module-utils";
16
- import * as i2 from "@posiwise/common-services";
17
- import * as i3 from "@ng-bootstrap/ng-bootstrap";
18
- import * as i4 from "@angular/forms";
19
- import * as i5 from "primeng/api";
20
- import * as i6 from "primeng/tooltip";
21
- import * as i7 from "primeng/accordion";
22
- import * as i8 from "primeng/autocomplete";
23
- import * as i9 from "primeng/dropdown";
24
- import * as i10 from "@angular/common";
25
- import * as i11 from "ngx-ui-switch";
26
- import * as i12 from "primeng/progressspinner";
27
- import * as i13 from "@posiwise/utils";
28
- import * as i14 from "@posiwise/shared-components";
29
- import * as i15 from "@angular/cdk/drag-drop";
30
- import * as i16 from "@posiwise/directives";
31
- import * as i17 from "@jsverse/transloco";
32
- export class DomainConfigBuildComponent extends AppBaseComponent {
33
- constructor(injector, adminService, productService, modalService, fb) {
34
- super(injector);
35
- this.adminService = adminService;
36
- this.productService = productService;
37
- this.modalService = modalService;
38
- this.fb = fb;
39
- this.submitted = false;
40
- this.buttonBusy = false;
41
- this.selectedPartnerIndex = null;
42
- this.routers = ROUTERS;
43
- this.masterSubscriptionProductList = [];
44
- this.masterSubscriptionsList = [];
45
- this.subscriptionTosList = [];
46
- this.crmProductList = [];
47
- this.crmSubscriptionsList = [];
48
- this.crmSourcesList = [];
49
- this.productsList = [];
50
- this.childList = [];
51
- this.form = AppAdmin.domainConfigBuildForm(this.fb);
52
- }
53
- ngOnInit() {
54
- this.id = Number(this.route.snapshot.params['id']);
55
- this.duplicateConfigId = Number(this.route.snapshot.queryParams['duplicate_domain_config_id']);
56
- this.subscriptionId = PermissionService.selectedSubscription?.id;
57
- if (this.id) {
58
- this.getAllOptions();
59
- }
60
- if (this.permissionService.isSuperAdmin()) {
61
- this.form.get('master_subscription_id').enable();
62
- this.form.get('master_subscription_product_id').enable();
63
- this.form.get('is_product_domain').enable();
64
- this.form.get('crm_subscription_id').enable();
65
- this.form.get('crm_product_id').enable();
66
- }
67
- else {
68
- this.form.get('master_subscription_id').disable();
69
- this.form.get('master_subscription_product_id').disable();
70
- this.form.get('is_product_domain').disable();
71
- this.form.get('crm_subscription_id').disable();
72
- this.form.get('crm_product_id').disable();
73
- }
74
- }
75
- addBookDemoLink() {
76
- const items = this.form.get('book_demo')?.get('items');
77
- items.push(this.fb.group({ title: [''], url: [''] }));
78
- }
79
- get integrations() {
80
- return this.form.get('integrations');
81
- }
82
- get integrationsItems() {
83
- return this.integrations.get('items');
84
- }
85
- get abTests() {
86
- return this.form.get('ab_tests');
87
- }
88
- addAbTest() {
89
- this.abTests.push(this.fb.group({
90
- description: [''],
91
- experiment_name: [''],
92
- db_shard: [''],
93
- microservice_name: ['']
94
- }));
95
- }
96
- removeAbTest(index) {
97
- this.abTests.removeAt(index);
98
- }
99
- addIntegrationItem() {
100
- this.integrationsItems.push(this.fb.group({
101
- title: [''],
102
- description: [''],
103
- blog_url: [''],
104
- image_url: [''],
105
- video_url: ['']
106
- }));
107
- }
108
- get guidesItems() {
109
- return this.form.get('guides')?.get('items');
110
- }
111
- addGuideItem() {
112
- this.guidesItems.push(this.fb.group({
113
- title: [''],
114
- description: [''],
115
- button_text: [''],
116
- image_url: [''],
117
- guide_url: ['']
118
- }));
119
- }
120
- removeGuideItem(index) {
121
- this.guidesItems.removeAt(index);
122
- }
123
- removeIntegrationItem(index) {
124
- this.integrationsItems.removeAt(index);
125
- }
126
- getQuestionOptions(questionIndex) {
127
- return this.contactUsQuestions.at(questionIndex).get('options');
128
- }
129
- get footerLinksItems() {
130
- return this.form.get('footer_links')?.get('items');
131
- }
132
- getFooterSubtitles(index) {
133
- return this.footerLinksItems.at(index).get('subtitles');
134
- }
135
- addFooterLinkItem() {
136
- this.footerLinksItems.push(this.fb.group({
137
- title: [''],
138
- path: [''],
139
- subtitles: this.fb.array([])
140
- }));
141
- }
142
- removeFooterLinkItem(index) {
143
- this.footerLinksItems.removeAt(index);
144
- }
145
- addFooterSubtitle(linkIndex) {
146
- const subtitles = this.footerLinksItems.at(linkIndex).get('subtitles');
147
- subtitles.push(this.fb.group({ title: [''], path: [''] }));
148
- }
149
- removeFooterSubtitle(linkIndex, subIndex) {
150
- const subtitles = this.footerLinksItems.at(linkIndex).get('subtitles');
151
- subtitles.removeAt(subIndex);
152
- }
153
- get navbar() {
154
- return this.form.get('navbar');
155
- }
156
- get navbarItems() {
157
- return this.navbar.get('items');
158
- }
159
- getSubtitles(index) {
160
- return this.navbarItems.at(index).get('subtitles');
161
- }
162
- getNavbarSubtitles(index) {
163
- return this.navbarItems.at(index).get('subtitles');
164
- }
165
- addNavbarItem() {
166
- this.navbarItems.push(this.fb.group({
167
- title: [''],
168
- path: [''],
169
- subtitles: this.fb.array([])
170
- }));
171
- }
172
- removeNavbarItem(index) {
173
- this.navbarItems.removeAt(index);
174
- }
175
- addSubtitle(navIndex) {
176
- this.getSubtitles(navIndex).push(this.fb.group({ title: [''], path: [''] }));
177
- }
178
- removeSubtitle(navIndex, subIndex) {
179
- this.getSubtitles(navIndex).removeAt(subIndex);
180
- }
181
- addContactUsOption(questionIndex) {
182
- this.getQuestionOptions(questionIndex).push(this.fb.group({
183
- option: ['']
184
- }));
185
- }
186
- removeContactUsOption(questionIndex, optionIndex) {
187
- this.getQuestionOptions(questionIndex).removeAt(optionIndex);
188
- }
189
- removeBookDemoLink(index) {
190
- const items = this.form.get('book_demo')?.get('items');
191
- items.removeAt(index);
192
- }
193
- get ctas() {
194
- return this.form.get('ctas');
195
- }
196
- get ctasItems() {
197
- return this.ctas.get('items');
198
- }
199
- get contactUs() {
200
- return this.form.get('contact_us');
201
- }
202
- get contactUsQuestions() {
203
- return this.contactUs.get('questions');
204
- }
205
- addContactUsQuestion() {
206
- this.contactUsQuestions.push(this.fb.group({
207
- question: [''],
208
- options: this.fb.array([
209
- this.fb.group({
210
- option: ['']
211
- })
212
- ])
213
- }));
214
- }
215
- removeContactUsQuestion(index) {
216
- this.contactUsQuestions.removeAt(index);
217
- }
218
- addCtasItem() {
219
- this.ctasItems.push(this.fb.group({
220
- title: [''],
221
- description: [''],
222
- button_text: [''],
223
- image_url: [''],
224
- cta_url: ['']
225
- }));
226
- }
227
- removeCtasItem(index) {
228
- this.ctasItems.removeAt(index);
229
- }
230
- get testimonials() {
231
- return this.form.get('testimonials');
232
- }
233
- get testimonialsItems() {
234
- return this.form.get('testimonials.items');
235
- }
236
- get contactUsHubspotItems() {
237
- return this.form.get('contact_us')?.get('hubspot');
238
- }
239
- addHubspotItem() {
240
- this.contactUsHubspotItems.push(this.fb.group({
241
- id: [''],
242
- position: [''],
243
- div: ['']
244
- }));
245
- }
246
- removeHubspotItem(index) {
247
- this.contactUsHubspotItems.removeAt(index);
248
- }
249
- openPartnerImageCropper(index) {
250
- this.selectedPartnerIndex = index;
251
- this.modalService.open(this.partnerCropper, {
252
- centered: true,
253
- windowClass: 'modal-holder'
254
- });
255
- }
256
- addPartnerItem() {
257
- const items = this.form.get('partners')?.get('items');
258
- items.push(this.fb.group({
259
- name: [''],
260
- description: [''],
261
- blog_url: [''],
262
- image_url: [''],
263
- video_url: ['']
264
- }));
265
- }
266
- removePartnerItem(index) {
267
- const items = this.form.get('partners')?.get('items');
268
- items.removeAt(index);
269
- }
270
- get uspsItems() {
271
- return this.form.get('usps').get('items');
272
- }
273
- addUspItem() {
274
- this.uspsItems.push(this.fb.group({ description: [''] }));
275
- }
276
- removeUspItem(index) {
277
- this.uspsItems.removeAt(index);
278
- }
279
- get videos() {
280
- return this.form.get('videos');
281
- }
282
- get videosItems() {
283
- return this.videos.get('items');
284
- }
285
- addVideoItem() {
286
- this.videosItems.push(this.fb.group({
287
- title: [''],
288
- description: [''],
289
- blog_url: [''],
290
- image_url: [''],
291
- video_url: ['']
292
- }));
293
- }
294
- removeVideoItem(index) {
295
- this.videosItems.removeAt(index);
296
- }
297
- addTestimonialItem() {
298
- this.testimonialsItems.push(this.fb.group({
299
- testimonial: [''],
300
- name: [''],
301
- blog_url: [''],
302
- image_url: [''],
303
- video_url: ['']
304
- }));
305
- }
306
- removeTestimonialItem(index) {
307
- this.testimonialsItems.removeAt(index);
308
- }
309
- get headerSubHeadings() {
310
- return this.form.get('header').get('sub_headings');
311
- }
312
- addHeaderSubHeading() {
313
- this.headerSubHeadings.push(this.fb.group({ description: [''] }));
314
- }
315
- removeHeaderSubHeading(index) {
316
- this.headerSubHeadings.removeAt(index);
317
- }
318
- get partnersItems() {
319
- return this.form.get('partners')?.get('items');
320
- }
321
- addPartnerImage() {
322
- this.partnersItems.push(this.fb.group({
323
- image_url: ['']
324
- }));
325
- }
326
- removePartnerImage(index) {
327
- this.partnersItems.removeAt(index);
328
- }
329
- getAllOptions() {
330
- this.isLoading = true;
331
- forkJoin({
332
- options: this.adminService.getAvailableDomainOptions(this.subscriptionId),
333
- getProduct: this.productService.getProductList({}, this.subscriptionId),
334
- config: this.adminService.getDomainConfigById(HelperService.effectiveConfigId(this.duplicateConfigId, this.id), this.subscriptionId)
335
- })
336
- .subscribe(res => {
337
- // options
338
- this.masterSubscriptionProductList = [
339
- { id: null, name: 'Select Master Product' },
340
- ...(res?.options?.master_subscription?.products ?? [])
341
- ];
342
- this.masterSubscriptionsList = [
343
- { label: 'Select Master Subscription', value: null },
344
- ...(res?.options?.master_subscription?.subscriptions ?? []).map(sub => ({
345
- label: sub.organisation
346
- ? `${sub.organisation} - ${sub.contact_name}`
347
- : sub.contact_name,
348
- value: sub.id
349
- }))
350
- ];
351
- this.subscriptionTosList = [
352
- { id: null, title: 'Select Main TOS' },
353
- ...(res?.options?.master_subscription?.subscription_tos ?? [])
354
- ];
355
- this.crmSubscriptionsList = [
356
- { id: null, organisation: null, contact_name: 'Select CRM Subscription' },
357
- ...(res?.options?.master_crm?.subscriptions ?? [])
358
- ];
359
- this.crmSourcesList = [
360
- { id: null, name: 'Select CRM Source' },
361
- ...(res?.options?.master_crm?.sources ?? [])
362
- ];
363
- this.crmProductList = [
364
- { id: null, name: 'Select CRM Product', subscription_id: null },
365
- ...(res?.options?.master_crm?.products ?? [])
366
- ];
367
- // end options
368
- this.productsList = this.groupProducts(res?.getProduct?.products);
369
- // config to patch values
370
- this.data = res.config;
371
- const demo = this.data.book_demo;
372
- const demoGroup = this.form.get('book_demo');
373
- const itemsArray = demoGroup.get('items');
374
- demoGroup.patchValue({
375
- title: demo?.title ?? '',
376
- description: demo?.description ?? ''
377
- });
378
- const uspsGroup = this.form.get('usps');
379
- const uspItemsArray = uspsGroup.get('items');
380
- uspsGroup.patchValue({
381
- title: res.config?.usps?.title ?? '',
382
- description: res.config?.usps?.description ?? ''
383
- });
384
- uspItemsArray.clear();
385
- (res.config?.usps?.items ?? []).forEach(item => {
386
- uspItemsArray.push(this.fb.group({
387
- description: [item.description ?? '']
388
- }));
389
- });
390
- const headerGroup = this.form.get('header');
391
- const subHeadingsArray = headerGroup.get('sub_headings');
392
- headerGroup.patchValue({
393
- headline: res.config?.header?.headline ?? '',
394
- description: res.config?.header?.description ?? '',
395
- video_url: res.config?.header?.video_url ?? '',
396
- bg_image_url: res.config?.header?.bg_image_url ?? ''
397
- });
398
- subHeadingsArray.clear();
399
- (res.config?.header?.sub_headings ?? []).forEach(sh => {
400
- subHeadingsArray.push(this.fb.group({
401
- description: [sh.description ?? '']
402
- }));
403
- });
404
- const testimonialsGroup = this.form.get('testimonials');
405
- const testimonialItems = testimonialsGroup.get('items');
406
- testimonialsGroup.patchValue({
407
- title: res.config?.testimonials?.title ?? '',
408
- description: res.config?.testimonials?.description ?? ''
409
- });
410
- testimonialItems.clear();
411
- (res.config?.testimonials?.items ?? []).forEach(item => {
412
- testimonialItems.push(this.fb.group({
413
- testimonial: [item?.testimonial ?? ''],
414
- name: [item?.name ?? ''],
415
- blog_url: [item?.blog_url ?? ''],
416
- image_url: [item?.image_url ?? ''],
417
- video_url: [item?.video_url ?? '']
418
- }));
419
- });
420
- const ctasGroup = this.form.get('ctas');
421
- const ctasItems = ctasGroup.get('items');
422
- ctasGroup.patchValue({
423
- title: res.config?.ctas?.title ?? '',
424
- description: res.config?.ctas?.description ?? '',
425
- button_text: res.config?.ctas?.button_text ?? '',
426
- image_url: res.config?.ctas?.image_url ?? ''
427
- });
428
- ctasItems.clear();
429
- (res.config?.ctas?.items ?? []).forEach(item => {
430
- ctasItems.push(this.fb.group({
431
- title: [item?.title ?? ''],
432
- description: [item?.description ?? ''],
433
- button_text: [item?.button_text ?? ''],
434
- image_url: [item?.image_url ?? ''],
435
- cta_url: [item?.cta_url ?? ''],
436
- video_url: [item?.video_url ?? '']
437
- }));
438
- });
439
- const guidesGroup = this.form.get('guides');
440
- const guidesItems = guidesGroup.get('items');
441
- guidesItems.clear();
442
- (res.config?.guides?.items ?? []).forEach(item => {
443
- guidesItems.push(this.fb.group({
444
- title: [item?.title ?? ''],
445
- description: [item?.description ?? ''],
446
- button_text: [item?.button_text ?? ''],
447
- image_url: [item?.image_url ?? ''],
448
- guide_url: [item?.guide_url ?? '']
449
- }));
450
- });
451
- const partnersGroup = this.form.get('partners');
452
- const partnersItems = partnersGroup.get('items');
453
- partnersGroup.patchValue({
454
- description: this.data?.partners?.description ?? ''
455
- });
456
- partnersItems.clear();
457
- (this.data?.partners?.items ?? []).forEach(item => {
458
- partnersItems.push(this.fb.group({
459
- image_url: [item?.image_url ?? ''],
460
- name: [item?.name ?? ''],
461
- description: [item?.description ?? ''],
462
- blog_url: [item?.blog_url ?? ''],
463
- video_url: [item?.video_url ?? '']
464
- }));
465
- });
466
- itemsArray.clear();
467
- (demo?.items ?? []).forEach(link => {
468
- itemsArray.push(this.fb.group({
469
- title: [link.title ?? ''],
470
- url: [link.url ?? '']
471
- }));
472
- });
473
- const contactUsGroup = this.form.get('contact_us');
474
- const questionsArray = contactUsGroup.get('questions');
475
- const hubspotArray = contactUsGroup.get('hubspot');
476
- contactUsGroup.patchValue({
477
- description: res.config?.contact_us?.description ?? ''
478
- });
479
- questionsArray.clear();
480
- hubspotArray.clear();
481
- (res.config?.contact_us?.questions ?? []).forEach(q => {
482
- questionsArray.push(this.fb.group({
483
- question: [q?.question ?? ''],
484
- options: this.fb.array((q?.options ?? []).map(o => this.fb.group({
485
- option: [o?.option ?? '']
486
- })))
487
- }));
488
- });
489
- (res.config?.contact_us?.hubspot ?? []).forEach(h => {
490
- hubspotArray.push(this.fb.group({
491
- id: [h?.id ?? ''],
492
- position: [h?.position ?? ''],
493
- div: [h?.div ?? '']
494
- }));
495
- });
496
- const videosGroup = this.form.get('videos');
497
- const videosItems = videosGroup.get('items');
498
- videosGroup.patchValue({
499
- title: res.config?.videos?.title ?? '',
500
- description: res.config?.videos?.description ?? ''
501
- });
502
- videosItems.clear();
503
- (res.config?.videos?.items ?? []).forEach(item => {
504
- videosItems.push(this.fb.group({
505
- title: [item?.title ?? ''],
506
- description: [item?.description ?? ''],
507
- blog_url: [item?.blog_url ?? ''],
508
- image_url: [item?.image_url ?? ''],
509
- video_url: [item?.video_url ?? '']
510
- }));
511
- });
512
- const integrationsGroup = this.form.get('integrations');
513
- const integrationsItems = integrationsGroup.get('items');
514
- integrationsGroup.patchValue({
515
- title: res.config?.integrations?.title ?? '',
516
- description: res.config?.integrations?.description ?? ''
517
- });
518
- integrationsItems.clear();
519
- (res.config?.integrations?.items ?? []).forEach(item => {
520
- integrationsItems.push(this.fb.group({
521
- title: [item?.title ?? ''],
522
- description: [item?.description ?? ''],
523
- blog_url: [item?.blog_url ?? ''],
524
- image_url: [item?.image_url ?? ''],
525
- video_url: [item?.video_url ?? '']
526
- }));
527
- });
528
- this.shardUrl = res?.config?.shard_url;
529
- this.form.patchValue(this.data);
530
- this.form.patchValue({
531
- cs_product_id: this.productsList.find(x => x.id === this.data?.cs_product_id),
532
- trial_product_id: this.productsList.find(x => x.id === this.data?.trial_product_id)
533
- });
534
- const navbarGroup = this.form.get('navbar');
535
- const navbarItems = navbarGroup.get('items');
536
- navbarItems.clear();
537
- (res.config?.navbar?.items ?? []).forEach(nav => {
538
- navbarItems.push(this.fb.group({
539
- title: [nav.title ?? ''],
540
- path: [nav.path ?? ''],
541
- subtitles: this.fb.array((nav.subtitles ?? []).map(sub => this.fb.group({
542
- title: [sub.title ?? ''],
543
- path: [sub.path ?? '']
544
- })))
545
- }));
546
- });
547
- const footerLinksGroup = this.form.get('footer_links');
548
- const footerLinksItems = footerLinksGroup.get('items');
549
- footerLinksItems.clear();
550
- (res.config?.footer_links?.items ?? []).forEach(link => {
551
- footerLinksItems.push(this.fb.group({
552
- title: [link?.title ?? ''],
553
- path: [link?.path ?? ''],
554
- subtitles: this.fb.array((link?.subtitles ?? []).map(sub => this.fb.group({
555
- title: [sub?.title ?? ''],
556
- path: [sub?.path ?? '']
557
- })))
558
- }));
559
- });
560
- if (res?.config?.cs_cta_iframe) {
561
- this.form.patchValue({
562
- cs_cta_iframe: JSON.parse(res?.config?.cs_cta_iframe)
563
- });
564
- }
565
- if (res?.config?.trial_cta_iframe) {
566
- this.form.patchValue({
567
- trial_cta_iframe: JSON.parse(res?.config?.trial_cta_iframe)
568
- });
569
- }
570
- const abTestsArray = this.abTests;
571
- abTestsArray.clear();
572
- if (Array.isArray(res.config?.ab_tests)) {
573
- (res.config?.ab_tests ?? []).forEach(test => {
574
- abTestsArray.push(this.fb.group({
575
- description: [test?.description ?? ''],
576
- experiment_name: [test?.experiment_name ?? ''],
577
- db_shard: [test?.db_shard ?? ''],
578
- microservice_name: [test?.microservice_name ?? '']
579
- }));
580
- });
581
- }
582
- })
583
- .add(() => {
584
- this.isLoading = false;
585
- });
586
- }
587
- ngAfterViewInit() {
588
- this.uploader.changes.subscribe(() => {
589
- this.childList = this.uploader.toArray();
590
- });
591
- }
592
- get f() {
593
- return this.form.controls;
594
- }
595
- sortObj(obj) {
596
- return Object.keys(obj)
597
- .sort((a, b) => a.localeCompare(b))
598
- .reduce((result, key) => {
599
- result[key] = obj[key];
600
- return result;
601
- }, {});
602
- }
603
- searchProduct(event) {
604
- this.productService
605
- .getProductList({ search: event?.query ?? '' }, this.subscriptionId)
606
- .subscribe(response => {
607
- this.productsList = this.groupProducts(response.products);
608
- });
609
- }
610
- groupProducts(products) {
611
- if (products?.length) {
612
- products = products.filter(x => x.dependency_products?.length < 1 && x.active);
613
- products = groupBy(products, 'currency');
614
- products = this.sortObj(products);
615
- let groupedArray = [];
616
- // eslint-disable-next-line no-restricted-syntax
617
- for (const p in products) {
618
- if (p in products) {
619
- const value = products[p].sort((a, b) => Number(b.price_per_unit) - Number(a.price_per_unit));
620
- groupedArray.push(...value);
621
- }
622
- }
623
- groupedArray = groupedArray.map(x => {
624
- return {
625
- id: x.id,
626
- name: `${x.name} | ${x.region} | ${x.billing_frequency} | ${x.min_units} x ${(x.price_per_unit / 100).toFixed(2)} | ${x.currency}`
627
- };
628
- });
629
- return groupedArray;
630
- }
631
- return [];
632
- }
633
- onSaveFile(event) {
634
- const item = this.childList.find(x => x.controlName === event.name);
635
- const formData = new FormData();
636
- const data = { subscription_id: this.subscriptionId };
637
- if (event.file) {
638
- data[event.name] = event.file;
639
- }
640
- else {
641
- data[`remove_${event.name}`] = true;
642
- }
643
- // eslint-disable-next-line no-restricted-syntax
644
- for (const key in data) {
645
- if (key in data) {
646
- formData.append(key, data[key]);
647
- }
648
- }
649
- const sub$ = this.id
650
- ? this.adminService.updateDomainConfig(this.id, formData)
651
- : this.adminService.createDomainConfig(formData);
652
- sub$.subscribe(() => {
653
- this.adminService
654
- .getDomainConfigById(this.id, this.subscriptionId)
655
- .subscribe(response => {
656
- item.clearValues();
657
- this.data[event.name] = response[event.name];
658
- });
659
- }).add(() => {
660
- item.buttonBusy = false;
661
- item.onClose();
662
- });
663
- }
664
- dropFooterSubtitles(i, event) {
665
- const control = this.getFooterSubtitles(i);
666
- moveItemInArray(control.controls, event.previousIndex, event.currentIndex);
667
- control.updateValueAndValidity();
668
- }
669
- dropNavbarSubtitles(i, event) {
670
- const subtitles = this.getNavbarSubtitles(i);
671
- moveItemInArray(subtitles.controls, event.previousIndex, event.currentIndex);
672
- subtitles.updateValueAndValidity();
673
- }
674
- dropBookDemoLinks(event) {
675
- const items = this.form.get('book_demo')?.get('items');
676
- moveItemInArray(items.controls, event.previousIndex, event.currentIndex);
677
- items.updateValueAndValidity();
678
- }
679
- dropContactUsOptions(questionIndex, event) {
680
- const options = this.getQuestionOptions(questionIndex);
681
- moveItemInArray(options.controls, event.previousIndex, event.currentIndex);
682
- options.updateValueAndValidity();
683
- }
684
- dropItems(control, event) {
685
- moveItemInArray(control.controls, event.previousIndex, event.currentIndex);
686
- control.updateValueAndValidity();
687
- }
688
- onSave() {
689
- this.submitted = true;
690
- this.buttonBusy = true;
691
- const data = {
692
- master_subscription_id: this.appConfig?.master_subscription?.subscription_id,
693
- subscription_id: this.subscriptionId,
694
- ...this.form.value
695
- };
696
- data.cs_product_id = this.form.get('cs_product_id').value?.id ?? null;
697
- data.trial_product_id = this.form.get('trial_product_id').value?.id ?? null;
698
- data['cs_cta_iframe'] = this.form.value?.cs_cta_iframe ?? '';
699
- data['trial_cta_iframe'] = this.form.value?.trial_cta_iframe ?? '';
700
- const sub$ = this.id
701
- ? this.adminService.updateDomainConfig(this.id, data)
702
- : this.adminService.createDomainConfig(data);
703
- sub$.subscribe({
704
- next: () => {
705
- this.toast.success(this.translation.translate('Admin.DomainConfig.UpdatedMessage'));
706
- }
707
- }).add(() => {
708
- this.submitted = false;
709
- this.buttonBusy = false;
710
- });
711
- }
712
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: DomainConfigBuildComponent, deps: [{ token: i0.Injector }, { token: i1.AdminService }, { token: i2.ProductService }, { token: i3.NgbModal }, { token: i4.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
713
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: DomainConfigBuildComponent, selector: "pw-domain-config-build", viewQueries: [{ propertyName: "partnerCropper", first: true, predicate: ["partnerCropper"], descendants: true }, { propertyName: "uploader", predicate: CustomUploaderComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<h3>Public Pages Configuration</h3>\n<div class=\"mb-4\">\n <p> The following parameters and settings will be applied to all public pages of this domain. </p>\n</div>\n<div class=\"w-100 text-center mt-3\"\n *ngIf=\"isLoading\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n</div>\n<ng-container *ngIf=\"!isLoading && data?.host_name\">\n <form [formGroup]=\"form\"\n (ngSubmit)=\"onSave()\">\n <div class=\"row\">\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.MasterSubscription' | transloco\"\n name=\"master_subscription_id\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.MasterSubscription' | transloco\">\n <p-dropdown\n [options]=\"masterSubscriptionsList\"\n formControlName=\"master_subscription_id\"\n [ngClass]=\"{ 'is-invalid': submitted && f['master_subscription_id']?.errors }\"\n placeholder=\"Select Master Subscription\">\n </p-dropdown>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.MasterSubscriptionProduct' | transloco\"\n [showTooltip]=\"true\"\n [tooltipText]=\"\n 'Admin.DomainConfig.Tooltip.MasterSubscriptionProduct' | transloco\n \"\n name=\"master_subscription_product_id\">\n <p-dropdown\n [options]=\"masterSubscriptionProductList\"\n formControlName=\"master_subscription_product_id\"\n [ngClass]=\"{'is-invalid': submitted && f['master_subscription_product_id']?.errors}\"\n [placeholder]=\"'Select Master Product'\"\n optionValue=\"id\"\n optionLabel=\"name\"\n >\n </p-dropdown>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.BlogFeatureKey' | transloco\"\n name=\"blog_feature_key\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.BlogFeatureKey' | transloco\">\n <input type=\"text\"\n class=\"form-control\"\n formControlName=\"blog_feature_key\"\n [ngClass]=\"{ 'is-invalid': submitted && f['blog_feature_key'].errors }\" />\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.MainTos' | transloco\"\n name=\"main_tos_id\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.MainTos' | transloco\">\n <p-dropdown\n [options]=\"subscriptionTosList\"\n formControlName=\"main_tos_id\"\n [ngClass]=\"{ 'is-invalid': submitted && f['main_tos_id']?.errors }\"\n [placeholder]=\"'Select Main TOS'\"\n optionValue=\"id\">\n <ng-template pTemplate=\"selectedItem\" let-item>\n <span [innerHTML]=\"item.title\"></span>\n </ng-template>\n <ng-template pTemplate=\"item\" let-item>\n <span [innerHTML]=\"item.title\"></span>\n </ng-template>\n </p-dropdown>\n\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.CrmSubscription' | transloco\"\n name=\"crm_subscription_id\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.CrmSubscription' | transloco\">\n <p-dropdown\n [options]=\"crmSubscriptionsList\"\n formControlName=\"crm_subscription_id\"\n [ngClass]=\"{ 'is-invalid': submitted && f['crm_subscription_id']?.errors }\"\n [placeholder]=\"'Select CRM Subscription'\"\n optionValue=\"id\">\n <ng-template pTemplate=\"selectedItem\" let-item>\n {{item?.organisation ? item?.organisation + ' - ' + item.contact_name : item?.contact_name}}\n </ng-template>\n <ng-template pTemplate=\"item\" let-item>\n {{item?.organisation ? item?.organisation + ' - ' + item.contact_name : item?.contact_name}}\n </ng-template>\n </p-dropdown>\n\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.CrmProduct' | transloco\"\n name=\"crm_product_id\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.CrmProduct' | transloco\">\n <p-dropdown\n [options]=\"crmProductList\"\n formControlName=\"crm_product_id\"\n [ngClass]=\"{ 'is-invalid': submitted && f['crm_product_id']?.errors }\"\n [placeholder]=\"'Select CRM Product'\"\n optionValue=\"id\"\n >\n <ng-template pTemplate=\"selectedItem\" let-item>\n {{item?.subscription_id ? item?.name +' - SubscriptionID = '+ item.subscription_id : item?.name}}\n </ng-template>\n <ng-template pTemplate=\"item\" let-item>\n {{item?.subscription_id ? item?.name +' - SubscriptionID = '+ item.subscription_id : item?.name}}\n </ng-template>\n </p-dropdown>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.CrmSource' | transloco\"\n name=\"crm_source_id\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.CrmSource' | transloco\">\n <p-dropdown\n [options]=\"crmSourcesList\"\n formControlName=\"crm_source_id\"\n [ngClass]=\"{ 'is-invalid': submitted && f['crm_source_id']?.errors }\"\n [placeholder]=\"'Select CRM Source'\"\n optionValue=\"id\"\n optionLabel=\"name\"\n >\n </p-dropdown>\n </pw-input-container>\n </div>\n <!-- crm subscription fields end-->\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.Active' | transloco\" [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.Active' | transloco\" name=\"active\">\n <ui-switch size=\"small\" uncheckedLabel=\"false\" checkedLabel=\"true\" formControlName=\"active\" name=\"active\"\n [ngClass]=\"{ 'is-invalid': submitted && f['active'].errors }\">\n </ui-switch>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.IsProductDomain' | transloco\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.IsProductDomain' | transloco\"\n name=\"is_product_domain\">\n <ui-switch size=\"small\"\n uncheckedLabel=\"false\"\n checkedLabel=\"true\"\n formControlName=\"is_product_domain\"\n name=\"is_product_domain\"\n [ngClass]=\"{ 'is-invalid': submitted && f['is_product_domain'].errors }\">\n </ui-switch>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.CanRegisterOnMainPage' | transloco\" [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.CanRegisterOnMainPage' | transloco\"\n name=\"can_register_through_main_page\">\n <ui-switch size=\"small\" uncheckedLabel=\"false\" checkedLabel=\"true\" formControlName=\"can_register_through_main_page\"\n name=\"can_register_through_main_page\" [ngClass]=\"{\n 'is-invalid': submitted && f['can_register_through_main_page'].errors\n }\">\n </ui-switch>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.SocialLoginEnabled' | transloco\" [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.SocialLoginEnable' | transloco\" name=\"social_login_enabled\">\n <ui-switch size=\"small\" uncheckedLabel=\"false\" checkedLabel=\"true\" formControlName=\"social_login_enabled\"\n name=\"social_login_enabled\" [ngClass]=\"{ 'is-invalid': submitted && f['social_login_enabled'].errors }\">\n </ui-switch>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.NotifyLogins' | transloco\" [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.NotifyLogins' | transloco\" name=\"notify_logins\">\n <ui-switch size=\"small\" uncheckedLabel=\"false\" checkedLabel=\"true\" formControlName=\"notify_logins\"\n name=\"notify_logins\" [ngClass]=\"{ 'is-invalid': submitted && f['notify_logins'].errors }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n\n <div class=\"my-5\">\n <h3>Pre-Built Pages Config (Resources, Landing Pages, etc)</h3>\n\n <p-accordion class=\"mt-5\">\n <p-accordionTab [header]=\"'Instructions - README FIRST'\">\n <div class=\"mb-3\">\n <p>We've built and maintain a collection of high-converting landing pages designed to help you quickly launch polished\n UIs for onboarding users.</p>\n <p><strong>Newsletter Subscription Pages:</strong><br> After configuring your domain, you can access pages like\n <strong>/join/cs1, /join/cs2, /join/cs3, etc.</strong>, specifically designed for newsletter sign-ups. <br>\n Subscribers from these pages will be listed in the <strong>SmartCRM module</strong>.</p>\n <p><strong>Trial Product Sign-Up Pages:</strong><br> For users interested in trial products, utilize pages such as\n <strong>/join/trial1, /join/trial2, /join/trial3, etc.</strong>.<br> Users registering through these pages will\n appear in the <strong>Admin > Users section</strong>.</p>\n <p>Once you've selected the landing page you want to use <strong>(e.g., /join/trial3)</strong>, make sure to update\n the <strong>Internal Path</strong> in the <strong>Core tab</strong> accordingly\u2014i.e., set it to\n <strong>/join/trial3</strong>.</p>\n <p>If you need assistance integrating these pages into your workflow or have further questions, feel free to reach\n out.</p>\n </div>\n </p-accordionTab>\n\n <p-accordionTab [header]=\"'Subscribe to Product/Newsletter Config'\">\n <div class=\"mb-3\">\n <p>Trial Pages will enable users to sign up to real products and are accessible at the path /join/trial1,\n /join/trial2, etc.</p>\n <p>ComingSoon Pages will enable users to subscribe to Newsletters and are accessible at the internal paths\n /join/cs1, /join/cs2, etc.</p>\n </div>\n <!-- live page link -->\n <div class=\"text-end\" *ngIf=\"shardUrl\">\n <span>See the live page <span class=\"tooltip-wrap ms-1\" [appendTo]=\"'body'\"\n [pTooltip]=\"'Admin.DomainConfig.Tooltip.SeeLiveTrial' | transloco\" tooltipPosition=\"top\">\n <i class=\"fas fa-info-circle\"></i>\n </span> : <a [href]=\"shardUrl + '/join/trial1'\" target=\"_blank\">{{ shardUrl }}/join/trial1</a></span>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.TrialProduct' | transloco\" [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.TrialProduct' | transloco\" name=\"trial_product_id\">\n <p-autoComplete [suggestions]=\"productsList\" formControlName=\"trial_product_id\" dataKey=\"id\" field=\"name\"\n [dropdown]=\"true\" [delay]=\"1000\" (completeMethod)=\"searchProduct($event)\" styleClass=\"w-100\"\n placeholder=\"Search Product\" [inputStyle]=\"\n form.get('trial_product_id').touched &&\n form.get('trial_product_id').invalid\n ? { border: '1px solid #ff586b' }\n : { border: '1px solid gray' }\n \" [multiple]=\"false\">\n </p-autoComplete>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.TrialCrmSourceId' | transloco\" name=\"trial_crm_source_id\"\n [showTooltip]=\"true\" [tooltipText]=\"\n 'Admin.DomainConfig.Tooltip.TrialCrmSourceId' | transloco\n \">\n <p-dropdown [options]=\"crmSourcesList\" formControlName=\"trial_crm_source_id\"\n [ngClass]=\"{ 'is-invalid': submitted && f['trial_crm_source_id']?.errors }\"\n [placeholder]=\"'Select CRM Source'\" optionValue=\"id\" optionLabel=\"name\">\n </p-dropdown>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.TrialPdfSourceId' | transloco\" name=\"trial_pdf_source_id\"\n [showTooltip]=\"true\" [tooltipText]=\"\n 'Admin.DomainConfig.Tooltip.TrialPdfSourceId' | transloco\n \">\n <p-dropdown [options]=\"crmSourcesList\" formControlName=\"trial_pdf_source_id\"\n [ngClass]=\"{ 'is-invalid': submitted && f['trial_pdf_source_id']?.errors }\"\n [placeholder]=\"'Select CRM Source'\" optionValue=\"id\" optionLabel=\"name\">\n </p-dropdown>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\"></div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.TrialVideoUrl' | transloco\" name=\"trial_video_url\"\n [showTooltip]=\"true\" [tooltipText]=\"'Admin.DomainConfig.Tooltip.TrialVideoUrl' | transloco\">\n <input type=\"text\" class=\"form-control\" formControlName=\"trial_video_url\"\n [ngClass]=\"{ 'is-invalid': submitted && f['trial_video_url'].errors }\" />\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.TrialBookDemoUrl' | transloco\" name=\"trial_book_demo_url\"\n [showTooltip]=\"true\" [tooltipText]=\"\n 'Admin.DomainConfig.Tooltip.TrialBookDemoUrl' | transloco\n \">\n <input type=\"text\" class=\"form-control\" formControlName=\"trial_book_demo_url\" [ngClass]=\"{\n 'is-invalid': submitted && f['trial_book_demo_url'].errors\n }\" />\n </pw-input-container>\n </div>\n <div class=\"col-12\">\n <pw-input-container [label]=\"'Admin.DomainConfig.TrialCtaIframe' | transloco\" name=\"trial_cta_iframe\"\n [showTooltip]=\"true\" [tooltipText]=\"\n 'Admin.DomainConfig.Tooltip.TrialCtaIframe' | transloco\n \">\n <textarea rows=\"3\" class=\"form-control\" formControlName=\"trial_cta_iframe\" [ngClass]=\"{\n 'is-invalid': submitted && f['trial_cta_iframe'].errors\n }\">\n </textarea>\n </pw-input-container>\n </div>\n <div class=\"col-12\">\n <pw-input-container [label]=\"'Admin.DomainConfig.TrialJoinMessage' | transloco\" name=\"trial_join_message\"\n [showTooltip]=\"true\" [tooltipText]=\"\n 'Admin.DomainConfig.Tooltip.TrialJoinMessage' | transloco\n \">\n <textarea rows=\"3\" class=\"form-control\" formControlName=\"trial_join_message\" [ngClass]=\"{\n 'is-invalid': submitted && f['trial_join_message'].errors\n }\">\n </textarea>\n </pw-input-container>\n </div>\n <div class=\"col-12\">\n <pw-input-container [label]=\"'Admin.DomainConfig.TrialPdfDownloadText' | transloco\" name=\"trial_pdf_download_text\"\n [showTooltip]=\"true\" [tooltipText]=\"\n 'Admin.DomainConfig.Tooltip.TrialPdfDownloadText' | transloco\n \">\n <textarea rows=\"3\" class=\"form-control\" formControlName=\"trial_pdf_download_text\" [ngClass]=\"{\n 'is-invalid': submitted && f['trial_pdf_download_text'].errors\n }\">\n </textarea>\n </pw-input-container>\n </div>\n </div>\n <div class=\"row\" matchHeight=\"card\">\n <div class=\"col-md-4\">\n <label for=\"trial_image\">{{ 'Admin.DomainConfig.TrialImage' | transloco }} <span class=\"info-circle\">\n <span class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.DomainConfig.Tooltip.TrialImage' | transloco\n }}</span>\n </span>\n </label>\n <pw-custom-uploader (saveEvent)=\"onSaveFile($event)\" [aspectRatio]=\"'custom'\" [title]=\"'Trial Image'\"\n [controlName]=\"'trial_image'\" [previewData]=\"data['trial_image']\">\n </pw-custom-uploader>\n </div>\n <div class=\"col-md-4\">\n <label for=\"trial_image2\">{{ 'Admin.DomainConfig.TrialImage2' | transloco }} <span class=\"info-circle\">\n <span class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.DomainConfig.Tooltip.TrialImage2' | transloco\n }}</span>\n </span>\n </label>\n <pw-custom-uploader (saveEvent)=\"onSaveFile($event)\" [title]=\"'Trial Image2'\" [aspectRatio]=\"'custom'\"\n [controlName]=\"'trial_image2'\" [previewData]=\"data['trial_image2']\">\n </pw-custom-uploader>\n </div>\n <div class=\"col-md-4\">\n <label for=\"trial_pdf_image\">{{ 'Admin.DomainConfig.TrialPdfImage' | transloco }} <span class=\"info-circle\">\n <span class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.DomainConfig.Tooltip.TrialPdfImage' | transloco\n }}</span>\n </span>\n </label>\n <pw-custom-uploader (saveEvent)=\"onSaveFile($event)\" [title]=\"'Trial Pdf Image'\" [aspectRatio]=\"'custom'\"\n [controlName]=\"'trial_pdf_image'\" [previewData]=\"data['trial_pdf_image']\">\n </pw-custom-uploader>\n </div>\n <div class=\"col-md-4\">\n <label for=\"trial_image_bg\">{{ 'Admin.DomainConfig.TrialImageBg' | transloco }} <span class=\"info-circle\">\n <span class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.DomainConfig.Tooltip.TrialImageBg' | transloco\n }}</span>\n </span>\n </label>\n <pw-custom-uploader (saveEvent)=\"onSaveFile($event)\" [title]=\"'Trial Image Bg'\" [aspectRatio]=\"'custom'\"\n [controlName]=\"'trial_image_bg'\" [previewData]=\"data['trial_image_bg']\">\n </pw-custom-uploader>\n </div>\n <div class=\"col-md-4\">\n <label for=\"trial_image_bg2\">{{ 'Admin.DomainConfig.TrialImageBg2' | transloco }} <span class=\"info-circle\">\n <span class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.DomainConfig.Tooltip.TrialImageBg2' | transloco\n }}</span>\n </span>\n </label>\n <pw-custom-uploader (saveEvent)=\"onSaveFile($event)\" [title]=\"'Trial Image Bg2'\" [aspectRatio]=\"'custom'\"\n [controlName]=\"'trial_image_bg2'\" [previewData]=\"data['trial_image_bg2']\">\n </pw-custom-uploader>\n </div>\n </div>\n </p-accordionTab>\n\n <p-accordionTab [header]=\"'Header Section'\">\n <div class=\"row mt-4\" formGroupName=\"header\">\n <h4 class=\"mb-4\">Header Section</h4>\n\n <!-- Headline -->\n <div class=\"col-12 col-md-12\">\n <pw-input-container label=\"Header Headline\" name=\"headline\">\n <input type=\"text\" class=\"form-control\" formControlName=\"headline\" />\n </pw-input-container>\n </div>\n\n <!-- Video URL -->\n <div class=\"col-12 col-md-6\">\n <pw-input-container label=\"Header Video URL\" name=\"video_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"video_url\" />\n </pw-input-container>\n </div>\n\n <!-- Background Image URL -->\n <div class=\"col-12 col-md-6\">\n <pw-input-container label=\"Header Background Image URL\" name=\"bg_image_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"bg_image_url\" />\n </pw-input-container>\n </div>\n\n <!-- Description -->\n <div class=\"col-12\">\n <pw-input-container label=\"Header Description\" name=\"description\">\n <textarea\n class=\"form-control\"\n rows=\"5\"\n formControlName=\"description\"\n [ngClass]=\"{ 'is-invalid': submitted && f['description']?.errors }\"\n ></textarea>\n </pw-input-container>\n </div>\n\n <!-- Sub Headings -->\n <div formArrayName=\"sub_headings\" class=\"col-12\" cdkDropList (cdkDropListDropped)=\"dropItems(headerSubHeadings, $event)\">\n <div\n *ngFor=\"let sub of f['header'].get('sub_headings')['controls']; let i = index\"\n [formGroupName]=\"i\"\n class=\"row mb-3 align-items-center\"\n cdkDrag\n >\n <div class=\"col-md-10\">\n <pw-input-container label=\"Sub Header Description\" name=\"description\">\n <textarea\n class=\"form-control\"\n rows=\"3\"\n formControlName=\"description\"\n [ngClass]=\"{ 'is-invalid': submitted && f['description']?.errors }\"\n ></textarea>\n </pw-input-container>\n </div>\n\n <div class=\"col-md-1 d-flex justify-content-end mt-3\">\n <i\n class=\"fa fa-trash delete-icon text-danger\"\n (click)=\"removeHeaderSubHeading(i)\"\n (keydown.enter)=\"removeHeaderSubHeading(i)\"\n (keydown.space)=\"removeHeaderSubHeading(i)\"\n ngbTooltip=\"Remove\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <div class=\"col-md-1 d-flex justify-content-end mt-3\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <button type=\"button\" class=\"btn btn-primary mt-2 mb-2\" (click)=\"addHeaderSubHeading()\">\n + Add Sub Heading\n </button>\n </div>\n </div>\n </p-accordionTab>\n\n\n <p-accordionTab [header]=\"'Resources Section'\">\n <div class=\"row row mt-4 mb-4\">\n <h4 class=\"mb-3\">Resources Section</h4>\n <div class=\"col-12 col-sm-6\">\n <pw-input-container [label]=\"'Admin.DomainConfig.ResourceTagline' | transloco\" name=\"resources_tagline\"\n [showTooltip]=\"true\" [tooltipText]=\"'Admin.DomainConfig.Tooltip.ResourceTagline' | transloco\">\n <input type=\"text\" class=\"form-control\" formControlName=\"resources_tagline\"\n [ngClass]=\"{ 'is-invalid': submitted && f['resources_tagline'].errors }\" />\n </pw-input-container>\n </div>\n <div class=\"col-12\">\n <pw-input-container [label]=\"'Admin.DomainConfig.ResourceDescription' | transloco\" name=\"resources_description\"\n [showTooltip]=\"true\" [tooltipText]=\"'Admin.DomainConfig.Tooltip.ResourceDescription' | transloco\">\n <textarea class=\"form-control\" rows=\"3\" formControlName=\"resources_description\"\n [ngClass]=\"{ 'is-invalid': submitted && f['resources_description'].errors }\">\n </textarea>\n </pw-input-container>\n </div>\n </div>\n <div class=\"row\" matchHeight=\"card\">\n <div class=\"col-md-4\">\n <label for=\"resource_image\">{{ 'Admin.DomainConfig.ResourceImage' | transloco }} <span class=\"info-circle\">\n <span class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.DomainConfig.Tooltip.ResourceImage' | transloco\n }}</span>\n </span>\n </label>\n <pw-custom-uploader (saveEvent)=\"onSaveFile($event)\" [aspectRatio]=\"'custom'\" [title]=\"'Cs Image'\"\n [controlName]=\"'resources_image'\" [previewData]=\"data['resources_image']\">\n </pw-custom-uploader>\n </div>\n </div>\n </p-accordionTab>\n\n <p-accordionTab [header]=\"'Unique Selling Proposition Section (USP) '\">\n <div class=\"row mt-4 mb-4\" formGroupName=\"usps\">\n <h4 class=\"mb-4\">Unique Selling Proposition Section (USP)</h4>\n\n <div class=\"col-12 col-md-6\">\n <pw-input-container label=\"USPs Title\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-12 col-md-6\">\n <pw-input-container label=\"USPs Video Url\" name=\"video_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"video_url\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-12\">\n <pw-input-container label=\"USPs Description\" name=\"description\">\n <textarea class=\"form-control\" rows=\"3\" formControlName=\"description\"></textarea>\n </pw-input-container>\n </div>\n\n <!-- USP Items -->\n <div formArrayName=\"items\" class=\"col-12\" cdkDropList (cdkDropListDropped)=\"dropItems(uspsItems, $event)\">\n <div\n *ngFor=\"let item of f['usps'].get('items')['controls']; let i = index\"\n [formGroupName]=\"i\"\n class=\"row mb-3 align-items-center\"\n cdkDrag\n >\n <div class=\"col-sm-10\">\n <pw-input-container label=\"Item Description\" name=\"description\">\n <textarea class=\"form-control\" rows=\"3\" formControlName=\"description\"></textarea>\n </pw-input-container>\n </div>\n\n <div class=\"col-sm-1 d-flex justify-content-end mt-3\">\n <i\n class=\"fa fa-trash delete-icon text-danger\"\n (click)=\"removeUspItem(i)\"\n (keydown.enter)=\"removeUspItem(i)\"\n (keydown.space)=\"removeUspItem(i)\"\n ngbTooltip=\"Remove\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <div class=\"col-sm-1 d-flex justify-content-end mt-3\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <button type=\"button\" class=\"btn btn-primary mt-2 mb-2\" (click)=\"addUspItem()\">\n + Add USP Item\n </button>\n </div>\n </div>\n </p-accordionTab>\n\n\n <p-accordionTab [header]=\"'Partners (Clients) Section'\">\n <div class=\"row mt-4 mb-4\" formGroupName=\"partners\">\n <h4 class=\"mb-4\">Partners (Clients) Section</h4>\n\n <!-- Title -->\n <div class=\"col-12 col-md-6\">\n <pw-input-container label=\"Partner Title\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n </div>\n\n <!-- Description -->\n <div class=\"col-12\">\n <pw-input-container label=\"Partners Description\" name=\"description\">\n <textarea class=\"form-control\" rows=\"3\" formControlName=\"description\"></textarea>\n </pw-input-container>\n </div>\n\n <!-- Partner Items with Drag Support -->\n <div formArrayName=\"items\" class=\"col-12\" cdkDropList (cdkDropListDropped)=\"dropItems(partnersItems, $event)\">\n <div\n *ngFor=\"let item of partnersItems.controls; let i = index\"\n [formGroupName]=\"i\"\n class=\"row border p-3 mb-3 align-items-start\"\n cdkDrag\n >\n <!-- Name -->\n <div class=\"col-md-6\">\n <pw-input-container label=\"Name\" class=\"col-12\" name=\"name\">\n <input class=\"form-control\" formControlName=\"name\" />\n </pw-input-container>\n </div>\n\n <!-- Blog URL + Drag Handle -->\n <div class=\"col-md-5\">\n <pw-input-container label=\"Blog Url\" name=\"blog_url\">\n <input class=\"form-control\" formControlName=\"blog_url\" />\n </pw-input-container>\n </div>\n\n\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-3\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder question\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n\n <!-- Video URL -->\n <div class=\"col-md-6\">\n <pw-input-container label=\"Video Url\" name=\"video_url\">\n <input class=\"form-control\" formControlName=\"video_url\" />\n </pw-input-container>\n </div>\n\n <!-- Image URL -->\n <div class=\"col-md-6\">\n <pw-input-container label=\"Image Url\" name=\"image_url\">\n <input class=\"form-control\" formControlName=\"image_url\" />\n </pw-input-container>\n </div>\n\n <!-- Delete Icon -->\n <div class=\"col-md-12 text-end mt-2\">\n <i\n ngbTooltip=\"Remove\"\n (click)=\"removePartnerItem(i)\"\n (keydown.enter)=\"removePartnerItem(i)\"\n (keydown.space)=\"removePartnerItem(i)\"\n class=\"fa fa-trash delete-icon text-danger\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <!-- Add New Partner -->\n <div class=\"text-start mt-2\">\n <button type=\"button\" class=\"btn btn-primary mt-2 mb-2\" (click)=\"addPartnerItem()\">+ Add Partner</button>\n </div>\n </div>\n </div>\n </p-accordionTab>\n\n\n <p-accordionTab [header]=\"'Testimonials Section'\">\n <div class=\"row mt-3 mb-4\" formGroupName=\"testimonials\">\n <h4 class=\"mb-4\">Testimonials Section</h4>\n\n <pw-input-container label=\"Title\" class=\"col-12 col-md-6\" name=\"testimonials_title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n\n <pw-input-container label=\"Description\" class=\"col-12\" name=\"testimonials_description\">\n <textarea rows=\"3\" class=\"form-control\" formControlName=\"description\"></textarea>\n </pw-input-container>\n\n <!-- Items List -->\n <div formArrayName=\"items\" class=\"col-12 mt-3\" cdkDropList (cdkDropListDropped)=\"dropItems(testimonialsItems, $event)\">\n <div\n *ngFor=\"let item of testimonialsItems.controls; let i = index\"\n [formGroupName]=\"i\"\n class=\"row border p-3 mb-3 align-items-start\"\n cdkDrag\n >\n <div class=\"col-md-6\">\n <pw-input-container label=\"Name\" name=\"name\">\n <input type=\"text\" class=\"form-control\" formControlName=\"name\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-md-5\">\n <pw-input-container label=\"Blog URL\" name=\"blog_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"blog_url\" />\n </pw-input-container>\n </div>\n\n\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-3\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder question\"\n aria-hidden=\"true\"\n ></i>\n </div>\n <pw-input-container label=\"Image URL\" class=\"col-md-6\" name=\"image_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"image_url\" />\n </pw-input-container>\n\n <pw-input-container label=\"Video URL\" class=\"col-md-6\" name=\"video_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"video_url\" />\n </pw-input-container>\n\n <pw-input-container label=\"Testimonial\" class=\"col-md-10\" name=\"testimonial\">\n <textarea class=\"form-control\" rows=\"3\" formControlName=\"testimonial\"></textarea>\n </pw-input-container>\n\n <div class=\"col-md-2 d-flex align-items-start mt-3\">\n <i\n class=\"fa fa-trash delete-icon text-danger\"\n ngbTooltip=\"Remove\"\n (click)=\"removeTestimonialItem(i)\"\n (keydown.enter)=\"removeTestimonialItem(i)\"\n (keydown.space)=\"removeTestimonialItem(i)\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <div class=\"text-start mt-2\">\n <button type=\"button\" class=\"btn btn-primary mt-2 mb-2\" (click)=\"addTestimonialItem()\">\n + Add Testimonial\n </button>\n </div>\n </div>\n </div>\n </p-accordionTab>\n\n <p-accordionTab [header]=\"'Video Section'\">\n <div class=\"row mt-3 mb-4\" formGroupName=\"videos\">\n <h4 class=\"mb-3\">Video Section</h4>\n\n <pw-input-container label=\"Title\" class=\"col-12 col-md-6\" name=\"videos_title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n\n <pw-input-container label=\"Description\" class=\"col-12\" name=\"videos_description\">\n <textarea rows=\"3\" class=\"form-control\" formControlName=\"description\"></textarea>\n </pw-input-container>\n\n <!-- Video Items -->\n <div\n formArrayName=\"items\"\n class=\"col-12 mt-3\"\n cdkDropList\n (cdkDropListDropped)=\"dropItems(videosItems, $event)\"\n >\n <div\n *ngFor=\"let item of videosItems.controls; let i = index\"\n [formGroupName]=\"i\"\n class=\"row border p-3 mb-3 align-items-start\"\n cdkDrag\n >\n <div class=\"col-md-6\">\n <pw-input-container label=\"Title\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-md-5\">\n <pw-input-container label=\"Blog URL\" name=\"blog_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"blog_url\" />\n </pw-input-container>\n </div>\n\n\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-3\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder question\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <pw-input-container label=\"Image URL\" class=\"col-md-6\" name=\"image_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"image_url\" />\n </pw-input-container>\n\n <pw-input-container label=\"Video URL\" class=\"col-md-6\" name=\"video_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"video_url\" />\n </pw-input-container>\n\n <pw-input-container label=\"Description\" class=\"col-md-10\" name=\"description\">\n <textarea class=\"form-control\" rows=\"3\" formControlName=\"description\"></textarea>\n </pw-input-container>\n\n <div class=\"col-md-2 d-flex align-items-start mt-3\">\n <i\n class=\"fa fa-trash delete-icon text-danger\"\n (click)=\"removeVideoItem(i)\"\n (keydown.enter)=\"removeVideoItem(i)\"\n (keydown.space)=\"removeVideoItem(i)\"\n ngbTooltip=\"Remove\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <div class=\"text-start mt-2\">\n <button type=\"button\" class=\"btn btn-primary mt-2 mb-2\" (click)=\"addVideoItem()\">\n + Add Video\n </button>\n </div>\n </div>\n </div>\n </p-accordionTab>\n\n\n <p-accordionTab [header]=\"'Call to Actions Section (CTAs)'\">\n <div class=\"row mt-4 mb-4\" formGroupName=\"ctas\">\n <h4 class=\"mb-4\">CTAs Section</h4>\n\n <div class=\"col-12 col-md-6\">\n <pw-input-container label=\"Title\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-12 col-md-6\">\n <pw-input-container label=\"Image URL\" name=\"image_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"image_url\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-12 col-md-6\">\n <pw-input-container label=\"Button Text\" name=\"button_text\">\n <input type=\"text\" class=\"form-control\" formControlName=\"button_text\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-12\">\n <pw-input-container label=\"Description\" name=\"description\">\n <input type=\"text\" class=\"form-control\" formControlName=\"description\" />\n </pw-input-container>\n </div>\n\n <!-- CTA Items -->\n <div formArrayName=\"items\" class=\"col-12 mt-3\" cdkDropList (cdkDropListDropped)=\"dropItems(ctasItems, $event)\">\n <div\n *ngFor=\"let item of ctasItems.controls; let i = index\"\n [formGroupName]=\"i\"\n class=\"row border p-3 mb-3 align-items-start\"\n cdkDrag\n >\n <div class=\"col-12 col-md-6\">\n <pw-input-container label=\"Image URL\" name=\"image_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"image_url\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-md-5\">\n <pw-input-container label=\"Cta URL\" name=\"cta_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"cta_url\" />\n </pw-input-container>\n </div>\n\n\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-3\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder question\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <div class=\"col-12 col-md-6\">\n <pw-input-container label=\"Video URL\" name=\"video_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"video_url\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-12 col-md-6\">\n <pw-input-container label=\"CTA Title\" name=\"title\">\n <input class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-12 col-md-6\">\n <pw-input-container label=\"CTA Description\" name=\"description\">\n <input class=\"form-control\" formControlName=\"description\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-12 col-md-5\">\n <pw-input-container label=\"Button Text\" name=\"button_text\">\n <input class=\"form-control\" formControlName=\"button_text\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-md-1 d-flex align-items-center mt-3\">\n <i\n class=\"fa fa-trash delete-icon\"\n (click)=\"removeCtasItem(i)\"\n (keydown.enter)=\"removeCtasItem(i)\"\n (keydown.space)=\"removeCtasItem(i)\"\n ngbTooltip=\"Remove\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <div class=\"text-start mt-2\">\n <button type=\"button\" class=\"btn btn-primary mt-2 mb-2\" (click)=\"addCtasItem()\">+ Add CTA Item</button>\n </div>\n </div>\n </div>\n </p-accordionTab>\n\n <p-accordionTab [header]=\"'Integrations Section'\">\n <div class=\"row mt-3 mb-4\" formGroupName=\"integrations\">\n <h4 class=\"mb-3\">Integrations Section</h4>\n\n <pw-input-container label=\"Title\" class=\"col-12\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n\n <pw-input-container label=\"Description\" class=\"col-12\" name=\"description\">\n <textarea class=\"form-control\" formControlName=\"description\" rows=\"3\"></textarea>\n </pw-input-container>\n\n <div formArrayName=\"items\" class=\"col-12\" cdkDropList (cdkDropListDropped)=\"dropItems(integrationsItems, $event)\">\n <div\n *ngFor=\"let item of integrationsItems.controls; let i = index\"\n [formGroupName]=\"i\"\n class=\"row border p-3 mb-3 rounded bg-light\"\n cdkDrag\n >\n <pw-input-container label=\"Title\" class=\"col-md-6\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n\n <div class=\"col-md-5\">\n <pw-input-container label=\"Description\" name=\"description\">\n <input type=\"text\" class=\"form-control\" formControlName=\"description\" />\n </pw-input-container>\n </div>\n\n\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-3\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder question\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <pw-input-container label=\"Blog URL\" class=\"col-md-6\" name=\"blog_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"blog_url\" />\n </pw-input-container>\n\n <pw-input-container label=\"Image URL\" class=\"col-md-6\" name=\"image_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"image_url\" />\n </pw-input-container>\n\n <pw-input-container label=\"Video URL\" class=\"col-md-6\" name=\"video_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"video_url\" />\n </pw-input-container>\n\n <div class=\"col-md-6 d-flex align-items-end justify-content-end\">\n <i\n class=\"fa fa-trash delete-icon align-self-center\"\n (click)=\"removeIntegrationItem(i)\"\n (keydown.enter)=\"removeIntegrationItem(i)\"\n (keydown.space)=\"removeIntegrationItem(i)\"\n ngbTooltip=\"Remove\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <div class=\"text-start mt-2\">\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"addIntegrationItem()\">+ Add Integration</button>\n </div>\n </div>\n </div>\n </p-accordionTab>\n\n\n <p-accordionTab [header]=\"'Contact Us Section'\">\n <div class=\"row mt-3 mb-4\" formGroupName=\"contact_us\">\n <h4 class=\"mb-3\">Contact Us Section</h4>\n\n <pw-input-container label=\"Url\" class=\"col-md-6\" name=\"url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"url\" />\n </pw-input-container>\n <pw-input-container label=\"Description\" class=\"col-12\" name=\"contact_us_description\">\n <textarea rows=\"3\" class=\"form-control\" formControlName=\"description\"></textarea>\n </pw-input-container>\n\n <div formArrayName=\"questions\" class=\"col-12 mt-3\" cdkDropList (cdkDropListDropped)=\"dropItems(contactUsQuestions, $event)\">\n <div\n *ngFor=\"let questionGroup of contactUsQuestions.controls; let i = index\"\n [formGroupName]=\"i\"\n class=\"row border p-3 mb-3\"\n cdkDrag\n >\n <pw-input-container label=\"Question\" class=\"col-md-10\" name=\"question\">\n <input type=\"text\" class=\"form-control\" formControlName=\"question\" />\n </pw-input-container>\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-3\">\n <i\n class=\"fa fa-trash delete-icon text-danger\"\n (click)=\"removeContactUsQuestion(i)\"\n (keydown.enter)=\"removeContactUsQuestion(i)\"\n (keydown.space)=\"removeContactUsQuestion(i)\"\n ngbTooltip=\"Remove\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-3\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder question\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <div class=\"col-12 mt-3\" formArrayName=\"options\" cdkDropList [cdkDropListData]=\"getQuestionOptions(i).controls\" (cdkDropListDropped)=\"dropContactUsOptions(i, $event)\">\n <div\n class=\"row align-items-center mb-2 border p-3\"\n *ngFor=\"let option of getQuestionOptions(i).controls; let j = index\"\n [formGroupName]=\"j\"\n cdkDrag\n >\n <pw-input-container label=\"Option\" class=\"col-md-10\" name=\"option\">\n <input type=\"text\" class=\"form-control\" formControlName=\"option\" />\n </pw-input-container>\n\n <div class=\"col-md-1 d-flex justify-content-end mt-3\">\n <i\n class=\"fa fa-trash delete-icon text-danger\"\n (click)=\"removeContactUsOption(i, j)\"\n (keydown.enter)=\"removeContactUsOption(i, j)\"\n (keydown.space)=\"removeContactUsOption(i, j)\"\n ngbTooltip=\"Remove Option\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <div class=\"col-md-1 d-flex justify-content-end mt-3\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder option\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <div class=\"text-start\">\n <button type=\"button\" class=\"btn btn-primary btn-sm\" (click)=\"addContactUsOption(i)\">\n + Add Option\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"text-start mt-3\">\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"addContactUsQuestion()\">\n + Add Question\n </button>\n </div>\n </div>\n\n <div formArrayName=\"hubspot\" class=\"col-12 mt-4\" cdkDropList (cdkDropListDropped)=\"dropItems(contactUsHubspotItems, $event)\">\n <h5 class=\"mb-4\">Hubspot Embeds</h5>\n\n <div\n *ngFor=\"let hub of contactUsHubspotItems.controls; let i = index\"\n [formGroupName]=\"i\"\n class=\"row border p-3 mb-2\"\n cdkDrag\n >\n <pw-input-container label=\"ID\" class=\"col-md-5\" name=\"id\">\n <input type=\"text\" class=\"form-control\" formControlName=\"id\" />\n </pw-input-container>\n\n <pw-input-container label=\"Position\" class=\"col-md-6\" name=\"position\">\n <input type=\"text\" class=\"form-control\" formControlName=\"position\" />\n </pw-input-container>\n <div class=\"col-md-1 d-flex align-items-start justify-content-end mt-3\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <pw-input-container label=\"Div\" class=\"col-10\" name=\"div\">\n <textarea\n class=\"form-control\"\n rows=\"5\"\n formControlName=\"div\"\n [ngClass]=\"{ 'is-invalid': submitted && f['div']?.errors }\"\n ></textarea>\n </pw-input-container>\n\n <div class=\"col-md-2 d-flex align-items-center mt-3\">\n <i\n class=\"fa fa-trash delete-icon\"\n (click)=\"removeHubspotItem(i)\"\n (keydown.enter)=\"removeHubspotItem(i)\"\n (keydown.space)=\"removeHubspotItem(i)\"\n ngbTooltip=\"Remove Hubspot Embed\"\n aria-hidden=\"true\">\n</i>\n </div>\n </div>\n\n <div class=\"text-start mt-2\">\n <button type=\"button\" class=\"btn btn-primary btn-sm\" (click)=\"addHubspotItem()\">\n + Add Hubspot Embed\n </button>\n </div>\n </div>\n\n </div>\n </p-accordionTab>\n\n\n <p-accordionTab [header]=\"'Book a Demo Section'\">\n <div class=\"row mt-4\">\n <div class=\"col-12\">\n <h4 class=\"mb-3\">{{ 'Admin.DomainConfig.BookDemoLinks' | transloco }}</h4>\n <div formGroupName=\"book_demo\">\n <pw-input-container label=\"Title\" name=\"title\">\n <input type=\"text\" formControlName=\"title\" class=\"form-control\" />\n </pw-input-container>\n\n <pw-input-container label=\"Description\" name=\"description\">\n <input type=\"text\" formControlName=\"description\" class=\"form-control\" />\n </pw-input-container>\n\n <div formArrayName=\"items\" cdkDropList (cdkDropListDropped)=\"dropBookDemoLinks($event)\">\n <div\n *ngFor=\"let link of f['book_demo'].get('items')['controls']; let i = index\"\n [formGroupName]=\"i\"\n class=\"row mb-3 border p-3 align-items-center\"\n cdkDrag\n >\n <div class=\"col-sm-5\">\n <pw-input-container label=\"Link Title\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-sm-5\">\n <pw-input-container label=\"Link URL\" name=\"url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"url\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-sm-1 d-flex justify-content-end mt-3\">\n <i\n ngbTooltip=\"Remove\"\n (click)=\"removeBookDemoLink(i)\"\n (keydown.enter)=\"removeBookDemoLink(i)\"\n (keydown.space)=\"removeBookDemoLink(i)\"\n class=\"fa fa-trash delete-icon text-danger\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <div class=\"col-sm-1 d-flex justify-content-end mt-3\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <button type=\"button\" class=\"btn btn-primary mt-2 mb-2\" (click)=\"addBookDemoLink()\">\n + Add Book Demo Link\n </button>\n </div>\n </div>\n </div>\n </div>\n </p-accordionTab>\n\n\n <p-accordionTab [header]=\"'Navbar Section'\">\n <div class=\"row mt-3 mb-4\" formGroupName=\"navbar\">\n <h4 class=\"mb-3\">Navbar Section</h4>\n\n <div formArrayName=\"items\" class=\"col-12\" cdkDropList (cdkDropListDropped)=\"dropItems(navbarItems, $event)\">\n <div\n *ngFor=\"let item of navbarItems.controls; let i = index\"\n [formGroupName]=\"i\"\n class=\"row mb-3\"\n cdkDrag\n >\n <div class=\"row align-items-center\">\n <pw-input-container label=\"Title\" class=\"col-md-5\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n\n <pw-input-container label=\"Path\" class=\"col-md-5\" name=\"path\">\n <input type=\"text\" class=\"form-control\" formControlName=\"path\" />\n </pw-input-container>\n\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-1\">\n <i\n class=\"fa fa-trash delete-icon text-danger\"\n (click)=\"removeNavbarItem(i)\"\n (keydown.enter)=\"removeNavbarItem(i)\"\n (keydown.space)=\"removeNavbarItem(i)\"\n ngbTooltip=\"Remove Navbar Item\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-1\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <div\n class=\"col-12 mt-3\"\n formArrayName=\"subtitles\"\n cdkDropList\n [cdkDropListData]=\"getNavbarSubtitles(i).controls\"\n (cdkDropListDropped)=\"dropNavbarSubtitles(i, $event)\"\n >\n <div\n *ngFor=\"let sub of getNavbarSubtitles(i).controls; let j = index\"\n [formGroupName]=\"j\"\n class=\"row border p-3 mb-2 align-items-center\"\n cdkDrag\n >\n <div class=\"col-md-5\">\n <pw-input-container label=\"Subtitle Title\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-md-5\">\n <pw-input-container label=\"Subtitle Path\" name=\"path\">\n <input type=\"text\" class=\"form-control\" formControlName=\"path\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-2\">\n <i\n class=\"fa fa-trash delete-icon text-danger\"\n (click)=\"removeSubtitle(i, j)\"\n (keydown.enter)=\"removeSubtitle(i, j)\"\n (keydown.space)=\"removeSubtitle(i, j)\"\n ngbTooltip=\"Remove Subtitle\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <div class=\"col-md-1 d-flex justify-content-end\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder subtitle\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <button type=\"button\" class=\"btn btn-sm btn-primary mt-2\" (click)=\"addSubtitle(i)\">\n + Add Subtitle\n </button>\n </div>\n </div>\n\n <button type=\"button\" class=\"btn btn-primary mt-2 mb-2\" (click)=\"addNavbarItem()\">\n + Add Navbar Item\n </button>\n </div>\n </div>\n </p-accordionTab>\n\n\n <p-accordionTab [header]=\"'Footer Links Section'\">\n <div class=\"row mt-3 mb-4\" formGroupName=\"footer_links\">\n <h4 class=\"mb-3\">Footer Links Section</h4>\n\n <div\n formArrayName=\"items\"\n class=\"col-12\"\n cdkDropList\n (cdkDropListDropped)=\"dropItems(footerLinksItems, $event)\"\n >\n <div\n *ngFor=\"let item of footerLinksItems.controls; let i = index\"\n [formGroupName]=\"i\"\n class=\"row mb-3\"\n cdkDrag\n >\n <div class=\"row align-items-center\">\n\n <pw-input-container label=\"Title\" class=\"col-md-5\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n\n <pw-input-container label=\"Path\" class=\"col-md-5\" name=\"path\">\n <input type=\"text\" class=\"form-control\" formControlName=\"path\" />\n </pw-input-container>\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-1\">\n <i\n class=\"fa fa-trash delete-icon text-danger\"\n (click)=\"removeFooterLinkItem(i)\"\n (keydown.enter)=\"removeFooterLinkItem(i)\"\n (keydown.space)=\"removeFooterLinkItem(i)\"\n ngbTooltip=\"Remove Footer Item\"\n aria-hidden=\"true\"\n ></i>\n </div>\n <div class=\"col-md-1 d-flex align-items-start justify-content-end mt-1\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n </div>\n\n <div\n class=\"col-12 mt-3\"\n formArrayName=\"subtitles\"\n cdkDropList\n [cdkDropListData]=\"getFooterSubtitles(i).controls\"\n (cdkDropListDropped)=\"dropFooterSubtitles(i, $event)\"\n >\n <div\n *ngFor=\"let sub of getFooterSubtitles(i).controls; let j = index\"\n [formGroupName]=\"j\"\n class=\"row border p-3 mb-2 align-items-center\"\n cdkDrag\n >\n\n <div class=\"col-md-5\">\n <pw-input-container label=\"Subtitle Title\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-md-5\">\n <pw-input-container label=\"Subtitle Path\" name=\"path\">\n <input type=\"text\" class=\"form-control\" formControlName=\"path\" />\n </pw-input-container>\n </div>\n\n\n\n\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-2\">\n <i\n class=\"fa fa-trash delete-icon text-danger\"\n (click)=\"removeFooterSubtitle(i, j)\"\n (keydown.enter)=\"removeFooterSubtitle(i, j)\"\n (keydown.space)=\"removeFooterSubtitle(i, j)\"\n ngbTooltip=\"Remove Subtitle\"\n aria-hidden=\"true\"\n ></i>\n </div>\n <div class=\"col-md-1 d-flex justify-content-end\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder subtitle\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <button\n type=\"button\"\n class=\"btn btn-sm btn-primary mt-2\"\n (click)=\"addFooterSubtitle(i)\"\n >\n + Add Subtitle\n </button>\n </div>\n </div>\n\n <button\n type=\"button\"\n class=\"btn btn-primary mt-2 mb-2\"\n (click)=\"addFooterLinkItem()\"\n >\n + Add Footer Link\n </button>\n </div>\n </div>\n </p-accordionTab>\n\n\n\n\n\n <p-accordionTab [header]=\"'Guides Section'\">\n <div class=\"row mt-3 mb-4\" formGroupName=\"guides\">\n <h4 class=\"mb-3\">Guides Section</h4>\n\n <div formArrayName=\"items\" class=\"col-12\">\n <div cdkDropList (cdkDropListDropped)=\"dropItems(guidesItems, $event)\">\n <div\n *ngFor=\"let item of guidesItems.controls; let i = index\"\n [formGroupName]=\"i\"\n class=\"border p-3 mb-3\"\n cdkDrag\n >\n <div class=\"row align-items-start\">\n\n <pw-input-container label=\"Title\" class=\"col-md-5\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n\n <pw-input-container label=\"Button Text\" class=\"col-md-6\" name=\"button_text\">\n <input type=\"text\" class=\"form-control\" formControlName=\"button_text\" />\n </pw-input-container>\n <div class=\"col-md-1 d-flex align-items-start justify-content-end mt-1\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <div class=\"row mt-2\">\n <pw-input-container label=\"Image URL\" class=\"col-md-6\" name=\"image_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"image_url\" />\n </pw-input-container>\n\n <pw-input-container label=\"Guide URL\" class=\"col-md-6\" name=\"guide_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"guide_url\" />\n </pw-input-container>\n </div>\n\n <div class=\"row mt-2\">\n <pw-input-container label=\"Description\" class=\"col-md-11\" name=\"description\">\n <textarea\n class=\"form-control\"\n rows=\"5\"\n formControlName=\"description\"\n [ngClass]=\"{ 'is-invalid': submitted && f['description']?.errors }\"\n ></textarea>\n </pw-input-container>\n\n <div class=\"col-md-1 d-flex align-items-start justify-content-center mt-3\">\n <i\n class=\"fa fa-trash delete-icon text-danger\"\n (click)=\"removeGuideItem(i)\"\n (keydown.enter)=\"removeGuideItem(i)\"\n (keydown.space)=\"removeGuideItem(i)\"\n ngbTooltip=\"Remove Guide\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"text-start mt-2\">\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"addGuideItem()\">\n + Add Guide\n </button>\n </div>\n </div>\n </div>\n </p-accordionTab>\n\n\n\n <p-accordionTab [header]=\"'AB Tests Section'\">\n <div class=\"row mt-3 mb-4\">\n <h4 class=\"mb-3\">AB Tests</h4>\n <div formArrayName=\"ab_tests\" class=\"col-12\" cdkDropList (cdkDropListDropped)=\"dropItems(abTests, $event)\">\n <div\n *ngFor=\"let abTest of abTests.controls; let i = index\"\n [formGroupName]=\"i\"\n class=\"row mb-3 border p-3\"\n cdkDrag\n >\n <pw-input-container label=\"Description\" class=\"col-md-5\" name=\"description\">\n <input type=\"text\" class=\"form-control\" formControlName=\"description\" />\n </pw-input-container>\n\n <pw-input-container label=\"Experiment Name\" class=\"col-md-6\" name=\"experiment_name\">\n <input type=\"text\" class=\"form-control\" formControlName=\"experiment_name\" />\n </pw-input-container>\n\n\n <div class=\"col-md-1 d-flex align-items-start justify-content-end mt-1\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <pw-input-container label=\"DB Shard\" class=\"col-md-6\" name=\"db_shard\">\n <input type=\"text\" class=\"form-control\" formControlName=\"db_shard\" />\n </pw-input-container>\n\n <pw-input-container label=\"Microservice Name\" class=\"col-md-6\" name=\"microservice_name\">\n <input type=\"text\" class=\"form-control\" formControlName=\"microservice_name\" />\n </pw-input-container>\n\n <div class=\"col-md-12 text-end mt-2\">\n <i\n class=\"fa fa-trash delete-icon text-danger\"\n (click)=\"removeAbTest(i)\"\n (keydown.enter)=\"removeAbTest(i)\"\n (keydown.space)=\"removeAbTest(i)\"\n ngbTooltip=\"Remove AB Test\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <div class=\"text-start mt-2\">\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"addAbTest()\">+ Add AB Test</button>\n </div>\n </div>\n </div>\n </p-accordionTab>\n\n\n\n\n\n <p-accordionTab [header]=\"'Coming soon pages - Subscribe to newsletter (TO DISCONTINUE)'\">\n <div class=\"mb-3\">\n <p>ComingSoon Pages will enable users to subscribe to Newsletters and are accessible at the internal paths\n /join/cs1, /join/cs2, etc.</p>\n </div>\n <div class=\"text-end\" *ngIf=\"shardUrl\">\n <span>See the live page <span class=\"tooltip-wrap ms-1\" [appendTo]=\"'body'\"\n [pTooltip]=\"'Admin.DomainConfig.Tooltip.SeeLiveCs' | transloco\" tooltipPosition=\"top\">\n <i class=\"fas fa-info-circle\"></i>\n </span> : <a [href]=\"shardUrl + '/join/cs1'\" target=\"_blank\">{{ shardUrl }}/join/cs1</a></span>\n </div>\n <div class=\"row\">\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.CsProduct' | transloco\" [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.CsProduct' | transloco\" name=\"cs_product_id\">\n <p-autoComplete [suggestions]=\"productsList\" formControlName=\"cs_product_id\" dataKey=\"id\" field=\"name\"\n [dropdown]=\"true\" [delay]=\"1000\" (completeMethod)=\"searchProduct($event)\" styleClass=\"w-100\"\n placeholder=\"Search Product\" [inputStyle]=\"\n form.get('cs_product_id').touched &&\n form.get('cs_product_id').invalid\n ? { border: '1px solid #ff586b' }\n : { border: '1px solid gray' }\n \" [multiple]=\"false\">\n </p-autoComplete>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.CsCrmSourceId' | transloco\" name=\"cs_crm_source_id\"\n [showTooltip]=\"true\" [tooltipText]=\"'Admin.DomainConfig.Tooltip.CsCrmSourceId' | transloco\">\n <p-dropdown [options]=\"crmSourcesList\" formControlName=\"cs_crm_source_id\"\n [ngClass]=\"{ 'is-invalid': submitted && f['cs_crm_source_id']?.errors }\" [placeholder]=\"'Select CRM Source'\"\n optionValue=\"id\" optionLabel=\"name\">\n </p-dropdown>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.CsPdfSourceId' | transloco\" name=\"cs_pdf_source_id\"\n [showTooltip]=\"true\" [tooltipText]=\"'Admin.DomainConfig.Tooltip.CsPdfSourceId' | transloco\">\n <p-dropdown [options]=\"crmSourcesList\" formControlName=\"cs_pdf_source_id\"\n [ngClass]=\"{ 'is-invalid': submitted && f['cs_pdf_source_id']?.errors }\" [placeholder]=\"'Select CRM Source'\"\n optionValue=\"id\" optionLabel=\"name\">\n </p-dropdown>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\"></div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.CsVideoUrl' | transloco\" name=\"cs_video_url\" [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.CsVideoUrl' | transloco\">\n <input type=\"text\" class=\"form-control\" formControlName=\"cs_video_url\"\n [ngClass]=\"{ 'is-invalid': submitted && f['cs_video_url'].errors }\" />\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.CsBookDemoUrl' | transloco\" name=\"cs_book_demo_url\"\n [showTooltip]=\"true\" [tooltipText]=\"'Admin.DomainConfig.Tooltip.CsBookDemoUrl' | transloco\">\n <input type=\"text\" class=\"form-control\" formControlName=\"cs_book_demo_url\"\n [ngClass]=\"{ 'is-invalid': submitted && f['cs_book_demo_url'].errors }\" />\n </pw-input-container>\n </div>\n <div class=\"col-12\">\n <pw-input-container [label]=\"'Admin.DomainConfig.CsCtaIframe' | transloco\" name=\"cs_cta_iframe\"\n [showTooltip]=\"true\" [tooltipText]=\"'Admin.DomainConfig.Tooltip.CsCtaIframe' | transloco\">\n <textarea class=\"form-control\" rows=\"3\" formControlName=\"cs_cta_iframe\"\n [ngClass]=\"{ 'is-invalid': submitted && f['cs_cta_iframe'].errors }\">\n </textarea>\n </pw-input-container>\n </div>\n <div class=\"col-12\">\n <pw-input-container [label]=\"'Admin.DomainConfig.CsJoinMessage' | transloco\" name=\"cs_join_message\"\n [showTooltip]=\"true\" [tooltipText]=\"'Admin.DomainConfig.Tooltip.CsJoinMessage' | transloco\">\n <textarea class=\"form-control\" rows=\"3\" formControlName=\"cs_join_message\"\n [ngClass]=\"{ 'is-invalid': submitted && f['cs_join_message'].errors }\">\n </textarea>\n </pw-input-container>\n </div>\n <div class=\"col-12\">\n <pw-input-container [label]=\"'Admin.DomainConfig.CsPdfDownloadText' | transloco\" name=\"cs_pdf_download_text\"\n [showTooltip]=\"true\" [tooltipText]=\"\n 'Admin.DomainConfig.Tooltip.CsPdfDownloadText' | transloco\n \">\n <textarea class=\"form-control\" rows=\"3\" formControlName=\"cs_pdf_download_text\" [ngClass]=\"{\n 'is-invalid': submitted && f['cs_pdf_download_text'].errors\n }\">\n </textarea>\n </pw-input-container>\n </div>\n </div>\n <div class=\"row\" matchHeight=\"card\">\n <div class=\"col-md-4\">\n <label for=\"cs_image\">{{ 'Admin.DomainConfig.CsImage' | transloco }} <span class=\"info-circle\">\n <span class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.DomainConfig.Tooltip.CsImage' | transloco\n }}</span>\n </span>\n </label>\n <pw-custom-uploader (saveEvent)=\"onSaveFile($event)\" [aspectRatio]=\"'custom'\" [title]=\"'Cs Image'\"\n [controlName]=\"'cs_image'\" [previewData]=\"data['cs_image']\">\n </pw-custom-uploader>\n </div>\n <div class=\"col-md-4\">\n <label for=\"cs_image2\">{{ 'Admin.DomainConfig.CsImage2' | transloco }} <span class=\"info-circle\">\n <span class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.DomainConfig.Tooltip.CsImage2' | transloco\n }}</span>\n </span>\n </label>\n <pw-custom-uploader (saveEvent)=\"onSaveFile($event)\" [aspectRatio]=\"'custom'\" [title]=\"'Cs Image2'\"\n [controlName]=\"'cs_image2'\" [previewData]=\"data['cs_image2']\">\n </pw-custom-uploader>\n </div>\n <div class=\"col-md-4\">\n <label for=\"cs_pdf_image\">{{ 'Admin.DomainConfig.CsPdfImage' | transloco }} <span class=\"info-circle\">\n <span class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.DomainConfig.Tooltip.CsPdfImage' | transloco\n }}</span>\n </span>\n </label>\n <pw-custom-uploader (saveEvent)=\"onSaveFile($event)\" [aspectRatio]=\"'custom'\" [title]=\"'Cs Pdf Image'\"\n [controlName]=\"'cs_pdf_image'\" [previewData]=\"data['cs_pdf_image']\">\n </pw-custom-uploader>\n </div>\n <div class=\"col-md-4\">\n <label for=\"cs_image_bg\">{{ 'Admin.DomainConfig.CsImageBg' | transloco }} <span class=\"info-circle\">\n <span class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.DomainConfig.Tooltip.CsImageBg' | transloco\n }}</span>\n </span>\n </label>\n <pw-custom-uploader (saveEvent)=\"onSaveFile($event)\" [aspectRatio]=\"'custom'\" [title]=\"'Cs Pdf Image Bg'\"\n [controlName]=\"'cs_image_bg'\" [previewData]=\"data['cs_image_bg']\">\n </pw-custom-uploader>\n </div>\n <div class=\"col-md-4\">\n <label for=\"cs_image_bg2\">{{ 'Admin.DomainConfig.CsImageBg2' | transloco }} <span class=\"info-circle\">\n <span class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.DomainConfig.Tooltip.CsImageBg2' | transloco\n }}</span>\n </span>\n </label>\n <pw-custom-uploader (saveEvent)=\"onSaveFile($event)\" [aspectRatio]=\"'custom'\" [title]=\"'Cs Pdf Image Bg2'\"\n [controlName]=\"'cs_image_bg2'\" [previewData]=\"data['cs_image_bg2']\">\n </pw-custom-uploader>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </div>\n\n <div class=\"col-12 text-end mt-3\">\n <button type=\"button\"\n class=\"btn btn-outline-default me-2\"\n (click)=\"back()\">\n {{ 'Button.Cancel' | transloco }}\n </button>\n <button type=\"submit\" [buttonBusy]=\"buttonBusy\"\n class=\"btn btn-primary\">{{ 'Button.Submit' | transloco }}</button>\n </div>\n </form>\n</ng-container>\n<div *ngIf=\"!data?.host_name && !isLoading\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.DomainConfig.EnableConfigTab' | transloco\"> </pw-no-data>\n</div>\n\n\n<ng-template #partnerCropper let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Upload Partner Image</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <small>You can upload JPG, PNG, or GIF files. Avoid images with celebrities, nudity, or artwork.</small>\n <pw-image-cropper\n aspectRatio=\"auto\"\n (imageSelectionEvent)=\"onPartnerImageSelected($event)\"\n (closeEvent)=\"onClosePartnerModal()\"\n ></pw-image-cropper>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i5.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i6.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i7.Accordion, selector: "p-accordion", inputs: ["multiple", "style", "styleClass", "expandIcon", "collapseIcon", "activeIndex", "selectOnFocus", "headerAriaLevel"], outputs: ["onClose", "onOpen", "activeIndexChange"] }, { kind: "component", type: i7.AccordionTab, selector: "p-accordionTab", inputs: ["id", "header", "headerStyle", "tabStyle", "contentStyle", "tabStyleClass", "headerStyleClass", "contentStyleClass", "disabled", "cache", "transitionOptions", "iconPos", "selected", "headerAriaLevel"], outputs: ["selectedChange"] }, { kind: "component", type: i8.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "field", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "overlayOptions", "suggestions", "itemSize", "optionLabel", "optionValue", "id", "searchMessage", "emptySelectionMessage", "selectionMessage", "autoOptionFocus", "selectOnFocus", "searchLocale", "optionDisabled", "focusOnHover", "variant"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { 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", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "directive", type: i3.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i11.UiSwitchComponent, selector: "ui-switch", inputs: ["size", "color", "switchOffColor", "switchColor", "defaultBgColor", "defaultBoColor", "checkedLabel", "uncheckedLabel", "checkedTextColor", "uncheckedTextColor", "beforeChange", "ariaLabel", "checked", "disabled", "reverse", "loading"], outputs: ["change", "changeEvent", "valueChange"] }, { kind: "component", type: i12.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i13.ProfileImageCropperComponent, selector: "pw-image-cropper", inputs: ["aspectRatio", "dynamicData"], outputs: ["imageSelectionEvent", "closeEvent", "fileChangeEvent"] }, { kind: "component", type: i13.CustomUploaderComponent, selector: "pw-custom-uploader", inputs: ["controlName", "previewData", "aspectRatio", "title"], outputs: ["saveEvent"] }, { kind: "component", type: i14.InputContainerComponent, selector: "pw-input-container", inputs: ["name", "label", "labelClass", "tooltipPosition", "required", "errorMsg", "isReadOnly", "showTooltip", "tooltipText", "showTriangle", "afterLabel", "showAfterLabel", "showTriangleText", "isLeftTooltip"] }, { kind: "component", type: i14.NoDataComponent, selector: "pw-no-data", inputs: ["message", "description", "withImage"] }, { kind: "directive", type: i15.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i15.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i15.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i16.ButtonBusyDirective, selector: "[buttonBusy]", inputs: ["buttonBusy", "busyText"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i4.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i4.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "pipe", type: i17.TranslocoPipe, name: "transloco" }] }); }
714
- }
715
- __decorate([
716
- ValidateForm('form'),
717
- __metadata("design:type", Function),
718
- __metadata("design:paramtypes", []),
719
- __metadata("design:returntype", void 0)
720
- ], DomainConfigBuildComponent.prototype, "onSave", null);
721
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: DomainConfigBuildComponent, decorators: [{
722
- type: Component,
723
- args: [{ selector: 'pw-domain-config-build', template: "<h3>Public Pages Configuration</h3>\n<div class=\"mb-4\">\n <p> The following parameters and settings will be applied to all public pages of this domain. </p>\n</div>\n<div class=\"w-100 text-center mt-3\"\n *ngIf=\"isLoading\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n</div>\n<ng-container *ngIf=\"!isLoading && data?.host_name\">\n <form [formGroup]=\"form\"\n (ngSubmit)=\"onSave()\">\n <div class=\"row\">\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.MasterSubscription' | transloco\"\n name=\"master_subscription_id\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.MasterSubscription' | transloco\">\n <p-dropdown\n [options]=\"masterSubscriptionsList\"\n formControlName=\"master_subscription_id\"\n [ngClass]=\"{ 'is-invalid': submitted && f['master_subscription_id']?.errors }\"\n placeholder=\"Select Master Subscription\">\n </p-dropdown>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.MasterSubscriptionProduct' | transloco\"\n [showTooltip]=\"true\"\n [tooltipText]=\"\n 'Admin.DomainConfig.Tooltip.MasterSubscriptionProduct' | transloco\n \"\n name=\"master_subscription_product_id\">\n <p-dropdown\n [options]=\"masterSubscriptionProductList\"\n formControlName=\"master_subscription_product_id\"\n [ngClass]=\"{'is-invalid': submitted && f['master_subscription_product_id']?.errors}\"\n [placeholder]=\"'Select Master Product'\"\n optionValue=\"id\"\n optionLabel=\"name\"\n >\n </p-dropdown>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.BlogFeatureKey' | transloco\"\n name=\"blog_feature_key\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.BlogFeatureKey' | transloco\">\n <input type=\"text\"\n class=\"form-control\"\n formControlName=\"blog_feature_key\"\n [ngClass]=\"{ 'is-invalid': submitted && f['blog_feature_key'].errors }\" />\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.MainTos' | transloco\"\n name=\"main_tos_id\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.MainTos' | transloco\">\n <p-dropdown\n [options]=\"subscriptionTosList\"\n formControlName=\"main_tos_id\"\n [ngClass]=\"{ 'is-invalid': submitted && f['main_tos_id']?.errors }\"\n [placeholder]=\"'Select Main TOS'\"\n optionValue=\"id\">\n <ng-template pTemplate=\"selectedItem\" let-item>\n <span [innerHTML]=\"item.title\"></span>\n </ng-template>\n <ng-template pTemplate=\"item\" let-item>\n <span [innerHTML]=\"item.title\"></span>\n </ng-template>\n </p-dropdown>\n\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.CrmSubscription' | transloco\"\n name=\"crm_subscription_id\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.CrmSubscription' | transloco\">\n <p-dropdown\n [options]=\"crmSubscriptionsList\"\n formControlName=\"crm_subscription_id\"\n [ngClass]=\"{ 'is-invalid': submitted && f['crm_subscription_id']?.errors }\"\n [placeholder]=\"'Select CRM Subscription'\"\n optionValue=\"id\">\n <ng-template pTemplate=\"selectedItem\" let-item>\n {{item?.organisation ? item?.organisation + ' - ' + item.contact_name : item?.contact_name}}\n </ng-template>\n <ng-template pTemplate=\"item\" let-item>\n {{item?.organisation ? item?.organisation + ' - ' + item.contact_name : item?.contact_name}}\n </ng-template>\n </p-dropdown>\n\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.CrmProduct' | transloco\"\n name=\"crm_product_id\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.CrmProduct' | transloco\">\n <p-dropdown\n [options]=\"crmProductList\"\n formControlName=\"crm_product_id\"\n [ngClass]=\"{ 'is-invalid': submitted && f['crm_product_id']?.errors }\"\n [placeholder]=\"'Select CRM Product'\"\n optionValue=\"id\"\n >\n <ng-template pTemplate=\"selectedItem\" let-item>\n {{item?.subscription_id ? item?.name +' - SubscriptionID = '+ item.subscription_id : item?.name}}\n </ng-template>\n <ng-template pTemplate=\"item\" let-item>\n {{item?.subscription_id ? item?.name +' - SubscriptionID = '+ item.subscription_id : item?.name}}\n </ng-template>\n </p-dropdown>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.CrmSource' | transloco\"\n name=\"crm_source_id\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.CrmSource' | transloco\">\n <p-dropdown\n [options]=\"crmSourcesList\"\n formControlName=\"crm_source_id\"\n [ngClass]=\"{ 'is-invalid': submitted && f['crm_source_id']?.errors }\"\n [placeholder]=\"'Select CRM Source'\"\n optionValue=\"id\"\n optionLabel=\"name\"\n >\n </p-dropdown>\n </pw-input-container>\n </div>\n <!-- crm subscription fields end-->\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.Active' | transloco\" [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.Active' | transloco\" name=\"active\">\n <ui-switch size=\"small\" uncheckedLabel=\"false\" checkedLabel=\"true\" formControlName=\"active\" name=\"active\"\n [ngClass]=\"{ 'is-invalid': submitted && f['active'].errors }\">\n </ui-switch>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.IsProductDomain' | transloco\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.IsProductDomain' | transloco\"\n name=\"is_product_domain\">\n <ui-switch size=\"small\"\n uncheckedLabel=\"false\"\n checkedLabel=\"true\"\n formControlName=\"is_product_domain\"\n name=\"is_product_domain\"\n [ngClass]=\"{ 'is-invalid': submitted && f['is_product_domain'].errors }\">\n </ui-switch>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.CanRegisterOnMainPage' | transloco\" [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.CanRegisterOnMainPage' | transloco\"\n name=\"can_register_through_main_page\">\n <ui-switch size=\"small\" uncheckedLabel=\"false\" checkedLabel=\"true\" formControlName=\"can_register_through_main_page\"\n name=\"can_register_through_main_page\" [ngClass]=\"{\n 'is-invalid': submitted && f['can_register_through_main_page'].errors\n }\">\n </ui-switch>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.SocialLoginEnabled' | transloco\" [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.SocialLoginEnable' | transloco\" name=\"social_login_enabled\">\n <ui-switch size=\"small\" uncheckedLabel=\"false\" checkedLabel=\"true\" formControlName=\"social_login_enabled\"\n name=\"social_login_enabled\" [ngClass]=\"{ 'is-invalid': submitted && f['social_login_enabled'].errors }\">\n </ui-switch>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.NotifyLogins' | transloco\" [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.NotifyLogins' | transloco\" name=\"notify_logins\">\n <ui-switch size=\"small\" uncheckedLabel=\"false\" checkedLabel=\"true\" formControlName=\"notify_logins\"\n name=\"notify_logins\" [ngClass]=\"{ 'is-invalid': submitted && f['notify_logins'].errors }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n\n <div class=\"my-5\">\n <h3>Pre-Built Pages Config (Resources, Landing Pages, etc)</h3>\n\n <p-accordion class=\"mt-5\">\n <p-accordionTab [header]=\"'Instructions - README FIRST'\">\n <div class=\"mb-3\">\n <p>We've built and maintain a collection of high-converting landing pages designed to help you quickly launch polished\n UIs for onboarding users.</p>\n <p><strong>Newsletter Subscription Pages:</strong><br> After configuring your domain, you can access pages like\n <strong>/join/cs1, /join/cs2, /join/cs3, etc.</strong>, specifically designed for newsletter sign-ups. <br>\n Subscribers from these pages will be listed in the <strong>SmartCRM module</strong>.</p>\n <p><strong>Trial Product Sign-Up Pages:</strong><br> For users interested in trial products, utilize pages such as\n <strong>/join/trial1, /join/trial2, /join/trial3, etc.</strong>.<br> Users registering through these pages will\n appear in the <strong>Admin > Users section</strong>.</p>\n <p>Once you've selected the landing page you want to use <strong>(e.g., /join/trial3)</strong>, make sure to update\n the <strong>Internal Path</strong> in the <strong>Core tab</strong> accordingly\u2014i.e., set it to\n <strong>/join/trial3</strong>.</p>\n <p>If you need assistance integrating these pages into your workflow or have further questions, feel free to reach\n out.</p>\n </div>\n </p-accordionTab>\n\n <p-accordionTab [header]=\"'Subscribe to Product/Newsletter Config'\">\n <div class=\"mb-3\">\n <p>Trial Pages will enable users to sign up to real products and are accessible at the path /join/trial1,\n /join/trial2, etc.</p>\n <p>ComingSoon Pages will enable users to subscribe to Newsletters and are accessible at the internal paths\n /join/cs1, /join/cs2, etc.</p>\n </div>\n <!-- live page link -->\n <div class=\"text-end\" *ngIf=\"shardUrl\">\n <span>See the live page <span class=\"tooltip-wrap ms-1\" [appendTo]=\"'body'\"\n [pTooltip]=\"'Admin.DomainConfig.Tooltip.SeeLiveTrial' | transloco\" tooltipPosition=\"top\">\n <i class=\"fas fa-info-circle\"></i>\n </span> : <a [href]=\"shardUrl + '/join/trial1'\" target=\"_blank\">{{ shardUrl }}/join/trial1</a></span>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.TrialProduct' | transloco\" [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.TrialProduct' | transloco\" name=\"trial_product_id\">\n <p-autoComplete [suggestions]=\"productsList\" formControlName=\"trial_product_id\" dataKey=\"id\" field=\"name\"\n [dropdown]=\"true\" [delay]=\"1000\" (completeMethod)=\"searchProduct($event)\" styleClass=\"w-100\"\n placeholder=\"Search Product\" [inputStyle]=\"\n form.get('trial_product_id').touched &&\n form.get('trial_product_id').invalid\n ? { border: '1px solid #ff586b' }\n : { border: '1px solid gray' }\n \" [multiple]=\"false\">\n </p-autoComplete>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.TrialCrmSourceId' | transloco\" name=\"trial_crm_source_id\"\n [showTooltip]=\"true\" [tooltipText]=\"\n 'Admin.DomainConfig.Tooltip.TrialCrmSourceId' | transloco\n \">\n <p-dropdown [options]=\"crmSourcesList\" formControlName=\"trial_crm_source_id\"\n [ngClass]=\"{ 'is-invalid': submitted && f['trial_crm_source_id']?.errors }\"\n [placeholder]=\"'Select CRM Source'\" optionValue=\"id\" optionLabel=\"name\">\n </p-dropdown>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.TrialPdfSourceId' | transloco\" name=\"trial_pdf_source_id\"\n [showTooltip]=\"true\" [tooltipText]=\"\n 'Admin.DomainConfig.Tooltip.TrialPdfSourceId' | transloco\n \">\n <p-dropdown [options]=\"crmSourcesList\" formControlName=\"trial_pdf_source_id\"\n [ngClass]=\"{ 'is-invalid': submitted && f['trial_pdf_source_id']?.errors }\"\n [placeholder]=\"'Select CRM Source'\" optionValue=\"id\" optionLabel=\"name\">\n </p-dropdown>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\"></div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.TrialVideoUrl' | transloco\" name=\"trial_video_url\"\n [showTooltip]=\"true\" [tooltipText]=\"'Admin.DomainConfig.Tooltip.TrialVideoUrl' | transloco\">\n <input type=\"text\" class=\"form-control\" formControlName=\"trial_video_url\"\n [ngClass]=\"{ 'is-invalid': submitted && f['trial_video_url'].errors }\" />\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.TrialBookDemoUrl' | transloco\" name=\"trial_book_demo_url\"\n [showTooltip]=\"true\" [tooltipText]=\"\n 'Admin.DomainConfig.Tooltip.TrialBookDemoUrl' | transloco\n \">\n <input type=\"text\" class=\"form-control\" formControlName=\"trial_book_demo_url\" [ngClass]=\"{\n 'is-invalid': submitted && f['trial_book_demo_url'].errors\n }\" />\n </pw-input-container>\n </div>\n <div class=\"col-12\">\n <pw-input-container [label]=\"'Admin.DomainConfig.TrialCtaIframe' | transloco\" name=\"trial_cta_iframe\"\n [showTooltip]=\"true\" [tooltipText]=\"\n 'Admin.DomainConfig.Tooltip.TrialCtaIframe' | transloco\n \">\n <textarea rows=\"3\" class=\"form-control\" formControlName=\"trial_cta_iframe\" [ngClass]=\"{\n 'is-invalid': submitted && f['trial_cta_iframe'].errors\n }\">\n </textarea>\n </pw-input-container>\n </div>\n <div class=\"col-12\">\n <pw-input-container [label]=\"'Admin.DomainConfig.TrialJoinMessage' | transloco\" name=\"trial_join_message\"\n [showTooltip]=\"true\" [tooltipText]=\"\n 'Admin.DomainConfig.Tooltip.TrialJoinMessage' | transloco\n \">\n <textarea rows=\"3\" class=\"form-control\" formControlName=\"trial_join_message\" [ngClass]=\"{\n 'is-invalid': submitted && f['trial_join_message'].errors\n }\">\n </textarea>\n </pw-input-container>\n </div>\n <div class=\"col-12\">\n <pw-input-container [label]=\"'Admin.DomainConfig.TrialPdfDownloadText' | transloco\" name=\"trial_pdf_download_text\"\n [showTooltip]=\"true\" [tooltipText]=\"\n 'Admin.DomainConfig.Tooltip.TrialPdfDownloadText' | transloco\n \">\n <textarea rows=\"3\" class=\"form-control\" formControlName=\"trial_pdf_download_text\" [ngClass]=\"{\n 'is-invalid': submitted && f['trial_pdf_download_text'].errors\n }\">\n </textarea>\n </pw-input-container>\n </div>\n </div>\n <div class=\"row\" matchHeight=\"card\">\n <div class=\"col-md-4\">\n <label for=\"trial_image\">{{ 'Admin.DomainConfig.TrialImage' | transloco }} <span class=\"info-circle\">\n <span class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.DomainConfig.Tooltip.TrialImage' | transloco\n }}</span>\n </span>\n </label>\n <pw-custom-uploader (saveEvent)=\"onSaveFile($event)\" [aspectRatio]=\"'custom'\" [title]=\"'Trial Image'\"\n [controlName]=\"'trial_image'\" [previewData]=\"data['trial_image']\">\n </pw-custom-uploader>\n </div>\n <div class=\"col-md-4\">\n <label for=\"trial_image2\">{{ 'Admin.DomainConfig.TrialImage2' | transloco }} <span class=\"info-circle\">\n <span class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.DomainConfig.Tooltip.TrialImage2' | transloco\n }}</span>\n </span>\n </label>\n <pw-custom-uploader (saveEvent)=\"onSaveFile($event)\" [title]=\"'Trial Image2'\" [aspectRatio]=\"'custom'\"\n [controlName]=\"'trial_image2'\" [previewData]=\"data['trial_image2']\">\n </pw-custom-uploader>\n </div>\n <div class=\"col-md-4\">\n <label for=\"trial_pdf_image\">{{ 'Admin.DomainConfig.TrialPdfImage' | transloco }} <span class=\"info-circle\">\n <span class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.DomainConfig.Tooltip.TrialPdfImage' | transloco\n }}</span>\n </span>\n </label>\n <pw-custom-uploader (saveEvent)=\"onSaveFile($event)\" [title]=\"'Trial Pdf Image'\" [aspectRatio]=\"'custom'\"\n [controlName]=\"'trial_pdf_image'\" [previewData]=\"data['trial_pdf_image']\">\n </pw-custom-uploader>\n </div>\n <div class=\"col-md-4\">\n <label for=\"trial_image_bg\">{{ 'Admin.DomainConfig.TrialImageBg' | transloco }} <span class=\"info-circle\">\n <span class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.DomainConfig.Tooltip.TrialImageBg' | transloco\n }}</span>\n </span>\n </label>\n <pw-custom-uploader (saveEvent)=\"onSaveFile($event)\" [title]=\"'Trial Image Bg'\" [aspectRatio]=\"'custom'\"\n [controlName]=\"'trial_image_bg'\" [previewData]=\"data['trial_image_bg']\">\n </pw-custom-uploader>\n </div>\n <div class=\"col-md-4\">\n <label for=\"trial_image_bg2\">{{ 'Admin.DomainConfig.TrialImageBg2' | transloco }} <span class=\"info-circle\">\n <span class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.DomainConfig.Tooltip.TrialImageBg2' | transloco\n }}</span>\n </span>\n </label>\n <pw-custom-uploader (saveEvent)=\"onSaveFile($event)\" [title]=\"'Trial Image Bg2'\" [aspectRatio]=\"'custom'\"\n [controlName]=\"'trial_image_bg2'\" [previewData]=\"data['trial_image_bg2']\">\n </pw-custom-uploader>\n </div>\n </div>\n </p-accordionTab>\n\n <p-accordionTab [header]=\"'Header Section'\">\n <div class=\"row mt-4\" formGroupName=\"header\">\n <h4 class=\"mb-4\">Header Section</h4>\n\n <!-- Headline -->\n <div class=\"col-12 col-md-12\">\n <pw-input-container label=\"Header Headline\" name=\"headline\">\n <input type=\"text\" class=\"form-control\" formControlName=\"headline\" />\n </pw-input-container>\n </div>\n\n <!-- Video URL -->\n <div class=\"col-12 col-md-6\">\n <pw-input-container label=\"Header Video URL\" name=\"video_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"video_url\" />\n </pw-input-container>\n </div>\n\n <!-- Background Image URL -->\n <div class=\"col-12 col-md-6\">\n <pw-input-container label=\"Header Background Image URL\" name=\"bg_image_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"bg_image_url\" />\n </pw-input-container>\n </div>\n\n <!-- Description -->\n <div class=\"col-12\">\n <pw-input-container label=\"Header Description\" name=\"description\">\n <textarea\n class=\"form-control\"\n rows=\"5\"\n formControlName=\"description\"\n [ngClass]=\"{ 'is-invalid': submitted && f['description']?.errors }\"\n ></textarea>\n </pw-input-container>\n </div>\n\n <!-- Sub Headings -->\n <div formArrayName=\"sub_headings\" class=\"col-12\" cdkDropList (cdkDropListDropped)=\"dropItems(headerSubHeadings, $event)\">\n <div\n *ngFor=\"let sub of f['header'].get('sub_headings')['controls']; let i = index\"\n [formGroupName]=\"i\"\n class=\"row mb-3 align-items-center\"\n cdkDrag\n >\n <div class=\"col-md-10\">\n <pw-input-container label=\"Sub Header Description\" name=\"description\">\n <textarea\n class=\"form-control\"\n rows=\"3\"\n formControlName=\"description\"\n [ngClass]=\"{ 'is-invalid': submitted && f['description']?.errors }\"\n ></textarea>\n </pw-input-container>\n </div>\n\n <div class=\"col-md-1 d-flex justify-content-end mt-3\">\n <i\n class=\"fa fa-trash delete-icon text-danger\"\n (click)=\"removeHeaderSubHeading(i)\"\n (keydown.enter)=\"removeHeaderSubHeading(i)\"\n (keydown.space)=\"removeHeaderSubHeading(i)\"\n ngbTooltip=\"Remove\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <div class=\"col-md-1 d-flex justify-content-end mt-3\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <button type=\"button\" class=\"btn btn-primary mt-2 mb-2\" (click)=\"addHeaderSubHeading()\">\n + Add Sub Heading\n </button>\n </div>\n </div>\n </p-accordionTab>\n\n\n <p-accordionTab [header]=\"'Resources Section'\">\n <div class=\"row row mt-4 mb-4\">\n <h4 class=\"mb-3\">Resources Section</h4>\n <div class=\"col-12 col-sm-6\">\n <pw-input-container [label]=\"'Admin.DomainConfig.ResourceTagline' | transloco\" name=\"resources_tagline\"\n [showTooltip]=\"true\" [tooltipText]=\"'Admin.DomainConfig.Tooltip.ResourceTagline' | transloco\">\n <input type=\"text\" class=\"form-control\" formControlName=\"resources_tagline\"\n [ngClass]=\"{ 'is-invalid': submitted && f['resources_tagline'].errors }\" />\n </pw-input-container>\n </div>\n <div class=\"col-12\">\n <pw-input-container [label]=\"'Admin.DomainConfig.ResourceDescription' | transloco\" name=\"resources_description\"\n [showTooltip]=\"true\" [tooltipText]=\"'Admin.DomainConfig.Tooltip.ResourceDescription' | transloco\">\n <textarea class=\"form-control\" rows=\"3\" formControlName=\"resources_description\"\n [ngClass]=\"{ 'is-invalid': submitted && f['resources_description'].errors }\">\n </textarea>\n </pw-input-container>\n </div>\n </div>\n <div class=\"row\" matchHeight=\"card\">\n <div class=\"col-md-4\">\n <label for=\"resource_image\">{{ 'Admin.DomainConfig.ResourceImage' | transloco }} <span class=\"info-circle\">\n <span class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.DomainConfig.Tooltip.ResourceImage' | transloco\n }}</span>\n </span>\n </label>\n <pw-custom-uploader (saveEvent)=\"onSaveFile($event)\" [aspectRatio]=\"'custom'\" [title]=\"'Cs Image'\"\n [controlName]=\"'resources_image'\" [previewData]=\"data['resources_image']\">\n </pw-custom-uploader>\n </div>\n </div>\n </p-accordionTab>\n\n <p-accordionTab [header]=\"'Unique Selling Proposition Section (USP) '\">\n <div class=\"row mt-4 mb-4\" formGroupName=\"usps\">\n <h4 class=\"mb-4\">Unique Selling Proposition Section (USP)</h4>\n\n <div class=\"col-12 col-md-6\">\n <pw-input-container label=\"USPs Title\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-12 col-md-6\">\n <pw-input-container label=\"USPs Video Url\" name=\"video_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"video_url\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-12\">\n <pw-input-container label=\"USPs Description\" name=\"description\">\n <textarea class=\"form-control\" rows=\"3\" formControlName=\"description\"></textarea>\n </pw-input-container>\n </div>\n\n <!-- USP Items -->\n <div formArrayName=\"items\" class=\"col-12\" cdkDropList (cdkDropListDropped)=\"dropItems(uspsItems, $event)\">\n <div\n *ngFor=\"let item of f['usps'].get('items')['controls']; let i = index\"\n [formGroupName]=\"i\"\n class=\"row mb-3 align-items-center\"\n cdkDrag\n >\n <div class=\"col-sm-10\">\n <pw-input-container label=\"Item Description\" name=\"description\">\n <textarea class=\"form-control\" rows=\"3\" formControlName=\"description\"></textarea>\n </pw-input-container>\n </div>\n\n <div class=\"col-sm-1 d-flex justify-content-end mt-3\">\n <i\n class=\"fa fa-trash delete-icon text-danger\"\n (click)=\"removeUspItem(i)\"\n (keydown.enter)=\"removeUspItem(i)\"\n (keydown.space)=\"removeUspItem(i)\"\n ngbTooltip=\"Remove\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <div class=\"col-sm-1 d-flex justify-content-end mt-3\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <button type=\"button\" class=\"btn btn-primary mt-2 mb-2\" (click)=\"addUspItem()\">\n + Add USP Item\n </button>\n </div>\n </div>\n </p-accordionTab>\n\n\n <p-accordionTab [header]=\"'Partners (Clients) Section'\">\n <div class=\"row mt-4 mb-4\" formGroupName=\"partners\">\n <h4 class=\"mb-4\">Partners (Clients) Section</h4>\n\n <!-- Title -->\n <div class=\"col-12 col-md-6\">\n <pw-input-container label=\"Partner Title\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n </div>\n\n <!-- Description -->\n <div class=\"col-12\">\n <pw-input-container label=\"Partners Description\" name=\"description\">\n <textarea class=\"form-control\" rows=\"3\" formControlName=\"description\"></textarea>\n </pw-input-container>\n </div>\n\n <!-- Partner Items with Drag Support -->\n <div formArrayName=\"items\" class=\"col-12\" cdkDropList (cdkDropListDropped)=\"dropItems(partnersItems, $event)\">\n <div\n *ngFor=\"let item of partnersItems.controls; let i = index\"\n [formGroupName]=\"i\"\n class=\"row border p-3 mb-3 align-items-start\"\n cdkDrag\n >\n <!-- Name -->\n <div class=\"col-md-6\">\n <pw-input-container label=\"Name\" class=\"col-12\" name=\"name\">\n <input class=\"form-control\" formControlName=\"name\" />\n </pw-input-container>\n </div>\n\n <!-- Blog URL + Drag Handle -->\n <div class=\"col-md-5\">\n <pw-input-container label=\"Blog Url\" name=\"blog_url\">\n <input class=\"form-control\" formControlName=\"blog_url\" />\n </pw-input-container>\n </div>\n\n\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-3\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder question\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n\n <!-- Video URL -->\n <div class=\"col-md-6\">\n <pw-input-container label=\"Video Url\" name=\"video_url\">\n <input class=\"form-control\" formControlName=\"video_url\" />\n </pw-input-container>\n </div>\n\n <!-- Image URL -->\n <div class=\"col-md-6\">\n <pw-input-container label=\"Image Url\" name=\"image_url\">\n <input class=\"form-control\" formControlName=\"image_url\" />\n </pw-input-container>\n </div>\n\n <!-- Delete Icon -->\n <div class=\"col-md-12 text-end mt-2\">\n <i\n ngbTooltip=\"Remove\"\n (click)=\"removePartnerItem(i)\"\n (keydown.enter)=\"removePartnerItem(i)\"\n (keydown.space)=\"removePartnerItem(i)\"\n class=\"fa fa-trash delete-icon text-danger\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <!-- Add New Partner -->\n <div class=\"text-start mt-2\">\n <button type=\"button\" class=\"btn btn-primary mt-2 mb-2\" (click)=\"addPartnerItem()\">+ Add Partner</button>\n </div>\n </div>\n </div>\n </p-accordionTab>\n\n\n <p-accordionTab [header]=\"'Testimonials Section'\">\n <div class=\"row mt-3 mb-4\" formGroupName=\"testimonials\">\n <h4 class=\"mb-4\">Testimonials Section</h4>\n\n <pw-input-container label=\"Title\" class=\"col-12 col-md-6\" name=\"testimonials_title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n\n <pw-input-container label=\"Description\" class=\"col-12\" name=\"testimonials_description\">\n <textarea rows=\"3\" class=\"form-control\" formControlName=\"description\"></textarea>\n </pw-input-container>\n\n <!-- Items List -->\n <div formArrayName=\"items\" class=\"col-12 mt-3\" cdkDropList (cdkDropListDropped)=\"dropItems(testimonialsItems, $event)\">\n <div\n *ngFor=\"let item of testimonialsItems.controls; let i = index\"\n [formGroupName]=\"i\"\n class=\"row border p-3 mb-3 align-items-start\"\n cdkDrag\n >\n <div class=\"col-md-6\">\n <pw-input-container label=\"Name\" name=\"name\">\n <input type=\"text\" class=\"form-control\" formControlName=\"name\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-md-5\">\n <pw-input-container label=\"Blog URL\" name=\"blog_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"blog_url\" />\n </pw-input-container>\n </div>\n\n\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-3\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder question\"\n aria-hidden=\"true\"\n ></i>\n </div>\n <pw-input-container label=\"Image URL\" class=\"col-md-6\" name=\"image_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"image_url\" />\n </pw-input-container>\n\n <pw-input-container label=\"Video URL\" class=\"col-md-6\" name=\"video_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"video_url\" />\n </pw-input-container>\n\n <pw-input-container label=\"Testimonial\" class=\"col-md-10\" name=\"testimonial\">\n <textarea class=\"form-control\" rows=\"3\" formControlName=\"testimonial\"></textarea>\n </pw-input-container>\n\n <div class=\"col-md-2 d-flex align-items-start mt-3\">\n <i\n class=\"fa fa-trash delete-icon text-danger\"\n ngbTooltip=\"Remove\"\n (click)=\"removeTestimonialItem(i)\"\n (keydown.enter)=\"removeTestimonialItem(i)\"\n (keydown.space)=\"removeTestimonialItem(i)\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <div class=\"text-start mt-2\">\n <button type=\"button\" class=\"btn btn-primary mt-2 mb-2\" (click)=\"addTestimonialItem()\">\n + Add Testimonial\n </button>\n </div>\n </div>\n </div>\n </p-accordionTab>\n\n <p-accordionTab [header]=\"'Video Section'\">\n <div class=\"row mt-3 mb-4\" formGroupName=\"videos\">\n <h4 class=\"mb-3\">Video Section</h4>\n\n <pw-input-container label=\"Title\" class=\"col-12 col-md-6\" name=\"videos_title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n\n <pw-input-container label=\"Description\" class=\"col-12\" name=\"videos_description\">\n <textarea rows=\"3\" class=\"form-control\" formControlName=\"description\"></textarea>\n </pw-input-container>\n\n <!-- Video Items -->\n <div\n formArrayName=\"items\"\n class=\"col-12 mt-3\"\n cdkDropList\n (cdkDropListDropped)=\"dropItems(videosItems, $event)\"\n >\n <div\n *ngFor=\"let item of videosItems.controls; let i = index\"\n [formGroupName]=\"i\"\n class=\"row border p-3 mb-3 align-items-start\"\n cdkDrag\n >\n <div class=\"col-md-6\">\n <pw-input-container label=\"Title\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-md-5\">\n <pw-input-container label=\"Blog URL\" name=\"blog_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"blog_url\" />\n </pw-input-container>\n </div>\n\n\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-3\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder question\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <pw-input-container label=\"Image URL\" class=\"col-md-6\" name=\"image_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"image_url\" />\n </pw-input-container>\n\n <pw-input-container label=\"Video URL\" class=\"col-md-6\" name=\"video_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"video_url\" />\n </pw-input-container>\n\n <pw-input-container label=\"Description\" class=\"col-md-10\" name=\"description\">\n <textarea class=\"form-control\" rows=\"3\" formControlName=\"description\"></textarea>\n </pw-input-container>\n\n <div class=\"col-md-2 d-flex align-items-start mt-3\">\n <i\n class=\"fa fa-trash delete-icon text-danger\"\n (click)=\"removeVideoItem(i)\"\n (keydown.enter)=\"removeVideoItem(i)\"\n (keydown.space)=\"removeVideoItem(i)\"\n ngbTooltip=\"Remove\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <div class=\"text-start mt-2\">\n <button type=\"button\" class=\"btn btn-primary mt-2 mb-2\" (click)=\"addVideoItem()\">\n + Add Video\n </button>\n </div>\n </div>\n </div>\n </p-accordionTab>\n\n\n <p-accordionTab [header]=\"'Call to Actions Section (CTAs)'\">\n <div class=\"row mt-4 mb-4\" formGroupName=\"ctas\">\n <h4 class=\"mb-4\">CTAs Section</h4>\n\n <div class=\"col-12 col-md-6\">\n <pw-input-container label=\"Title\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-12 col-md-6\">\n <pw-input-container label=\"Image URL\" name=\"image_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"image_url\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-12 col-md-6\">\n <pw-input-container label=\"Button Text\" name=\"button_text\">\n <input type=\"text\" class=\"form-control\" formControlName=\"button_text\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-12\">\n <pw-input-container label=\"Description\" name=\"description\">\n <input type=\"text\" class=\"form-control\" formControlName=\"description\" />\n </pw-input-container>\n </div>\n\n <!-- CTA Items -->\n <div formArrayName=\"items\" class=\"col-12 mt-3\" cdkDropList (cdkDropListDropped)=\"dropItems(ctasItems, $event)\">\n <div\n *ngFor=\"let item of ctasItems.controls; let i = index\"\n [formGroupName]=\"i\"\n class=\"row border p-3 mb-3 align-items-start\"\n cdkDrag\n >\n <div class=\"col-12 col-md-6\">\n <pw-input-container label=\"Image URL\" name=\"image_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"image_url\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-md-5\">\n <pw-input-container label=\"Cta URL\" name=\"cta_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"cta_url\" />\n </pw-input-container>\n </div>\n\n\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-3\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder question\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <div class=\"col-12 col-md-6\">\n <pw-input-container label=\"Video URL\" name=\"video_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"video_url\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-12 col-md-6\">\n <pw-input-container label=\"CTA Title\" name=\"title\">\n <input class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-12 col-md-6\">\n <pw-input-container label=\"CTA Description\" name=\"description\">\n <input class=\"form-control\" formControlName=\"description\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-12 col-md-5\">\n <pw-input-container label=\"Button Text\" name=\"button_text\">\n <input class=\"form-control\" formControlName=\"button_text\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-md-1 d-flex align-items-center mt-3\">\n <i\n class=\"fa fa-trash delete-icon\"\n (click)=\"removeCtasItem(i)\"\n (keydown.enter)=\"removeCtasItem(i)\"\n (keydown.space)=\"removeCtasItem(i)\"\n ngbTooltip=\"Remove\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <div class=\"text-start mt-2\">\n <button type=\"button\" class=\"btn btn-primary mt-2 mb-2\" (click)=\"addCtasItem()\">+ Add CTA Item</button>\n </div>\n </div>\n </div>\n </p-accordionTab>\n\n <p-accordionTab [header]=\"'Integrations Section'\">\n <div class=\"row mt-3 mb-4\" formGroupName=\"integrations\">\n <h4 class=\"mb-3\">Integrations Section</h4>\n\n <pw-input-container label=\"Title\" class=\"col-12\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n\n <pw-input-container label=\"Description\" class=\"col-12\" name=\"description\">\n <textarea class=\"form-control\" formControlName=\"description\" rows=\"3\"></textarea>\n </pw-input-container>\n\n <div formArrayName=\"items\" class=\"col-12\" cdkDropList (cdkDropListDropped)=\"dropItems(integrationsItems, $event)\">\n <div\n *ngFor=\"let item of integrationsItems.controls; let i = index\"\n [formGroupName]=\"i\"\n class=\"row border p-3 mb-3 rounded bg-light\"\n cdkDrag\n >\n <pw-input-container label=\"Title\" class=\"col-md-6\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n\n <div class=\"col-md-5\">\n <pw-input-container label=\"Description\" name=\"description\">\n <input type=\"text\" class=\"form-control\" formControlName=\"description\" />\n </pw-input-container>\n </div>\n\n\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-3\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder question\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <pw-input-container label=\"Blog URL\" class=\"col-md-6\" name=\"blog_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"blog_url\" />\n </pw-input-container>\n\n <pw-input-container label=\"Image URL\" class=\"col-md-6\" name=\"image_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"image_url\" />\n </pw-input-container>\n\n <pw-input-container label=\"Video URL\" class=\"col-md-6\" name=\"video_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"video_url\" />\n </pw-input-container>\n\n <div class=\"col-md-6 d-flex align-items-end justify-content-end\">\n <i\n class=\"fa fa-trash delete-icon align-self-center\"\n (click)=\"removeIntegrationItem(i)\"\n (keydown.enter)=\"removeIntegrationItem(i)\"\n (keydown.space)=\"removeIntegrationItem(i)\"\n ngbTooltip=\"Remove\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <div class=\"text-start mt-2\">\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"addIntegrationItem()\">+ Add Integration</button>\n </div>\n </div>\n </div>\n </p-accordionTab>\n\n\n <p-accordionTab [header]=\"'Contact Us Section'\">\n <div class=\"row mt-3 mb-4\" formGroupName=\"contact_us\">\n <h4 class=\"mb-3\">Contact Us Section</h4>\n\n <pw-input-container label=\"Url\" class=\"col-md-6\" name=\"url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"url\" />\n </pw-input-container>\n <pw-input-container label=\"Description\" class=\"col-12\" name=\"contact_us_description\">\n <textarea rows=\"3\" class=\"form-control\" formControlName=\"description\"></textarea>\n </pw-input-container>\n\n <div formArrayName=\"questions\" class=\"col-12 mt-3\" cdkDropList (cdkDropListDropped)=\"dropItems(contactUsQuestions, $event)\">\n <div\n *ngFor=\"let questionGroup of contactUsQuestions.controls; let i = index\"\n [formGroupName]=\"i\"\n class=\"row border p-3 mb-3\"\n cdkDrag\n >\n <pw-input-container label=\"Question\" class=\"col-md-10\" name=\"question\">\n <input type=\"text\" class=\"form-control\" formControlName=\"question\" />\n </pw-input-container>\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-3\">\n <i\n class=\"fa fa-trash delete-icon text-danger\"\n (click)=\"removeContactUsQuestion(i)\"\n (keydown.enter)=\"removeContactUsQuestion(i)\"\n (keydown.space)=\"removeContactUsQuestion(i)\"\n ngbTooltip=\"Remove\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-3\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder question\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <div class=\"col-12 mt-3\" formArrayName=\"options\" cdkDropList [cdkDropListData]=\"getQuestionOptions(i).controls\" (cdkDropListDropped)=\"dropContactUsOptions(i, $event)\">\n <div\n class=\"row align-items-center mb-2 border p-3\"\n *ngFor=\"let option of getQuestionOptions(i).controls; let j = index\"\n [formGroupName]=\"j\"\n cdkDrag\n >\n <pw-input-container label=\"Option\" class=\"col-md-10\" name=\"option\">\n <input type=\"text\" class=\"form-control\" formControlName=\"option\" />\n </pw-input-container>\n\n <div class=\"col-md-1 d-flex justify-content-end mt-3\">\n <i\n class=\"fa fa-trash delete-icon text-danger\"\n (click)=\"removeContactUsOption(i, j)\"\n (keydown.enter)=\"removeContactUsOption(i, j)\"\n (keydown.space)=\"removeContactUsOption(i, j)\"\n ngbTooltip=\"Remove Option\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <div class=\"col-md-1 d-flex justify-content-end mt-3\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder option\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <div class=\"text-start\">\n <button type=\"button\" class=\"btn btn-primary btn-sm\" (click)=\"addContactUsOption(i)\">\n + Add Option\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"text-start mt-3\">\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"addContactUsQuestion()\">\n + Add Question\n </button>\n </div>\n </div>\n\n <div formArrayName=\"hubspot\" class=\"col-12 mt-4\" cdkDropList (cdkDropListDropped)=\"dropItems(contactUsHubspotItems, $event)\">\n <h5 class=\"mb-4\">Hubspot Embeds</h5>\n\n <div\n *ngFor=\"let hub of contactUsHubspotItems.controls; let i = index\"\n [formGroupName]=\"i\"\n class=\"row border p-3 mb-2\"\n cdkDrag\n >\n <pw-input-container label=\"ID\" class=\"col-md-5\" name=\"id\">\n <input type=\"text\" class=\"form-control\" formControlName=\"id\" />\n </pw-input-container>\n\n <pw-input-container label=\"Position\" class=\"col-md-6\" name=\"position\">\n <input type=\"text\" class=\"form-control\" formControlName=\"position\" />\n </pw-input-container>\n <div class=\"col-md-1 d-flex align-items-start justify-content-end mt-3\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <pw-input-container label=\"Div\" class=\"col-10\" name=\"div\">\n <textarea\n class=\"form-control\"\n rows=\"5\"\n formControlName=\"div\"\n [ngClass]=\"{ 'is-invalid': submitted && f['div']?.errors }\"\n ></textarea>\n </pw-input-container>\n\n <div class=\"col-md-2 d-flex align-items-center mt-3\">\n <i\n class=\"fa fa-trash delete-icon\"\n (click)=\"removeHubspotItem(i)\"\n (keydown.enter)=\"removeHubspotItem(i)\"\n (keydown.space)=\"removeHubspotItem(i)\"\n ngbTooltip=\"Remove Hubspot Embed\"\n aria-hidden=\"true\">\n</i>\n </div>\n </div>\n\n <div class=\"text-start mt-2\">\n <button type=\"button\" class=\"btn btn-primary btn-sm\" (click)=\"addHubspotItem()\">\n + Add Hubspot Embed\n </button>\n </div>\n </div>\n\n </div>\n </p-accordionTab>\n\n\n <p-accordionTab [header]=\"'Book a Demo Section'\">\n <div class=\"row mt-4\">\n <div class=\"col-12\">\n <h4 class=\"mb-3\">{{ 'Admin.DomainConfig.BookDemoLinks' | transloco }}</h4>\n <div formGroupName=\"book_demo\">\n <pw-input-container label=\"Title\" name=\"title\">\n <input type=\"text\" formControlName=\"title\" class=\"form-control\" />\n </pw-input-container>\n\n <pw-input-container label=\"Description\" name=\"description\">\n <input type=\"text\" formControlName=\"description\" class=\"form-control\" />\n </pw-input-container>\n\n <div formArrayName=\"items\" cdkDropList (cdkDropListDropped)=\"dropBookDemoLinks($event)\">\n <div\n *ngFor=\"let link of f['book_demo'].get('items')['controls']; let i = index\"\n [formGroupName]=\"i\"\n class=\"row mb-3 border p-3 align-items-center\"\n cdkDrag\n >\n <div class=\"col-sm-5\">\n <pw-input-container label=\"Link Title\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-sm-5\">\n <pw-input-container label=\"Link URL\" name=\"url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"url\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-sm-1 d-flex justify-content-end mt-3\">\n <i\n ngbTooltip=\"Remove\"\n (click)=\"removeBookDemoLink(i)\"\n (keydown.enter)=\"removeBookDemoLink(i)\"\n (keydown.space)=\"removeBookDemoLink(i)\"\n class=\"fa fa-trash delete-icon text-danger\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <div class=\"col-sm-1 d-flex justify-content-end mt-3\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <button type=\"button\" class=\"btn btn-primary mt-2 mb-2\" (click)=\"addBookDemoLink()\">\n + Add Book Demo Link\n </button>\n </div>\n </div>\n </div>\n </div>\n </p-accordionTab>\n\n\n <p-accordionTab [header]=\"'Navbar Section'\">\n <div class=\"row mt-3 mb-4\" formGroupName=\"navbar\">\n <h4 class=\"mb-3\">Navbar Section</h4>\n\n <div formArrayName=\"items\" class=\"col-12\" cdkDropList (cdkDropListDropped)=\"dropItems(navbarItems, $event)\">\n <div\n *ngFor=\"let item of navbarItems.controls; let i = index\"\n [formGroupName]=\"i\"\n class=\"row mb-3\"\n cdkDrag\n >\n <div class=\"row align-items-center\">\n <pw-input-container label=\"Title\" class=\"col-md-5\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n\n <pw-input-container label=\"Path\" class=\"col-md-5\" name=\"path\">\n <input type=\"text\" class=\"form-control\" formControlName=\"path\" />\n </pw-input-container>\n\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-1\">\n <i\n class=\"fa fa-trash delete-icon text-danger\"\n (click)=\"removeNavbarItem(i)\"\n (keydown.enter)=\"removeNavbarItem(i)\"\n (keydown.space)=\"removeNavbarItem(i)\"\n ngbTooltip=\"Remove Navbar Item\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-1\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <div\n class=\"col-12 mt-3\"\n formArrayName=\"subtitles\"\n cdkDropList\n [cdkDropListData]=\"getNavbarSubtitles(i).controls\"\n (cdkDropListDropped)=\"dropNavbarSubtitles(i, $event)\"\n >\n <div\n *ngFor=\"let sub of getNavbarSubtitles(i).controls; let j = index\"\n [formGroupName]=\"j\"\n class=\"row border p-3 mb-2 align-items-center\"\n cdkDrag\n >\n <div class=\"col-md-5\">\n <pw-input-container label=\"Subtitle Title\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-md-5\">\n <pw-input-container label=\"Subtitle Path\" name=\"path\">\n <input type=\"text\" class=\"form-control\" formControlName=\"path\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-2\">\n <i\n class=\"fa fa-trash delete-icon text-danger\"\n (click)=\"removeSubtitle(i, j)\"\n (keydown.enter)=\"removeSubtitle(i, j)\"\n (keydown.space)=\"removeSubtitle(i, j)\"\n ngbTooltip=\"Remove Subtitle\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <div class=\"col-md-1 d-flex justify-content-end\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder subtitle\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <button type=\"button\" class=\"btn btn-sm btn-primary mt-2\" (click)=\"addSubtitle(i)\">\n + Add Subtitle\n </button>\n </div>\n </div>\n\n <button type=\"button\" class=\"btn btn-primary mt-2 mb-2\" (click)=\"addNavbarItem()\">\n + Add Navbar Item\n </button>\n </div>\n </div>\n </p-accordionTab>\n\n\n <p-accordionTab [header]=\"'Footer Links Section'\">\n <div class=\"row mt-3 mb-4\" formGroupName=\"footer_links\">\n <h4 class=\"mb-3\">Footer Links Section</h4>\n\n <div\n formArrayName=\"items\"\n class=\"col-12\"\n cdkDropList\n (cdkDropListDropped)=\"dropItems(footerLinksItems, $event)\"\n >\n <div\n *ngFor=\"let item of footerLinksItems.controls; let i = index\"\n [formGroupName]=\"i\"\n class=\"row mb-3\"\n cdkDrag\n >\n <div class=\"row align-items-center\">\n\n <pw-input-container label=\"Title\" class=\"col-md-5\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n\n <pw-input-container label=\"Path\" class=\"col-md-5\" name=\"path\">\n <input type=\"text\" class=\"form-control\" formControlName=\"path\" />\n </pw-input-container>\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-1\">\n <i\n class=\"fa fa-trash delete-icon text-danger\"\n (click)=\"removeFooterLinkItem(i)\"\n (keydown.enter)=\"removeFooterLinkItem(i)\"\n (keydown.space)=\"removeFooterLinkItem(i)\"\n ngbTooltip=\"Remove Footer Item\"\n aria-hidden=\"true\"\n ></i>\n </div>\n <div class=\"col-md-1 d-flex align-items-start justify-content-end mt-1\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n </div>\n\n <div\n class=\"col-12 mt-3\"\n formArrayName=\"subtitles\"\n cdkDropList\n [cdkDropListData]=\"getFooterSubtitles(i).controls\"\n (cdkDropListDropped)=\"dropFooterSubtitles(i, $event)\"\n >\n <div\n *ngFor=\"let sub of getFooterSubtitles(i).controls; let j = index\"\n [formGroupName]=\"j\"\n class=\"row border p-3 mb-2 align-items-center\"\n cdkDrag\n >\n\n <div class=\"col-md-5\">\n <pw-input-container label=\"Subtitle Title\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n </div>\n\n <div class=\"col-md-5\">\n <pw-input-container label=\"Subtitle Path\" name=\"path\">\n <input type=\"text\" class=\"form-control\" formControlName=\"path\" />\n </pw-input-container>\n </div>\n\n\n\n\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-2\">\n <i\n class=\"fa fa-trash delete-icon text-danger\"\n (click)=\"removeFooterSubtitle(i, j)\"\n (keydown.enter)=\"removeFooterSubtitle(i, j)\"\n (keydown.space)=\"removeFooterSubtitle(i, j)\"\n ngbTooltip=\"Remove Subtitle\"\n aria-hidden=\"true\"\n ></i>\n </div>\n <div class=\"col-md-1 d-flex justify-content-end\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder subtitle\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <button\n type=\"button\"\n class=\"btn btn-sm btn-primary mt-2\"\n (click)=\"addFooterSubtitle(i)\"\n >\n + Add Subtitle\n </button>\n </div>\n </div>\n\n <button\n type=\"button\"\n class=\"btn btn-primary mt-2 mb-2\"\n (click)=\"addFooterLinkItem()\"\n >\n + Add Footer Link\n </button>\n </div>\n </div>\n </p-accordionTab>\n\n\n\n\n\n <p-accordionTab [header]=\"'Guides Section'\">\n <div class=\"row mt-3 mb-4\" formGroupName=\"guides\">\n <h4 class=\"mb-3\">Guides Section</h4>\n\n <div formArrayName=\"items\" class=\"col-12\">\n <div cdkDropList (cdkDropListDropped)=\"dropItems(guidesItems, $event)\">\n <div\n *ngFor=\"let item of guidesItems.controls; let i = index\"\n [formGroupName]=\"i\"\n class=\"border p-3 mb-3\"\n cdkDrag\n >\n <div class=\"row align-items-start\">\n\n <pw-input-container label=\"Title\" class=\"col-md-5\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" />\n </pw-input-container>\n\n <pw-input-container label=\"Button Text\" class=\"col-md-6\" name=\"button_text\">\n <input type=\"text\" class=\"form-control\" formControlName=\"button_text\" />\n </pw-input-container>\n <div class=\"col-md-1 d-flex align-items-start justify-content-end mt-1\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <div class=\"row mt-2\">\n <pw-input-container label=\"Image URL\" class=\"col-md-6\" name=\"image_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"image_url\" />\n </pw-input-container>\n\n <pw-input-container label=\"Guide URL\" class=\"col-md-6\" name=\"guide_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"guide_url\" />\n </pw-input-container>\n </div>\n\n <div class=\"row mt-2\">\n <pw-input-container label=\"Description\" class=\"col-md-11\" name=\"description\">\n <textarea\n class=\"form-control\"\n rows=\"5\"\n formControlName=\"description\"\n [ngClass]=\"{ 'is-invalid': submitted && f['description']?.errors }\"\n ></textarea>\n </pw-input-container>\n\n <div class=\"col-md-1 d-flex align-items-start justify-content-center mt-3\">\n <i\n class=\"fa fa-trash delete-icon text-danger\"\n (click)=\"removeGuideItem(i)\"\n (keydown.enter)=\"removeGuideItem(i)\"\n (keydown.space)=\"removeGuideItem(i)\"\n ngbTooltip=\"Remove Guide\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"text-start mt-2\">\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"addGuideItem()\">\n + Add Guide\n </button>\n </div>\n </div>\n </div>\n </p-accordionTab>\n\n\n\n <p-accordionTab [header]=\"'AB Tests Section'\">\n <div class=\"row mt-3 mb-4\">\n <h4 class=\"mb-3\">AB Tests</h4>\n <div formArrayName=\"ab_tests\" class=\"col-12\" cdkDropList (cdkDropListDropped)=\"dropItems(abTests, $event)\">\n <div\n *ngFor=\"let abTest of abTests.controls; let i = index\"\n [formGroupName]=\"i\"\n class=\"row mb-3 border p-3\"\n cdkDrag\n >\n <pw-input-container label=\"Description\" class=\"col-md-5\" name=\"description\">\n <input type=\"text\" class=\"form-control\" formControlName=\"description\" />\n </pw-input-container>\n\n <pw-input-container label=\"Experiment Name\" class=\"col-md-6\" name=\"experiment_name\">\n <input type=\"text\" class=\"form-control\" formControlName=\"experiment_name\" />\n </pw-input-container>\n\n\n <div class=\"col-md-1 d-flex align-items-start justify-content-end mt-1\">\n <i\n class=\"fa fa-bars cursor-move\"\n cdkDragHandle\n ngbTooltip=\"Drag to reorder\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <pw-input-container label=\"DB Shard\" class=\"col-md-6\" name=\"db_shard\">\n <input type=\"text\" class=\"form-control\" formControlName=\"db_shard\" />\n </pw-input-container>\n\n <pw-input-container label=\"Microservice Name\" class=\"col-md-6\" name=\"microservice_name\">\n <input type=\"text\" class=\"form-control\" formControlName=\"microservice_name\" />\n </pw-input-container>\n\n <div class=\"col-md-12 text-end mt-2\">\n <i\n class=\"fa fa-trash delete-icon text-danger\"\n (click)=\"removeAbTest(i)\"\n (keydown.enter)=\"removeAbTest(i)\"\n (keydown.space)=\"removeAbTest(i)\"\n ngbTooltip=\"Remove AB Test\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n\n <div class=\"text-start mt-2\">\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"addAbTest()\">+ Add AB Test</button>\n </div>\n </div>\n </div>\n </p-accordionTab>\n\n\n\n\n\n <p-accordionTab [header]=\"'Coming soon pages - Subscribe to newsletter (TO DISCONTINUE)'\">\n <div class=\"mb-3\">\n <p>ComingSoon Pages will enable users to subscribe to Newsletters and are accessible at the internal paths\n /join/cs1, /join/cs2, etc.</p>\n </div>\n <div class=\"text-end\" *ngIf=\"shardUrl\">\n <span>See the live page <span class=\"tooltip-wrap ms-1\" [appendTo]=\"'body'\"\n [pTooltip]=\"'Admin.DomainConfig.Tooltip.SeeLiveCs' | transloco\" tooltipPosition=\"top\">\n <i class=\"fas fa-info-circle\"></i>\n </span> : <a [href]=\"shardUrl + '/join/cs1'\" target=\"_blank\">{{ shardUrl }}/join/cs1</a></span>\n </div>\n <div class=\"row\">\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.CsProduct' | transloco\" [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.CsProduct' | transloco\" name=\"cs_product_id\">\n <p-autoComplete [suggestions]=\"productsList\" formControlName=\"cs_product_id\" dataKey=\"id\" field=\"name\"\n [dropdown]=\"true\" [delay]=\"1000\" (completeMethod)=\"searchProduct($event)\" styleClass=\"w-100\"\n placeholder=\"Search Product\" [inputStyle]=\"\n form.get('cs_product_id').touched &&\n form.get('cs_product_id').invalid\n ? { border: '1px solid #ff586b' }\n : { border: '1px solid gray' }\n \" [multiple]=\"false\">\n </p-autoComplete>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.CsCrmSourceId' | transloco\" name=\"cs_crm_source_id\"\n [showTooltip]=\"true\" [tooltipText]=\"'Admin.DomainConfig.Tooltip.CsCrmSourceId' | transloco\">\n <p-dropdown [options]=\"crmSourcesList\" formControlName=\"cs_crm_source_id\"\n [ngClass]=\"{ 'is-invalid': submitted && f['cs_crm_source_id']?.errors }\" [placeholder]=\"'Select CRM Source'\"\n optionValue=\"id\" optionLabel=\"name\">\n </p-dropdown>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.CsPdfSourceId' | transloco\" name=\"cs_pdf_source_id\"\n [showTooltip]=\"true\" [tooltipText]=\"'Admin.DomainConfig.Tooltip.CsPdfSourceId' | transloco\">\n <p-dropdown [options]=\"crmSourcesList\" formControlName=\"cs_pdf_source_id\"\n [ngClass]=\"{ 'is-invalid': submitted && f['cs_pdf_source_id']?.errors }\" [placeholder]=\"'Select CRM Source'\"\n optionValue=\"id\" optionLabel=\"name\">\n </p-dropdown>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\"></div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.CsVideoUrl' | transloco\" name=\"cs_video_url\" [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.DomainConfig.Tooltip.CsVideoUrl' | transloco\">\n <input type=\"text\" class=\"form-control\" formControlName=\"cs_video_url\"\n [ngClass]=\"{ 'is-invalid': submitted && f['cs_video_url'].errors }\" />\n </pw-input-container>\n </div>\n <div class=\"col-12 col-sm-3\">\n <pw-input-container [label]=\"'Admin.DomainConfig.CsBookDemoUrl' | transloco\" name=\"cs_book_demo_url\"\n [showTooltip]=\"true\" [tooltipText]=\"'Admin.DomainConfig.Tooltip.CsBookDemoUrl' | transloco\">\n <input type=\"text\" class=\"form-control\" formControlName=\"cs_book_demo_url\"\n [ngClass]=\"{ 'is-invalid': submitted && f['cs_book_demo_url'].errors }\" />\n </pw-input-container>\n </div>\n <div class=\"col-12\">\n <pw-input-container [label]=\"'Admin.DomainConfig.CsCtaIframe' | transloco\" name=\"cs_cta_iframe\"\n [showTooltip]=\"true\" [tooltipText]=\"'Admin.DomainConfig.Tooltip.CsCtaIframe' | transloco\">\n <textarea class=\"form-control\" rows=\"3\" formControlName=\"cs_cta_iframe\"\n [ngClass]=\"{ 'is-invalid': submitted && f['cs_cta_iframe'].errors }\">\n </textarea>\n </pw-input-container>\n </div>\n <div class=\"col-12\">\n <pw-input-container [label]=\"'Admin.DomainConfig.CsJoinMessage' | transloco\" name=\"cs_join_message\"\n [showTooltip]=\"true\" [tooltipText]=\"'Admin.DomainConfig.Tooltip.CsJoinMessage' | transloco\">\n <textarea class=\"form-control\" rows=\"3\" formControlName=\"cs_join_message\"\n [ngClass]=\"{ 'is-invalid': submitted && f['cs_join_message'].errors }\">\n </textarea>\n </pw-input-container>\n </div>\n <div class=\"col-12\">\n <pw-input-container [label]=\"'Admin.DomainConfig.CsPdfDownloadText' | transloco\" name=\"cs_pdf_download_text\"\n [showTooltip]=\"true\" [tooltipText]=\"\n 'Admin.DomainConfig.Tooltip.CsPdfDownloadText' | transloco\n \">\n <textarea class=\"form-control\" rows=\"3\" formControlName=\"cs_pdf_download_text\" [ngClass]=\"{\n 'is-invalid': submitted && f['cs_pdf_download_text'].errors\n }\">\n </textarea>\n </pw-input-container>\n </div>\n </div>\n <div class=\"row\" matchHeight=\"card\">\n <div class=\"col-md-4\">\n <label for=\"cs_image\">{{ 'Admin.DomainConfig.CsImage' | transloco }} <span class=\"info-circle\">\n <span class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.DomainConfig.Tooltip.CsImage' | transloco\n }}</span>\n </span>\n </label>\n <pw-custom-uploader (saveEvent)=\"onSaveFile($event)\" [aspectRatio]=\"'custom'\" [title]=\"'Cs Image'\"\n [controlName]=\"'cs_image'\" [previewData]=\"data['cs_image']\">\n </pw-custom-uploader>\n </div>\n <div class=\"col-md-4\">\n <label for=\"cs_image2\">{{ 'Admin.DomainConfig.CsImage2' | transloco }} <span class=\"info-circle\">\n <span class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.DomainConfig.Tooltip.CsImage2' | transloco\n }}</span>\n </span>\n </label>\n <pw-custom-uploader (saveEvent)=\"onSaveFile($event)\" [aspectRatio]=\"'custom'\" [title]=\"'Cs Image2'\"\n [controlName]=\"'cs_image2'\" [previewData]=\"data['cs_image2']\">\n </pw-custom-uploader>\n </div>\n <div class=\"col-md-4\">\n <label for=\"cs_pdf_image\">{{ 'Admin.DomainConfig.CsPdfImage' | transloco }} <span class=\"info-circle\">\n <span class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.DomainConfig.Tooltip.CsPdfImage' | transloco\n }}</span>\n </span>\n </label>\n <pw-custom-uploader (saveEvent)=\"onSaveFile($event)\" [aspectRatio]=\"'custom'\" [title]=\"'Cs Pdf Image'\"\n [controlName]=\"'cs_pdf_image'\" [previewData]=\"data['cs_pdf_image']\">\n </pw-custom-uploader>\n </div>\n <div class=\"col-md-4\">\n <label for=\"cs_image_bg\">{{ 'Admin.DomainConfig.CsImageBg' | transloco }} <span class=\"info-circle\">\n <span class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.DomainConfig.Tooltip.CsImageBg' | transloco\n }}</span>\n </span>\n </label>\n <pw-custom-uploader (saveEvent)=\"onSaveFile($event)\" [aspectRatio]=\"'custom'\" [title]=\"'Cs Pdf Image Bg'\"\n [controlName]=\"'cs_image_bg'\" [previewData]=\"data['cs_image_bg']\">\n </pw-custom-uploader>\n </div>\n <div class=\"col-md-4\">\n <label for=\"cs_image_bg2\">{{ 'Admin.DomainConfig.CsImageBg2' | transloco }} <span class=\"info-circle\">\n <span class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.DomainConfig.Tooltip.CsImageBg2' | transloco\n }}</span>\n </span>\n </label>\n <pw-custom-uploader (saveEvent)=\"onSaveFile($event)\" [aspectRatio]=\"'custom'\" [title]=\"'Cs Pdf Image Bg2'\"\n [controlName]=\"'cs_image_bg2'\" [previewData]=\"data['cs_image_bg2']\">\n </pw-custom-uploader>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </div>\n\n <div class=\"col-12 text-end mt-3\">\n <button type=\"button\"\n class=\"btn btn-outline-default me-2\"\n (click)=\"back()\">\n {{ 'Button.Cancel' | transloco }}\n </button>\n <button type=\"submit\" [buttonBusy]=\"buttonBusy\"\n class=\"btn btn-primary\">{{ 'Button.Submit' | transloco }}</button>\n </div>\n </form>\n</ng-container>\n<div *ngIf=\"!data?.host_name && !isLoading\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.DomainConfig.EnableConfigTab' | transloco\"> </pw-no-data>\n</div>\n\n\n<ng-template #partnerCropper let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Upload Partner Image</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <small>You can upload JPG, PNG, or GIF files. Avoid images with celebrities, nudity, or artwork.</small>\n <pw-image-cropper\n aspectRatio=\"auto\"\n (imageSelectionEvent)=\"onPartnerImageSelected($event)\"\n (closeEvent)=\"onClosePartnerModal()\"\n ></pw-image-cropper>\n </div>\n</ng-template>\n" }]
724
- }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.AdminService }, { type: i2.ProductService }, { type: i3.NgbModal }, { type: i4.FormBuilder }], propDecorators: { uploader: [{
725
- type: ViewChildren,
726
- args: [CustomUploaderComponent]
727
- }], partnerCropper: [{
728
- type: ViewChild,
729
- args: ['partnerCropper']
730
- }], onSave: [] } });
731
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tYWluLWNvbmZpZy1idWlsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FkbWluLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvZG9tYWluLWNvbmZpZy9kb21haW4tY29uZmlnLWRldGFpbHMvZG9tYWluLWNvbmZpZy1idWlsZC9kb21haW4tY29uZmlnLWJ1aWxkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYWRtaW4tbW9kdWxlL3NyYy9saWIvY29tcG9uZW50cy9kb21haW4tY29uZmlnL2RvbWFpbi1jb25maWctZGV0YWlscy9kb21haW4tY29uZmlnLWJ1aWxkL2RvbWFpbi1jb25maWctYnVpbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBZSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RSxPQUFPLEVBRUgsU0FBUyxFQUNULFFBQVEsRUFFUixTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWEsV0FBVyxFQUErQixNQUFNLGdCQUFnQixDQUFDO0FBRXJGLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFeEUsT0FBTyxPQUFPLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFN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LEVBQUU7WUFDaEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUM7WUFDckQsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNYLElBQUksRUFBRSxHQUFHLEVBQUU7Z0JBQ1AsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsbUNBQW1DLENBQUMsQ0FBQyxDQUFDO1lBQ3hGLENBQUM7U0FDSixDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNSLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzsrR0E3M0JRLDBCQUEwQjttR0FBMUIsMEJBQTBCLDhMQUNyQix1QkFBdUIsdUVDL0J6QyxraGtGQWtxREE7O0FEOXhCSTtJQURDLFlBQVksQ0FBQyxNQUFNLENBQUM7Ozs7d0RBd0JwQjs0RkE3M0JRLDBCQUEwQjtrQkFKdEMsU0FBUzsrQkFDSSx3QkFBd0I7c0xBSUssUUFBUTtzQkFBOUMsWUFBWTt1QkFBQyx1QkFBdUI7Z0JBQ1IsY0FBYztzQkFBMUMsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBbzJCM0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka0RyYWdEcm9wLCBtb3ZlSXRlbUluQXJyYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDb21wb25lbnQsXG4gICAgSW5qZWN0b3IsXG4gICAgT25Jbml0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBVbnR5cGVkRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBBZG1pblNlcnZpY2UsIEFwcEFkbWluIH0gZnJvbSAnQHBvc2l3aXNlL2FkbWluLW1vZHVsZS11dGlscyc7XG5pbXBvcnQgeyBBcHBCYXNlQ29tcG9uZW50IH0gZnJvbSAnQHBvc2l3aXNlL2FwcC1iYXNlLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uU2VydmljZSwgUHJvZHVjdFNlcnZpY2UgfSBmcm9tICdAcG9zaXdpc2UvY29tbW9uLXNlcnZpY2VzJztcbmltcG9ydCB7IEhlbHBlclNlcnZpY2UgfSBmcm9tICdAcG9zaXdpc2UvaGVscGVyLXNlcnZpY2UnO1xuaW1wb3J0IHsgQ3VzdG9tVXBsb2FkZXJDb21wb25lbnQsIFZhbGlkYXRlRm9ybSB9IGZyb20gJ0Bwb3Npd2lzZS91dGlscyc7XG5cbmltcG9ydCBncm91cEJ5IGZyb20gJ2xvZGFzaC9ncm91cEJ5JztcbmltcG9ydCB7IGZvcmtKb2luIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuXG5pbXBvcnQgeyBEb21haW5Db25maWcgfSBmcm9tICcuLi8uLi8uLi8uLi9zaGFyZWQvaW50ZXJmYWNlL2RvbWFpbi1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJPVVRFUlMgfSBmcm9tICcuLi8uLi8uLi8uLi9zaGFyZWQvcm91dGVycy9yb3V0ZXJzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdwdy1kb21haW4tY29uZmlnLWJ1aWxkJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZG9tYWluLWNvbmZpZy1idWlsZC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgRG9tYWluQ29uZmlnQnVpbGRDb21wb25lbnQgZXh0ZW5kcyBBcHBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgICBAVmlld0NoaWxkcmVuKEN1c3RvbVVwbG9hZGVyQ29tcG9uZW50KSB1cGxvYWRlcjogUXVlcnlMaXN0PEN1c3RvbVVwbG9hZGVyQ29tcG9uZW50PjtcbiAgICBAVmlld0NoaWxkKCdwYXJ0bmVyQ3JvcHBlcicpIHBhcnRuZXJDcm9wcGVyO1xuXG4gICAgZm9ybTogVW50eXBlZEZvcm1Hcm91cDtcblxuICAgIHN1Ym1pdHRlZCA9IGZhbHNlO1xuICAgIGJ1dHRvbkJ1c3kgPSBmYWxzZTtcblxuICAgIHNlbGVjdGVkUGFydG5lckluZGV4OiBudW1iZXIgPSBudWxsO1xuXG4gICAgaWQ6IG51bWJlcjtcbiAgICBkdXBsaWNhdGVDb25maWdJZDtcbiAgICBzdWJzY3JpcHRpb25JZDogbnVtYmVyO1xuXG4gICAgZGF0YTogRG9tYWluQ29uZmlnO1xuXG4gICAgcm91dGVycyA9IFJPVVRFUlM7XG5cbiAgICBtYXN0ZXJTdWJzY3JpcHRpb25Qcm9kdWN0TGlzdCA9IFtdO1xuICAgIG1hc3RlclN1YnNjcmlwdGlvbnNMaXN0ID0gW107XG4gICAgc3Vic2NyaXB0aW9uVG9zTGlzdCA9IFtdO1xuICAgIGNybVByb2R1Y3RMaXN0ID0gW107XG4gICAgY3JtU3Vic2NyaXB0aW9uc0xpc3QgPSBbXTtcbiAgICBjcm1Tb3VyY2VzTGlzdCA9IFtdO1xuICAgIHByb2R1Y3RzTGlzdCA9IFtdO1xuICAgIGNoaWxkTGlzdCA9IFtdO1xuXG4gICAgaXNMb2FkaW5nOiBib29sZWFuO1xuXG4gICAgc2hhcmRVcmw6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYWRtaW5TZXJ2aWNlOiBBZG1pblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvZHVjdFNlcnZpY2U6IFByb2R1Y3RTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG1vZGFsU2VydmljZTogTmdiTW9kYWwsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZmI6IEZvcm1CdWlsZGVyXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcbiAgICAgICAgdGhpcy5mb3JtID0gQXBwQWRtaW4uZG9tYWluQ29uZmlnQnVpbGRGb3JtKHRoaXMuZmIpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmlkID0gTnVtYmVyKHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zWydpZCddKTtcbiAgICAgICAgdGhpcy5kdXBsaWNhdGVDb25maWdJZCA9IE51bWJlcihcbiAgICAgICAgICAgIHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbJ2R1cGxpY2F0ZV9kb21haW5fY29uZmlnX2lkJ11cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25JZCA9IFBlcm1pc3Npb25TZXJ2aWNlLnNlbGVjdGVkU3Vic2NyaXB0aW9uPy5pZDtcbiAgICAgICAgaWYgKHRoaXMuaWQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0QWxsT3B0aW9ucygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBlcm1pc3Npb25TZXJ2aWNlLmlzU3VwZXJBZG1pbigpKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdtYXN0ZXJfc3Vic2NyaXB0aW9uX2lkJykuZW5hYmxlKCk7XG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdtYXN0ZXJfc3Vic2NyaXB0aW9uX3Byb2R1Y3RfaWQnKS5lbmFibGUoKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2lzX3Byb2R1Y3RfZG9tYWluJykuZW5hYmxlKCk7XG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdjcm1fc3Vic2NyaXB0aW9uX2lkJykuZW5hYmxlKCk7XG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdjcm1fcHJvZHVjdF9pZCcpLmVuYWJsZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnbWFzdGVyX3N1YnNjcmlwdGlvbl9pZCcpLmRpc2FibGUoKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ21hc3Rlcl9zdWJzY3JpcHRpb25fcHJvZHVjdF9pZCcpLmRpc2FibGUoKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2lzX3Byb2R1Y3RfZG9tYWluJykuZGlzYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnY3JtX3N1YnNjcmlwdGlvbl9pZCcpLmRpc2FibGUoKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2NybV9wcm9kdWN0X2lkJykuZGlzYWJsZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkQm9va0RlbW9MaW5rKCkge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZm9ybS5nZXQoJ2Jvb2tfZGVtbycpPy5nZXQoJ2l0ZW1zJykgYXMgRm9ybUFycmF5O1xuICAgICAgICBpdGVtcy5wdXNoKHRoaXMuZmIuZ3JvdXAoeyB0aXRsZTogWycnXSwgdXJsOiBbJyddIH0pKTtcbiAgICB9XG5cbiAgICBnZXQgaW50ZWdyYXRpb25zKCk6IEZvcm1Hcm91cCB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KCdpbnRlZ3JhdGlvbnMnKSBhcyBGb3JtR3JvdXA7XG4gICAgfVxuXG4gICAgZ2V0IGludGVncmF0aW9uc0l0ZW1zKCk6IEZvcm1BcnJheSB7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVncmF0aW9ucy5nZXQoJ2l0ZW1zJykgYXMgRm9ybUFycmF5O1xuICAgIH1cblxuICAgIGdldCBhYlRlc3RzKCk6IEZvcm1BcnJheSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KCdhYl90ZXN0cycpIGFzIEZvcm1BcnJheTtcbiAgICB9XG5cbiAgICBhZGRBYlRlc3QoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWJUZXN0cy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFsnJ10sXG4gICAgICAgICAgICAgICAgZXhwZXJpbWVudF9uYW1lOiBbJyddLFxuICAgICAgICAgICAgICAgIGRiX3NoYXJkOiBbJyddLFxuICAgICAgICAgICAgICAgIG1pY3Jvc2VydmljZV9uYW1lOiBbJyddXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJlbW92ZUFiVGVzdChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWJUZXN0cy5yZW1vdmVBdChpbmRleCk7XG4gICAgfVxuXG4gICAgYWRkSW50ZWdyYXRpb25JdGVtKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmludGVncmF0aW9uc0l0ZW1zLnB1c2goXG4gICAgICAgICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgICAgICB0aXRsZTogWycnXSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogWycnXSxcbiAgICAgICAgICAgICAgICBibG9nX3VybDogWycnXSxcbiAgICAgICAgICAgICAgICBpbWFnZV91cmw6IFsnJ10sXG4gICAgICAgICAgICAgICAgdmlkZW9fdXJsOiBbJyddXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldCBndWlkZXNJdGVtcygpOiBGb3JtQXJyYXkge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgnZ3VpZGVzJyk/LmdldCgnaXRlbXMnKSBhcyBGb3JtQXJyYXk7XG4gICAgfVxuXG4gICAgYWRkR3VpZGVJdGVtKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmd1aWRlc0l0ZW1zLnB1c2goXG4gICAgICAgICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgICAgICB0aXRsZTogWycnXSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogWycnXSxcbiAgICAgICAgICAgICAgICBidXR0b25fdGV4dDogWycnXSxcbiAgICAgICAgICAgICAgICBpbWFnZV91cmw6IFsnJ10sXG4gICAgICAgICAgICAgICAgZ3VpZGVfdXJsOiBbJyddXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJlbW92ZUd1aWRlSXRlbShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZ3VpZGVzSXRlbXMucmVtb3ZlQXQoaW5kZXgpO1xuICAgIH1cblxuICAgIHJlbW92ZUludGVncmF0aW9uSXRlbShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW50ZWdyYXRpb25zSXRlbXMucmVtb3ZlQXQoaW5kZXgpO1xuICAgIH1cblxuICAgIGdldFF1ZXN0aW9uT3B0aW9ucyhxdWVzdGlvbkluZGV4OiBudW1iZXIpOiBGb3JtQXJyYXkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YWN0VXNRdWVzdGlvbnMuYXQocXVlc3Rpb25JbmRleCkuZ2V0KCdvcHRpb25zJykgYXMgRm9ybUFycmF5O1xuICAgIH1cblxuICAgIGdldCBmb290ZXJMaW5rc0l0ZW1zKCk6IEZvcm1BcnJheSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KCdmb290ZXJfbGlua3MnKT8uZ2V0KCdpdGVtcycpIGFzIEZvcm1BcnJheTtcbiAgICB9XG5cbiAgICBnZXRGb290ZXJTdWJ0aXRsZXMoaW5kZXg6IG51bWJlcik6IEZvcm1BcnJheSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvb3RlckxpbmtzSXRlbXMuYXQoaW5kZXgpLmdldCgnc3VidGl0bGVzJykgYXMgRm9ybUFycmF5O1xuICAgIH1cblxuICAgIGFkZEZvb3RlckxpbmtJdGVtKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvb3RlckxpbmtzSXRlbXMucHVzaChcbiAgICAgICAgICAgIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgICAgIHRpdGxlOiBbJyddLFxuICAgICAgICAgICAgICAgIHBhdGg6IFsnJ10sXG4gICAgICAgICAgICAgICAgc3VidGl0bGVzOiB0aGlzLmZiLmFycmF5KFtdKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZW1vdmVGb290ZXJMaW5rSXRlbShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9vdGVyTGlua3NJdGVtcy5yZW1vdmVBdChpbmRleCk7XG4gICAgfVxuXG4gICAgYWRkRm9vdGVyU3VidGl0bGUobGlua0luZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3VidGl0bGVzID0gdGhpcy5mb290ZXJMaW5rc0l0ZW1zLmF0KGxpbmtJbmRleCkuZ2V0KCdzdWJ0aXRsZXMnKSBhcyBGb3JtQXJyYXk7XG4gICAgICAgIHN1YnRpdGxlcy5wdXNoKHRoaXMuZmIuZ3JvdXAoeyB0aXRsZTogWycnXSwgcGF0aDogWycnXSB9KSk7XG4gICAgfVxuXG4gICAgcmVtb3ZlRm9vdGVyU3VidGl0bGUobGlua0luZGV4OiBudW1iZXIsIHN1YkluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3VidGl0bGVzID0gdGhpcy5mb290ZXJMaW5rc0l0ZW1zLmF0KGxpbmtJbmRleCkuZ2V0KCdzdWJ0aXRsZXMnKSBhcyBGb3JtQXJyYXk7XG4gICAgICAgIHN1YnRpdGxlcy5yZW1vdmVBdChzdWJJbmRleCk7XG4gICAgfVxuXG4gICAgZ2V0IG5hdmJhcigpOiBGb3JtR3JvdXAge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgnbmF2YmFyJykgYXMgRm9ybUdyb3VwO1xuICAgIH1cblxuICAgIGdldCBuYXZiYXJJdGVtcygpOiBGb3JtQXJyYXkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXZiYXIuZ2V0KCdpdGVtcycpIGFzIEZvcm1BcnJheTtcbiAgICB9XG5cbiAgICBnZXRTdWJ0aXRsZXMoaW5kZXg6IG51bWJlcik6IEZvcm1BcnJheSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdmJhckl0ZW1zLmF0KGluZGV4KS5nZXQoJ3N1YnRpdGxlcycpIGFzIEZvcm1BcnJheTtcbiAgICB9XG5cbiAgICBnZXROYXZiYXJTdWJ0aXRsZXMoaW5kZXg6IG51bWJlcik6IEZvcm1BcnJheSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdmJhckl0ZW1zLmF0KGluZGV4KS5nZXQoJ3N1YnRpdGxlcycpIGFzIEZvcm1BcnJheTtcbiAgICB9XG5cbiAgICBhZGROYXZiYXJJdGVtKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm5hdmJhckl0ZW1zLnB1c2goXG4gICAgICAgICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgICAgICB0aXRsZTogWycnXSxcbiAgICAgICAgICAgICAgICBwYXRoOiBbJyddLFxuICAgICAgICAgICAgICAgIHN1YnRpdGxlczogdGhpcy5mYi5hcnJheShbXSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmVtb3ZlTmF2YmFySXRlbShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMubmF2YmFySXRlbXMucmVtb3ZlQXQoaW5kZXgpO1xuICAgIH1cblxuICAgIGFkZFN1YnRpdGxlKG5hdkluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5nZXRTdWJ0aXRsZXMobmF2SW5kZXgpLnB1c2godGhpcy5mYi5ncm91cCh7IHRpdGxlOiBbJyddLCBwYXRoOiBbJyddIH0pKTtcbiAgICB9XG5cbiAgICByZW1vdmVTdWJ0aXRsZShuYXZJbmRleDogbnVtYmVyLCBzdWJJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZ2V0U3VidGl0bGVzKG5hdkluZGV4KS5yZW1vdmVBdChzdWJJbmRleCk7XG4gICAgfVxuXG4gICAgYWRkQ29udGFjdFVzT3B0aW9uKHF1ZXN0aW9uSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmdldFF1ZXN0aW9uT3B0aW9ucyhxdWVzdGlvbkluZGV4KS5wdXNoKFxuICAgICAgICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICAgICAgb3B0aW9uOiBbJyddXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJlbW92ZUNvbnRhY3RVc09wdGlvbihxdWVzdGlvbkluZGV4OiBudW1iZXIsIG9wdGlvbkluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5nZXRRdWVzdGlvbk9wdGlvbnMocXVlc3Rpb25JbmRleCkucmVtb3ZlQXQob3B0aW9uSW5kZXgpO1xuICAgIH1cblxuICAgIHJlbW92ZUJvb2tEZW1vTGluayhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5mb3JtLmdldCgnYm9va19kZW1vJyk/LmdldCgnaXRlbXMnKSBhcyBGb3JtQXJyYXk7XG4gICAgICAgIGl0ZW1zLnJlbW92ZUF0KGluZGV4KTtcbiAgICB9XG5cbiAgICBnZXQgY3RhcygpOiBGb3JtR3JvdXAge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgnY3RhcycpIGFzIEZvcm1Hcm91cDtcbiAgICB9XG5cbiAgICBnZXQgY3Rhc0l0ZW1zKCk6IEZvcm1BcnJheSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN0YXMuZ2V0KCdpdGVtcycpIGFzIEZvcm1BcnJheTtcbiAgICB9XG5cbiAgICBnZXQgY29udGFjdFVzKCk6IEZvcm1Hcm91cCB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KCdjb250YWN0X3VzJykgYXMgRm9ybUdyb3VwO1xuICAgIH1cblxuICAgIGdldCBjb250YWN0VXNRdWVzdGlvbnMoKTogRm9ybUFycmF5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFjdFVzLmdldCgncXVlc3Rpb25zJykgYXMgRm9ybUFycmF5O1xuICAgIH1cblxuICAgIGFkZENvbnRhY3RVc1F1ZXN0aW9uKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbnRhY3RVc1F1ZXN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICAgICAgcXVlc3Rpb246IFsnJ10sXG4gICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5mYi5hcnJheShbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uOiBbJyddXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmVtb3ZlQ29udGFjdFVzUXVlc3Rpb24oaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbnRhY3RVc1F1ZXN0aW9ucy5yZW1vdmVBdChpbmRleCk7XG4gICAgfVxuXG4gICAgYWRkQ3Rhc0l0ZW0oKSB7XG4gICAgICAgIHRoaXMuY3Rhc0l0ZW1zLnB1c2goXG4gICAgICAgICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgICAgICB0aXRsZTogWycnXSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogWycnXSxcbiAgICAgICAgICAgICAgICBidXR0b25fdGV4dDogWycnXSxcbiAgICAgICAgICAgICAgICBpbWFnZV91cmw6IFsnJ10sXG4gICAgICAgICAgICAgICAgY3RhX3VybDogWycnXVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZW1vdmVDdGFzSXRlbShpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuY3Rhc0l0ZW1zLnJlbW92ZUF0KGluZGV4KTtcbiAgICB9XG4gICAgZ2V0IHRlc3RpbW9uaWFscygpOiBGb3JtR3JvdXAge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgndGVzdGltb25pYWxzJykgYXMgRm9ybUdyb3VwO1xuICAgIH1cblxuICAgIGdldCB0ZXN0aW1vbmlhbHNJdGVtcygpOiBGb3JtQXJyYXkge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgndGVzdGltb25pYWxzLml0ZW1zJykgYXMgRm9ybUFycmF5O1xuICAgIH1cblxuICAgIGdldCBjb250YWN0VXNIdWJzcG90SXRlbXMoKTogRm9ybUFycmF5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoJ2NvbnRhY3RfdXMnKT8uZ2V0KCdodWJzcG90JykgYXMgRm9ybUFycmF5O1xuICAgIH1cblxuICAgIGFkZEh1YnNwb3RJdGVtKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbnRhY3RVc0h1YnNwb3RJdGVtcy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICAgICAgaWQ6IFsnJ10sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IFsnJ10sXG4gICAgICAgICAgICAgICAgZGl2OiBbJyddXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJlbW92ZUh1YnNwb3RJdGVtKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb250YWN0VXNIdWJzcG90SXRlbXMucmVtb3ZlQXQoaW5kZXgpO1xuICAgIH1cblxuICAgIG9wZW5QYXJ0bmVySW1hZ2VDcm9wcGVyKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFBhcnRuZXJJbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMucGFydG5lckNyb3BwZXIsIHtcbiAgICAgICAgICAgIGNlbnRlcmVkOiB0cnVlLFxuICAgICAgICAgICAgd2luZG93Q2xhc3M6ICdtb2RhbC1ob2xkZXInXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFkZFBhcnRuZXJJdGVtKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZm9ybS5nZXQoJ3BhcnRuZXJzJyk/LmdldCgnaXRlbXMnKSBhcyBGb3JtQXJyYXk7XG4gICAgICAgIGl0ZW1zLnB1c2goXG4gICAgICAgICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBbJyddLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBbJyddLFxuICAgICAgICAgICAgICAgIGJsb2dfdXJsOiBbJyddLFxuICAgICAgICAgICAgICAgIGltYWdlX3VybDogWycnXSxcbiAgICAgICAgICAgICAgICB2aWRlb191cmw6IFsnJ11cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmVtb3ZlUGFydG5lckl0ZW0oaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZm9ybS5nZXQoJ3BhcnRuZXJzJyk/LmdldCgnaXRlbXMnKSBhcyBGb3JtQXJyYXk7XG4gICAgICAgIGl0ZW1zLnJlbW92ZUF0KGluZGV4KTtcbiAgICB9XG5cbiAgICBnZXQgdXNwc0l0ZW1zKCk6IEZvcm1BcnJheSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KCd1c3BzJykuZ2V0KCdpdGVtcycpIGFzIEZvcm1BcnJheTtcbiAgICB9XG5cbiAgICBhZGRVc3BJdGVtKCkge1xuICAgICAgICB0aGlzLnVzcHNJdGVtcy5wdXNoKHRoaXMuZmIuZ3JvdXAoeyBkZXNjcmlwdGlvbjogWycnXSB9KSk7XG4gICAgfVxuXG4gICAgcmVtb3ZlVXNwSXRlbShpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMudXNwc0l0ZW1zLnJlbW92ZUF0KGluZGV4KTtcbiAgICB9XG5cbiAgICBnZXQgdmlkZW9zKCk6IEZvcm1Hcm91cCB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KCd2aWRlb3MnKSBhcyBGb3JtR3JvdXA7XG4gICAgfVxuXG4gICAgZ2V0IHZpZGVvc0l0ZW1zKCk6IEZvcm1BcnJheSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZGVvcy5nZXQoJ2l0ZW1zJykgYXMgRm9ybUFycmF5O1xuICAgIH1cblxuICAgIGFkZFZpZGVvSXRlbSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52aWRlb3NJdGVtcy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICAgICAgdGl0bGU6IFsnJ10sXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFsnJ10sXG4gICAgICAgICAgICAgICAgYmxvZ191cmw6IFsnJ10sXG4gICAgICAgICAgICAgICAgaW1hZ2VfdXJsOiBbJyddLFxuICAgICAgICAgICAgICAgIHZpZGVvX3VybDogWycnXVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZW1vdmVWaWRlb0l0ZW0oaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnZpZGVvc0l0ZW1zLnJlbW92ZUF0KGluZGV4KTtcbiAgICB9XG5cbiAgICBhZGRUZXN0aW1vbmlhbEl0ZW0oKTogdm9pZCB7XG4gICAgICAgIHRoaXMudGVzdGltb25pYWxzSXRlbXMucHVzaChcbiAgICAgICAgICAgIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgICAgIHRlc3RpbW9uaWFsOiBbJyddLFxuICAgICAgICAgICAgICAgIG5hbWU6IFsnJ10sXG4gICAgICAgICAgICAgICAgYmxvZ191cmw6IFsnJ10sXG4gICAgICAgICAgICAgICAgaW1hZ2VfdXJsOiBbJyddLFxuICAgICAgICAgICAgICAgIHZpZGVvX3VybDogWycnXVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZW1vdmVUZXN0aW1vbmlhbEl0ZW0oaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnRlc3RpbW9uaWFsc0l0ZW1zLnJlbW92ZUF0KGluZGV4KTtcbiAgICB9XG5cbiAgICBnZXQgaGVhZGVyU3ViSGVhZGluZ3MoKTogRm9ybUFycmF5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoJ2hlYWRlcicpLmdldCgnc3ViX2hlYWRpbmdzJykgYXMgRm9ybUFycmF5O1xuICAgIH1cblxuICAgIGFkZEhlYWRlclN1YkhlYWRpbmcoKSB7XG4gICAgICAgIHRoaXMuaGVhZGVyU3ViSGVhZGluZ3MucHVzaCh0aGlzLmZiLmdyb3VwKHsgZGVzY3JpcHRpb246IFsnJ10gfSkpO1xuICAgIH1cblxuICAgIHJlbW92ZUhlYWRlclN1YkhlYWRpbmcoaW5kZXg6IG51bWJlcikge1xuICAgICAgICB0aGlzLmhlYWRlclN1YkhlYWRpbmdzLnJlbW92ZUF0KGluZGV4KTtcbiAgICB9XG5cbiAgICBnZXQgcGFydG5lcnNJdGVtcygpOiBGb3JtQXJyYXkge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgncGFydG5lcnMnKT8uZ2V0KCdpdGVtcycpIGFzIEZvcm1BcnJheTtcbiAgICB9XG5cbiAgICBhZGRQYXJ0bmVySW1hZ2UoKSB7XG4gICAgICAgIHRoaXMucGFydG5lcnNJdGVtcy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICAgICAgaW1hZ2VfdXJsOiBbJyddXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJlbW92ZVBhcnRuZXJJbWFnZShpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMucGFydG5lcnNJdGVtcy5yZW1vdmVBdChpbmRleCk7XG4gICAgfVxuXG4gICAgZ2V0QWxsT3B0aW9ucygpIHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgICBmb3JrSm9pbih7XG4gICAgICAgICAgICBvcHRpb25zOiB0aGlzLmFkbWluU2VydmljZS5nZXRBdmFpbGFibGVEb21haW5PcHRpb25zKHRoaXMuc3Vic2NyaXB0aW9uSWQpLFxuICAgICAgICAgICAgZ2V0UHJvZHVjdDogdGhpcy5wcm9kdWN0U2VydmljZS5nZXRQcm9kdWN0TGlzdCh7fSwgdGhpcy5zdWJzY3JpcHRpb25JZCksXG4gICAgICAgICAgICBjb25maWc6IHRoaXMuYWRtaW5TZXJ2aWNlLmdldERvbWFpbkNvbmZpZ0J5SWQoXG4gICAgICAgICAgICAgICAgSGVscGVyU2VydmljZS5lZmZlY3RpdmVDb25maWdJZCh0aGlzLmR1cGxpY2F0ZUNvbmZpZ0lkLCB0aGlzLmlkKSxcbiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbklkXG4gICAgICAgICAgICApXG4gICAgICAgIH0pXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgLy8gb3B0aW9uc1xuICAgICAgICAgICAgICAgIHRoaXMubWFzdGVyU3Vic2NyaXB0aW9uUHJvZHVjdExpc3QgPSBbXG4gICAgICAgICAgICAgICAgICAgIHsgaWQ6IG51bGwsIG5hbWU6ICdTZWxlY3QgTWFzdGVyIFByb2R1Y3QnIH0sXG4gICAgICAgICAgICAgICAgICAgIC4uLihyZXM/Lm9wdGlvbnM/Lm1hc3Rlcl9zdWJzY3JpcHRpb24/LnByb2R1Y3RzID8/IFtdKVxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICB0aGlzLm1hc3RlclN1YnNjcmlwdGlvbnNMaXN0ID0gW1xuICAgICAgICAgICAgICAgICAgICB7IGxhYmVsOiAnU2VsZWN0IE1hc3RlciBTdWJzY3JpcHRpb24nLCB2YWx1ZTogbnVsbCB9LFxuICAgICAgICAgICAgICAgICAgICAuLi4ocmVzPy5vcHRpb25zPy5tYXN0ZXJfc3Vic2NyaXB0aW9uPy5zdWJzY3JpcHRpb25zID8/IFtdKS5tYXAoc3ViID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogc3ViLm9yZ2FuaXNhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYCR7c3ViLm9yZ2FuaXNhdGlvbn0gLSAke3N1Yi5jb250YWN0X25hbWV9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3ViLmNvbnRhY3RfbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzdWIuaWRcbiAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvblRvc0xpc3QgPSBbXG4gICAgICAgICAgICAgICAgICAgIHsgaWQ6IG51bGwsIHRpdGxlOiAnU2VsZWN0IE1haW4gVE9TJyB9LFxuICAgICAgICAgICAgICAgICAgICAuLi4ocmVzPy5vcHRpb25zPy5tYXN0ZXJfc3Vic2NyaXB0aW9uPy5zdWJzY3JpcHRpb25fdG9zID8/IFtdKVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgdGhpcy5jcm1TdWJzY3JpcHRpb25zTGlzdCA9IFtcbiAgICAgICAgICAgICAgICAgICAgeyBpZDogbnVsbCwgb3JnYW5pc2F0aW9uOiBudWxsLCBjb250YWN0X25hbWU6ICdTZWxlY3QgQ1JNIFN1YnNjcmlwdGlvbicgfSxcbiAgICAgICAgICAgICAgICAgICAgLi4uKHJlcz8ub3B0aW9ucz8ubWFzdGVyX2NybT8uc3Vic2NyaXB0aW9ucyA/PyBbXSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIHRoaXMuY3JtU291cmNlc0xpc3QgPSBbXG4gICAgICAgICAgICAgICAgICAgIHsgaWQ6IG51bGwsIG5hbWU6ICdTZWxlY3QgQ1JNIFNvdXJjZScgfSxcbiAgICAgICAgICAgICAgICAgICAgLi4uKHJlcz8ub3B0aW9ucz8ubWFzdGVyX2NybT8uc291cmNlcyA/PyBbXSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIHRoaXMuY3JtUHJvZHVjdExpc3QgPSBbXG4gICAgICAgICAgICAgICAgICAgIHsgaWQ6IG51bGwsIG5hbWU6ICdTZWxlY3QgQ1JNIFByb2R1Y3QnLCBzdWJzY3JpcHRpb25faWQ6IG51bGwgfSxcbiAgICAgICAgICAgICAgICAgICAgLi4uKHJlcz8ub3B0aW9ucz8ubWFzdGVyX2NybT8ucHJvZHVjdHMgPz8gW10pXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAvLyBlbmQgb3B0aW9uc1xuICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHNMaXN0ID0gdGhpcy5ncm91cFByb2R1Y3RzKHJlcz8uZ2V0UHJvZHVjdD8ucHJvZHVjdHMpO1xuICAgICAgICAgICAgICAgIC8vIGNvbmZpZyB0byBwYXRjaCB2YWx1ZXNcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSByZXMuY29uZmlnO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlbW8gPSB0aGlzLmRhdGEuYm9va19kZW1vO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlbW9Hcm91cCA9IHRoaXMuZm9ybS5nZXQoJ2Jvb2tfZGVtbycpIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtc0FycmF5ID0gZGVtb0dyb3VwLmdldCgnaXRlbXMnKSBhcyBGb3JtQXJyYXk7XG5cbiAgICAgICAgICAgICAgICBkZW1vR3JvdXAucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBkZW1vPy50aXRsZSA/PyAnJyxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGRlbW8/LmRlc2NyaXB0aW9uID8/ICcnXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB1c3BzR3JvdXAgPSB0aGlzLmZvcm0uZ2V0KCd1c3BzJykgYXMgRm9ybUdyb3VwO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVzcEl0ZW1zQXJyYXkgPSB1c3BzR3JvdXAuZ2V0KCdpdGVtcycpIGFzIEZvcm1BcnJheTtcblxuICAgICAgICAgICAgICAgIHVzcHNHcm91cC5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHJlcy5jb25maWc/LnVzcHM/LnRpdGxlID8/ICcnLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogcmVzLmNvbmZpZz8udXNwcz8uZGVzY3JpcHRpb24gPz8gJydcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHVzcEl0ZW1zQXJyYXkuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICAocmVzLmNvbmZpZz8udXNwcz8uaXRlbXMgPz8gW10pLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHVzcEl0ZW1zQXJyYXkucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBbaXRlbS5kZXNjcmlwdGlvbiA/PyAnJ11cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJHcm91cCA9IHRoaXMuZm9ybS5nZXQoJ2hlYWRlcicpIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJIZWFkaW5nc0FycmF5ID0gaGVhZGVyR3JvdXAuZ2V0KCdzdWJfaGVhZGluZ3MnKSBhcyBGb3JtQXJyYXk7XG5cbiAgICAgICAgICAgICAgICBoZWFkZXJHcm91cC5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGxpbmU6IHJlcy5jb25maWc/LmhlYWRlcj8uaGVhZGxpbmUgPz8gJycsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiByZXMuY29uZmlnPy5oZWFkZXI/LmRlc2NyaXB0aW9uID8/ICcnLFxuICAgICAgICAgICAgICAgICAgICB2aWRlb191cmw6IHJlcy5jb25maWc/LmhlYWRlcj8udmlkZW9fdXJsID8/ICcnLFxuICAgICAgICAgICAgICAgICAgICBiZ19pbWFnZV91cmw6IHJlcy5jb25maWc/LmhlYWRlcj8uYmdfaW1hZ2VfdXJsID8/ICcnXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBzdWJIZWFkaW5nc0FycmF5LmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgKHJlcy5jb25maWc/LmhlYWRlcj8uc3ViX2hlYWRpbmdzID8/IFtdKS5mb3JFYWNoKHNoID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3ViSGVhZGluZ3NBcnJheS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFtzaC5kZXNjcmlwdGlvbiA/PyAnJ11cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0ZXN0aW1vbmlhbHNHcm91cCA9IHRoaXMuZm9ybS5nZXQoJ3Rlc3RpbW9uaWFscycpIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXN0aW1vbmlhbEl0ZW1zID0gdGVzdGltb25pYWxzR3JvdXAuZ2V0KCdpdGVtcycpIGFzIEZvcm1BcnJheTtcblxuICAgICAgICAgICAgICAgIHRlc3RpbW9uaWFsc0dyb3VwLnBhdGNoVmFsdWUoe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogcmVzLmNvbmZpZz8udGVzdGltb25pYWxzPy50aXRsZSA/PyAnJyxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHJlcy5jb25maWc/LnRlc3RpbW9uaWFscz8uZGVzY3JpcHRpb24gPz8gJydcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRlc3RpbW9uaWFsSXRlbXMuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICAocmVzLmNvbmZpZz8udGVzdGltb25pYWxzPy5pdGVtcyA/PyBbXSkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdGltb25pYWxJdGVtcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGltb25pYWw6IFtpdGVtPy50ZXN0aW1vbmlhbCA/PyAnJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogW2l0ZW0/Lm5hbWUgPz8gJyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2dfdXJsOiBbaXRlbT8uYmxvZ191cmwgPz8gJyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3VybDogW2l0ZW0/LmltYWdlX3VybCA/PyAnJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9fdXJsOiBbaXRlbT8udmlkZW9fdXJsID8/ICcnXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGN0YXNHcm91cCA9IHRoaXMuZm9ybS5nZXQoJ2N0YXMnKSBhcyBGb3JtR3JvdXA7XG4gICAgICAgICAgICAgICAgY29uc3QgY3Rhc0l0ZW1zID0gY3Rhc0dyb3VwLmdldCgnaXRlbXMnKSBhcyBGb3JtQXJyYXk7XG5cbiAgICAgICAgICAgICAgICBjdGFzR3JvdXAucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiByZXMuY29uZmlnPy5jdGFzPy50aXRsZSA/PyAnJyxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHJlcy5jb25maWc/LmN0YXM/LmRlc2NyaXB0aW9uID8/ICcnLFxuICAgICAgICAgICAgICAgICAgICBidXR0b25fdGV4dDogcmVzLmNvbmZpZz8uY3Rhcz8uYnV0dG9uX3RleHQgPz8gJycsXG4gICAgICAgICAgICAgICAgICAgIGltYWdlX3VybDogcmVzLmNvbmZpZz8uY3Rhcz8uaW1hZ2VfdXJsID8/ICcnXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjdGFzSXRlbXMuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICAocmVzLmNvbmZpZz8uY3Rhcz8uaXRlbXMgPz8gW10pLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGN0YXNJdGVtcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFtpdGVtPy50aXRsZSA/PyAnJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFtpdGVtPy5kZXNjcmlwdGlvbiA/PyAnJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uX3RleHQ6IFtpdGVtPy5idXR0b25fdGV4dCA/PyAnJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfdXJsOiBbaXRlbT8uaW1hZ2VfdXJsID8/ICcnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGFfdXJsOiBbaXRlbT8uY3RhX3VybCA/PyAnJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9fdXJsOiBbaXRlbT8udmlkZW9fdXJsID8/ICcnXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGd1aWRlc0dyb3VwID0gdGhpcy5mb3JtLmdldCgnZ3VpZGVzJykgYXMgRm9ybUdyb3VwO1xuICAgICAgICAgICAgICAgIGNvbnN0IGd1aWRlc0l0ZW1zID0gZ3VpZGVzR3JvdXAuZ2V0KCdpdGVtcycpIGFzIEZvcm1BcnJheTtcblxuICAgICAgICAgICAgICAgIGd1aWRlc0l0ZW1zLmNsZWFyKCk7XG5cbiAgICAgICAgICAgICAgICAocmVzLmNvbmZpZz8uZ3VpZGVzPy5pdGVtcyA/PyBbXSkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZ3VpZGVzSXRlbXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBbaXRlbT8udGl0bGUgPz8gJyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBbaXRlbT8uZGVzY3JpcHRpb24gPz8gJyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbl90ZXh0OiBbaXRlbT8uYnV0dG9uX3RleHQgPz8gJyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3VybDogW2l0ZW0/LmltYWdlX3VybCA/PyAnJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGVfdXJsOiBbaXRlbT8uZ3VpZGVfdXJsID8/ICcnXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRuZXJzR3JvdXAgPSB0aGlzLmZvcm0uZ2V0KCdwYXJ0bmVycycpIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0bmVyc0l0ZW1zID0gcGFydG5lcnNHcm91cC5nZXQoJ2l0ZW1zJykgYXMgRm9ybUFycmF5O1xuXG4gICAgICAgICAgICAgICAgcGFydG5lcnNHcm91cC5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGF0YT8ucGFydG5lcnM/LmRlc2NyaXB0aW9uID8/ICcnXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBwYXJ0bmVyc0l0ZW1zLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgKHRoaXMuZGF0YT8ucGFydG5lcnM/Lml0ZW1zID8/IFtdKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBwYXJ0bmVyc0l0ZW1zLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV91cmw6IFtpdGVtPy5pbWFnZV91cmwgPz8gJyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFtpdGVtPy5uYW1lID8/ICcnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogW2l0ZW0/LmRlc2NyaXB0aW9uID8/ICcnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9nX3VybDogW2l0ZW0/LmJsb2dfdXJsID8/ICcnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb191cmw6IFtpdGVtPy52aWRlb191cmwgPz8gJyddXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaXRlbXNBcnJheS5jbGVhcigpO1xuICAgICAgICAgICAgICAgIChkZW1vPy5pdGVtcyA/PyBbXSkuZm9yRWFjaChsaW5rID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbXNBcnJheS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFtsaW5rLnRpdGxlID8/ICcnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IFtsaW5rLnVybCA/PyAnJ11cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjb250YWN0VXNHcm91cCA9IHRoaXMuZm9ybS5nZXQoJ2NvbnRhY3RfdXMnKSBhcyBGb3JtR3JvdXA7XG4gICAgICAgICAgICAgICAgY29uc3QgcXVlc3Rpb25zQXJyYXkgPSBjb250YWN0VXNHcm91cC5nZXQoJ3F1ZXN0aW9ucycpIGFzIEZvcm1BcnJheTtcbiAgICAgICAgICAgICAgICBjb25zdCBodWJzcG90QXJyYXkgPSBjb250YWN0VXNHcm91cC5nZXQoJ2h1YnNwb3QnKSBhcyBGb3JtQXJyYXk7XG4gICAgICAgICAgICAgICAgY29udGFjdFVzR3JvdXAucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiByZXMuY29uZmlnPy5jb250YWN0X3VzPy5kZXNjcmlwdGlvbiA/PyAnJ1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgcXVlc3Rpb25zQXJyYXkuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICBodWJzcG90QXJyYXkuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICAocmVzLmNvbmZpZz8uY29udGFjdF91cz8ucXVlc3Rpb25zID8/IFtdKS5mb3JFYWNoKHEgPT4ge1xuICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbnNBcnJheS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb246IFtxPy5xdWVzdGlvbiA/PyAnJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5mYi5hcnJheShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHE/Lm9wdGlvbnMgPz8gW10pLm1hcChvID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb246IFtvPy5vcHRpb24gPz8gJyddXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIChyZXMuY29uZmlnPy5jb250YWN0X3VzPy5odWJzcG90ID8/IFtdKS5mb3JFYWNoKGggPT4ge1xuICAgICAgICAgICAgICAgICAgICBodWJzcG90QXJyYXkucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBbaD8uaWQgPz8gJyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBbaD8ucG9zaXRpb24gPz8gJyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdjogW2g/LmRpdiA/PyAnJ11cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB2aWRlb3NHcm91cCA9IHRoaXMuZm9ybS5nZXQoJ3ZpZGVvcycpIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgICAgICAgICBjb25zdCB2aWRlb3NJdGVtcyA9IHZpZGVvc0dyb3VwLmdldCgnaXRlbXMnKSBhcyBGb3JtQXJyYXk7XG5cbiAgICAgICAgICAgICAgICB2aWRlb3NHcm91cC5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHJlcy5jb25maWc/LnZpZGVvcz8udGl0bGUgPz8gJycsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiByZXMuY29uZmlnPy52aWRlb3M/LmRlc2NyaXB0aW9uID8/ICcnXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB2aWRlb3NJdGVtcy5jbGVhcigpO1xuICAgICAgICAgICAgICAgIChyZXMuY29uZmlnPy52aWRlb3M/Lml0ZW1zID8/IFtdKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICB2aWRlb3NJdGVtcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFtpdGVtPy50aXRsZSA/PyAnJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFtpdGVtPy5kZXNjcmlwdGlvbiA/PyAnJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvZ191cmw6IFtpdGVtPy5ibG9nX3VybCA/PyAnJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfdXJsOiBbaXRlbT8uaW1hZ2VfdXJsID8/ICcnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb191cmw6IFtpdGVtPy52aWRlb191cmwgPz8gJyddXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaW50ZWdyYXRpb25zR3JvdXAgPSB0aGlzLmZvcm0uZ2V0KCdpbnRlZ3JhdGlvbnMnKSBhcyBGb3JtR3JvdXA7XG4gICAgICAgICAgICAgICAgY29uc3QgaW50ZWdyYXRpb25zSXRlbXMgPSBpbnRlZ3JhdGlvbnNHcm91cC5nZXQoJ2l0ZW1zJykgYXMgRm9ybUFycmF5O1xuXG4gICAgICAgICAgICAgICAgaW50ZWdyYXRpb25zR3JvdXAucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiByZXMuY29uZmlnPy5pbnRlZ3JhdGlvbnM/LnRpdGxlID8/ICcnLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogcmVzLmNvbmZpZz8uaW50ZWdyYXRpb25zPy5kZXNjcmlwdGlvbiA/PyAnJ1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaW50ZWdyYXRpb25zSXRlbXMuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICAocmVzLmNvbmZpZz8uaW50ZWdyYXRpb25zPy5pdGVtcyA/PyBbXSkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaW50ZWdyYXRpb25zSXRlbXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBbaXRlbT8udGl0bGUgPz8gJyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBbaXRlbT8uZGVzY3JpcHRpb24gPz8gJyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2dfdXJsOiBbaXRlbT8uYmxvZ191cmwgPz8gJyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3VybDogW2l0ZW0/LmltYWdlX3VybCA/PyAnJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9fdXJsOiBbaXRlbT8udmlkZW9fdXJsID8/ICcnXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc2hhcmRVcmwgPSByZXM/LmNvbmZpZz8uc2hhcmRfdXJsO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHRoaXMuZGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICAgICAgICAgICAgICBjc19wcm9kdWN0X2lkOiB0aGlzLnByb2R1Y3RzTGlzdC5maW5kKHggPT4geC5pZCA9PT0gdGhpcy5kYXRhPy5jc19wcm9kdWN0X2lkKSxcbiAgICAgICAgICAgICAgICAgICAgdHJpYWxfcHJvZHVjdF9pZDogdGhpcy5wcm9kdWN0c0xpc3QuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgIHggPT4geC5pZCA9PT0gdGhpcy5kYXRhPy50cmlhbF9wcm9kdWN0X2lkXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5hdmJhckdyb3VwID0gdGhpcy5mb3JtLmdldCgnbmF2YmFyJykgYXMgRm9ybUdyb3VwO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hdmJhckl0ZW1zID0gbmF2YmFyR3JvdXAuZ2V0KCdpdGVtcycpIGFzIEZvcm1BcnJheTtcbiAgICAgICAgICAgICAgICBuYXZiYXJJdGVtcy5jbGVhcigpO1xuXG4gICAgICAgICAgICAgICAgKHJlcy5jb25maWc/Lm5hdmJhcj8uaXRlbXMgPz8gW10pLmZvckVhY2gobmF2ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbmF2YmFySXRlbXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBbbmF2LnRpdGxlID8/ICcnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBbbmF2LnBhdGggPz8gJyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlczogdGhpcy5mYi5hcnJheShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hdi5zdWJ0aXRsZXMgPz8gW10pLm1hcChzdWIgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBbc3ViLnRpdGxlID8/ICcnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBbc3ViLnBhdGggPz8gJyddXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGZvb3RlckxpbmtzR3JvdXAgPSB0aGlzLmZvcm0uZ2V0KCdmb290ZXJfbGlua3MnKSBhcyBGb3JtR3JvdXA7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9vdGVyTGlua3NJdGVtcyA9IGZvb3RlckxpbmtzR3JvdXAuZ2V0KCdpdGVtcycpIGFzIEZvcm1BcnJheTtcblxuICAgICAgICAgICAgICAgIGZvb3RlckxpbmtzSXRlbXMuY2xlYXIoKTtcblxuICAgICAgICAgICAgICAgIChyZXMuY29uZmlnPy5mb290ZXJfbGlua3M/Lml0ZW1zID8/IFtdKS5mb3JFYWNoKGxpbmsgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb290ZXJMaW5rc0l0ZW1zLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogW2xpbms/LnRpdGxlID8/ICcnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBbbGluaz8ucGF0aCA/PyAnJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGVzOiB0aGlzLmZiLmFycmF5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGluaz8uc3VidGl0bGVzID8/IFtdKS5tYXAoc3ViID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogW3N1Yj8udGl0bGUgPz8gJyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IFtzdWI/LnBhdGggPz8gJyddXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChyZXM/LmNvbmZpZz8uY3NfY3RhX2lmcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjc19jdGFfaWZyYW1lOiBKU09OLnBhcnNlKHJlcz8uY29uZmlnPy5jc19jdGFfaWZyYW1lKVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlcz8uY29uZmlnPy50cmlhbF9jdGFfaWZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWFsX2N0YV9pZnJhbWU6IEpTT04ucGFyc2UocmVzPy5jb25maWc/LnRyaWFsX2N0YV9pZnJhbWUpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGFiVGVzdHNBcnJheSA9IHRoaXMuYWJUZXN0cztcbiAgICAgICAgICAgICAgICBhYlRlc3RzQXJyYXkuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXMuY29uZmlnPy5hYl90ZXN0cykpIHtcbiAgICAgICAgICAgICAgICAgICAgKHJlcy5jb25maWc/LmFiX3Rlc3RzID8/IFtdKS5mb3JFYWNoKHRlc3QgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWJUZXN0c0FycmF5LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBbdGVzdD8uZGVzY3JpcHRpb24gPz8gJyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlcmltZW50X25hbWU6IFt0ZXN0Py5leHBlcmltZW50X25hbWUgPz8gJyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYl9zaGFyZDogW3Rlc3Q/LmRiX3NoYXJkID8/ICcnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljcm9zZXJ2aWNlX25hbWU6IFt0ZXN0Py5taWNyb3NlcnZpY2VfbmFtZSA/PyAnJ11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hZGQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMudXBsb2FkZXIuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGlsZExpc3QgPSB0aGlzLnVwbG9hZGVyLnRvQXJyYXkoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0IGYoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uY29udHJvbHM7XG4gICAgfVxuXG4gICAgcHVibGljIHNvcnRPYmoob2JqKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuICAgICAgICAgICAgLnJlZHVjZSgocmVzdWx0LCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IG9ialtrZXldO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgfVxuXG4gICAgc2VhcmNoUHJvZHVjdChldmVudCkge1xuICAgICAgICB0aGlzLnByb2R1Y3RTZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0UHJvZHVjdExpc3QoeyBzZWFyY2g6IGV2ZW50Py5xdWVyeSA/PyAnJyB9LCB0aGlzLnN1YnNjcmlwdGlvbklkKVxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0c0xpc3QgPSB0aGlzLmdyb3VwUHJvZHVjdHMocmVzcG9uc2UucHJvZHVjdHMpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBncm91cFByb2R1Y3RzKHByb2R1Y3RzKSB7XG4gICAgICAgIGlmIChwcm9kdWN0cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBwcm9kdWN0cyA9IHByb2R1Y3RzLmZpbHRlcih4ID0+IHguZGVwZW5kZW5jeV9wcm9kdWN0cz8ubGVuZ3RoIDwgMSAmJiB4LmFjdGl2ZSk7XG4gICAgICAgICAgICBwcm9kdWN0cyA9IGdyb3VwQnkocHJvZHVjdHMsICdjdXJyZW5jeScpO1xuICAgICAgICAgICAgcHJvZHVjdHMgPSB0aGlzLnNvcnRPYmoocHJvZHVjdHMpO1xuICAgICAgICAgICAgbGV0IGdyb3VwZWRBcnJheSA9IFtdO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHAgaW4gcHJvZHVjdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocCBpbiBwcm9kdWN0cykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHByb2R1Y3RzW3BdLnNvcnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAoYSwgYikgPT4gTnVtYmVyKGIucHJpY2VfcGVyX3VuaXQpIC0gTnVtYmVyKGEucHJpY2VfcGVyX3VuaXQpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwZWRBcnJheS5wdXNoKC4uLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdyb3VwZWRBcnJheSA9IGdyb3VwZWRBcnJheS5tYXAoeCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHguaWQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGAke3gubmFtZX0gfCAke3gucmVnaW9ufSB8ICR7eC5iaWxsaW5nX2ZyZXF1ZW5jeX0gfCAke3gubWluX3VuaXRzfSB4ICR7KFxuICAgICAgICAgICAgICAgICAgICAgICAgeC5wcmljZV9wZXJfdW5pdCAvIDEwMFxuICAgICAgICAgICAgICAgICAgICApLnRvRml4ZWQoMil9IHwgJHt4LmN1cnJlbmN5fWBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBncm91cGVkQXJyYXk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgb25TYXZlRmlsZShldmVudCkge1xuICAgICAgICBjb25zdCBpdGVtOiBDdXN0b21VcGxvYWRlckNvbXBvbmVudCA9IHRoaXMuY2hpbGRMaXN0LmZpbmQoXG4gICAgICAgICAgICB4ID0+IHguY29udHJvbE5hbWUgPT09IGV2ZW50Lm5hbWVcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHsgc3Vic2NyaXB0aW9uX2lkOiB0aGlzLnN1YnNjcmlwdGlvbklkIH07XG4gICAgICAgIGlmIChldmVudC5maWxlKSB7XG4gICAgICAgICAgICBkYXRhW2V2ZW50Lm5hbWVdID0gZXZlbnQuZmlsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGFbYHJlbW92ZV8ke2V2ZW50Lm5hbWV9YF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgICBpZiAoa2V5IGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBkYXRhW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN1YiQgPSB0aGlzLmlkXG4gICAgICAgICAgICA/IHRoaXMuYWRtaW5TZXJ2aWNlLnVwZGF0ZURvbWFpbkNvbmZpZyh0aGlzLmlkLCBmb3JtRGF0YSlcbiAgICAgICAgICAgIDogdGhpcy5hZG1pblNlcnZpY2UuY3JlYXRlRG9tYWluQ29uZmlnKGZvcm1EYXRhKTtcblxuICAgICAgICBzdWIkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFkbWluU2VydmljZVxuICAgICAgICAgICAgICAgIC5nZXREb21haW5Db25maWdCeUlkKHRoaXMuaWQsIHRoaXMuc3Vic2NyaXB0aW9uSWQpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uY2xlYXJWYWx1ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhW2V2ZW50Lm5hbWVdID0gcmVzcG9uc2VbZXZlbnQubmFtZV07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pLmFkZCgoKSA9PiB7XG4gICAgICAgICAgICBpdGVtLmJ1dHRvbkJ1c3kgPSBmYWxzZTtcbiAgICAgICAgICAgIGl0ZW0ub25DbG9zZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBkcm9wRm9vdGVyU3VidGl0bGVzKGk6IG51bWJlciwgZXZlbnQ6IENka0RyYWdEcm9wPEZvcm1Hcm91cFtdPikge1xuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5nZXRGb290ZXJTdWJ0aXRsZXMoaSk7XG4gICAgICAgIG1vdmVJdGVtSW5BcnJheShjb250cm9sLmNvbnRyb2xzLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG5cbiAgICBkcm9wTmF2YmFyU3VidGl0bGVzKGk6IG51bWJlciwgZXZlbnQ6IENka0RyYWdEcm9wPEZvcm1Hcm91cFtdPikge1xuICAgICAgICBjb25zdCBzdWJ0aXRsZXMgPSB0aGlzLmdldE5hdmJhclN1YnRpdGxlcyhpKTtcbiAgICAgICAgbW92ZUl0ZW1JbkFycmF5KHN1YnRpdGxlcy5jb250cm9scywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcbiAgICAgICAgc3VidGl0bGVzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG5cbiAgICBkcm9wQm9va0RlbW9MaW5rcyhldmVudDogQ2RrRHJhZ0Ryb3A8Rm9ybUdyb3VwW10+KSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5mb3JtLmdldCgnYm9va19kZW1vJyk/LmdldCgnaXRlbXMnKSBhcyBGb3JtQXJyYXk7XG4gICAgICAgIG1vdmVJdGVtSW5BcnJheShpdGVtcy5jb250cm9scywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcbiAgICAgICAgaXRlbXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH1cblxuICAgIGRyb3BDb250YWN0VXNPcHRpb25zKHF1ZXN0aW9uSW5kZXg6IG51bWJlciwgZXZlbnQ6IENka0RyYWdEcm9wPEZvcm1Hcm91cFtdPikge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5nZXRRdWVzdGlvbk9wdGlvbnMocXVlc3Rpb25JbmRleCk7XG4gICAgICAgIG1vdmVJdGVtSW5BcnJheShvcHRpb25zLmNvbnRyb2xzLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuICAgICAgICBvcHRpb25zLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG5cbiAgICBkcm9wSXRlbXMoY29udHJvbDogRm9ybUFycmF5LCBldmVudDogQ2RrRHJhZ0Ryb3A8Rm9ybUdyb3VwW10+KSB7XG4gICAgICAgIG1vdmVJdGVtSW5BcnJheShjb250cm9sLmNvbnRyb2xzLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG5cbiAgICBAVmFsaWRhdGVGb3JtKCdmb3JtJylcbiAgICBvblNhdmUoKSB7XG4gICAgICAgIHRoaXMuc3VibWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5idXR0b25CdXN5ID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgIG1hc3Rlcl9zdWJzY3JpcHRpb25faWQ6IHRoaXMuYXBwQ29uZmlnPy5tYXN0ZXJfc3Vic2NyaXB0aW9uPy5zdWJzY3JpcHRpb25faWQsXG4gICAgICAgICAgICBzdWJzY3JpcHRpb25faWQ6IHRoaXMuc3Vic2NyaXB0aW9uSWQsXG4gICAgICAgICAgICAuLi50aGlzLmZvcm0udmFsdWVcbiAgICAgICAgfTtcbiAgICAgICAgZGF0YS5jc19wcm9kdWN0X2lkID0gdGhpcy5mb3JtLmdldCgnY3NfcHJvZHVjdF9pZCcpLnZhbHVlPy5pZCA/PyBudWxsO1xuICAgICAgICBkYXRhLnRyaWFsX3Byb2R1Y3RfaWQgPSB0aGlzLmZvcm0uZ2V0KCd0cmlhbF9wcm9kdWN0X2lkJykudmFsdWU/LmlkID8/IG51bGw7XG4gICAgICAgIGRhdGFbJ2NzX2N0YV9pZnJhbWUnXSA9IHRoaXMuZm9ybS52YWx1ZT8uY3NfY3RhX2lmcmFtZSA/PyAnJztcbiAgICAgICAgZGF0YVsndHJpYWxfY3RhX2lmcmFtZSddID0gdGhpcy5mb3JtLnZhbHVlPy50cmlhbF9jdGFfaWZyYW1lID8/ICcnO1xuICAgICAgICBjb25zdCBzdWIkID0gdGhpcy5pZFxuICAgICAgICAgICAgPyB0aGlzLmFkbWluU2VydmljZS51cGRhdGVEb21haW5Db25maWcodGhpcy5pZCwgZGF0YSlcbiAgICAgICAgICAgIDogdGhpcy5hZG1pblNlcnZpY2UuY3JlYXRlRG9tYWluQ29uZmlnKGRhdGEpO1xuICAgICAgICBzdWIkLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zdWNjZXNzKHRoaXMudHJhbnNsYXRpb24udHJhbnNsYXRlKCdBZG1pbi5Eb21haW5Db25maWcuVXBkYXRlZE1lc3NhZ2UnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLmFkZCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdHRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5idXR0b25CdXN5ID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIjxoMz5QdWJsaWMgUGFnZXMgQ29uZmlndXJhdGlvbjwvaDM+XG48ZGl2IGNsYXNzPVwibWItNFwiPlxuICA8cD4gVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFuZCBzZXR0aW5ncyB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIHB1YmxpYyBwYWdlcyBvZiB0aGlzIGRvbWFpbi4gPC9wPlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwidy0xMDAgdGV4dC1jZW50ZXIgbXQtM1wiXG4gICpuZ0lmPVwiaXNMb2FkaW5nXCI+XG4gIDxwLXByb2dyZXNzU3Bpbm5lciBzdHJva2VXaWR0aD1cIjJcIj4gPC9wLXByb2dyZXNzU3Bpbm5lcj5cbjwvZGl2PlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0xvYWRpbmcgJiYgZGF0YT8uaG9zdF9uYW1lXCI+XG4gIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiXG4gICAgKG5nU3VibWl0KT1cIm9uU2F2ZSgpXCI+XG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tM1wiPlxuICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtsYWJlbF09XCInQWRtaW4uRG9tYWluQ29uZmlnLk1hc3RlclN1YnNjcmlwdGlvbicgfCB0cmFuc2xvY29cIlxuICAgICAgICAgIG5hbWU9XCJtYXN0ZXJfc3Vic2NyaXB0aW9uX2lkXCJcbiAgICAgICAgICBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Rvb2x0aXBUZXh0XT1cIidBZG1pbi5Eb21haW5Db25maWcuVG9vbHRpcC5NYXN0ZXJTdWJzY3JpcHRpb24nIHwgdHJhbnNsb2NvXCI+XG4gICAgICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgICBbb3B0aW9uc109XCJtYXN0ZXJTdWJzY3JpcHRpb25zTGlzdFwiXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibWFzdGVyX3N1YnNjcmlwdGlvbl9pZFwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWydtYXN0ZXJfc3Vic2NyaXB0aW9uX2lkJ10/LmVycm9ycyB9XCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBNYXN0ZXIgU3Vic2NyaXB0aW9uXCI+XG4gICAgICAgIDwvcC1kcm9wZG93bj5cbiAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLXNtLTNcIj5cbiAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbbGFiZWxdPVwiJ0FkbWluLkRvbWFpbkNvbmZpZy5NYXN0ZXJTdWJzY3JpcHRpb25Qcm9kdWN0JyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgW3Nob3dUb29sdGlwXT1cInRydWVcIlxuICAgICAgICAgIFt0b29sdGlwVGV4dF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICdBZG1pbi5Eb21haW5Db25maWcuVG9vbHRpcC5NYXN0ZXJTdWJzY3JpcHRpb25Qcm9kdWN0JyB8IHRyYW5zbG9jb1xuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgIG5hbWU9XCJtYXN0ZXJfc3Vic2NyaXB0aW9uX3Byb2R1Y3RfaWRcIj5cbiAgICAgICAgICA8cC1kcm9wZG93blxuICAgICAgICAgICAgW29wdGlvbnNdPVwibWFzdGVyU3Vic2NyaXB0aW9uUHJvZHVjdExpc3RcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibWFzdGVyX3N1YnNjcmlwdGlvbl9wcm9kdWN0X2lkXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWydtYXN0ZXJfc3Vic2NyaXB0aW9uX3Byb2R1Y3RfaWQnXT8uZXJyb3JzfVwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NlbGVjdCBNYXN0ZXIgUHJvZHVjdCdcIlxuICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJpZFwiXG4gICAgICAgICAgICBvcHRpb25MYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgIDwvcC1kcm9wZG93bj5cbiAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLXNtLTNcIj5cbiAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbbGFiZWxdPVwiJ0FkbWluLkRvbWFpbkNvbmZpZy5CbG9nRmVhdHVyZUtleScgfCB0cmFuc2xvY29cIlxuICAgICAgICAgIG5hbWU9XCJibG9nX2ZlYXR1cmVfa2V5XCJcbiAgICAgICAgICBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Rvb2x0aXBUZXh0XT1cIidBZG1pbi5Eb21haW5Db25maWcuVG9vbHRpcC5CbG9nRmVhdHVyZUtleScgfCB0cmFuc2xvY29cIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYmxvZ19mZWF0dXJlX2tleVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ2Jsb2dfZmVhdHVyZV9rZXknXS5lcnJvcnMgfVwiIC8+XG4gICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1zbS0zXCI+XG4gICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW2xhYmVsXT1cIidBZG1pbi5Eb21haW5Db25maWcuTWFpblRvcycgfCB0cmFuc2xvY29cIlxuICAgICAgICAgIG5hbWU9XCJtYWluX3Rvc19pZFwiXG4gICAgICAgICAgW3Nob3dUb29sdGlwXT1cInRydWVcIlxuICAgICAgICAgIFt0b29sdGlwVGV4dF09XCInQWRtaW4uRG9tYWluQ29uZmlnLlRvb2x0aXAuTWFpblRvcycgfCB0cmFuc2xvY29cIj5cbiAgICAgICAgICA8cC1kcm9wZG93blxuICAgICAgICAgIFtvcHRpb25zXT1cInN1YnNjcmlwdGlvblRvc0xpc3RcIlxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm1haW5fdG9zX2lkXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ21haW5fdG9zX2lkJ10/LmVycm9ycyB9XCJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NlbGVjdCBNYWluIFRPUydcIlxuICAgICAgICAgIG9wdGlvblZhbHVlPVwiaWRcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwic2VsZWN0ZWRJdGVtXCIgbGV0LWl0ZW0+XG4gICAgICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cIml0ZW0udGl0bGVcIj48L3NwYW4+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaXRlbVwiIGxldC1pdGVtPlxuICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJpdGVtLnRpdGxlXCI+PC9zcGFuPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvcC1kcm9wZG93bj5cblxuICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tM1wiPlxuICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtsYWJlbF09XCInQWRtaW4uRG9tYWluQ29uZmlnLkNybVN1YnNjcmlwdGlvbicgfCB0cmFuc2xvY29cIlxuICAgICAgICAgIG5hbWU9XCJjcm1fc3Vic2NyaXB0aW9uX2lkXCJcbiAgICAgICAgICBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Rvb2x0aXBUZXh0XT1cIidBZG1pbi5Eb21haW5Db25maWcuVG9vbHRpcC5Dcm1TdWJzY3JpcHRpb24nIHwgdHJhbnNsb2NvXCI+XG4gICAgICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgICAgIFtvcHRpb25zXT1cImNybVN1YnNjcmlwdGlvbnNMaXN0XCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNybV9zdWJzY3JpcHRpb25faWRcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWydjcm1fc3Vic2NyaXB0aW9uX2lkJ10/LmVycm9ycyB9XCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU2VsZWN0IENSTSBTdWJzY3JpcHRpb24nXCJcbiAgICAgICAgICAgIG9wdGlvblZhbHVlPVwiaWRcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJzZWxlY3RlZEl0ZW1cIiBsZXQtaXRlbT5cbiAgICAgICAgICAgICAge3tpdGVtPy5vcmdhbmlzYXRpb24gPyBpdGVtPy5vcmdhbmlzYXRpb24gKyAnIC0gJyArIGl0ZW0uY29udGFjdF9uYW1lIDogaXRlbT8uY29udGFjdF9uYW1lfX1cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaXRlbVwiIGxldC1pdGVtPlxuICAgICAgICAgICAgICB7e2l0ZW0/Lm9yZ2FuaXNhdGlvbiA/IGl0ZW0/Lm9yZ2FuaXNhdGlvbiArICcgLSAnICsgaXRlbS5jb250YWN0X25hbWUgOiBpdGVtPy5jb250YWN0X25hbWV9fVxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L3AtZHJvcGRvd24+XG5cbiAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLXNtLTNcIj5cbiAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbbGFiZWxdPVwiJ0FkbWluLkRvbWFpbkNvbmZpZy5Dcm1Qcm9kdWN0JyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgbmFtZT1cImNybV9wcm9kdWN0X2lkXCJcbiAgICAgICAgICBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Rvb2x0aXBUZXh0XT1cIidBZG1pbi5Eb21haW5Db25maWcuVG9vbHRpcC5Dcm1Qcm9kdWN0JyB8IHRyYW5zbG9jb1wiPlxuICAgICAgICAgIDxwLWRyb3Bkb3duXG4gICAgICAgICAgICBbb3B0aW9uc109XCJjcm1Qcm9kdWN0TGlzdFwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjcm1fcHJvZHVjdF9pZFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ2NybV9wcm9kdWN0X2lkJ10/LmVycm9ycyB9XCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU2VsZWN0IENSTSBQcm9kdWN0J1wiXG4gICAgICAgICAgICBvcHRpb25WYWx1ZT1cImlkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJzZWxlY3RlZEl0ZW1cIiBsZXQtaXRlbT5cbiAgICAgICAgICAgICAge3tpdGVtPy5zdWJzY3JpcHRpb25faWQgPyBpdGVtPy5uYW1lICArJyAtIFN1YnNjcmlwdGlvbklEID0gJysgaXRlbS5zdWJzY3JpcHRpb25faWQgOiBpdGVtPy5uYW1lfX1cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaXRlbVwiIGxldC1pdGVtPlxuICAgICAgICAgICAgICB7e2l0ZW0/LnN1YnNjcmlwdGlvbl9pZCA/IGl0ZW0/Lm5hbWUgICsnIC0gU3Vic2NyaXB0aW9uSUQgPSAnKyBpdGVtLnN1YnNjcmlwdGlvbl9pZCA6IGl0ZW0/Lm5hbWV9fVxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L3AtZHJvcGRvd24+XG4gICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1zbS0zXCI+XG4gICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW2xhYmVsXT1cIidBZG1pbi5Eb21haW5Db25maWcuQ3JtU291cmNlJyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgbmFtZT1cImNybV9zb3VyY2VfaWRcIlxuICAgICAgICAgIFtzaG93VG9vbHRpcF09XCJ0cnVlXCJcbiAgICAgICAgICBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLkRvbWFpbkNvbmZpZy5Ub29sdGlwLkNybVNvdXJjZScgfCB0cmFuc2xvY29cIj5cbiAgICAgICAgICA8cC1kcm9wZG93blxuICAgICAgICAgICAgW29wdGlvbnNdPVwiY3JtU291cmNlc0xpc3RcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY3JtX3NvdXJjZV9pZFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ2NybV9zb3VyY2VfaWQnXT8uZXJyb3JzIH1cIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWxlY3QgQ1JNIFNvdXJjZSdcIlxuICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJpZFwiXG4gICAgICAgICAgICBvcHRpb25MYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgIDwvcC1kcm9wZG93bj5cbiAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gY3JtIHN1YnNjcmlwdGlvbiBmaWVsZHMgZW5kLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1zbS0zXCI+XG4gICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW2xhYmVsXT1cIidBZG1pbi5Eb21haW5Db25maWcuQWN0aXZlJyB8IHRyYW5zbG9jb1wiIFtzaG93VG9vbHRpcF09XCJ0cnVlXCJcbiAgICAgICAgICBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLkRvbWFpbkNvbmZpZy5Ub29sdGlwLkFjdGl2ZScgfCB0cmFuc2xvY29cIiBuYW1lPVwiYWN0aXZlXCI+XG4gICAgICAgICAgPHVpLXN3aXRjaCBzaXplPVwic21hbGxcIiB1bmNoZWNrZWRMYWJlbD1cImZhbHNlXCIgY2hlY2tlZExhYmVsPVwidHJ1ZVwiIGZvcm1Db250cm9sTmFtZT1cImFjdGl2ZVwiIG5hbWU9XCJhY3RpdmVcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWydhY3RpdmUnXS5lcnJvcnMgfVwiPlxuICAgICAgICAgIDwvdWktc3dpdGNoPlxuICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tM1wiPlxuICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtsYWJlbF09XCInQWRtaW4uRG9tYWluQ29uZmlnLklzUHJvZHVjdERvbWFpbicgfCB0cmFuc2xvY29cIlxuICAgICAgICAgIFtzaG93VG9vbHRpcF09XCJ0cnVlXCJcbiAgICAgICAgICBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLkRvbWFpbkNvbmZpZy5Ub29sdGlwLklzUHJvZHVjdERvbWFpbicgfCB0cmFuc2xvY29cIlxuICAgICAgICAgIG5hbWU9XCJpc19wcm9kdWN0X2RvbWFpblwiPlxuICAgICAgICAgIDx1aS1zd2l0Y2ggc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgIHVuY2hlY2tlZExhYmVsPVwiZmFsc2VcIlxuICAgICAgICAgICAgY2hlY2tlZExhYmVsPVwidHJ1ZVwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJpc19wcm9kdWN0X2RvbWFpblwiXG4gICAgICAgICAgICBuYW1lPVwiaXNfcHJvZHVjdF9kb21haW5cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWydpc19wcm9kdWN0X2RvbWFpbiddLmVycm9ycyB9XCI+XG4gICAgICAgICAgPC91aS1zd2l0Y2g+XG4gICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1zbS0zXCI+XG4gICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW2xhYmVsXT1cIidBZG1pbi5Eb21haW5Db25maWcuQ2FuUmVnaXN0ZXJPbk1haW5QYWdlJyB8IHRyYW5zbG9jb1wiIFtzaG93VG9vbHRpcF09XCJ0cnVlXCJcbiAgICAgICAgICBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLkRvbWFpbkNvbmZpZy5Ub29sdGlwLkNhblJlZ2lzdGVyT25NYWluUGFnZScgfCB0cmFuc2xvY29cIlxuICAgICAgICAgIG5hbWU9XCJjYW5fcmVnaXN0ZXJfdGhyb3VnaF9tYWluX3BhZ2VcIj5cbiAgICAgICAgICA8dWktc3dpdGNoIHNpemU9XCJzbWFsbFwiIHVuY2hlY2tlZExhYmVsPVwiZmFsc2VcIiBjaGVja2VkTGFiZWw9XCJ0cnVlXCIgZm9ybUNvbnRyb2xOYW1lPVwiY2FuX3JlZ2lzdGVyX3Rocm91Z2hfbWFpbl9wYWdlXCJcbiAgICAgICAgICAgIG5hbWU9XCJjYW5fcmVnaXN0ZXJfdGhyb3VnaF9tYWluX3BhZ2VcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnY2FuX3JlZ2lzdGVyX3Rocm91Z2hfbWFpbl9wYWdlJ10uZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgPC91aS1zd2l0Y2g+XG4gICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1zbS0zXCI+XG4gICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW2xhYmVsXT1cIidBZG1pbi5Eb21haW5Db25maWcuU29jaWFsTG9naW5FbmFibGVkJyB8IHRyYW5zbG9jb1wiIFtzaG93VG9vbHRpcF09XCJ0cnVlXCJcbiAgICAgICAgICBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLkRvbWFpbkNvbmZpZy5Ub29sdGlwLlNvY2lhbExvZ2luRW5hYmxlJyB8IHRyYW5zbG9jb1wiIG5hbWU9XCJzb2NpYWxfbG9naW5fZW5hYmxlZFwiPlxuICAgICAgICAgIDx1aS1zd2l0Y2ggc2l6ZT1cInNtYWxsXCIgdW5jaGVja2VkTGFiZWw9XCJmYWxzZVwiIGNoZWNrZWRMYWJlbD1cInRydWVcIiBmb3JtQ29udHJvbE5hbWU9XCJzb2NpYWxfbG9naW5fZW5hYmxlZFwiXG4gICAgICAgICAgICBuYW1lPVwic29jaWFsX2xvZ2luX2VuYWJsZWRcIiBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ3NvY2lhbF9sb2dpbl9lbmFibGVkJ10uZXJyb3JzIH1cIj5cbiAgICAgICAgICA8L3VpLXN3aXRjaD5cbiAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLXNtLTNcIj5cbiAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbbGFiZWxdPVwiJ0FkbWluLkRvbWFpbkNvbmZpZy5Ob3RpZnlMb2dpbnMnIHwgdHJhbnNsb2NvXCIgW3Nob3dUb29sdGlwXT1cInRydWVcIlxuICAgICAgICAgIFt0b29sdGlwVGV4dF09XCInQWRtaW4uRG9tYWluQ29uZmlnLlRvb2x0aXAuTm90aWZ5TG9naW5zJyB8IHRyYW5zbG9jb1wiIG5hbWU9XCJub3RpZnlfbG9naW5zXCI+XG4gICAgICAgICAgPHVpLXN3aXRjaCBzaXplPVwic21hbGxcIiB1bmNoZWNrZWRMYWJlbD1cImZhbHNlXCIgY2hlY2tlZExhYmVsPVwidHJ1ZVwiIGZvcm1Db250cm9sTmFtZT1cIm5vdGlmeV9sb2dpbnNcIlxuICAgICAgICAgICAgbmFtZT1cIm5vdGlmeV9sb2dpbnNcIiBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ25vdGlmeV9sb2dpbnMnXS5lcnJvcnMgfVwiPlxuICAgICAgICAgIDwvdWktc3dpdGNoPlxuICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm15LTVcIj5cbiAgICAgIDxoMz5QcmUtQnVpbHQgUGFnZXMgQ29uZmlnIChSZXNvdXJjZXMsIExhbmRpbmcgUGFnZXMsIGV0Yyk8L2gzPlxuXG4gICAgICA8cC1hY2NvcmRpb24gY2xhc3M9XCJtdC01XCI+XG4gICAgICAgIDxwLWFjY29yZGlvblRhYiBbaGVhZGVyXT1cIidJbnN0cnVjdGlvbnMgLSBSRUFETUUgRklSU1QnXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgIDxwPldlJ3ZlIGJ1aWx0IGFuZCBtYWludGFpbiBhIGNvbGxlY3Rpb24gb2YgaGlnaC1jb252ZXJ0aW5nIGxhbmRpbmcgcGFnZXMgZGVzaWduZWQgdG8gaGVscCB5b3UgcXVpY2tseSBsYXVuY2ggcG9saXNoZWRcbiAgICAgICAgICAgICAgVUlzIGZvciBvbmJvYXJkaW5nIHVzZXJzLjwvcD5cbiAgICAgICAgICAgIDxwPjxzdHJvbmc+TmV3c2xldHRlciBTdWJzY3JpcHRpb24gUGFnZXM6PC9zdHJvbmc+PGJyPiBBZnRlciBjb25maWd1cmluZyB5b3VyIGRvbWFpbiwgeW91IGNhbiBhY2Nlc3MgcGFnZXMgbGlrZVxuICAgICAgICAgICAgICA8c3Ryb25nPi9qb2luL2NzMSwgL2pvaW4vY3MyLCAvam9pbi9jczMsIGV0Yy48L3N0cm9uZz4sIHNwZWNpZmljYWxseSBkZXNpZ25lZCBmb3IgbmV3c2xldHRlciBzaWduLXVwcy4gPGJyPlxuICAgICAgICAgICAgICBTdWJzY3JpYmVycyBmcm9tIHRoZXNlIHBhZ2VzIHdpbGwgYmUgbGlzdGVkIGluIHRoZSA8c3Ryb25nPlNtYXJ0Q1JNIG1vZHVsZTwvc3Ryb25nPi48L3A+XG4gICAgICAgICAgICA8cD48c3Ryb25nPlRyaWFsIFByb2R1Y3QgU2lnbi1VcCBQYWdlczo8L3N0cm9uZz48YnI+IEZvciB1c2VycyBpbnRlcmVzdGVkIGluIHRyaWFsIHByb2R1Y3RzLCB1dGlsaXplIHBhZ2VzIHN1Y2ggYXNcbiAgICAgICAgICAgICAgPHN0cm9uZz4vam9pbi90cmlhbDEsIC9qb2luL3RyaWFsMiwgL2pvaW4vdHJpYWwzLCBldGMuPC9zdHJvbmc+Ljxicj4gVXNlcnMgcmVnaXN0ZXJpbmcgdGhyb3VnaCB0aGVzZSBwYWdlcyB3aWxsXG4gICAgICAgICAgICAgIGFwcGVhciBpbiB0aGUgPHN0cm9uZz5BZG1pbiA+IFVzZXJzIHNlY3Rpb248L3N0cm9uZz4uPC9wPlxuICAgICAgICAgICAgPHA+T25jZSB5b3UndmUgc2VsZWN0ZWQgdGhlIGxhbmRpbmcgcGFnZSB5b3Ugd2FudCB0byB1c2UgPHN0cm9uZz4oZS5nLiwgL2pvaW4vdHJpYWwzKTwvc3Ryb25nPiwgbWFrZSBzdXJlIHRvIHVwZGF0ZVxuICAgICAgICAgICAgICB0aGUgPHN0cm9uZz5JbnRlcm5hbCBQYXRoPC9zdHJvbmc+IGluIHRoZSA8c3Ryb25nPkNvcmUgdGFiPC9zdHJvbmc+IGFjY29yZGluZ2x54oCUaS5lLiwgc2V0IGl0IHRvXG4gICAgICAgICAgICAgIDxzdHJvbmc+L2pvaW4vdHJpYWwzPC9zdHJvbmc+LjwvcD5cbiAgICAgICAgICAgIDxwPklmIHlvdSBuZWVkIGFzc2lzdGFuY2UgaW50ZWdyYXRpbmcgdGhlc2UgcGFnZXMgaW50byB5b3VyIHdvcmtmbG93IG9yIGhhdmUgZnVydGhlciBxdWVzdGlvbnMsIGZlZWwgZnJlZSB0byByZWFjaFxuICAgICAgICAgICAgICBvdXQuPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3AtYWNjb3JkaW9uVGFiPlxuXG4gICAgICAgIDxwLWFjY29yZGlvblRhYiBbaGVhZGVyXT1cIidTdWJzY3JpYmUgdG8gUHJvZHVjdC9OZXdzbGV0dGVyIENvbmZpZydcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgPHA+VHJpYWwgUGFnZXMgd2lsbCBlbmFibGUgdXNlcnMgdG8gc2lnbiB1cCB0byByZWFsIHByb2R1Y3RzIGFuZCBhcmUgYWNjZXNzaWJsZSBhdCB0aGUgcGF0aCAvam9pbi90cmlhbDEsXG4gICAgICAgICAgICAgIC9qb2luL3RyaWFsMiwgZXRjLjwvcD5cbiAgICAgICAgICAgIDxwPkNvbWluZ1Nvb24gUGFnZXMgd2lsbCBlbmFibGUgdXNlcnMgdG8gc3Vic2NyaWJlIHRvIE5ld3NsZXR0ZXJzIGFuZCBhcmUgYWNjZXNzaWJsZSBhdCB0aGUgaW50ZXJuYWwgcGF0aHNcbiAgICAgICAgICAgICAgL2pvaW4vY3MxLCAvam9pbi9jczIsIGV0Yy48L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSBsaXZlIHBhZ2UgbGluayAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1lbmRcIiAqbmdJZj1cInNoYXJkVXJsXCI+XG4gICAgICAgICAgICA8c3Bhbj5TZWUgdGhlIGxpdmUgcGFnZSA8c3BhbiBjbGFzcz1cInRvb2x0aXAtd3JhcCBtcy0xXCIgW2FwcGVuZFRvXT1cIidib2R5J1wiXG4gICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIidBZG1pbi5Eb21haW5Db25maWcuVG9vbHRpcC5TZWVMaXZlVHJpYWwnIHwgdHJhbnNsb2NvXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtaW5mby1jaXJjbGVcIj48L2k+XG4gICAgICAgICAgICAgIDwvc3Bhbj4gOiA8YSBbaHJlZl09XCJzaGFyZFVybCArICcvam9pbi90cmlhbDEnXCIgdGFyZ2V0PVwiX2JsYW5rXCI+e3sgc2hhcmRVcmwgfX0vam9pbi90cmlhbDE8L2E+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tM1wiPlxuICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtsYWJlbF09XCInQWRtaW4uRG9tYWluQ29uZmlnLlRyaWFsUHJvZHVjdCcgfCB0cmFuc2xvY29cIiBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW3Rvb2x0aXBUZXh0XT1cIidBZG1pbi5Eb21haW5Db25maWcuVG9vbHRpcC5UcmlhbFByb2R1Y3QnIHwgdHJhbnNsb2NvXCIgbmFtZT1cInRyaWFsX3Byb2R1Y3RfaWRcIj5cbiAgICAgICAgICAgICAgICA8cC1hdXRvQ29tcGxldGUgW3N1Z2dlc3Rpb25zXT1cInByb2R1Y3RzTGlzdFwiIGZvcm1Db250cm9sTmFtZT1cInRyaWFsX3Byb2R1Y3RfaWRcIiBkYXRhS2V5PVwiaWRcIiBmaWVsZD1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgW2Ryb3Bkb3duXT1cInRydWVcIiBbZGVsYXldPVwiMTAwMFwiIChjb21wbGV0ZU1ldGhvZCk9XCJzZWFyY2hQcm9kdWN0KCRldmVudClcIiBzdHlsZUNsYXNzPVwidy0xMDBcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggUHJvZHVjdFwiIFtpbnB1dFN0eWxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmdldCgndHJpYWxfcHJvZHVjdF9pZCcpLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5nZXQoJ3RyaWFsX3Byb2R1Y3RfaWQnKS5pbnZhbGlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgYm9yZGVyOiAnMXB4IHNvbGlkICNmZjU4NmInIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogeyBib3JkZXI6ICcxcHggc29saWQgZ3JheScgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIFttdWx0aXBsZV09XCJmYWxzZVwiPlxuICAgICAgICAgICAgICAgIDwvcC1hdXRvQ29tcGxldGU+XG4gICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1zbS0zXCI+XG4gICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW2xhYmVsXT1cIidBZG1pbi5Eb21haW5Db25maWcuVHJpYWxDcm1Tb3VyY2VJZCcgfCB0cmFuc2xvY29cIiBuYW1lPVwidHJpYWxfY3JtX3NvdXJjZV9pZFwiXG4gICAgICAgICAgICAgICAgW3Nob3dUb29sdGlwXT1cInRydWVcIiBbdG9vbHRpcFRleHRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FkbWluLkRvbWFpbkNvbmZpZy5Ub29sdGlwLlRyaWFsQ3JtU291cmNlSWQnIHwgdHJhbnNsb2NvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJjcm1Tb3VyY2VzTGlzdFwiIGZvcm1Db250cm9sTmFtZT1cInRyaWFsX2NybV9zb3VyY2VfaWRcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWyd0cmlhbF9jcm1fc291cmNlX2lkJ10/LmVycm9ycyB9XCJcbiAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU2VsZWN0IENSTSBTb3VyY2UnXCIgb3B0aW9uVmFsdWU9XCJpZFwiIG9wdGlvbkxhYmVsPVwibmFtZVwiPlxuICAgICAgICAgICAgICAgIDwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLXNtLTNcIj5cbiAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbbGFiZWxdPVwiJ0FkbWluLkRvbWFpbkNvbmZpZy5UcmlhbFBkZlNvdXJjZUlkJyB8IHRyYW5zbG9jb1wiIG5hbWU9XCJ0cmlhbF9wZGZfc291cmNlX2lkXCJcbiAgICAgICAgICAgICAgICBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiIFt0b29sdGlwVGV4dF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQWRtaW4uRG9tYWluQ29uZmlnLlRvb2x0aXAuVHJpYWxQZGZTb3VyY2VJZCcgfCB0cmFuc2xvY29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImNybVNvdXJjZXNMaXN0XCIgZm9ybUNvbnRyb2xOYW1lPVwidHJpYWxfcGRmX3NvdXJjZV9pZFwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ3RyaWFsX3BkZl9zb3VyY2VfaWQnXT8uZXJyb3JzIH1cIlxuICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWxlY3QgQ1JNIFNvdXJjZSdcIiBvcHRpb25WYWx1ZT1cImlkXCIgb3B0aW9uTGFiZWw9XCJuYW1lXCI+XG4gICAgICAgICAgICAgICAgPC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tM1wiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tM1wiPlxuICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtsYWJlbF09XCInQWRtaW4uRG9tYWluQ29uZmlnLlRyaWFsVmlkZW9VcmwnIHwgdHJhbnNsb2NvXCIgbmFtZT1cInRyaWFsX3ZpZGVvX3VybFwiXG4gICAgICAgICAgICAgICAgW3Nob3dUb29sdGlwXT1cInRydWVcIiBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLkRvbWFpbkNvbmZpZy5Ub29sdGlwLlRyaWFsVmlkZW9VcmwnIHwgdHJhbnNsb2NvXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJ0cmlhbF92aWRlb191cmxcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWyd0cmlhbF92aWRlb191cmwnXS5lcnJvcnMgfVwiIC8+XG4gICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1zbS0zXCI+XG4gICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW2xhYmVsXT1cIidBZG1pbi5Eb21haW5Db25maWcuVHJpYWxCb29rRGVtb1VybCcgfCB0cmFuc2xvY29cIiBuYW1lPVwidHJpYWxfYm9va19kZW1vX3VybFwiXG4gICAgICAgICAgICAgICAgW3Nob3dUb29sdGlwXT1cInRydWVcIiBbdG9vbHRpcFRleHRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FkbWluLkRvbWFpbkNvbmZpZy5Ub29sdGlwLlRyaWFsQm9va0RlbW9VcmwnIHwgdHJhbnNsb2NvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInRyaWFsX2Jvb2tfZGVtb191cmxcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ3RyaWFsX2Jvb2tfZGVtb191cmwnXS5lcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCIgLz5cbiAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cbiAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbbGFiZWxdPVwiJ0FkbWluLkRvbWFpbkNvbmZpZy5UcmlhbEN0YUlmcmFtZScgfCB0cmFuc2xvY29cIiBuYW1lPVwidHJpYWxfY3RhX2lmcmFtZVwiXG4gICAgICAgICAgICAgICAgW3Nob3dUb29sdGlwXT1cInRydWVcIiBbdG9vbHRpcFRleHRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FkbWluLkRvbWFpbkNvbmZpZy5Ub29sdGlwLlRyaWFsQ3RhSWZyYW1lJyB8IHRyYW5zbG9jb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIHJvd3M9XCIzXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJ0cmlhbF9jdGFfaWZyYW1lXCIgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWyd0cmlhbF9jdGFfaWZyYW1lJ10uZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cbiAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbbGFiZWxdPVwiJ0FkbWluLkRvbWFpbkNvbmZpZy5UcmlhbEpvaW5NZXNzYWdlJyB8IHRyYW5zbG9jb1wiIG5hbWU9XCJ0cmlhbF9qb2luX21lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIFtzaG93VG9vbHRpcF09XCJ0cnVlXCIgW3Rvb2x0aXBUZXh0XT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBZG1pbi5Eb21haW5Db25maWcuVG9vbHRpcC5UcmlhbEpvaW5NZXNzYWdlJyB8IHRyYW5zbG9jb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIHJvd3M9XCIzXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJ0cmlhbF9qb2luX21lc3NhZ2VcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ3RyaWFsX2pvaW5fbWVzc2FnZSddLmVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XG4gICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW2xhYmVsXT1cIidBZG1pbi5Eb21haW5Db25maWcuVHJpYWxQZGZEb3dubG9hZFRleHQnIHwgdHJhbnNsb2NvXCIgbmFtZT1cInRyaWFsX3BkZl9kb3dubG9hZF90ZXh0XCJcbiAgICAgICAgICAgICAgICBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiIFt0b29sdGlwVGV4dF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQWRtaW4uRG9tYWluQ29uZmlnLlRvb2x0aXAuVHJpYWxQZGZEb3dubG9hZFRleHQnIHwgdHJhbnNsb2NvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgcm93cz1cIjNcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInRyaWFsX3BkZl9kb3dubG9hZF90ZXh0XCIgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWyd0cmlhbF9wZGZfZG93bmxvYWRfdGV4dCddLmVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiIG1hdGNoSGVpZ2h0PVwiY2FyZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ0cmlhbF9pbWFnZVwiPnt7ICdBZG1pbi5Eb21haW5Db25maWcuVHJpYWxJbWFnZScgfCB0cmFuc2xvY28gfX0gPHNwYW4gY2xhc3M9XCJpbmZvLWNpcmNsZVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b29sdGlwdGV4dCBncmFkaWVudC1jdXN0b20tYnJhbmRpbmdcIj57eyAnQWRtaW4uRG9tYWluQ29uZmlnLlRvb2x0aXAuVHJpYWxJbWFnZScgfCB0cmFuc2xvY29cbiAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8cHctY3VzdG9tLXVwbG9hZGVyIChzYXZlRXZlbnQpPVwib25TYXZlRmlsZSgkZXZlbnQpXCIgW2FzcGVjdFJhdGlvXT1cIidjdXN0b20nXCIgW3RpdGxlXT1cIidUcmlhbCBJbWFnZSdcIlxuICAgICAgICAgICAgICAgIFtjb250cm9sTmFtZV09XCIndHJpYWxfaW1hZ2UnXCIgW3ByZXZpZXdEYXRhXT1cImRhdGFbJ3RyaWFsX2ltYWdlJ11cIj5cbiAgICAgICAgICAgICAgPC9wdy1jdXN0b20tdXBsb2FkZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidHJpYWxfaW1hZ2UyXCI+e3sgJ0FkbWluLkRvbWFpbkNvbmZpZy5UcmlhbEltYWdlMicgfCB0cmFuc2xvY28gfX0gPHNwYW4gY2xhc3M9XCJpbmZvLWNpcmNsZVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b29sdGlwdGV4dCBncmFkaWVudC1jdXN0b20tYnJhbmRpbmdcIj57eyAnQWRtaW4uRG9tYWluQ29uZmlnLlRvb2x0aXAuVHJpYWxJbWFnZTInIHwgdHJhbnNsb2NvXG4gICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPHB3LWN1c3RvbS11cGxvYWRlciAoc2F2ZUV2ZW50KT1cIm9uU2F2ZUZpbGUoJGV2ZW50KVwiIFt0aXRsZV09XCInVHJpYWwgSW1hZ2UyJ1wiIFthc3BlY3RSYXRpb109XCInY3VzdG9tJ1wiXG4gICAgICAgICAgICAgICAgW2NvbnRyb2xOYW1lXT1cIid0cmlhbF9pbWFnZTInXCIgW3ByZXZpZXdEYXRhXT1cImRhdGFbJ3RyaWFsX2ltYWdlMiddXCI+XG4gICAgICAgICAgICAgIDwvcHctY3VzdG9tLXVwbG9hZGVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInRyaWFsX3BkZl9pbWFnZVwiPnt7ICdBZG1pbi5Eb21haW5Db25maWcuVHJpYWxQZGZJbWFnZScgfCB0cmFuc2xvY28gfX0gPHNwYW4gY2xhc3M9XCJpbmZvLWNpcmNsZVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b29sdGlwdGV4dCBncmFkaWVudC1jdXN0b20tYnJhbmRpbmdcIj57eyAnQWRtaW4uRG9tYWluQ29uZmlnLlRvb2x0aXAuVHJpYWxQZGZJbWFnZScgfCB0cmFuc2xvY29cbiAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8cHctY3VzdG9tLXVwbG9hZGVyIChzYXZlRXZlbnQpPVwib25TYXZlRmlsZSgkZXZlbnQpXCIgW3RpdGxlXT1cIidUcmlhbCBQZGYgSW1hZ2UnXCIgW2FzcGVjdFJhdGlvXT1cIidjdXN0b20nXCJcbiAgICAgICAgICAgICAgICBbY29udHJvbE5hbWVdPVwiJ3RyaWFsX3BkZl9pbWFnZSdcIiBbcHJldmlld0RhdGFdPVwiZGF0YVsndHJpYWxfcGRmX2ltYWdlJ11cIj5cbiAgICAgICAgICAgICAgPC9wdy1jdXN0b20tdXBsb2FkZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidHJpYWxfaW1hZ2VfYmdcIj57eyAnQWRtaW4uRG9tYWluQ29uZmlnLlRyaWFsSW1hZ2VCZycgfCB0cmFuc2xvY28gfX0gPHNwYW4gY2xhc3M9XCJpbmZvLWNpcmNsZVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b29sdGlwdGV4dCBncmFkaWVudC1jdXN0b20tYnJhbmRpbmdcIj57eyAnQWRtaW4uRG9tYWluQ29uZmlnLlRvb2x0aXAuVHJpYWxJbWFnZUJnJyB8IHRyYW5zbG9jb1xuICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxwdy1jdXN0b20tdXBsb2FkZXIgKHNhdmVFdmVudCk9XCJvblNhdmVGaWxlKCRldmVudClcIiBbdGl0bGVdPVwiJ1RyaWFsIEltYWdlIEJnJ1wiIFthc3BlY3RSYXRpb109XCInY3VzdG9tJ1wiXG4gICAgICAgICAgICAgICAgW2NvbnRyb2xOYW1lXT1cIid0cmlhbF9pbWFnZV9iZydcIiBbcHJldmlld0RhdGFdPVwiZGF0YVsndHJpYWxfaW1hZ2VfYmcnXVwiPlxuICAgICAgICAgICAgICA8L3B3LWN1c3RvbS11cGxvYWRlcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ0cmlhbF9pbWFnZV9iZzJcIj57eyAnQWRtaW4uRG9tYWluQ29uZmlnLlRyaWFsSW1hZ2VCZzInIHwgdHJhbnNsb2NvIH19IDxzcGFuIGNsYXNzPVwiaW5mby1jaXJjbGVcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9vbHRpcHRleHQgZ3JhZGllbnQtY3VzdG9tLWJyYW5kaW5nXCI+e3sgJ0FkbWluLkRvbWFpbkNvbmZpZy5Ub29sdGlwLlRyaWFsSW1hZ2VCZzInIHwgdHJhbnNsb2NvXG4gICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPHB3LWN1c3RvbS11cGxvYWRlciAoc2F2ZUV2ZW50KT1cIm9uU2F2ZUZpbGUoJGV2ZW50KVwiIFt0aXRsZV09XCInVHJpYWwgSW1hZ2UgQmcyJ1wiIFthc3BlY3RSYXRpb109XCInY3VzdG9tJ1wiXG4gICAgICAgICAgICAgICAgW2NvbnRyb2xOYW1lXT1cIid0cmlhbF9pbWFnZV9iZzInXCIgW3ByZXZpZXdEYXRhXT1cImRhdGFbJ3RyaWFsX2ltYWdlX2JnMiddXCI+XG4gICAgICAgICAgICAgIDwvcHctY3VzdG9tLXVwbG9hZGVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvcC1hY2NvcmRpb25UYWI+XG5cbiAgICAgICAgPHAtYWNjb3JkaW9uVGFiIFtoZWFkZXJdPVwiJ0hlYWRlciBTZWN0aW9uJ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtNFwiIGZvcm1Hcm91cE5hbWU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1iLTRcIj5IZWFkZXIgU2VjdGlvbjwvaDQ+XG5cbiAgICAgICAgICAgIDwhLS0gSGVhZGxpbmUgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiSGVhZGVyIEhlYWRsaW5lXCIgbmFtZT1cImhlYWRsaW5lXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJoZWFkbGluZVwiIC8+XG4gICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gVmlkZW8gVVJMIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiSGVhZGVyIFZpZGVvIFVSTFwiIG5hbWU9XCJ2aWRlb191cmxcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInZpZGVvX3VybFwiIC8+XG4gICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gQmFja2dyb3VuZCBJbWFnZSBVUkwgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC02XCI+XG4gICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJIZWFkZXIgQmFja2dyb3VuZCBJbWFnZSBVUkxcIiBuYW1lPVwiYmdfaW1hZ2VfdXJsXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJiZ19pbWFnZV91cmxcIiAvPlxuICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIERlc2NyaXB0aW9uIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxuICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiSGVhZGVyIERlc2NyaXB0aW9uXCIgbmFtZT1cImRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICByb3dzPVwiNVwiXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ2Rlc2NyaXB0aW9uJ10/LmVycm9ycyB9XCJcbiAgICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBTdWIgSGVhZGluZ3MgLS0+XG4gICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJzdWJfaGVhZGluZ3NcIiBjbGFzcz1cImNvbC0xMlwiIGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcEl0ZW1zKGhlYWRlclN1YkhlYWRpbmdzLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgc3ViIG9mIGZbJ2hlYWRlciddLmdldCgnc3ViX2hlYWRpbmdzJylbJ2NvbnRyb2xzJ107IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicm93IG1iLTMgYWxpZ24taXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEwXCI+XG4gICAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiU3ViIEhlYWRlciBEZXNjcmlwdGlvblwiIG5hbWU9XCJkZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgcm93cz1cIjNcIlxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ2Rlc2NyaXB0aW9uJ10/LmVycm9ycyB9XCJcbiAgICAgICAgICAgICAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMSBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLXRyYXNoIGRlbGV0ZS1pY29uIHRleHQtZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUhlYWRlclN1YkhlYWRpbmcoaSlcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJyZW1vdmVIZWFkZXJTdWJIZWFkaW5nKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwicmVtb3ZlSGVhZGVyU3ViSGVhZGluZyhpKVwiXG4gICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJSZW1vdmVcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMSBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLWJhcnMgY3Vyc29yLW1vdmVcIlxuICAgICAgICAgICAgICAgICAgICBjZGtEcmFnSGFuZGxlXG4gICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJEcmFnIHRvIHJlb3JkZXJcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXQtMiBtYi0yXCIgKGNsaWNrKT1cImFkZEhlYWRlclN1YkhlYWRpbmcoKVwiPlxuICAgICAgICAgICAgICAgICsgQWRkIFN1YiBIZWFkaW5nXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvcC1hY2NvcmRpb25UYWI+XG5cblxuICAgICAgICA8cC1hY2NvcmRpb25UYWIgW2hlYWRlcl09XCInUmVzb3VyY2VzIFNlY3Rpb24nXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyByb3cgbXQtNCBtYi00XCI+XG4gICAgICAgICAgICA8aDQgY2xhc3M9XCJtYi0zXCI+UmVzb3VyY2VzIFNlY3Rpb248L2g0PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tNlwiPlxuICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtsYWJlbF09XCInQWRtaW4uRG9tYWluQ29uZmlnLlJlc291cmNlVGFnbGluZScgfCB0cmFuc2xvY29cIiBuYW1lPVwicmVzb3VyY2VzX3RhZ2xpbmVcIlxuICAgICAgICAgICAgICAgIFtzaG93VG9vbHRpcF09XCJ0cnVlXCIgW3Rvb2x0aXBUZXh0XT1cIidBZG1pbi5Eb21haW5Db25maWcuVG9vbHRpcC5SZXNvdXJjZVRhZ2xpbmUnIHwgdHJhbnNsb2NvXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJyZXNvdXJjZXNfdGFnbGluZVwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ3Jlc291cmNlc190YWdsaW5lJ10uZXJyb3JzIH1cIiAvPlxuICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxuICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtsYWJlbF09XCInQWRtaW4uRG9tYWluQ29uZmlnLlJlc291cmNlRGVzY3JpcHRpb24nIHwgdHJhbnNsb2NvXCIgbmFtZT1cInJlc291cmNlc19kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgW3Nob3dUb29sdGlwXT1cInRydWVcIiBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLkRvbWFpbkNvbmZpZy5Ub29sdGlwLlJlc291cmNlRGVzY3JpcHRpb24nIHwgdHJhbnNsb2NvXCI+XG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcm93cz1cIjNcIiBmb3JtQ29udHJvbE5hbWU9XCJyZXNvdXJjZXNfZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWydyZXNvdXJjZXNfZGVzY3JpcHRpb24nXS5lcnJvcnMgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgbWF0Y2hIZWlnaHQ9XCJjYXJkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInJlc291cmNlX2ltYWdlXCI+e3sgJ0FkbWluLkRvbWFpbkNvbmZpZy5SZXNvdXJjZUltYWdlJyB8IHRyYW5zbG9jbyB9fSA8c3BhbiBjbGFzcz1cImluZm8tY2lyY2xlXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvb2x0aXB0ZXh0IGdyYWRpZW50LWN1c3RvbS1icmFuZGluZ1wiPnt7ICdBZG1pbi5Eb21haW5Db25maWcuVG9vbHRpcC5SZXNvdXJjZUltYWdlJyB8IHRyYW5zbG9jb1xuICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxwdy1jdXN0b20tdXBsb2FkZXIgKHNhdmVFdmVudCk9XCJvblNhdmVGaWxlKCRldmVudClcIiBbYXNwZWN0UmF0aW9dPVwiJ2N1c3RvbSdcIiBbdGl0bGVdPVwiJ0NzIEltYWdlJ1wiXG4gICAgICAgICAgICAgICAgW2NvbnRyb2xOYW1lXT1cIidyZXNvdXJjZXNfaW1hZ2UnXCIgW3ByZXZpZXdEYXRhXT1cImRhdGFbJ3Jlc291cmNlc19pbWFnZSddXCI+XG4gICAgICAgICAgICAgIDwvcHctY3VzdG9tLXVwbG9hZGVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvcC1hY2NvcmRpb25UYWI+XG5cbiAgICAgICAgPHAtYWNjb3JkaW9uVGFiIFtoZWFkZXJdPVwiJ1VuaXF1ZSBTZWxsaW5nIFByb3Bvc2l0aW9uIFNlY3Rpb24gKFVTUCkgJ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtNCBtYi00XCIgZm9ybUdyb3VwTmFtZT1cInVzcHNcIj5cbiAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1iLTRcIj5VbmlxdWUgU2VsbGluZyBQcm9wb3NpdGlvbiBTZWN0aW9uIChVU1ApPC9oND5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiVVNQcyBUaXRsZVwiIG5hbWU9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIiAvPlxuICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC02XCI+XG4gICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJVU1BzIFZpZGVvIFVybFwiIG5hbWU9XCJ2aWRlb191cmxcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInZpZGVvX3VybFwiIC8+XG4gICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cbiAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBsYWJlbD1cIlVTUHMgRGVzY3JpcHRpb25cIiBuYW1lPVwiZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByb3dzPVwiM1wiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBVU1AgSXRlbXMgLS0+XG4gICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJpdGVtc1wiIGNsYXNzPVwiY29sLTEyXCIgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wSXRlbXModXNwc0l0ZW1zLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmWyd1c3BzJ10uZ2V0KCdpdGVtcycpWydjb250cm9scyddOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJvdyBtYi0zIGFsaWduLWl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMFwiPlxuICAgICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBsYWJlbD1cIkl0ZW0gRGVzY3JpcHRpb25cIiBuYW1lPVwiZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcm93cz1cIjNcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMSBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLXRyYXNoIGRlbGV0ZS1pY29uIHRleHQtZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVVzcEl0ZW0oaSlcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJyZW1vdmVVc3BJdGVtKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwicmVtb3ZlVXNwSXRlbShpKVwiXG4gICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJSZW1vdmVcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMSBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLWJhcnMgY3Vyc29yLW1vdmVcIlxuICAgICAgICAgICAgICAgICAgICBjZGtEcmFnSGFuZGxlXG4gICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJEcmFnIHRvIHJlb3JkZXJcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXQtMiBtYi0yXCIgKGNsaWNrKT1cImFkZFVzcEl0ZW0oKVwiPlxuICAgICAgICAgICAgICAgICsgQWRkIFVTUCBJdGVtXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvcC1hY2NvcmRpb25UYWI+XG5cblxuICAgICAgICA8cC1hY2NvcmRpb25UYWIgW2hlYWRlcl09XCInUGFydG5lcnMgKENsaWVudHMpIFNlY3Rpb24nXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC00IG1iLTRcIiBmb3JtR3JvdXBOYW1lPVwicGFydG5lcnNcIj5cbiAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1iLTRcIj5QYXJ0bmVycyAoQ2xpZW50cykgU2VjdGlvbjwvaDQ+XG5cbiAgICAgICAgICAgIDwhLS0gVGl0bGUgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC02XCI+XG4gICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJQYXJ0bmVyIFRpdGxlXCIgbmFtZT1cInRpdGxlXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIC8+XG4gICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gRGVzY3JpcHRpb24gLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XG4gICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJQYXJ0bmVycyBEZXNjcmlwdGlvblwiIG5hbWU9XCJkZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJvd3M9XCIzXCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcHRpb25cIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFBhcnRuZXIgSXRlbXMgd2l0aCBEcmFnIFN1cHBvcnQgLS0+XG4gICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJpdGVtc1wiIGNsYXNzPVwiY29sLTEyXCIgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wSXRlbXMocGFydG5lcnNJdGVtcywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcGFydG5lcnNJdGVtcy5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJyb3cgYm9yZGVyIHAtMyBtYi0zIGFsaWduLWl0ZW1zLXN0YXJ0XCJcbiAgICAgICAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8IS0tIE5hbWUgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XG4gICAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiTmFtZVwiIGNsYXNzPVwiY29sLTEyXCIgbmFtZT1cIm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gQmxvZyBVUkwgKyBEcmFnIEhhbmRsZSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBsYWJlbD1cIkJsb2cgVXJsXCIgbmFtZT1cImJsb2dfdXJsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiYmxvZ191cmxcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLXN0YXJ0IG10LTNcIj5cbiAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtYmFycyBjdXJzb3ItbW92ZVwiXG4gICAgICAgICAgICAgICAgICAgIGNka0RyYWdIYW5kbGVcbiAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIkRyYWcgdG8gcmVvcmRlciBxdWVzdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICA8IS0tIFZpZGVvIFVSTCAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cbiAgICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJWaWRlbyBVcmxcIiBuYW1lPVwidmlkZW9fdXJsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInZpZGVvX3VybFwiIC8+XG4gICAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gSW1hZ2UgVVJMIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBsYWJlbD1cIkltYWdlIFVybFwiIG5hbWU9XCJpbWFnZV91cmxcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiaW1hZ2VfdXJsXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBEZWxldGUgSWNvbiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIHRleHQtZW5kIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJSZW1vdmVcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlUGFydG5lckl0ZW0oaSlcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJyZW1vdmVQYXJ0bmVySXRlbShpKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cInJlbW92ZVBhcnRuZXJJdGVtKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS10cmFzaCBkZWxldGUtaWNvbiB0ZXh0LWRhbmdlclwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIEFkZCBOZXcgUGFydG5lciAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc3RhcnQgbXQtMlwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG10LTIgbWItMlwiIChjbGljayk9XCJhZGRQYXJ0bmVySXRlbSgpXCI+KyBBZGQgUGFydG5lcjwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3AtYWNjb3JkaW9uVGFiPlxuXG5cbiAgICAgICAgPHAtYWNjb3JkaW9uVGFiIFtoZWFkZXJdPVwiJ1Rlc3RpbW9uaWFscyBTZWN0aW9uJ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtMyBtYi00XCIgZm9ybUdyb3VwTmFtZT1cInRlc3RpbW9uaWFsc1wiPlxuICAgICAgICAgICAgPGg0IGNsYXNzPVwibWItNFwiPlRlc3RpbW9uaWFscyBTZWN0aW9uPC9oND5cblxuICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBsYWJlbD1cIlRpdGxlXCIgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTZcIiBuYW1lPVwidGVzdGltb25pYWxzX3RpdGxlXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIiAvPlxuICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJEZXNjcmlwdGlvblwiIGNsYXNzPVwiY29sLTEyXCIgbmFtZT1cInRlc3RpbW9uaWFsc19kZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICA8dGV4dGFyZWEgcm93cz1cIjNcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8IS0tIEl0ZW1zIExpc3QgLS0+XG4gICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJpdGVtc1wiIGNsYXNzPVwiY29sLTEyIG10LTNcIiBjZGtEcm9wTGlzdCAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3BJdGVtcyh0ZXN0aW1vbmlhbHNJdGVtcywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgdGVzdGltb25pYWxzSXRlbXMuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicm93IGJvcmRlciBwLTMgbWItMyBhbGlnbi1pdGVtcy1zdGFydFwiXG4gICAgICAgICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XG4gICAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiTmFtZVwiIG5hbWU9XCJuYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNVwiPlxuICAgICAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiQmxvZyBVUkxcIiBuYW1lPVwiYmxvZ191cmxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImJsb2dfdXJsXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMSBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1zdGFydCBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLWJhcnMgY3Vyc29yLW1vdmVcIlxuICAgICAgICAgICAgICAgICAgICBjZGtEcmFnSGFuZGxlXG4gICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJEcmFnIHRvIHJlb3JkZXIgcXVlc3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiSW1hZ2UgVVJMXCIgY2xhc3M9XCJjb2wtbWQtNlwiIG5hbWU9XCJpbWFnZV91cmxcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiaW1hZ2VfdXJsXCIgLz5cbiAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJWaWRlbyBVUkxcIiBjbGFzcz1cImNvbC1tZC02XCIgbmFtZT1cInZpZGVvX3VybFwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJ2aWRlb191cmxcIiAvPlxuICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBsYWJlbD1cIlRlc3RpbW9uaWFsXCIgY2xhc3M9XCJjb2wtbWQtMTBcIiBuYW1lPVwidGVzdGltb25pYWxcIj5cbiAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJvd3M9XCIzXCIgZm9ybUNvbnRyb2xOYW1lPVwidGVzdGltb25pYWxcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yIGQtZmxleCBhbGlnbi1pdGVtcy1zdGFydCBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLXRyYXNoIGRlbGV0ZS1pY29uIHRleHQtZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIlJlbW92ZVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVUZXN0aW1vbmlhbEl0ZW0oaSlcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJyZW1vdmVUZXN0aW1vbmlhbEl0ZW0oaSlcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJyZW1vdmVUZXN0aW1vbmlhbEl0ZW0oaSlcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc3RhcnQgbXQtMlwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG10LTIgbWItMlwiIChjbGljayk9XCJhZGRUZXN0aW1vbmlhbEl0ZW0oKVwiPlxuICAgICAgICAgICAgICAgICAgKyBBZGQgVGVzdGltb25pYWxcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9wLWFjY29yZGlvblRhYj5cblxuICAgICAgICA8cC1hY2NvcmRpb25UYWIgW2hlYWRlcl09XCInVmlkZW8gU2VjdGlvbidcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG10LTMgbWItNFwiIGZvcm1Hcm91cE5hbWU9XCJ2aWRlb3NcIj5cbiAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1iLTNcIj5WaWRlbyBTZWN0aW9uPC9oND5cblxuICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBsYWJlbD1cIlRpdGxlXCIgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTZcIiBuYW1lPVwidmlkZW9zX3RpdGxlXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIiAvPlxuICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJEZXNjcmlwdGlvblwiIGNsYXNzPVwiY29sLTEyXCIgbmFtZT1cInZpZGVvc19kZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICA8dGV4dGFyZWEgcm93cz1cIjNcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8IS0tIFZpZGVvIEl0ZW1zIC0tPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBmb3JtQXJyYXlOYW1lPVwiaXRlbXNcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNvbC0xMiBtdC0zXCJcbiAgICAgICAgICAgICAgY2RrRHJvcExpc3RcbiAgICAgICAgICAgICAgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wSXRlbXModmlkZW9zSXRlbXMsICRldmVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgdmlkZW9zSXRlbXMuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicm93IGJvcmRlciBwLTMgbWItMyBhbGlnbi1pdGVtcy1zdGFydFwiXG4gICAgICAgICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XG4gICAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiVGl0bGVcIiBuYW1lPVwidGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNVwiPlxuICAgICAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiQmxvZyBVUkxcIiBuYW1lPVwiYmxvZ191cmxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImJsb2dfdXJsXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMSBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1zdGFydCBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLWJhcnMgY3Vyc29yLW1vdmVcIlxuICAgICAgICAgICAgICAgICAgICBjZGtEcmFnSGFuZGxlXG4gICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJEcmFnIHRvIHJlb3JkZXIgcXVlc3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJJbWFnZSBVUkxcIiBjbGFzcz1cImNvbC1tZC02XCIgbmFtZT1cImltYWdlX3VybFwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJpbWFnZV91cmxcIiAvPlxuICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBsYWJlbD1cIlZpZGVvIFVSTFwiIGNsYXNzPVwiY29sLW1kLTZcIiBuYW1lPVwidmlkZW9fdXJsXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInZpZGVvX3VybFwiIC8+XG4gICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiRGVzY3JpcHRpb25cIiBjbGFzcz1cImNvbC1tZC0xMFwiIG5hbWU9XCJkZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcm93cz1cIjNcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTIgZC1mbGV4IGFsaWduLWl0ZW1zLXN0YXJ0IG10LTNcIj5cbiAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtdHJhc2ggZGVsZXRlLWljb24gdGV4dC1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlVmlkZW9JdGVtKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwicmVtb3ZlVmlkZW9JdGVtKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwicmVtb3ZlVmlkZW9JdGVtKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIlJlbW92ZVwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zdGFydCBtdC0yXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXQtMiBtYi0yXCIgKGNsaWNrKT1cImFkZFZpZGVvSXRlbSgpXCI+XG4gICAgICAgICAgICAgICAgICArIEFkZCBWaWRlb1xuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3AtYWNjb3JkaW9uVGFiPlxuXG5cbiAgICAgICAgPHAtYWNjb3JkaW9uVGFiIFtoZWFkZXJdPVwiJ0NhbGwgdG8gQWN0aW9ucyBTZWN0aW9uIChDVEFzKSdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG10LTQgbWItNFwiIGZvcm1Hcm91cE5hbWU9XCJjdGFzXCI+XG4gICAgICAgICAgICA8aDQgY2xhc3M9XCJtYi00XCI+Q1RBcyBTZWN0aW9uPC9oND5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiVGl0bGVcIiBuYW1lPVwidGl0bGVcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCIgLz5cbiAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiSW1hZ2UgVVJMXCIgbmFtZT1cImltYWdlX3VybFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiaW1hZ2VfdXJsXCIgLz5cbiAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiQnV0dG9uIFRleHRcIiBuYW1lPVwiYnV0dG9uX3RleHRcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImJ1dHRvbl90ZXh0XCIgLz5cbiAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxuICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiRGVzY3JpcHRpb25cIiBuYW1lPVwiZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCIgLz5cbiAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBDVEEgSXRlbXMgLS0+XG4gICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJpdGVtc1wiIGNsYXNzPVwiY29sLTEyIG10LTNcIiBjZGtEcm9wTGlzdCAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3BJdGVtcyhjdGFzSXRlbXMsICRldmVudClcIj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGN0YXNJdGVtcy5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJyb3cgYm9yZGVyIHAtMyBtYi0zIGFsaWduLWl0ZW1zLXN0YXJ0XCJcbiAgICAgICAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC02XCI+XG4gICAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiSW1hZ2UgVVJMXCIgbmFtZT1cImltYWdlX3VybFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImltYWdlX3VybFwiIC8+XG4gICAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNVwiPlxuICAgICAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiQ3RhIFVSTFwiIG5hbWU9XCJjdGFfdXJsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJjdGFfdXJsXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMSBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1zdGFydCBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLWJhcnMgY3Vyc29yLW1vdmVcIlxuICAgICAgICAgICAgICAgICAgICBjZGtEcmFnSGFuZGxlXG4gICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJEcmFnIHRvIHJlb3JkZXIgcXVlc3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTZcIj5cbiAgICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJWaWRlbyBVUkxcIiBuYW1lPVwidmlkZW9fdXJsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwidmlkZW9fdXJsXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBsYWJlbD1cIkNUQSBUaXRsZVwiIG5hbWU9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTZcIj5cbiAgICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJDVEEgRGVzY3JpcHRpb25cIiBuYW1lPVwiZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcHRpb25cIiAvPlxuICAgICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC01XCI+XG4gICAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiQnV0dG9uIFRleHRcIiBuYW1lPVwiYnV0dG9uX3RleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiYnV0dG9uX3RleHRcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLXRyYXNoIGRlbGV0ZS1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUN0YXNJdGVtKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwicmVtb3ZlQ3Rhc0l0ZW0oaSlcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJyZW1vdmVDdGFzSXRlbShpKVwiXG4gICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJSZW1vdmVcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc3RhcnQgbXQtMlwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG10LTIgbWItMlwiIChjbGljayk9XCJhZGRDdGFzSXRlbSgpXCI+KyBBZGQgQ1RBIEl0ZW08L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9wLWFjY29yZGlvblRhYj5cblxuICAgICAgICA8cC1hY2NvcmRpb25UYWIgW2hlYWRlcl09XCInSW50ZWdyYXRpb25zIFNlY3Rpb24nXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC0zIG1iLTRcIiBmb3JtR3JvdXBOYW1lPVwiaW50ZWdyYXRpb25zXCI+XG4gICAgICAgICAgICA8aDQgY2xhc3M9XCJtYi0zXCI+SW50ZWdyYXRpb25zIFNlY3Rpb248L2g0PlxuXG4gICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiVGl0bGVcIiBjbGFzcz1cImNvbC0xMlwiIG5hbWU9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCIgLz5cbiAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiRGVzY3JpcHRpb25cIiBjbGFzcz1cImNvbC0xMlwiIG5hbWU9XCJkZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiIHJvd3M9XCIzXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJpdGVtc1wiIGNsYXNzPVwiY29sLTEyXCIgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wSXRlbXMoaW50ZWdyYXRpb25zSXRlbXMsICRldmVudClcIj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGludGVncmF0aW9uc0l0ZW1zLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJvdyBib3JkZXIgcC0zIG1iLTMgcm91bmRlZCBiZy1saWdodFwiXG4gICAgICAgICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBsYWJlbD1cIlRpdGxlXCIgY2xhc3M9XCJjb2wtbWQtNlwiIG5hbWU9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIC8+XG4gICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBsYWJlbD1cIkRlc2NyaXB0aW9uXCIgbmFtZT1cImRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtc3RhcnQgbXQtM1wiPlxuICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS1iYXJzIGN1cnNvci1tb3ZlXCJcbiAgICAgICAgICAgICAgICAgICAgY2RrRHJhZ0hhbmRsZVxuICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiRHJhZyB0byByZW9yZGVyIHF1ZXN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiQmxvZyBVUkxcIiBjbGFzcz1cImNvbC1tZC02XCIgbmFtZT1cImJsb2dfdXJsXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImJsb2dfdXJsXCIgLz5cbiAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJJbWFnZSBVUkxcIiBjbGFzcz1cImNvbC1tZC02XCIgbmFtZT1cImltYWdlX3VybFwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJpbWFnZV91cmxcIiAvPlxuICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBsYWJlbD1cIlZpZGVvIFVSTFwiIGNsYXNzPVwiY29sLW1kLTZcIiBuYW1lPVwidmlkZW9fdXJsXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInZpZGVvX3VybFwiIC8+XG4gICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgZC1mbGV4IGFsaWduLWl0ZW1zLWVuZCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XG4gICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLXRyYXNoIGRlbGV0ZS1pY29uIGFsaWduLXNlbGYtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUludGVncmF0aW9uSXRlbShpKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInJlbW92ZUludGVncmF0aW9uSXRlbShpKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cInJlbW92ZUludGVncmF0aW9uSXRlbShpKVwiXG4gICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJSZW1vdmVcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc3RhcnQgbXQtMlwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cImFkZEludGVncmF0aW9uSXRlbSgpXCI+KyBBZGQgSW50ZWdyYXRpb248L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9wLWFjY29yZGlvblRhYj5cblxuXG4gICAgICAgIDxwLWFjY29yZGlvblRhYiBbaGVhZGVyXT1cIidDb250YWN0IFVzIFNlY3Rpb24nXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC0zIG1iLTRcIiBmb3JtR3JvdXBOYW1lPVwiY29udGFjdF91c1wiPlxuICAgICAgICAgICAgPGg0IGNsYXNzPVwibWItM1wiPkNvbnRhY3QgVXMgU2VjdGlvbjwvaDQ+XG5cbiAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJVcmxcIiBjbGFzcz1cImNvbC1tZC02XCIgbmFtZT1cInVybFwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInVybFwiIC8+XG4gICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJEZXNjcmlwdGlvblwiIGNsYXNzPVwiY29sLTEyXCIgbmFtZT1cImNvbnRhY3RfdXNfZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgPHRleHRhcmVhIHJvd3M9XCIzXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwicXVlc3Rpb25zXCIgY2xhc3M9XCJjb2wtMTIgbXQtM1wiIGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcEl0ZW1zKGNvbnRhY3RVc1F1ZXN0aW9ucywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHF1ZXN0aW9uR3JvdXAgb2YgY29udGFjdFVzUXVlc3Rpb25zLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJvdyBib3JkZXIgcC0zIG1iLTNcIlxuICAgICAgICAgICAgICAgIGNka0RyYWdcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJRdWVzdGlvblwiIGNsYXNzPVwiY29sLW1kLTEwXCIgbmFtZT1cInF1ZXN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInF1ZXN0aW9uXCIgLz5cbiAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtc3RhcnQgbXQtM1wiPlxuICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS10cmFzaCBkZWxldGUtaWNvbiB0ZXh0LWRhbmdlclwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVDb250YWN0VXNRdWVzdGlvbihpKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInJlbW92ZUNvbnRhY3RVc1F1ZXN0aW9uKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwicmVtb3ZlQ29udGFjdFVzUXVlc3Rpb24oaSlcIlxuICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiUmVtb3ZlXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtc3RhcnQgbXQtM1wiPlxuICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS1iYXJzIGN1cnNvci1tb3ZlXCJcbiAgICAgICAgICAgICAgICAgICAgY2RrRHJhZ0hhbmRsZVxuICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiRHJhZyB0byByZW9yZGVyIHF1ZXN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG10LTNcIiBmb3JtQXJyYXlOYW1lPVwib3B0aW9uc1wiIGNka0Ryb3BMaXN0IFtjZGtEcm9wTGlzdERhdGFdPVwiZ2V0UXVlc3Rpb25PcHRpb25zKGkpLmNvbnRyb2xzXCIgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wQ29udGFjdFVzT3B0aW9ucyhpLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlciBtYi0yIGJvcmRlciBwLTNcIlxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGdldFF1ZXN0aW9uT3B0aW9ucyhpKS5jb250cm9sczsgbGV0IGogPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBOYW1lXT1cImpcIlxuICAgICAgICAgICAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJPcHRpb25cIiBjbGFzcz1cImNvbC1tZC0xMFwiIG5hbWU9XCJvcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cIm9wdGlvblwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMSBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtdHJhc2ggZGVsZXRlLWljb24gdGV4dC1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUNvbnRhY3RVc09wdGlvbihpLCBqKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJyZW1vdmVDb250YWN0VXNPcHRpb24oaSwgailcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwicmVtb3ZlQ29udGFjdFVzT3B0aW9uKGksIGopXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJSZW1vdmUgT3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG10LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS1iYXJzIGN1cnNvci1tb3ZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNka0RyYWdIYW5kbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJEcmFnIHRvIHJlb3JkZXIgb3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc3RhcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtXCIgKGNsaWNrKT1cImFkZENvbnRhY3RVc09wdGlvbihpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICsgQWRkIE9wdGlvblxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zdGFydCBtdC0zXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwiYWRkQ29udGFjdFVzUXVlc3Rpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgKyBBZGQgUXVlc3Rpb25cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwiaHVic3BvdFwiIGNsYXNzPVwiY29sLTEyIG10LTRcIiBjZGtEcm9wTGlzdCAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3BJdGVtcyhjb250YWN0VXNIdWJzcG90SXRlbXMsICRldmVudClcIj5cbiAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItNFwiPkh1YnNwb3QgRW1iZWRzPC9oNT5cblxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGh1YiBvZiBjb250YWN0VXNIdWJzcG90SXRlbXMuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicm93IGJvcmRlciBwLTMgbWItMlwiXG4gICAgICAgICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJJRFwiIGNsYXNzPVwiY29sLW1kLTVcIiBuYW1lPVwiaWRcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImlkXCIgLz5cbiAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBsYWJlbD1cIlBvc2l0aW9uXCIgY2xhc3M9XCJjb2wtbWQtNlwiIG5hbWU9XCJwb3NpdGlvblwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwicG9zaXRpb25cIiAvPlxuICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xIGQtZmxleCBhbGlnbi1pdGVtcy1zdGFydCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG10LTNcIj5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS1iYXJzIGN1cnNvci1tb3ZlXCJcbiAgICAgICAgICAgICAgICAgIGNka0RyYWdIYW5kbGVcbiAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJEcmFnIHRvIHJlb3JkZXJcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJEaXZcIiBjbGFzcz1cImNvbC0xMFwiIG5hbWU9XCJkaXZcIj5cbiAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgIHJvd3M9XCI1XCJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGl2XCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWydkaXYnXT8uZXJyb3JzIH1cIlxuICAgICAgICAgICAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLXRyYXNoIGRlbGV0ZS1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUh1YnNwb3RJdGVtKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwicmVtb3ZlSHVic3BvdEl0ZW0oaSlcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJyZW1vdmVIdWJzcG90SXRlbShpKVwiXG4gICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJSZW1vdmUgSHVic3BvdCBFbWJlZFwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuPC9pPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zdGFydCBtdC0yXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtXCIgKGNsaWNrKT1cImFkZEh1YnNwb3RJdGVtKClcIj5cbiAgICAgICAgICAgICAgICAgICsgQWRkIEh1YnNwb3QgRW1iZWRcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3AtYWNjb3JkaW9uVGFiPlxuXG5cbiAgICAgICAgPHAtYWNjb3JkaW9uVGFiIFtoZWFkZXJdPVwiJ0Jvb2sgYSBEZW1vIFNlY3Rpb24nXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC00XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XG4gICAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1iLTNcIj57eyAnQWRtaW4uRG9tYWluQ29uZmlnLkJvb2tEZW1vTGlua3MnIHwgdHJhbnNsb2NvIH19PC9oND5cbiAgICAgICAgICAgICAgPGRpdiBmb3JtR3JvdXBOYW1lPVwiYm9va19kZW1vXCI+XG4gICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBsYWJlbD1cIlRpdGxlXCIgbmFtZT1cInRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgLz5cbiAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJEZXNjcmlwdGlvblwiIG5hbWU9XCJkZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcHRpb25cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIC8+XG4gICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJpdGVtc1wiIGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcEJvb2tEZW1vTGlua3MoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbGluayBvZiBmWydib29rX2RlbW8nXS5nZXQoJ2l0ZW1zJylbJ2NvbnRyb2xzJ107IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJpXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyb3cgbWItMyBib3JkZXIgcC0zIGFsaWduLWl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIGNka0RyYWdcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBsYWJlbD1cIkxpbmsgVGl0bGVcIiBuYW1lPVwidGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiTGluayBVUkxcIiBuYW1lPVwidXJsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInVybFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMSBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJSZW1vdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUJvb2tEZW1vTGluayhpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJyZW1vdmVCb29rRGVtb0xpbmsoaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwicmVtb3ZlQm9va0RlbW9MaW5rKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtdHJhc2ggZGVsZXRlLWljb24gdGV4dC1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgbXQtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLWJhcnMgY3Vyc29yLW1vdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2RrRHJhZ0hhbmRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIkRyYWcgdG8gcmVvcmRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG10LTIgbWItMlwiIChjbGljayk9XCJhZGRCb29rRGVtb0xpbmsoKVwiPlxuICAgICAgICAgICAgICAgICAgICArIEFkZCBCb29rIERlbW8gTGlua1xuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvcC1hY2NvcmRpb25UYWI+XG5cblxuICAgICAgICA8cC1hY2NvcmRpb25UYWIgW2hlYWRlcl09XCInTmF2YmFyIFNlY3Rpb24nXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC0zIG1iLTRcIiBmb3JtR3JvdXBOYW1lPVwibmF2YmFyXCI+XG4gICAgICAgICAgICA8aDQgY2xhc3M9XCJtYi0zXCI+TmF2YmFyIFNlY3Rpb248L2g0PlxuXG4gICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJpdGVtc1wiIGNsYXNzPVwiY29sLTEyXCIgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wSXRlbXMobmF2YmFySXRlbXMsICRldmVudClcIj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIG5hdmJhckl0ZW1zLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJvdyBtYi0zXCJcbiAgICAgICAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBsYWJlbD1cIlRpdGxlXCIgY2xhc3M9XCJjb2wtbWQtNVwiIG5hbWU9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiUGF0aFwiIGNsYXNzPVwiY29sLW1kLTVcIiBuYW1lPVwicGF0aFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInBhdGhcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMSBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1zdGFydCBtdC0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS10cmFzaCBkZWxldGUtaWNvbiB0ZXh0LWRhbmdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZU5hdmJhckl0ZW0oaSlcIlxuICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInJlbW92ZU5hdmJhckl0ZW0oaSlcIlxuICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cInJlbW92ZU5hdmJhckl0ZW0oaSlcIlxuICAgICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJSZW1vdmUgTmF2YmFyIEl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLXN0YXJ0IG10LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLWJhcnMgY3Vyc29yLW1vdmVcIlxuICAgICAgICAgICAgICAgICAgICAgIGNka0RyYWdIYW5kbGVcbiAgICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiRHJhZyB0byByZW9yZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC0xMiBtdC0zXCJcbiAgICAgICAgICAgICAgICAgIGZvcm1BcnJheU5hbWU9XCJzdWJ0aXRsZXNcIlxuICAgICAgICAgICAgICAgICAgY2RrRHJvcExpc3RcbiAgICAgICAgICAgICAgICAgIFtjZGtEcm9wTGlzdERhdGFdPVwiZ2V0TmF2YmFyU3VidGl0bGVzKGkpLmNvbnRyb2xzXCJcbiAgICAgICAgICAgICAgICAgIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcE5hdmJhclN1YnRpdGxlcyhpLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzdWIgb2YgZ2V0TmF2YmFyU3VidGl0bGVzKGkpLmNvbnRyb2xzOyBsZXQgaiA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Hcm91cE5hbWVdPVwialwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm93IGJvcmRlciBwLTMgbWItMiBhbGlnbi1pdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJTdWJ0aXRsZSBUaXRsZVwiIG5hbWU9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJTdWJ0aXRsZSBQYXRoXCIgbmFtZT1cInBhdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwicGF0aFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMSBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1zdGFydCBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtdHJhc2ggZGVsZXRlLWljb24gdGV4dC1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVN1YnRpdGxlKGksIGopXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInJlbW92ZVN1YnRpdGxlKGksIGopXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cInJlbW92ZVN1YnRpdGxlKGksIGopXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJSZW1vdmUgU3VidGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS1iYXJzIGN1cnNvci1tb3ZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNka0RyYWdIYW5kbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJEcmFnIHRvIHJlb3JkZXIgc3VidGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXByaW1hcnkgbXQtMlwiIChjbGljayk9XCJhZGRTdWJ0aXRsZShpKVwiPlxuICAgICAgICAgICAgICAgICAgICArIEFkZCBTdWJ0aXRsZVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG10LTIgbWItMlwiIChjbGljayk9XCJhZGROYXZiYXJJdGVtKClcIj5cbiAgICAgICAgICAgICAgICArIEFkZCBOYXZiYXIgSXRlbVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3AtYWNjb3JkaW9uVGFiPlxuXG5cbiAgICAgICAgPHAtYWNjb3JkaW9uVGFiIFtoZWFkZXJdPVwiJ0Zvb3RlciBMaW5rcyBTZWN0aW9uJ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtMyBtYi00XCIgZm9ybUdyb3VwTmFtZT1cImZvb3Rlcl9saW5rc1wiPlxuICAgICAgICAgICAgPGg0IGNsYXNzPVwibWItM1wiPkZvb3RlciBMaW5rcyBTZWN0aW9uPC9oND5cblxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBmb3JtQXJyYXlOYW1lPVwiaXRlbXNcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNvbC0xMlwiXG4gICAgICAgICAgICAgIGNka0Ryb3BMaXN0XG4gICAgICAgICAgICAgIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcEl0ZW1zKGZvb3RlckxpbmtzSXRlbXMsICRldmVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZm9vdGVyTGlua3NJdGVtcy5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJyb3cgbWItM1wiXG4gICAgICAgICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cblxuICAgICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBsYWJlbD1cIlRpdGxlXCIgY2xhc3M9XCJjb2wtbWQtNVwiIG5hbWU9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiUGF0aFwiIGNsYXNzPVwiY29sLW1kLTVcIiBuYW1lPVwicGF0aFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInBhdGhcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtc3RhcnQgbXQtMVwiPlxuICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtdHJhc2ggZGVsZXRlLWljb24gdGV4dC1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVGb290ZXJMaW5rSXRlbShpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwicmVtb3ZlRm9vdGVyTGlua0l0ZW0oaSlcIlxuICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cInJlbW92ZUZvb3RlckxpbmtJdGVtKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiUmVtb3ZlIEZvb3RlciBJdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEgZC1mbGV4IGFsaWduLWl0ZW1zLXN0YXJ0IGp1c3RpZnktY29udGVudC1lbmQgbXQtMVwiPlxuICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtYmFycyBjdXJzb3ItbW92ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgY2RrRHJhZ0hhbmRsZVxuICAgICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJEcmFnIHRvIHJlb3JkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtMTIgbXQtM1wiXG4gICAgICAgICAgICAgICAgICBmb3JtQXJyYXlOYW1lPVwic3VidGl0bGVzXCJcbiAgICAgICAgICAgICAgICAgIGNka0Ryb3BMaXN0XG4gICAgICAgICAgICAgICAgICBbY2RrRHJvcExpc3REYXRhXT1cImdldEZvb3RlclN1YnRpdGxlcyhpKS5jb250cm9sc1wiXG4gICAgICAgICAgICAgICAgICAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3BGb290ZXJTdWJ0aXRsZXMoaSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgc3ViIG9mIGdldEZvb3RlclN1YnRpdGxlcyhpKS5jb250cm9sczsgbGV0IGogPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBOYW1lXT1cImpcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdyBib3JkZXIgcC0zIG1iLTIgYWxpZ24taXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgICAgICAgICAgPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJTdWJ0aXRsZSBUaXRsZVwiIG5hbWU9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJTdWJ0aXRsZSBQYXRoXCIgbmFtZT1cInBhdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwicGF0aFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cblxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMSBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1zdGFydCBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtdHJhc2ggZGVsZXRlLWljb24gdGV4dC1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUZvb3RlclN1YnRpdGxlKGksIGopXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInJlbW92ZUZvb3RlclN1YnRpdGxlKGksIGopXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cInJlbW92ZUZvb3RlclN1YnRpdGxlKGksIGopXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJSZW1vdmUgU3VidGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtYmFycyBjdXJzb3ItbW92ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjZGtEcmFnSGFuZGxlXG4gICAgICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiRHJhZyB0byByZW9yZGVyIHN1YnRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1wcmltYXJ5IG10LTJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkRm9vdGVyU3VidGl0bGUoaSlcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICArIEFkZCBTdWJ0aXRsZVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBtdC0yIG1iLTJcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRGb290ZXJMaW5rSXRlbSgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICsgQWRkIEZvb3RlciBMaW5rXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvcC1hY2NvcmRpb25UYWI+XG5cblxuXG5cblxuICAgICAgICA8cC1hY2NvcmRpb25UYWIgW2hlYWRlcl09XCInR3VpZGVzIFNlY3Rpb24nXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC0zIG1iLTRcIiBmb3JtR3JvdXBOYW1lPVwiZ3VpZGVzXCI+XG4gICAgICAgICAgICA8aDQgY2xhc3M9XCJtYi0zXCI+R3VpZGVzIFNlY3Rpb248L2g0PlxuXG4gICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJpdGVtc1wiIGNsYXNzPVwiY29sLTEyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wSXRlbXMoZ3VpZGVzSXRlbXMsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBndWlkZXNJdGVtcy5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJpXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyIHAtMyBtYi0zXCJcbiAgICAgICAgICAgICAgICAgIGNka0RyYWdcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLXN0YXJ0XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBsYWJlbD1cIlRpdGxlXCIgY2xhc3M9XCJjb2wtbWQtNVwiIG5hbWU9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiQnV0dG9uIFRleHRcIiBjbGFzcz1cImNvbC1tZC02XCIgbmFtZT1cImJ1dHRvbl90ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJidXR0b25fdGV4dFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEgZC1mbGV4IGFsaWduLWl0ZW1zLXN0YXJ0IGp1c3RpZnktY29udGVudC1lbmQgbXQtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLWJhcnMgY3Vyc29yLW1vdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2RrRHJhZ0hhbmRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIkRyYWcgdG8gcmVvcmRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIGxhYmVsPVwiSW1hZ2UgVVJMXCIgY2xhc3M9XCJjb2wtbWQtNlwiIG5hbWU9XCJpbWFnZV91cmxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImltYWdlX3VybFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJHdWlkZSBVUkxcIiBjbGFzcz1cImNvbC1tZC02XCIgbmFtZT1cImd1aWRlX3VybFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiZ3VpZGVfdXJsXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJEZXNjcmlwdGlvblwiIGNsYXNzPVwiY29sLW1kLTExXCIgbmFtZT1cImRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dzPVwiNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ2Rlc2NyaXB0aW9uJ10/LmVycm9ycyB9XCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xIGQtZmxleCBhbGlnbi1pdGVtcy1zdGFydCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIG10LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS10cmFzaCBkZWxldGUtaWNvbiB0ZXh0LWRhbmdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlR3VpZGVJdGVtKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInJlbW92ZUd1aWRlSXRlbShpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJyZW1vdmVHdWlkZUl0ZW0oaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIlJlbW92ZSBHdWlkZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXN0YXJ0IG10LTJcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJhZGRHdWlkZUl0ZW0oKVwiPlxuICAgICAgICAgICAgICAgICAgKyBBZGQgR3VpZGVcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9wLWFjY29yZGlvblRhYj5cblxuXG5cbiAgICAgICAgPHAtYWNjb3JkaW9uVGFiIFtoZWFkZXJdPVwiJ0FCIFRlc3RzIFNlY3Rpb24nXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC0zIG1iLTRcIj5cbiAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1iLTNcIj5BQiBUZXN0czwvaDQ+XG4gICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJhYl90ZXN0c1wiIGNsYXNzPVwiY29sLTEyXCIgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wSXRlbXMoYWJUZXN0cywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGFiVGVzdCBvZiBhYlRlc3RzLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJvdyBtYi0zIGJvcmRlciBwLTNcIlxuICAgICAgICAgICAgICAgIGNka0RyYWdcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJEZXNjcmlwdGlvblwiIGNsYXNzPVwiY29sLW1kLTVcIiBuYW1lPVwiZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcHRpb25cIiAvPlxuICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBsYWJlbD1cIkV4cGVyaW1lbnQgTmFtZVwiIGNsYXNzPVwiY29sLW1kLTZcIiBuYW1lPVwiZXhwZXJpbWVudF9uYW1lXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImV4cGVyaW1lbnRfbmFtZVwiIC8+XG4gICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMSBkLWZsZXggYWxpZ24taXRlbXMtc3RhcnQganVzdGlmeS1jb250ZW50LWVuZCBtdC0xXCI+XG4gICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLWJhcnMgY3Vyc29yLW1vdmVcIlxuICAgICAgICAgICAgICAgICAgICBjZGtEcmFnSGFuZGxlXG4gICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJEcmFnIHRvIHJlb3JkZXJcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgbGFiZWw9XCJEQiBTaGFyZFwiIGNsYXNzPVwiY29sLW1kLTZcIiBuYW1lPVwiZGJfc2hhcmRcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiZGJfc2hhcmRcIiAvPlxuICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBsYWJlbD1cIk1pY3Jvc2VydmljZSBOYW1lXCIgY2xhc3M9XCJjb2wtbWQtNlwiIG5hbWU9XCJtaWNyb3NlcnZpY2VfbmFtZVwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJtaWNyb3NlcnZpY2VfbmFtZVwiIC8+XG4gICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIHRleHQtZW5kIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtdHJhc2ggZGVsZXRlLWljb24gdGV4dC1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlQWJUZXN0KGkpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwicmVtb3ZlQWJUZXN0KGkpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwicmVtb3ZlQWJUZXN0KGkpXCJcbiAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIlJlbW92ZSBBQiBUZXN0XCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXN0YXJ0IG10LTJcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJhZGRBYlRlc3QoKVwiPisgQWRkIEFCIFRlc3Q8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9wLWFjY29yZGlvblRhYj5cblxuXG5cblxuXG4gICAgICAgIDxwLWFjY29yZGlvblRhYiBbaGVhZGVyXT1cIidDb21pbmcgc29vbiBwYWdlcyAtIFN1YnNjcmliZSB0byBuZXdzbGV0dGVyIChUTyBESVNDT05USU5VRSknXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgIDxwPkNvbWluZ1Nvb24gUGFnZXMgd2lsbCBlbmFibGUgdXNlcnMgdG8gc3Vic2NyaWJlIHRvIE5ld3NsZXR0ZXJzIGFuZCBhcmUgYWNjZXNzaWJsZSBhdCB0aGUgaW50ZXJuYWwgcGF0aHNcbiAgICAgICAgICAgICAgL2pvaW4vY3MxLCAvam9pbi9jczIsIGV0Yy48L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZW5kXCIgKm5nSWY9XCJzaGFyZFVybFwiPlxuICAgICAgICAgICAgPHNwYW4+U2VlIHRoZSBsaXZlIHBhZ2UgPHNwYW4gY2xhc3M9XCJ0b29sdGlwLXdyYXAgbXMtMVwiIFthcHBlbmRUb109XCInYm9keSdcIlxuICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCInQWRtaW4uRG9tYWluQ29uZmlnLlRvb2x0aXAuU2VlTGl2ZUNzJyB8IHRyYW5zbG9jb1wiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWluZm8tY2lyY2xlXCI+PC9pPlxuICAgICAgICAgICAgICA8L3NwYW4+IDogPGEgW2hyZWZdPVwic2hhcmRVcmwgKyAnL2pvaW4vY3MxJ1wiIHRhcmdldD1cIl9ibGFua1wiPnt7IHNoYXJkVXJsIH19L2pvaW4vY3MxPC9hPjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1zbS0zXCI+XG4gICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW2xhYmVsXT1cIidBZG1pbi5Eb21haW5Db25maWcuQ3NQcm9kdWN0JyB8IHRyYW5zbG9jb1wiIFtzaG93VG9vbHRpcF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLkRvbWFpbkNvbmZpZy5Ub29sdGlwLkNzUHJvZHVjdCcgfCB0cmFuc2xvY29cIiBuYW1lPVwiY3NfcHJvZHVjdF9pZFwiPlxuICAgICAgICAgICAgICAgIDxwLWF1dG9Db21wbGV0ZSBbc3VnZ2VzdGlvbnNdPVwicHJvZHVjdHNMaXN0XCIgZm9ybUNvbnRyb2xOYW1lPVwiY3NfcHJvZHVjdF9pZFwiIGRhdGFLZXk9XCJpZFwiIGZpZWxkPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICBbZHJvcGRvd25dPVwidHJ1ZVwiIFtkZWxheV09XCIxMDAwXCIgKGNvbXBsZXRlTWV0aG9kKT1cInNlYXJjaFByb2R1Y3QoJGV2ZW50KVwiIHN0eWxlQ2xhc3M9XCJ3LTEwMFwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBQcm9kdWN0XCIgW2lucHV0U3R5bGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmdldCgnY3NfcHJvZHVjdF9pZCcpLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uZ2V0KCdjc19wcm9kdWN0X2lkJykuaW52YWxpZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8geyBib3JkZXI6ICcxcHggc29saWQgI2ZmNTg2YicgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogeyBib3JkZXI6ICcxcHggc29saWQgZ3JheScgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBbbXVsdGlwbGVdPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgICA8L3AtYXV0b0NvbXBsZXRlPlxuICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tM1wiPlxuICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtsYWJlbF09XCInQWRtaW4uRG9tYWluQ29uZmlnLkNzQ3JtU291cmNlSWQnIHwgdHJhbnNsb2NvXCIgbmFtZT1cImNzX2NybV9zb3VyY2VfaWRcIlxuICAgICAgICAgICAgICAgIFtzaG93VG9vbHRpcF09XCJ0cnVlXCIgW3Rvb2x0aXBUZXh0XT1cIidBZG1pbi5Eb21haW5Db25maWcuVG9vbHRpcC5Dc0NybVNvdXJjZUlkJyB8IHRyYW5zbG9jb1wiPlxuICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImNybVNvdXJjZXNMaXN0XCIgZm9ybUNvbnRyb2xOYW1lPVwiY3NfY3JtX3NvdXJjZV9pZFwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ2NzX2NybV9zb3VyY2VfaWQnXT8uZXJyb3JzIH1cIiBbcGxhY2Vob2xkZXJdPVwiJ1NlbGVjdCBDUk0gU291cmNlJ1wiXG4gICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cImlkXCIgb3B0aW9uTGFiZWw9XCJuYW1lXCI+XG4gICAgICAgICAgICAgICAgPC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tM1wiPlxuICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtsYWJlbF09XCInQWRtaW4uRG9tYWluQ29uZmlnLkNzUGRmU291cmNlSWQnIHwgdHJhbnNsb2NvXCIgbmFtZT1cImNzX3BkZl9zb3VyY2VfaWRcIlxuICAgICAgICAgICAgICAgIFtzaG93VG9vbHRpcF09XCJ0cnVlXCIgW3Rvb2x0aXBUZXh0XT1cIidBZG1pbi5Eb21haW5Db25maWcuVG9vbHRpcC5Dc1BkZlNvdXJjZUlkJyB8IHRyYW5zbG9jb1wiPlxuICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImNybVNvdXJjZXNMaXN0XCIgZm9ybUNvbnRyb2xOYW1lPVwiY3NfcGRmX3NvdXJjZV9pZFwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ2NzX3BkZl9zb3VyY2VfaWQnXT8uZXJyb3JzIH1cIiBbcGxhY2Vob2xkZXJdPVwiJ1NlbGVjdCBDUk0gU291cmNlJ1wiXG4gICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cImlkXCIgb3B0aW9uTGFiZWw9XCJuYW1lXCI+XG4gICAgICAgICAgICAgICAgPC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tM1wiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tM1wiPlxuICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtsYWJlbF09XCInQWRtaW4uRG9tYWluQ29uZmlnLkNzVmlkZW9VcmwnIHwgdHJhbnNsb2NvXCIgbmFtZT1cImNzX3ZpZGVvX3VybFwiIFtzaG93VG9vbHRpcF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLkRvbWFpbkNvbmZpZy5Ub29sdGlwLkNzVmlkZW9VcmwnIHwgdHJhbnNsb2NvXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJjc192aWRlb191cmxcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWydjc192aWRlb191cmwnXS5lcnJvcnMgfVwiIC8+XG4gICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1zbS0zXCI+XG4gICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW2xhYmVsXT1cIidBZG1pbi5Eb21haW5Db25maWcuQ3NCb29rRGVtb1VybCcgfCB0cmFuc2xvY29cIiBuYW1lPVwiY3NfYm9va19kZW1vX3VybFwiXG4gICAgICAgICAgICAgICAgW3Nob3dUb29sdGlwXT1cInRydWVcIiBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLkRvbWFpbkNvbmZpZy5Ub29sdGlwLkNzQm9va0RlbW9VcmwnIHwgdHJhbnNsb2NvXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJjc19ib29rX2RlbW9fdXJsXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnY3NfYm9va19kZW1vX3VybCddLmVycm9ycyB9XCIgLz5cbiAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cbiAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbbGFiZWxdPVwiJ0FkbWluLkRvbWFpbkNvbmZpZy5Dc0N0YUlmcmFtZScgfCB0cmFuc2xvY29cIiBuYW1lPVwiY3NfY3RhX2lmcmFtZVwiXG4gICAgICAgICAgICAgICAgW3Nob3dUb29sdGlwXT1cInRydWVcIiBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLkRvbWFpbkNvbmZpZy5Ub29sdGlwLkNzQ3RhSWZyYW1lJyB8IHRyYW5zbG9jb1wiPlxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJvd3M9XCIzXCIgZm9ybUNvbnRyb2xOYW1lPVwiY3NfY3RhX2lmcmFtZVwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ2NzX2N0YV9pZnJhbWUnXS5lcnJvcnMgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XG4gICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW2xhYmVsXT1cIidBZG1pbi5Eb21haW5Db25maWcuQ3NKb2luTWVzc2FnZScgfCB0cmFuc2xvY29cIiBuYW1lPVwiY3Nfam9pbl9tZXNzYWdlXCJcbiAgICAgICAgICAgICAgICBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiIFt0b29sdGlwVGV4dF09XCInQWRtaW4uRG9tYWluQ29uZmlnLlRvb2x0aXAuQ3NKb2luTWVzc2FnZScgfCB0cmFuc2xvY29cIj5cbiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByb3dzPVwiM1wiIGZvcm1Db250cm9sTmFtZT1cImNzX2pvaW5fbWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ2NzX2pvaW5fbWVzc2FnZSddLmVycm9ycyB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cbiAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbbGFiZWxdPVwiJ0FkbWluLkRvbWFpbkNvbmZpZy5Dc1BkZkRvd25sb2FkVGV4dCcgfCB0cmFuc2xvY29cIiBuYW1lPVwiY3NfcGRmX2Rvd25sb2FkX3RleHRcIlxuICAgICAgICAgICAgICAgIFtzaG93VG9vbHRpcF09XCJ0cnVlXCIgW3Rvb2x0aXBUZXh0XT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQWRtaW4uRG9tYWluQ29uZmlnLlRvb2x0aXAuQ3NQZGZEb3dubG9hZFRleHQnIHwgdHJhbnNsb2NvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcm93cz1cIjNcIiBmb3JtQ29udHJvbE5hbWU9XCJjc19wZGZfZG93bmxvYWRfdGV4dFwiIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ2NzX3BkZl9kb3dubG9hZF90ZXh0J10uZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RleHRhcmVhPlxuICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiBtYXRjaEhlaWdodD1cImNhcmRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY3NfaW1hZ2VcIj57eyAnQWRtaW4uRG9tYWluQ29uZmlnLkNzSW1hZ2UnIHwgdHJhbnNsb2NvIH19IDxzcGFuIGNsYXNzPVwiaW5mby1jaXJjbGVcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9vbHRpcHRleHQgZ3JhZGllbnQtY3VzdG9tLWJyYW5kaW5nXCI+e3sgJ0FkbWluLkRvbWFpbkNvbmZpZy5Ub29sdGlwLkNzSW1hZ2UnIHwgdHJhbnNsb2NvXG4gICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPHB3LWN1c3RvbS11cGxvYWRlciAoc2F2ZUV2ZW50KT1cIm9uU2F2ZUZpbGUoJGV2ZW50KVwiIFthc3BlY3RSYXRpb109XCInY3VzdG9tJ1wiIFt0aXRsZV09XCInQ3MgSW1hZ2UnXCJcbiAgICAgICAgICAgICAgICBbY29udHJvbE5hbWVdPVwiJ2NzX2ltYWdlJ1wiIFtwcmV2aWV3RGF0YV09XCJkYXRhWydjc19pbWFnZSddXCI+XG4gICAgICAgICAgICAgIDwvcHctY3VzdG9tLXVwbG9hZGVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNzX2ltYWdlMlwiPnt7ICdBZG1pbi5Eb21haW5Db25maWcuQ3NJbWFnZTInIHwgdHJhbnNsb2NvIH19IDxzcGFuIGNsYXNzPVwiaW5mby1jaXJjbGVcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9vbHRpcHRleHQgZ3JhZGllbnQtY3VzdG9tLWJyYW5kaW5nXCI+e3sgJ0FkbWluLkRvbWFpbkNvbmZpZy5Ub29sdGlwLkNzSW1hZ2UyJyB8IHRyYW5zbG9jb1xuICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxwdy1jdXN0b20tdXBsb2FkZXIgKHNhdmVFdmVudCk9XCJvblNhdmVGaWxlKCRldmVudClcIiBbYXNwZWN0UmF0aW9dPVwiJ2N1c3RvbSdcIiBbdGl0bGVdPVwiJ0NzIEltYWdlMidcIlxuICAgICAgICAgICAgICAgIFtjb250cm9sTmFtZV09XCInY3NfaW1hZ2UyJ1wiIFtwcmV2aWV3RGF0YV09XCJkYXRhWydjc19pbWFnZTInXVwiPlxuICAgICAgICAgICAgICA8L3B3LWN1c3RvbS11cGxvYWRlcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjc19wZGZfaW1hZ2VcIj57eyAnQWRtaW4uRG9tYWluQ29uZmlnLkNzUGRmSW1hZ2UnIHwgdHJhbnNsb2NvIH19IDxzcGFuIGNsYXNzPVwiaW5mby1jaXJjbGVcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9vbHRpcHRleHQgZ3JhZGllbnQtY3VzdG9tLWJyYW5kaW5nXCI+e3sgJ0FkbWluLkRvbWFpbkNvbmZpZy5Ub29sdGlwLkNzUGRmSW1hZ2UnIHwgdHJhbnNsb2NvXG4gICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPHB3LWN1c3RvbS11cGxvYWRlciAoc2F2ZUV2ZW50KT1cIm9uU2F2ZUZpbGUoJGV2ZW50KVwiIFthc3BlY3RSYXRpb109XCInY3VzdG9tJ1wiIFt0aXRsZV09XCInQ3MgUGRmIEltYWdlJ1wiXG4gICAgICAgICAgICAgICAgW2NvbnRyb2xOYW1lXT1cIidjc19wZGZfaW1hZ2UnXCIgW3ByZXZpZXdEYXRhXT1cImRhdGFbJ2NzX3BkZl9pbWFnZSddXCI+XG4gICAgICAgICAgICAgIDwvcHctY3VzdG9tLXVwbG9hZGVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNzX2ltYWdlX2JnXCI+e3sgJ0FkbWluLkRvbWFpbkNvbmZpZy5Dc0ltYWdlQmcnIHwgdHJhbnNsb2NvIH19IDxzcGFuIGNsYXNzPVwiaW5mby1jaXJjbGVcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9vbHRpcHRleHQgZ3JhZGllbnQtY3VzdG9tLWJyYW5kaW5nXCI+e3sgJ0FkbWluLkRvbWFpbkNvbmZpZy5Ub29sdGlwLkNzSW1hZ2VCZycgfCB0cmFuc2xvY29cbiAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8cHctY3VzdG9tLXVwbG9hZGVyIChzYXZlRXZlbnQpPVwib25TYXZlRmlsZSgkZXZlbnQpXCIgW2FzcGVjdFJhdGlvXT1cIidjdXN0b20nXCIgW3RpdGxlXT1cIidDcyBQZGYgSW1hZ2UgQmcnXCJcbiAgICAgICAgICAgICAgICBbY29udHJvbE5hbWVdPVwiJ2NzX2ltYWdlX2JnJ1wiIFtwcmV2aWV3RGF0YV09XCJkYXRhWydjc19pbWFnZV9iZyddXCI+XG4gICAgICAgICAgICAgIDwvcHctY3VzdG9tLXVwbG9hZGVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNzX2ltYWdlX2JnMlwiPnt7ICdBZG1pbi5Eb21haW5Db25maWcuQ3NJbWFnZUJnMicgfCB0cmFuc2xvY28gfX0gPHNwYW4gY2xhc3M9XCJpbmZvLWNpcmNsZVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b29sdGlwdGV4dCBncmFkaWVudC1jdXN0b20tYnJhbmRpbmdcIj57eyAnQWRtaW4uRG9tYWluQ29uZmlnLlRvb2x0aXAuQ3NJbWFnZUJnMicgfCB0cmFuc2xvY29cbiAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8cHctY3VzdG9tLXVwbG9hZGVyIChzYXZlRXZlbnQpPVwib25TYXZlRmlsZSgkZXZlbnQpXCIgW2FzcGVjdFJhdGlvXT1cIidjdXN0b20nXCIgW3RpdGxlXT1cIidDcyBQZGYgSW1hZ2UgQmcyJ1wiXG4gICAgICAgICAgICAgICAgW2NvbnRyb2xOYW1lXT1cIidjc19pbWFnZV9iZzInXCIgW3ByZXZpZXdEYXRhXT1cImRhdGFbJ2NzX2ltYWdlX2JnMiddXCI+XG4gICAgICAgICAgICAgIDwvcHctY3VzdG9tLXVwbG9hZGVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvcC1hY2NvcmRpb25UYWI+XG4gICAgICA8L3AtYWNjb3JkaW9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNvbC0xMiB0ZXh0LWVuZCBtdC0zXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1kZWZhdWx0IG1lLTJcIlxuICAgICAgICAoY2xpY2spPVwiYmFjaygpXCI+XG4gICAgICAgIHt7ICdCdXR0b24uQ2FuY2VsJyB8IHRyYW5zbG9jbyB9fVxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBbYnV0dG9uQnVzeV09XCJidXR0b25CdXN5XCJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIj57eyAnQnV0dG9uLlN1Ym1pdCcgfCB0cmFuc2xvY28gfX08L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9mb3JtPlxuPC9uZy1jb250YWluZXI+XG48ZGl2ICpuZ0lmPVwiIWRhdGE/Lmhvc3RfbmFtZSAmJiAhaXNMb2FkaW5nXCI+XG4gIDxwdy1uby1kYXRhIFt3aXRoSW1hZ2VdPVwidHJ1ZVwiIFttZXNzYWdlXT1cIidBZG1pbi5Eb21haW5Db25maWcuRW5hYmxlQ29uZmlnVGFiJyB8IHRyYW5zbG9jb1wiPiA8L3B3LW5vLWRhdGE+XG48L2Rpdj5cblxuXG48bmctdGVtcGxhdGUgI3BhcnRuZXJDcm9wcGVyIGxldC1tb2RhbD5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+VXBsb2FkIFBhcnRuZXIgSW1hZ2U8L2g1PlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPjwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICA8c21hbGw+WW91IGNhbiB1cGxvYWQgSlBHLCBQTkcsIG9yIEdJRiBmaWxlcy4gQXZvaWQgaW1hZ2VzIHdpdGggY2VsZWJyaXRpZXMsIG51ZGl0eSwgb3IgYXJ0d29yay48L3NtYWxsPlxuICAgIDxwdy1pbWFnZS1jcm9wcGVyXG4gICAgICBhc3BlY3RSYXRpbz1cImF1dG9cIlxuICAgICAgKGltYWdlU2VsZWN0aW9uRXZlbnQpPVwib25QYXJ0bmVySW1hZ2VTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgIChjbG9zZUV2ZW50KT1cIm9uQ2xvc2VQYXJ0bmVyTW9kYWwoKVwiXG4gICAgPjwvcHctaW1hZ2UtY3JvcHBlcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19