stream-chat-angular 4.66.1 → 5.0.0-v5.2

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 (161) hide show
  1. package/assets/version.d.ts +1 -1
  2. package/{esm2015/assets/version.js → esm2020/assets/version.mjs} +2 -2
  3. package/esm2020/lib/attachment-configuration.service.mjs +185 -0
  4. package/esm2020/lib/attachment-list/attachment-list.component.mjs +205 -0
  5. package/esm2020/lib/attachment-preview-list/attachment-preview-list.component.mjs +45 -0
  6. package/esm2020/lib/attachment.service.mjs +262 -0
  7. package/esm2020/lib/avatar/avatar.component.mjs +163 -0
  8. package/esm2020/lib/avatar-placeholder/avatar-placeholder.component.mjs +74 -0
  9. package/esm2020/lib/channel/channel.component.mjs +46 -0
  10. package/esm2020/lib/channel-header/channel-header.component.mjs +79 -0
  11. package/esm2020/lib/channel-list/channel-list-toggle.service.mjs +72 -0
  12. package/esm2020/lib/channel-list/channel-list.component.mjs +60 -0
  13. package/esm2020/lib/channel-preview/channel-preview.component.mjs +155 -0
  14. package/esm2020/lib/channel.service.mjs +1460 -0
  15. package/esm2020/lib/chat-client.service.mjs +206 -0
  16. package/{esm2015/lib/custom-templates.service.js → esm2020/lib/custom-templates.service.mjs} +3 -3
  17. package/{esm2015/lib/date-parser.service.js → esm2020/lib/date-parser.service.mjs} +3 -3
  18. package/esm2020/lib/edit-message-form/edit-message-form.component.mjs +83 -0
  19. package/esm2020/lib/get-channel-display-text.mjs +14 -0
  20. package/esm2020/lib/get-message-translation.mjs +12 -0
  21. package/esm2020/lib/icon/icon.component.mjs +21 -0
  22. package/esm2020/lib/icon-placeholder/icon-placeholder.component.mjs +31 -0
  23. package/esm2020/lib/loading-indicator/loading-indicator.component.mjs +31 -0
  24. package/esm2020/lib/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +38 -0
  25. package/esm2020/lib/message/message.component.mjs +418 -0
  26. package/esm2020/lib/message-actions-box/message-actions-box.component.mjs +130 -0
  27. package/esm2020/lib/message-actions.service.mjs +119 -0
  28. package/esm2020/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +71 -0
  29. package/esm2020/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +262 -0
  30. package/{esm2015/lib/message-input/emoji-input.service.js → esm2020/lib/message-input/emoji-input.service.mjs} +3 -3
  31. package/{esm2015/lib/message-input/message-input-config.service.js → esm2020/lib/message-input/message-input-config.service.mjs} +3 -3
  32. package/esm2020/lib/message-input/message-input.component.mjs +443 -0
  33. package/{esm2015/lib/message-input/textarea/textarea.component.js → esm2020/lib/message-input/textarea/textarea.component.mjs} +5 -9
  34. package/esm2020/lib/message-input/textarea.directive.mjs +89 -0
  35. package/esm2020/lib/message-list/group-styles.mjs +52 -0
  36. package/{esm2015/lib/message-list/image-load.service.js → esm2020/lib/message-list/image-load.service.mjs} +3 -3
  37. package/esm2020/lib/message-list/message-list.component.mjs +699 -0
  38. package/esm2020/lib/message-preview.mjs +21 -0
  39. package/esm2020/lib/message-reactions/message-reactions.component.mjs +252 -0
  40. package/{esm2015/lib/message-reactions.service.js → esm2020/lib/message-reactions.service.mjs} +3 -3
  41. package/{esm2015/lib/message.service.js → esm2020/lib/message.service.mjs} +4 -4
  42. package/esm2020/lib/modal/modal.component.mjs +69 -0
  43. package/esm2020/lib/notification/notification.component.mjs +20 -0
  44. package/esm2020/lib/notification-list/notification-list.component.mjs +37 -0
  45. package/esm2020/lib/notification.service.mjs +79 -0
  46. package/esm2020/lib/read-by.mjs +12 -0
  47. package/{esm2015/lib/stream-autocomplete-textarea.module.js → esm2020/lib/stream-autocomplete-textarea.module.mjs} +6 -6
  48. package/{esm2015/lib/stream-avatar.module.js → esm2020/lib/stream-avatar.module.mjs} +5 -5
  49. package/{esm2015/lib/stream-chat.module.js → esm2020/lib/stream-chat.module.mjs} +14 -16
  50. package/{esm2015/lib/stream-i18n.service.js → esm2020/lib/stream-i18n.service.mjs} +5 -5
  51. package/{esm2015/lib/stream-textarea.module.js → esm2020/lib/stream-textarea.module.mjs} +6 -6
  52. package/esm2020/lib/theme.service.mjs +123 -0
  53. package/esm2020/lib/thread/thread.component.mjs +51 -0
  54. package/{esm2015/lib/transliteration.service.js → esm2020/lib/transliteration.service.mjs} +3 -3
  55. package/esm2020/lib/types.mjs +2 -0
  56. package/esm2020/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +183 -0
  57. package/esm2020/lib/voice-recording/voice-recording.component.mjs +102 -0
  58. package/fesm2015/{stream-chat-angular.js → stream-chat-angular.mjs} +313 -426
  59. package/fesm2015/stream-chat-angular.mjs.map +1 -0
  60. package/fesm2020/stream-chat-angular.mjs +7123 -0
  61. package/fesm2020/stream-chat-angular.mjs.map +1 -0
  62. package/lib/attachment-list/attachment-list.component.d.ts +3 -3
  63. package/lib/attachment-preview-list/attachment-preview-list.component.d.ts +1 -1
  64. package/lib/attachment.service.d.ts +0 -1
  65. package/lib/avatar/avatar.component.d.ts +1 -1
  66. package/lib/avatar-placeholder/avatar-placeholder.component.d.ts +1 -1
  67. package/lib/channel/channel.component.d.ts +1 -1
  68. package/lib/channel-header/channel-header.component.d.ts +1 -1
  69. package/lib/channel-list/channel-list-toggle.service.d.ts +0 -1
  70. package/lib/channel-list/channel-list.component.d.ts +1 -1
  71. package/lib/channel-preview/channel-preview.component.d.ts +1 -1
  72. package/lib/channel.service.d.ts +7 -7
  73. package/lib/chat-client.service.d.ts +1 -1
  74. package/lib/edit-message-form/edit-message-form.component.d.ts +1 -1
  75. package/lib/get-message-translation.d.ts +1 -1
  76. package/lib/icon/icon.component.d.ts +1 -1
  77. package/lib/icon-placeholder/icon-placeholder.component.d.ts +1 -1
  78. package/lib/loading-indicator/loading-indicator.component.d.ts +1 -1
  79. package/lib/loading-indicator-placeholder/loading-indicator-placeholder.component.d.ts +1 -1
  80. package/lib/message/message.component.d.ts +3 -7
  81. package/lib/message-actions-box/message-actions-box.component.d.ts +2 -4
  82. package/lib/message-actions.service.d.ts +0 -1
  83. package/lib/message-bounce-prompt/message-bounce-prompt.component.d.ts +1 -1
  84. package/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.d.ts +1 -1
  85. package/lib/message-input/message-input.component.d.ts +2 -2
  86. package/lib/message-input/textarea/textarea.component.d.ts +1 -1
  87. package/lib/message-input/textarea.directive.d.ts +1 -1
  88. package/lib/message-list/group-styles.d.ts +1 -1
  89. package/lib/message-list/message-list.component.d.ts +4 -5
  90. package/lib/message-reactions/message-reactions.component.d.ts +1 -4
  91. package/lib/message.service.d.ts +0 -1
  92. package/lib/modal/modal.component.d.ts +1 -1
  93. package/lib/notification/notification.component.d.ts +1 -1
  94. package/lib/notification-list/notification-list.component.d.ts +2 -2
  95. package/lib/notification.service.d.ts +2 -5
  96. package/lib/stream-chat.module.d.ts +3 -3
  97. package/lib/theme.service.d.ts +1 -2
  98. package/lib/thread/thread.component.d.ts +1 -1
  99. package/lib/types.d.ts +18 -18
  100. package/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.d.ts +2 -2
  101. package/lib/voice-recording/voice-recording.component.d.ts +1 -1
  102. package/package.json +31 -17
  103. package/src/assets/styles/v2/css/index.css +1 -1
  104. package/src/assets/styles/v2/css/index.layout.css +1 -1
  105. package/src/assets/styles/v2/scss/_base.scss +2 -2
  106. package/src/assets/version.ts +1 -1
  107. package/bundles/stream-chat-angular.umd.js +0 -8445
  108. package/bundles/stream-chat-angular.umd.js.map +0 -1
  109. package/esm2015/lib/attachment-configuration.service.js +0 -186
  110. package/esm2015/lib/attachment-list/attachment-list.component.js +0 -209
  111. package/esm2015/lib/attachment-preview-list/attachment-preview-list.component.js +0 -49
  112. package/esm2015/lib/attachment.service.js +0 -276
  113. package/esm2015/lib/avatar/avatar.component.js +0 -172
  114. package/esm2015/lib/avatar-placeholder/avatar-placeholder.component.js +0 -78
  115. package/esm2015/lib/channel/channel.component.js +0 -50
  116. package/esm2015/lib/channel-header/channel-header.component.js +0 -86
  117. package/esm2015/lib/channel-list/channel-list-toggle.service.js +0 -73
  118. package/esm2015/lib/channel-list/channel-list.component.js +0 -67
  119. package/esm2015/lib/channel-preview/channel-preview.component.js +0 -167
  120. package/esm2015/lib/channel.service.js +0 -1487
  121. package/esm2015/lib/chat-client.service.js +0 -211
  122. package/esm2015/lib/edit-message-form/edit-message-form.component.js +0 -87
  123. package/esm2015/lib/get-channel-display-text.js +0 -15
  124. package/esm2015/lib/get-message-translation.js +0 -13
  125. package/esm2015/lib/icon/icon.component.js +0 -25
  126. package/esm2015/lib/icon-placeholder/icon-placeholder.component.js +0 -35
  127. package/esm2015/lib/loading-indicator/loading-indicator.component.js +0 -35
  128. package/esm2015/lib/loading-indicator-placeholder/loading-indicator-placeholder.component.js +0 -42
  129. package/esm2015/lib/message/message.component.js +0 -436
  130. package/esm2015/lib/message-actions-box/message-actions-box.component.js +0 -137
  131. package/esm2015/lib/message-actions.service.js +0 -114
  132. package/esm2015/lib/message-bounce-prompt/message-bounce-prompt.component.js +0 -80
  133. package/esm2015/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.js +0 -262
  134. package/esm2015/lib/message-input/message-input.component.js +0 -455
  135. package/esm2015/lib/message-input/textarea.directive.js +0 -90
  136. package/esm2015/lib/message-list/group-styles.js +0 -53
  137. package/esm2015/lib/message-list/message-list.component.js +0 -726
  138. package/esm2015/lib/message-preview.js +0 -7
  139. package/esm2015/lib/message-reactions/message-reactions.component.js +0 -266
  140. package/esm2015/lib/modal/modal.component.js +0 -74
  141. package/esm2015/lib/notification/notification.component.js +0 -24
  142. package/esm2015/lib/notification-list/notification-list.component.js +0 -38
  143. package/esm2015/lib/notification.service.js +0 -79
  144. package/esm2015/lib/read-by.js +0 -13
  145. package/esm2015/lib/theme.service.js +0 -122
  146. package/esm2015/lib/thread/thread.component.js +0 -55
  147. package/esm2015/lib/types.js +0 -2
  148. package/esm2015/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.js +0 -192
  149. package/esm2015/lib/voice-recording/voice-recording.component.js +0 -115
  150. package/fesm2015/stream-chat-angular.js.map +0 -1
  151. /package/{esm2015/assets/i18n/en.js → esm2020/assets/i18n/en.mjs} +0 -0
  152. /package/{esm2015/lib/injection-tokens.js → esm2020/lib/injection-tokens.mjs} +0 -0
  153. /package/{esm2015/lib/is-image-attachment.js → esm2020/lib/is-image-attachment.mjs} +0 -0
  154. /package/{esm2015/lib/is-image-file.js → esm2020/lib/is-image-file.mjs} +0 -0
  155. /package/{esm2015/lib/is-on-separate-date.js → esm2020/lib/is-on-separate-date.mjs} +0 -0
  156. /package/{esm2015/lib/list-users.js → esm2020/lib/list-users.mjs} +0 -0
  157. /package/{esm2015/lib/message-input/textarea.interface.js → esm2020/lib/message-input/textarea.interface.mjs} +0 -0
  158. /package/{esm2015/lib/parse-date.js → esm2020/lib/parse-date.mjs} +0 -0
  159. /package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  160. /package/{esm2015/stream-chat-angular.js → esm2020/stream-chat-angular.mjs} +0 -0
  161. /package/{stream-chat-angular.d.ts → index.d.ts} +0 -0
