@acorex/platform 18.1.2 → 18.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/common/lib/schema/widgets/text/largetext-widget-edit.component.d.ts +1 -1
- package/esm2022/common/lib/schema/widgets/text/largetext-widget-edit.component.mjs +15 -16
- package/esm2022/layout/builder/lib/builder/widget-catalog.mjs +2 -1
- package/esm2022/layout/builder/lib/builder/widget.types.mjs +4 -2
- package/esm2022/layout/designer/lib/designer/index.mjs +5 -4
- package/esm2022/layout/entity/lib/entity.module.mjs +4 -3
- package/esm2022/layout/entity/lib/widgets/lookup-widget/lookup-widget-edit.component.mjs +22 -5
- package/esm2022/layout/entity/lib/widgets/widget-selector/index.mjs +4 -0
- package/esm2022/layout/entity/lib/widgets/widget-selector/widget-selector-widget-edit.component.mjs +130 -0
- package/esm2022/layout/entity/lib/widgets/widget-selector/widget-selector-widget-view.component.mjs +18 -0
- package/esm2022/layout/entity/lib/widgets/widget-selector/widget-selector-widget.config.mjs +19 -0
- package/esm2022/layouts/lib/admin/entity-layout/workflows/delete-entity.workflow.mjs +2 -1
- package/esm2022/themes/default/lib/layouts/entity-layouts/entity-detail-list-view/entity-detail-list-view.component.mjs +3 -3
- package/esm2022/themes/default/lib/layouts/entity-layouts/entity-master-single-view/entity-master-single-view.component.mjs +2 -2
- package/esm2022/themes/default/lib/layouts/entity-layouts/index.mjs +1 -2
- package/esm2022/themes/shared/acorex-platform-themes-shared.mjs +5 -0
- package/esm2022/themes/shared/index.mjs +6 -0
- package/esm2022/themes/shared/lib/comments/comment-list-view.component.mjs +421 -0
- package/esm2022/themes/{default/lib/layouts/entity-layouts/entity-master-single-view → shared/lib}/comments/comment-lookup-popup.component.mjs +1 -1
- package/esm2022/themes/shared/lib/comments/comments.service.mjs +3 -0
- package/esm2022/themes/shared/lib/comments/comments.type.mjs +2 -0
- package/esm2022/themes/shared/lib/shared.module.mjs +16 -0
- package/esm2022/widgets/lib/widgets/editors/contact/contact-widget-edit.component.mjs +25 -8
- package/esm2022/widgets/lib/widgets/editors/large-text/large-text-widget-edit.component.mjs +32 -22
- package/esm2022/widgets/lib/widgets/editors/select/select-box-widget-edit.component.mjs +23 -11
- package/fesm2022/{acorex-platform-common-largetext-widget-edit.component-CrqPJ58V.mjs → acorex-platform-common-largetext-widget-edit.component-DD7S5j12.mjs} +15 -16
- package/fesm2022/acorex-platform-common-largetext-widget-edit.component-DD7S5j12.mjs.map +1 -0
- package/fesm2022/acorex-platform-common.mjs +1 -1
- package/fesm2022/acorex-platform-layout-builder.mjs +4 -1
- package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-designer.mjs +190 -100
- package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-entity.mjs +177 -8
- package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
- package/fesm2022/acorex-platform-layouts.mjs +1 -0
- package/fesm2022/acorex-platform-layouts.mjs.map +1 -1
- package/fesm2022/{acorex-platform-themes-default-entity-master-create-view.component-LyEomIA6.mjs → acorex-platform-themes-default-entity-master-create-view.component-Q8eTfAVx.mjs} +3 -3
- package/fesm2022/{acorex-platform-themes-default-entity-master-create-view.component-LyEomIA6.mjs.map → acorex-platform-themes-default-entity-master-create-view.component-Q8eTfAVx.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-themes-default-entity-master-list-view.component-CKRwvJTp.mjs → acorex-platform-themes-default-entity-master-list-view.component-fZ6QEYcd.mjs} +8 -8
- package/fesm2022/{acorex-platform-themes-default-entity-master-list-view.component-CKRwvJTp.mjs.map → acorex-platform-themes-default-entity-master-list-view.component-fZ6QEYcd.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-themes-default-entity-master-modify-view.component-CMRfspMB.mjs → acorex-platform-themes-default-entity-master-modify-view.component-BijYXMme.mjs} +3 -3
- package/fesm2022/{acorex-platform-themes-default-entity-master-modify-view.component-CMRfspMB.mjs.map → acorex-platform-themes-default-entity-master-modify-view.component-BijYXMme.mjs.map} +1 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-Bnrabotu.mjs +145 -0
- package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-Bnrabotu.mjs.map +1 -0
- package/fesm2022/acorex-platform-themes-default.mjs +13 -16
- package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
- package/fesm2022/acorex-platform-themes-shared.mjs +493 -0
- package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -0
- package/fesm2022/acorex-platform-widgets.mjs +94 -57
- package/fesm2022/acorex-platform-widgets.mjs.map +1 -1
- package/layout/builder/lib/builder/widget.types.d.ts +1 -0
- package/layout/designer/lib/designer/index.d.ts +4 -3
- package/layout/entity/lib/widgets/widget-selector/index.d.ts +3 -0
- package/layout/entity/lib/widgets/widget-selector/widget-selector-widget-edit.component.d.ts +25 -0
- package/layout/entity/lib/widgets/widget-selector/widget-selector-widget-view.component.d.ts +6 -0
- package/layout/entity/lib/widgets/widget-selector/widget-selector-widget.config.d.ts +7 -0
- package/package.json +19 -13
- package/themes/default/lib/layouts/entity-layouts/index.d.ts +0 -1
- package/themes/shared/README.md +3 -0
- package/themes/shared/index.d.ts +5 -0
- package/themes/{default/lib/layouts/entity-layouts/entity-master-single-view → shared/lib}/comments/comment-list-view.component.d.ts +22 -16
- package/themes/shared/lib/shared.module.d.ts +6 -0
- package/widgets/lib/widgets/editors/contact/contact-widget-edit.component.d.ts +4 -2
- package/widgets/lib/widgets/editors/large-text/large-text-widget-edit.component.d.ts +1 -3
- package/widgets/lib/widgets/editors/select/select-box-widget-edit.component.d.ts +2 -0
- package/esm2022/themes/default/lib/layouts/entity-layouts/entity-master-single-view/comments/comment-list-view.component.mjs +0 -284
- package/esm2022/themes/default/lib/layouts/entity-layouts/entity-master-single-view/comments/comments.service.mjs +0 -3
- package/esm2022/themes/default/lib/layouts/entity-layouts/entity-master-single-view/comments/comments.type.mjs +0 -2
- package/fesm2022/acorex-platform-common-largetext-widget-edit.component-CrqPJ58V.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-designer-widget-picker.component-BZryrCyh.mjs +0 -100
- package/fesm2022/acorex-platform-layout-designer-widget-picker.component-BZryrCyh.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-DhcKSyrX.mjs +0 -457
- package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-DhcKSyrX.mjs.map +0 -1
- /package/themes/{default/lib/layouts/entity-layouts/entity-master-single-view → shared/lib}/comments/comment-lookup-popup.component.d.ts +0 -0
- /package/themes/{default/lib/layouts/entity-layouts/entity-master-single-view → shared/lib}/comments/comments.service.d.ts +0 -0
- /package/themes/{default/lib/layouts/entity-layouts/entity-master-single-view → shared/lib}/comments/comments.type.d.ts +0 -0
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
import { AXCommentModule } from '@acorex/components/comment';
|
|
2
|
+
import { AXDecoratorModule } from '@acorex/components/decorators';
|
|
3
|
+
import { AXWysiwygModule } from '@acorex/components/wysiwyg';
|
|
4
|
+
import { CommonModule } from '@angular/common';
|
|
5
|
+
import { ChangeDetectionStrategy, Component, computed, inject, signal, viewChild } from '@angular/core';
|
|
6
|
+
import { FormsModule } from '@angular/forms';
|
|
7
|
+
import { ActivatedRoute, RouterModule } from '@angular/router';
|
|
8
|
+
import { AXAvatarModule } from '@acorex/components/avatar';
|
|
9
|
+
import { AXButtonModule } from '@acorex/components/button';
|
|
10
|
+
import { AXDialogService } from '@acorex/components/dialog';
|
|
11
|
+
import { AXDropdownModule } from '@acorex/components/dropdown';
|
|
12
|
+
import { AXDropdownButtonModule } from '@acorex/components/dropdown-button';
|
|
13
|
+
import { AXFormModule } from '@acorex/components/form';
|
|
14
|
+
import { AXImageModule } from '@acorex/components/image';
|
|
15
|
+
import { AXLabelModule } from '@acorex/components/label';
|
|
16
|
+
import { AXLoadingModule } from '@acorex/components/loading';
|
|
17
|
+
import { AXPopupService } from '@acorex/components/popup';
|
|
18
|
+
import { AXSelectBoxModule } from '@acorex/components/select-box';
|
|
19
|
+
import { AXSkeletonModule } from '@acorex/components/skeleton';
|
|
20
|
+
import { AXTextBoxModule } from '@acorex/components/text-box';
|
|
21
|
+
import { AXToastService } from '@acorex/components/toast';
|
|
22
|
+
import { AXFormatModule } from '@acorex/core/format';
|
|
23
|
+
import { AXPlatform } from '@acorex/core/platform';
|
|
24
|
+
import { AXPHtmlUtils } from '@acorex/platform/core';
|
|
25
|
+
import { AXPCommentLookupPopup } from './comment-lookup-popup.component';
|
|
26
|
+
import { AXPCommentService } from './comments.service';
|
|
27
|
+
import * as i0 from "@angular/core";
|
|
28
|
+
import * as i1 from "@angular/forms";
|
|
29
|
+
import * as i2 from "@angular/common";
|
|
30
|
+
import * as i3 from "@acorex/components/decorators";
|
|
31
|
+
import * as i4 from "@acorex/components/comment";
|
|
32
|
+
import * as i5 from "@acorex/components/wysiwyg";
|
|
33
|
+
import * as i6 from "@acorex/components/button";
|
|
34
|
+
import * as i7 from "@acorex/components/avatar";
|
|
35
|
+
import * as i8 from "@acorex/components/image";
|
|
36
|
+
import * as i9 from "@acorex/components/form";
|
|
37
|
+
import * as i10 from "@acorex/components/loading";
|
|
38
|
+
import * as i11 from "@acorex/components/dropdown-button";
|
|
39
|
+
import * as i12 from "@acorex/components/dropdown";
|
|
40
|
+
import * as i13 from "@acorex/core/format";
|
|
41
|
+
import * as i14 from "@acorex/components/skeleton";
|
|
42
|
+
export class AXPCommentListViewComponent {
|
|
43
|
+
constructor() {
|
|
44
|
+
this.hasCooldown = signal(false);
|
|
45
|
+
this.commentContent = signal('');
|
|
46
|
+
this.isSubmitting = signal(false);
|
|
47
|
+
this.isReplyingMode = signal(false);
|
|
48
|
+
this.isEditingMode = signal(false);
|
|
49
|
+
this.isLoading = signal(true);
|
|
50
|
+
this.failedImageIds = signal([]);
|
|
51
|
+
this.activeReplyComment = signal(undefined);
|
|
52
|
+
this.activeEditComment = signal(undefined);
|
|
53
|
+
this.wysiwygEditor = viewChild.required('w');
|
|
54
|
+
this.commentService = inject(AXPCommentService);
|
|
55
|
+
this.platform = inject(AXPlatform);
|
|
56
|
+
this.route = inject(ActivatedRoute);
|
|
57
|
+
this.popupService = inject(AXPopupService);
|
|
58
|
+
this.toastService = inject(AXToastService);
|
|
59
|
+
this.dialogService = inject(AXDialogService);
|
|
60
|
+
this.htmlUtils = inject(AXPHtmlUtils);
|
|
61
|
+
this.routeParams = this.route.snapshot;
|
|
62
|
+
this.payload = computed(() => ({
|
|
63
|
+
roomType: 'default',
|
|
64
|
+
entityId: this.routeParams.params?.['module'] + '.' + this.routeParams.params?.['entity'],
|
|
65
|
+
instanceId: this.routeParams.params?.['id'],
|
|
66
|
+
}));
|
|
67
|
+
this.comments = signal([]);
|
|
68
|
+
this.wysiwyg = viewChild('w');
|
|
69
|
+
this.wysiwygOptions = signal({
|
|
70
|
+
look: 'solid',
|
|
71
|
+
});
|
|
72
|
+
this.avatarConfig = signal({
|
|
73
|
+
color: 'primary',
|
|
74
|
+
look: 'rounded',
|
|
75
|
+
type: 'solid', // 'image' | 'text' | 'icon' | 'default'
|
|
76
|
+
});
|
|
77
|
+
this.validateContent = (content) => {
|
|
78
|
+
let isValid = true;
|
|
79
|
+
if (!content || content === '<p><br></p>') {
|
|
80
|
+
isValid = false;
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
rule: 'callback',
|
|
84
|
+
result: isValid,
|
|
85
|
+
message: isValid ? '' : 'Please fill the content',
|
|
86
|
+
value: content,
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
ngOnInit() {
|
|
91
|
+
this.loadComments();
|
|
92
|
+
this.time = Math.random() * -100000000;
|
|
93
|
+
}
|
|
94
|
+
sanitizeHtml(htmlContent) {
|
|
95
|
+
return this.htmlUtils.getSafeHTMLfromHTML(htmlContent);
|
|
96
|
+
}
|
|
97
|
+
handleImageError(imageId) {
|
|
98
|
+
this.failedImageIds.update((ids) => [...ids, imageId]);
|
|
99
|
+
}
|
|
100
|
+
checkImageExists(imageId) {
|
|
101
|
+
return !this.failedImageIds().includes(imageId);
|
|
102
|
+
}
|
|
103
|
+
extractInitials(name) {
|
|
104
|
+
const words = name.split(' ');
|
|
105
|
+
const initials = words.map((word) => word.charAt(0).toUpperCase());
|
|
106
|
+
return initials.join('');
|
|
107
|
+
}
|
|
108
|
+
async loadComments() {
|
|
109
|
+
this.isLoading.set(true);
|
|
110
|
+
const response = await this.commentService.get(this.payload());
|
|
111
|
+
this.comments.set(response.items);
|
|
112
|
+
setTimeout(() => {
|
|
113
|
+
this.isLoading.set(false);
|
|
114
|
+
}, 250);
|
|
115
|
+
}
|
|
116
|
+
editMessage(comment, reply) {
|
|
117
|
+
this.isReplyingMode.set(false);
|
|
118
|
+
this.activeReplyComment.set(undefined);
|
|
119
|
+
this.isEditingMode.set(true);
|
|
120
|
+
this.activeEditComment.set(comment);
|
|
121
|
+
const contentToEdit = reply ? reply.content : comment.content;
|
|
122
|
+
this.commentContent.set(contentToEdit);
|
|
123
|
+
document.getElementsByClassName('ql-editor')[0].innerHTML = contentToEdit;
|
|
124
|
+
this.wysiwygEditor().getHostElement().scrollIntoView({ behavior: 'smooth', block: 'start' });
|
|
125
|
+
}
|
|
126
|
+
replyMessage(comment, reply) {
|
|
127
|
+
this.isEditingMode.set(false);
|
|
128
|
+
this.activeEditComment.set(undefined);
|
|
129
|
+
this.isReplyingMode.set(true);
|
|
130
|
+
this.activeReplyComment.set(comment);
|
|
131
|
+
if (reply) {
|
|
132
|
+
const mention = `<a data-id="${reply.id}">@${reply.user.userName}</a> `;
|
|
133
|
+
this.commentContent.set(mention);
|
|
134
|
+
this.wysiwyg()?.focus();
|
|
135
|
+
document.getElementsByClassName('ql-editor')[0].innerHTML = mention;
|
|
136
|
+
}
|
|
137
|
+
this.wysiwygEditor().getHostElement().scrollIntoView({ behavior: 'smooth', block: 'start' });
|
|
138
|
+
}
|
|
139
|
+
async deleteComment(comment) {
|
|
140
|
+
const dialog = this.dialogService.open({
|
|
141
|
+
icon: 'fa-regular fa-warning',
|
|
142
|
+
content: 'Are you sure you want to delete this comment?',
|
|
143
|
+
title: 'Delete Comment',
|
|
144
|
+
type: 'danger',
|
|
145
|
+
orientation: 'horizontal',
|
|
146
|
+
buttons: [
|
|
147
|
+
{
|
|
148
|
+
text: 'Delete',
|
|
149
|
+
color: 'danger',
|
|
150
|
+
onClick: async (e) => {
|
|
151
|
+
e.handled = true;
|
|
152
|
+
e.source.text = 'Deleting...';
|
|
153
|
+
e.source.disabled = true;
|
|
154
|
+
e.source.loading = true;
|
|
155
|
+
try {
|
|
156
|
+
await this.commentService.delete({ id: comment.id });
|
|
157
|
+
this.removeMessageById(comment.id);
|
|
158
|
+
this.toastService.show({
|
|
159
|
+
content: 'Comment deleted successfully.',
|
|
160
|
+
color: 'success',
|
|
161
|
+
location: 'bottom-center',
|
|
162
|
+
closeButton: true,
|
|
163
|
+
timeOut: 3000,
|
|
164
|
+
timeOutProgress: true,
|
|
165
|
+
});
|
|
166
|
+
(this.isEditingMode() && this.activeEditComment()?.id === comment.id) || this.resetReplyEditState;
|
|
167
|
+
dialog.close();
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
this.toastService.show({
|
|
171
|
+
content: typeof error === 'string' ? error : 'Failed to delete comment!',
|
|
172
|
+
color: 'danger',
|
|
173
|
+
location: 'bottom-center',
|
|
174
|
+
closeButton: true,
|
|
175
|
+
timeOut: 3000,
|
|
176
|
+
timeOutProgress: true,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
text: 'Cancel',
|
|
183
|
+
color: 'ghost',
|
|
184
|
+
autofocus: true,
|
|
185
|
+
onClick: (e) => {
|
|
186
|
+
dialog.close();
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
],
|
|
190
|
+
closeButton: false,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
async deleteReply(comment, reply) {
|
|
194
|
+
const dialog = this.dialogService.open({
|
|
195
|
+
icon: 'fa-regular fa-warning',
|
|
196
|
+
content: 'Are you sure you want to delete this reply?',
|
|
197
|
+
title: 'Delete Reply',
|
|
198
|
+
type: 'danger',
|
|
199
|
+
orientation: 'horizontal',
|
|
200
|
+
buttons: [
|
|
201
|
+
{
|
|
202
|
+
text: 'Delete',
|
|
203
|
+
color: 'danger',
|
|
204
|
+
onClick: async (e) => {
|
|
205
|
+
e.handled = true;
|
|
206
|
+
e.source.text = 'Deleting...';
|
|
207
|
+
e.source.disabled = true;
|
|
208
|
+
e.source.loading = true;
|
|
209
|
+
try {
|
|
210
|
+
await this.commentService.delete({ id: comment.id });
|
|
211
|
+
this.removeMessageById(comment.id, reply.id);
|
|
212
|
+
this.toastService.show({
|
|
213
|
+
content: 'Comment deleted successfully.',
|
|
214
|
+
color: 'success',
|
|
215
|
+
location: 'bottom-center',
|
|
216
|
+
closeButton: true,
|
|
217
|
+
timeOut: 3000,
|
|
218
|
+
timeOutProgress: true,
|
|
219
|
+
});
|
|
220
|
+
dialog.close();
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
this.toastService.show({
|
|
224
|
+
content: typeof error === 'string' ? error : 'Failed to delete comment!',
|
|
225
|
+
color: 'danger',
|
|
226
|
+
location: 'bottom-center',
|
|
227
|
+
closeButton: true,
|
|
228
|
+
timeOut: 3000,
|
|
229
|
+
timeOutProgress: true,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
text: 'Cancel',
|
|
236
|
+
color: 'ghost',
|
|
237
|
+
autofocus: true,
|
|
238
|
+
onClick: (e) => {
|
|
239
|
+
dialog.close();
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
],
|
|
243
|
+
closeButton: false,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
resetReplyEditState() {
|
|
247
|
+
this.isEditingMode.set(false);
|
|
248
|
+
this.activeEditComment.set(undefined);
|
|
249
|
+
this.isReplyingMode.set(false);
|
|
250
|
+
this.activeReplyComment.set(undefined);
|
|
251
|
+
}
|
|
252
|
+
async toggleLike(comment, reply) {
|
|
253
|
+
if (reply) {
|
|
254
|
+
this.updateLikeStatus(comment.id, reply.id);
|
|
255
|
+
const payload = {
|
|
256
|
+
messageId: reply.id,
|
|
257
|
+
type: 'like',
|
|
258
|
+
};
|
|
259
|
+
try {
|
|
260
|
+
await this.commentService.like(payload);
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
this.updateLikeStatus(comment.id, reply.id);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
this.updateLikeStatus(comment.id);
|
|
268
|
+
const payload = {
|
|
269
|
+
messageId: comment.id,
|
|
270
|
+
type: 'like',
|
|
271
|
+
};
|
|
272
|
+
try {
|
|
273
|
+
await this.commentService.like(payload);
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
this.updateLikeStatus(comment.id);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
updateLikeStatus(commentId, replyId) {
|
|
281
|
+
this.comments.update((commentsList) => {
|
|
282
|
+
return commentsList.map((comment) => {
|
|
283
|
+
if (comment.id === commentId) {
|
|
284
|
+
if (replyId) {
|
|
285
|
+
const updatedReplies = comment.replies.map((reply) => reply.id === replyId
|
|
286
|
+
? {
|
|
287
|
+
...reply,
|
|
288
|
+
isLiked: !reply.isLiked,
|
|
289
|
+
reactionsCount: reply.isLiked ? --reply.reactionsCount : ++reply.reactionsCount,
|
|
290
|
+
}
|
|
291
|
+
: reply);
|
|
292
|
+
return {
|
|
293
|
+
...comment,
|
|
294
|
+
replies: updatedReplies,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
return {
|
|
299
|
+
...comment,
|
|
300
|
+
isLiked: !comment.isLiked,
|
|
301
|
+
reactionsCount: comment.isLiked ? --comment.reactionsCount : ++comment.reactionsCount,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
return comment;
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
removeMessageById(commentId, replyId) {
|
|
310
|
+
this.comments.update((commentsList) => commentsList
|
|
311
|
+
.map((comment) => {
|
|
312
|
+
if (comment.id === commentId) {
|
|
313
|
+
if (replyId) {
|
|
314
|
+
return {
|
|
315
|
+
...comment,
|
|
316
|
+
replies: comment.replies.filter((reply) => reply.id !== replyId),
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
return null;
|
|
320
|
+
}
|
|
321
|
+
return comment;
|
|
322
|
+
})
|
|
323
|
+
.filter((comment) => comment !== null));
|
|
324
|
+
}
|
|
325
|
+
async submitComment(isPrivate = false) {
|
|
326
|
+
debugger;
|
|
327
|
+
if (!this.validateContent(this.commentContent()).result) {
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
let memberLookup;
|
|
331
|
+
if (isPrivate) {
|
|
332
|
+
const popupConfig = {
|
|
333
|
+
header: true,
|
|
334
|
+
size: 'md',
|
|
335
|
+
draggable: true,
|
|
336
|
+
hasBackdrop: true,
|
|
337
|
+
closeButton: true,
|
|
338
|
+
closeOnBackdropClick: false,
|
|
339
|
+
};
|
|
340
|
+
const popup = await this.popupService.open(AXPCommentLookupPopup, popupConfig);
|
|
341
|
+
memberLookup = popup.data?.data?.lookup;
|
|
342
|
+
}
|
|
343
|
+
if (this.isEditingMode()) {
|
|
344
|
+
const payload = {
|
|
345
|
+
id: this.activeEditComment()?.id,
|
|
346
|
+
content: this.commentContent(),
|
|
347
|
+
};
|
|
348
|
+
await this.commentService.put(payload);
|
|
349
|
+
this.isSubmitting.set(true);
|
|
350
|
+
this.hasCooldown.set(true);
|
|
351
|
+
this.isEditingMode.set(false);
|
|
352
|
+
this.activeEditComment.set(undefined);
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
const payload = {
|
|
356
|
+
...this.payload(),
|
|
357
|
+
content: this.commentContent(),
|
|
358
|
+
contentType: 'text',
|
|
359
|
+
isPrivate: isPrivate,
|
|
360
|
+
replyId: this.activeReplyComment()?.id,
|
|
361
|
+
members: isPrivate ? [memberLookup] : [],
|
|
362
|
+
};
|
|
363
|
+
await this.commentService.post(payload);
|
|
364
|
+
this.isSubmitting.set(true);
|
|
365
|
+
this.hasCooldown.set(true);
|
|
366
|
+
this.isReplyingMode.set(false);
|
|
367
|
+
this.activeReplyComment.set(undefined);
|
|
368
|
+
}
|
|
369
|
+
const response = await this.commentService.get(this.payload());
|
|
370
|
+
this.comments.set(response.items);
|
|
371
|
+
this.commentContent.set('');
|
|
372
|
+
document.getElementsByClassName('ql-editor')[0].innerHTML = '';
|
|
373
|
+
this.isSubmitting.set(false);
|
|
374
|
+
setTimeout(() => {
|
|
375
|
+
this.hasCooldown.set(false);
|
|
376
|
+
}, 1000);
|
|
377
|
+
}
|
|
378
|
+
scrollMain() {
|
|
379
|
+
console.log('clicked');
|
|
380
|
+
// debugger
|
|
381
|
+
const comment = this.isReplyingMode() ? this.activeReplyComment() : this.activeEditComment();
|
|
382
|
+
const el = document.getElementById(comment.id);
|
|
383
|
+
if (el) {
|
|
384
|
+
el.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
|
385
|
+
const content = el?.firstElementChild;
|
|
386
|
+
const prevBg = content.style.background;
|
|
387
|
+
content.style.borderRadius = '0.25rem';
|
|
388
|
+
content.style.transition = 'background 1s ease-in-out';
|
|
389
|
+
content.style.background = '#e2fffc';
|
|
390
|
+
setTimeout(() => {
|
|
391
|
+
content.style.background = prevBg || 'rgba(0, 0, 0, 0)';
|
|
392
|
+
}, 1000);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXPCommentListViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
396
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: AXPCommentListViewComponent, isStandalone: true, selector: "axp-comment-list-view", viewQueries: [{ propertyName: "wysiwygEditor", first: true, predicate: ["w"], descendants: true, isSignal: true }, { propertyName: "wysiwyg", first: true, predicate: ["w"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"ax-mt-2\">\n <ax-comment-container>\n @if(isLoading()){\n <div class=\"ax-flex ax-items-center ax-py-12 ax-bg-surface ax-px-5\">\n <ax-skeleton class=\"ax-min-w-16 ax-h-16 ax-rounded-full ax-me-4\"></ax-skeleton>\n <div class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full\">\n <ax-skeleton class=\"ax-w-full ax-h-6 ax-rounded\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-full ax-h-2 ax-rounded-full\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-full ax-h-2 ax-rounded-full\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-8/12 ax-h-2 ax-rounded-full\"></ax-skeleton>\n </div>\n </div>\n } @else if(!isLoading() && comments().length > 0){\n <ax-comment-view class=\"ax-bg-surface\">\n @for(comment of comments(); track comment.id){\n <ax-comment-item [id]=\"comment.id\" [replyCount]=\"comment.replies.length\">\n <ax-avatar [color]=\"avatarConfig().color\" [look]=\"avatarConfig().look\">\n @if(checkImageExists(comment.id) && comment.user.picture){\n <ax-image (onError)=\"handleImageError(comment.id)\" [src]=\"comment.user.picture\">\n <ax-loading></ax-loading>\n </ax-image>\n }@else{\n <ax-text>\n <span class=\"ax-text-base ax-overflow-hidden\">{{\n extractInitials(comment.user.firstName + ' ' + comment.user.lastName)\n }}</span>\n </ax-text>\n }\n </ax-avatar>\n <ax-title>{{ comment.user.firstName + ' ' + comment.user.lastName }}</ax-title>\n <ax-comment-date>{{ time | format : 'timeleft' | async }} </ax-comment-date>\n <ax-comment-menu-options>\n <ax-button class=\"ax-sm\" look=\"blank\" color=\"secondary\">\n <ax-icon icon=\"ax-icon ax-icon-solid ax-icon-more-horizontal\"></ax-icon>\n </ax-button>\n\n <ax-dropdown-panel>\n <ax-button-item-list>\n <ax-button-item text=\"Edit\" color=\"secondary\" (click)=\"editMessage(comment)\">\n <ax-prefix>\n <ax-icon icon=\"fa-solid fa-edit\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n\n <ax-button-item text=\"Delete\" color=\"danger\" (click)=\"deleteComment(comment)\">\n <ax-prefix>\n <ax-icon icon=\"fa-solid fa-trash-can\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-comment-menu-options>\n <ax-content [innerHTML]=\"sanitizeHtml(comment.content)\"></ax-content>\n <ax-comment-like (click)=\"toggleLike(comment)\" [liked]=\"comment.isLiked\">\n {{ comment.reactionsCount }}\n </ax-comment-like>\n <ax-comment-reply-text (click)=\"replyMessage(comment)\"></ax-comment-reply-text>\n @for(reply of comment.replies; track reply.id){\n <ax-comment-item [id]=\"reply.id\">\n <ax-avatar [color]=\"avatarConfig().color\" [look]=\"avatarConfig().look\">\n @if(checkImageExists(reply.id) && reply.user.picture){\n <ax-image (onError)=\"handleImageError(reply.id)\" [src]=\"reply.user.picture\">\n <ax-loading></ax-loading>\n </ax-image>\n }@else{\n <ax-text>\n <span class=\"ax-text-base ax-overflow-hidden\">{{\n extractInitials(reply.user.firstName + ' ' + reply.user.lastName)\n }}</span>\n </ax-text>\n }\n </ax-avatar>\n <ax-title>{{ (reply?.user?.firstName ?? '') + ' ' + (reply?.user?.lastName ?? '') }}</ax-title>\n <ax-comment-menu-options>\n <ax-button class=\"ax-sm\" look=\"blank\" color=\"secondary\">\n <ax-icon icon=\"ax-icon ax-icon-solid ax-icon-more-horizontal\"></ax-icon>\n </ax-button>\n\n <ax-dropdown-panel>\n <ax-button-item-list>\n <ax-button-item text=\"Edit\" color=\"secondary\" (click)=\"editMessage(comment, reply)\">\n <ax-prefix>\n <ax-icon icon=\"fa-solid fa-edit\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n <ax-button-item text=\"Delete\" color=\"danger\" (click)=\"deleteReply(comment, reply)\">\n <ax-prefix>\n <ax-icon icon=\"fa-solid fa-trash-can\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-comment-menu-options>\n <ax-content [innerHTML]=\"sanitizeHtml(reply.content)\"></ax-content>\n <ax-comment-like (click)=\"toggleLike(comment, reply)\" [liked]=\"reply.isLiked\">\n {{ reply.reactionsCount }}\n </ax-comment-like>\n <ax-comment-reply-text (click)=\"replyMessage(comment, reply)\"></ax-comment-reply-text>\n </ax-comment-item>\n }\n </ax-comment-item>\n } </ax-comment-view\n >} @else{\n <div>\n <div class=\"ax-flex ax-flex-col ax-gap-4 ax-justify-center ax-items-center ax-p-10\">\n <svg\n class=\"ax-mx-auto\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"154\"\n height=\"161\"\n viewBox=\"0 0 154 161\"\n fill=\"none\"\n >\n <path\n d=\"M0.0616455 84.4268C0.0616455 42.0213 34.435 7.83765 76.6507 7.83765C118.803 7.83765 153.224 42.0055 153.224 84.4268C153.224 102.42 147.026 118.974 136.622 132.034C122.282 150.138 100.367 161 76.6507 161C52.7759 161 30.9882 150.059 16.6633 132.034C6.25961 118.974 0.0616455 102.42 0.0616455 84.4268Z\"\n fill=\"#EEF2FF\"\n />\n <path\n d=\"M96.8189 0.632498L96.8189 0.632384L96.8083 0.630954C96.2034 0.549581 95.5931 0.5 94.9787 0.5H29.338C22.7112 0.5 17.3394 5.84455 17.3394 12.4473V142.715C17.3394 149.318 22.7112 154.662 29.338 154.662H123.948C130.591 154.662 135.946 149.317 135.946 142.715V38.9309C135.946 38.0244 135.847 37.1334 135.648 36.2586L135.648 36.2584C135.117 33.9309 133.874 31.7686 132.066 30.1333C132.066 30.1331 132.065 30.1329 132.065 30.1327L103.068 3.65203C103.068 3.6519 103.067 3.65177 103.067 3.65164C101.311 2.03526 99.1396 0.995552 96.8189 0.632498Z\"\n fill=\"white\"\n stroke=\"#E5E7EB\"\n />\n <ellipse cx=\"80.0618\" cy=\"81\" rx=\"28.0342\" ry=\"28.0342\" fill=\"#EEF2FF\" />\n <path\n d=\"M99.2393 61.3061L99.2391 61.3058C88.498 50.5808 71.1092 50.5804 60.3835 61.3061C49.6423 72.0316 49.6422 89.4361 60.3832 100.162C71.109 110.903 88.4982 110.903 99.2393 100.162C109.965 89.4363 109.965 72.0317 99.2393 61.3061ZM105.863 54.6832C120.249 69.0695 120.249 92.3985 105.863 106.785C91.4605 121.171 68.1468 121.171 53.7446 106.785C39.3582 92.3987 39.3582 69.0693 53.7446 54.683C68.1468 40.2965 91.4605 40.2966 105.863 54.6832Z\"\n stroke=\"#E5E7EB\"\n />\n <path\n d=\"M110.782 119.267L102.016 110.492C104.888 108.267 107.476 105.651 109.564 102.955L118.329 111.729L110.782 119.267Z\"\n stroke=\"#E5E7EB\"\n />\n <path\n d=\"M139.122 125.781L139.122 125.78L123.313 109.988C123.313 109.987 123.313 109.987 123.312 109.986C121.996 108.653 119.849 108.657 118.521 109.985L118.871 110.335L118.521 109.985L109.047 119.459C107.731 120.775 107.735 122.918 109.044 124.247L109.047 124.249L124.858 140.06C128.789 143.992 135.191 143.992 139.122 140.06C143.069 136.113 143.069 129.728 139.122 125.781Z\"\n fill=\"#A5B4FC\"\n stroke=\"#818CF8\"\n />\n <path\n d=\"M83.185 87.2285C82.5387 87.2285 82.0027 86.6926 82.0027 86.0305C82.0027 83.3821 77.9987 83.3821 77.9987 86.0305C77.9987 86.6926 77.4627 87.2285 76.8006 87.2285C76.1543 87.2285 75.6183 86.6926 75.6183 86.0305C75.6183 80.2294 84.3831 80.2451 84.3831 86.0305C84.3831 86.6926 83.8471 87.2285 83.185 87.2285Z\"\n fill=\"#4F46E5\"\n />\n <path\n d=\"M93.3528 77.0926H88.403C87.7409 77.0926 87.2049 76.5567 87.2049 75.8946C87.2049 75.2483 87.7409 74.7123 88.403 74.7123H93.3528C94.0149 74.7123 94.5509 75.2483 94.5509 75.8946C94.5509 76.5567 94.0149 77.0926 93.3528 77.0926Z\"\n fill=\"#4F46E5\"\n />\n <path\n d=\"M71.5987 77.0925H66.6488C65.9867 77.0925 65.4507 76.5565 65.4507 75.8945C65.4507 75.2481 65.9867 74.7122 66.6488 74.7122H71.5987C72.245 74.7122 72.781 75.2481 72.781 75.8945C72.781 76.5565 72.245 77.0925 71.5987 77.0925Z\"\n fill=\"#4F46E5\"\n />\n <rect x=\"38.3522\" y=\"21.5128\" width=\"41.0256\" height=\"2.73504\" rx=\"1.36752\" fill=\"#4F46E5\" />\n <rect x=\"38.3522\" y=\"133.65\" width=\"54.7009\" height=\"5.47009\" rx=\"2.73504\" fill=\"#A5B4FC\" />\n <rect x=\"38.3522\" y=\"29.7179\" width=\"13.6752\" height=\"2.73504\" rx=\"1.36752\" fill=\"#4F46E5\" />\n <circle cx=\"56.13\" cy=\"31.0854\" r=\"1.36752\" fill=\"#4F46E5\" />\n <circle cx=\"61.6001\" cy=\"31.0854\" r=\"1.36752\" fill=\"#4F46E5\" />\n <circle cx=\"67.0702\" cy=\"31.0854\" r=\"1.36752\" fill=\"#4F46E5\" />\n </svg>\n <div>\n <h2 class=\"ax-text-center ax-text-neutral-600 ax-font-semibold ax-leading-loose ax-pb-2\">\n There is no Comment!\n </h2>\n </div>\n </div>\n </div>\n }\n </ax-comment-container>\n <ax-form>\n <ax-form-field>\n <div>\n @if(isReplyingMode() || isEditingMode()){\n <div\n class=\"ax-flex ax-justify-between ax-rounded-b-none ax-border ax-border-b-0 ax-rounded-lg ax-bg-on-surface ax-px-6 ax-py-3 ax-w-full ax-items-center ax-overflow-hidden ax-text-sm ax-leading-none\"\n >\n <div (click)=\"scrollMain()\" class=\"ax-flex ax-justify-start ax-items-center ax-cursor-pointer\">\n <i\n [class]=\"isReplyingMode() ? 'fa-reply' : 'fa-pen'\"\n class=\"fa-solid ax-text-primary-500 dark:ax-text-primary-300 ax-text-2xl ax-me-4\"\n ></i>\n <div\n class=\"ax-flex ax-flex-col ax-gap-2 ax-justify-between ax-align-middle ax-leading-4 ax-overflow-hidden\"\n >\n <p class=\"ax-text-primary-500 dark:ax-text-primary-300\">\n {{ isReplyingMode() ? 'Reply to ' : 'Edit Message' }}\n <span class=\"ax-font-bold\">\n {{\n isReplyingMode()\n ? activeReplyComment()?.user?.firstName + ' ' + activeReplyComment()?.user?.lastName\n : ''\n }}\n </span>\n </p>\n <div\n class=\"ax-truncate\"\n [innerHTML]=\"\n isReplyingMode()\n ? sanitizeHtml(activeReplyComment()?.content ?? '')\n : sanitizeHtml(activeEditComment()?.content ?? '')\n \"\n ></div>\n </div>\n </div>\n <div><i (click)=\"resetReplyEditState()\" class=\"fa-solid ax-text-2xl fa-xmark ax-cursor-pointer\"></i></div>\n </div>\n }\n <ax-wysiwyg-container #w [look]=\"wysiwygOptions().look\" [(ngModel)]=\"commentContent\">\n <ax-wysiwyg-view class=\"ax-min-h-28\"></ax-wysiwyg-view>\n <ax-wysiwyg-toolbar>\n <ax-wysiwyg-history></ax-wysiwyg-history>\n <ax-wysiwyg-font-style></ax-wysiwyg-font-style>\n <ax-wysiwyg-colors></ax-wysiwyg-colors>\n <ax-wysiwyg-list></ax-wysiwyg-list>\n <ax-wysiwyg-alignment></ax-wysiwyg-alignment>\n <ax-suffix>\n <ax-dropdown-button\n [disabled]=\"hasCooldown()\"\n type=\"submit\"\n color=\"primary\"\n mode=\"split\"\n text=\"Send\"\n (onClick)=\"submitComment()\"\n >\n @if(isSubmitting()){ <ax-loading></ax-loading> }\n <ax-button-item-list>\n <ax-button-item (click)=\"submitComment(true)\" text=\"Send Private ...\" name=\"private\" data=\"private\">\n <ax-prefix>\n <ax-icon icon=\"fa-regular fa-user-secret\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-button>\n </ax-suffix>\n </ax-wysiwyg-toolbar>\n <ax-validation-rule rule=\"callback\" [options]=\"{ validate: validateContent }\"></ax-validation-rule>\n </ax-wysiwyg-container>\n </div>\n </ax-form-field>\n </ax-form>\n</div>\n", styles: ["ax-wysiwyg-container .ax-editor-container{border-top-left-radius:0!important;border-top-right-radius:0!important}ax-wysiwyg-container .ax-error-message{padding-left:.5rem}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i3.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-sub-title, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXCommentModule }, { kind: "component", type: i4.AXCommentViewComponent, selector: "ax-comment-view" }, { kind: "component", type: i4.AXCommentContainerComponent, selector: "ax-comment-container" }, { kind: "component", type: i4.AxCommentItemComponent, selector: "ax-comment-item", inputs: ["replyCount"] }, { kind: "component", type: i4.AXCommentLikeComponent, selector: "ax-comment-like", inputs: ["liked"] }, { kind: "component", type: i4.AXMenuOptionsComponent, selector: "ax-comment-menu-options" }, { kind: "component", type: i4.AXCommentReplyTextComponent, selector: "ax-comment-reply-text" }, { kind: "component", type: i4.AXCommentDateComponent, selector: "ax-comment-date" }, { kind: "ngmodule", type: AXWysiwygModule }, { kind: "component", type: i5.AXWysiwygContainerComponent, selector: "ax-wysiwyg-container", inputs: ["look", "placeHolder"], outputs: ["onValueChanged"] }, { kind: "component", type: i5.AXWysiwygViewComponent, selector: "ax-wysiwyg-view", inputs: ["class"] }, { kind: "component", type: i5.AXWysiwygToolbarComponent, selector: "ax-wysiwyg-toolbar" }, { kind: "component", type: i5.AXWysiwygAlignmentComponent, selector: "ax-wysiwyg-alignment" }, { kind: "component", type: i5.AXWysiwygColorsComponent, selector: "ax-wysiwyg-colors" }, { kind: "component", type: i5.AXWysiwygFontStyleComponent, selector: "ax-wysiwyg-font-style" }, { kind: "component", type: i5.AXWysiwygHistoryComponent, selector: "ax-wysiwyg-history" }, { kind: "component", type: i5.AXWysiwygListComponent, selector: "ax-wysiwyg-list" }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i6.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "type", "responsiveOn", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "responsiveOnChange", "loadingTextChange"] }, { kind: "component", type: i6.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i6.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "ngmodule", type: AXLabelModule }, { kind: "ngmodule", type: AXAvatarModule }, { kind: "component", type: i7.AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "look"], outputs: ["sizeChange"] }, { kind: "ngmodule", type: AXImageModule }, { kind: "component", type: i8.AXImageComponent, selector: "ax-image", inputs: ["overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "ngmodule", type: AXSelectBoxModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "component", type: i9.AXFormFieldComponent, selector: "ax-form-field", inputs: ["labelMode"] }, { kind: "component", type: i9.AXFormComponent, selector: "ax-form", inputs: ["labelMode", "messageStyle", "updateOn"], outputs: ["onValidate", "updateOnChange"] }, { kind: "directive", type: i9.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i10.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXDropdownButtonModule }, { kind: "component", type: i11.AXDropdownButtonComponent, selector: "ax-dropdown-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "type", "mode"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "lookChange", "colorChange", "disabledChange"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i12.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXFormatModule }, { kind: "pipe", type: i13.AXFormatPipe, name: "format" }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i14.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
397
|
+
}
|
|
398
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXPCommentListViewComponent, decorators: [{
|
|
399
|
+
type: Component,
|
|
400
|
+
args: [{ selector: 'axp-comment-list-view', imports: [
|
|
401
|
+
FormsModule,
|
|
402
|
+
CommonModule,
|
|
403
|
+
RouterModule,
|
|
404
|
+
AXDecoratorModule,
|
|
405
|
+
AXCommentModule,
|
|
406
|
+
AXWysiwygModule,
|
|
407
|
+
AXButtonModule,
|
|
408
|
+
AXTextBoxModule,
|
|
409
|
+
AXLabelModule,
|
|
410
|
+
AXAvatarModule,
|
|
411
|
+
AXImageModule,
|
|
412
|
+
AXSelectBoxModule,
|
|
413
|
+
AXFormModule,
|
|
414
|
+
AXLoadingModule,
|
|
415
|
+
AXDropdownButtonModule,
|
|
416
|
+
AXDropdownModule,
|
|
417
|
+
AXFormatModule,
|
|
418
|
+
AXSkeletonModule,
|
|
419
|
+
], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ax-mt-2\">\n <ax-comment-container>\n @if(isLoading()){\n <div class=\"ax-flex ax-items-center ax-py-12 ax-bg-surface ax-px-5\">\n <ax-skeleton class=\"ax-min-w-16 ax-h-16 ax-rounded-full ax-me-4\"></ax-skeleton>\n <div class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full\">\n <ax-skeleton class=\"ax-w-full ax-h-6 ax-rounded\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-full ax-h-2 ax-rounded-full\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-full ax-h-2 ax-rounded-full\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-8/12 ax-h-2 ax-rounded-full\"></ax-skeleton>\n </div>\n </div>\n } @else if(!isLoading() && comments().length > 0){\n <ax-comment-view class=\"ax-bg-surface\">\n @for(comment of comments(); track comment.id){\n <ax-comment-item [id]=\"comment.id\" [replyCount]=\"comment.replies.length\">\n <ax-avatar [color]=\"avatarConfig().color\" [look]=\"avatarConfig().look\">\n @if(checkImageExists(comment.id) && comment.user.picture){\n <ax-image (onError)=\"handleImageError(comment.id)\" [src]=\"comment.user.picture\">\n <ax-loading></ax-loading>\n </ax-image>\n }@else{\n <ax-text>\n <span class=\"ax-text-base ax-overflow-hidden\">{{\n extractInitials(comment.user.firstName + ' ' + comment.user.lastName)\n }}</span>\n </ax-text>\n }\n </ax-avatar>\n <ax-title>{{ comment.user.firstName + ' ' + comment.user.lastName }}</ax-title>\n <ax-comment-date>{{ time | format : 'timeleft' | async }} </ax-comment-date>\n <ax-comment-menu-options>\n <ax-button class=\"ax-sm\" look=\"blank\" color=\"secondary\">\n <ax-icon icon=\"ax-icon ax-icon-solid ax-icon-more-horizontal\"></ax-icon>\n </ax-button>\n\n <ax-dropdown-panel>\n <ax-button-item-list>\n <ax-button-item text=\"Edit\" color=\"secondary\" (click)=\"editMessage(comment)\">\n <ax-prefix>\n <ax-icon icon=\"fa-solid fa-edit\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n\n <ax-button-item text=\"Delete\" color=\"danger\" (click)=\"deleteComment(comment)\">\n <ax-prefix>\n <ax-icon icon=\"fa-solid fa-trash-can\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-comment-menu-options>\n <ax-content [innerHTML]=\"sanitizeHtml(comment.content)\"></ax-content>\n <ax-comment-like (click)=\"toggleLike(comment)\" [liked]=\"comment.isLiked\">\n {{ comment.reactionsCount }}\n </ax-comment-like>\n <ax-comment-reply-text (click)=\"replyMessage(comment)\"></ax-comment-reply-text>\n @for(reply of comment.replies; track reply.id){\n <ax-comment-item [id]=\"reply.id\">\n <ax-avatar [color]=\"avatarConfig().color\" [look]=\"avatarConfig().look\">\n @if(checkImageExists(reply.id) && reply.user.picture){\n <ax-image (onError)=\"handleImageError(reply.id)\" [src]=\"reply.user.picture\">\n <ax-loading></ax-loading>\n </ax-image>\n }@else{\n <ax-text>\n <span class=\"ax-text-base ax-overflow-hidden\">{{\n extractInitials(reply.user.firstName + ' ' + reply.user.lastName)\n }}</span>\n </ax-text>\n }\n </ax-avatar>\n <ax-title>{{ (reply?.user?.firstName ?? '') + ' ' + (reply?.user?.lastName ?? '') }}</ax-title>\n <ax-comment-menu-options>\n <ax-button class=\"ax-sm\" look=\"blank\" color=\"secondary\">\n <ax-icon icon=\"ax-icon ax-icon-solid ax-icon-more-horizontal\"></ax-icon>\n </ax-button>\n\n <ax-dropdown-panel>\n <ax-button-item-list>\n <ax-button-item text=\"Edit\" color=\"secondary\" (click)=\"editMessage(comment, reply)\">\n <ax-prefix>\n <ax-icon icon=\"fa-solid fa-edit\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n <ax-button-item text=\"Delete\" color=\"danger\" (click)=\"deleteReply(comment, reply)\">\n <ax-prefix>\n <ax-icon icon=\"fa-solid fa-trash-can\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-comment-menu-options>\n <ax-content [innerHTML]=\"sanitizeHtml(reply.content)\"></ax-content>\n <ax-comment-like (click)=\"toggleLike(comment, reply)\" [liked]=\"reply.isLiked\">\n {{ reply.reactionsCount }}\n </ax-comment-like>\n <ax-comment-reply-text (click)=\"replyMessage(comment, reply)\"></ax-comment-reply-text>\n </ax-comment-item>\n }\n </ax-comment-item>\n } </ax-comment-view\n >} @else{\n <div>\n <div class=\"ax-flex ax-flex-col ax-gap-4 ax-justify-center ax-items-center ax-p-10\">\n <svg\n class=\"ax-mx-auto\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"154\"\n height=\"161\"\n viewBox=\"0 0 154 161\"\n fill=\"none\"\n >\n <path\n d=\"M0.0616455 84.4268C0.0616455 42.0213 34.435 7.83765 76.6507 7.83765C118.803 7.83765 153.224 42.0055 153.224 84.4268C153.224 102.42 147.026 118.974 136.622 132.034C122.282 150.138 100.367 161 76.6507 161C52.7759 161 30.9882 150.059 16.6633 132.034C6.25961 118.974 0.0616455 102.42 0.0616455 84.4268Z\"\n fill=\"#EEF2FF\"\n />\n <path\n d=\"M96.8189 0.632498L96.8189 0.632384L96.8083 0.630954C96.2034 0.549581 95.5931 0.5 94.9787 0.5H29.338C22.7112 0.5 17.3394 5.84455 17.3394 12.4473V142.715C17.3394 149.318 22.7112 154.662 29.338 154.662H123.948C130.591 154.662 135.946 149.317 135.946 142.715V38.9309C135.946 38.0244 135.847 37.1334 135.648 36.2586L135.648 36.2584C135.117 33.9309 133.874 31.7686 132.066 30.1333C132.066 30.1331 132.065 30.1329 132.065 30.1327L103.068 3.65203C103.068 3.6519 103.067 3.65177 103.067 3.65164C101.311 2.03526 99.1396 0.995552 96.8189 0.632498Z\"\n fill=\"white\"\n stroke=\"#E5E7EB\"\n />\n <ellipse cx=\"80.0618\" cy=\"81\" rx=\"28.0342\" ry=\"28.0342\" fill=\"#EEF2FF\" />\n <path\n d=\"M99.2393 61.3061L99.2391 61.3058C88.498 50.5808 71.1092 50.5804 60.3835 61.3061C49.6423 72.0316 49.6422 89.4361 60.3832 100.162C71.109 110.903 88.4982 110.903 99.2393 100.162C109.965 89.4363 109.965 72.0317 99.2393 61.3061ZM105.863 54.6832C120.249 69.0695 120.249 92.3985 105.863 106.785C91.4605 121.171 68.1468 121.171 53.7446 106.785C39.3582 92.3987 39.3582 69.0693 53.7446 54.683C68.1468 40.2965 91.4605 40.2966 105.863 54.6832Z\"\n stroke=\"#E5E7EB\"\n />\n <path\n d=\"M110.782 119.267L102.016 110.492C104.888 108.267 107.476 105.651 109.564 102.955L118.329 111.729L110.782 119.267Z\"\n stroke=\"#E5E7EB\"\n />\n <path\n d=\"M139.122 125.781L139.122 125.78L123.313 109.988C123.313 109.987 123.313 109.987 123.312 109.986C121.996 108.653 119.849 108.657 118.521 109.985L118.871 110.335L118.521 109.985L109.047 119.459C107.731 120.775 107.735 122.918 109.044 124.247L109.047 124.249L124.858 140.06C128.789 143.992 135.191 143.992 139.122 140.06C143.069 136.113 143.069 129.728 139.122 125.781Z\"\n fill=\"#A5B4FC\"\n stroke=\"#818CF8\"\n />\n <path\n d=\"M83.185 87.2285C82.5387 87.2285 82.0027 86.6926 82.0027 86.0305C82.0027 83.3821 77.9987 83.3821 77.9987 86.0305C77.9987 86.6926 77.4627 87.2285 76.8006 87.2285C76.1543 87.2285 75.6183 86.6926 75.6183 86.0305C75.6183 80.2294 84.3831 80.2451 84.3831 86.0305C84.3831 86.6926 83.8471 87.2285 83.185 87.2285Z\"\n fill=\"#4F46E5\"\n />\n <path\n d=\"M93.3528 77.0926H88.403C87.7409 77.0926 87.2049 76.5567 87.2049 75.8946C87.2049 75.2483 87.7409 74.7123 88.403 74.7123H93.3528C94.0149 74.7123 94.5509 75.2483 94.5509 75.8946C94.5509 76.5567 94.0149 77.0926 93.3528 77.0926Z\"\n fill=\"#4F46E5\"\n />\n <path\n d=\"M71.5987 77.0925H66.6488C65.9867 77.0925 65.4507 76.5565 65.4507 75.8945C65.4507 75.2481 65.9867 74.7122 66.6488 74.7122H71.5987C72.245 74.7122 72.781 75.2481 72.781 75.8945C72.781 76.5565 72.245 77.0925 71.5987 77.0925Z\"\n fill=\"#4F46E5\"\n />\n <rect x=\"38.3522\" y=\"21.5128\" width=\"41.0256\" height=\"2.73504\" rx=\"1.36752\" fill=\"#4F46E5\" />\n <rect x=\"38.3522\" y=\"133.65\" width=\"54.7009\" height=\"5.47009\" rx=\"2.73504\" fill=\"#A5B4FC\" />\n <rect x=\"38.3522\" y=\"29.7179\" width=\"13.6752\" height=\"2.73504\" rx=\"1.36752\" fill=\"#4F46E5\" />\n <circle cx=\"56.13\" cy=\"31.0854\" r=\"1.36752\" fill=\"#4F46E5\" />\n <circle cx=\"61.6001\" cy=\"31.0854\" r=\"1.36752\" fill=\"#4F46E5\" />\n <circle cx=\"67.0702\" cy=\"31.0854\" r=\"1.36752\" fill=\"#4F46E5\" />\n </svg>\n <div>\n <h2 class=\"ax-text-center ax-text-neutral-600 ax-font-semibold ax-leading-loose ax-pb-2\">\n There is no Comment!\n </h2>\n </div>\n </div>\n </div>\n }\n </ax-comment-container>\n <ax-form>\n <ax-form-field>\n <div>\n @if(isReplyingMode() || isEditingMode()){\n <div\n class=\"ax-flex ax-justify-between ax-rounded-b-none ax-border ax-border-b-0 ax-rounded-lg ax-bg-on-surface ax-px-6 ax-py-3 ax-w-full ax-items-center ax-overflow-hidden ax-text-sm ax-leading-none\"\n >\n <div (click)=\"scrollMain()\" class=\"ax-flex ax-justify-start ax-items-center ax-cursor-pointer\">\n <i\n [class]=\"isReplyingMode() ? 'fa-reply' : 'fa-pen'\"\n class=\"fa-solid ax-text-primary-500 dark:ax-text-primary-300 ax-text-2xl ax-me-4\"\n ></i>\n <div\n class=\"ax-flex ax-flex-col ax-gap-2 ax-justify-between ax-align-middle ax-leading-4 ax-overflow-hidden\"\n >\n <p class=\"ax-text-primary-500 dark:ax-text-primary-300\">\n {{ isReplyingMode() ? 'Reply to ' : 'Edit Message' }}\n <span class=\"ax-font-bold\">\n {{\n isReplyingMode()\n ? activeReplyComment()?.user?.firstName + ' ' + activeReplyComment()?.user?.lastName\n : ''\n }}\n </span>\n </p>\n <div\n class=\"ax-truncate\"\n [innerHTML]=\"\n isReplyingMode()\n ? sanitizeHtml(activeReplyComment()?.content ?? '')\n : sanitizeHtml(activeEditComment()?.content ?? '')\n \"\n ></div>\n </div>\n </div>\n <div><i (click)=\"resetReplyEditState()\" class=\"fa-solid ax-text-2xl fa-xmark ax-cursor-pointer\"></i></div>\n </div>\n }\n <ax-wysiwyg-container #w [look]=\"wysiwygOptions().look\" [(ngModel)]=\"commentContent\">\n <ax-wysiwyg-view class=\"ax-min-h-28\"></ax-wysiwyg-view>\n <ax-wysiwyg-toolbar>\n <ax-wysiwyg-history></ax-wysiwyg-history>\n <ax-wysiwyg-font-style></ax-wysiwyg-font-style>\n <ax-wysiwyg-colors></ax-wysiwyg-colors>\n <ax-wysiwyg-list></ax-wysiwyg-list>\n <ax-wysiwyg-alignment></ax-wysiwyg-alignment>\n <ax-suffix>\n <ax-dropdown-button\n [disabled]=\"hasCooldown()\"\n type=\"submit\"\n color=\"primary\"\n mode=\"split\"\n text=\"Send\"\n (onClick)=\"submitComment()\"\n >\n @if(isSubmitting()){ <ax-loading></ax-loading> }\n <ax-button-item-list>\n <ax-button-item (click)=\"submitComment(true)\" text=\"Send Private ...\" name=\"private\" data=\"private\">\n <ax-prefix>\n <ax-icon icon=\"fa-regular fa-user-secret\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-button>\n </ax-suffix>\n </ax-wysiwyg-toolbar>\n <ax-validation-rule rule=\"callback\" [options]=\"{ validate: validateContent }\"></ax-validation-rule>\n </ax-wysiwyg-container>\n </div>\n </ax-form-field>\n </ax-form>\n</div>\n", styles: ["ax-wysiwyg-container .ax-editor-container{border-top-left-radius:0!important;border-top-right-radius:0!important}ax-wysiwyg-container .ax-error-message{padding-left:.5rem}\n"] }]
|
|
420
|
+
}] });
|
|
421
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC1saXN0LXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS90aGVtZXMvc2hhcmVkL3NyYy9saWIvY29tbWVudHMvY29tbWVudC1saXN0LXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS90aGVtZXMvc2hhcmVkL3NyYy9saWIvY29tbWVudHMvY29tbWVudC1saXN0LXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2xFLE9BQU8sRUFBK0IsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVFLE9B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LGFBQWEsOEJBQ2IsY0FBYyxvS0FDZCxhQUFhLGlNQUNiLGlCQUFpQiw4QkFDakIsWUFBWSw2YUFDWixlQUFlLCtLQUNmLHNCQUFzQix5VEFDdEIsZ0JBQWdCLHlQQUNoQixjQUFjLHdGQUNkLGdCQUFnQjs7MkZBZVAsMkJBQTJCO2tCQXBDdkMsU0FBUzsrQkFFRSx1QkFBdUIsV0FDeEI7d0JBQ1AsV0FBVzt3QkFDWCxZQUFZO3dCQUNaLFlBQVk7d0JBQ1osaUJBQWlCO3dCQUNqQixlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsY0FBYzt3QkFDZCxlQUFlO3dCQUNmLGFBQWE7d0JBQ2IsY0FBYzt3QkFDZCxhQUFhO3dCQUNiLGlCQUFpQjt3QkFDakIsWUFBWTt3QkFDWixlQUFlO3dCQUNmLHNCQUFzQjt3QkFDdEIsZ0JBQWdCO3dCQUNoQixjQUFjO3dCQUNkLGdCQUFnQjtxQkFDakIsY0FDVyxJQUFJLG1CQVdDLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWENvbW1lbnRNb2R1bGUgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvY29tbWVudCc7XG5pbXBvcnQgeyBBWERlY29yYXRvck1vZHVsZSB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9kZWNvcmF0b3JzJztcbmltcG9ydCB7IEFYV3lzaXd5Z0NvbnRhaW5lckNvbXBvbmVudCwgQVhXeXNpd3lnTW9kdWxlIH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL3d5c2l3eWcnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBpbmplY3QsIE9uSW5pdCwgc2lnbmFsLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IEFYQXZhdGFyTW9kdWxlIH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL2F2YXRhcic7XG5pbXBvcnQgeyBBWEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9idXR0b24nO1xuaW1wb3J0IHsgQVhTdHlsZUxvb2tUeXBlIH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL2NvbW1vbic7XG5pbXBvcnQgeyBBWERpYWxvZ1NlcnZpY2UgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvZGlhbG9nJztcbmltcG9ydCB7IEFYRHJvcGRvd25Nb2R1bGUgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvZHJvcGRvd24nO1xuaW1wb3J0IHsgQVhEcm9wZG93bkJ1dHRvbk1vZHVsZSB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9kcm9wZG93bi1idXR0b24nO1xuaW1wb3J0IHsgQVhGb3JtTW9kdWxlIH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL2Zvcm0nO1xuaW1wb3J0IHsgQVhJbWFnZU1vZHVsZSB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9pbWFnZSc7XG5pbXBvcnQgeyBBWExhYmVsTW9kdWxlIH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL2xhYmVsJztcbmltcG9ydCB7IEFYTG9hZGluZ01vZHVsZSB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9sb2FkaW5nJztcbmltcG9ydCB7IEFYUG9wdXBDb25maWcsIEFYUG9wdXBTZXJ2aWNlIH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL3BvcHVwJztcbmltcG9ydCB7IEFYU2VsZWN0Qm94TW9kdWxlIH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL3NlbGVjdC1ib3gnO1xuaW1wb3J0IHsgQVhTa2VsZXRvbk1vZHVsZSB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9za2VsZXRvbic7XG5pbXBvcnQgeyBBWFRleHRCb3hNb2R1bGUgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvdGV4dC1ib3gnO1xuaW1wb3J0IHsgQVhUb2FzdFNlcnZpY2UgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvdG9hc3QnO1xuaW1wb3J0IHsgQVhGb3JtYXRNb2R1bGUgfSBmcm9tICdAYWNvcmV4L2NvcmUvZm9ybWF0JztcbmltcG9ydCB7IEFYUGxhdGZvcm0gfSBmcm9tICdAYWNvcmV4L2NvcmUvcGxhdGZvcm0nO1xuaW1wb3J0IHsgQVhQSHRtbFV0aWxzIH0gZnJvbSAnQGFjb3JleC9wbGF0Zm9ybS9jb3JlJztcbmltcG9ydCB7IEFYUENvbW1lbnRMb29rdXBQb3B1cCB9IGZyb20gJy4vY29tbWVudC1sb29rdXAtcG9wdXAuY29tcG9uZW50JztcbmltcG9ydCB7IEFYUENvbW1lbnRTZXJ2aWNlIH0gZnJvbSAnLi9jb21tZW50cy5zZXJ2aWNlJztcbmltcG9ydCB7IEFYUENvbW1lbnQsIEFYUExpa2VSZXF1ZXN0LCBBWFBQb3N0UmVxdWVzdCwgQVhQUHV0UmVxdWVzdCB9IGZyb20gJy4vY29tbWVudHMudHlwZSc7XG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbW1lbnQtbGlzdC12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgc2VsZWN0b3I6ICdheHAtY29tbWVudC1saXN0LXZpZXcnLFxuICBpbXBvcnRzOiBbXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJvdXRlck1vZHVsZSxcbiAgICBBWERlY29yYXRvck1vZHVsZSxcbiAgICBBWENvbW1lbnRNb2R1bGUsXG4gICAgQVhXeXNpd3lnTW9kdWxlLFxuICAgIEFYQnV0dG9uTW9kdWxlLFxuICAgIEFYVGV4dEJveE1vZHVsZSxcbiAgICBBWExhYmVsTW9kdWxlLFxuICAgIEFYQXZhdGFyTW9kdWxlLFxuICAgIEFYSW1hZ2VNb2R1bGUsXG4gICAgQVhTZWxlY3RCb3hNb2R1bGUsXG4gICAgQVhGb3JtTW9kdWxlLFxuICAgIEFYTG9hZGluZ01vZHVsZSxcbiAgICBBWERyb3Bkb3duQnV0dG9uTW9kdWxlLFxuICAgIEFYRHJvcGRvd25Nb2R1bGUsXG4gICAgQVhGb3JtYXRNb2R1bGUsXG4gICAgQVhTa2VsZXRvbk1vZHVsZSxcbiAgXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc3R5bGVzOiBgYXgtd3lzaXd5Zy1jb250YWluZXJ7XG4gICAgLmF4LWVkaXRvci1jb250YWluZXJ7XG4gICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMCAhaW1wb3J0YW50O1xuICAgIH1cbiAgICAuYXgtZXJyb3ItbWVzc2FnZXtcbiAgICAgIHBhZGRpbmctbGVmdDogMC41cmVtO1xuICAgIH1cblxuICB9YCxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFYUENvbW1lbnRMaXN0Vmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByb3RlY3RlZCBoYXNDb29sZG93biA9IHNpZ25hbChmYWxzZSk7XG4gIHByb3RlY3RlZCBjb21tZW50Q29udGVudCA9IHNpZ25hbCgnJyk7XG5cbiAgcHJvdGVjdGVkIGlzU3VibWl0dGluZyA9IHNpZ25hbChmYWxzZSk7XG4gIHByb3RlY3RlZCBpc1JlcGx5aW5nTW9kZSA9IHNpZ25hbChmYWxzZSk7XG4gIHByb3RlY3RlZCBpc0VkaXRpbmdNb2RlID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJvdGVjdGVkIGlzTG9hZGluZyA9IHNpZ25hbCh0cnVlKTtcblxuICBwcm90ZWN0ZWQgZmFpbGVkSW1hZ2VJZHMgPSBzaWduYWw8c3RyaW5nW10+KFtdKTtcbiAgcHJvdGVjdGVkIGFjdGl2ZVJlcGx5Q29tbWVudCA9IHNpZ25hbDx1bmRlZmluZWQgfCBBWFBDb21tZW50Pih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgYWN0aXZlRWRpdENvbW1lbnQgPSBzaWduYWw8dW5kZWZpbmVkIHwgQVhQQ29tbWVudD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIHd5c2l3eWdFZGl0b3IgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8QVhXeXNpd3lnQ29udGFpbmVyQ29tcG9uZW50PigndycpO1xuXG4gIHByaXZhdGUgY29tbWVudFNlcnZpY2UgPSBpbmplY3QoQVhQQ29tbWVudFNlcnZpY2UpO1xuICBwcml2YXRlIHBsYXRmb3JtID0gaW5qZWN0KEFYUGxhdGZvcm0pO1xuICBwcml2YXRlIHJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgcHJpdmF0ZSBwb3B1cFNlcnZpY2UgPSBpbmplY3QoQVhQb3B1cFNlcnZpY2UpO1xuICBwcml2YXRlIHRvYXN0U2VydmljZSA9IGluamVjdChBWFRvYXN0U2VydmljZSk7XG4gIHByaXZhdGUgZGlhbG9nU2VydmljZSA9IGluamVjdChBWERpYWxvZ1NlcnZpY2UpO1xuICBwcml2YXRlIGh0bWxVdGlscyA9IGluamVjdChBWFBIdG1sVXRpbHMpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcm91dGVQYXJhbXMgPSB0aGlzLnJvdXRlLnNuYXBzaG90O1xuICBwcml2YXRlIHBheWxvYWQgPSBjb21wdXRlZCgoKSA9PiAoe1xuICAgIHJvb21UeXBlOiAnZGVmYXVsdCcsXG4gICAgZW50aXR5SWQ6IHRoaXMucm91dGVQYXJhbXMucGFyYW1zPy5bJ21vZHVsZSddICsgJy4nICsgdGhpcy5yb3V0ZVBhcmFtcy5wYXJhbXM/LlsnZW50aXR5J10sXG4gICAgaW5zdGFuY2VJZDogdGhpcy5yb3V0ZVBhcmFtcy5wYXJhbXM/LlsnaWQnXSxcbiAgfSkpO1xuICB0aW1lPzogbnVtYmVyO1xuXG4gIHByb3RlY3RlZCBjb21tZW50cyA9IHNpZ25hbDxBWFBDb21tZW50W10+KFtdKTtcbiAgcHJpdmF0ZSB3eXNpd3lnID0gdmlld0NoaWxkPEFYV3lzaXd5Z0NvbnRhaW5lckNvbXBvbmVudD4oJ3cnKTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRDb21tZW50cygpO1xuICAgIHRoaXMudGltZSA9IE1hdGgucmFuZG9tKCkgKiAtMTAwMDAwMDAwO1xuICB9XG5cbiAgcHJvdGVjdGVkIHd5c2l3eWdPcHRpb25zID0gc2lnbmFsPHtcbiAgICBsb29rOiBBWFN0eWxlTG9va1R5cGU7XG4gIH0+KHtcbiAgICBsb29rOiAnc29saWQnLFxuICB9KTtcblxuICBwcm90ZWN0ZWQgYXZhdGFyQ29uZmlnID0gc2lnbmFsPHtcbiAgICBjb2xvcjogc3RyaW5nO1xuICAgIGxvb2s6ICdzaGFycCcgfCAnc29mdCcgfCAncm91bmRlZCc7XG4gICAgdHlwZTogc3RyaW5nO1xuICB9Pih7XG4gICAgY29sb3I6ICdwcmltYXJ5JyxcbiAgICBsb29rOiAncm91bmRlZCcsXG4gICAgdHlwZTogJ3NvbGlkJywgLy8gJ2ltYWdlJyB8ICd0ZXh0JyB8ICdpY29uJyB8ICdkZWZhdWx0J1xuICB9KTtcblxuICB2YWxpZGF0ZUNvbnRlbnQgPSAoY29udGVudDogc3RyaW5nKSA9PiB7XG4gICAgbGV0IGlzVmFsaWQgPSB0cnVlO1xuXG4gICAgaWYgKCFjb250ZW50IHx8IGNvbnRlbnQgPT09ICc8cD48YnI+PC9wPicpIHtcbiAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJ1bGU6ICdjYWxsYmFjaycsXG4gICAgICByZXN1bHQ6IGlzVmFsaWQsXG4gICAgICBtZXNzYWdlOiBpc1ZhbGlkID8gJycgOiAnUGxlYXNlIGZpbGwgdGhlIGNvbnRlbnQnLFxuICAgICAgdmFsdWU6IGNvbnRlbnQsXG4gICAgfTtcbiAgfTtcblxuICBzYW5pdGl6ZUh0bWwoaHRtbENvbnRlbnQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmh0bWxVdGlscy5nZXRTYWZlSFRNTGZyb21IVE1MKGh0bWxDb250ZW50KTtcbiAgfVxuXG4gIGhhbmRsZUltYWdlRXJyb3IoaW1hZ2VJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5mYWlsZWRJbWFnZUlkcy51cGRhdGUoKGlkcykgPT4gWy4uLmlkcywgaW1hZ2VJZF0pO1xuICB9XG5cbiAgY2hlY2tJbWFnZUV4aXN0cyhpbWFnZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuZmFpbGVkSW1hZ2VJZHMoKS5pbmNsdWRlcyhpbWFnZUlkKTtcbiAgfVxuXG4gIGV4dHJhY3RJbml0aWFscyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHdvcmRzID0gbmFtZS5zcGxpdCgnICcpO1xuICAgIGNvbnN0IGluaXRpYWxzID0gd29yZHMubWFwKCh3b3JkKSA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpKTtcbiAgICByZXR1cm4gaW5pdGlhbHMuam9pbignJyk7XG4gIH1cblxuICBhc3luYyBsb2FkQ29tbWVudHMoKSB7XG4gICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jb21tZW50U2VydmljZS5nZXQodGhpcy5wYXlsb2FkKCkpO1xuICAgIHRoaXMuY29tbWVudHMuc2V0KHJlc3BvbnNlLml0ZW1zKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgfSwgMjUwKTtcbiAgfVxuXG4gIGVkaXRNZXNzYWdlKGNvbW1lbnQ6IEFYUENvbW1lbnQsIHJlcGx5PzogQVhQQ29tbWVudCkge1xuICAgIHRoaXMuaXNSZXBseWluZ01vZGUuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmFjdGl2ZVJlcGx5Q29tbWVudC5zZXQodW5kZWZpbmVkKTtcbiAgICB0aGlzLmlzRWRpdGluZ01vZGUuc2V0KHRydWUpO1xuICAgIHRoaXMuYWN0aXZlRWRpdENvbW1lbnQuc2V0KGNvbW1lbnQpO1xuICAgIGNvbnN0IGNvbnRlbnRUb0VkaXQgPSByZXBseSA/IHJlcGx5LmNvbnRlbnQgOiBjb21tZW50LmNvbnRlbnQ7XG4gICAgdGhpcy5jb21tZW50Q29udGVudC5zZXQoY29udGVudFRvRWRpdCk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgncWwtZWRpdG9yJylbMF0uaW5uZXJIVE1MID0gY29udGVudFRvRWRpdDtcbiAgICB0aGlzLnd5c2l3eWdFZGl0b3IoKS5nZXRIb3N0RWxlbWVudCgpLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ3N0YXJ0JyB9KTtcbiAgfVxuXG4gIHJlcGx5TWVzc2FnZShjb21tZW50OiBBWFBDb21tZW50LCByZXBseT86IEFYUENvbW1lbnQpIHtcbiAgICB0aGlzLmlzRWRpdGluZ01vZGUuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmFjdGl2ZUVkaXRDb21tZW50LnNldCh1bmRlZmluZWQpO1xuICAgIHRoaXMuaXNSZXBseWluZ01vZGUuc2V0KHRydWUpO1xuICAgIHRoaXMuYWN0aXZlUmVwbHlDb21tZW50LnNldChjb21tZW50KTtcbiAgICBpZiAocmVwbHkpIHtcbiAgICAgIGNvbnN0IG1lbnRpb24gPSBgPGEgZGF0YS1pZD1cIiR7cmVwbHkuaWR9XCI+QCR7cmVwbHkudXNlci51c2VyTmFtZX08L2E+IGA7XG4gICAgICB0aGlzLmNvbW1lbnRDb250ZW50LnNldChtZW50aW9uKTtcbiAgICAgIHRoaXMud3lzaXd5ZygpPy5mb2N1cygpO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgncWwtZWRpdG9yJylbMF0uaW5uZXJIVE1MID0gbWVudGlvbjtcbiAgICB9XG4gICAgdGhpcy53eXNpd3lnRWRpdG9yKCkuZ2V0SG9zdEVsZW1lbnQoKS5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdzdGFydCcgfSk7XG4gIH1cblxuICBhc3luYyBkZWxldGVDb21tZW50KGNvbW1lbnQ6IEFYUENvbW1lbnQpIHtcbiAgICBjb25zdCBkaWFsb2cgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3Blbih7XG4gICAgICBpY29uOiAnZmEtcmVndWxhciBmYS13YXJuaW5nJyxcbiAgICAgIGNvbnRlbnQ6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgY29tbWVudD8nLFxuICAgICAgdGl0bGU6ICdEZWxldGUgQ29tbWVudCcsXG4gICAgICB0eXBlOiAnZGFuZ2VyJyxcbiAgICAgIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcsXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiAnRGVsZXRlJyxcbiAgICAgICAgICBjb2xvcjogJ2RhbmdlcicsXG4gICAgICAgICAgb25DbGljazogYXN5bmMgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgZS5oYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGUuc291cmNlLnRleHQgPSAnRGVsZXRpbmcuLi4nO1xuICAgICAgICAgICAgZS5zb3VyY2UuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgZS5zb3VyY2UubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvbW1lbnRTZXJ2aWNlLmRlbGV0ZSh7IGlkOiBjb21tZW50LmlkIH0pO1xuICAgICAgICAgICAgICB0aGlzLnJlbW92ZU1lc3NhZ2VCeUlkKGNvbW1lbnQuaWQpO1xuICAgICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiAnQ29tbWVudCBkZWxldGVkIHN1Y2Nlc3NmdWxseS4nLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAnc3VjY2VzcycsXG4gICAgICAgICAgICAgICAgbG9jYXRpb246ICdib3R0b20tY2VudGVyJyxcbiAgICAgICAgICAgICAgICBjbG9zZUJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0aW1lT3V0OiAzMDAwLFxuICAgICAgICAgICAgICAgIHRpbWVPdXRQcm9ncmVzczogdHJ1ZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICh0aGlzLmlzRWRpdGluZ01vZGUoKSAmJiB0aGlzLmFjdGl2ZUVkaXRDb21tZW50KCk/LmlkID09PSBjb21tZW50LmlkKSB8fCB0aGlzLnJlc2V0UmVwbHlFZGl0U3RhdGU7XG4gICAgICAgICAgICAgIGRpYWxvZy5jbG9zZSgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyh7XG4gICAgICAgICAgICAgICAgY29udGVudDogdHlwZW9mIGVycm9yID09PSAnc3RyaW5nJyA/IGVycm9yIDogJ0ZhaWxlZCB0byBkZWxldGUgY29tbWVudCEnLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAnZGFuZ2VyJyxcbiAgICAgICAgICAgICAgICBsb2NhdGlvbjogJ2JvdHRvbS1jZW50ZXInLFxuICAgICAgICAgICAgICAgIGNsb3NlQnV0dG9uOiB0cnVlLFxuICAgICAgICAgICAgICAgIHRpbWVPdXQ6IDMwMDAsXG4gICAgICAgICAgICAgICAgdGltZU91dFByb2dyZXNzOiB0cnVlLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogJ0NhbmNlbCcsXG4gICAgICAgICAgY29sb3I6ICdnaG9zdCcsXG4gICAgICAgICAgYXV0b2ZvY3VzOiB0cnVlLFxuICAgICAgICAgIG9uQ2xpY2s6IChlKSA9PiB7XG4gICAgICAgICAgICBkaWFsb2cuY2xvc2UoKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGNsb3NlQnV0dG9uOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVJlcGx5KGNvbW1lbnQ6IEFYUENvbW1lbnQsIHJlcGx5OiBBWFBDb21tZW50KSB7XG4gICAgY29uc3QgZGlhbG9nID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oe1xuICAgICAgaWNvbjogJ2ZhLXJlZ3VsYXIgZmEtd2FybmluZycsXG4gICAgICBjb250ZW50OiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIHJlcGx5PycsXG4gICAgICB0aXRsZTogJ0RlbGV0ZSBSZXBseScsXG4gICAgICB0eXBlOiAnZGFuZ2VyJyxcbiAgICAgIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcsXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiAnRGVsZXRlJyxcbiAgICAgICAgICBjb2xvcjogJ2RhbmdlcicsXG4gICAgICAgICAgb25DbGljazogYXN5bmMgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgZS5oYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGUuc291cmNlLnRleHQgPSAnRGVsZXRpbmcuLi4nO1xuICAgICAgICAgICAgZS5zb3VyY2UuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgZS5zb3VyY2UubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvbW1lbnRTZXJ2aWNlLmRlbGV0ZSh7IGlkOiBjb21tZW50LmlkIH0pO1xuICAgICAgICAgICAgICB0aGlzLnJlbW92ZU1lc3NhZ2VCeUlkKGNvbW1lbnQuaWQsIHJlcGx5LmlkKTtcbiAgICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyh7XG4gICAgICAgICAgICAgICAgY29udGVudDogJ0NvbW1lbnQgZGVsZXRlZCBzdWNjZXNzZnVsbHkuJyxcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgIGxvY2F0aW9uOiAnYm90dG9tLWNlbnRlcicsXG4gICAgICAgICAgICAgICAgY2xvc2VCdXR0b246IHRydWUsXG4gICAgICAgICAgICAgICAgdGltZU91dDogMzAwMCxcbiAgICAgICAgICAgICAgICB0aW1lT3V0UHJvZ3Jlc3M6IHRydWUsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBkaWFsb2cuY2xvc2UoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coe1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycgPyBlcnJvciA6ICdGYWlsZWQgdG8gZGVsZXRlIGNvbW1lbnQhJyxcbiAgICAgICAgICAgICAgICBjb2xvcjogJ2RhbmdlcicsXG4gICAgICAgICAgICAgICAgbG9jYXRpb246ICdib3R0b20tY2VudGVyJyxcbiAgICAgICAgICAgICAgICBjbG9zZUJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0aW1lT3V0OiAzMDAwLFxuICAgICAgICAgICAgICAgIHRpbWVPdXRQcm9ncmVzczogdHJ1ZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6ICdDYW5jZWwnLFxuICAgICAgICAgIGNvbG9yOiAnZ2hvc3QnLFxuICAgICAgICAgIGF1dG9mb2N1czogdHJ1ZSxcbiAgICAgICAgICBvbkNsaWNrOiAoZSkgPT4ge1xuICAgICAgICAgICAgZGlhbG9nLmNsb3NlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBjbG9zZUJ1dHRvbjogZmFsc2UsXG4gICAgfSk7XG4gIH1cblxuICByZXNldFJlcGx5RWRpdFN0YXRlKCkge1xuICAgIHRoaXMuaXNFZGl0aW5nTW9kZS5zZXQoZmFsc2UpO1xuICAgIHRoaXMuYWN0aXZlRWRpdENvbW1lbnQuc2V0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5pc1JlcGx5aW5nTW9kZS5zZXQoZmFsc2UpO1xuICAgIHRoaXMuYWN0aXZlUmVwbHlDb21tZW50LnNldCh1bmRlZmluZWQpO1xuICB9XG5cbiAgYXN5bmMgdG9nZ2xlTGlrZShjb21tZW50OiBBWFBDb21tZW50LCByZXBseT86IEFYUENvbW1lbnQpIHtcbiAgICBpZiAocmVwbHkpIHtcbiAgICAgIHRoaXMudXBkYXRlTGlrZVN0YXR1cyhjb21tZW50LmlkLCByZXBseS5pZCk7XG4gICAgICBjb25zdCBwYXlsb2FkOiBBWFBMaWtlUmVxdWVzdCA9IHtcbiAgICAgICAgbWVzc2FnZUlkOiByZXBseS5pZCxcbiAgICAgICAgdHlwZTogJ2xpa2UnLFxuICAgICAgfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jb21tZW50U2VydmljZS5saWtlKHBheWxvYWQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy51cGRhdGVMaWtlU3RhdHVzKGNvbW1lbnQuaWQsIHJlcGx5LmlkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVMaWtlU3RhdHVzKGNvbW1lbnQuaWQpO1xuICAgICAgY29uc3QgcGF5bG9hZDogQVhQTGlrZVJlcXVlc3QgPSB7XG4gICAgICAgIG1lc3NhZ2VJZDogY29tbWVudC5pZCxcbiAgICAgICAgdHlwZTogJ2xpa2UnLFxuICAgICAgfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jb21tZW50U2VydmljZS5saWtlKHBheWxvYWQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy51cGRhdGVMaWtlU3RhdHVzKGNvbW1lbnQuaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTGlrZVN0YXR1cyhjb21tZW50SWQ6IHN0cmluZywgcmVwbHlJZD86IHN0cmluZykge1xuICAgIHRoaXMuY29tbWVudHMudXBkYXRlKChjb21tZW50c0xpc3QpID0+IHtcbiAgICAgIHJldHVybiBjb21tZW50c0xpc3QubWFwKChjb21tZW50KSA9PiB7XG4gICAgICAgIGlmIChjb21tZW50LmlkID09PSBjb21tZW50SWQpIHtcbiAgICAgICAgICBpZiAocmVwbHlJZCkge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlZFJlcGxpZXMgPSBjb21tZW50LnJlcGxpZXMubWFwKChyZXBseSkgPT5cbiAgICAgICAgICAgICAgcmVwbHkuaWQgPT09IHJlcGx5SWRcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgLi4ucmVwbHksXG4gICAgICAgICAgICAgICAgICAgIGlzTGlrZWQ6ICFyZXBseS5pc0xpa2VkLFxuICAgICAgICAgICAgICAgICAgICByZWFjdGlvbnNDb3VudDogcmVwbHkuaXNMaWtlZCA/IC0tcmVwbHkucmVhY3Rpb25zQ291bnQgOiArK3JlcGx5LnJlYWN0aW9uc0NvdW50LFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogcmVwbHlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmNvbW1lbnQsXG4gICAgICAgICAgICAgIHJlcGxpZXM6IHVwZGF0ZWRSZXBsaWVzLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uY29tbWVudCxcbiAgICAgICAgICAgICAgaXNMaWtlZDogIWNvbW1lbnQuaXNMaWtlZCxcbiAgICAgICAgICAgICAgcmVhY3Rpb25zQ291bnQ6IGNvbW1lbnQuaXNMaWtlZCA/IC0tY29tbWVudC5yZWFjdGlvbnNDb3VudCA6ICsrY29tbWVudC5yZWFjdGlvbnNDb3VudCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21tZW50O1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZU1lc3NhZ2VCeUlkKGNvbW1lbnRJZDogc3RyaW5nLCByZXBseUlkPzogc3RyaW5nKSB7XG4gICAgdGhpcy5jb21tZW50cy51cGRhdGUoKGNvbW1lbnRzTGlzdCkgPT5cbiAgICAgIGNvbW1lbnRzTGlzdFxuICAgICAgICAubWFwKChjb21tZW50KSA9PiB7XG4gICAgICAgICAgaWYgKGNvbW1lbnQuaWQgPT09IGNvbW1lbnRJZCkge1xuICAgICAgICAgICAgaWYgKHJlcGx5SWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5jb21tZW50LFxuICAgICAgICAgICAgICAgIHJlcGxpZXM6IGNvbW1lbnQucmVwbGllcy5maWx0ZXIoKHJlcGx5KSA9PiByZXBseS5pZCAhPT0gcmVwbHlJZCksXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNvbW1lbnQ7XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKGNvbW1lbnQpID0+IGNvbW1lbnQgIT09IG51bGwpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHN1Ym1pdENvbW1lbnQoaXNQcml2YXRlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBkZWJ1Z2dlcjtcbiAgICBpZiAoIXRoaXMudmFsaWRhdGVDb250ZW50KHRoaXMuY29tbWVudENvbnRlbnQoKSkucmVzdWx0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG1lbWJlckxvb2t1cDtcbiAgICBpZiAoaXNQcml2YXRlKSB7XG4gICAgICBjb25zdCBwb3B1cENvbmZpZzogQVhQb3B1cENvbmZpZyA9IHtcbiAgICAgICAgaGVhZGVyOiB0cnVlLFxuICAgICAgICBzaXplOiAnbWQnLFxuICAgICAgICBkcmFnZ2FibGU6IHRydWUsXG4gICAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgICBjbG9zZUJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgY2xvc2VPbkJhY2tkcm9wQ2xpY2s6IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHBvcHVwID0gYXdhaXQgdGhpcy5wb3B1cFNlcnZpY2Uub3BlbihBWFBDb21tZW50TG9va3VwUG9wdXAsIHBvcHVwQ29uZmlnKTtcbiAgICAgIG1lbWJlckxvb2t1cCA9IHBvcHVwLmRhdGE/LmRhdGE/Lmxvb2t1cDtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNFZGl0aW5nTW9kZSgpKSB7XG4gICAgICBjb25zdCBwYXlsb2FkOiBBWFBQdXRSZXF1ZXN0ID0ge1xuICAgICAgICBpZDogdGhpcy5hY3RpdmVFZGl0Q29tbWVudCgpPy5pZCxcbiAgICAgICAgY29udGVudDogdGhpcy5jb21tZW50Q29udGVudCgpLFxuICAgICAgfSBhcyBBWFBQdXRSZXF1ZXN0O1xuICAgICAgYXdhaXQgdGhpcy5jb21tZW50U2VydmljZS5wdXQocGF5bG9hZCk7XG4gICAgICB0aGlzLmlzU3VibWl0dGluZy5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLmhhc0Nvb2xkb3duLnNldCh0cnVlKTtcbiAgICAgIHRoaXMuaXNFZGl0aW5nTW9kZS5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5hY3RpdmVFZGl0Q29tbWVudC5zZXQodW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcGF5bG9hZDogQVhQUG9zdFJlcXVlc3QgPSB7XG4gICAgICAgIC4uLnRoaXMucGF5bG9hZCgpLFxuICAgICAgICBjb250ZW50OiB0aGlzLmNvbW1lbnRDb250ZW50KCksXG4gICAgICAgIGNvbnRlbnRUeXBlOiAndGV4dCcsXG4gICAgICAgIGlzUHJpdmF0ZTogaXNQcml2YXRlLFxuICAgICAgICByZXBseUlkOiB0aGlzLmFjdGl2ZVJlcGx5Q29tbWVudCgpPy5pZCxcbiAgICAgICAgbWVtYmVyczogaXNQcml2YXRlID8gW21lbWJlckxvb2t1cF0gOiBbXSxcbiAgICAgIH0gYXMgQVhQUG9zdFJlcXVlc3Q7XG4gICAgICBhd2FpdCB0aGlzLmNvbW1lbnRTZXJ2aWNlLnBvc3QocGF5bG9hZCk7XG4gICAgICB0aGlzLmlzU3VibWl0dGluZy5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLmhhc0Nvb2xkb3duLnNldCh0cnVlKTtcblxuICAgICAgdGhpcy5pc1JlcGx5aW5nTW9kZS5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5hY3RpdmVSZXBseUNvbW1lbnQuc2V0KHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jb21tZW50U2VydmljZS5nZXQodGhpcy5wYXlsb2FkKCkpO1xuICAgIHRoaXMuY29tbWVudHMuc2V0KHJlc3BvbnNlLml0ZW1zKTtcbiAgICB0aGlzLmNvbW1lbnRDb250ZW50LnNldCgnJyk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgncWwtZWRpdG9yJylbMF0uaW5uZXJIVE1MID0gJyc7XG4gICAgdGhpcy5pc1N1Ym1pdHRpbmcuc2V0KGZhbHNlKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaGFzQ29vbGRvd24uc2V0KGZhbHNlKTtcbiAgICB9LCAxMDAwKTtcbiAgfVxuXG4gIHNjcm9sbE1haW4oKSB7XG4gICAgY29uc29sZS5sb2coJ2NsaWNrZWQnKTtcbiAgICAvLyBkZWJ1Z2dlclxuICAgIGNvbnN0IGNvbW1lbnQgPSB0aGlzLmlzUmVwbHlpbmdNb2RlKCkgPyB0aGlzLmFjdGl2ZVJlcGx5Q29tbWVudCgpIDogdGhpcy5hY3RpdmVFZGl0Q29tbWVudCgpO1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoKGNvbW1lbnQgYXMgQVhQQ29tbWVudCkuaWQpO1xuICAgIGlmIChlbCkge1xuICAgICAgZWwuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnY2VudGVyJyB9KTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBlbD8uZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCBwcmV2QmcgPSBjb250ZW50LnN0eWxlLmJhY2tncm91bmQ7XG4gICAgICBjb250ZW50LnN0eWxlLmJvcmRlclJhZGl1cyA9ICcwLjI1cmVtJztcbiAgICAgIGNvbnRlbnQuc3R5bGUudHJhbnNpdGlvbiA9ICdiYWNrZ3JvdW5kIDFzIGVhc2UtaW4tb3V0JztcbiAgICAgIGNvbnRlbnQuc3R5bGUuYmFja2dyb3VuZCA9ICcjZTJmZmZjJztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb250ZW50LnN0eWxlLmJhY2tncm91bmQgPSBwcmV2QmcgfHwgJ3JnYmEoMCwgMCwgMCwgMCknO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYXgtbXQtMlwiPlxuICA8YXgtY29tbWVudC1jb250YWluZXI+XG4gICAgQGlmKGlzTG9hZGluZygpKXtcbiAgICA8ZGl2IGNsYXNzPVwiYXgtZmxleCBheC1pdGVtcy1jZW50ZXIgYXgtcHktMTIgYXgtYmctc3VyZmFjZSBheC1weC01XCI+XG4gICAgICA8YXgtc2tlbGV0b24gY2xhc3M9XCJheC1taW4tdy0xNiBheC1oLTE2IGF4LXJvdW5kZWQtZnVsbCBheC1tZS00XCI+PC9heC1za2VsZXRvbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJheC1mbGV4IGF4LWZsZXgtY29sIGF4LWdhcC0yIGF4LXctZnVsbFwiPlxuICAgICAgICA8YXgtc2tlbGV0b24gY2xhc3M9XCJheC13LWZ1bGwgYXgtaC02IGF4LXJvdW5kZWRcIj48L2F4LXNrZWxldG9uPlxuICAgICAgICA8YXgtc2tlbGV0b24gY2xhc3M9XCJheC13LWZ1bGwgYXgtaC0yIGF4LXJvdW5kZWQtZnVsbFwiPjwvYXgtc2tlbGV0b24+XG4gICAgICAgIDxheC1za2VsZXRvbiBjbGFzcz1cImF4LXctZnVsbCBheC1oLTIgYXgtcm91bmRlZC1mdWxsXCI+PC9heC1za2VsZXRvbj5cbiAgICAgICAgPGF4LXNrZWxldG9uIGNsYXNzPVwiYXgtdy04LzEyIGF4LWgtMiBheC1yb3VuZGVkLWZ1bGxcIj48L2F4LXNrZWxldG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgfSBAZWxzZSBpZighaXNMb2FkaW5nKCkgJiYgY29tbWVudHMoKS5sZW5ndGggPiAwKXtcbiAgICA8YXgtY29tbWVudC12aWV3IGNsYXNzPVwiYXgtYmctc3VyZmFjZVwiPlxuICAgICAgQGZvcihjb21tZW50IG9mIGNvbW1lbnRzKCk7IHRyYWNrIGNvbW1lbnQuaWQpe1xuICAgICAgPGF4LWNvbW1lbnQtaXRlbSBbaWRdPVwiY29tbWVudC5pZFwiIFtyZXBseUNvdW50XT1cImNvbW1lbnQucmVwbGllcy5sZW5ndGhcIj5cbiAgICAgICAgPGF4LWF2YXRhciBbY29sb3JdPVwiYXZhdGFyQ29uZmlnKCkuY29sb3JcIiBbbG9va109XCJhdmF0YXJDb25maWcoKS5sb29rXCI+XG4gICAgICAgICAgQGlmKGNoZWNrSW1hZ2VFeGlzdHMoY29tbWVudC5pZCkgJiYgY29tbWVudC51c2VyLnBpY3R1cmUpe1xuICAgICAgICAgIDxheC1pbWFnZSAob25FcnJvcik9XCJoYW5kbGVJbWFnZUVycm9yKGNvbW1lbnQuaWQpXCIgW3NyY109XCJjb21tZW50LnVzZXIucGljdHVyZVwiPlxuICAgICAgICAgICAgPGF4LWxvYWRpbmc+PC9heC1sb2FkaW5nPlxuICAgICAgICAgIDwvYXgtaW1hZ2U+XG4gICAgICAgICAgfUBlbHNle1xuICAgICAgICAgIDxheC10ZXh0PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJheC10ZXh0LWJhc2UgYXgtb3ZlcmZsb3ctaGlkZGVuXCI+e3tcbiAgICAgICAgICAgICAgZXh0cmFjdEluaXRpYWxzKGNvbW1lbnQudXNlci5maXJzdE5hbWUgKyAnICcgKyBjb21tZW50LnVzZXIubGFzdE5hbWUpXG4gICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2F4LXRleHQ+XG4gICAgICAgICAgfVxuICAgICAgICA8L2F4LWF2YXRhcj5cbiAgICAgICAgPGF4LXRpdGxlPnt7IGNvbW1lbnQudXNlci5maXJzdE5hbWUgKyAnICcgKyBjb21tZW50LnVzZXIubGFzdE5hbWUgfX08L2F4LXRpdGxlPlxuICAgICAgICA8YXgtY29tbWVudC1kYXRlPnt7IHRpbWUgfCBmb3JtYXQgOiAndGltZWxlZnQnIHwgYXN5bmMgfX0gPC9heC1jb21tZW50LWRhdGU+XG4gICAgICAgIDxheC1jb21tZW50LW1lbnUtb3B0aW9ucz5cbiAgICAgICAgICA8YXgtYnV0dG9uIGNsYXNzPVwiYXgtc21cIiBsb29rPVwiYmxhbmtcIiBjb2xvcj1cInNlY29uZGFyeVwiPlxuICAgICAgICAgICAgPGF4LWljb24gaWNvbj1cImF4LWljb24gYXgtaWNvbi1zb2xpZCBheC1pY29uLW1vcmUtaG9yaXpvbnRhbFwiPjwvYXgtaWNvbj5cbiAgICAgICAgICA8L2F4LWJ1dHRvbj5cblxuICAgICAgICAgIDxheC1kcm9wZG93bi1wYW5lbD5cbiAgICAgICAgICAgIDxheC1idXR0b24taXRlbS1saXN0PlxuICAgICAgICAgICAgICA8YXgtYnV0dG9uLWl0ZW0gdGV4dD1cIkVkaXRcIiBjb2xvcj1cInNlY29uZGFyeVwiIChjbGljayk9XCJlZGl0TWVzc2FnZShjb21tZW50KVwiPlxuICAgICAgICAgICAgICAgIDxheC1wcmVmaXg+XG4gICAgICAgICAgICAgICAgICA8YXgtaWNvbiBpY29uPVwiZmEtc29saWQgZmEtZWRpdFwiPjwvYXgtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2F4LXByZWZpeD5cbiAgICAgICAgICAgICAgPC9heC1idXR0b24taXRlbT5cblxuICAgICAgICAgICAgICA8YXgtYnV0dG9uLWl0ZW0gdGV4dD1cIkRlbGV0ZVwiIGNvbG9yPVwiZGFuZ2VyXCIgKGNsaWNrKT1cImRlbGV0ZUNvbW1lbnQoY29tbWVudClcIj5cbiAgICAgICAgICAgICAgICA8YXgtcHJlZml4PlxuICAgICAgICAgICAgICAgICAgPGF4LWljb24gaWNvbj1cImZhLXNvbGlkIGZhLXRyYXNoLWNhblwiPjwvYXgtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2F4LXByZWZpeD5cbiAgICAgICAgICAgICAgPC9heC1idXR0b24taXRlbT5cbiAgICAgICAgICAgIDwvYXgtYnV0dG9uLWl0ZW0tbGlzdD5cbiAgICAgICAgICA8L2F4LWRyb3Bkb3duLXBhbmVsPlxuICAgICAgICA8L2F4LWNvbW1lbnQtbWVudS1vcHRpb25zPlxuICAgICAgICA8YXgtY29udGVudCBbaW5uZXJIVE1MXT1cInNhbml0aXplSHRtbChjb21tZW50LmNvbnRlbnQpXCI+PC9heC1jb250ZW50PlxuICAgICAgICA8YXgtY29tbWVudC1saWtlIChjbGljayk9XCJ0b2dnbGVMaWtlKGNvbW1lbnQpXCIgW2xpa2VkXT1cImNvbW1lbnQuaXNMaWtlZFwiPlxuICAgICAgICAgIHt7IGNvbW1lbnQucmVhY3Rpb25zQ291bnQgfX1cbiAgICAgICAgPC9heC1jb21tZW50LWxpa2U+XG4gICAgICAgIDxheC1jb21tZW50LXJlcGx5LXRleHQgKGNsaWNrKT1cInJlcGx5TWVzc2FnZShjb21tZW50KVwiPjwvYXgtY29tbWVudC1yZXBseS10ZXh0PlxuICAgICAgICBAZm9yKHJlcGx5IG9mIGNvbW1lbnQucmVwbGllczsgdHJhY2sgcmVwbHkuaWQpe1xuICAgICAgICA8YXgtY29tbWVudC1pdGVtIFtpZF09XCJyZXBseS5pZFwiPlxuICAgICAgICAgIDxheC1hdmF0YXIgW2NvbG9yXT1cImF2YXRhckNvbmZpZygpLmNvbG9yXCIgW2xvb2tdPVwiYXZhdGFyQ29uZmlnKCkubG9va1wiPlxuICAgICAgICAgICAgQGlmKGNoZWNrSW1hZ2VFeGlzdHMocmVwbHkuaWQpICYmIHJlcGx5LnVzZXIucGljdHVyZSl7XG4gICAgICAgICAgICA8YXgtaW1hZ2UgKG9uRXJyb3IpPVwiaGFuZGxlSW1hZ2VFcnJvcihyZXBseS5pZClcIiBbc3JjXT1cInJlcGx5LnVzZXIucGljdHVyZVwiPlxuICAgICAgICAgICAgICA8YXgtbG9hZGluZz48L2F4LWxvYWRpbmc+XG4gICAgICAgICAgICA8L2F4LWltYWdlPlxuICAgICAgICAgICAgfUBlbHNle1xuICAgICAgICAgICAgPGF4LXRleHQ+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXgtdGV4dC1iYXNlIGF4LW92ZXJmbG93LWhpZGRlblwiPnt7XG4gICAgICAgICAgICAgICAgZXh0cmFjdEluaXRpYWxzKHJlcGx5LnVzZXIuZmlyc3ROYW1lICsgJyAnICsgcmVwbHkudXNlci5sYXN0TmFtZSlcbiAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2F4LXRleHQ+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9heC1hdmF0YXI+XG4gICAgICAgICAgPGF4LXRpdGxlPnt7IChyZXBseT8udXNlcj8uZmlyc3ROYW1lID8/ICcnKSArICcgJyArIChyZXBseT8udXNlcj8ubGFzdE5hbWUgPz8gJycpIH19PC9heC10aXRsZT5cbiAgICAgICAgICA8YXgtY29tbWVudC1tZW51LW9wdGlvbnM+XG4gICAgICAgICAgICA8YXgtYnV0dG9uIGNsYXNzPVwiYXgtc21cIiBsb29rPVwiYmxhbmtcIiBjb2xvcj1cInNlY29uZGFyeVwiPlxuICAgICAgICAgICAgICA8YXgtaWNvbiBpY29uPVwiYXgtaWNvbiBheC1pY29uLXNvbGlkIGF4LWljb24tbW9yZS1ob3Jpem9udGFsXCI+PC9heC1pY29uPlxuICAgICAgICAgICAgPC9heC1idXR0b24+XG5cbiAgICAgICAgICAgIDxheC1kcm9wZG93bi1wYW5lbD5cbiAgICAgICAgICAgICAgPGF4LWJ1dHRvbi1pdGVtLWxpc3Q+XG4gICAgICAgICAgICAgICAgPGF4LWJ1dHRvbi1pdGVtIHRleHQ9XCJFZGl0XCIgY29sb3I9XCJzZWNvbmRhcnlcIiAoY2xpY2spPVwiZWRpdE1lc3NhZ2UoY29tbWVudCwgcmVwbHkpXCI+XG4gICAgICAgICAgICAgICAgICA8YXgtcHJlZml4PlxuICAgICAgICAgICAgICAgICAgICA8YXgtaWNvbiBpY29uPVwiZmEtc29saWQgZmEtZWRpdFwiPjwvYXgtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDwvYXgtcHJlZml4PlxuICAgICAgICAgICAgICAgIDwvYXgtYnV0dG9uLWl0ZW0+XG4gICAgICAgICAgICAgICAgPGF4LWJ1dHRvbi1pdGVtIHRleHQ9XCJEZWxldGVcIiBjb2xvcj1cImRhbmdlclwiIChjbGljayk9XCJkZWxldGVSZXBseShjb21tZW50LCByZXBseSlcIj5cbiAgICAgICAgICAgICAgICAgIDxheC1wcmVmaXg+XG4gICAgICAgICAgICAgICAgICAgIDxheC1pY29uIGljb249XCJmYS1zb2xpZCBmYS10cmFzaC1jYW5cIj48L2F4LWljb24+XG4gICAgICAgICAgICAgICAgICA8L2F4LXByZWZpeD5cbiAgICAgICAgICAgICAgICA8L2F4LWJ1dHRvbi1pdGVtPlxuICAgICAgICAgICAgICA8L2F4LWJ1dHRvbi1pdGVtLWxpc3Q+XG4gICAgICAgICAgICA8L2F4LWRyb3Bkb3duLXBhbmVsPlxuICAgICAgICAgIDwvYXgtY29tbWVudC1tZW51LW9wdGlvbnM+XG4gICAgICAgICAgPGF4LWNvbnRlbnQgW2lubmVySFRNTF09XCJzYW5pdGl6ZUh0bWwocmVwbHkuY29udGVudClcIj48L2F4LWNvbnRlbnQ+XG4gICAgICAgICAgPGF4LWNvbW1lbnQtbGlrZSAoY2xpY2spPVwidG9nZ2xlTGlrZShjb21tZW50LCByZXBseSlcIiBbbGlrZWRdPVwicmVwbHkuaXNMaWtlZFwiPlxuICAgICAgICAgICAge3sgcmVwbHkucmVhY3Rpb25zQ291bnQgfX1cbiAgICAgICAgICA8L2F4LWNvbW1lbnQtbGlrZT5cbiAgICAgICAgICA8YXgtY29tbWVudC1yZXBseS10ZXh0IChjbGljayk9XCJyZXBseU1lc3NhZ2UoY29tbWVudCwgcmVwbHkpXCI+PC9heC1jb21tZW50LXJlcGx5LXRleHQ+XG4gICAgICAgIDwvYXgtY29tbWVudC1pdGVtPlxuICAgICAgICB9XG4gICAgICA8L2F4LWNvbW1lbnQtaXRlbT5cbiAgICAgIH0gPC9heC1jb21tZW50LXZpZXdcbiAgICA+fSBAZWxzZXtcbiAgICA8ZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImF4LWZsZXggYXgtZmxleC1jb2wgYXgtZ2FwLTQgYXgtanVzdGlmeS1jZW50ZXIgYXgtaXRlbXMtY2VudGVyIGF4LXAtMTBcIj5cbiAgICAgICAgPHN2Z1xuICAgICAgICAgIGNsYXNzPVwiYXgtbXgtYXV0b1wiXG4gICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgd2lkdGg9XCIxNTRcIlxuICAgICAgICAgIGhlaWdodD1cIjE2MVwiXG4gICAgICAgICAgdmlld0JveD1cIjAgMCAxNTQgMTYxXCJcbiAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk0wLjA2MTY0NTUgODQuNDI2OEMwLjA2MTY0NTUgNDIuMDIxMyAzNC40MzUgNy44Mzc2NSA3Ni42NTA3IDcuODM3NjVDMTE4LjgwMyA3LjgzNzY1IDE1My4yMjQgNDIuMDA1NSAxNTMuMjI0IDg0LjQyNjhDMTUzLjIyNCAxMDIuNDIgMTQ3LjAyNiAxMTguOTc0IDEzNi42MjIgMTMyLjAzNEMxMjIuMjgyIDE1MC4xMzggMTAwLjM2NyAxNjEgNzYuNjUwNyAxNjFDNTIuNzc1OSAxNjEgMzAuOTg4MiAxNTAuMDU5IDE2LjY2MzMgMTMyLjAzNEM2LjI1OTYxIDExOC45NzQgMC4wNjE2NDU1IDEwMi40MiAwLjA2MTY0NTUgODQuNDI2OFpcIlxuICAgICAgICAgICAgZmlsbD1cIiNFRUYyRkZcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIGQ9XCJNOTYuODE4OSAwLjYzMjQ5OEw5Ni44MTg5IDAuNjMyMzg0TDk2LjgwODMgMC42MzA5NTRDOTYuMjAzNCAwLjU0OTU4MSA5NS41OTMxIDAuNSA5NC45Nzg3IDAuNUgyOS4zMzhDMjIuNzExMiAwLjUgMTcuMzM5NCA1Ljg0NDU1IDE3LjMzOTQgMTIuNDQ3M1YxNDIuNzE1QzE3LjMzOTQgMTQ5LjMxOCAyMi43MTEyIDE1NC42NjIgMjkuMzM4IDE1NC42NjJIMTIzLjk0OEMxMzAuNTkxIDE1NC42NjIgMTM1Ljk0NiAxNDkuMzE3IDEzNS45NDYgMTQyLjcxNVYzOC45MzA5QzEzNS45NDYgMzguMDI0NCAxMzUuODQ3IDM3LjEzMzQgMTM1LjY0OCAzNi4yNTg2TDEzNS42NDggMzYuMjU4NEMxMzUuMTE3IDMzLjkzMDkgMTMzLjg3NCAzMS43Njg2IDEzMi4wNjYgMzAuMTMzM0MxMzIuMDY2IDMwLjEzMzEgMTMyLjA2NSAzMC4xMzI5IDEzMi4wNjUgMzAuMTMyN0wxMDMuMDY4IDMuNjUyMDNDMTAzLjA2OCAzLjY1MTkgMTAzLjA2NyAzLjY1MTc3IDEwMy4wNjcgMy42NTE2NEMxMDEuMzExIDIuMDM1MjYgOTkuMTM5NiAwLjk5NTU1MiA5Ni44MTg5IDAuNjMyNDk4WlwiXG4gICAgICAgICAgICBmaWxsPVwid2hpdGVcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiI0U1RTdFQlwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8ZWxsaXBzZSBjeD1cIjgwLjA2MThcIiBjeT1cIjgxXCIgcng9XCIyOC4wMzQyXCIgcnk9XCIyOC4wMzQyXCIgZmlsbD1cIiNFRUYyRkZcIiAvPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTk5LjIzOTMgNjEuMzA2MUw5OS4yMzkxIDYxLjMwNThDODguNDk4IDUwLjU4MDggNzEuMTA5MiA1MC41ODA0IDYwLjM4MzUgNjEuMzA2MUM0OS42NDIzIDcyLjAzMTYgNDkuNjQyMiA4OS40MzYxIDYwLjM4MzIgMTAwLjE2MkM3MS4xMDkgMTEwLjkwMyA4OC40OTgyIDExMC45MDMgOTkuMjM5MyAxMDAuMTYyQzEwOS45NjUgODkuNDM2MyAxMDkuOTY1IDcyLjAzMTcgOTkuMjM5MyA2MS4zMDYxWk0xMDUuODYzIDU0LjY4MzJDMTIwLjI0OSA2OS4wNjk1IDEyMC4yNDkgOTIuMzk4NSAxMDUuODYzIDEwNi43ODVDOTEuNDYwNSAxMjEuMTcxIDY4LjE0NjggMTIxLjE3MSA1My43NDQ2IDEwNi43ODVDMzkuMzU4MiA5Mi4zOTg3IDM5LjM1ODIgNjkuMDY5MyA1My43NDQ2IDU0LjY4M0M2OC4xNDY4IDQwLjI5NjUgOTEuNDYwNSA0MC4yOTY2IDEwNS44NjMgNTQuNjgzMlpcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiI0U1RTdFQlwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk0xMTAuNzgyIDExOS4yNjdMMTAyLjAxNiAxMTAuNDkyQzEwNC44ODggMTA4LjI2NyAxMDcuNDc2IDEwNS42NTEgMTA5LjU2NCAxMDIuOTU1TDExOC4zMjkgMTExLjcyOUwxMTAuNzgyIDExOS4yNjdaXCJcbiAgICAgICAgICAgIHN0cm9rZT1cIiNFNUU3RUJcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIGQ9XCJNMTM5LjEyMiAxMjUuNzgxTDEzOS4xMjIgMTI1Ljc4TDEyMy4zMTMgMTA5Ljk4OEMxMjMuMzEzIDEwOS45ODcgMTIzLjMxMyAxMDkuOTg3IDEyMy4zMTIgMTA5Ljk4NkMxMjEuOTk2IDEwOC42NTMgMTE5Ljg0OSAxMDguNjU3IDExOC41MjEgMTA5Ljk4NUwxMTguODcxIDExMC4zMzVMMTE4LjUyMSAxMDkuOTg1TDEwOS4wNDcgMTE5LjQ1OUMxMDcuNzMxIDEyMC43NzUgMTA3LjczNSAxMjIuOTE4IDEwOS4wNDQgMTI0LjI0N0wxMDkuMDQ3IDEyNC4yNDlMMTI0Ljg1OCAxNDAuMDZDMTI4Ljc4OSAxNDMuOTkyIDEzNS4xOTEgMTQzLjk5MiAxMzkuMTIyIDE0MC4wNkMxNDMuMDY5IDEzNi4xMTMgMTQzLjA2OSAxMjkuNzI4IDEzOS4xMjIgMTI1Ljc4MVpcIlxuICAgICAgICAgICAgZmlsbD1cIiNBNUI0RkNcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiIzgxOENGOFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk04My4xODUgODcuMjI4NUM4Mi41Mzg3IDg3LjIyODUgODIuMDAyNyA4Ni42OTI2IDgyLjAwMjcgODYuMDMwNUM4Mi4wMDI3IDgzLjM4MjEgNzcuOTk4NyA4My4zODIxIDc3Ljk5ODcgODYuMDMwNUM3Ny45OTg3IDg2LjY5MjYgNzcuNDYyNyA4Ny4yMjg1IDc2LjgwMDYgODcuMjI4NUM3Ni4xNTQzIDg3LjIyODUgNzUuNjE4MyA4Ni42OTI2IDc1LjYxODMgODYuMDMwNUM3NS42MTgzIDgwLjIyOTQgODQuMzgzMSA4MC4yNDUxIDg0LjM4MzEgODYuMDMwNUM4NC4zODMxIDg2LjY5MjYgODMuODQ3MSA4Ny4yMjg1IDgzLjE4NSA4Ny4yMjg1WlwiXG4gICAgICAgICAgICBmaWxsPVwiIzRGNDZFNVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk05My4zNTI4IDc3LjA5MjZIODguNDAzQzg3Ljc0MDkgNzcuMDkyNiA4Ny4yMDQ5IDc2LjU1NjcgODcuMjA0OSA3NS44OTQ2Qzg3LjIwNDkgNzUuMjQ4MyA4Ny43NDA5IDc0LjcxMjMgODguNDAzIDc0LjcxMjNIOTMuMzUyOEM5NC4wMTQ5IDc0LjcxMjMgOTQuNTUwOSA3NS4yNDgzIDk0LjU1MDkgNzUuODk0NkM5NC41NTA5IDc2LjU1NjcgOTQuMDE0OSA3Ny4wOTI2IDkzLjM1MjggNzcuMDkyNlpcIlxuICAgICAgICAgICAgZmlsbD1cIiM0RjQ2RTVcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIGQ9XCJNNzEuNTk4NyA3Ny4wOTI1SDY2LjY0ODhDNjUuOTg2NyA3Ny4wOTI1IDY1LjQ1MDcgNzYuNTU2NSA2NS40NTA3IDc1Ljg5NDVDNjUuNDUwNyA3NS4yNDgxIDY1Ljk4NjcgNzQuNzEyMiA2Ni42NDg4IDc0LjcxMjJINzEuNTk4N0M3Mi4yNDUgNzQuNzEyMiA3Mi43ODEgNzUuMjQ4MSA3Mi43ODEgNzUuODk0NUM3Mi43ODEgNzYuNTU2NSA3Mi4yNDUgNzcuMDkyNSA3MS41OTg3IDc3LjA5MjVaXCJcbiAgICAgICAgICAgIGZpbGw9XCIjNEY0NkU1XCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxyZWN0IHg9XCIzOC4zNTIyXCIgeT1cIjIxLjUxMjhcIiB3aWR0aD1cIjQxLjAyNTZcIiBoZWlnaHQ9XCIyLjczNTA0XCIgcng9XCIxLjM2NzUyXCIgZmlsbD1cIiM0RjQ2RTVcIiAvPlxuICAgICAgICAgIDxyZWN0IHg9XCIzOC4zNTIyXCIgeT1cIjEzMy42NVwiIHdpZHRoPVwiNTQuNzAwOVwiIGhlaWdodD1cIjUuNDcwMDlcIiByeD1cIjIuNzM1MDRcIiBmaWxsPVwiI0E1QjRGQ1wiIC8+XG4gICAgICAgICAgPHJlY3QgeD1cIjM4LjM1MjJcIiB5PVwiMjkuNzE3OVwiIHdpZHRoPVwiMTMuNjc1MlwiIGhlaWdodD1cIjIuNzM1MDRcIiByeD1cIjEuMzY3NTJcIiBmaWxsPVwiIzRGNDZFNVwiIC8+XG4gICAgICAgICAgPGNpcmNsZSBjeD1cIjU2LjEzXCIgY3k9XCIzMS4wODU0XCIgcj1cIjEuMzY3NTJcIiBmaWxsPVwiIzRGNDZFNVwiIC8+XG4gICAgICAgICAgPGNpcmNsZSBjeD1cIjYxLjYwMDFcIiBjeT1cIjMxLjA4NTRcIiByPVwiMS4zNjc1MlwiIGZpbGw9XCIjNEY0NkU1XCIgLz5cbiAgICAgICAgICA8Y2lyY2xlIGN4PVwiNjcuMDcwMlwiIGN5PVwiMzEuMDg1NFwiIHI9XCIxLjM2NzUyXCIgZmlsbD1cIiM0RjQ2RTVcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aDIgY2xhc3M9XCJheC10ZXh0LWNlbnRlciBheC10ZXh0LW5ldXRyYWwtNjAwIGF4LWZvbnQtc2VtaWJvbGQgYXgtbGVhZGluZy1sb29zZSBheC1wYi0yXCI+XG4gICAgICAgICAgICBUaGVyZSBpcyBubyBDb21tZW50IVxuICAgICAgICAgIDwvaDI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgfVxuICA8L2F4LWNvbW1lbnQtY29udGFpbmVyPlxuICA8YXgtZm9ybT5cbiAgICA8YXgtZm9ybS1maWVsZD5cbiAgICAgIDxkaXY+XG4gICAgICAgIEBpZihpc1JlcGx5aW5nTW9kZSgpIHx8IGlzRWRpdGluZ01vZGUoKSl7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImF4LWZsZXggYXgtanVzdGlmeS1iZXR3ZWVuIGF4LXJvdW5kZWQtYi1ub25lIGF4LWJvcmRlciBheC1ib3JkZXItYi0wIGF4LXJvdW5kZWQtbGcgYXgtYmctb24tc3VyZmFjZSBheC1weC02IGF4LXB5LTMgYXgtdy1mdWxsIGF4LWl0ZW1zLWNlbnRlciBheC1vdmVyZmxvdy1oaWRkZW4gYXgtdGV4dC1zbSBheC1sZWFkaW5nLW5vbmVcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiAoY2xpY2spPVwic2Nyb2xsTWFpbigpXCIgY2xhc3M9XCJheC1mbGV4IGF4LWp1c3RpZnktc3RhcnQgYXgtaXRlbXMtY2VudGVyIGF4LWN1cnNvci1wb2ludGVyXCI+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICBbY2xhc3NdPVwiaXNSZXBseWluZ01vZGUoKSA/ICdmYS1yZXBseScgOiAnZmEtcGVuJ1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmEtc29saWQgYXgtdGV4dC1wcmltYXJ5LTUwMCBkYXJrOmF4LXRleHQtcHJpbWFyeS0zMDAgYXgtdGV4dC0yeGwgYXgtbWUtNFwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImF4LWZsZXggYXgtZmxleC1jb2wgYXgtZ2FwLTIgYXgtanVzdGlmeS1iZXR3ZWVuIGF4LWFsaWduLW1pZGRsZSBheC1sZWFkaW5nLTQgYXgtb3ZlcmZsb3ctaGlkZGVuXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJheC10ZXh0LXByaW1hcnktNTAwIGRhcms6YXgtdGV4dC1wcmltYXJ5LTMwMFwiPlxuICAgICAgICAgICAgICAgIHt7IGlzUmVwbHlpbmdNb2RlKCkgPyAnUmVwbHkgdG8gJyA6ICdFZGl0IE1lc3NhZ2UnIH19XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJheC1mb250LWJvbGRcIj5cbiAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgIGlzUmVwbHlpbmdNb2RlKClcbiAgICAgICAgICAgICAgICAgICAgICA/IGFjdGl2ZVJlcGx5Q29tbWVudCgpPy51c2VyPy5maXJzdE5hbWUgKyAnICcgKyBhY3RpdmVSZXBseUNvbW1lbnQoKT8udXNlcj8ubGFzdE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICA6ICcnXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJheC10cnVuY2F0ZVwiXG4gICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJcbiAgICAgICAgICAgICAgICAgIGlzUmVwbHlpbmdNb2RlKClcbiAgICAgICAgICAgICAgICAgICAgPyBzYW5pdGl6ZUh0bWwoYWN0aXZlUmVwbHlDb21tZW50KCk/LmNvbnRlbnQgPz8gJycpXG4gICAgICAgICAgICAgICAgICAgIDogc2FuaXRpemVIdG1sKGFjdGl2ZUVkaXRDb21tZW50KCk/LmNvbnRlbnQgPz8gJycpXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdj48aSAoY2xpY2spPVwicmVzZXRSZXBseUVkaXRTdGF0ZSgpXCIgY2xhc3M9XCJmYS1zb2xpZCBheC10ZXh0LTJ4bCBmYS14bWFyayBheC1jdXJzb3ItcG9pbnRlclwiPjwvaT48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgPGF4LXd5c2l3eWctY29udGFpbmVyICN3IFtsb29rXT1cInd5c2l3eWdPcHRpb25zKCkubG9va1wiIFsobmdNb2RlbCldPVwiY29tbWVudENvbnRlbnRcIj5cbiAgICAgICAgICA8YXgtd3lzaXd5Zy12aWV3IGNsYXNzPVwiYXgtbWluLWgtMjhcIj48L2F4LXd5c2l3eWctdmlldz5cbiAgICAgICAgICA8YXgtd3lzaXd5Zy10b29sYmFyPlxuICAgICAgICAgICAgPGF4LXd5c2l3eWctaGlzdG9yeT48L2F4LXd5c2l3eWctaGlzdG9yeT5cbiAgICAgICAgICAgIDxheC13eXNpd3lnLWZvbnQtc3R5bGU+PC9heC13eXNpd3lnLWZvbnQtc3R5bGU+XG4gICAgICAgICAgICA8YXgtd3lzaXd5Zy1jb2xvcnM+PC9heC13eXNpd3lnLWNvbG9ycz5cbiAgICAgICAgICAgIDxheC13eXNpd3lnLWxpc3Q+PC9heC13eXNpd3lnLWxpc3Q+XG4gICAgICAgICAgICA8YXgtd3lzaXd5Zy1hbGlnbm1lbnQ+PC9heC13eXNpd3lnLWFsaWdubWVudD5cbiAgICAgICAgICAgIDxheC1zdWZmaXg+XG4gICAgICAgICAgICAgIDxheC1kcm9wZG93bi1idXR0b25cbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaGFzQ29vbGRvd24oKVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICBtb2RlPVwic3BsaXRcIlxuICAgICAgICAgICAgICAgIHRleHQ9XCJTZW5kXCJcbiAgICAgICAgICAgICAgICAob25DbGljayk9XCJzdWJtaXRDb21tZW50KClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQGlmKGlzU3VibWl0dGluZygpKXsgPGF4LWxvYWRpbmc+PC9heC1sb2FkaW5nPiB9XG4gICAgICAgICAgICAgICAgPGF4LWJ1dHRvbi1pdGVtLWxpc3Q+XG4gICAgICAgICAgICAgICAgICA8YXgtYnV0dG9uLWl0ZW0gKGNsaWNrKT1cInN1Ym1pdENvbW1lbnQodHJ1ZSlcIiB0ZXh0PVwiU2VuZCBQcml2YXRlIC4uLlwiIG5hbWU9XCJwcml2YXRlXCIgZGF0YT1cInByaXZhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGF4LXByZWZpeD5cbiAgICAgICAgICAgICAgICAgICAgICA8YXgtaWNvbiBpY29uPVwiZmEtcmVndWxhciBmYS11c2VyLXNlY3JldFwiPjwvYXgtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9heC1wcmVmaXg+XG4gICAgICAgICAgICAgICAgICA8L2F4LWJ1dHRvbi1pdGVtPlxuICAgICAgICAgICAgICAgIDwvYXgtYnV0dG9uLWl0ZW0tbGlzdD5cbiAgICAgICAgICAgICAgPC9heC1kcm9wZG93bi1idXR0b24+XG4gICAgICAgICAgICA8L2F4LXN1ZmZpeD5cbiAgICAgICAgICA8L2F4LXd5c2l3eWctdG9vbGJhcj5cbiAgICAgICAgICA8YXgtdmFsaWRhdGlvbi1ydWxlIHJ1bGU9XCJjYWxsYmFja1wiIFtvcHRpb25zXT1cInsgdmFsaWRhdGU6IHZhbGlkYXRlQ29udGVudCB9XCI+PC9heC12YWxpZGF0aW9uLXJ1bGU+XG4gICAgICAgIDwvYXgtd3lzaXd5Zy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2F4LWZvcm0tZmllbGQ+XG4gIDwvYXgtZm9ybT5cbjwvZGl2PlxuIl19
|