@@ -1,436 +0,0 @@
1
- import { Component, Input, ViewChild, ChangeDetectionStrategy, } from '@angular/core';
2
- import emojiRegex from 'emoji-regex';
3
- import { listUsers } from '../list-users';
4
- import { NgxPopperjsTriggers, NgxPopperjsPlacements, } from 'ngx-popperjs';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "../chat-client.service";
7
- import * as i2 from "../channel.service";
8
- import * as i3 from "../custom-templates.service";
9
- import * as i4 from "../theme.service";
10
- import * as i5 from "../date-parser.service";
11
- import * as i6 from "../message.service";
12
- import * as i7 from "../message-actions.service";
13
- import * as i8 from "../avatar-placeholder/avatar-placeholder.component";
14
- import * as i9 from "ngx-popperjs";
15
- import * as i10 from "../message-actions-box/message-actions-box.component";
16
- import * as i11 from "../icon-placeholder/icon-placeholder.component";
17
- import * as i12 from "../message-reactions/message-reactions.component";
18
- import * as i13 from "../attachment-list/attachment-list.component";
19
- import * as i14 from "../loading-indicator-placeholder/loading-indicator-placeholder.component";
20
- import * as i15 from "@angular/common";
21
- import * as i16 from "@ngx-translate/core";
22
- /**
23
- * The `Message` component displays a message with additional information such as sender and date, and enables [interaction with the message (i.e. edit or react)](../concepts/message-interactions.mdx).
24
- */
25
- export class MessageComponent {
26
- constructor(chatClientService, channelService, customTemplatesService, cdRef, themeService, dateParser, ngZone, messageService, messageActionsService) {
27
- this.chatClientService = chatClientService;
28
- this.channelService = channelService;
29
- this.customTemplatesService = customTemplatesService;
30
- this.cdRef = cdRef;
31
- this.dateParser = dateParser;
32
- this.ngZone = ngZone;
33
- this.messageService = messageService;
34
- this.messageActionsService = messageActionsService;
35
- /**
36
- * The list of [channel capabilities](https://getstream.io/chat/docs/javascript/channel_capabilities/?language=javascript) that are enabled for the current user, the list of [supported interactions](../concepts/message-interactions.mdx) can be found in our message interaction guide. Unathorized actions won't be displayed on the UI. The [`MessageList`](./MessageListComponent.mdx) component automatically sets this based on [channel capabilities](https://getstream.io/chat/docs/javascript/channel_capabilities/?language=javascript).
37
- */
38
- this.enabledMessageActions = [];
39
- /**
40
- * Determines if the message is being dispalyed in a channel or in a [thread](https://getstream.io/chat/docs/javascript/threads/?language=javascript).
41
- */
42
- this.mode = 'main';
43
- /**
44
- * Highlighting is used to add visual emphasize to a message when jumping to the message
45
- */
46
- this.isHighlighted = false;
47
- /**
48
- * A list of custom message actions to be displayed in the action box
49
- *
50
- * @deprecated please use the [`MessageActionsService`](https://getstream.io/chat/docs/sdk/angular/services/MessageActionsService) to set this property.
51
- */
52
- this.customActions = [];
53
- this.isActionBoxOpen = false;
54
- this.isEditedFlagOpened = false;
55
- this.isReactionSelectorOpen = false;
56
- this.visibleMessageActionsCount = 0;
57
- this.messageTextParts = [];
58
- this.popperTriggerClick = NgxPopperjsTriggers.click;
59
- this.popperTriggerHover = NgxPopperjsTriggers.hover;
60
- this.popperPlacementAuto = NgxPopperjsPlacements.AUTO;
61
- this.shouldDisplayTranslationNotice = false;
62
- this.displayedMessageTextContent = 'original';
63
- this.imageAttachmentModalState = 'closed';
64
- this.shouldDisplayThreadLink = false;
65
- this.isSentByCurrentUser = false;
66
- this.readByText = '';
67
- this.lastReadUser = undefined;
68
- this.isOnlyReadByMe = false;
69
- this.isReadByMultipleUsers = false;
70
- this.isMessageDeliveredAndRead = false;
71
- this.parsedDate = '';
72
- this.pasedEditedDate = '';
73
- this.areOptionsVisible = false;
74
- this.hasAttachment = false;
75
- this.hasReactions = false;
76
- this.replyCountParam = {
77
- replyCount: undefined,
78
- };
79
- this.canDisplayReadStatus = false;
80
- this.subscriptions = [];
81
- this.isViewInited = false;
82
- this.urlRegexp = /(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)(?:\([-A-Z0-9+&@#/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#/%=~_|$?!:,.]*\)|[A-Z0-9+&@#/%=~_|$])/gim;
83
- this.emojiRegexp = new RegExp(emojiRegex(), 'g');
84
- this.themeVersion = themeService.themeVersion;
85
- this.displayAs = this.messageService.displayAs;
86
- }
87
- ngOnInit() {
88
- this.subscriptions.push(this.chatClientService.user$.subscribe((u) => {
89
- if ((u === null || u === void 0 ? void 0 : u.id) !== this.userId) {
90
- this.userId = u === null || u === void 0 ? void 0 : u.id;
91
- this.setIsSentByCurrentUser();
92
- this.setLastReadUser();
93
- if (this.isViewInited) {
94
- this.cdRef.detectChanges();
95
- }
96
- }
97
- }));
98
- }
99
- ngOnChanges(changes) {
100
- var _a, _b, _c, _d, _e, _f, _g;
101
- if (changes.message) {
102
- this.shouldDisplayTranslationNotice = false;
103
- this.displayedMessageTextContent = 'original';
104
- this.createMessageParts();
105
- const originalAttachments = (_b = (_a = this.message) === null || _a === void 0 ? void 0 : _a.quoted_message) === null || _b === void 0 ? void 0 : _b.attachments;
106
- this.quotedMessageAttachments =
107
- originalAttachments && originalAttachments.length
108
- ? [originalAttachments[0]]
109
- : [];
110
- this.setIsSentByCurrentUser();
111
- this.setLastReadUser();
112
- this.readByText = ((_c = this.message) === null || _c === void 0 ? void 0 : _c.readBy)
113
- ? listUsers(this.message.readBy)
114
- : '';
115
- this.isOnlyReadByMe = !!(this.message &&
116
- this.message.readBy &&
117
- this.message.readBy.length === 0);
118
- this.isReadByMultipleUsers = !!(this.message &&
119
- this.message.readBy &&
120
- this.message.readBy.length > 1);
121
- this.isMessageDeliveredAndRead = !!(this.message &&
122
- this.message.readBy &&
123
- this.message.status === 'received' &&
124
- this.message.readBy.length > 0);
125
- this.parsedDate =
126
- (this.message &&
127
- this.message.created_at &&
128
- this.dateParser.parseDateTime(this.message.created_at)) ||
129
- '';
130
- this.pasedEditedDate =
131
- (this.message &&
132
- this.message.message_text_updated_at &&
133
- this.dateParser.parseDateTime(new Date(this.message.message_text_updated_at))) ||
134
- '';
135
- this.hasAttachment =
136
- !!((_d = this.message) === null || _d === void 0 ? void 0 : _d.attachments) && !!this.message.attachments.length;
137
- this.hasReactions =
138
- !!((_e = this.message) === null || _e === void 0 ? void 0 : _e.reaction_counts) &&
139
- Object.keys(this.message.reaction_counts).length > 0;
140
- this.replyCountParam = { replyCount: (_f = this.message) === null || _f === void 0 ? void 0 : _f.reply_count };
141
- }
142
- if (changes.enabledMessageActions) {
143
- this.canReactToMessage =
144
- this.enabledMessageActions.indexOf('send-reaction') !== -1;
145
- this.canReceiveReadEvents =
146
- this.enabledMessageActions.indexOf('read-events') !== -1;
147
- this.canDisplayReadStatus =
148
- this.canReceiveReadEvents !== false &&
149
- this.enabledMessageActions.indexOf('read-events') !== -1;
150
- }
151
- if (changes.message || changes.enabledMessageActions || changes.mode) {
152
- this.shouldDisplayThreadLink =
153
- !!((_g = this.message) === null || _g === void 0 ? void 0 : _g.reply_count) && this.mode !== 'thread';
154
- }
155
- if (changes.message || changes.mode) {
156
- this.areOptionsVisible = this.message
157
- ? !(!this.message.type ||
158
- this.message.type === 'error' ||
159
- this.message.type === 'system' ||
160
- this.message.type === 'ephemeral' ||
161
- this.message.status === 'failed' ||
162
- this.message.status === 'sending' ||
163
- (this.mode === 'thread' && !this.message.parent_id))
164
- : false;
165
- }
166
- if (changes.message ||
167
- changes.enabledMessageActions ||
168
- changes.customActions) {
169
- if (this.message) {
170
- this.visibleMessageActionsCount =
171
- this.messageActionsService.getAuthorizedMessageActionsCount(this.message, this.enabledMessageActions);
172
- }
173
- else {
174
- this.visibleMessageActionsCount = 0;
175
- }
176
- }
177
- }
178
- ngAfterViewInit() {
179
- this.isViewInited = true;
180
- }
181
- ngOnDestroy() {
182
- this.subscriptions.forEach((s) => s.unsubscribe());
183
- }
184
- messageActionsClicked() {
185
- if (!this.message) {
186
- return;
187
- }
188
- if (this.messageActionsService.customActionClickHandler) {
189
- this.messageActionsService.customActionClickHandler({
190
- message: this.message,
191
- enabledActions: this.enabledMessageActions,
192
- customActions: this.customActions,
193
- isMine: this.isSentByCurrentUser,
194
- });
195
- }
196
- else {
197
- this.isActionBoxOpen = !this.isActionBoxOpen;
198
- }
199
- }
200
- messageActionsBoxClicked(popperContent) {
201
- popperContent.hide();
202
- }
203
- getAttachmentListContext() {
204
- var _a, _b, _c;
205
- return {
206
- messageId: ((_a = this.message) === null || _a === void 0 ? void 0 : _a.id) || '',
207
- attachments: ((_b = this.message) === null || _b === void 0 ? void 0 : _b.attachments) || [],
208
- parentMessageId: (_c = this.message) === null || _c === void 0 ? void 0 : _c.parent_id,
209
- imageModalStateChangeHandler: (state) => (this.imageAttachmentModalState = state),
210
- };
211
- }
212
- getMessageContext() {
213
- return {
214
- message: this.message,
215
- enabledMessageActions: this.enabledMessageActions,
216
- isHighlighted: this.isHighlighted,
217
- isLastSentMessage: this.isLastSentMessage,
218
- mode: this.mode,
219
- customActions: this.customActions,
220
- parsedDate: this.parsedDate,
221
- };
222
- }
223
- getQuotedMessageAttachmentListContext() {
224
- var _a, _b, _c, _d;
225
- return {
226
- messageId: ((_b = (_a = this.message) === null || _a === void 0 ? void 0 : _a.quoted_message) === null || _b === void 0 ? void 0 : _b.id) || '',
227
- attachments: this.quotedMessageAttachments,
228
- parentMessageId: (_d = (_c = this === null || this === void 0 ? void 0 : this.message) === null || _c === void 0 ? void 0 : _c.quoted_message) === null || _d === void 0 ? void 0 : _d.parent_id,
229
- };
230
- }
231
- getMessageReactionsContext() {
232
- var _a, _b, _c, _d;
233
- return {
234
- messageReactionCounts: ((_a = this.message) === null || _a === void 0 ? void 0 : _a.reaction_counts) || {},
235
- latestReactions: ((_b = this.message) === null || _b === void 0 ? void 0 : _b.latest_reactions) || [],
236
- isSelectorOpen: this.isReactionSelectorOpen,
237
- isSelectorOpenChangeHandler: (isOpen) => (this.isReactionSelectorOpen = isOpen),
238
- messageId: (_c = this.message) === null || _c === void 0 ? void 0 : _c.id,
239
- ownReactions: ((_d = this.message) === null || _d === void 0 ? void 0 : _d.own_reactions) || [],
240
- };
241
- }
242
- messageClicked() {
243
- var _a, _b, _c, _d;
244
- if (((_a = this.message) === null || _a === void 0 ? void 0 : _a.status) === 'failed' &&
245
- ((_b = this.message) === null || _b === void 0 ? void 0 : _b.errorStatusCode) !== 403) {
246
- this.resendMessage();
247
- }
248
- else if (((_c = this.message) === null || _c === void 0 ? void 0 : _c.type) === 'error' &&
249
- ((_d = this.message) === null || _d === void 0 ? void 0 : _d.moderation_details)) {
250
- this.openMessageBouncePrompt();
251
- }
252
- else {
253
- this.isEditedFlagOpened = !this.isEditedFlagOpened;
254
- }
255
- }
256
- resendMessage() {
257
- void this.channelService.resendMessage(this.message);
258
- }
259
- setAsActiveParentMessage() {
260
- void this.channelService.setAsActiveParentMessage(this.message);
261
- }
262
- getMentionContext(messagePart) {
263
- return {
264
- content: messagePart.content,
265
- user: messagePart.user,
266
- };
267
- }
268
- getMessageActionsBoxContext() {
269
- return {
270
- isOpen: this.isActionBoxOpen,
271
- isMine: this.isSentByCurrentUser,
272
- enabledActions: this.enabledMessageActions,
273
- message: this.message,
274
- displayedActionsCountChaneHanler: (count) => {
275
- this.visibleMessageActionsCount = count;
276
- // message action box changes UI bindings in parent, so we'll have to rerun change detection
277
- this.cdRef.detectChanges();
278
- },
279
- displayedActionsCountChangeHandler: (count) => {
280
- this.visibleMessageActionsCount = count;
281
- // message action box changes UI bindings in parent, so we'll have to rerun change detection
282
- this.cdRef.detectChanges();
283
- },
284
- customActions: this.customActions || [],
285
- };
286
- }
287
- getDeliveredStatusContext() {
288
- return {
289
- message: this.message,
290
- };
291
- }
292
- getSendingStatusContext() {
293
- return {
294
- message: this.message,
295
- };
296
- }
297
- getReadStatusContext() {
298
- return {
299
- message: this.message,
300
- readByText: this.readByText,
301
- };
302
- }
303
- getMessageMetadataContext() {
304
- return {
305
- message: this.message,
306
- };
307
- }
308
- jumpToMessage(messageId, parentMessageId) {
309
- void this.channelService.jumpToMessage(messageId, parentMessageId);
310
- }
311
- displayTranslatedMessage() {
312
- this.createMessageParts(true);
313
- }
314
- displayOriginalMessage() {
315
- this.createMessageParts(false);
316
- }
317
- openMessageBouncePrompt() {
318
- this.channelService.bouncedMessage$.next(this.message);
319
- }
320
- createMessageParts(shouldTranslate = true) {
321
- this.messageTextParts = undefined;
322
- this.messageText = undefined;
323
- let content = this.getMessageContent(shouldTranslate);
324
- if ((!this.message.mentioned_users ||
325
- this.message.mentioned_users.length === 0) &&
326
- !(content === null || content === void 0 ? void 0 : content.match(this.emojiRegexp)) &&
327
- !(content === null || content === void 0 ? void 0 : content.match(this.urlRegexp))) {
328
- this.messageTextParts = undefined;
329
- this.messageText = content;
330
- return;
331
- }
332
- if (!content) {
333
- return;
334
- }
335
- if (!this.message.mentioned_users ||
336
- this.message.mentioned_users.length === 0) {
337
- content = this.fixEmojiDisplay(content);
338
- content = this.wrapLinksWithAnchorTag(content);
339
- this.messageTextParts = [{ content, type: 'text' }];
340
- }
341
- else {
342
- this.messageTextParts = [];
343
- let text = content;
344
- this.message.mentioned_users.forEach((user) => {
345
- const mention = `@${user.name || user.id}`;
346
- const precedingText = text.substring(0, text.indexOf(mention));
347
- let formattedPrecedingText = this.fixEmojiDisplay(precedingText);
348
- formattedPrecedingText = this.wrapLinksWithAnchorTag(formattedPrecedingText);
349
- this.messageTextParts.push({
350
- content: formattedPrecedingText,
351
- type: 'text',
352
- });
353
- this.messageTextParts.push({
354
- content: mention,
355
- type: 'mention',
356
- user,
357
- });
358
- text = text.replace(precedingText + mention, '');
359
- });
360
- if (text) {
361
- text = this.fixEmojiDisplay(text);
362
- text = this.wrapLinksWithAnchorTag(text);
363
- this.messageTextParts.push({ content: text, type: 'text' });
364
- }
365
- }
366
- }
367
- getMessageContent(shouldTranslate) {
368
- var _a, _b;
369
- const originalContent = (_a = this.message) === null || _a === void 0 ? void 0 : _a.text;
370
- if (shouldTranslate) {
371
- const translation = (_b = this.message) === null || _b === void 0 ? void 0 : _b.translation;
372
- if (translation) {
373
- this.shouldDisplayTranslationNotice = true;
374
- this.displayedMessageTextContent = 'translation';
375
- }
376
- return translation || originalContent;
377
- }
378
- else {
379
- this.displayedMessageTextContent = 'original';
380
- return originalContent;
381
- }
382
- }
383
- fixEmojiDisplay(content) {
384
- // Wrap emojis in span to display emojis correctly in Chrome https://bugs.chromium.org/p/chromium/issues/detail?id=596223
385
- // Based on this: https://stackoverflow.com/questions/4565112/javascript-how-to-find-out-if-the-user-browser-is-chrome
386
- /* eslint-disable @typescript-eslint/no-unsafe-member-access */
387
- const isChrome = !!window.chrome && typeof window.opr === 'undefined';
388
- /* eslint-enable @typescript-eslint/no-unsafe-member-access */
389
- content = content.replace(this.emojiRegexp, (match) => `<span ${isChrome ? 'class="str-chat__emoji-display-fix"' : ''}>${match}</span>`);
390
- return content;
391
- }
392
- wrapLinksWithAnchorTag(content) {
393
- if (this.displayAs === 'html') {
394
- return content;
395
- }
396
- content = content.replace(this.urlRegexp, (match) => this.messageService.customLinkRenderer
397
- ? this.messageService.customLinkRenderer(match)
398
- : `<a href="${match}" target="_blank" rel="nofollow">${match}</a>`);
399
- return content;
400
- }
401
- setIsSentByCurrentUser() {
402
- var _a, _b;
403
- this.isSentByCurrentUser = ((_b = (_a = this.message) === null || _a === void 0 ? void 0 : _a.user) === null || _b === void 0 ? void 0 : _b.id) === this.userId;
404
- }
405
- setLastReadUser() {
406
- var _a, _b;
407
- this.lastReadUser = (_b = (_a = this.message) === null || _a === void 0 ? void 0 : _a.readBy) === null || _b === void 0 ? void 0 : _b.filter((u) => u.id !== this.userId)[0];
408
- }
409
- }
410
- MessageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: MessageComponent, deps: [{ token: i1.ChatClientService }, { token: i2.ChannelService }, { token: i3.CustomTemplatesService }, { token: i0.ChangeDetectorRef }, { token: i4.ThemeService }, { token: i5.DateParserService }, { token: i0.NgZone }, { token: i6.MessageService }, { token: i7.MessageActionsService }], target: i0.ɵɵFactoryTarget.Component });
411
- MessageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: MessageComponent, selector: "stream-message", inputs: { message: "message", enabledMessageActions: "enabledMessageActions", isLastSentMessage: "isLastSentMessage", mode: "mode", isHighlighted: "isHighlighted", customActions: "customActions" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #container\n class=\"str-chat__message-simple str-chat__message str-chat__message--{{\n message?.type\n }} str-chat__message--{{ message?.status }} {{\n message?.text ? 'str-chat__message--has-text' : 'has-no-text'\n }}\"\n [class.str-chat__message--me]=\"isSentByCurrentUser\"\n [class.str-chat__message--other]=\"!isSentByCurrentUser\"\n [class.str-chat__message-simple--me]=\"isSentByCurrentUser\"\n [class.str-chat__message--has-attachment]=\"hasAttachment\"\n [class.str-chat__message--with-reactions]=\"hasReactions\"\n [class.str-chat__message--highlighted]=\"isHighlighted\"\n [class.str-chat__message-with-thread-link]=\"shouldDisplayThreadLink\"\n [class.str-chat__message-send-can-be-retried]=\"\n (message?.status === 'failed' && message?.errorStatusCode !== 403) ||\n (message?.type === 'error' && message?.moderation_details)\n \"\n data-testid=\"message-container\"\n>\n <ng-container *ngIf=\"!message?.deleted_at; else deletedMessage\">\n <ng-container *ngIf=\"message?.type !== 'system'; else systemMessage\">\n <ng-container *ngIf=\"themeVersion === '1'\">\n <ng-container *ngTemplateOutlet=\"messageStatus\"></ng-container>\n </ng-container>\n <stream-avatar-placeholder\n data-testid=\"avatar\"\n class=\"str-chat-angular__avatar-host str-chat__message-sender-avatar\"\n [imageUrl]=\"message?.user?.image\"\n [name]=\"message?.user?.name || message?.user?.id\"\n type=\"user\"\n location=\"message-sender\"\n [user]=\"message?.user || undefined\"\n ></stream-avatar-placeholder>\n <div class=\"str-chat__message-inner\">\n <div\n class=\"str-chat__message-simple__actions str-chat__message-options\"\n data-testid=\"message-options\"\n [class.str-chat__message-actions-open]=\"isActionBoxOpen\"\n *ngIf=\"areOptionsVisible\"\n >\n <div\n data-testid=\"message-actions-container\"\n #messageActionsToggle\n class=\"\n str-chat__message-actions-container\n str-chat__message-simple__actions__action\n str-chat__message-simple__actions__action--options\n \"\n [popper]=\"popperContent\"\n [popperTrigger]=\"popperTriggerClick\"\n [popperPlacement]=\"popperPlacementAuto\"\n [popperHideOnScroll]=\"false\"\n [popperHideOnClickOutside]=\"true\"\n [popperHideOnMouseLeave]=\"false\"\n [popperDisableAnimation]=\"true\"\n (popperOnHidden)=\"isActionBoxOpen = false\"\n >\n <popper-content #popperContent>\n <ng-template\n #defaultMessageActionsBox\n let-isOpen=\"isOpen\"\n let-isMine=\"isMine\"\n let-enabledActions=\"enabledActions\"\n let-messageInput=\"message\"\n let-customActions=\"customActions\"\n >\n <stream-message-actions-box\n (click)=\"messageActionsBoxClicked(popperContent)\"\n *ngIf=\"isOpen\"\n [isOpen]=\"isOpen\"\n [isMine]=\"isMine\"\n [enabledActions]=\"enabledActions\"\n [customActions]=\"customActions\"\n [message]=\"messageInput\"\n ></stream-message-actions-box>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageActionsBoxTemplate$ | async) ||\n defaultMessageActionsBox;\n context: getMessageActionsBoxContext()\n \"\n >\n </ng-container>\n </popper-content>\n <div\n class=\"str-chat__message-actions-box-button\"\n data-testid=\"action-icon\"\n (click)=\"messageActionsClicked()\"\n (keyup.enter)=\"messageActionsClicked()\"\n *ngIf=\"visibleMessageActionsCount > 0\"\n >\n <stream-icon-placeholder\n icon=\"action-icon\"\n class=\"str-chat__message-action-icon\"\n ></stream-icon-placeholder>\n </div>\n </div>\n <div\n *ngIf=\"\n enabledMessageActions.indexOf('send-reply') !== -1 &&\n mode === 'main'\n \"\n class=\"\n str-chat__message-simple__actions__action\n str-chat__message-simple__actions__action--thread\n str-chat__message-reply-in-thread-button\n \"\n data-testid=\"reply-in-thread\"\n (click)=\"setAsActiveParentMessage()\"\n (keyup.enter)=\"setAsActiveParentMessage()\"\n >\n <stream-icon-placeholder\n class=\"str-chat__message-action-icon\"\n icon=\"reply-in-thread\"\n ></stream-icon-placeholder>\n </div>\n <div\n *ngIf=\"canReactToMessage\"\n class=\"\n str-chat__message-simple__actions__action\n str-chat__message-simple__actions__action--reactions\n str-chat__message-reactions-button\n \"\n data-testid=\"reaction-icon\"\n (click)=\"isReactionSelectorOpen = !isReactionSelectorOpen\"\n (keyup.enter)=\"isReactionSelectorOpen = !isReactionSelectorOpen\"\n >\n <stream-icon-placeholder\n class=\"str-chat__message-action-icon\"\n icon=\"reaction-icon\"\n ></stream-icon-placeholder>\n </div>\n </div>\n <div class=\"str-chat__message-reactions-host\">\n <ng-template\n #defaultMessageReactions\n let-messageReactionCounts=\"messageReactionCounts\"\n let-latestReactions=\"latestReactions\"\n let-isSelectorOpen=\"isSelectorOpen\"\n let-isSelectorOpenChangeHandler=\"isSelectorOpenChangeHandler\"\n let-messageId=\"messageId\"\n let-ownReactions=\"ownReactions\"\n >\n <stream-message-reactions\n [messageReactionCounts]=\"messageReactionCounts\"\n [latestReactions]=\"latestReactions\"\n [isSelectorOpen]=\"isSelectorOpen\"\n (isSelectorOpenChange)=\"isSelectorOpenChangeHandler($event)\"\n [messageId]=\"messageId\"\n [ownReactions]=\"ownReactions\"\n ></stream-message-reactions>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageReactionsTemplate$ | async) ||\n defaultMessageReactions;\n context: getMessageReactionsContext()\n \"\n ></ng-container>\n </div>\n <div\n class=\"str-chat__message-bubble str-chat-angular__message-bubble\"\n [class.str-chat-angular__message-bubble--attachment-modal-open]=\"\n imageAttachmentModalState === 'opened'\n \"\n >\n <ng-container *ngIf=\"hasAttachment && !message?.quoted_message\">\n <ng-container\n *ngTemplateOutlet=\"attachmentsTemplate\"\n ></ng-container>\n </ng-container>\n <div\n class=\"str-chat__message-text\"\n tabindex=\"0\"\n *ngIf=\"message?.text || (message?.quoted_message && hasAttachment)\"\n [class.str-chat__message-text--pointer-cursor]=\"\n (message?.status === 'failed' &&\n message?.errorStatusCode !== 403) ||\n (this.message?.type === 'error' &&\n this.message?.moderation_details) ||\n message?.message_text_updated_at\n \"\n (click)=\"messageClicked()\"\n (keyup.enter)=\"messageClicked()\"\n >\n <div\n data-testid=\"inner-message\"\n class=\"\n str-chat__message-text-inner str-chat__message-simple-text-inner\n \"\n [class.str-chat__message-light-text-inner--has-attachment]=\"\n hasAttachment\n \"\n >\n <ng-container *ngTemplateOutlet=\"quotedMessage\"></ng-container>\n <ng-container *ngIf=\"hasAttachment && message?.quoted_message\">\n <ng-container\n *ngTemplateOutlet=\"attachmentsTemplate\"\n ></ng-container>\n </ng-container>\n <div\n data-testid=\"client-error-message\"\n *ngIf=\"message?.type === 'error'\"\n class=\"\n str-chat__simple-message--error-message\n str-chat__message--error-message\n \"\n >\n <ng-container *ngIf=\"!message?.moderation_details\">{{\n \"streamChat.Error \u00B7 Unsent\" | translate\n }}</ng-container>\n </div>\n <div\n data-testid=\"error-message\"\n *ngIf=\"message?.status === 'failed'\"\n class=\"\n str-chat__simple-message--error-message\n str-chat__message--error-message\n \"\n >\n {{\n (message?.errorStatusCode === 403\n ? \"streamChat.Message Failed \u00B7 Unauthorized\"\n : \"streamChat.Message Failed \u00B7 Click to try again\"\n ) | translate\n }}\n </div>\n <div data-testid=\"text\">\n <p>\n <ng-container *ngIf=\"messageTextParts; else defaultContent\">\n <!-- eslint-disable-next-line @angular-eslint/template/use-track-by-function -->\n <ng-container *ngFor=\"let part of messageTextParts\">\n <span\n *ngIf=\"part.type === 'text'; else mention\"\n [innerHTML]=\"part.content\"\n ></span>\n <ng-template #mention>\n <ng-template #defaultMention let-content=\"content\">\n <span class=\"str-chat__message-mention\">{{\n content\n }}</span>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.mentionTemplate$ | async) ||\n defaultMention;\n context: getMentionContext(part)\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n </ng-container>\n <ng-template #defaultContent>\n <ng-container *ngIf=\"displayAs === 'text'; else asHTML\">\n {{ messageText || \"\" }}\n </ng-container>\n <ng-template #asHTML\n ><span\n data-testid=\"html-content\"\n [innerHTML]=\"messageText\"\n ></span\n ></ng-template>\n </ng-template>\n </p>\n </div>\n </div>\n </div>\n <stream-icon-placeholder\n *ngIf=\"themeVersion === '2'\"\n class=\"str-chat__message-error-icon\"\n icon=\"error\"\n ></stream-icon-placeholder>\n </div>\n <ng-container\n *ngTemplateOutlet=\"\n replyCountButton;\n context: { position: 'inside-message-bubble' }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n messageDateAndSender;\n context: { position: 'inside-message-bubble' }\n \"\n ></ng-container>\n </div>\n <ng-container\n *ngTemplateOutlet=\"\n replyCountButton;\n context: { position: 'outside-message-bubble', message: message }\n \"\n ></ng-container>\n\n <ng-container\n *ngTemplateOutlet=\"\n messageDateAndSender;\n context: { position: 'outside-message-bubble' }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #deletedMessage>\n <div data-testid=\"message-deleted-component\">\n <div class=\"str-chat__message--deleted-inner\" translate>\n streamChat.This message was deleted...\n </div>\n </div>\n</ng-template>\n\n<ng-template #systemMessage>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.systemMessageTemplate$ | async) ||\n defaultSystemMessage;\n context: getMessageContext()\n \"\n ></ng-container>\n <ng-template #defaultSystemMessage let-messageInput=\"message\">\n <div data-testid=\"system-message\" class=\"str-chat__message--system\">\n <div class=\"str-chat__message--system__text\">\n <div class=\"str-chat__message--system__line\"></div>\n <p>{{ messageInput?.text }}</p>\n <div class=\"str-chat__message--system__line\"></div>\n </div>\n <div class=\"str-chat__message--system__date\">\n {{ parsedDate }}\n </div>\n </div>\n </ng-template>\n</ng-template>\n\n<ng-template #quotedMessage>\n <div\n *ngIf=\"message?.quoted_message\"\n class=\"quoted-message str-chat__quoted-message-preview\"\n data-testid=\"quoted-message-container\"\n [class.mine]=\"isSentByCurrentUser\"\n (click)=\"\n jumpToMessage(\n (message?.quoted_message)!.id,\n message?.quoted_message?.parent_id\n )\n \"\n (keyup.enter)=\"\n jumpToMessage(\n (message?.quoted_message)!.id,\n message?.quoted_message?.parent_id\n )\n \"\n >\n <stream-avatar-placeholder\n data-testid=\"qouted-message-avatar\"\n class=\"str-chat-angular__avatar-host str-chat__message-sender-avatar\"\n [imageUrl]=\"message?.quoted_message?.user?.image\"\n [name]=\"\n message?.quoted_message?.user?.name || message?.quoted_message?.user?.id\n \"\n [size]=\"20\"\n type=\"user\"\n location=\"quoted-message-sender\"\n [user]=\"message?.quoted_message?.user || undefined\"\n ></stream-avatar-placeholder>\n <div class=\"quoted-message-inner str-chat__quoted-message-bubble\">\n <ng-container\n *ngIf=\"\n message?.quoted_message?.attachments &&\n message?.quoted_message?.attachments?.length\n \"\n >\n <ng-template\n #defaultAttachments\n let-messageId=\"messageId\"\n let-attachments=\"attachments\"\n let-parentMessageId=\"parentMessageId\"\n let-imageModalStateChangeHandler=\"imageModalStateChangeHandler\"\n >\n <stream-attachment-list\n [messageId]=\"messageId\"\n [attachments]=\"attachments\"\n [parentMessageId]=\"parentMessageId\"\n (imageModalStateChange)=\"imageModalStateChangeHandler($event)\"\n ></stream-attachment-list>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.attachmentListTemplate$ | async) ||\n defaultAttachments;\n context: getQuotedMessageAttachmentListContext()\n \"\n ></ng-container>\n </ng-container>\n <div\n data-testid=\"quoted-message-text\"\n [innerHTML]=\"\n message?.quoted_message?.translation ||\n message?.quoted_message?.html ||\n message?.quoted_message?.text\n \"\n ></div>\n </div>\n </div>\n</ng-template>\n\n<!-- We need these markups in slightly different positions in theme-v1 and theme-v2, this soultion makes that possible without duplicating the code -->\n<ng-template #messageDateAndSender let-position=\"position\">\n <ng-container\n *ngIf=\"\n (position === 'inside-message-bubble' && themeVersion === '1') ||\n (position === 'outside-message-bubble' && themeVersion === '2')\n \"\n >\n <div\n class=\"str-chat__translation-notice\"\n *ngIf=\"shouldDisplayTranslationNotice\"\n data-testid=\"translation-notice\"\n >\n <button\n data-testid=\"see-original\"\n *ngIf=\"displayedMessageTextContent === 'translation'\"\n (click)=\"displayOriginalMessage()\"\n (keyup.enter)=\"displayOriginalMessage()\"\n translate\n >\n streamChat.See original (automatically translated)\n </button>\n <button\n data-testid=\"see-translation\"\n *ngIf=\"displayedMessageTextContent === 'original'\"\n (click)=\"displayTranslatedMessage()\"\n (keyup.enter)=\"displayTranslatedMessage()\"\n translate\n >\n streamChat.See translation\n </button>\n </div>\n <ng-container\n *ngIf=\"customTemplatesService.customMessageMetadataTemplate$ | async\"\n >\n <div class=\"str-chat__custom-message-metadata\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.customMessageMetadataTemplate$ | async)!;\n context: getMessageMetadataContext()\n \"\n ></ng-container>\n </div>\n </ng-container>\n <div\n class=\"\n str-chat__message-data\n str-chat__message-simple-data\n str-chat__message-metadata\n \"\n >\n <ng-container *ngIf=\"themeVersion === '2'\">\n <ng-container *ngTemplateOutlet=\"messageStatus\"></ng-container>\n </ng-container>\n <span\n data-testid=\"sender\"\n *ngIf=\"!isSentByCurrentUser\"\n class=\"str-chat__message-simple-name str-chat__message-sender-name\"\n >\n {{ message?.user?.name ? message?.user?.name : message?.user?.id }}\n </span>\n <span\n data-testid=\"date\"\n class=\"str-chat__message-simple-timestamp str-chat__message-simple-time\"\n >\n {{ parsedDate }}\n </span>\n <ng-container *ngIf=\"message?.message_text_updated_at\">\n <span\n data-testid=\"edited-flag\"\n class=\"str-chat__mesage-simple-edited\"\n translate\n >streamChat.Edited</span\n >\n <div\n data-testid=\"edited-timestamp\"\n class=\"str-chat__message-edited-timestamp\"\n [ngClass]=\"{\n 'str-chat__message-edited-timestamp--open': isEditedFlagOpened,\n 'str-chat__message-edited-timestamp--collapsed': !isEditedFlagOpened\n }\"\n >\n <span translate>streamChat.Edited</span>\n <time\n dateTime=\"{{ message?.message_text_updated_at }}\"\n title=\"{{ message?.message_text_updated_at }}\"\n >\n {{ pasedEditedDate }}\n </time>\n </div>\n </ng-container>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #messageStatus>\n <ng-container\n *ngIf=\"\n isSentByCurrentUser &&\n ((isLastSentMessage && message?.status === 'received') ||\n message?.status === 'sending')\n \"\n >\n <ng-container *ngIf=\"message?.status === 'sending'; else sentStatus\">\n <ng-container *ngTemplateOutlet=\"sendingStatus\"></ng-container>\n </ng-container>\n <ng-template #sentStatus>\n <ng-container\n *ngIf=\"\n mode === 'main' && isMessageDeliveredAndRead && canDisplayReadStatus;\n else deliveredStatus\n \"\n >\n <ng-container *ngTemplateOutlet=\"readStatus\"></ng-container>\n </ng-container>\n </ng-template>\n <ng-template #deliveredStatus>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.deliveredStatusTemplate$ | async) ||\n defaultDeliveredStatus;\n context: getDeliveredStatusContext()\n \"\n ></ng-container>\n </ng-template>\n <ng-template #defaultDeliveredStatus>\n <span\n *ngIf=\"mode === 'main'\"\n class=\"\n str-chat__message-simple-status\n str-chat__message-simple-status-angular\n str-chat__message-status\n \"\n data-testid=\"delivered-indicator\"\n tabindex=\"0\"\n [popper]=\"popperContent\"\n [popperTrigger]=\"popperTriggerHover\"\n [popperPlacement]=\"popperPlacementAuto\"\n [popperHideOnScroll]=\"false\"\n [popperHideOnClickOutside]=\"false\"\n (hover)=\"$event.stopPropagation()\"\n >\n <popper-content #popperContent>\n <div class=\"str-chat__tooltip str-chat__tooltip-angular\">\n {{ \"streamChat.Delivered\" | translate }}\n </div>\n </popper-content>\n <stream-icon-placeholder\n data-testid=\"delivered-icon\"\n icon=\"delivered-icon\"\n ></stream-icon-placeholder>\n </span>\n </ng-template>\n <ng-template #sendingStatus>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.sendingStatusTemplate$ | async) ||\n defaultSendingStatus;\n context: getSendingStatusContext()\n \"\n ></ng-container>\n </ng-template>\n <ng-template #defaultSendingStatus>\n <span\n class=\"\n str-chat__message-simple-status\n str-chat__message-simple-status-angular\n str-chat__message-status\n \"\n data-testid=\"sending-indicator\"\n tabindex=\"0\"\n [popper]=\"popperContent\"\n [popperTrigger]=\"popperTriggerHover\"\n [popperPlacement]=\"popperPlacementAuto\"\n [popperHideOnScroll]=\"false\"\n [popperHideOnClickOutside]=\"false\"\n (hover)=\"$event.stopPropagation()\"\n >\n <popper-content #popperContent>\n <div class=\"str-chat__tooltip str-chat__tooltip-angular\">\n {{ \"streamChat.Sending...\" | translate }}\n </div>\n </popper-content>\n <stream-loading-indicator-placeholder\n data-testid=\"loading-indicator\"\n ></stream-loading-indicator-placeholder>\n </span>\n </ng-template>\n <ng-template #readStatus>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.readStatusTemplate$ | async) ||\n defaultReadStatus;\n context: getReadStatusContext()\n \"\n ></ng-container>\n </ng-template>\n <ng-template #defaultReadStatus>\n <span\n class=\"\n str-chat__message-simple-status\n str-chat__message-simple-status-angular\n str-chat__message-status\n \"\n data-testid=\"read-indicator\"\n tabindex=\"0\"\n [popper]=\"popperContent\"\n [popperTrigger]=\"popperTriggerHover\"\n [popperPlacement]=\"popperPlacementAuto\"\n [popperHideOnScroll]=\"false\"\n [popperHideOnClickOutside]=\"false\"\n (hover)=\"$event.stopPropagation()\"\n >\n <popper-content #popperContent>\n <div\n class=\"str-chat__tooltip str-chat__tooltip-angular\"\n data-testid=\"read-by-tooltip\"\n >\n {{ readByText }}\n </div>\n </popper-content>\n <stream-icon-placeholder icon=\"read-icon\"></stream-icon-placeholder>\n </span>\n </ng-template>\n </ng-container>\n</ng-template>\n\n<ng-template #replyCountButton let-position=\"position\">\n <div\n *ngIf=\"\n (position === 'inside-message-bubble' && themeVersion === '1') ||\n (position === 'outside-message-bubble' && themeVersion === '2')\n \"\n class=\"\n str-chat__message-simple-reply-button\n str-chat__message-replies-count-button-wrapper\n \"\n >\n <button\n *ngIf=\"shouldDisplayThreadLink\"\n class=\"str-chat__message-replies-count-button\"\n data-testid=\"reply-count-button\"\n (click)=\"setAsActiveParentMessage()\"\n >\n <stream-icon-placeholder\n *ngIf=\"themeVersion === '1'\"\n stream-icon-placeholder\n icon=\"reply\"\n ></stream-icon-placeholder>\n {{message?.reply_count === 1 ? ('streamChat.1 reply' | translate) : ('streamChat.{{ replyCount }}\n replies' | translate:replyCountParam)}}\n </button>\n </div>\n</ng-template>\n\n<ng-template #attachmentsTemplate>\n <ng-template\n #defaultAttachments\n let-messageId=\"messageId\"\n let-attachments=\"attachments\"\n let-parentMessageId=\"parentMessageId\"\n let-imageModalStateChangeHandler=\"imageModalStateChangeHandler\"\n >\n <stream-attachment-list\n [messageId]=\"messageId\"\n [attachments]=\"attachments\"\n [parentMessageId]=\"parentMessageId\"\n (imageModalStateChange)=\"imageModalStateChangeHandler($event)\"\n ></stream-attachment-list>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.attachmentListTemplate$ | async) ||\n defaultAttachments;\n context: getAttachmentListContext()\n \"\n ></ng-container>\n</ng-template>\n", components: [{ type: i8.AvatarPlaceholderComponent, selector: "stream-avatar-placeholder", inputs: ["name", "imageUrl", "size", "location", "channel", "user", "type", "initialsType", "showOnlineIndicator"] }, { type: i9.NgxPopperjsContentComponent, selector: "popper-content", exportAs: ["ngxPopperjsContent"] }, { type: i10.MessageActionsBoxComponent, selector: "stream-message-actions-box", inputs: ["isOpen", "isMine", "message", "enabledActions", "customActions"], outputs: ["displayedActionsCount", "isEditing"] }, { type: i11.IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon", "size"] }, { type: i12.MessageReactionsComponent, selector: "stream-message-reactions", inputs: ["messageId", "messageReactionCounts", "isSelectorOpen", "latestReactions", "ownReactions"], outputs: ["isSelectorOpenChange"] }, { type: i13.AttachmentListComponent, selector: "stream-attachment-list", inputs: ["messageId", "parentMessageId", "attachments"], outputs: ["imageModalStateChange"] }, { type: i14.LoadingIndicatorPlaceholderComponent, selector: "stream-loading-indicator-placeholder", inputs: ["size", "color"] }], directives: [{ type: i15.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i15.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i9.NgxPopperjsDirective, selector: "[popper]", inputs: ["popperTimeout", "popperTimeoutAfterShow", "popperApplyClass", "popper", "popperDisabled", "popperPlacement", "popperApplyArrowClass", "popperPreventOverflow", "popperHideOnClickOutside", "popperTrigger", "popperStyles", "popperAriaDescribeBy", "popperAriaRole", "popperBoundaries", "popperCloseOnClickOutside", "popperDisableAnimation", "popperDisableStyle", "popperHideOnMouseLeave", "popperHideOnScroll", "popperAppendTo", "popperModifiers", "popperPositionFixed", "popperDelay", "popperShowOnStart", "popperTarget"], outputs: ["popperOnHidden", "popperOnShown", "popperOnUpdate"], exportAs: ["popper"] }, { type: i15.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i16.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { type: i15.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], pipes: { "async": i15.AsyncPipe, "translate": i16.TranslatePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
412
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: MessageComponent, decorators: [{
413
- type: Component,
414
- args: [{
415
- selector: 'stream-message',
416
- templateUrl: './message.component.html',
417
- styles: [],
418
- changeDetection: ChangeDetectionStrategy.OnPush,
419
- }]
420
- }], ctorParameters: function () { return [{ type: i1.ChatClientService }, { type: i2.ChannelService }, { type: i3.CustomTemplatesService }, { type: i0.ChangeDetectorRef }, { type: i4.ThemeService }, { type: i5.DateParserService }, { type: i0.NgZone }, { type: i6.MessageService }, { type: i7.MessageActionsService }]; }, propDecorators: { message: [{
421
- type: Input
422
- }], enabledMessageActions: [{
423
- type: Input
424
- }], isLastSentMessage: [{
425
- type: Input
426
- }], mode: [{
427
- type: Input
428
- }], isHighlighted: [{
429
- type: Input
430
- }], customActions: [{
431
- type: Input
432
- }], container: [{
433
- type: ViewChild,
434
- args: ['container']
435
- }] } });
436
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvbWVzc2FnZS9tZXNzYWdlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlL21lc3NhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBR0wsU0FBUyxFQUlULHVCQUF1QixHQUd4QixNQUFNLGVBQWUsQ0FBQztBQWtCdkIsT0FBTyxVQUFVLE1BQU0sYUFBYSxDQUFDO0FBR3JDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUMsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixxQkFBcUIsR0FFdEIsTUFBTSxjQUFjLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVd0Qjs7R0FFRztBQU9ILE1BQU0sT0FBTyxnQkFBZ0I7SUF3RTNCLFlBQ1UsaUJBQW9DLEVBQ3BDLGNBQThCLEVBQy9CLHNCQUE4QyxFQUM3QyxLQUF3QixFQUNoQyxZQUEwQixFQUNsQixVQUE2QixFQUM3QixNQUFjLEVBQ2QsY0FBOEIsRUFDOUIscUJBQTRDO1FBUjVDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQy9CLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDN0MsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFFeEIsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFDN0IsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QiwwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBMUV0RDs7V0FFRztRQUNNLDBCQUFxQixHQUFhLEVBQUUsQ0FB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RDsyVkFPVSxPQUFPO3NCQUFmLEtBQUs7Z0JBSUcscUJBQXFCO3NCQUE3QixLQUFLO2dCQUlHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFJRyxJQUFJO3NCQUFaLEtBQUs7Z0JBSUcsYUFBYTtzQkFBckIsS0FBSztnQkFNRyxhQUFhO3NCQUFyQixLQUFLO2dCQXFDMEIsU0FBUztzQkFBeEMsU0FBUzt1QkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIE5nWm9uZSxcbiAgQWZ0ZXJWaWV3SW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBdHRhY2htZW50LCBVc2VyUmVzcG9uc2UgfSBmcm9tICdzdHJlYW0tY2hhdCc7XG5pbXBvcnQgeyBDaGFubmVsU2VydmljZSB9IGZyb20gJy4uL2NoYW5uZWwuc2VydmljZSc7XG5pbXBvcnQgeyBDaGF0Q2xpZW50U2VydmljZSB9IGZyb20gJy4uL2NoYXQtY2xpZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQXR0YWNobWVudExpc3RDb250ZXh0LFxuICBNZW50aW9uVGVtcGxhdGVDb250ZXh0LFxuICBNZXNzYWdlQWN0aW9uc0JveENvbnRleHQsXG4gIE1lc3NhZ2VSZWFjdGlvbnNDb250ZXh0LFxuICBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzLFxuICBTdHJlYW1NZXNzYWdlLFxuICBEZWxpdmVyZWRTdGF0dXNDb250ZXh0LFxuICBTZW5kaW5nU3RhdHVzQ29udGV4dCxcbiAgUmVhZFN0YXR1c0NvbnRleHQsXG4gIEN1c3RvbU1lc3NhZ2VBY3Rpb25JdGVtLFxuICBTeXN0ZW1NZXNzYWdlQ29udGV4dCxcbiAgQ3VzdG9tTWV0YWRhdGFDb250ZXh0LFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgZW1vamlSZWdleCBmcm9tICdlbW9qaS1yZWdleCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEN1c3RvbVRlbXBsYXRlc1NlcnZpY2UgfSBmcm9tICcuLi9jdXN0b20tdGVtcGxhdGVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgbGlzdFVzZXJzIH0gZnJvbSAnLi4vbGlzdC11c2Vycyc7XG5pbXBvcnQgeyBUaGVtZVNlcnZpY2UgfSBmcm9tICcuLi90aGVtZS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIE5neFBvcHBlcmpzVHJpZ2dlcnMsXG4gIE5neFBvcHBlcmpzUGxhY2VtZW50cyxcbiAgTmd4UG9wcGVyanNDb250ZW50Q29tcG9uZW50LFxufSBmcm9tICduZ3gtcG9wcGVyanMnO1xuaW1wb3J0IHsgRGF0ZVBhcnNlclNlcnZpY2UgfSBmcm9tICcuLi9kYXRlLXBhcnNlci5zZXJ2aWNlJztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vbWVzc2FnZS5zZXJ2aWNlJztcbmltcG9ydCB7IE1lc3NhZ2VBY3Rpb25zU2VydmljZSB9IGZyb20gJy4uL21lc3NhZ2UtYWN0aW9ucy5zZXJ2aWNlJztcblxudHlwZSBNZXNzYWdlUGFydCA9IHtcbiAgY29udGVudDogc3RyaW5nO1xuICB0eXBlOiAndGV4dCcgfCAnbWVudGlvbic7XG4gIHVzZXI/OiBVc2VyUmVzcG9uc2U7XG59O1xuXG4vKipcbiAqIFRoZSBgTWVzc2FnZWAgY29tcG9uZW50IGRpc3BsYXlzIGEgbWVzc2FnZSB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc3VjaCBhcyBzZW5kZXIgYW5kIGRhdGUsIGFuZCBlbmFibGVzIFtpbnRlcmFjdGlvbiB3aXRoIHRoZSBtZXNzYWdlIChpLmUuIGVkaXQgb3IgcmVhY3QpXSguLi9jb25jZXB0cy9tZXNzYWdlLWludGVyYWN0aW9ucy5tZHgpLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdHJlYW0tbWVzc2FnZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9tZXNzYWdlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0XG57XG4gIC8qKlxuICAgKiBUaGUgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWRcbiAgICovXG4gIEBJbnB1dCgpIG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBbY2hhbm5lbCBjYXBhYmlsaXRpZXNdKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L2NoYW5uZWxfY2FwYWJpbGl0aWVzLz9sYW5ndWFnZT1qYXZhc2NyaXB0KSB0aGF0IGFyZSBlbmFibGVkIGZvciB0aGUgY3VycmVudCB1c2VyLCB0aGUgbGlzdCBvZiBbc3VwcG9ydGVkIGludGVyYWN0aW9uc10oLi4vY29uY2VwdHMvbWVzc2FnZS1pbnRlcmFjdGlvbnMubWR4KSBjYW4gYmUgZm91bmQgaW4gb3VyIG1lc3NhZ2UgaW50ZXJhY3Rpb24gZ3VpZGUuIFVuYXRob3JpemVkIGFjdGlvbnMgd29uJ3QgYmUgZGlzcGxheWVkIG9uIHRoZSBVSS4gVGhlIFtgTWVzc2FnZUxpc3RgXSguL01lc3NhZ2VMaXN0Q29tcG9uZW50Lm1keCkgY29tcG9uZW50IGF1dG9tYXRpY2FsbHkgc2V0cyB0aGlzIGJhc2VkIG9uIFtjaGFubmVsIGNhcGFiaWxpdGllc10oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvY2hhbm5lbF9jYXBhYmlsaXRpZXMvP2xhbmd1YWdlPWphdmFzY3JpcHQpLlxuICAgKi9cbiAgQElucHV0KCkgZW5hYmxlZE1lc3NhZ2VBY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgbWVzc2FnZSBzdGF0dXMgKHNlbmRpbmcsIHNlbnQsIHdobyByZWFkIHRoZSBtZXNzYWdlKSBpcyBkaXNwbGF5ZWQuXG4gICAqL1xuICBASW5wdXQoKSBpc0xhc3RTZW50TWVzc2FnZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIG1lc3NhZ2UgaXMgYmVpbmcgZGlzcGFseWVkIGluIGEgY2hhbm5lbCBvciBpbiBhIFt0aHJlYWRdKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3RocmVhZHMvP2xhbmd1YWdlPWphdmFzY3JpcHQpLlxuICAgKi9cbiAgQElucHV0KCkgbW9kZTogJ3RocmVhZCcgfCAnbWFpbicgPSAnbWFpbic7XG4gIC8qKlxuICAgKiBIaWdobGlnaHRpbmcgaXMgdXNlZCB0byBhZGQgdmlzdWFsIGVtcGhhc2l6ZSB0byBhIG1lc3NhZ2Ugd2hlbiBqdW1waW5nIHRvIHRoZSBtZXNzYWdlXG4gICAqL1xuICBASW5wdXQoKSBpc0hpZ2hsaWdodGVkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgY3VzdG9tIG1lc3NhZ2UgYWN0aW9ucyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGFjdGlvbiBib3hcbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgcGxlYXNlIHVzZSB0aGUgW2BNZXNzYWdlQWN0aW9uc1NlcnZpY2VgXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvc2VydmljZXMvTWVzc2FnZUFjdGlvbnNTZXJ2aWNlKSB0byBzZXQgdGhpcyBwcm9wZXJ0eS5cbiAgICovXG4gIEBJbnB1dCgpIGN1c3RvbUFjdGlvbnM6IEN1c3RvbU1lc3NhZ2VBY3Rpb25JdGVtW10gPSBbXTtcbiAgcmVhZG9ubHkgdGhlbWVWZXJzaW9uOiAnMScgfCAnMic7XG4gIGNhblJlY2VpdmVSZWFkRXZlbnRzOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBjYW5SZWFjdFRvTWVzc2FnZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgaXNBY3Rpb25Cb3hPcGVuID0gZmFsc2U7XG4gIGlzRWRpdGVkRmxhZ09wZW5lZCA9IGZhbHNlO1xuICBpc1JlYWN0aW9uU2VsZWN0b3JPcGVuID0gZmFsc2U7XG4gIHZpc2libGVNZXNzYWdlQWN0aW9uc0NvdW50ID0gMDtcbiAgbWVzc2FnZVRleHRQYXJ0czogTWVzc2FnZVBhcnRbXSB8IHVuZGVmaW5lZCA9IFtdO1xuICBtZXNzYWdlVGV4dD86IHN0cmluZztcbiAgcG9wcGVyVHJpZ2dlckNsaWNrID0gTmd4UG9wcGVyanNUcmlnZ2Vycy5jbGljaztcbiAgcG9wcGVyVHJpZ2dlckhvdmVyID0gTmd4UG9wcGVyanNUcmlnZ2Vycy5ob3ZlcjtcbiAgcG9wcGVyUGxhY2VtZW50QXV0byA9IE5neFBvcHBlcmpzUGxhY2VtZW50cy5BVVRPO1xuICBzaG91bGREaXNwbGF5VHJhbnNsYXRpb25Ob3RpY2UgPSBmYWxzZTtcbiAgZGlzcGxheWVkTWVzc2FnZVRleHRDb250ZW50OiAnb3JpZ2luYWwnIHwgJ3RyYW5zbGF0aW9uJyA9ICdvcmlnaW5hbCc7XG4gIGltYWdlQXR0YWNobWVudE1vZGFsU3RhdGU6ICdvcGVuZWQnIHwgJ2Nsb3NlZCcgPSAnY2xvc2VkJztcbiAgc2hvdWxkRGlzcGxheVRocmVhZExpbmsgPSBmYWxzZTtcbiAgaXNTZW50QnlDdXJyZW50VXNlciA9IGZhbHNlO1xuICByZWFkQnlUZXh0ID0gJyc7XG4gIGRpc3BsYXlBczogJ3RleHQnIHwgJ2h0bWwnO1xuICBsYXN0UmVhZFVzZXI6IFVzZXJSZXNwb25zZTxEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgaXNPbmx5UmVhZEJ5TWUgPSBmYWxzZTtcbiAgaXNSZWFkQnlNdWx0aXBsZVVzZXJzID0gZmFsc2U7XG4gIGlzTWVzc2FnZURlbGl2ZXJlZEFuZFJlYWQgPSBmYWxzZTtcbiAgcGFyc2VkRGF0ZSA9ICcnO1xuICBwYXNlZEVkaXRlZERhdGUgPSAnJztcbiAgYXJlT3B0aW9uc1Zpc2libGUgPSBmYWxzZTtcbiAgaGFzQXR0YWNobWVudCA9IGZhbHNlO1xuICBoYXNSZWFjdGlvbnMgPSBmYWxzZTtcbiAgcmVwbHlDb3VudFBhcmFtOiB7IHJlcGx5Q291bnQ6IG51bWJlciB8IHVuZGVmaW5lZCB9ID0ge1xuICAgIHJlcGx5Q291bnQ6IHVuZGVmaW5lZCxcbiAgfTtcbiAgY2FuRGlzcGxheVJlYWRTdGF0dXMgPSBmYWxzZTtcbiAgcHJpdmF0ZSBxdW90ZWRNZXNzYWdlQXR0YWNobWVudHM6IEF0dGFjaG1lbnRbXSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICBwcml2YXRlIGlzVmlld0luaXRlZCA9IGZhbHNlO1xuICBwcml2YXRlIHVzZXJJZD86IHN0cmluZztcbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJykgcHJpdmF0ZSBjb250YWluZXI6XG4gICAgfCBFbGVtZW50UmVmPEhUTUxFbGVtZW50PlxuICAgIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IHVybFJlZ2V4cCA9XG4gICAgLyg/Oig/Omh0dHBzP3xmdHB8ZmlsZSk6XFwvXFwvfHd3d1xcLnxmdHBcXC4pKD86XFwoWy1BLVowLTkrJkAjLyU9fl98JD8hOiwuXSpcXCl8Wy1BLVowLTkrJkAjLyU9fl98JD8hOiwuXSkqKD86XFwoWy1BLVowLTkrJkAjLyU9fl98JD8hOiwuXSpcXCl8W0EtWjAtOSsmQCMvJT1+X3wkXSkvZ2ltO1xuICBwcml2YXRlIGVtb2ppUmVnZXhwID0gbmV3IFJlZ0V4cChlbW9qaVJlZ2V4KCksICdnJyk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjaGF0Q2xpZW50U2VydmljZTogQ2hhdENsaWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGFubmVsU2VydmljZTogQ2hhbm5lbFNlcnZpY2UsXG4gICAgcHVibGljIGN1c3RvbVRlbXBsYXRlc1NlcnZpY2U6IEN1c3RvbVRlbXBsYXRlc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgdGhlbWVTZXJ2aWNlOiBUaGVtZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXRlUGFyc2VyOiBEYXRlUGFyc2VyU2VydmljZSxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWVzc2FnZUFjdGlvbnNTZXJ2aWNlOiBNZXNzYWdlQWN0aW9uc1NlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy50aGVtZVZlcnNpb24gPSB0aGVtZVNlcnZpY2UudGhlbWVWZXJzaW9uO1xuICAgIHRoaXMuZGlzcGxheUFzID0gdGhpcy5tZXNzYWdlU2VydmljZS5kaXNwbGF5QXM7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UudXNlciQuc3Vic2NyaWJlKCh1KSA9PiB7XG4gICAgICAgIGlmICh1Py5pZCAhPT0gdGhpcy51c2VySWQpIHtcbiAgICAgICAgICB0aGlzLnVzZXJJZCA9IHU/LmlkO1xuICAgICAgICAgIHRoaXMuc2V0SXNTZW50QnlDdXJyZW50VXNlcigpO1xuICAgICAgICAgIHRoaXMuc2V0TGFzdFJlYWRVc2VyKCk7XG4gICAgICAgICAgaWYgKHRoaXMuaXNWaWV3SW5pdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5tZXNzYWdlKSB7XG4gICAgICB0aGlzLnNob3VsZERpc3BsYXlUcmFuc2xhdGlvbk5vdGljZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kaXNwbGF5ZWRNZXNzYWdlVGV4dENvbnRlbnQgPSAnb3JpZ2luYWwnO1xuICAgICAgdGhpcy5jcmVhdGVNZXNzYWdlUGFydHMoKTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsQXR0YWNobWVudHMgPSB0aGlzLm1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy5hdHRhY2htZW50cztcbiAgICAgIHRoaXMucXVvdGVkTWVzc2FnZUF0dGFjaG1lbnRzID1cbiAgICAgICAgb3JpZ2luYWxBdHRhY2htZW50cyAmJiBvcmlnaW5hbEF0dGFjaG1lbnRzLmxlbmd0aFxuICAgICAgICAgID8gW29yaWdpbmFsQXR0YWNobWVudHNbMF1dXG4gICAgICAgICAgOiBbXTtcbiAgICAgIHRoaXMuc2V0SXNTZW50QnlDdXJyZW50VXNlcigpO1xuICAgICAgdGhpcy5zZXRMYXN0UmVhZFVzZXIoKTtcbiAgICAgIHRoaXMucmVhZEJ5VGV4dCA9IHRoaXMubWVzc2FnZT8ucmVhZEJ5XG4gICAgICAgID8gbGlzdFVzZXJzKHRoaXMubWVzc2FnZS5yZWFkQnkpXG4gICAgICAgIDogJyc7XG4gICAgICB0aGlzLmlzT25seVJlYWRCeU1lID0gISEoXG4gICAgICAgIHRoaXMubWVzc2FnZSAmJlxuICAgICAgICB0aGlzLm1lc3NhZ2UucmVhZEJ5ICYmXG4gICAgICAgIHRoaXMubWVzc2FnZS5yZWFkQnkubGVuZ3RoID09PSAwXG4gICAgICApO1xuICAgICAgdGhpcy5pc1JlYWRCeU11bHRpcGxlVXNlcnMgPSAhIShcbiAgICAgICAgdGhpcy5tZXNzYWdlICYmXG4gICAgICAgIHRoaXMubWVzc2FnZS5yZWFkQnkgJiZcbiAgICAgICAgdGhpcy5tZXNzYWdlLnJlYWRCeS5sZW5ndGggPiAxXG4gICAgICApO1xuICAgICAgdGhpcy5pc01lc3NhZ2VEZWxpdmVyZWRBbmRSZWFkID0gISEoXG4gICAgICAgIHRoaXMubWVzc2FnZSAmJlxuICAgICAgICB0aGlzLm1lc3NhZ2UucmVhZEJ5ICYmXG4gICAgICAgIHRoaXMubWVzc2FnZS5zdGF0dXMgPT09ICdyZWNlaXZlZCcgJiZcbiAgICAgICAgdGhpcy5tZXNzYWdlLnJlYWRCeS5sZW5ndGggPiAwXG4gICAgICApO1xuICAgICAgdGhpcy5wYXJzZWREYXRlID1cbiAgICAgICAgKHRoaXMubWVzc2FnZSAmJlxuICAgICAgICAgIHRoaXMubWVzc2FnZS5jcmVhdGVkX2F0ICYmXG4gICAgICAgICAgdGhpcy5kYXRlUGFyc2VyLnBhcnNlRGF0ZVRpbWUodGhpcy5tZXNzYWdlLmNyZWF0ZWRfYXQpKSB8fFxuICAgICAgICAnJztcbiAgICAgIHRoaXMucGFzZWRFZGl0ZWREYXRlID1cbiAgICAgICAgKHRoaXMubWVzc2FnZSAmJlxuICAgICAgICAgIHRoaXMubWVzc2FnZS5tZXNzYWdlX3RleHRfdXBkYXRlZF9hdCAmJlxuICAgICAgICAgIHRoaXMuZGF0ZVBhcnNlci5wYXJzZURhdGVUaW1lKFxuICAgICAgICAgICAgbmV3IERhdGUodGhpcy5tZXNzYWdlLm1lc3NhZ2VfdGV4dF91cGRhdGVkX2F0KVxuICAgICAgICAgICkpIHx8XG4gICAgICAgICcnO1xuICAgICAgdGhpcy5oYXNBdHRhY2htZW50ID1cbiAgICAgICAgISF0aGlzLm1lc3NhZ2U/LmF0dGFjaG1lbnRzICYmICEhdGhpcy5tZXNzYWdlLmF0dGFjaG1lbnRzLmxlbmd0aDtcbiAgICAgIHRoaXMuaGFzUmVhY3Rpb25zID1cbiAgICAgICAgISF0aGlzLm1lc3NhZ2U/LnJlYWN0aW9uX2NvdW50cyAmJlxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLm1lc3NhZ2UucmVhY3Rpb25fY291bnRzKS5sZW5ndGggPiAwO1xuICAgICAgdGhpcy5yZXBseUNvdW50UGFyYW0gPSB7IHJlcGx5Q291bnQ6IHRoaXMubWVzc2FnZT8ucmVwbHlfY291bnQgfTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zKSB7XG4gICAgICB0aGlzLmNhblJlYWN0VG9NZXNzYWdlID1cbiAgICAgICAgdGhpcy5lbmFibGVkTWVzc2FnZUFjdGlvbnMuaW5kZXhPZignc2VuZC1yZWFjdGlvbicpICE9PSAtMTtcbiAgICAgIHRoaXMuY2FuUmVjZWl2ZVJlYWRFdmVudHMgPVxuICAgICAgICB0aGlzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucy5pbmRleE9mKCdyZWFkLWV2ZW50cycpICE9PSAtMTtcbiAgICAgIHRoaXMuY2FuRGlzcGxheVJlYWRTdGF0dXMgPVxuICAgICAgICB0aGlzLmNhblJlY2VpdmVSZWFkRXZlbnRzICE9PSBmYWxzZSAmJlxuICAgICAgICB0aGlzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucy5pbmRleE9mKCdyZWFkLWV2ZW50cycpICE9PSAtMTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMubWVzc2FnZSB8fCBjaGFuZ2VzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucyB8fCBjaGFuZ2VzLm1vZGUpIHtcbiAgICAgIHRoaXMuc2hvdWxkRGlzcGxheVRocmVhZExpbmsgPVxuICAgICAgICAhIXRoaXMubWVzc2FnZT8ucmVwbHlfY291bnQgJiYgdGhpcy5tb2RlICE9PSAndGhyZWFkJztcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMubWVzc2FnZSB8fCBjaGFuZ2VzLm1vZGUpIHtcbiAgICAgIHRoaXMuYXJlT3B0aW9uc1Zpc2libGUgPSB0aGlzLm1lc3NhZ2VcbiAgICAgICAgPyAhKFxuICAgICAgICAgICAgIXRoaXMubWVzc2FnZS50eXBlIHx8XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2UudHlwZSA9PT0gJ2Vycm9yJyB8fFxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlLnR5cGUgPT09ICdzeXN0ZW0nIHx8XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2UudHlwZSA9PT0gJ2VwaGVtZXJhbCcgfHxcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZS5zdGF0dXMgPT09ICdmYWlsZWQnIHx8XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2Uuc3RhdHVzID09PSAnc2VuZGluZycgfHxcbiAgICAgICAgICAgICh0aGlzLm1vZGUgPT09ICd0aHJlYWQnICYmICF0aGlzLm1lc3NhZ2UucGFyZW50X2lkKVxuICAgICAgICAgIClcbiAgICAgICAgOiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY2hhbmdlcy5tZXNzYWdlIHx8XG4gICAgICBjaGFuZ2VzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucyB8fFxuICAgICAgY2hhbmdlcy5jdXN0b21BY3Rpb25zXG4gICAgKSB7XG4gICAgICBpZiAodGhpcy5tZXNzYWdlKSB7XG4gICAgICAgIHRoaXMudmlzaWJsZU1lc3NhZ2VBY3Rpb25zQ291bnQgPVxuICAgICAgICAgIHRoaXMubWVzc2FnZUFjdGlvbnNTZXJ2aWNlLmdldEF1dGhvcml6ZWRNZXNzYWdlQWN0aW9uc0NvdW50KFxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlLFxuICAgICAgICAgICAgdGhpcy5lbmFibGVkTWVzc2FnZUFjdGlvbnNcbiAgICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52aXNpYmxlTWVzc2FnZUFjdGlvbnNDb3VudCA9IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNWaWV3SW5pdGVkID0gdHJ1ZTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICB9XG5cbiAgbWVzc2FnZUFjdGlvbnNDbGlja2VkKCkge1xuICAgIGlmICghdGhpcy5tZXNzYWdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm1lc3NhZ2VBY3Rpb25zU2VydmljZS5jdXN0b21BY3Rpb25DbGlja0hhbmRsZXIpIHtcbiAgICAgIHRoaXMubWVzc2FnZUFjdGlvbnNTZXJ2aWNlLmN1c3RvbUFjdGlvbkNsaWNrSGFuZGxlcih7XG4gICAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgICAgZW5hYmxlZEFjdGlvbnM6IHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zLFxuICAgICAgICBjdXN0b21BY3Rpb25zOiB0aGlzLmN1c3RvbUFjdGlvbnMsXG4gICAgICAgIGlzTWluZTogdGhpcy5pc1NlbnRCeUN1cnJlbnRVc2VyLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNBY3Rpb25Cb3hPcGVuID0gIXRoaXMuaXNBY3Rpb25Cb3hPcGVuO1xuICAgIH1cbiAgfVxuXG4gIG1lc3NhZ2VBY3Rpb25zQm94Q2xpY2tlZChwb3BwZXJDb250ZW50OiBOZ3hQb3BwZXJqc0NvbnRlbnRDb21wb25lbnQpIHtcbiAgICBwb3BwZXJDb250ZW50LmhpZGUoKTtcbiAgfVxuXG4gIGdldEF0dGFjaG1lbnRMaXN0Q29udGV4dCgpOiBBdHRhY2htZW50TGlzdENvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlSWQ6IHRoaXMubWVzc2FnZT8uaWQgfHwgJycsXG4gICAgICBhdHRhY2htZW50czogdGhpcy5tZXNzYWdlPy5hdHRhY2htZW50cyB8fCBbXSxcbiAgICAgIHBhcmVudE1lc3NhZ2VJZDogdGhpcy5tZXNzYWdlPy5wYXJlbnRfaWQsXG4gICAgICBpbWFnZU1vZGFsU3RhdGVDaGFuZ2VIYW5kbGVyOiAoc3RhdGUpID0+XG4gICAgICAgICh0aGlzLmltYWdlQXR0YWNobWVudE1vZGFsU3RhdGUgPSBzdGF0ZSksXG4gICAgfTtcbiAgfVxuXG4gIGdldE1lc3NhZ2VDb250ZXh0KCk6IFN5c3RlbU1lc3NhZ2VDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgZW5hYmxlZE1lc3NhZ2VBY3Rpb25zOiB0aGlzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucyxcbiAgICAgIGlzSGlnaGxpZ2h0ZWQ6IHRoaXMuaXNIaWdobGlnaHRlZCxcbiAgICAgIGlzTGFzdFNlbnRNZXNzYWdlOiB0aGlzLmlzTGFzdFNlbnRNZXNzYWdlLFxuICAgICAgbW9kZTogdGhpcy5tb2RlLFxuICAgICAgY3VzdG9tQWN0aW9uczogdGhpcy5jdXN0b21BY3Rpb25zLFxuICAgICAgcGFyc2VkRGF0ZTogdGhpcy5wYXJzZWREYXRlLFxuICAgIH07XG4gIH1cblxuICBnZXRRdW90ZWRNZXNzYWdlQXR0YWNobWVudExpc3RDb250ZXh0KCk6IEF0dGFjaG1lbnRMaXN0Q29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2VJZDogdGhpcy5tZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8uaWQgfHwgJycsXG4gICAgICBhdHRhY2htZW50czogdGhpcy5xdW90ZWRNZXNzYWdlQXR0YWNobWVudHMhLFxuICAgICAgcGFyZW50TWVzc2FnZUlkOiB0aGlzPy5tZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8ucGFyZW50X2lkLFxuICAgIH07XG4gIH1cblxuICBnZXRNZXNzYWdlUmVhY3Rpb25zQ29udGV4dCgpOiBNZXNzYWdlUmVhY3Rpb25zQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2VSZWFjdGlvbkNvdW50czogdGhpcy5tZXNzYWdlPy5yZWFjdGlvbl9jb3VudHMgfHwge30sXG4gICAgICBsYXRlc3RSZWFjdGlvbnM6IHRoaXMubWVzc2FnZT8ubGF0ZXN0X3JlYWN0aW9ucyB8fCBbXSxcbiAgICAgIGlzU2VsZWN0b3JPcGVuOiB0aGlzLmlzUmVhY3Rpb25TZWxlY3Rvck9wZW4sXG4gICAgICBpc1NlbGVjdG9yT3BlbkNoYW5nZUhhbmRsZXI6IChpc09wZW4pID0+XG4gICAgICAgICh0aGlzLmlzUmVhY3Rpb25TZWxlY3Rvck9wZW4gPSBpc09wZW4pLFxuICAgICAgbWVzc2FnZUlkOiB0aGlzLm1lc3NhZ2U/LmlkLFxuICAgICAgb3duUmVhY3Rpb25zOiB0aGlzLm1lc3NhZ2U/Lm93bl9yZWFjdGlvbnMgfHwgW10sXG4gICAgfTtcbiAgfVxuXG4gIG1lc3NhZ2VDbGlja2VkKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMubWVzc2FnZT8uc3RhdHVzID09PSAnZmFpbGVkJyAmJlxuICAgICAgdGhpcy5tZXNzYWdlPy5lcnJvclN0YXR1c0NvZGUgIT09IDQwM1xuICAgICkge1xuICAgICAgdGhpcy5yZXNlbmRNZXNzYWdlKCk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMubWVzc2FnZT8udHlwZSA9PT0gJ2Vycm9yJyAmJlxuICAgICAgdGhpcy5tZXNzYWdlPy5tb2RlcmF0aW9uX2RldGFpbHNcbiAgICApIHtcbiAgICAgIHRoaXMub3Blbk1lc3NhZ2VCb3VuY2VQcm9tcHQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc0VkaXRlZEZsYWdPcGVuZWQgPSAhdGhpcy5pc0VkaXRlZEZsYWdPcGVuZWQ7XG4gICAgfVxuICB9XG5cbiAgcmVzZW5kTWVzc2FnZSgpIHtcbiAgICB2b2lkIHRoaXMuY2hhbm5lbFNlcnZpY2UucmVzZW5kTWVzc2FnZSh0aGlzLm1lc3NhZ2UhKTtcbiAgfVxuXG4gIHNldEFzQWN0aXZlUGFyZW50TWVzc2FnZSgpIHtcbiAgICB2b2lkIHRoaXMuY2hhbm5lbFNlcnZpY2Uuc2V0QXNBY3RpdmVQYXJlbnRNZXNzYWdlKHRoaXMubWVzc2FnZSk7XG4gIH1cblxuICBnZXRNZW50aW9uQ29udGV4dChtZXNzYWdlUGFydDogTWVzc2FnZVBhcnQpOiBNZW50aW9uVGVtcGxhdGVDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogbWVzc2FnZVBhcnQuY29udGVudCxcbiAgICAgIHVzZXI6IG1lc3NhZ2VQYXJ0LnVzZXIhLFxuICAgIH07XG4gIH1cblxuICBnZXRNZXNzYWdlQWN0aW9uc0JveENvbnRleHQoKTogTWVzc2FnZUFjdGlvbnNCb3hDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNPcGVuOiB0aGlzLmlzQWN0aW9uQm94T3BlbixcbiAgICAgIGlzTWluZTogdGhpcy5pc1NlbnRCeUN1cnJlbnRVc2VyLFxuICAgICAgZW5hYmxlZEFjdGlvbnM6IHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zLFxuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgZGlzcGxheWVkQWN0aW9uc0NvdW50Q2hhbmVIYW5sZXI6IChjb3VudCkgPT4ge1xuICAgICAgICB0aGlzLnZpc2libGVNZXNzYWdlQWN0aW9uc0NvdW50ID0gY291bnQ7XG4gICAgICAgIC8vIG1lc3NhZ2UgYWN0aW9uIGJveCBjaGFuZ2VzIFVJIGJpbmRpbmdzIGluIHBhcmVudCwgc28gd2UnbGwgaGF2ZSB0byByZXJ1biBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSxcbiAgICAgIGRpc3BsYXllZEFjdGlvbnNDb3VudENoYW5nZUhhbmRsZXI6IChjb3VudCkgPT4ge1xuICAgICAgICB0aGlzLnZpc2libGVNZXNzYWdlQWN0aW9uc0NvdW50ID0gY291bnQ7XG4gICAgICAgIC8vIG1lc3NhZ2UgYWN0aW9uIGJveCBjaGFuZ2VzIFVJIGJpbmRpbmdzIGluIHBhcmVudCwgc28gd2UnbGwgaGF2ZSB0byByZXJ1biBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSxcbiAgICAgIGN1c3RvbUFjdGlvbnM6IHRoaXMuY3VzdG9tQWN0aW9ucyB8fCBbXSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0RGVsaXZlcmVkU3RhdHVzQ29udGV4dCgpOiBEZWxpdmVyZWRTdGF0dXNDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlISxcbiAgICB9O1xuICB9XG5cbiAgZ2V0U2VuZGluZ1N0YXR1c0NvbnRleHQoKTogU2VuZGluZ1N0YXR1c0NvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UhLFxuICAgIH07XG4gIH1cblxuICBnZXRSZWFkU3RhdHVzQ29udGV4dCgpOiBSZWFkU3RhdHVzQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSEsXG4gICAgICByZWFkQnlUZXh0OiB0aGlzLnJlYWRCeVRleHQsXG4gICAgfTtcbiAgfVxuXG4gIGdldE1lc3NhZ2VNZXRhZGF0YUNvbnRleHQoKTogQ3VzdG9tTWV0YWRhdGFDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlISxcbiAgICB9O1xuICB9XG5cbiAganVtcFRvTWVzc2FnZShtZXNzYWdlSWQ6IHN0cmluZywgcGFyZW50TWVzc2FnZUlkPzogc3RyaW5nKSB7XG4gICAgdm9pZCB0aGlzLmNoYW5uZWxTZXJ2aWNlLmp1bXBUb01lc3NhZ2UobWVzc2FnZUlkLCBwYXJlbnRNZXNzYWdlSWQpO1xuICB9XG5cbiAgZGlzcGxheVRyYW5zbGF0ZWRNZXNzYWdlKCkge1xuICAgIHRoaXMuY3JlYXRlTWVzc2FnZVBhcnRzKHRydWUpO1xuICB9XG5cbiAgZGlzcGxheU9yaWdpbmFsTWVzc2FnZSgpIHtcbiAgICB0aGlzLmNyZWF0ZU1lc3NhZ2VQYXJ0cyhmYWxzZSk7XG4gIH1cblxuICBvcGVuTWVzc2FnZUJvdW5jZVByb21wdCgpIHtcbiAgICB0aGlzLmNoYW5uZWxTZXJ2aWNlLmJvdW5jZWRNZXNzYWdlJC5uZXh0KHRoaXMubWVzc2FnZSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1lc3NhZ2VQYXJ0cyhzaG91bGRUcmFuc2xhdGUgPSB0cnVlKSB7XG4gICAgdGhpcy5tZXNzYWdlVGV4dFBhcnRzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubWVzc2FnZVRleHQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IGNvbnRlbnQgPSB0aGlzLmdldE1lc3NhZ2VDb250ZW50KHNob3VsZFRyYW5zbGF0ZSk7XG4gICAgaWYgKFxuICAgICAgKCF0aGlzLm1lc3NhZ2UhLm1lbnRpb25lZF91c2VycyB8fFxuICAgICAgICB0aGlzLm1lc3NhZ2UhLm1lbnRpb25lZF91c2Vycy5sZW5ndGggPT09IDApICYmXG4gICAgICAhY29udGVudD8ubWF0Y2godGhpcy5lbW9qaVJlZ2V4cCkgJiZcbiAgICAgICFjb250ZW50Py5tYXRjaCh0aGlzLnVybFJlZ2V4cClcbiAgICApIHtcbiAgICAgIHRoaXMubWVzc2FnZVRleHRQYXJ0cyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMubWVzc2FnZVRleHQgPSBjb250ZW50O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIXRoaXMubWVzc2FnZSEubWVudGlvbmVkX3VzZXJzIHx8XG4gICAgICB0aGlzLm1lc3NhZ2UhLm1lbnRpb25lZF91c2Vycy5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIGNvbnRlbnQgPSB0aGlzLmZpeEVtb2ppRGlzcGxheShjb250ZW50KTtcbiAgICAgIGNvbnRlbnQgPSB0aGlzLndyYXBMaW5rc1dpdGhBbmNob3JUYWcoY29udGVudCk7XG4gICAgICB0aGlzLm1lc3NhZ2VUZXh0UGFydHMgPSBbeyBjb250ZW50LCB0eXBlOiAndGV4dCcgfV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWVzc2FnZVRleHRQYXJ0cyA9IFtdO1xuICAgICAgbGV0IHRleHQgPSBjb250ZW50O1xuICAgICAgdGhpcy5tZXNzYWdlIS5tZW50aW9uZWRfdXNlcnMuZm9yRWFjaCgodXNlcikgPT4ge1xuICAgICAgICBjb25zdCBtZW50aW9uID0gYEAke3VzZXIubmFtZSB8fCB1c2VyLmlkfWA7XG4gICAgICAgIGNvbnN0IHByZWNlZGluZ1RleHQgPSB0ZXh0LnN1YnN0cmluZygwLCB0ZXh0LmluZGV4T2YobWVudGlvbikpO1xuICAgICAgICBsZXQgZm9ybWF0dGVkUHJlY2VkaW5nVGV4dCA9IHRoaXMuZml4RW1vamlEaXNwbGF5KHByZWNlZGluZ1RleHQpO1xuICAgICAgICBmb3JtYXR0ZWRQcmVjZWRpbmdUZXh0ID0gdGhpcy53cmFwTGlua3NXaXRoQW5jaG9yVGFnKFxuICAgICAgICAgIGZvcm1hdHRlZFByZWNlZGluZ1RleHRcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVGV4dFBhcnRzIS5wdXNoKHtcbiAgICAgICAgICBjb250ZW50OiBmb3JtYXR0ZWRQcmVjZWRpbmdUZXh0LFxuICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWVzc2FnZVRleHRQYXJ0cyEucHVzaCh7XG4gICAgICAgICAgY29udGVudDogbWVudGlvbixcbiAgICAgICAgICB0eXBlOiAnbWVudGlvbicsXG4gICAgICAgICAgdXNlcixcbiAgICAgICAgfSk7XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UocHJlY2VkaW5nVGV4dCArIG1lbnRpb24sICcnKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgdGV4dCA9IHRoaXMuZml4RW1vamlEaXNwbGF5KHRleHQpO1xuICAgICAgICB0ZXh0ID0gdGhpcy53cmFwTGlua3NXaXRoQW5jaG9yVGFnKHRleHQpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VUZXh0UGFydHMucHVzaCh7IGNvbnRlbnQ6IHRleHQsIHR5cGU6ICd0ZXh0JyB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldE1lc3NhZ2VDb250ZW50KHNob3VsZFRyYW5zbGF0ZTogYm9vbGVhbikge1xuICAgIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IHRoaXMubWVzc2FnZT8udGV4dDtcbiAgICBpZiAoc2hvdWxkVHJhbnNsYXRlKSB7XG4gICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHRoaXMubWVzc2FnZT8udHJhbnNsYXRpb247XG4gICAgICBpZiAodHJhbnNsYXRpb24pIHtcbiAgICAgICAgdGhpcy5zaG91bGREaXNwbGF5VHJhbnNsYXRpb25Ob3RpY2UgPSB0cnVlO1xuICAgICAgICB0aGlzLmRpc3BsYXllZE1lc3NhZ2VUZXh0Q29udGVudCA9ICd0cmFuc2xhdGlvbic7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJhbnNsYXRpb24gfHwgb3JpZ2luYWxDb250ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3BsYXllZE1lc3NhZ2VUZXh0Q29udGVudCA9ICdvcmlnaW5hbCc7XG4gICAgICByZXR1cm4gb3JpZ2luYWxDb250ZW50O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZml4RW1vamlEaXNwbGF5KGNvbnRlbnQ6IHN0cmluZykge1xuICAgIC8vIFdyYXAgZW1vamlzIGluIHNwYW4gdG8gZGlzcGxheSBlbW9qaXMgY29ycmVjdGx5IGluIENocm9tZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD01OTYyMjNcbiAgICAvLyBCYXNlZCBvbiB0aGlzOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80NTY1MTEyL2phdmFzY3JpcHQtaG93LXRvLWZpbmQtb3V0LWlmLXRoZS11c2VyLWJyb3dzZXItaXMtY2hyb21lXG4gICAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzICovXG4gICAgY29uc3QgaXNDaHJvbWUgPVxuICAgICAgISEod2luZG93IGFzIGFueSkuY2hyb21lICYmIHR5cGVvZiAod2luZG93IGFzIGFueSkub3ByID09PSAndW5kZWZpbmVkJztcbiAgICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoXG4gICAgICB0aGlzLmVtb2ppUmVnZXhwLFxuICAgICAgKG1hdGNoKSA9PlxuICAgICAgICBgPHNwYW4gJHtcbiAgICAgICAgICBpc0Nocm9tZSA/ICdjbGFzcz1cInN0ci1jaGF0X19lbW9qaS1kaXNwbGF5LWZpeFwiJyA6ICcnXG4gICAgICAgIH0+JHttYXRjaH08L3NwYW4+YFxuICAgICk7XG5cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIHByaXZhdGUgd3JhcExpbmtzV2l0aEFuY2hvclRhZyhjb250ZW50OiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5kaXNwbGF5QXMgPT09ICdodG1sJykge1xuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfVxuICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UodGhpcy51cmxSZWdleHAsIChtYXRjaCkgPT5cbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuY3VzdG9tTGlua1JlbmRlcmVyXG4gICAgICAgID8gdGhpcy5tZXNzYWdlU2VydmljZS5jdXN0b21MaW5rUmVuZGVyZXIobWF0Y2gpXG4gICAgICAgIDogYDxhIGhyZWY9XCIke21hdGNofVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vZm9sbG93XCI+JHttYXRjaH08L2E+YFxuICAgICk7XG5cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SXNTZW50QnlDdXJyZW50VXNlcigpIHtcbiAgICB0aGlzLmlzU2VudEJ5Q3VycmVudFVzZXIgPSB0aGlzLm1lc3NhZ2U/LnVzZXI/LmlkID09PSB0aGlzLnVzZXJJZDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0TGFzdFJlYWRVc2VyKCkge1xuICAgIHRoaXMubGFzdFJlYWRVc2VyID0gdGhpcy5tZXNzYWdlPy5yZWFkQnk/LmZpbHRlcihcbiAgICAgICh1KSA9PiB1LmlkICE9PSB0aGlzLnVzZXJJZFxuICAgIClbMF07XG4gIH1cbn1cbiIsIjxkaXZcbiAgI2NvbnRhaW5lclxuICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZSBzdHItY2hhdF9fbWVzc2FnZSBzdHItY2hhdF9fbWVzc2FnZS0te3tcbiAgICBtZXNzYWdlPy50eXBlXG4gIH19IHN0ci1jaGF0X19tZXNzYWdlLS17eyBtZXNzYWdlPy5zdGF0dXMgfX0ge3tcbiAgICBtZXNzYWdlPy50ZXh0ID8gJ3N0ci1jaGF0X19tZXNzYWdlLS1oYXMtdGV4dCcgOiAnaGFzLW5vLXRleHQnXG4gIH19XCJcbiAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLS1tZV09XCJpc1NlbnRCeUN1cnJlbnRVc2VyXCJcbiAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLS1vdGhlcl09XCIhaXNTZW50QnlDdXJyZW50VXNlclwiXG4gIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtLW1lXT1cImlzU2VudEJ5Q3VycmVudFVzZXJcIlxuICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtLWhhcy1hdHRhY2htZW50XT1cImhhc0F0dGFjaG1lbnRcIlxuICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtLXdpdGgtcmVhY3Rpb25zXT1cImhhc1JlYWN0aW9uc1wiXG4gIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS0taGlnaGxpZ2h0ZWRdPVwiaXNIaWdobGlnaHRlZFwiXG4gIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS13aXRoLXRocmVhZC1saW5rXT1cInNob3VsZERpc3BsYXlUaHJlYWRMaW5rXCJcbiAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLXNlbmQtY2FuLWJlLXJldHJpZWRdPVwiXG4gICAgKG1lc3NhZ2U/LnN0YXR1cyA9PT0gJ2ZhaWxlZCcgJiYgbWVzc2FnZT8uZXJyb3JTdGF0dXNDb2RlICE9PSA0MDMpIHx8XG4gICAgKG1lc3NhZ2U/LnR5cGUgPT09ICdlcnJvcicgJiYgbWVzc2FnZT8ubW9kZXJhdGlvbl9kZXRhaWxzKVxuICBcIlxuICBkYXRhLXRlc3RpZD1cIm1lc3NhZ2UtY29udGFpbmVyXCJcbj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtZXNzYWdlPy5kZWxldGVkX2F0OyBlbHNlIGRlbGV0ZWRNZXNzYWdlXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1lc3NhZ2U/LnR5cGUgIT09ICdzeXN0ZW0nOyBlbHNlIHN5c3RlbU1lc3NhZ2VcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0aGVtZVZlcnNpb24gPT09ICcxJ1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWVzc2FnZVN0YXR1c1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8c3RyZWFtLWF2YXRhci1wbGFjZWhvbGRlclxuICAgICAgICBkYXRhLXRlc3RpZD1cImF2YXRhclwiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXQtYW5ndWxhcl9fYXZhdGFyLWhvc3Qgc3RyLWNoYXRfX21lc3NhZ2Utc2VuZGVyLWF2YXRhclwiXG4gICAgICAgIFtpbWFnZVVybF09XCJtZXNzYWdlPy51c2VyPy5pbWFnZVwiXG4gICAgICAgIFtuYW1lXT1cIm1lc3NhZ2U/LnVzZXI/Lm5hbWUgfHwgbWVzc2FnZT8udXNlcj8uaWRcIlxuICAgICAgICB0eXBlPVwidXNlclwiXG4gICAgICAgIGxvY2F0aW9uPVwibWVzc2FnZS1zZW5kZXJcIlxuICAgICAgICBbdXNlcl09XCJtZXNzYWdlPy51c2VyIHx8IHVuZGVmaW5lZFwiXG4gICAgICA+PC9zdHJlYW0tYXZhdGFyLXBsYWNlaG9sZGVyPlxuICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWlubmVyXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZV9fYWN0aW9ucyBzdHItY2hhdF9fbWVzc2FnZS1vcHRpb25zXCJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cIm1lc3NhZ2Utb3B0aW9uc1wiXG4gICAgICAgICAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLWFjdGlvbnMtb3Blbl09XCJpc0FjdGlvbkJveE9wZW5cIlxuICAgICAgICAgICpuZ0lmPVwiYXJlT3B0aW9uc1Zpc2libGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJtZXNzYWdlLWFjdGlvbnMtY29udGFpbmVyXCJcbiAgICAgICAgICAgICNtZXNzYWdlQWN0aW9uc1RvZ2dsZVxuICAgICAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2UtYWN0aW9ucy1jb250YWluZXJcbiAgICAgICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlX19hY3Rpb25zX19hY3Rpb25cbiAgICAgICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlX19hY3Rpb25zX19hY3Rpb24tLW9wdGlvbnNcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbcG9wcGVyXT1cInBvcHBlckNvbnRlbnRcIlxuICAgICAgICAgICAgW3BvcHBlclRyaWdnZXJdPVwicG9wcGVyVHJpZ2dlckNsaWNrXCJcbiAgICAgICAgICAgIFtwb3BwZXJQbGFjZW1lbnRdPVwicG9wcGVyUGxhY2VtZW50QXV0b1wiXG4gICAgICAgICAgICBbcG9wcGVySGlkZU9uU2Nyb2xsXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtwb3BwZXJIaWRlT25DbGlja091dHNpZGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbcG9wcGVySGlkZU9uTW91c2VMZWF2ZV09XCJmYWxzZVwiXG4gICAgICAgICAgICBbcG9wcGVyRGlzYWJsZUFuaW1hdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgIChwb3BwZXJPbkhpZGRlbik9XCJpc0FjdGlvbkJveE9wZW4gPSBmYWxzZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHBvcHBlci1jb250ZW50ICNwb3BwZXJDb250ZW50PlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAjZGVmYXVsdE1lc3NhZ2VBY3Rpb25zQm94XG4gICAgICAgICAgICAgICAgbGV0LWlzT3Blbj1cImlzT3BlblwiXG4gICAgICAgICAgICAgICAgbGV0LWlzTWluZT1cImlzTWluZVwiXG4gICAgICAgICAgICAgICAgbGV0LWVuYWJsZWRBY3Rpb25zPVwiZW5hYmxlZEFjdGlvbnNcIlxuICAgICAgICAgICAgICAgIGxldC1tZXNzYWdlSW5wdXQ9XCJtZXNzYWdlXCJcbiAgICAgICAgICAgICAgICBsZXQtY3VzdG9tQWN0aW9ucz1cImN1c3RvbUFjdGlvbnNcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHN0cmVhbS1tZXNzYWdlLWFjdGlvbnMtYm94XG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwibWVzc2FnZUFjdGlvbnNCb3hDbGlja2VkKHBvcHBlckNvbnRlbnQpXCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNPcGVuXCJcbiAgICAgICAgICAgICAgICAgIFtpc09wZW5dPVwiaXNPcGVuXCJcbiAgICAgICAgICAgICAgICAgIFtpc01pbmVdPVwiaXNNaW5lXCJcbiAgICAgICAgICAgICAgICAgIFtlbmFibGVkQWN0aW9uc109XCJlbmFibGVkQWN0aW9uc1wiXG4gICAgICAgICAgICAgICAgICBbY3VzdG9tQWN0aW9uc109XCJjdXN0b21BY3Rpb25zXCJcbiAgICAgICAgICAgICAgICAgIFttZXNzYWdlXT1cIm1lc3NhZ2VJbnB1dFwiXG4gICAgICAgICAgICAgICAgPjwvc3RyZWFtLW1lc3NhZ2UtYWN0aW9ucy1ib3g+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgKGN1c3RvbVRlbXBsYXRlc1NlcnZpY2UubWVzc2FnZUFjdGlvbnNCb3hUZW1wbGF0ZSQgfCBhc3luYykgfHxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2VBY3Rpb25zQm94O1xuICAgICAgICAgICAgICAgICAgY29udGV4dDogZ2V0TWVzc2FnZUFjdGlvbnNCb3hDb250ZXh0KClcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9wb3BwZXItY29udGVudD5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hY3Rpb25zLWJveC1idXR0b25cIlxuICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImFjdGlvbi1pY29uXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm1lc3NhZ2VBY3Rpb25zQ2xpY2tlZCgpXCJcbiAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cIm1lc3NhZ2VBY3Rpb25zQ2xpY2tlZCgpXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJ2aXNpYmxlTWVzc2FnZUFjdGlvbnNDb3VudCA+IDBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICBpY29uPVwiYWN0aW9uLWljb25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYWN0aW9uLWljb25cIlxuICAgICAgICAgICAgICA+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgIGVuYWJsZWRNZXNzYWdlQWN0aW9ucy5pbmRleE9mKCdzZW5kLXJlcGx5JykgIT09IC0xICYmXG4gICAgICAgICAgICAgIG1vZGUgPT09ICdtYWluJ1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZV9fYWN0aW9uc19fYWN0aW9uXG4gICAgICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZV9fYWN0aW9uc19fYWN0aW9uLS10aHJlYWRcbiAgICAgICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2UtcmVwbHktaW4tdGhyZWFkLWJ1dHRvblxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwicmVwbHktaW4tdGhyZWFkXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZXRBc0FjdGl2ZVBhcmVudE1lc3NhZ2UoKVwiXG4gICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwic2V0QXNBY3RpdmVQYXJlbnRNZXNzYWdlKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlclxuICAgICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWFjdGlvbi1pY29uXCJcbiAgICAgICAgICAgICAgaWNvbj1cInJlcGx5LWluLXRocmVhZFwiXG4gICAgICAgICAgICA+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cImNhblJlYWN0VG9NZXNzYWdlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZV9fYWN0aW9uc19fYWN0aW9uXG4gICAgICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZV9fYWN0aW9uc19fYWN0aW9uLS1yZWFjdGlvbnNcbiAgICAgICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb25zLWJ1dHRvblxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwicmVhY3Rpb24taWNvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaXNSZWFjdGlvblNlbGVjdG9yT3BlbiA9ICFpc1JlYWN0aW9uU2VsZWN0b3JPcGVuXCJcbiAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJpc1JlYWN0aW9uU2VsZWN0b3JPcGVuID0gIWlzUmVhY3Rpb25TZWxlY3Rvck9wZW5cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlclxuICAgICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWFjdGlvbi1pY29uXCJcbiAgICAgICAgICAgICAgaWNvbj1cInJlYWN0aW9uLWljb25cIlxuICAgICAgICAgICAgPjwvc3RyZWFtLWljb24tcGxhY2Vob2xkZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb25zLWhvc3RcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICNkZWZhdWx0TWVzc2FnZVJlYWN0aW9uc1xuICAgICAgICAgICAgbGV0LW1lc3NhZ2VSZWFjdGlvbkNvdW50cz1cIm1lc3NhZ2VSZWFjdGlvbkNvdW50c1wiXG4gICAgICAgICAgICBsZXQtbGF0ZXN0UmVhY3Rpb25zPVwibGF0ZXN0UmVhY3Rpb25zXCJcbiAgICAgICAgICAgIGxldC1pc1NlbGVjdG9yT3Blbj1cImlzU2VsZWN0b3JPcGVuXCJcbiAgICAgICAgICAgIGxldC1pc1NlbGVjdG9yT3BlbkNoYW5nZUhhbmRsZXI9XCJpc1NlbGVjdG9yT3BlbkNoYW5nZUhhbmRsZXJcIlxuICAgICAgICAgICAgbGV0LW1lc3NhZ2VJZD1cIm1lc3NhZ2VJZFwiXG4gICAgICAgICAgICBsZXQtb3duUmVhY3Rpb25zPVwib3duUmVhY3Rpb25zXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3RyZWFtLW1lc3NhZ2UtcmVhY3Rpb25zXG4gICAgICAgICAgICAgIFttZXNzYWdlUmVhY3Rpb25Db3VudHNdPVwibWVzc2FnZVJlYWN0aW9uQ291bnRzXCJcbiAgICAgICAgICAgICAgW2xhdGVzdFJlYWN0aW9uc109XCJsYXRlc3RSZWFjdGlvbnNcIlxuICAgICAgICAgICAgICBbaXNTZWxlY3Rvck9wZW5dPVwiaXNTZWxlY3Rvck9wZW5cIlxuICAgICAgICAgICAgICAoaXNTZWxlY3Rvck9wZW5DaGFuZ2UpPVwiaXNTZWxlY3Rvck9wZW5DaGFuZ2VIYW5kbGVyKCRldmVudClcIlxuICAgICAgICAgICAgICBbbWVzc2FnZUlkXT1cIm1lc3NhZ2VJZFwiXG4gICAgICAgICAgICAgIFtvd25SZWFjdGlvbnNdPVwib3duUmVhY3Rpb25zXCJcbiAgICAgICAgICAgID48L3N0cmVhbS1tZXNzYWdlLXJlYWN0aW9ucz5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLm1lc3NhZ2VSZWFjdGlvbnNUZW1wbGF0ZSQgfCBhc3luYykgfHxcbiAgICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZVJlYWN0aW9ucztcbiAgICAgICAgICAgICAgY29udGV4dDogZ2V0TWVzc2FnZVJlYWN0aW9uc0NvbnRleHQoKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1idWJibGUgc3RyLWNoYXQtYW5ndWxhcl9fbWVzc2FnZS1idWJibGVcIlxuICAgICAgICAgIFtjbGFzcy5zdHItY2hhdC1hbmd1bGFyX19tZXNzYWdlLWJ1YmJsZS0tYXR0YWNobWVudC1tb2RhbC1vcGVuXT1cIlxuICAgICAgICAgICAgaW1hZ2VBdHRhY2htZW50TW9kYWxTdGF0ZSA9PT0gJ29wZW5lZCdcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0F0dGFjaG1lbnQgJiYgIW1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYXR0YWNobWVudHNUZW1wbGF0ZVwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS10ZXh0XCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAqbmdJZj1cIm1lc3NhZ2U/LnRleHQgfHwgKG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlICYmIGhhc0F0dGFjaG1lbnQpXCJcbiAgICAgICAgICAgIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS10ZXh0LS1wb2ludGVyLWN1cnNvcl09XCJcbiAgICAgICAgICAgICAgKG1lc3NhZ2U/LnN0YXR1cyA9PT0gJ2ZhaWxlZCcgJiZcbiAgICAgICAgICAgICAgICBtZXNzYWdlPy5lcnJvclN0YXR1c0NvZGUgIT09IDQwMykgfHxcbiAgICAgICAgICAgICAgKHRoaXMubWVzc2FnZT8udHlwZSA9PT0gJ2Vycm9yJyAmJlxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZT8ubW9kZXJhdGlvbl9kZXRhaWxzKSB8fFxuICAgICAgICAgICAgICBtZXNzYWdlPy5tZXNzYWdlX3RleHRfdXBkYXRlZF9hdFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIChjbGljayk9XCJtZXNzYWdlQ2xpY2tlZCgpXCJcbiAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJtZXNzYWdlQ2xpY2tlZCgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiaW5uZXItbWVzc2FnZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2UtdGV4dC1pbm5lciBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtdGV4dC1pbm5lclxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtbGlnaHQtdGV4dC1pbm5lci0taGFzLWF0dGFjaG1lbnRdPVwiXG4gICAgICAgICAgICAgICAgaGFzQXR0YWNobWVudFxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicXVvdGVkTWVzc2FnZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzQXR0YWNobWVudCAmJiBtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYXR0YWNobWVudHNUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiY2xpZW50LWVycm9yLW1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwibWVzc2FnZT8udHlwZSA9PT0gJ2Vycm9yJ1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICAgICAgICAgIHN0ci1jaGF0X19zaW1wbGUtbWVzc2FnZS0tZXJyb3ItbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2UtLWVycm9yLW1lc3NhZ2VcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtZXNzYWdlPy5tb2RlcmF0aW9uX2RldGFpbHNcIj57e1xuICAgICAgICAgICAgICAgICAgXCJzdHJlYW1DaGF0LkVycm9yIMK3IFVuc2VudFwiIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImVycm9yLW1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwibWVzc2FnZT8uc3RhdHVzID09PSAnZmFpbGVkJ1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICAgICAgICAgIHN0ci1jaGF0X19zaW1wbGUtbWVzc2FnZS0tZXJyb3ItbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2UtLWVycm9yLW1lc3NhZ2VcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgIChtZXNzYWdlPy5lcnJvclN0YXR1c0NvZGUgPT09IDQwM1xuICAgICAgICAgICAgICAgICAgICA/IFwic3RyZWFtQ2hhdC5NZXNzYWdlIEZhaWxlZCDCtyBVbmF1dGhvcml6ZWRcIlxuICAgICAgICAgICAgICAgICAgICA6IFwic3RyZWFtQ2hhdC5NZXNzYWdlIEZhaWxlZCDCtyBDbGljayB0byB0cnkgYWdhaW5cIlxuICAgICAgICAgICAgICAgICAgKSB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGRhdGEtdGVzdGlkPVwidGV4dFwiPlxuICAgICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1lc3NhZ2VUZXh0UGFydHM7IGVsc2UgZGVmYXVsdENvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L3RlbXBsYXRlL3VzZS10cmFjay1ieS1mdW5jdGlvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcGFydCBvZiBtZXNzYWdlVGV4dFBhcnRzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicGFydC50eXBlID09PSAndGV4dCc7IGVsc2UgbWVudGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cInBhcnQuY29udGVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI21lbnRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRNZW50aW9uIGxldC1jb250ZW50PVwiY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLW1lbnRpb25cIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLm1lbnRpb25UZW1wbGF0ZSQgfCBhc3luYykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRNZW50aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGdldE1lbnRpb25Db250ZXh0KHBhcnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXNwbGF5QXMgPT09ICd0ZXh0JzsgZWxzZSBhc0hUTUxcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBtZXNzYWdlVGV4dCB8fCBcIlwiIH19XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2FzSFRNTFxuICAgICAgICAgICAgICAgICAgICAgID48c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJodG1sLWNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJtZXNzYWdlVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvc3BhblxuICAgICAgICAgICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlclxuICAgICAgICAgICAgKm5nSWY9XCJ0aGVtZVZlcnNpb24gPT09ICcyJ1wiXG4gICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWVycm9yLWljb25cIlxuICAgICAgICAgICAgaWNvbj1cImVycm9yXCJcbiAgICAgICAgICA+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgcmVwbHlDb3VudEJ1dHRvbjtcbiAgICAgICAgICAgIGNvbnRleHQ6IHsgcG9zaXRpb246ICdpbnNpZGUtbWVzc2FnZS1idWJibGUnIH1cbiAgICAgICAgICBcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgbWVzc2FnZURhdGVBbmRTZW5kZXI7XG4gICAgICAgICAgICBjb250ZXh0OiB7IHBvc2l0aW9uOiAnaW5zaWRlLW1lc3NhZ2UtYnViYmxlJyB9XG4gICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgcmVwbHlDb3VudEJ1dHRvbjtcbiAgICAgICAgICBjb250ZXh0OiB7IHBvc2l0aW9uOiAnb3V0c2lkZS1tZXNzYWdlLWJ1YmJsZScsIG1lc3NhZ2U6IG1lc3NhZ2UgfVxuICAgICAgICBcIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgbWVzc2FnZURhdGVBbmRTZW5kZXI7XG4gICAgICAgICAgY29udGV4dDogeyBwb3NpdGlvbjogJ291dHNpZGUtbWVzc2FnZS1idWJibGUnIH1cbiAgICAgICAgXCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNkZWxldGVkTWVzc2FnZT5cbiAgPGRpdiBkYXRhLXRlc3RpZD1cIm1lc3NhZ2UtZGVsZXRlZC1jb21wb25lbnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtLWRlbGV0ZWQtaW5uZXJcIiB0cmFuc2xhdGU+XG4gICAgICBzdHJlYW1DaGF0LlRoaXMgbWVzc2FnZSB3YXMgZGVsZXRlZC4uLlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc3lzdGVtTWVzc2FnZT5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5zeXN0ZW1NZXNzYWdlVGVtcGxhdGUkIHwgYXN5bmMpIHx8XG4gICAgICAgIGRlZmF1bHRTeXN0ZW1NZXNzYWdlO1xuICAgICAgY29udGV4dDogZ2V0TWVzc2FnZUNvbnRleHQoKVxuICAgIFwiXG4gID48L25nLWNvbnRhaW5lcj5cbiAgPG5nLXRlbXBsYXRlICNkZWZhdWx0U3lzdGVtTWVzc2FnZSBsZXQtbWVzc2FnZUlucHV0PVwibWVzc2FnZVwiPlxuICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJzeXN0ZW0tbWVzc2FnZVwiIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtLXN5c3RlbVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLS1zeXN0ZW1fX3RleHRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLS1zeXN0ZW1fX2xpbmVcIj48L2Rpdj5cbiAgICAgICAgPHA+e3sgbWVzc2FnZUlucHV0Py50ZXh0IH19PC9wPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtLXN5c3RlbV9fbGluZVwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtLXN5c3RlbV9fZGF0ZVwiPlxuICAgICAgICB7eyBwYXJzZWREYXRlIH19XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcXVvdGVkTWVzc2FnZT5cbiAgPGRpdlxuICAgICpuZ0lmPVwibWVzc2FnZT8ucXVvdGVkX21lc3NhZ2VcIlxuICAgIGNsYXNzPVwicXVvdGVkLW1lc3NhZ2Ugc3RyLWNoYXRfX3F1b3RlZC1tZXNzYWdlLXByZXZpZXdcIlxuICAgIGRhdGEtdGVzdGlkPVwicXVvdGVkLW1lc3NhZ2UtY29udGFpbmVyXCJcbiAgICBbY2xhc3MubWluZV09XCJpc1NlbnRCeUN1cnJlbnRVc2VyXCJcbiAgICAoY2xpY2spPVwiXG4gICAgICBqdW1wVG9NZXNzYWdlKFxuICAgICAgICAobWVzc2FnZT8ucXVvdGVkX21lc3NhZ2UpIS5pZCxcbiAgICAgICAgbWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LnBhcmVudF9pZFxuICAgICAgKVxuICAgIFwiXG4gICAgKGtleXVwLmVudGVyKT1cIlxuICAgICAganVtcFRvTWVzc2FnZShcbiAgICAgICAgKG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlKSEuaWQsXG4gICAgICAgIG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy5wYXJlbnRfaWRcbiAgICAgIClcbiAgICBcIlxuICA+XG4gICAgPHN0cmVhbS1hdmF0YXItcGxhY2Vob2xkZXJcbiAgICAgIGRhdGEtdGVzdGlkPVwicW91dGVkLW1lc3NhZ2UtYXZhdGFyXCJcbiAgICAgIGNsYXNzPVwic3RyLWNoYXQtYW5ndWxhcl9fYXZhdGFyLWhvc3Qgc3RyLWNoYXRfX21lc3NhZ2Utc2VuZGVyLWF2YXRhclwiXG4gICAgICBbaW1hZ2VVcmxdPVwibWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LnVzZXI/LmltYWdlXCJcbiAgICAgIFtuYW1lXT1cIlxuICAgICAgICBtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8udXNlcj8ubmFtZSB8fCBtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8udXNlcj8uaWRcbiAgICAgIFwiXG4gICAgICBbc2l6ZV09XCIyMFwiXG4gICAgICB0eXBlPVwidXNlclwiXG4gICAgICBsb2NhdGlvbj1cInF1b3RlZC1tZXNzYWdlLXNlbmRlclwiXG4gICAgICBbdXNlcl09XCJtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8udXNlciB8fCB1bmRlZmluZWRcIlxuICAgID48L3N0cmVhbS1hdmF0YXItcGxhY2Vob2xkZXI+XG4gICAgPGRpdiBjbGFzcz1cInF1b3RlZC1tZXNzYWdlLWlubmVyIHN0ci1jaGF0X19xdW90ZWQtbWVzc2FnZS1idWJibGVcIj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8uYXR0YWNobWVudHMgJiZcbiAgICAgICAgICBtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8uYXR0YWNobWVudHM/Lmxlbmd0aFxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAjZGVmYXVsdEF0dGFjaG1lbnRzXG4gICAgICAgICAgbGV0LW1lc3NhZ2VJZD1cIm1lc3NhZ2VJZFwiXG4gICAgICAgICAgbGV0LWF0dGFjaG1lbnRzPVwiYXR0YWNobWVudHNcIlxuICAgICAgICAgIGxldC1wYXJlbnRNZXNzYWdlSWQ9XCJwYXJlbnRNZXNzYWdlSWRcIlxuICAgICAgICAgIGxldC1pbWFnZU1vZGFsU3RhdGVDaGFuZ2VIYW5kbGVyPVwiaW1hZ2VNb2RhbFN0YXRlQ2hhbmdlSGFuZGxlclwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3RyZWFtLWF0dGFjaG1lbnQtbGlzdFxuICAgICAgICAgICAgW21lc3NhZ2VJZF09XCJtZXNzYWdlSWRcIlxuICAgICAgICAgICAgW2F0dGFjaG1lbnRzXT1cImF0dGFjaG1lbnRzXCJcbiAgICAgICAgICAgIFtwYXJlbnRNZXNzYWdlSWRdPVwicGFyZW50TWVzc2FnZUlkXCJcbiAgICAgICAgICAgIChpbWFnZU1vZGFsU3RhdGVDaGFuZ2UpPVwiaW1hZ2VNb2RhbFN0YXRlQ2hhbmdlSGFuZGxlcigkZXZlbnQpXCJcbiAgICAgICAgICA+PC9zdHJlYW0tYXR0YWNobWVudC1saXN0PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLmF0dGFjaG1lbnRMaXN0VGVtcGxhdGUkIHwgYXN5bmMpIHx8XG4gICAgICAgICAgICAgIGRlZmF1bHRBdHRhY2htZW50cztcbiAgICAgICAgICAgIGNvbnRleHQ6IGdldFF1b3RlZE1lc3NhZ2VBdHRhY2htZW50TGlzdENvbnRleHQoKVxuICAgICAgICAgIFwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPGRpdlxuICAgICAgICBkYXRhLXRlc3RpZD1cInF1b3RlZC1tZXNzYWdlLXRleHRcIlxuICAgICAgICBbaW5uZXJIVE1MXT1cIlxuICAgICAgICAgIG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy50cmFuc2xhdGlvbiB8fFxuICAgICAgICAgIG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy5odG1sIHx8XG4gICAgICAgICAgbWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LnRleHRcbiAgICAgICAgXCJcbiAgICAgID48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIFdlIG5lZWQgdGhlc2UgbWFya3VwcyBpbiBzbGlnaHRseSBkaWZmZXJlbnQgcG9zaXRpb25zIGluIHRoZW1lLXYxIGFuZCB0aGVtZS12MiwgdGhpcyBzb3VsdGlvbiBtYWtlcyB0aGF0IHBvc3NpYmxlIHdpdGhvdXQgZHVwbGljYXRpbmcgdGhlIGNvZGUgLS0+XG48bmctdGVtcGxhdGUgI21lc3NhZ2VEYXRlQW5kU2VuZGVyIGxldC1wb3NpdGlvbj1cInBvc2l0aW9uXCI+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdJZj1cIlxuICAgICAgKHBvc2l0aW9uID09PSAnaW5zaWRlLW1lc3NhZ2UtYnViYmxlJyAmJiB0aGVtZVZlcnNpb24gPT09ICcxJykgfHxcbiAgICAgIChwb3NpdGlvbiA9PT0gJ291dHNpZGUtbWVzc2FnZS1idWJibGUnICYmIHRoZW1lVmVyc2lvbiA9PT0gJzInKVxuICAgIFwiXG4gID5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInN0ci1jaGF0X190cmFuc2xhdGlvbi1ub3RpY2VcIlxuICAgICAgKm5nSWY9XCJzaG91bGREaXNwbGF5VHJhbnNsYXRpb25Ob3RpY2VcIlxuICAgICAgZGF0YS10ZXN0aWQ9XCJ0cmFuc2xhdGlvbi1ub3RpY2VcIlxuICAgID5cbiAgICAgIDxidXR0b25cbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJzZWUtb3JpZ2luYWxcIlxuICAgICAgICAqbmdJZj1cImRpc3BsYXllZE1lc3NhZ2VUZXh0Q29udGVudCA9PT0gJ3RyYW5zbGF0aW9uJ1wiXG4gICAgICAgIChjbGljayk9XCJkaXNwbGF5T3JpZ2luYWxNZXNzYWdlKClcIlxuICAgICAgICAoa2V5dXAuZW50ZXIpPVwiZGlzcGxheU9yaWdpbmFsTWVzc2FnZSgpXCJcbiAgICAgICAgdHJhbnNsYXRlXG4gICAgICA+XG4gICAgICAgIHN0cmVhbUNoYXQuU2VlIG9yaWdpbmFsIChhdXRvbWF0aWNhbGx5IHRyYW5zbGF0ZWQpXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJzZWUtdHJhbnNsYXRpb25cIlxuICAgICAgICAqbmdJZj1cImRpc3BsYXllZE1lc3NhZ2VUZXh0Q29udGVudCA9PT0gJ29yaWdpbmFsJ1wiXG4gICAgICAgIChjbGljayk9XCJkaXNwbGF5VHJhbnNsYXRlZE1lc3NhZ2UoKVwiXG4gICAgICAgIChrZXl1cC5lbnRlcik9XCJkaXNwbGF5VHJhbnNsYXRlZE1lc3NhZ2UoKVwiXG4gICAgICAgIHRyYW5zbGF0ZVxuICAgICAgPlxuICAgICAgICBzdHJlYW1DaGF0LlNlZSB0cmFuc2xhdGlvblxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nSWY9XCJjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLmN1c3RvbU1lc3NhZ2VNZXRhZGF0YVRlbXBsYXRlJCB8IGFzeW5jXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX2N1c3RvbS1tZXNzYWdlLW1ldGFkYXRhXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgKGN1c3RvbVRlbXBsYXRlc1NlcnZpY2UuY3VzdG9tTWVzc2FnZU1ldGFkYXRhVGVtcGxhdGUkIHwgYXN5bmMpITtcbiAgICAgICAgICAgIGNvbnRleHQ6IGdldE1lc3NhZ2VNZXRhZGF0YUNvbnRleHQoKVxuICAgICAgICAgIFwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiXG4gICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLWRhdGFcbiAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLWRhdGFcbiAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2UtbWV0YWRhdGFcbiAgICAgIFwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRoZW1lVmVyc2lvbiA9PT0gJzInXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtZXNzYWdlU3RhdHVzXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGRhdGEtdGVzdGlkPVwic2VuZGVyXCJcbiAgICAgICAgKm5nSWY9XCIhaXNTZW50QnlDdXJyZW50VXNlclwiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLW5hbWUgc3RyLWNoYXRfX21lc3NhZ2Utc2VuZGVyLW5hbWVcIlxuICAgICAgPlxuICAgICAgICB7eyBtZXNzYWdlPy51c2VyPy5uYW1lID8gbWVzc2FnZT8udXNlcj8ubmFtZSA6IG1lc3NhZ2U/LnVzZXI/LmlkIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhblxuICAgICAgICBkYXRhLXRlc3RpZD1cImRhdGVcIlxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS10aW1lc3RhbXAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLXRpbWVcIlxuICAgICAgPlxuICAgICAgICB7eyBwYXJzZWREYXRlIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWVzc2FnZT8ubWVzc2FnZV90ZXh0X3VwZGF0ZWRfYXRcIj5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBkYXRhLXRlc3RpZD1cImVkaXRlZC1mbGFnXCJcbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNhZ2Utc2ltcGxlLWVkaXRlZFwiXG4gICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgPnN0cmVhbUNoYXQuRWRpdGVkPC9zcGFuXG4gICAgICAgID5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZWRpdGVkLXRpbWVzdGFtcFwiXG4gICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1lZGl0ZWQtdGltZXN0YW1wXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnc3RyLWNoYXRfX21lc3NhZ2UtZWRpdGVkLXRpbWVzdGFtcC0tb3Blbic6IGlzRWRpdGVkRmxhZ09wZW5lZCxcbiAgICAgICAgICAgICdzdHItY2hhdF9fbWVzc2FnZS1lZGl0ZWQtdGltZXN0YW1wLS1jb2xsYXBzZWQnOiAhaXNFZGl0ZWRGbGFnT3BlbmVkXG4gICAgICAgICAgfVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+c3RyZWFtQ2hhdC5FZGl0ZWQ8L3NwYW4+XG4gICAgICAgICAgPHRpbWVcbiAgICAgICAgICAgIGRhdGVUaW1lPVwie3sgbWVzc2FnZT8ubWVzc2FnZV90ZXh0X3VwZGF0ZWRfYXQgfX1cIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyBtZXNzYWdlPy5tZXNzYWdlX3RleHRfdXBkYXRlZF9hdCB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgcGFzZWRFZGl0ZWREYXRlIH19XG4gICAgICAgICAgPC90aW1lPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWVzc2FnZVN0YXR1cz5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ0lmPVwiXG4gICAgICBpc1NlbnRCeUN1cnJlbnRVc2VyICYmXG4gICAgICAoKGlzTGFzdFNlbnRNZXNzYWdlICYmIG1lc3NhZ2U/LnN0YXR1cyA9PT0gJ3JlY2VpdmVkJykgfHxcbiAgICAgICAgbWVzc2FnZT8uc3RhdHVzID09PSAnc2VuZGluZycpXG4gICAgXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXNzYWdlPy5zdGF0dXMgPT09ICdzZW5kaW5nJzsgZWxzZSBzZW50U3RhdHVzXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VuZGluZ1N0YXR1c1wiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjc2VudFN0YXR1cz5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBtb2RlID09PSAnbWFpbicgJiYgaXNNZXNzYWdlRGVsaXZlcmVkQW5kUmVhZCAmJiBjYW5EaXNwbGF5UmVhZFN0YXR1cztcbiAgICAgICAgICBlbHNlIGRlbGl2ZXJlZFN0YXR1c1xuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicmVhZFN0YXR1c1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI2RlbGl2ZXJlZFN0YXR1cz5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5kZWxpdmVyZWRTdGF0dXNUZW1wbGF0ZSQgfCBhc3luYykgfHxcbiAgICAgICAgICAgIGRlZmF1bHREZWxpdmVyZWRTdGF0dXM7XG4gICAgICAgICAgY29udGV4dDogZ2V0RGVsaXZlcmVkU3RhdHVzQ29udGV4dCgpXG4gICAgICAgIFwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHREZWxpdmVyZWRTdGF0dXM+XG4gICAgICA8c3BhblxuICAgICAgICAqbmdJZj1cIm1vZGUgPT09ICdtYWluJ1wiXG4gICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLXN0YXR1c1xuICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS1zdGF0dXMtYW5ndWxhclxuICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXN0YXR1c1xuICAgICAgICBcIlxuICAgICAgICBkYXRhLXRlc3RpZD1cImRlbGl2ZXJlZC1pbmRpY2F0b3JcIlxuICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICBbcG9wcGVyXT1cInBvcHBlckNvbnRlbnRcIlxuICAgICAgICBbcG9wcGVyVHJpZ2dlcl09XCJwb3BwZXJUcmlnZ2VySG92ZXJcIlxuICAgICAgICBbcG9wcGVyUGxhY2VtZW50XT1cInBvcHBlclBsYWNlbWVudEF1dG9cIlxuICAgICAgICBbcG9wcGVySGlkZU9uU2Nyb2xsXT1cImZhbHNlXCJcbiAgICAgICAgW3BvcHBlckhpZGVPbkNsaWNrT3V0c2lkZV09XCJmYWxzZVwiXG4gICAgICAgIChob3Zlcik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgPlxuICAgICAgICA8cG9wcGVyLWNvbnRlbnQgI3BvcHBlckNvbnRlbnQ+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X190b29sdGlwIHN0ci1jaGF0X190b29sdGlwLWFuZ3VsYXJcIj5cbiAgICAgICAgICAgIHt7IFwic3RyZWFtQ2hhdC5EZWxpdmVyZWRcIiB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3BvcHBlci1jb250ZW50PlxuICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cImRlbGl2ZXJlZC1pY29uXCJcbiAgICAgICAgICBpY29uPVwiZGVsaXZlcmVkLWljb25cIlxuICAgICAgICA+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjc2VuZGluZ1N0YXR1cz5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5zZW5kaW5nU3RhdHVzVGVtcGxhdGUkIHwgYXN5bmMpIHx8XG4gICAgICAgICAgICBkZWZhdWx0U2VuZGluZ1N0YXR1cztcbiAgICAgICAgICBjb250ZXh0OiBnZXRTZW5kaW5nU3RhdHVzQ29udGV4dCgpXG4gICAgICAgIFwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRTZW5kaW5nU3RhdHVzPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtc3RhdHVzXG4gICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLXN0YXR1cy1hbmd1bGFyXG4gICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc3RhdHVzXG4gICAgICAgIFwiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwic2VuZGluZy1pbmRpY2F0b3JcIlxuICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICBbcG9wcGVyXT1cInBvcHBlckNvbnRlbnRcIlxuICAgICAgICBbcG9wcGVyVHJpZ2dlcl09XCJwb3BwZXJUcmlnZ2VySG92ZXJcIlxuICAgICAgICBbcG9wcGVyUGxhY2VtZW50XT1cInBvcHBlclBsYWNlbWVudEF1dG9cIlxuICAgICAgICBbcG9wcGVySGlkZU9uU2Nyb2xsXT1cImZhbHNlXCJcbiAgICAgICAgW3BvcHBlckhpZGVPbkNsaWNrT3V0c2lkZV09XCJmYWxzZVwiXG4gICAgICAgIChob3Zlcik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgPlxuICAgICAgICA8cG9wcGVyLWNvbnRlbnQgI3BvcHBlckNvbnRlbnQ+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X190b29sdGlwIHN0ci1jaGF0X190b29sdGlwLWFuZ3VsYXJcIj5cbiAgICAgICAgICAgIHt7IFwic3RyZWFtQ2hhdC5TZW5kaW5nLi4uXCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9wb3BwZXItY29udGVudD5cbiAgICAgICAgPHN0cmVhbS1sb2FkaW5nLWluZGljYXRvci1wbGFjZWhvbGRlclxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwibG9hZGluZy1pbmRpY2F0b3JcIlxuICAgICAgICA+PC9zdHJlYW0tbG9hZGluZy1pbmRpY2F0b3ItcGxhY2Vob2xkZXI+XG4gICAgICA8L3NwYW4+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI3JlYWRTdGF0dXM+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgKGN1c3RvbVRlbXBsYXRlc1NlcnZpY2UucmVhZFN0YXR1c1RlbXBsYXRlJCB8IGFzeW5jKSB8fFxuICAgICAgICAgICAgZGVmYXVsdFJlYWRTdGF0dXM7XG4gICAgICAgICAgY29udGV4dDogZ2V0UmVhZFN0YXR1c0NvbnRleHQoKVxuICAgICAgICBcIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0UmVhZFN0YXR1cz5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLXN0YXR1c1xuICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS1zdGF0dXMtYW5ndWxhclxuICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXN0YXR1c1xuICAgICAgICBcIlxuICAgICAgICBkYXRhLXRlc3RpZD1cInJlYWQtaW5kaWNhdG9yXCJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgW3BvcHBlcl09XCJwb3BwZXJDb250ZW50XCJcbiAgICAgICAgW3BvcHBlclRyaWdnZXJdPVwicG9wcGVyVHJpZ2dlckhvdmVyXCJcbiAgICAgICAgW3BvcHBlclBsYWNlbWVudF09XCJwb3BwZXJQbGFjZW1lbnRBdXRvXCJcbiAgICAgICAgW3BvcHBlckhpZGVPblNjcm9sbF09XCJmYWxzZVwiXG4gICAgICAgIFtwb3BwZXJIaWRlT25DbGlja091dHNpZGVdPVwiZmFsc2VcIlxuICAgICAgICAoaG92ZXIpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgID5cbiAgICAgICAgPHBvcHBlci1jb250ZW50ICNwb3BwZXJDb250ZW50PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3Rvb2x0aXAgc3RyLWNoYXRfX3Rvb2x0aXAtYW5ndWxhclwiXG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cInJlYWQtYnktdG9vbHRpcFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgcmVhZEJ5VGV4dCB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3BvcHBlci1jb250ZW50PlxuICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXIgaWNvbj1cInJlYWQtaWNvblwiPjwvc3RyZWFtLWljb24tcGxhY2Vob2xkZXI+XG4gICAgICA8L3NwYW4+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3JlcGx5Q291bnRCdXR0b24gbGV0LXBvc2l0aW9uPVwicG9zaXRpb25cIj5cbiAgPGRpdlxuICAgICpuZ0lmPVwiXG4gICAgICAocG9zaXRpb24gPT09ICdpbnNpZGUtbWVzc2FnZS1idWJibGUnICYmIHRoZW1lVmVyc2lvbiA9PT0gJzEnKSB8fFxuICAgICAgKHBvc2l0aW9uID09PSAnb3V0c2lkZS1tZXNzYWdlLWJ1YmJsZScgJiYgdGhlbWVWZXJzaW9uID09PSAnMicpXG4gICAgXCJcbiAgICBjbGFzcz1cIlxuICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLXJlcGx5LWJ1dHRvblxuICAgICAgc3RyLWNoYXRfX21lc3NhZ2UtcmVwbGllcy1jb3VudC1idXR0b24td3JhcHBlclxuICAgIFwiXG4gID5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cInNob3VsZERpc3BsYXlUaHJlYWRMaW5rXCJcbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtcmVwbGllcy1jb3VudC1idXR0b25cIlxuICAgICAgZGF0YS10ZXN0aWQ9XCJyZXBseS1jb3VudC1idXR0b25cIlxuICAgICAgKGNsaWNrKT1cInNldEFzQWN0aXZlUGFyZW50TWVzc2FnZSgpXCJcbiAgICA+XG4gICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXJcbiAgICAgICAgKm5nSWY9XCJ0aGVtZVZlcnNpb24gPT09ICcxJ1wiXG4gICAgICAgIHN0cmVhbS1pY29uLXBsYWNlaG9sZGVyXG4gICAgICAgIGljb249XCJyZXBseVwiXG4gICAgICA+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cbiAgICAgIHt7bWVzc2FnZT8ucmVwbHlfY291bnQgPT09IDEgPyAoJ3N0cmVhbUNoYXQuMSByZXBseScgfCB0cmFuc2xhdGUpIDogKCdzdHJlYW1DaGF0Lnt7IHJlcGx5Q291bnQgfX1cbiAgICAgIHJlcGxpZXMnIHwgdHJhbnNsYXRlOnJlcGx5Q291bnRQYXJhbSl9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYXR0YWNobWVudHNUZW1wbGF0ZT5cbiAgPG5nLXRlbXBsYXRlXG4gICAgI2RlZmF1bHRBdHRhY2htZW50c1xuICAgIGxldC1tZXNzYWdlSWQ9XCJtZXNzYWdlSWRcIlxuICAgIGxldC1hdHRhY2htZW50cz1cImF0dGFjaG1lbnRzXCJcbiAgICBsZXQtcGFyZW50TWVzc2FnZUlkPVwicGFyZW50TWVzc2FnZUlkXCJcbiAgICBsZXQtaW1hZ2VNb2RhbFN0YXRlQ2hhbmdlSGFuZGxlcj1cImltYWdlTW9kYWxTdGF0ZUNoYW5nZUhhbmRsZXJcIlxuICA+XG4gICAgPHN0cmVhbS1hdHRhY2htZW50LWxpc3RcbiAgICAgIFttZXNzYWdlSWRdPVwibWVzc2FnZUlkXCJcbiAgICAgIFthdHRhY2htZW50c109XCJhdHRhY2htZW50c1wiXG4gICAgICBbcGFyZW50TWVzc2FnZUlkXT1cInBhcmVudE1lc3NhZ2VJZFwiXG4gICAgICAoaW1hZ2VNb2RhbFN0YXRlQ2hhbmdlKT1cImltYWdlTW9kYWxTdGF0ZUNoYW5nZUhhbmRsZXIoJGV2ZW50KVwiXG4gICAgPjwvc3RyZWFtLWF0dGFjaG1lbnQtbGlzdD5cbiAgPC9uZy10ZW1wbGF0ZT5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5hdHRhY2htZW50TGlzdFRlbXBsYXRlJCB8IGFzeW5jKSB8fFxuICAgICAgICBkZWZhdWx0QXR0YWNobWVudHM7XG4gICAgICBjb250ZXh0OiBnZXRBdHRhY2htZW50TGlzdENvbnRleHQoKVxuICAgIFwiXG4gID48L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=