@cometchat/chat-uikit-angular 4.0.0-beta.1

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 (249) hide show
  1. package/Calls/CallingExtension.d.ts +5 -0
  2. package/Calls/CallingExtensionDecorator.d.ts +17 -0
  3. package/Calls/CometChatCallButtons/cometchat-call-buttons/cometchat-call-buttons.component.d.ts +75 -0
  4. package/Calls/CometChatCallButtons/cometchat-call-buttons.module.d.ts +11 -0
  5. package/Calls/CometChatIncomingCall/cometchat-incoming-call/cometchat-incoming-call.component.d.ts +80 -0
  6. package/Calls/CometChatIncomingCall/cometchat-incoming-call.module.d.ts +11 -0
  7. package/Calls/CometChatOngoingCall/cometchat-ongoing-call/cometchat-ongoing-call.component.d.ts +26 -0
  8. package/Calls/CometChatOngoingCall/cometchat-ongoing-call.module.d.ts +9 -0
  9. package/Calls/CometChatOutgoingCall/cometchat-outgoing-call/cometchat-outgoing-call.component.d.ts +58 -0
  10. package/Calls/CometChatOutgoingCall/cometchat-outgoing-call.module.d.ts +10 -0
  11. package/CometChatAddMembers/cometchat-add-members/cometchat-add-members.component.d.ts +109 -0
  12. package/CometChatAddMembers/cometchat-add-members.module.d.ts +12 -0
  13. package/CometChatBannedMembers/cometchat-banned-members/cometchat-banned-members.component.d.ts +140 -0
  14. package/CometChatBannedMembers/cometchat-banned-members.module.d.ts +13 -0
  15. package/CometChatConversations/cometchat-conversations/cometchat-conversations.component.d.ts +335 -0
  16. package/CometChatConversations/cometchat-conversations.module.d.ts +10 -0
  17. package/CometChatConversationsWithMessages/cometchat-conversations-with-messages/cometchat-conversations-with-messages.component.d.ts +86 -0
  18. package/CometChatConversationsWithMessages/cometchat-conversations-with-messages.module.d.ts +12 -0
  19. package/CometChatDetails/cometchat-details/cometchat-details.component.d.ts +149 -0
  20. package/CometChatDetails/cometchat-details.module.d.ts +12 -0
  21. package/CometChatGroupMembers/cometchat-group-members/cometchat-group-members.component.d.ts +145 -0
  22. package/CometChatGroupMembers/cometchat-group-members.module.d.ts +13 -0
  23. package/CometChatGroups/cometchat-groups/cometchat-groups.component.d.ts +136 -0
  24. package/CometChatGroups/cometchat-groups.module.d.ts +10 -0
  25. package/CometChatGroupsWithMessages/cometchat-groups-with-messages/cometchat-groups-with-messages.component.d.ts +100 -0
  26. package/CometChatGroupsWithMessages/cometchat-groups-with-messages.module.d.ts +13 -0
  27. package/CometChatList/cometchat-list.component.d.ts +87 -0
  28. package/CometChatList/cometchat-list.module.d.ts +10 -0
  29. package/CometChatMessageBubble/cometchat-message-bubble/cometchat-message-bubble.component.d.ts +62 -0
  30. package/CometChatMessageBubble/cometchat-message-bubble.module.d.ts +8 -0
  31. package/CometChatMessageComposer/cometchat-message-composer/cometchat-message-composer.component.d.ts +165 -0
  32. package/CometChatMessageComposer/cometchat-message-composer.module.d.ts +9 -0
  33. package/CometChatMessageHeader/cometchat-message-header/cometchat-message-header.component.d.ts +85 -0
  34. package/CometChatMessageHeader/cometchat-message-header.module.d.ts +9 -0
  35. package/CometChatMessageList/cometchat-message-list/cometchat-message-list.component.d.ts +510 -0
  36. package/CometChatMessageList/cometchat-message-list.module.d.ts +11 -0
  37. package/CometChatMessages/cometchat-messages/cometchat-messages.component.d.ts +136 -0
  38. package/CometChatMessages/cometchat-messages.module.d.ts +15 -0
  39. package/CometChatTheme.service.d.ts +7 -0
  40. package/CometChatThreadedMessages/cometchat-threaded-messages/cometchat-threaded-messages.component.d.ts +73 -0
  41. package/CometChatThreadedMessages/cometchat-threaded-messages.module.d.ts +12 -0
  42. package/CometChatTransferOwnership/cometchat-transfer-ownership/cometchat-transfer-ownership.component.d.ts +88 -0
  43. package/CometChatTransferOwnership/cometchat-transfer-ownership.module.d.ts +10 -0
  44. package/CometChatUsers/cometchat-users/cometchat-users.component.d.ts +105 -0
  45. package/CometChatUsers/cometchat-users.module.d.ts +11 -0
  46. package/CometChatUsersWithMessages/cometchat-users-with-messages/cometchat-users-with-messages.component.d.ts +71 -0
  47. package/CometChatUsersWithMessages/cometchat-users-with-messages.module.d.ts +12 -0
  48. package/Extensions/CollaborativeDocument/CollaborativeDocumentExtension.d.ts +9 -0
  49. package/Extensions/CollaborativeDocument/CollaborativeDocumentExtensionDecorator.d.ts +17 -0
  50. package/Extensions/CollaborativeWhiteboard/CollaborativeWhiteboardExtension.d.ts +9 -0
  51. package/Extensions/CollaborativeWhiteboard/CollaborativeWhiteboardExtensionDecorator.d.ts +17 -0
  52. package/Extensions/ImageModeration/ImageModerationExtension.d.ts +5 -0
  53. package/Extensions/ImageModeration/ImageModerationExtensionDecorator.d.ts +6 -0
  54. package/Extensions/LinkPreviewExtension/LinkPreviewExtension.d.ts +5 -0
  55. package/Extensions/LinkPreviewExtension/LinkPreviewExtensionDecorator.d.ts +6 -0
  56. package/Extensions/MessageTranslation/MessageTranslationExtension.d.ts +9 -0
  57. package/Extensions/MessageTranslation/MessageTranslationExtensionDecorator.d.ts +12 -0
  58. package/Extensions/PollsExtension/PollsExtension.d.ts +5 -0
  59. package/Extensions/PollsExtension/PollsExtensionDecorator.d.ts +15 -0
  60. package/Extensions/Reactions/ReactionExtension.d.ts +5 -0
  61. package/Extensions/Reactions/ReactionExtensionDecorator.d.ts +10 -0
  62. package/Extensions/SmartReplies/SmartRepliesExtension.d.ts +9 -0
  63. package/Extensions/SmartReplies/SmartRepliesExtensionDecorator.d.ts +16 -0
  64. package/Extensions/Stickers/StickersExtension.d.ts +9 -0
  65. package/Extensions/Stickers/StickersExtensionDecorator.d.ts +27 -0
  66. package/Extensions/TextModerator/TextModeratorExtension.d.ts +5 -0
  67. package/Extensions/TextModerator/TextModeratorExtensionDecorator.d.ts +9 -0
  68. package/Extensions/ThumbnailGeneration/ThumbnailGenerationExtension.d.ts +5 -0
  69. package/Extensions/ThumbnailGeneration/ThumbnailGenerationExtensionDecorator.d.ts +6 -0
  70. package/README.md +60 -0
  71. package/Shared/CometChatUIkit/CometChatUIKit.d.ts +18 -0
  72. package/Shared/Framework/ChatConfigurator.d.ts +8 -0
  73. package/Shared/Framework/DataSource.d.ts +29 -0
  74. package/Shared/Framework/DataSourceDecorator.d.ts +32 -0
  75. package/Shared/Framework/ExtensionDataSource.d.ts +3 -0
  76. package/Shared/Utils/MessageUtils.d.ts +43 -0
  77. package/assets/.gitkeep +0 -0
  78. package/assets/Audio-Call.svg +11 -0
  79. package/assets/Audio-Call2x.svg +11 -0
  80. package/assets/Copy.svg +17 -0
  81. package/assets/Grid-layout.svg +1 -0
  82. package/assets/Heart.svg +11 -0
  83. package/assets/Imagemoderation.svg +14 -0
  84. package/assets/Info.svg +13 -0
  85. package/assets/Locked.svg +10 -0
  86. package/assets/More@2x.svg +9 -0
  87. package/assets/Plus.svg +13 -0
  88. package/assets/Private.svg +10 -0
  89. package/assets/Reactionsicon.svg +9 -0
  90. package/assets/Send.svg +12 -0
  91. package/assets/Spinner.svg +15 -0
  92. package/assets/Stickers.svg +16 -0
  93. package/assets/Stipop.svg +9 -0
  94. package/assets/Video-call.svg +12 -0
  95. package/assets/Video-call2x.svg +12 -0
  96. package/assets/activity.svg +22 -0
  97. package/assets/addreaction.svg +9 -0
  98. package/assets/animals.svg +15 -0
  99. package/assets/attachment-file.svg +14 -0
  100. package/assets/audio-file.svg +12 -0
  101. package/assets/back.png +0 -0
  102. package/assets/backbutton.svg +12 -0
  103. package/assets/call.svg +1 -0
  104. package/assets/chats.svg +1 -0
  105. package/assets/checkmark.svg +11 -0
  106. package/assets/close.svg +12 -0
  107. package/assets/close2x.svg +12 -0
  108. package/assets/collaborativedocument.svg +13 -0
  109. package/assets/collaborativewhiteboard.svg +12 -0
  110. package/assets/create-button.svg +12 -0
  111. package/assets/declaration.d.ts +3 -0
  112. package/assets/delete.svg +7 -0
  113. package/assets/deleteicon.svg +15 -0
  114. package/assets/down-arrow.svg +1 -0
  115. package/assets/download.svg +13 -0
  116. package/assets/editicon.svg +14 -0
  117. package/assets/emoji.svg +2693 -0
  118. package/assets/file-upload.svg +2693 -0
  119. package/assets/flags.svg +12 -0
  120. package/assets/food.svg +26 -0
  121. package/assets/group.svg +40 -0
  122. package/assets/heart-reaction.png +0 -0
  123. package/assets/heart.png +0 -0
  124. package/assets/image.svg +2693 -0
  125. package/assets/incomingcall.wav +0 -0
  126. package/assets/increase-size.svg +6 -0
  127. package/assets/location.svg +2693 -0
  128. package/assets/message-delivered.png +0 -0
  129. package/assets/message-delivered.svg +4 -0
  130. package/assets/message-read.png +0 -0
  131. package/assets/message-read.svg +4 -0
  132. package/assets/message-sent.png +0 -0
  133. package/assets/message-sent.svg +3 -0
  134. package/assets/moreicon.svg +9 -0
  135. package/assets/objects.svg +13 -0
  136. package/assets/open-thread.svg +11 -0
  137. package/assets/password-protected-group.svg +3 -0
  138. package/assets/photolibrary.svg +11 -0
  139. package/assets/placeholder.png +0 -0
  140. package/assets/plus-rotated.svg +13 -0
  141. package/assets/polls.svg +14 -0
  142. package/assets/privacy.svg +4 -0
  143. package/assets/private-group.svg +9 -0
  144. package/assets/public.svg +3 -0
  145. package/assets/reduce-size.svg +6 -0
  146. package/assets/right-arrow.svg +6 -0
  147. package/assets/search.png +0 -0
  148. package/assets/search.svg +4 -0
  149. package/assets/side-arrow.svg +1 -0
  150. package/assets/smileys.svg +16 -0
  151. package/assets/start-chat.svg +1 -0
  152. package/assets/symbols.svg +16 -0
  153. package/assets/thread-arrow.svg +1 -0
  154. package/assets/thread-icon.svg +38 -0
  155. package/assets/threadicon.svg +14 -0
  156. package/assets/translation.svg +16 -0
  157. package/assets/travel.svg +18 -0
  158. package/assets/unsafe-content.svg +23 -0
  159. package/assets/user.svg +31 -0
  160. package/assets/video-upload.svg +2693 -0
  161. package/assets/video.svg +12 -0
  162. package/assets/wait.png +0 -0
  163. package/assets/wait.svg +4 -0
  164. package/assets/warning-small.png +0 -0
  165. package/assets/warning-small.svg +5 -0
  166. package/cometchat-chat-uikit-angular.d.ts +5 -0
  167. package/esm2020/Calls/CallingExtension.mjs +11 -0
  168. package/esm2020/Calls/CallingExtensionDecorator.mjs +114 -0
  169. package/esm2020/Calls/CometChatCallButtons/cometchat-call-buttons/cometchat-call-buttons.component.mjs +358 -0
  170. package/esm2020/Calls/CometChatCallButtons/cometchat-call-buttons.module.mjs +32 -0
  171. package/esm2020/Calls/CometChatIncomingCall/cometchat-incoming-call/cometchat-incoming-call.component.mjs +423 -0
  172. package/esm2020/Calls/CometChatIncomingCall/cometchat-incoming-call.module.mjs +32 -0
  173. package/esm2020/Calls/CometChatOngoingCall/cometchat-ongoing-call/cometchat-ongoing-call.component.mjs +54 -0
  174. package/esm2020/Calls/CometChatOngoingCall/cometchat-ongoing-call.module.mjs +27 -0
  175. package/esm2020/Calls/CometChatOutgoingCall/cometchat-outgoing-call/cometchat-outgoing-call.component.mjs +196 -0
  176. package/esm2020/Calls/CometChatOutgoingCall/cometchat-outgoing-call.module.mjs +28 -0
  177. package/esm2020/CometChatAddMembers/cometchat-add-members/cometchat-add-members.component.mjs +353 -0
  178. package/esm2020/CometChatAddMembers/cometchat-add-members.module.mjs +23 -0
  179. package/esm2020/CometChatBannedMembers/cometchat-banned-members/cometchat-banned-members.component.mjs +446 -0
  180. package/esm2020/CometChatBannedMembers/cometchat-banned-members.module.mjs +24 -0
  181. package/esm2020/CometChatConversations/cometchat-conversations/cometchat-conversations.component.mjs +1400 -0
  182. package/esm2020/CometChatConversations/cometchat-conversations.module.mjs +28 -0
  183. package/esm2020/CometChatConversationsWithMessages/cometchat-conversations-with-messages/cometchat-conversations-with-messages.component.mjs +272 -0
  184. package/esm2020/CometChatConversationsWithMessages/cometchat-conversations-with-messages.module.mjs +39 -0
  185. package/esm2020/CometChatDetails/cometchat-details/cometchat-details.component.mjs +696 -0
  186. package/esm2020/CometChatDetails/cometchat-details.module.mjs +27 -0
  187. package/esm2020/CometChatGroupMembers/cometchat-group-members/cometchat-group-members.component.mjs +676 -0
  188. package/esm2020/CometChatGroupMembers/cometchat-group-members.module.mjs +24 -0
  189. package/esm2020/CometChatGroups/cometchat-groups/cometchat-groups.component.mjs +564 -0
  190. package/esm2020/CometChatGroups/cometchat-groups.module.mjs +28 -0
  191. package/esm2020/CometChatGroupsWithMessages/cometchat-groups-with-messages/cometchat-groups-with-messages.component.mjs +430 -0
  192. package/esm2020/CometChatGroupsWithMessages/cometchat-groups-with-messages.module.mjs +43 -0
  193. package/esm2020/CometChatList/cometchat-list.component.mjs +210 -0
  194. package/esm2020/CometChatList/cometchat-list.module.mjs +28 -0
  195. package/esm2020/CometChatMessageBubble/cometchat-message-bubble/cometchat-message-bubble.component.mjs +157 -0
  196. package/esm2020/CometChatMessageBubble/cometchat-message-bubble.module.mjs +23 -0
  197. package/esm2020/CometChatMessageComposer/cometchat-message-composer/cometchat-message-composer.component.mjs +930 -0
  198. package/esm2020/CometChatMessageComposer/cometchat-message-composer.module.mjs +24 -0
  199. package/esm2020/CometChatMessageHeader/cometchat-message-header/cometchat-message-header.component.mjs +420 -0
  200. package/esm2020/CometChatMessageHeader/cometchat-message-header.module.mjs +26 -0
  201. package/esm2020/CometChatMessageList/cometchat-message-list/cometchat-message-list.component.mjs +2598 -0
  202. package/esm2020/CometChatMessageList/cometchat-message-list.module.mjs +34 -0
  203. package/esm2020/CometChatMessages/cometchat-messages/cometchat-messages.component.mjs +393 -0
  204. package/esm2020/CometChatMessages/cometchat-messages.module.mjs +48 -0
  205. package/esm2020/CometChatTheme.service.mjs +17 -0
  206. package/esm2020/CometChatThreadedMessages/cometchat-threaded-messages/cometchat-threaded-messages.component.mjs +304 -0
  207. package/esm2020/CometChatThreadedMessages/cometchat-threaded-messages.module.mjs +36 -0
  208. package/esm2020/CometChatTransferOwnership/cometchat-transfer-ownership/cometchat-transfer-ownership.component.mjs +337 -0
  209. package/esm2020/CometChatTransferOwnership/cometchat-transfer-ownership.module.mjs +21 -0
  210. package/esm2020/CometChatUsers/cometchat-users/cometchat-users.component.mjs +447 -0
  211. package/esm2020/CometChatUsers/cometchat-users.module.mjs +32 -0
  212. package/esm2020/CometChatUsersWithMessages/cometchat-users-with-messages/cometchat-users-with-messages.component.mjs +185 -0
  213. package/esm2020/CometChatUsersWithMessages/cometchat-users-with-messages.module.mjs +39 -0
  214. package/esm2020/Extensions/CollaborativeDocument/CollaborativeDocumentExtension.mjs +11 -0
  215. package/esm2020/Extensions/CollaborativeDocument/CollaborativeDocumentExtensionDecorator.mjs +89 -0
  216. package/esm2020/Extensions/CollaborativeWhiteboard/CollaborativeWhiteboardExtension.mjs +11 -0
  217. package/esm2020/Extensions/CollaborativeWhiteboard/CollaborativeWhiteboardExtensionDecorator.mjs +89 -0
  218. package/esm2020/Extensions/ImageModeration/ImageModerationExtension.mjs +10 -0
  219. package/esm2020/Extensions/ImageModeration/ImageModerationExtensionDecorator.mjs +10 -0
  220. package/esm2020/Extensions/LinkPreviewExtension/LinkPreviewExtension.mjs +10 -0
  221. package/esm2020/Extensions/LinkPreviewExtension/LinkPreviewExtensionDecorator.mjs +10 -0
  222. package/esm2020/Extensions/MessageTranslation/MessageTranslationExtension.mjs +11 -0
  223. package/esm2020/Extensions/MessageTranslation/MessageTranslationExtensionDecorator.mjs +33 -0
  224. package/esm2020/Extensions/PollsExtension/PollsExtension.mjs +10 -0
  225. package/esm2020/Extensions/PollsExtension/PollsExtensionDecorator.mjs +75 -0
  226. package/esm2020/Extensions/Reactions/ReactionExtension.mjs +10 -0
  227. package/esm2020/Extensions/Reactions/ReactionExtensionDecorator.mjs +30 -0
  228. package/esm2020/Extensions/SmartReplies/SmartRepliesExtension.mjs +11 -0
  229. package/esm2020/Extensions/SmartReplies/SmartRepliesExtensionDecorator.mjs +117 -0
  230. package/esm2020/Extensions/Stickers/StickersExtension.mjs +15 -0
  231. package/esm2020/Extensions/Stickers/StickersExtensionDecorator.mjs +118 -0
  232. package/esm2020/Extensions/TextModerator/TextModeratorExtension.mjs +10 -0
  233. package/esm2020/Extensions/TextModerator/TextModeratorExtensionDecorator.mjs +32 -0
  234. package/esm2020/Extensions/ThumbnailGeneration/ThumbnailGenerationExtension.mjs +10 -0
  235. package/esm2020/Extensions/ThumbnailGeneration/ThumbnailGenerationExtensionDecorator.mjs +10 -0
  236. package/esm2020/Shared/CometChatUIkit/CometChatUIKit.mjs +180 -0
  237. package/esm2020/Shared/Framework/ChatConfigurator.mjs +20 -0
  238. package/esm2020/Shared/Framework/DataSource.mjs +3 -0
  239. package/esm2020/Shared/Framework/DataSourceDecorator.mjs +80 -0
  240. package/esm2020/Shared/Framework/ExtensionDataSource.mjs +4 -0
  241. package/esm2020/Shared/Utils/MessageUtils.mjs +342 -0
  242. package/esm2020/cometchat-chat-uikit-angular.mjs +5 -0
  243. package/esm2020/public-api.mjs +93 -0
  244. package/fesm2015/cometchat-chat-uikit-angular.mjs +13683 -0
  245. package/fesm2015/cometchat-chat-uikit-angular.mjs.map +1 -0
  246. package/fesm2020/cometchat-chat-uikit-angular.mjs +13586 -0
  247. package/fesm2020/cometchat-chat-uikit-angular.mjs.map +1 -0
  248. package/package.json +51 -0
  249. package/public-api.d.ts +79 -0
@@ -0,0 +1,2598 @@
1
+ import { Component, Input, ViewChild, ChangeDetectionStrategy, } from "@angular/core";
2
+ import { CometChat } from "@cometchat-pro/chat";
3
+ import { DateStyle, AvatarStyle, ReceiptStyle } from '@cometchat/uikit-elements';
4
+ import { States, localize, MessageListAlignment, DatePatterns, TimestampAlignment, DocumentIconAlignment, CometChatUIKitConstants, CometChatTheme, MessageBubbleAlignment, fontHelper, CometChatMessageEvents, MessageStatus, CometChatGroupEvents, CometChatUIEvents, Placement, CometChatCallEvents } from "@cometchat/uikit-resources";
5
+ import { MessageListStyle, CometChatSoundManager, MessageReceiptUtils, CollaborativeWhiteboardConstants, CollaborativeDocumentConstants, MessageTranslationConstants, MessageTranslationStyle, ReactionsConstants, SmartRepliesConstants, ThumbnailGenerationConstants, LinkPreviewConstants, CallscreenStyle, CallingDetailsUtils, CometChatUIKitUtility } from "@cometchat/uikit-shared";
6
+ import { ChatConfigurator } from "../../Shared/Framework/ChatConfigurator";
7
+ import { StickersConstants, LinkPreviewStyle } from "@cometchat/uikit-shared";
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "../../CometChatTheme.service";
10
+ import * as i2 from "../../CometChatMessageBubble/cometchat-message-bubble/cometchat-message-bubble.component";
11
+ import * as i3 from "../../Calls/CometChatOngoingCall/cometchat-ongoing-call/cometchat-ongoing-call.component";
12
+ import * as i4 from "@angular/common";
13
+ /**
14
+ *
15
+ * CometChatMessageList is a wrapper component for messageBubble
16
+ *
17
+ * @version 1.0.0
18
+ * @author CometChatTeam
19
+ * @copyright © 2022 CometChat Inc.
20
+ *
21
+ */
22
+ export class CometChatMessageListComponent {
23
+ constructor(ngZone, ref, themeService) {
24
+ this.ngZone = ngZone;
25
+ this.ref = ref;
26
+ this.themeService = themeService;
27
+ this.hideError = false;
28
+ this.errorStateText = localize("SOMETHING_WRONG");
29
+ this.emptyStateText = localize("NO_MESSAGES_FOUND");
30
+ this.loadingIconURL = "assets/Spinner.svg";
31
+ this.disableReceipt = true;
32
+ this.disableSoundForMessages = false;
33
+ this.customSoundForMessages = "";
34
+ this.readIcon = "assets/message-read.svg";
35
+ this.deliveredIcon = "assets/message-delivered.svg";
36
+ this.sentIcon = "assets/message-sent.svg";
37
+ this.waitIcon = "assets/wait.svg";
38
+ this.errorIcon = "assets/warning-small.svg";
39
+ this.alignment = MessageListAlignment.standard;
40
+ this.showAvatar = true;
41
+ this.datePattern = DatePatterns.time;
42
+ this.timestampAlignment = TimestampAlignment.bottom;
43
+ this.DateSeparatorPattern = DatePatterns.DayDateTime;
44
+ this.templates = [];
45
+ this.newMessageIndicatorText = "";
46
+ this.scrollToBottomOnNewMessages = false;
47
+ this.thresholdValue = 1000;
48
+ this.avatarStyle = {
49
+ borderRadius: "16px",
50
+ width: "28px",
51
+ height: "28px",
52
+ };
53
+ this.backdropStyle = {
54
+ height: "100%",
55
+ width: "100%",
56
+ background: "rgba(0, 0, 0, 0.5)"
57
+ };
58
+ this.dateSeparatorStyle = {
59
+ height: "",
60
+ width: "",
61
+ };
62
+ this.messageListStyle = {
63
+ nameTextFont: "600 15px Inter",
64
+ nameTextColor: "white",
65
+ TimestampTextFont: "",
66
+ TimestampTextColor: "",
67
+ threadReplySeparatorColor: "",
68
+ threadReplyTextFont: "",
69
+ threadReplyIconTint: "",
70
+ threadReplyTextColor: "",
71
+ emptyStateTextFont: "700 22px Inter",
72
+ emptyStateTextColor: "#bcbcbc",
73
+ errorStateTextFont: "700 22px Inter",
74
+ errorStateTextColor: "#bcbcbc",
75
+ loadingIconTint: "grey",
76
+ };
77
+ this.onError = (error) => {
78
+ console.log(error);
79
+ };
80
+ this.state = States.loading;
81
+ this.optionsStyle = {
82
+ width: "",
83
+ height: "",
84
+ border: "1px solid #e8e8e8",
85
+ borderRadius: "8px",
86
+ background: "white",
87
+ submenuWidth: "100%",
88
+ submenuHeight: "100%",
89
+ submenuBorder: "1px solid #e8e8e8",
90
+ submenuBorderRadius: "8px",
91
+ submenuBackground: "white",
92
+ moreIconTint: "grey"
93
+ };
94
+ this.receiptStyle = {};
95
+ this.documentBubbleAlignment = DocumentIconAlignment.right;
96
+ this.callBubbleAlignment = DocumentIconAlignment.left;
97
+ this.imageModerationStyle = {};
98
+ this.timestampEnum = TimestampAlignment;
99
+ this.chatChanged = true;
100
+ this.timeStampColor = "";
101
+ this.timeStampFont = "";
102
+ this.smartReplyStyle = {
103
+ width: "100%",
104
+ height: "100%",
105
+ border: "none",
106
+ };
107
+ this.showSmartReply = false;
108
+ this.smartReplyMessage = null;
109
+ this.enableSmartReply = false;
110
+ this.timeStampBackground = "";
111
+ this.linkPreviewStyle = {};
112
+ this.unreadMessagesStyle = {
113
+ height: "100%",
114
+ width: "100%",
115
+ background: "#3399FF",
116
+ display: "flex",
117
+ justifyContent: "center",
118
+ buttonTextFont: "400 13px Inter",
119
+ color: "white",
120
+ border: "none",
121
+ borderRadius: "12px"
122
+ };
123
+ this.dividerStyle = {
124
+ height: "1px",
125
+ width: "100%",
126
+ background: "grey"
127
+ };
128
+ this.pollBubbleStyle = {};
129
+ this.labelStyle = {
130
+ textFont: "400 11px Inter",
131
+ textColor: "grey"
132
+ };
133
+ this.imageBubbleStyle = {
134
+ height: "128px",
135
+ width: "128px",
136
+ border: "none",
137
+ borderRadius: "0",
138
+ background: "transparent"
139
+ };
140
+ this.messagesList = [];
141
+ this.bubbleDateStyle = {};
142
+ this.whiteboardIconURL = "assets/collaborativewhiteboard.svg";
143
+ this.documentIconURL = "assets/collaborativedocument.svg";
144
+ this.directCallIconURL = "assets/Video-call2x.svg";
145
+ this.placeholderIconURL = "/assets/placeholder.png";
146
+ this.downloadIconURL = "assets/download.svg";
147
+ this.translationStyle = {};
148
+ this.documentBubbleStyle = {};
149
+ this.callBubbleStyle = {};
150
+ this.whiteboardTitle = localize("COLLABORATIVE_WHITEBOARD");
151
+ this.whiteboardSubitle = localize("DRAW_WHITEBOARD_TOGETHER");
152
+ this.whiteboardButtonText = localize("OPEN_WHITEBOARD");
153
+ this.documentTitle = localize("COLLABORATIVE_DOCUMENT");
154
+ this.documentSubitle = localize("DRAW_DOCUMENT_TOGETHER");
155
+ this.documentButtonText = localize("OPEN_DOCUMENT");
156
+ this.joinCallButtonText = localize("JOIN");
157
+ this.localize = localize;
158
+ this.reinitialized = false;
159
+ this.MessageTypesConstant = CometChatUIKitConstants.MessageTypes;
160
+ this.callConstant = CometChatUIKitConstants.MessageCategory.call;
161
+ this.typesMap = {};
162
+ this.messageTypesMap = {};
163
+ this.theme = new CometChatTheme({});
164
+ this.msgListenerId = "message_" + new Date().getTime();
165
+ this.groupListenerId = "group_" + new Date().getTime();
166
+ this.callListenerId = "call_" + new Date().getTime();
167
+ this.states = States;
168
+ this.MessageCategory = CometChatUIKitConstants.MessageCategory;
169
+ this.numberOfTopScroll = 0;
170
+ this.keepRecentMessages = true;
171
+ this.messageTemplate = [];
172
+ this.isOnBottom = false;
173
+ this.UnreadCount = [];
174
+ this.newMessageCount = 0;
175
+ this.type = "";
176
+ this.confirmText = localize("YES");
177
+ this.cancelText = localize("NO");
178
+ this.warningText = "Are you sure want to see unsafe content?";
179
+ this.threadedAlignment = MessageBubbleAlignment.left;
180
+ this.openEmojiKeyboard = false;
181
+ this.keyboardAlignment = Placement.right;
182
+ this.popoverStyle = {
183
+ height: "330px",
184
+ width: "325px",
185
+ };
186
+ this.videoBubbleStyle = {
187
+ height: "130px",
188
+ width: "230px",
189
+ border: "none",
190
+ borderRadius: "8px",
191
+ background: "transparent"
192
+ };
193
+ this.threadViewAlignment = MessageBubbleAlignment.left;
194
+ this.enableDataMasking = false;
195
+ this.enableThumbnailGeneration = false;
196
+ this.enableLinkPreview = false;
197
+ this.enablePolls = false;
198
+ this.enableReactions = false;
199
+ this.enableImageModeration = false;
200
+ this.enableStickers = false;
201
+ this.enableWhiteboard = false;
202
+ this.enableDocument = false;
203
+ this.showOngoingCall = false;
204
+ this.enableCalling = false;
205
+ this.ongoingCallStyle = {};
206
+ this.sessionId = "";
207
+ this.closeIconURL = "assets/close2x.svg";
208
+ this.threadOpenIcon = "assets/side-arrow.svg";
209
+ this.confirmDialogStyle = {};
210
+ this.messageToReact = null;
211
+ this.limit = 30;
212
+ this.types = [];
213
+ this.categories = [];
214
+ this.addReaction = (event) => {
215
+ let emoji = event?.detail?.id;
216
+ this.popoverRef.nativeElement.openContentView(event);
217
+ this.reactToMessages(emoji);
218
+ };
219
+ this.getCallActionMessage = (call) => {
220
+ return CallingDetailsUtils.getCallStatus(call, this.loggedInUser);
221
+ };
222
+ this.showEmojiKeyboard = (id, event) => {
223
+ let message = this.getMessageById(id);
224
+ if (message) {
225
+ this.messageToReact = message;
226
+ this.keyboardAlignment = message.getSender()?.getUid() == this.loggedInUser?.getUid() ? Placement.left : Placement.right;
227
+ this.ref.detectChanges();
228
+ this.popoverRef.nativeElement.openContentView(event);
229
+ }
230
+ };
231
+ this.setBubbleView = () => {
232
+ this.messageTemplate.forEach((element) => {
233
+ this.messageTypesMap[element.type] = element;
234
+ });
235
+ };
236
+ this.openThreadView = (message) => {
237
+ if (this.onThreadRepliesClick) {
238
+ this.onThreadRepliesClick(message, this.threadMessageBubble);
239
+ }
240
+ };
241
+ this.threadCallback = (id) => {
242
+ let messageObject = this.getMessageById(id);
243
+ this.openThreadView(messageObject);
244
+ };
245
+ this.deleteCallback = (id) => {
246
+ let messageObject = this.getMessageById(id);
247
+ this.deleteMessage(messageObject);
248
+ };
249
+ this.editCallback = (id) => {
250
+ let messageObject = this.getMessageById(id);
251
+ this.onEditMessage(messageObject);
252
+ };
253
+ this.copyCallback = (id) => {
254
+ let messageObject = this.getMessageById(id);
255
+ this.onCopyMessage(messageObject);
256
+ };
257
+ this.updateTranslatedMessage = (translation) => {
258
+ const receivedMessage = translation;
259
+ const translatedText = receivedMessage.translations[0].message_translated;
260
+ let messageList = [...this.messagesList];
261
+ let messageKey = messageList.findIndex((m) => m.getId() === receivedMessage.msgId);
262
+ let data;
263
+ if (messageKey > -1) {
264
+ const messageObj = messageList[messageKey];
265
+ if (messageObj.getMetadata()) {
266
+ data = messageObj.getMetadata();
267
+ }
268
+ else {
269
+ messageObj.setMetadata({});
270
+ data = messageObj.getMetadata();
271
+ }
272
+ data[MessageTranslationConstants.translated_message] = translatedText;
273
+ const newMessageObj = messageObj;
274
+ messageList.splice(messageKey, 1, newMessageObj);
275
+ this.messagesList = [...messageList];
276
+ this.ref.detectChanges();
277
+ }
278
+ };
279
+ this.translateMessage = (id) => {
280
+ let message = this.getMessageById(id);
281
+ if (message) {
282
+ CometChat.callExtension(MessageTranslationConstants.message_translation, MessageTranslationConstants.post, MessageTranslationConstants.v2_translate, {
283
+ "msgId": message.getId(),
284
+ "text": message.getText(),
285
+ "languages": navigator.languages
286
+ }).then((result) => {
287
+ if (result?.translations[0]?.message_translated != message?.getText()) {
288
+ this.updateTranslatedMessage(result);
289
+ this.ref.detectChanges();
290
+ }
291
+ else {
292
+ return;
293
+ }
294
+ // Result of translations
295
+ })
296
+ .catch((error) => {
297
+ });
298
+ }
299
+ };
300
+ this.getContentView = (message) => {
301
+ if (this.messageTypesMap[message?.getType()] && this.messageTypesMap[message?.getType()]?.contentView) {
302
+ return this.messageTypesMap[message?.getType()]?.contentView(message);
303
+ }
304
+ else {
305
+ return message.getDeletedAt() ? this.typesMap["text"] : this.typesMap[message?.getType()];
306
+ }
307
+ };
308
+ this.setBubbleAlignment = (message) => {
309
+ let alignment = MessageBubbleAlignment.center;
310
+ if (this.alignment == MessageListAlignment.left) {
311
+ alignment = MessageBubbleAlignment.left;
312
+ }
313
+ else {
314
+ if (message?.getType() == CometChatUIKitConstants.MessageTypes.groupMember || message.getCategory() == this.callConstant) {
315
+ alignment = MessageBubbleAlignment.center;
316
+ }
317
+ else if (!message?.getSender() || message?.getSender().getUid() == this.loggedInUser.getUid() && message?.getType() != CometChatUIKitConstants.MessageTypes.groupMember) {
318
+ alignment = MessageBubbleAlignment.right;
319
+ }
320
+ else {
321
+ alignment = MessageBubbleAlignment.left;
322
+ }
323
+ }
324
+ return alignment;
325
+ };
326
+ this.getBubbleWrapper = (message) => {
327
+ let view;
328
+ if (this.messageTypesMap && this.messageTypesMap[message?.getType()] && this.messageTypesMap[message?.getType()].bubbleView) {
329
+ view = this.messageTypesMap[message?.getType()].bubbleView(message);
330
+ return view;
331
+ }
332
+ else {
333
+ view = null;
334
+ return view;
335
+ }
336
+ };
337
+ this.setTranslationStyle = (message) => {
338
+ const isLeftAligned = this.alignment !== MessageListAlignment.left;
339
+ const isUserSentMessage = !message?.getSender() || this.loggedInUser.getUid() === message?.getSender().getUid();
340
+ if (!isLeftAligned) {
341
+ return new MessageTranslationStyle({
342
+ translatedTextFont: fontHelper(this.themeService.theme.typography.text3),
343
+ translatedTextColor: this.themeService.theme.palette.getAccent("light"),
344
+ helpTextColor: this.themeService.theme.palette.getAccent700(),
345
+ helpTextFont: fontHelper(this.themeService.theme.typography.caption2),
346
+ background: "transparent"
347
+ });
348
+ }
349
+ else {
350
+ if (isUserSentMessage) {
351
+ return new MessageTranslationStyle({
352
+ translatedTextFont: fontHelper(this.themeService.theme.typography.text3),
353
+ translatedTextColor: this.themeService.theme.palette.getAccent("dark"),
354
+ helpTextColor: this.themeService.theme.palette.getAccent700("dark"),
355
+ helpTextFont: fontHelper(this.themeService.theme.typography.caption2),
356
+ background: "transparent"
357
+ });
358
+ }
359
+ else {
360
+ return new MessageTranslationStyle({
361
+ translatedTextFont: fontHelper(this.themeService.theme.typography.text3),
362
+ translatedTextColor: this.themeService.theme.palette.getAccent("light"),
363
+ helpTextColor: this.themeService.theme.palette.getAccent700(),
364
+ helpTextFont: fontHelper(this.themeService.theme.typography.caption2),
365
+ background: "transparent"
366
+ });
367
+ }
368
+ }
369
+ };
370
+ this.setTextBubbleStyle = (message) => {
371
+ const isDeleted = message.getDeletedAt();
372
+ const isLeftAligned = this.alignment !== MessageListAlignment.left;
373
+ const isTextMessage = message.getCategory() === CometChatUIKitConstants.MessageCategory.message && message?.getType() === CometChatUIKitConstants.MessageTypes.text;
374
+ const isUserSentMessage = !message?.getSender() || this.loggedInUser.getUid() === message?.getSender().getUid();
375
+ const isGroupMemberMessage = message?.getType() === CometChatUIKitConstants.MessageTypes.groupMember;
376
+ if (this.getLinkPreview(message)) {
377
+ return {
378
+ textFont: fontHelper(this.themeService.theme.typography.text3),
379
+ textColor: this.themeService.theme.palette.getAccent()
380
+ };
381
+ }
382
+ if (!isDeleted && isLeftAligned && isTextMessage && isUserSentMessage) {
383
+ return {
384
+ textFont: fontHelper(this.themeService.theme.typography.text3),
385
+ textColor: this.themeService.theme.palette.getAccent900("light")
386
+ };
387
+ }
388
+ if (!isDeleted && isLeftAligned && isTextMessage && !isUserSentMessage && !isGroupMemberMessage) {
389
+ return {
390
+ textFont: fontHelper(this.themeService.theme.typography.text3),
391
+ textColor: this.themeService.theme.palette.getAccent()
392
+ };
393
+ }
394
+ if (isGroupMemberMessage) {
395
+ return {
396
+ textFont: fontHelper(this.themeService.theme.typography.subtitle2),
397
+ textColor: this.themeService.theme.palette.getAccent600()
398
+ };
399
+ }
400
+ return {
401
+ textFont: fontHelper(this.themeService.theme.typography.text2),
402
+ textColor: this.themeService.theme.palette.getAccent400()
403
+ };
404
+ };
405
+ this.startDirectCall = (sessionId) => {
406
+ this.sessionId = sessionId;
407
+ this.showOngoingCall = true;
408
+ this.ref.detectChanges();
409
+ };
410
+ this.launchCollaborativeWhiteboardDocument = (url) => {
411
+ window.open(url, "", "fullscreen=yes, scrollbars=auto");
412
+ };
413
+ this.openConfirmDialog = false;
414
+ this.openFullscreenView = false;
415
+ this.imageurlToOpen = "";
416
+ this.fullScreenViewerStyle = {
417
+ height: "100%",
418
+ width: "100%",
419
+ closeIconTint: "blue"
420
+ };
421
+ this.onConfirmClick = () => {
422
+ this.openConfirmDialog = false;
423
+ if (this.closeImageModeration) {
424
+ this.closeImageModeration();
425
+ }
426
+ this.ref.detectChanges();
427
+ };
428
+ this.setOngoingCallStyle = () => {
429
+ let defaultStyle = new CallscreenStyle({
430
+ maxHeight: "100%",
431
+ maxWidth: "100%",
432
+ border: "none",
433
+ borderRadius: "0",
434
+ background: "#1c2226",
435
+ minHeight: "400px",
436
+ minWidth: "400px",
437
+ minimizeIconTint: this.themeService.theme.palette.getAccent900(),
438
+ maximizeIconTint: this.themeService.theme.palette.getAccent900(),
439
+ });
440
+ this.ongoingCallStyle = { ...defaultStyle, ...this.ongoingCallStyle };
441
+ };
442
+ /**
443
+ * Listener To Receive Messages in Real Time
444
+ * @param
445
+ */
446
+ this.fetchPreviousMessages = () => {
447
+ if (this.reinitialized) {
448
+ if (this.messagesRequestBuilder) {
449
+ this.requestBuilder = this.messagesRequestBuilder.setMessageId(this.messagesList[0].getId()).build();
450
+ }
451
+ else {
452
+ if (this.user) {
453
+ this.requestBuilder = new CometChat.MessagesRequestBuilder().setUID(this.user.getUid())
454
+ .setLimit(this.limit)
455
+ .setTypes(this.types)
456
+ .setMessageId(this.messagesList[0].getId())
457
+ .setCategories(this.categories)
458
+ .hideReplies(true)
459
+ .build();
460
+ }
461
+ else {
462
+ this.requestBuilder = new CometChat.MessagesRequestBuilder().setGUID(this.group.getGuid())
463
+ .setLimit(this.limit)
464
+ .setTypes(this.types)
465
+ .setMessageId(this.messagesList[0].getId())
466
+ .setCategories(this.categories)
467
+ .hideReplies(true)
468
+ .build();
469
+ }
470
+ }
471
+ }
472
+ this.requestBuilder.fetchPrevious().then((messageList) => {
473
+ console.log(messageList);
474
+ this.state = States.loading;
475
+ // No Messages Found
476
+ if (messageList.length === 0 && this.messagesList.length === 0) {
477
+ this.state = States.empty;
478
+ this.ref.detectChanges();
479
+ return;
480
+ }
481
+ if (messageList && messageList.length > 0) {
482
+ let lastMessage = messageList[messageList.length - 1];
483
+ if (lastMessage?.getSender().getUid() != this.loggedInUser?.getUid() && !lastMessage.getDeliveredAt()) {
484
+ //mark the message as delivered
485
+ if (!this.disableReceipt) {
486
+ CometChat.markAsDelivered(lastMessage).then((receipt) => {
487
+ let messageKey = this.messagesList.findIndex((m) => m.getId() === Number(receipt?.getMessageId()));
488
+ if (messageKey > -1) {
489
+ this.markAllMessagAsDelivered(messageKey);
490
+ }
491
+ });
492
+ }
493
+ }
494
+ if (!lastMessage?.getReadAt()) {
495
+ if (!this.disableReceipt) {
496
+ CometChat.markAsRead(lastMessage).then((receipt) => {
497
+ let messageKey = this.messagesList.findIndex((m) => m.getId() === Number(receipt?.getMessageId()));
498
+ if (messageKey > -1) {
499
+ this.markAllMessagAsRead(messageKey);
500
+ }
501
+ }).catch((error) => {
502
+ if (this.onError) {
503
+ this.onError(error);
504
+ }
505
+ });
506
+ }
507
+ else {
508
+ this.UnreadCount = [];
509
+ this.ref.detectChanges();
510
+ }
511
+ }
512
+ this.state = States.loaded;
513
+ this.ref.detectChanges();
514
+ //if the sender of the message is not the loggedin user, mark it as read.
515
+ let prevScrollHeight = this.listScroll.nativeElement.scrollHeight;
516
+ setTimeout(() => {
517
+ this.listScroll.nativeElement.scrollTop =
518
+ this.listScroll.nativeElement.scrollHeight - prevScrollHeight;
519
+ });
520
+ this.showSmartReply = false;
521
+ this.smartReplyMessage = null;
522
+ this.prependMessages(messageList);
523
+ }
524
+ else {
525
+ this.state = States.loaded;
526
+ }
527
+ this.ref.detectChanges();
528
+ }, (error) => {
529
+ this.state = States.error;
530
+ if (this.onError) {
531
+ this.onError(error);
532
+ }
533
+ this.ref.detectChanges();
534
+ }).catch((error) => {
535
+ console.log(error);
536
+ this.state = States.error;
537
+ this.ref.detectChanges();
538
+ });
539
+ };
540
+ this.fetchNextMessage = () => {
541
+ let index = this.messagesList.length - 1;
542
+ if (this.reinitialized) {
543
+ if (this.messagesRequestBuilder) {
544
+ this.requestBuilder = this.messagesRequestBuilder.setMessageId(this.messagesList[index].getId()).build();
545
+ }
546
+ else {
547
+ if (this.user) {
548
+ this.requestBuilder = new CometChat.MessagesRequestBuilder().setUID(this.user.getUid())
549
+ .setLimit(this.limit)
550
+ .setTypes(this.types)
551
+ .setMessageId(this.messagesList[index].getId())
552
+ .setCategories(this.categories)
553
+ .hideReplies(true)
554
+ .build();
555
+ }
556
+ else {
557
+ this.requestBuilder = new CometChat.MessagesRequestBuilder().setGUID(this.group.getGuid())
558
+ .setLimit(this.limit)
559
+ .setTypes(this.types)
560
+ .setMessageId(this.messagesList[index].getId())
561
+ .setCategories(this.categories)
562
+ .hideReplies(true)
563
+ .build();
564
+ }
565
+ }
566
+ this.requestBuilder.fetchNext().then((messageList) => {
567
+ this.state = States.loading;
568
+ // No Messages Found
569
+ if (messageList.length === 0 && this.messagesList.length === 0) {
570
+ this.state = States.empty;
571
+ this.ref.detectChanges();
572
+ return;
573
+ }
574
+ if (messageList && messageList.length) {
575
+ let lastMessage = messageList[messageList.length - 1];
576
+ if (!lastMessage?.getReadAt() && lastMessage?.getSender().getUid() != this.loggedInUser?.getUid()) {
577
+ if (!this.disableReceipt) {
578
+ CometChat.markAsRead(lastMessage);
579
+ }
580
+ else {
581
+ this.UnreadCount = [];
582
+ this.ref.detectChanges();
583
+ }
584
+ }
585
+ if (!lastMessage?.getDeliveredAt() && lastMessage?.getSender().getUid() != this.loggedInUser?.getUid()) {
586
+ this.markMessageAsDelivered(lastMessage);
587
+ this.markAllMessagAsDelivered(messageList.length - 1);
588
+ }
589
+ this.state = States.loaded;
590
+ let prevScrollHeight = this.listScroll.nativeElement.scrollHeight;
591
+ setTimeout(() => {
592
+ this.listScroll.nativeElement.scrollTop =
593
+ this.listScroll.nativeElement.scrollHeight - prevScrollHeight;
594
+ });
595
+ this.appendMessages(messageList);
596
+ this.ref.detectChanges();
597
+ }
598
+ }, (error) => {
599
+ this.state = States.error;
600
+ console.log(error);
601
+ if (this.onError) {
602
+ this.onError(error);
603
+ }
604
+ this.ref.detectChanges();
605
+ }).catch((error) => {
606
+ console.log(error);
607
+ this.state = States.error;
608
+ this.ref.detectChanges();
609
+ });
610
+ }
611
+ };
612
+ this.appendMessages = (messages) => {
613
+ this.messagesList.push(...messages);
614
+ this.messageCount = this.messagesList.length;
615
+ if (this.messageCount > this.thresholdValue) {
616
+ this.keepRecentMessages = true;
617
+ this.reInitializeMessageBuilder();
618
+ }
619
+ this.state = States.loaded;
620
+ this.ref.detectChanges();
621
+ };
622
+ /**
623
+ * translate message then call update message
624
+ * @param {CometChat.BaseMessage} message
625
+ */
626
+ // translateMessage(message: CometChat.BaseMessage) {
627
+ // }
628
+ /**
629
+ * @param {CometChat.BaseMessage} message
630
+ */
631
+ this.markMessageAsDelivered = (message) => {
632
+ if (!this.disableReceipt && message?.getSender().getUid() !== this.loggedInUser?.getUid() && message.hasOwnProperty("deliveredAt") === false) {
633
+ CometChat.markAsDelivered(message);
634
+ }
635
+ };
636
+ /**
637
+ * @param {CometChat.BaseMessage} message
638
+ * @param {string} type
639
+ */
640
+ this.messageReceivedHandler = (message, type) => {
641
+ ++this.messageCount;
642
+ if (message.getParentMessageId()) {
643
+ this.updateReplyCount(message);
644
+ this.addMessage(message);
645
+ }
646
+ else {
647
+ if (this.messageCount > this.thresholdValue) {
648
+ this.keepRecentMessages = true;
649
+ this.reInitializeMessageBuilder();
650
+ }
651
+ this.addMessage(message);
652
+ if (!this.isOnBottom) {
653
+ if (this.scrollToBottomOnNewMessages) {
654
+ setTimeout(() => {
655
+ this.scrollToBottom();
656
+ }, 100);
657
+ }
658
+ else {
659
+ let countText = localize("NEW_MESSAGES");
660
+ if (this.newMessageIndicatorText && this.newMessageIndicatorText != "") {
661
+ countText = this.newMessageIndicatorText;
662
+ }
663
+ else {
664
+ countText = this.UnreadCount.length > 0 ? localize("NEW_MESSAGES") : localize("NEW_MESSAGE");
665
+ }
666
+ this.UnreadCount.push(message);
667
+ this.newMessageCount = " ↓ " + this.UnreadCount.length + " " + countText;
668
+ this.ref.detectChanges();
669
+ }
670
+ }
671
+ }
672
+ this.playAudio();
673
+ //handling dom lag - increment count only for main message list
674
+ if (message.hasOwnProperty("parentMessageId") === false && this.parentMessageId) {
675
+ ++this.messageCount;
676
+ this.ref.detectChanges();
677
+ }
678
+ else if (message.hasOwnProperty("parentMessageId") === true && this.parentMessageId) {
679
+ if (message.getParentMessageId() === this.parentMessageId && this.isOnBottom) {
680
+ if (!this.disableReceipt) {
681
+ CometChat.markAsRead(message).then(() => {
682
+ CometChatMessageEvents.ccMessageRead.next(message);
683
+ });
684
+ }
685
+ else {
686
+ this.UnreadCount = [];
687
+ this.ref.detectChanges();
688
+ }
689
+ this.ref.detectChanges();
690
+ }
691
+ }
692
+ else {
693
+ }
694
+ };
695
+ this.reInitializeMessageBuilder = () => {
696
+ if (!this.parentMessageId) {
697
+ this.messageCount = 0;
698
+ }
699
+ this.requestBuilder = null;
700
+ CometChat.removeMessageListener(this.msgListenerId);
701
+ CometChat.removeGroupListener(this.groupListenerId);
702
+ CometChat.removeCallListener(this.callListenerId);
703
+ this.reInitializeMessageList();
704
+ };
705
+ /**
706
+ * Emits an Action Indicating that a message was deleted by the user/person you are chatting with
707
+ * @param {CometChat.BaseMessage} message
708
+ */
709
+ /**
710
+ * Detects if the message that was edit is your current open conversation window
711
+ * @param {CometChat.BaseMessage} message
712
+ */
713
+ this.messageEdited = (message) => {
714
+ try {
715
+ if (this.group &&
716
+ message.getReceiverType() === CometChatUIKitConstants.MessageReceiverType.group &&
717
+ message.getReceiverId() === this.group?.getGuid()) {
718
+ this.updateEditedMessage(message);
719
+ }
720
+ else if (this.user &&
721
+ message.getReceiverType() === CometChatUIKitConstants.MessageReceiverType.user &&
722
+ this.loggedInUser?.getUid() === message.getReceiverId() &&
723
+ message?.getSender().getUid() === this.user?.getUid()) {
724
+ this.updateEditedMessage(message);
725
+ }
726
+ else if (this.user &&
727
+ message.getReceiverType() === CometChatUIKitConstants.MessageReceiverType.user &&
728
+ this.loggedInUser?.getUid() === message?.getSender().getUid() &&
729
+ message.getReceiverId() === this.user?.getUid()) {
730
+ this.updateEditedMessage(message);
731
+ }
732
+ }
733
+ catch (error) {
734
+ if (this.onError) {
735
+ this.onError(error);
736
+ }
737
+ }
738
+ this.ref.detectChanges();
739
+ };
740
+ /**
741
+ * Emits an Action Indicating that a message was deleted by the user/person you are chatting with
742
+ * @param {CometChat.BaseMessage} message
743
+ */
744
+ this.updateEditedMessage = (message) => {
745
+ const messageList = this.messagesList;
746
+ const messageKey = messageList.findIndex(m => m.getId() === message.getId());
747
+ if (messageKey > -1) {
748
+ this.messagesList = [
749
+ ...messageList.slice(0, messageKey),
750
+ message,
751
+ ...messageList.slice(messageKey + 1)
752
+ ];
753
+ }
754
+ this.ref.detectChanges();
755
+ };
756
+ /**
757
+ * @param {CometChat.BaseMessage} message
758
+ * @param {string} type
759
+ */
760
+ this.customMessageReceivedHandler = (message, type) => {
761
+ ++this.messageCount;
762
+ // add received message to messages list
763
+ if (message.getParentMessageId()) {
764
+ this.updateReplyCount(message);
765
+ this.addMessage(message);
766
+ }
767
+ else {
768
+ if (this.messageCount > this.thresholdValue) {
769
+ this.keepRecentMessages = true;
770
+ this.reInitializeMessageBuilder();
771
+ }
772
+ this.addMessage(message);
773
+ if (!this.isOnBottom) {
774
+ if (this.scrollToBottomOnNewMessages) {
775
+ setTimeout(() => {
776
+ this.scrollToBottom();
777
+ }, 100);
778
+ }
779
+ else {
780
+ let countText = localize("NEW_MESSAGES");
781
+ if (this.newMessageIndicatorText && this.newMessageIndicatorText != "") {
782
+ countText = this.newMessageIndicatorText;
783
+ }
784
+ else {
785
+ countText = this.UnreadCount.length > 0 ? localize("NEW_MESSAGES") : localize("NEW_MESSAGE");
786
+ }
787
+ this.UnreadCount.push(message);
788
+ this.newMessageCount = " ↓ " + this.UnreadCount.length + " " + countText;
789
+ this.ref.detectChanges();
790
+ }
791
+ }
792
+ }
793
+ this.playAudio();
794
+ //handling dom lag - increment count only for main message list
795
+ if (message.hasOwnProperty("parentMessageId") === false && !this.parentMessageId) {
796
+ ++this.messageCount;
797
+ //if the user has not scrolled in chat window(scroll is at the bottom of the chat window)
798
+ }
799
+ else if (message.hasOwnProperty("parentMessageId") === true && this.parentMessageId && this.isOnBottom) {
800
+ if (message.getParentMessageId() === this.parentMessageId) {
801
+ if (!this.disableReceipt) {
802
+ CometChat.markAsRead(message).then(() => {
803
+ CometChatMessageEvents.ccMessageRead.next(message);
804
+ });
805
+ }
806
+ else {
807
+ this.UnreadCount = [];
808
+ this.ref.detectChanges();
809
+ }
810
+ }
811
+ }
812
+ else {
813
+ }
814
+ this.ref.detectChanges();
815
+ };
816
+ // public methods
817
+ this.addMessage = (message) => {
818
+ if (!message?.getParentMessageId() || this.parentMessageId) {
819
+ this.messagesList.push(message);
820
+ if (!message?.getSender() || this.loggedInUser?.getUid() == message?.getSender()?.getUid() || this.isOnBottom) {
821
+ this.scrollToBottom();
822
+ this.ref.detectChanges();
823
+ }
824
+ }
825
+ if (this.state != States.loaded) {
826
+ this.state = States.loaded;
827
+ this.ref.detectChanges();
828
+ }
829
+ this.ref.detectChanges();
830
+ };
831
+ /**
832
+ * callback for copy message
833
+ * @param {CometChat.TextMessage} object
834
+ */
835
+ this.onCopyMessage = (object) => {
836
+ navigator.clipboard.writeText(object.getText());
837
+ };
838
+ /**
839
+ * callback for editMessage option
840
+ * @param {CometChat.BaseMessage} object
841
+ */
842
+ this.onEditMessage = (object) => {
843
+ CometChatMessageEvents.ccMessageEdited.next({ message: object, status: MessageStatus.inprogress });
844
+ };
845
+ this.removeMessage = (message) => {
846
+ try {
847
+ const messageKey = this.messagesList.findIndex(msg => msg?.getId() === message.getId());
848
+ if (messageKey > -1) {
849
+ this.messagesList.splice(messageKey, 1, message);
850
+ this.messagesList = [...this.messagesList];
851
+ this.ref.detectChanges();
852
+ }
853
+ }
854
+ catch (error) {
855
+ if (this.onError) {
856
+ this.onError(error);
857
+ }
858
+ }
859
+ };
860
+ this.deleteMessage = (message) => {
861
+ try {
862
+ const messageId = message.getId();
863
+ CometChat.deleteMessage(messageId)
864
+ .then((deletedMessage) => {
865
+ CometChatMessageEvents.ccMessageDeleted.next(deletedMessage);
866
+ // this.ref.detectChanges()
867
+ })
868
+ .catch((error) => {
869
+ if (this.onError) {
870
+ this.onError(error);
871
+ }
872
+ });
873
+ }
874
+ catch (error) {
875
+ if (this.onError) {
876
+ this.onError(error);
877
+ }
878
+ }
879
+ };
880
+ this.scrollToBottom = () => {
881
+ try {
882
+ setTimeout(() => {
883
+ this.listScroll.nativeElement.scroll({
884
+ top: this.listScroll.nativeElement.scrollHeight,
885
+ left: 0,
886
+ });
887
+ this.isOnBottom = true;
888
+ this.ref.detectChanges();
889
+ }, 10);
890
+ }
891
+ catch (error) {
892
+ if (this.onError) {
893
+ this.onError(error);
894
+ }
895
+ }
896
+ };
897
+ this.closeSmartReply = () => {
898
+ this.showSmartReply = false;
899
+ this.smartReplyMessage = null;
900
+ this.ref.detectChanges();
901
+ };
902
+ this.sendReply = (event) => {
903
+ let reply = event?.detail?.reply;
904
+ if (this.smartReplyConfig.ccSmartRepliesClicked) {
905
+ this.smartReplyConfig.ccSmartRepliesClicked(reply, this.smartReplyMessage, this.onError, this.customSoundForMessages, this.disableSoundForMessages);
906
+ this.closeSmartReply();
907
+ }
908
+ };
909
+ /**
910
+ * styling part
911
+ */
912
+ this.chatsListStyle = () => {
913
+ return {
914
+ height: this.messageListStyle.height,
915
+ background: this.messageListStyle.background,
916
+ };
917
+ };
918
+ this.messageContainerStyle = () => {
919
+ return {
920
+ width: this.messageListStyle.width,
921
+ };
922
+ };
923
+ this.errorStyle = () => {
924
+ return {
925
+ textFont: this.messageListStyle.errorStateTextFont,
926
+ textColor: this.messageListStyle.errorStateTextColor,
927
+ };
928
+ };
929
+ this.emptyStyle = () => {
930
+ return {
931
+ textFont: this.messageListStyle.emptyStateTextFont,
932
+ textColor: this.messageListStyle.emptyStateTextColor,
933
+ };
934
+ };
935
+ this.loadingStyle = () => {
936
+ return {
937
+ iconTint: this.messageListStyle.loadingIconTint,
938
+ };
939
+ };
940
+ this.wrapperStyle = () => {
941
+ return {
942
+ height: this.messageListStyle.height,
943
+ width: this.messageListStyle.width,
944
+ background: this.messageListStyle.background,
945
+ border: this.messageListStyle.border,
946
+ borderRadius: this.messageListStyle.borderRadius
947
+ };
948
+ };
949
+ }
950
+ getThreadViewStyle(message) {
951
+ if ((!message.getSender() || message.getSender().getUid() === this.loggedInUser?.getUid()) && message?.getType() == CometChatUIKitConstants.MessageTypes.text) {
952
+ return {
953
+ height: "30px",
954
+ width: "100%",
955
+ border: "none",
956
+ borderRadius: "0",
957
+ background: "transparent",
958
+ padding: "0 8px",
959
+ buttonIconTint: this.themeService.theme.palette.getAccent600(),
960
+ display: "flex",
961
+ flexFlow: "row-reverse",
962
+ alignItems: "center",
963
+ justifyContent: "space-between",
964
+ buttonTextColor: this.themeService.theme.palette.getAccent("dark")
965
+ };
966
+ }
967
+ else {
968
+ return {
969
+ height: "30px",
970
+ width: "100%",
971
+ border: "none",
972
+ borderRadius: "0",
973
+ background: "transparent",
974
+ padding: "0 8px",
975
+ buttonIconTint: "grey",
976
+ display: "flex",
977
+ flexFlow: "row-reverse",
978
+ alignItems: "center",
979
+ justifyContent: "space-between",
980
+ buttonTextColor: this.themeService.theme.palette.getPrimary()
981
+ };
982
+ }
983
+ }
984
+ ngOnChanges(changes) {
985
+ console.log(this.templates);
986
+ try {
987
+ if (changes[CometChatUIKitConstants.MessageReceiverType.user] || changes[CometChatUIKitConstants.MessageReceiverType.group]) {
988
+ this.showEnabledExtensions();
989
+ this.numberOfTopScroll = 0;
990
+ if (!this.loggedInUser) {
991
+ CometChat.getLoggedinUser().then((user) => {
992
+ this.loggedInUser = user;
993
+ });
994
+ }
995
+ this.messagesList = [];
996
+ if (this.user) {
997
+ if (Object.keys(this.user).length > 1) {
998
+ this.user = this.user;
999
+ this.type = CometChatUIKitConstants.MessageReceiverType.user;
1000
+ this.createRequestBuilder();
1001
+ }
1002
+ else {
1003
+ CometChat.getUser(this.user)
1004
+ .then((user) => {
1005
+ this.user = user;
1006
+ this.type = CometChatUIKitConstants.MessageReceiverType.user;
1007
+ this.createRequestBuilder();
1008
+ });
1009
+ }
1010
+ }
1011
+ else if (this.group) {
1012
+ if (Object.keys(this.group).length > 1) {
1013
+ this.group = this.group;
1014
+ this.type = CometChatUIKitConstants.MessageReceiverType.group;
1015
+ this.createRequestBuilder();
1016
+ }
1017
+ else {
1018
+ CometChat.getGroup(this.group)
1019
+ .then((group) => {
1020
+ this.group = group;
1021
+ this.type = CometChatUIKitConstants.MessageReceiverType.group;
1022
+ this.createRequestBuilder();
1023
+ });
1024
+ }
1025
+ }
1026
+ //Removing Previous Conversation Listeners
1027
+ CometChat.removeMessageListener(this.msgListenerId);
1028
+ CometChat.removeGroupListener(this.groupListenerId);
1029
+ CometChat.removeCallListener(this.callListenerId);
1030
+ this.msgListenerId = "message_" + new Date().getTime();
1031
+ this.groupListenerId = "group_" + new Date().getTime();
1032
+ this.callListenerId = "call_" + new Date().getTime();
1033
+ // Attach MessageListeners for the new conversation
1034
+ this.addMessageEventListeners();
1035
+ }
1036
+ }
1037
+ catch (error) {
1038
+ if (this.onError) {
1039
+ this.onError(error);
1040
+ }
1041
+ }
1042
+ }
1043
+ getCallBubbleTitle(message) {
1044
+ if (!message.getSender() || message.getSender().getUid() == this.loggedInUser.getUid()) {
1045
+ return localize("YOU_INITIATED_GROUP_CALL");
1046
+ }
1047
+ else {
1048
+ return `${message.getSender().getName()} ${localize("INITIATED_GROUP_CALL")}`;
1049
+ }
1050
+ }
1051
+ reactToMessages(emoji) {
1052
+ let removeEmoji = false;
1053
+ let reactionObject = {};
1054
+ let newMessageObject;
1055
+ let msgObject = this.messageToReact;
1056
+ const userObject = {};
1057
+ if (this.loggedInUser?.getAvatar()) {
1058
+ userObject["avatar"] = this.loggedInUser?.getAvatar();
1059
+ }
1060
+ if (this.loggedInUser?.getName()) {
1061
+ userObject["name"] = this.loggedInUser?.getName();
1062
+ }
1063
+ let uid = this.loggedInUser?.getUid();
1064
+ const emojiObject = {
1065
+ [emoji]: {
1066
+ [uid]: userObject,
1067
+ },
1068
+ };
1069
+ const reactionExtensionsData = CometChatUIKitUtility.checkMessageForExtensionsData(this.messageToReact, "reactions");
1070
+ if (reactionExtensionsData) {
1071
+ if (reactionExtensionsData[emoji]) {
1072
+ //if the reactions metadata has the selected emoji/reaction for the loggedin user
1073
+ if (reactionExtensionsData[emoji][uid]) {
1074
+ delete reactionExtensionsData[emoji];
1075
+ removeEmoji = true;
1076
+ }
1077
+ else {
1078
+ let data = msgObject["metadata"]["@injected"]["extensions"]["reactions"];
1079
+ data[emoji][uid] = userObject;
1080
+ reactionObject = {
1081
+ ...data,
1082
+ };
1083
+ }
1084
+ }
1085
+ else {
1086
+ if (!msgObject?.hasOwnProperty("metadata")) {
1087
+ msgObject["metadata"] = {};
1088
+ }
1089
+ if (!msgObject["metadata"].hasOwnProperty("@injected")) {
1090
+ msgObject["metadata"]["@injected"] = {};
1091
+ }
1092
+ if (!msgObject["metadata"]["@injected"].hasOwnProperty("extensions")) {
1093
+ msgObject["metadata"]["@injected"]["extensions"] = {};
1094
+ }
1095
+ if (!msgObject["metadata"]["@injected"]["extensions"].hasOwnProperty("reactions")) {
1096
+ msgObject["metadata"]["@injected"]["extensions"]["reactions"] = {};
1097
+ }
1098
+ let data = msgObject["metadata"]["@injected"]["extensions"]["reactions"];
1099
+ reactionObject = { ...data, ...emojiObject };
1100
+ }
1101
+ }
1102
+ else {
1103
+ if (!msgObject?.hasOwnProperty("metadata")) {
1104
+ msgObject["metadata"] = {};
1105
+ }
1106
+ if (!msgObject["metadata"].hasOwnProperty("@injected")) {
1107
+ msgObject["metadata"]["@injected"] = {};
1108
+ }
1109
+ if (!msgObject["metadata"]["@injected"].hasOwnProperty("extensions")) {
1110
+ msgObject["metadata"]["@injected"]["extensions"] = {};
1111
+ }
1112
+ if (!msgObject["metadata"]["@injected"]["extensions"].hasOwnProperty("reactions")) {
1113
+ msgObject["metadata"]["@injected"]["extensions"]["reactions"] = {};
1114
+ }
1115
+ reactionObject = {
1116
+ ...emojiObject,
1117
+ };
1118
+ }
1119
+ var metadataObject;
1120
+ if (removeEmoji) {
1121
+ metadataObject = {
1122
+ ...msgObject["metadata"],
1123
+ };
1124
+ }
1125
+ else {
1126
+ metadataObject = {
1127
+ ...msgObject["metadata"],
1128
+ "@injected": {
1129
+ ...msgObject["metadata"]["@injected"],
1130
+ extensions: {
1131
+ ...msgObject["metadata"]["@injected"]["extensions"],
1132
+ reactions: {
1133
+ ...reactionObject,
1134
+ },
1135
+ },
1136
+ },
1137
+ };
1138
+ }
1139
+ newMessageObject = this.messageToReact;
1140
+ newMessageObject.setMetadata(metadataObject);
1141
+ this.updateMessage(newMessageObject);
1142
+ try {
1143
+ CometChat.callExtension(ReactionsConstants.reactions, ReactionsConstants.post, ReactionsConstants.v1, {
1144
+ msgId: this.messageToReact?.getId(),
1145
+ emoji: emoji,
1146
+ })
1147
+ .then((response) => {
1148
+ })
1149
+ .catch((error) => {
1150
+ console.log(error);
1151
+ });
1152
+ }
1153
+ catch (error) {
1154
+ console.log(error);
1155
+ }
1156
+ }
1157
+ ngOnDestroy() {
1158
+ this.unsubscribeToEvents();
1159
+ try {
1160
+ //Removing Message Listeners
1161
+ CometChat.removeMessageListener(this.msgListenerId);
1162
+ CometChat.removeGroupListener(this.groupListenerId);
1163
+ CometChat.removeCallListener(this.callListenerId);
1164
+ }
1165
+ catch (error) {
1166
+ if (this.onError) {
1167
+ this.onError(error);
1168
+ }
1169
+ }
1170
+ }
1171
+ reactionsStyle(message) {
1172
+ let sentByMe = !message?.getSender() || message.getSender().getUid() == this.loggedInUser?.getUid();
1173
+ let isLeftAligned = this.alignment == MessageListAlignment.left || !sentByMe || message?.getCategory() != CometChatUIKitConstants.MessageCategory.message;
1174
+ if (isLeftAligned) {
1175
+ return {
1176
+ height: "100%",
1177
+ width: "100%",
1178
+ border: "none",
1179
+ borderRadius: "0",
1180
+ background: "transparent",
1181
+ textFont: fontHelper(this.themeService.theme.typography.subtitle1),
1182
+ textColor: this.themeService.theme.palette.getAccent600(),
1183
+ activeTextColor: this.themeService.theme.palette.getAccent("dark"),
1184
+ activeTextFont: fontHelper(this.themeService.theme.typography.subtitle1),
1185
+ addReactionIconTint: this.themeService.theme.palette.getAccent600(),
1186
+ activeReactionBackground: this.themeService.theme.palette.getPrimary(),
1187
+ reactionBackground: "transparent",
1188
+ reactionBorder: `1px solid ${this.themeService.theme.palette.getAccent100()}`,
1189
+ reactionBorderRadius: "12px",
1190
+ addReactionIconBackground: this.themeService.theme.palette.getAccent100()
1191
+ };
1192
+ }
1193
+ else {
1194
+ return {
1195
+ height: "100%",
1196
+ width: "100%",
1197
+ border: "none",
1198
+ borderRadius: "0",
1199
+ background: "transparent",
1200
+ textFont: fontHelper(this.themeService.theme.typography.caption1),
1201
+ textColor: this.themeService.theme.palette.getAccent("dark"),
1202
+ activeTextColor: this.themeService.theme.palette.getPrimary(),
1203
+ activeTextFont: fontHelper(this.themeService.theme.typography.caption1),
1204
+ addReactionIconTint: this.themeService.theme.palette.getAccent("dark"),
1205
+ activeReactionBackground: this.themeService.theme.palette.getAccent("dark"),
1206
+ reactionBackground: "transparent",
1207
+ reactionBorder: `1px solid ${this.themeService.theme.palette.getAccent100()}`,
1208
+ reactionBorderRadius: "12px",
1209
+ addReactionIconBackground: this.themeService.theme.palette.getAccent100("light")
1210
+ };
1211
+ }
1212
+ }
1213
+ getMessageById(id) {
1214
+ let messageKey = this.messagesList.findIndex((m) => m.getId() === id);
1215
+ if (messageKey > -1) {
1216
+ return this.messagesList[messageKey];
1217
+ }
1218
+ else {
1219
+ return false;
1220
+ }
1221
+ }
1222
+ isTranslated(message) {
1223
+ let translatedMessageObject = message;
1224
+ if (translatedMessageObject && translatedMessageObject?.data?.metadata && translatedMessageObject?.data?.metadata[MessageTranslationConstants.translated_message]) {
1225
+ return translatedMessageObject.data.metadata[MessageTranslationConstants.translated_message];
1226
+ }
1227
+ else {
1228
+ return null;
1229
+ }
1230
+ }
1231
+ setOptionsCallback(options) {
1232
+ options?.forEach((element) => {
1233
+ switch (element.id) {
1234
+ case CometChatUIKitConstants.MessageOption.deleteMessage:
1235
+ if (!element.onClick) {
1236
+ element.onClick = this.deleteCallback;
1237
+ }
1238
+ break;
1239
+ case CometChatUIKitConstants.MessageOption.editMessage:
1240
+ if (!element.onClick) {
1241
+ element.onClick = this.editCallback;
1242
+ }
1243
+ break;
1244
+ case CometChatUIKitConstants.MessageOption.translateMessage:
1245
+ if (!element.onClick) {
1246
+ element.onClick = this.translateMessage;
1247
+ }
1248
+ break;
1249
+ case CometChatUIKitConstants.MessageOption.copyMessage:
1250
+ if (!element.onClick) {
1251
+ element.onClick = this.copyCallback;
1252
+ }
1253
+ break;
1254
+ case CometChatUIKitConstants.MessageOption.reactToMessage:
1255
+ if (!element.onClick) {
1256
+ element.onClick = this.showEmojiKeyboard;
1257
+ }
1258
+ break;
1259
+ case CometChatUIKitConstants.MessageOption.replyInThread:
1260
+ if (!element.onClick) {
1261
+ element.onClick = this.threadCallback;
1262
+ }
1263
+ break;
1264
+ default:
1265
+ break;
1266
+ }
1267
+ });
1268
+ return options;
1269
+ }
1270
+ /**
1271
+ * send message options based on type
1272
+ * @param {CometChat.BaseMessage} msgObject
1273
+ */
1274
+ setMessageOptions(msgObject) {
1275
+ let options;
1276
+ if (this.messageTemplate && this.messageTemplate.length > 0 && !msgObject?.getDeletedAt() && msgObject?.getType() != CometChatUIKitConstants.MessageTypes.groupMember) {
1277
+ this.messageTemplate.forEach((element) => {
1278
+ if (msgObject?.getId() && element.type == msgObject?.getType() && element?.options) {
1279
+ options = this.setOptionsCallback(element?.options(this.loggedInUser, msgObject, this.themeService.theme, this.group)) || [];
1280
+ }
1281
+ });
1282
+ }
1283
+ else {
1284
+ options = [];
1285
+ }
1286
+ return options;
1287
+ }
1288
+ /**
1289
+ * passing style based on message object
1290
+ * @param {CometChat.BaseMessage} messageObject
1291
+ */
1292
+ setMessageBubbleStyle(msg) {
1293
+ let style;
1294
+ if (msg?.getDeletedAt()) {
1295
+ style = {
1296
+ background: "transparent",
1297
+ border: `1px dashed ${this.themeService.theme.palette.getAccent400()}`,
1298
+ borderRadius: "12px",
1299
+ };
1300
+ }
1301
+ else if (msg?.getType() == CometChatUIKitConstants.calls.meeting && (!msg?.getSender() || msg?.getSender().getUid() == this.loggedInUser.getUid())) {
1302
+ style = {
1303
+ background: this.themeService.theme.palette.getPrimary(),
1304
+ border: `none`,
1305
+ borderRadius: "12px",
1306
+ };
1307
+ }
1308
+ else if (this.getLinkPreview(msg)) {
1309
+ style = {
1310
+ borderRadius: "8px",
1311
+ background: this.themeService.theme.palette.getAccent100(),
1312
+ };
1313
+ }
1314
+ else if (msg?.getType() == StickersConstants.sticker) {
1315
+ style = {
1316
+ background: "transparent",
1317
+ borderRadius: "12px",
1318
+ };
1319
+ }
1320
+ else if (!msg?.getDeletedAt() && msg?.getCategory() == CometChatUIKitConstants.MessageCategory.message && msg?.getType() == CometChatUIKitConstants.MessageTypes.text && (!msg?.getSender() || this.loggedInUser.getUid() == msg?.getSender().getUid())) {
1321
+ style = {
1322
+ background: this.alignment == MessageListAlignment.left ? this.themeService.theme.palette.getAccent100() : this.themeService.theme.palette.getPrimary(),
1323
+ borderRadius: "12px",
1324
+ };
1325
+ }
1326
+ else if (!msg?.getDeletedAt() && msg?.getCategory() == CometChatUIKitConstants.MessageCategory.message && msg?.getType() == CometChatUIKitConstants.MessageTypes.audio) {
1327
+ style = {
1328
+ borderRadius: "",
1329
+ background: this.themeService.theme.palette.getAccent100(),
1330
+ };
1331
+ }
1332
+ else if (msg?.getType() == CometChatUIKitConstants.MessageTypes.groupMember || msg?.getCategory() == this.callConstant) {
1333
+ style = {
1334
+ background: "transparent",
1335
+ borderRadius: "12px",
1336
+ border: `1px solid ${this.themeService.theme.palette.getAccent100()}`
1337
+ };
1338
+ }
1339
+ else {
1340
+ if (msg?.getSender() && msg?.getSender().getUid() != this.loggedInUser.getUid()) {
1341
+ style = {
1342
+ background: this.themeService.theme.palette.getAccent100(),
1343
+ borderRadius: "12px",
1344
+ };
1345
+ }
1346
+ else {
1347
+ style = {
1348
+ background: this.themeService.theme.palette.getAccent100(),
1349
+ borderRadius: "12px",
1350
+ };
1351
+ }
1352
+ }
1353
+ return style;
1354
+ }
1355
+ getSessionId(message) {
1356
+ let data = message.getData();
1357
+ return data?.customData?.sessionID;
1358
+ }
1359
+ getWhiteboardDocument(message) {
1360
+ try {
1361
+ if (message?.getData()) {
1362
+ const data = message.getData();
1363
+ if (data?.metadata) {
1364
+ const metadata = data?.metadata;
1365
+ if (CometChatUIKitUtility.checkHasOwnProperty(metadata, "@injected")) {
1366
+ const injectedObject = metadata["@injected"];
1367
+ if (injectedObject?.extensions) {
1368
+ const extensionObject = injectedObject.extensions;
1369
+ return extensionObject[CollaborativeWhiteboardConstants.whiteboard] ? extensionObject[CollaborativeWhiteboardConstants.whiteboard].board_url : extensionObject[CollaborativeDocumentConstants.document].document_url;
1370
+ }
1371
+ }
1372
+ }
1373
+ }
1374
+ }
1375
+ catch (error) {
1376
+ if (this.onError) {
1377
+ this.onError(error);
1378
+ }
1379
+ }
1380
+ }
1381
+ openLinkURL(event) {
1382
+ window.open(event?.detail?.url, '_blank');
1383
+ }
1384
+ getSticker(message) {
1385
+ try {
1386
+ let stickerData = null;
1387
+ if (CometChatUIKitUtility.checkHasOwnProperty(message, StickersConstants.data) &&
1388
+ CometChatUIKitUtility.checkHasOwnProperty(message.getData(), StickersConstants.custom_data)) {
1389
+ stickerData = message.data.customData;
1390
+ if (CometChatUIKitUtility.checkHasOwnProperty(stickerData, StickersConstants.sticker_url)) {
1391
+ return stickerData.sticker_url;
1392
+ }
1393
+ else {
1394
+ return "";
1395
+ }
1396
+ }
1397
+ else {
1398
+ return "";
1399
+ }
1400
+ }
1401
+ catch (error) {
1402
+ if (this.onError) {
1403
+ this.onError(error);
1404
+ }
1405
+ }
1406
+ }
1407
+ getHeaderView(message) {
1408
+ let view = null;
1409
+ if (this.messageTypesMap[message?.getType()] && this.messageTypesMap[message?.getType()]?.headerView) {
1410
+ view = this.messageTypesMap[message?.getType()]?.headerView(message);
1411
+ return view;
1412
+ }
1413
+ else {
1414
+ return null;
1415
+ }
1416
+ }
1417
+ getFooterView(message) {
1418
+ let view = null;
1419
+ if (this.messageTypesMap[message?.getType()] && this.messageTypesMap[message?.getType()]?.footerView) {
1420
+ view = this.messageTypesMap[message?.getType()]?.footerView(message);
1421
+ return view;
1422
+ }
1423
+ else {
1424
+ return null;
1425
+ }
1426
+ }
1427
+ getCallBubbleStyle(message) {
1428
+ const isLeftAligned = this.alignment == MessageListAlignment.left;
1429
+ const isUserSentMessage = !message?.getSender() || this.loggedInUser.getUid() === message?.getSender().getUid();
1430
+ if (isUserSentMessage && !isLeftAligned) {
1431
+ return {
1432
+ titleFont: fontHelper(this.themeService.theme.typography.text2),
1433
+ titleColor: this.themeService.theme.palette.getAccent("dark"),
1434
+ iconTint: this.themeService.theme.palette.getAccent("dark"),
1435
+ buttonTextFont: fontHelper(this.themeService.theme.typography.text2),
1436
+ buttonTextColor: this.themeService.theme.palette.getPrimary(),
1437
+ buttonBackground: this.themeService.theme.palette.getAccent("dark"),
1438
+ width: "240px"
1439
+ };
1440
+ }
1441
+ else {
1442
+ return {
1443
+ titleFont: fontHelper(this.themeService.theme.typography.text2),
1444
+ titleColor: this.themeService.theme.palette.getAccent(),
1445
+ iconTint: this.themeService.theme.palette.getPrimary(),
1446
+ buttonTextFont: fontHelper(this.themeService.theme.typography.text2),
1447
+ buttonTextColor: this.themeService.theme.palette.getPrimary(),
1448
+ buttonBackground: this.themeService.theme.palette.getAccent("dark"),
1449
+ width: "240px"
1450
+ };
1451
+ }
1452
+ }
1453
+ getBubbleAlignment(message) {
1454
+ return this.alignment == MessageListAlignment.left || (message.getSender() && message.getSender().getUid() != this.loggedInUser.getUid()) ? MessageBubbleAlignment.left : MessageBubbleAlignment.right;
1455
+ }
1456
+ getCallTypeIcon(message) {
1457
+ if (message.getType() == CometChatUIKitConstants.MessageTypes.audio) {
1458
+ return "assets/Audio-Call.svg";
1459
+ }
1460
+ else {
1461
+ return "assets/Video-call.svg";
1462
+ }
1463
+ }
1464
+ callStatusStyle(message) {
1465
+ if (message.getCategory() == this.callConstant) {
1466
+ return {
1467
+ buttonTextFont: fontHelper(this.themeService.theme.typography.subtitle2),
1468
+ buttonTextColor: CallingDetailsUtils.isMissedCall(message, this.loggedInUser) ? this.themeService.theme.palette.getError() : this.themeService.theme.palette.getAccent600(),
1469
+ borderRadius: "10px",
1470
+ border: CallingDetailsUtils.isMissedCall(message, this.loggedInUser) ? `1px solid RGBA(255, 59, 48, 0.2)` : `1px solid ${this.themeService.theme.palette.getAccent100()}`,
1471
+ buttonIconTint: CallingDetailsUtils.isMissedCall(message, this.loggedInUser) ? this.themeService.theme.palette.getError() : this.themeService.theme.palette.getAccent600(),
1472
+ background: "transparent",
1473
+ iconBackground: "transparent",
1474
+ padding: "2px 12px 2px 0",
1475
+ gap: "0",
1476
+ height: "25px",
1477
+ justifyContent: "center"
1478
+ };
1479
+ }
1480
+ else {
1481
+ return null;
1482
+ }
1483
+ }
1484
+ setFileBubbleStyle(message) {
1485
+ const isFileMessage = message.getCategory() === CometChatUIKitConstants.MessageCategory.message && message?.getType() === CometChatUIKitConstants.MessageTypes.file;
1486
+ if (isFileMessage) {
1487
+ return {
1488
+ titleFont: fontHelper(this.theme.typography.subtitle1),
1489
+ titleColor: this.themeService.theme.palette.getAccent(),
1490
+ subtitleFont: fontHelper(this.theme.typography.subtitle2),
1491
+ subtitleColor: this.themeService.theme.palette.getAccent600(),
1492
+ iconTint: this.themeService.theme.palette.getPrimary(),
1493
+ };
1494
+ }
1495
+ else {
1496
+ return;
1497
+ }
1498
+ }
1499
+ ngAfterViewInit() {
1500
+ this.ioBottom();
1501
+ this.ioTop();
1502
+ this.checkMessageTemplate();
1503
+ }
1504
+ /**
1505
+ * Extracting types and categories from template
1506
+ *
1507
+ */
1508
+ checkMessageTemplate() {
1509
+ this.typesMap = {
1510
+ text: this.textBubble,
1511
+ file: this.fileBubble,
1512
+ audio: this.audioBubble,
1513
+ video: this.videoBubble,
1514
+ image: this.imageBubble,
1515
+ groupMember: this.textBubble,
1516
+ extension_sticker: this.stickerBubble,
1517
+ extension_whiteboard: this.whiteboardBubble,
1518
+ extension_document: this.documentBubble,
1519
+ extension_poll: this.pollBubble,
1520
+ meeting: this.directCalling
1521
+ };
1522
+ this.setBubbleView();
1523
+ }
1524
+ getPollBubbleData(message, type) {
1525
+ let data = message.getCustomData();
1526
+ if (type) {
1527
+ return data[type];
1528
+ }
1529
+ else {
1530
+ return message.getSender().getUid();
1531
+ }
1532
+ }
1533
+ getThreadCount(message) {
1534
+ const replyCount = message?.getReplyCount() || 0;
1535
+ const suffix = replyCount === 1 ? localize("REPLY") : localize("REPLIES");
1536
+ return `${localize("VIEW")} ${replyCount} ${suffix}`;
1537
+ }
1538
+ showEnabledExtensions() {
1539
+ if (ChatConfigurator.names.includes('textmoderator')) {
1540
+ this.enableDataMasking = true;
1541
+ }
1542
+ if (ChatConfigurator.names.includes('thumbnailgeneration')) {
1543
+ this.enableThumbnailGeneration = true;
1544
+ }
1545
+ if (ChatConfigurator.names.includes('linkpreview')) {
1546
+ this.enableLinkPreview = true;
1547
+ }
1548
+ if (ChatConfigurator.names.includes('polls')) {
1549
+ this.enablePolls = true;
1550
+ }
1551
+ if (ChatConfigurator.names.includes('reactions')) {
1552
+ this.enableReactions = true;
1553
+ }
1554
+ if (ChatConfigurator.names.includes('imagemoderation')) {
1555
+ this.enableImageModeration = true;
1556
+ }
1557
+ if (ChatConfigurator.names.includes('stickers')) {
1558
+ this.enableStickers = true;
1559
+ }
1560
+ if (ChatConfigurator.names.includes('collaborativewhiteboard')) {
1561
+ this.enableWhiteboard = true;
1562
+ }
1563
+ if (ChatConfigurator.names.includes('collaborativedocument')) {
1564
+ this.enableDocument = true;
1565
+ }
1566
+ if (ChatConfigurator.names.includes('calling')) {
1567
+ this.enableCalling = true;
1568
+ }
1569
+ }
1570
+ openImageInFullScreen(message) {
1571
+ this.imageurlToOpen = message?.data?.attachments[0]?.url;
1572
+ this.openFullscreenView = true;
1573
+ this.ref.detectChanges();
1574
+ }
1575
+ closeImageInFullScreen() {
1576
+ this.imageurlToOpen = "";
1577
+ this.openFullscreenView = false;
1578
+ this.ref.detectChanges();
1579
+ }
1580
+ openWarningDialog(event) {
1581
+ this.closeImageModeration = event?.detail?.onConfirm;
1582
+ this.openConfirmDialog = true;
1583
+ this.ref.detectChanges();
1584
+ }
1585
+ onCancelClick() {
1586
+ this.openConfirmDialog = false;
1587
+ this.ref.detectChanges();
1588
+ }
1589
+ getTextMessage(message) {
1590
+ const text = this.enableDataMasking ? CometChatUIKitUtility.getExtensionData(message) : null;
1591
+ return text?.trim()?.length > 0 ? text : message.getText();
1592
+ }
1593
+ getLinkPreview(message) {
1594
+ try {
1595
+ if (message?.getMetadata() && this.enableLinkPreview) {
1596
+ const metadata = message.getMetadata();
1597
+ const injectedObject = metadata[LinkPreviewConstants.injected];
1598
+ if (injectedObject && injectedObject?.extensions) {
1599
+ const extensionsObject = injectedObject.extensions;
1600
+ if (extensionsObject &&
1601
+ CometChatUIKitUtility.checkHasOwnProperty(extensionsObject, LinkPreviewConstants.link_preview)) {
1602
+ const linkPreviewObject = extensionsObject[LinkPreviewConstants.link_preview];
1603
+ if (linkPreviewObject &&
1604
+ CometChatUIKitUtility.checkHasOwnProperty(linkPreviewObject, LinkPreviewConstants.links) &&
1605
+ linkPreviewObject[LinkPreviewConstants.links].length) {
1606
+ return linkPreviewObject[LinkPreviewConstants.links][0];
1607
+ }
1608
+ else {
1609
+ return null;
1610
+ }
1611
+ }
1612
+ else {
1613
+ return null;
1614
+ }
1615
+ }
1616
+ }
1617
+ else {
1618
+ return null;
1619
+ }
1620
+ }
1621
+ catch (error) {
1622
+ if (this.onError) {
1623
+ this.onError(error);
1624
+ }
1625
+ }
1626
+ }
1627
+ getImageThumbnail(msg) {
1628
+ const message = msg;
1629
+ let imageURL = "";
1630
+ if (this.enableThumbnailGeneration) {
1631
+ try {
1632
+ const metadata = message.getMetadata();
1633
+ const injectedObject = metadata?.[ThumbnailGenerationConstants.injected];
1634
+ const extensionsObject = injectedObject?.extensions;
1635
+ const thumbnailGenerationObject = extensionsObject[ThumbnailGenerationConstants.thumbnail_generation];
1636
+ const imageToDownload = thumbnailGenerationObject?.url_small;
1637
+ if (imageToDownload) {
1638
+ imageURL = imageToDownload;
1639
+ }
1640
+ else {
1641
+ imageURL = message?.data?.attachments ? message?.data?.attachments[0]?.url : "";
1642
+ }
1643
+ }
1644
+ catch (error) {
1645
+ if (this.onError) {
1646
+ this.onError(error);
1647
+ }
1648
+ }
1649
+ }
1650
+ else {
1651
+ imageURL = message?.data?.attachments ? message?.data?.attachments[0]?.url : "";
1652
+ }
1653
+ return imageURL;
1654
+ }
1655
+ getLinkPreviewDetails(key, message) {
1656
+ let linkPreviewObject = this.getLinkPreview(message);
1657
+ if (Object.keys(linkPreviewObject).length > 0) {
1658
+ return linkPreviewObject[key];
1659
+ }
1660
+ else {
1661
+ return "";
1662
+ }
1663
+ }
1664
+ ngOnInit() {
1665
+ this.setMessagesStyle();
1666
+ this.setAvatarStyle();
1667
+ this.setDateStyle();
1668
+ this.setReceiptStyle();
1669
+ this.subscribeToEvents();
1670
+ this.setOngoingCallStyle();
1671
+ this.state = States.loading;
1672
+ CometChat.getLoggedinUser().then((user) => {
1673
+ this.loggedInUser = user;
1674
+ }).catch((error) => {
1675
+ if (this.onError) {
1676
+ this.onError(error);
1677
+ }
1678
+ });
1679
+ this.dateSeparatorStyle.background = this.dateSeparatorStyle.background || this.themeService.theme.palette.getAccent600();
1680
+ this.dividerStyle.background = this.themeService.theme.palette.getAccent100();
1681
+ }
1682
+ setAvatarStyle() {
1683
+ let defaultStyle = new AvatarStyle({
1684
+ borderRadius: "24px",
1685
+ width: "28px",
1686
+ height: "28px",
1687
+ border: "none",
1688
+ backgroundColor: this.themeService.theme.palette.getAccent700(),
1689
+ nameTextColor: this.themeService.theme.palette.getAccent900(),
1690
+ backgroundSize: "cover",
1691
+ nameTextFont: fontHelper(this.themeService.theme.typography.subtitle1),
1692
+ outerViewBorder: "",
1693
+ outerViewBorderSpacing: "",
1694
+ });
1695
+ this.avatarStyle = { ...defaultStyle, ...this.avatarStyle };
1696
+ }
1697
+ setDateStyle() {
1698
+ let defaultStyle = new DateStyle({
1699
+ textFont: fontHelper(this.themeService.theme.typography.subtitle1),
1700
+ textColor: this.themeService.theme.palette.getAccent600(),
1701
+ background: this.themeService.theme.palette.getAccent100(),
1702
+ height: "100%",
1703
+ width: "100%",
1704
+ border: `1px solid ${this.themeService.theme.palette.getAccent100()}`,
1705
+ borderRadius: "8px",
1706
+ });
1707
+ this.dateSeparatorStyle = { ...defaultStyle, ...this.dateSeparatorStyle };
1708
+ }
1709
+ setMessagesStyle() {
1710
+ this.smartReplyStyle = {
1711
+ replyTextFont: fontHelper(this.themeService.theme.typography.caption1),
1712
+ replyTextColor: this.themeService.theme.palette.getAccent(),
1713
+ replyBackground: this.themeService.theme.palette.getBackground(),
1714
+ boxShadow: `0px 0px 1px ${this.themeService.theme.palette.getAccent600()}`,
1715
+ closeIconTint: this.themeService.theme.palette.getAccent600(),
1716
+ background: this.themeService.theme.palette.getBackground(),
1717
+ ...this.smartReplyStyle
1718
+ };
1719
+ this.fullScreenViewerStyle.closeIconTint = this.themeService.theme.palette.getPrimary();
1720
+ let defaultStyle = new MessageListStyle({
1721
+ background: this.themeService.theme.palette.getBackground(),
1722
+ border: `none`,
1723
+ emptyStateTextFont: fontHelper(this.themeService.theme.typography.title1),
1724
+ emptyStateTextColor: this.themeService.theme.palette.getAccent600(),
1725
+ errorStateTextFont: fontHelper(this.themeService.theme.typography.title1),
1726
+ errorStateTextColor: this.themeService.theme.palette.getAccent600(),
1727
+ loadingIconTint: this.themeService.theme.palette.getAccent600(),
1728
+ nameTextFont: fontHelper(this.themeService.theme.typography.title2),
1729
+ nameTextColor: this.themeService.theme.palette.getAccent600(),
1730
+ threadReplySeparatorColor: this.themeService.theme.palette.getAccent400(),
1731
+ threadReplyTextFont: fontHelper(this.themeService.theme.typography.subtitle1),
1732
+ threadReplyIconTint: this.themeService.theme.palette.getAccent600(),
1733
+ threadReplyTextColor: this.themeService.theme.palette.getAccent600(),
1734
+ TimestampTextFont: fontHelper(this.themeService.theme.typography.caption2),
1735
+ TimestampTextColor: this.themeService.theme.palette.getAccent600(),
1736
+ });
1737
+ this.messageListStyle = { ...defaultStyle, ...this.messageListStyle };
1738
+ this.bubbleDateStyle = {
1739
+ textColor: this.messageListStyle.TimestampTextColor || this.themeService.theme.palette.getAccent600(),
1740
+ textFont: this.messageListStyle.TimestampTextFont || fontHelper(this.themeService.theme.typography.caption2)
1741
+ };
1742
+ this.linkPreviewStyle = new LinkPreviewStyle({
1743
+ titleColor: this.themeService.theme.palette.getAccent(),
1744
+ titleFont: fontHelper(this.themeService.theme.typography.title2),
1745
+ descriptionColor: this.themeService.theme.palette.getAccent600(),
1746
+ descriptionFont: fontHelper(this.themeService.theme.typography.subtitle2),
1747
+ background: "transparent",
1748
+ height: "100%",
1749
+ width: "100%"
1750
+ });
1751
+ this.documentBubbleStyle = {
1752
+ titleFont: fontHelper(this.themeService.theme.typography.text2),
1753
+ titleColor: this.themeService.theme.palette.getAccent(),
1754
+ subtitleFont: fontHelper(this.themeService.theme.typography.subtitle2),
1755
+ subtitleColor: this.themeService.theme.palette.getAccent600(),
1756
+ iconTint: this.themeService.theme.palette.getAccent700(),
1757
+ buttonTextFont: fontHelper(this.themeService.theme.typography.text2),
1758
+ buttonTextColor: this.themeService.theme.palette.getPrimary(),
1759
+ buttonBackground: "transparent",
1760
+ separatorColor: this.themeService.theme.palette.getAccent200()
1761
+ };
1762
+ this.pollBubbleStyle = {
1763
+ borderRadius: "8px",
1764
+ background: "transparent",
1765
+ votePercentTextFont: fontHelper(this.themeService.theme.typography.subtitle2),
1766
+ votePercentTextColor: this.themeService.theme.palette.getAccent600(),
1767
+ pollQuestionTextFont: fontHelper(this.themeService.theme.typography.subtitle1),
1768
+ pollQuestionTextColor: this.themeService.theme.palette.getAccent(),
1769
+ pollOptionTextFont: fontHelper(this.themeService.theme.typography.text2),
1770
+ pollOptionTextColor: this.themeService.theme.palette.getAccent(),
1771
+ pollOptionBackground: this.themeService.theme.palette.getAccent900(),
1772
+ optionsIconTint: this.themeService.theme.palette.getAccent600(),
1773
+ totalVoteCountTextFont: fontHelper(this.themeService.theme.typography.subtitle2),
1774
+ totalVoteCountTextColor: this.themeService.theme.palette.getAccent600(),
1775
+ selectedPollOptionBackground: this.themeService.theme.palette.getAccent200(),
1776
+ userSelectedOptionBackground: this.themeService.theme.palette.getPrimary(),
1777
+ pollOptionBorder: `1px solid ${this.themeService.theme.palette.getAccent100()}`,
1778
+ pollOptionBorderRadius: "8px"
1779
+ };
1780
+ this.imageModerationStyle = {
1781
+ filterColor: this.themeService.theme.palette.getPrimary(),
1782
+ height: "100%",
1783
+ width: "100%",
1784
+ border: "none",
1785
+ warningTextColor: this.themeService.theme.palette.getAccent("dark"),
1786
+ warningTextFont: fontHelper(this.themeService.theme.typography.title2),
1787
+ };
1788
+ this.confirmDialogStyle = {
1789
+ confirmButtonBackground: this.themeService.theme.palette.getError(),
1790
+ cancelButtonBackground: this.themeService.theme.palette.getSecondary(),
1791
+ confirmButtonTextColor: this.themeService.theme.palette.getAccent900("light"),
1792
+ confirmButtonTextFont: fontHelper(this.themeService.theme.typography.text2),
1793
+ cancelButtonTextColor: this.themeService.theme.palette.getAccent900("dark"),
1794
+ cancelButtonTextFont: fontHelper(this.themeService.theme.typography.text2),
1795
+ titleFont: fontHelper(this.themeService.theme.typography.title1),
1796
+ titleColor: this.themeService.theme.palette.getAccent(),
1797
+ messageTextFont: fontHelper(this.themeService.theme.typography.subtitle2),
1798
+ messageTextColor: this.themeService.theme.palette.getAccent600(),
1799
+ background: this.themeService.theme.palette.getBackground(),
1800
+ height: "100%",
1801
+ width: "100%",
1802
+ border: `1px solid ${this.themeService.theme.palette.getAccent100()}`,
1803
+ borderRadius: "8px"
1804
+ };
1805
+ }
1806
+ setReceiptStyle() {
1807
+ this.receiptStyle = new ReceiptStyle({
1808
+ waitIconTint: this.themeService.theme.palette.getAccent700(),
1809
+ sentIconTint: this.themeService.theme.palette.getAccent600(),
1810
+ deliveredIconTint: this.themeService.theme.palette.getAccent600(),
1811
+ readIconTint: this.themeService.theme.palette.getPrimary(),
1812
+ errorIconTint: this.themeService.theme.palette.getError(),
1813
+ });
1814
+ this.receiptStyle = { ...this.receiptStyle };
1815
+ }
1816
+ createRequestBuilder() {
1817
+ if (!this.templates || this.templates?.length == 0) {
1818
+ this.messageTemplate = ChatConfigurator.getDataSource().getAllMessageTemplates();
1819
+ this.categories = ChatConfigurator.getDataSource().getAllMessageCategories();
1820
+ this.types = ChatConfigurator.getDataSource().getAllMessageTypes();
1821
+ }
1822
+ else {
1823
+ this.messageTemplate = this.templates;
1824
+ }
1825
+ this.state = States.loading;
1826
+ this.requestBuilder = null;
1827
+ if (this.user || this.group) {
1828
+ if (!this.messagesRequestBuilder) {
1829
+ if (this.user) {
1830
+ this.requestBuilder = new CometChat.MessagesRequestBuilder()
1831
+ .setUID(this.user.getUid())
1832
+ .setLimit(this.limit)
1833
+ .setTypes(this.types)
1834
+ .setCategories(this.categories)
1835
+ .hideReplies(true)
1836
+ .build();
1837
+ }
1838
+ else {
1839
+ this.requestBuilder = new CometChat.MessagesRequestBuilder()
1840
+ .setGUID(this.group.getGuid())
1841
+ .setLimit(this.limit)
1842
+ .setTypes(this.types)
1843
+ .hideReplies(true)
1844
+ .setCategories(this.categories)
1845
+ .build();
1846
+ }
1847
+ }
1848
+ else {
1849
+ this.requestBuilder = this.messagesRequestBuilder.build();
1850
+ }
1851
+ this.fetchPreviousMessages();
1852
+ }
1853
+ }
1854
+ addMessageEventListeners() {
1855
+ try {
1856
+ CometChat.addMessageListener(this.msgListenerId, new CometChat.MessageListener({
1857
+ onTextMessageReceived: (textMessage) => {
1858
+ this.messageUpdate(CometChatUIKitConstants.messages.TEXT_MESSAGE_RECEIVED, textMessage);
1859
+ },
1860
+ onCustomMessageReceived: (customMessage) => {
1861
+ this.messageUpdate(CometChatUIKitConstants.messages.CUSTOM_MESSAGE_RECEIVED, customMessage);
1862
+ },
1863
+ onMediaMessageReceived: (mediaMessage) => {
1864
+ this.messageUpdate(CometChatUIKitConstants.messages.MEDIA_MESSAGE_RECEIVED, mediaMessage);
1865
+ },
1866
+ onMessagesDelivered: (messageReceipt) => {
1867
+ this.messageUpdate(CometChatUIKitConstants.messages.MESSAGE_DELIVERED, messageReceipt);
1868
+ },
1869
+ onMessagesRead: (messageReceipt) => {
1870
+ this.messageUpdate(CometChatUIKitConstants.messages.MESSAGE_READ, messageReceipt);
1871
+ },
1872
+ onMessageDeleted: (deletedMessage) => {
1873
+ this.messageUpdate(CometChatUIKitConstants.messages.MESSAGE_DELETED, deletedMessage);
1874
+ },
1875
+ onMessageEdited: (editedMessage) => {
1876
+ this.messageUpdate(CometChatUIKitConstants.messages.MESSAGE_EDITED, editedMessage);
1877
+ },
1878
+ onTransientMessageReceived: (transientMessage) => {
1879
+ let liveReaction = transientMessage.getData();
1880
+ if (transientMessage.getReceiverType() == CometChatUIKitConstants.MessageReceiverType.user && this.user && transientMessage?.getSender().getUid() == this.user.getUid() && transientMessage.getReceiverId() == this.loggedInUser?.getUid()) {
1881
+ CometChatMessageEvents.ccLiveReaction.next(liveReaction["LIVE_REACTION"]);
1882
+ return;
1883
+ }
1884
+ else if (transientMessage.getReceiverType() == CometChatUIKitConstants.MessageReceiverType.group && this.group && transientMessage.getReceiverId() == this.group.getGuid() && transientMessage?.getSender().getUid() != this.loggedInUser?.getUid()) {
1885
+ CometChatMessageEvents.ccLiveReaction.next(liveReaction["LIVE_REACTION"]);
1886
+ return;
1887
+ }
1888
+ },
1889
+ }));
1890
+ CometChat.addGroupListener(this.groupListenerId, new CometChat.GroupListener({
1891
+ onGroupMemberScopeChanged: (message, changedUser, newScope, oldScope, changedGroup) => {
1892
+ this.messageUpdate(CometChatUIKitConstants.groupMemberAction.SCOPE_CHANGE, message, changedGroup, { user: changedUser, scope: newScope });
1893
+ },
1894
+ onGroupMemberKicked: (message, kickedUser, kickedBy, kickedFrom) => {
1895
+ this.messageUpdate(CometChatUIKitConstants.groupMemberAction.KICKED, message, kickedFrom, {
1896
+ user: kickedUser,
1897
+ hasJoined: false,
1898
+ });
1899
+ },
1900
+ onGroupMemberBanned: (message, bannedUser, bannedBy, bannedFrom) => {
1901
+ this.messageUpdate(CometChatUIKitConstants.groupMemberAction.BANNED, message, bannedFrom, {
1902
+ user: bannedUser,
1903
+ });
1904
+ },
1905
+ onGroupMemberUnbanned: (message, unbannedUser, unbannedBy, unbannedFrom) => {
1906
+ this.messageUpdate(CometChatUIKitConstants.groupMemberAction.UNBANNED, message, unbannedFrom, { user: unbannedUser });
1907
+ },
1908
+ onMemberAddedToGroup: (message, userAdded, userAddedBy, userAddedIn) => {
1909
+ this.messageUpdate(CometChatUIKitConstants.groupMemberAction.ADDED, message, userAddedIn, {
1910
+ user: userAdded,
1911
+ hasJoined: true,
1912
+ });
1913
+ },
1914
+ onGroupMemberLeft: (message, leavingUser, group) => {
1915
+ this.messageUpdate(CometChatUIKitConstants.groupMemberAction.LEFT, message, group, {
1916
+ user: leavingUser,
1917
+ });
1918
+ },
1919
+ onGroupMemberJoined: (message, joinedUser, joinedGroup) => {
1920
+ this.messageUpdate(CometChatUIKitConstants.groupMemberAction.JOINED, message, joinedGroup, {
1921
+ user: joinedUser,
1922
+ });
1923
+ },
1924
+ }));
1925
+ if (this.enableCalling) {
1926
+ CometChat.addCallListener(this.callListenerId, new CometChat.CallListener({
1927
+ onIncomingCallReceived: (call) => {
1928
+ this.addMessage(call);
1929
+ },
1930
+ onIncomingCallCancelled: (call) => {
1931
+ this.addMessage(call);
1932
+ },
1933
+ onOutgoingCallRejected: (call) => {
1934
+ this.addMessage(call);
1935
+ },
1936
+ onOutgoingCallAccepted: (call) => {
1937
+ this.addMessage(call);
1938
+ },
1939
+ }));
1940
+ }
1941
+ }
1942
+ catch (error) {
1943
+ if (this.onError) {
1944
+ this.onError(error);
1945
+ }
1946
+ }
1947
+ }
1948
+ /**
1949
+ *
1950
+ * @param
1951
+ */
1952
+ /**
1953
+ * Updates messageList on basis of user activity or group activity or calling activity
1954
+ * @param {any=null} key
1955
+ * @param {CometChat.MessageReceipt | CometChat.BaseMessage} message
1956
+ * @param {CometChat.Group | null=null} group
1957
+ * @param {any=null} options
1958
+ */
1959
+ messageUpdate(key = null, message = null, group = null, options = null) {
1960
+ try {
1961
+ switch (key) {
1962
+ case CometChatUIKitConstants.messages.TEXT_MESSAGE_RECEIVED:
1963
+ case CometChatUIKitConstants.messages.MEDIA_MESSAGE_RECEIVED:
1964
+ this.messageReceived(message);
1965
+ break;
1966
+ case CometChatUIKitConstants.messages.MESSAGE_DELIVERED:
1967
+ case CometChatUIKitConstants.messages.MESSAGE_READ:
1968
+ this.messageReadAndDelivered(message);
1969
+ break;
1970
+ case CometChatUIKitConstants.messages.MESSAGE_DELETED:
1971
+ case CometChatUIKitConstants.messages.MESSAGE_EDITED: {
1972
+ this.messageEdited(message);
1973
+ break;
1974
+ }
1975
+ case CometChatUIKitConstants.groupMemberAction.SCOPE_CHANGE:
1976
+ case CometChatUIKitConstants.groupMemberAction.JOINED:
1977
+ case CometChatUIKitConstants.groupMemberAction.LEFT:
1978
+ case CometChatUIKitConstants.groupMemberAction.ADDED:
1979
+ case CometChatUIKitConstants.groupMemberAction.KICKED:
1980
+ case CometChatUIKitConstants.groupMemberAction.BANNED:
1981
+ case CometChatUIKitConstants.groupMemberAction.UNBANNED: {
1982
+ this.addMessage(message);
1983
+ break;
1984
+ }
1985
+ case CometChatUIKitConstants.messages.CUSTOM_MESSAGE_RECEIVED:
1986
+ this.customMessageReceived(message);
1987
+ break;
1988
+ default:
1989
+ return;
1990
+ }
1991
+ this.ref.detectChanges();
1992
+ }
1993
+ catch (error) {
1994
+ if (this.onError) {
1995
+ this.onError(error);
1996
+ }
1997
+ }
1998
+ }
1999
+ /**
2000
+ * When Message is Received
2001
+ * @param message
2002
+ */
2003
+ /**
2004
+ * @param {CometChat.BaseMessage} message
2005
+ */
2006
+ messageReceived(message) {
2007
+ this.markMessageAsDelivered(message);
2008
+ try {
2009
+ if (this.group &&
2010
+ message.getReceiverType() === CometChatUIKitConstants.MessageReceiverType.group &&
2011
+ message.getReceiverId() === this.group?.getGuid()) {
2012
+ this.messageReceivedHandler(message, CometChatUIKitConstants.MessageReceiverType.group);
2013
+ }
2014
+ else if (this.user &&
2015
+ message.getReceiverType() === CometChatUIKitConstants.MessageReceiverType.user &&
2016
+ message?.getSender().getUid() === this.user?.getUid()) {
2017
+ if ((!message?.getReadAt() && !message?.getParentMessageId() && this.isOnBottom) || (!message?.getReadAt() && message.getParentMessageId() && this.parentMessageId && this.isOnBottom)) {
2018
+ if (!this.disableReceipt) {
2019
+ CometChat.markAsRead(message).then(() => {
2020
+ CometChatMessageEvents.ccMessageRead.next(message);
2021
+ });
2022
+ }
2023
+ else {
2024
+ this.UnreadCount = [];
2025
+ this.ref.detectChanges();
2026
+ }
2027
+ CometChatMessageEvents.ccMessageRead.next(message);
2028
+ }
2029
+ this.messageReceivedHandler(message, CometChatUIKitConstants.MessageReceiverType.user);
2030
+ }
2031
+ }
2032
+ catch (error) {
2033
+ if (this.onError) {
2034
+ this.onError(error);
2035
+ }
2036
+ }
2037
+ this.ref.detectChanges();
2038
+ }
2039
+ /**
2040
+ * Updating the reply count of Thread Parent Message
2041
+ * @param {CometChat.BaseMessage} messages
2042
+ */
2043
+ updateReplyCount(messages) {
2044
+ try {
2045
+ const receivedMessage = messages;
2046
+ let messageList = [...this.messagesList];
2047
+ let messageKey = messageList.findIndex((m) => m.getId() === receivedMessage.getParentMessageId());
2048
+ if (messageKey > -1) {
2049
+ const messageObj = messageList[messageKey];
2050
+ let replyCount = messageObj.getReplyCount() ? messageObj.getReplyCount() : 0;
2051
+ replyCount = replyCount + 1;
2052
+ messageObj.setReplyCount(replyCount);
2053
+ messageList.splice(messageKey, 1, messageObj);
2054
+ this.messagesList = [...messageList];
2055
+ this.ref.detectChanges();
2056
+ }
2057
+ }
2058
+ catch (error) {
2059
+ if (this.onError) {
2060
+ this.onError(error);
2061
+ }
2062
+ }
2063
+ }
2064
+ playAudio() {
2065
+ if (!this.disableSoundForMessages) {
2066
+ if (this.customSoundForMessages) {
2067
+ CometChatSoundManager.play(CometChatSoundManager.Sound.incomingMessage, this.customSoundForMessages);
2068
+ }
2069
+ else {
2070
+ CometChatSoundManager.play(CometChatSoundManager.Sound.incomingMessage);
2071
+ }
2072
+ }
2073
+ }
2074
+ reInitializeMessageList() {
2075
+ this.reinitialized = true;
2076
+ this.msgListenerId = "message_" + new Date().getTime();
2077
+ this.groupListenerId = "group_" + new Date().getTime();
2078
+ this.callListenerId = "call_" + new Date().getTime();
2079
+ this.addMessageEventListeners();
2080
+ if (this.messagesRequestBuilder) {
2081
+ if (this.keepRecentMessages) {
2082
+ this.messagesList.splice(1, this.messagesList.length - 30);
2083
+ }
2084
+ else {
2085
+ this.messagesList.splice(30);
2086
+ }
2087
+ this.requestBuilder = this.messagesRequestBuilder;
2088
+ }
2089
+ else {
2090
+ if (this.keepRecentMessages) {
2091
+ this.messagesList.splice(1, this.messagesList.length - 30);
2092
+ this.scrollToBottom();
2093
+ }
2094
+ else {
2095
+ this.messagesList.splice(30);
2096
+ }
2097
+ }
2098
+ this.ref.detectChanges();
2099
+ }
2100
+ getMessageReceipt(message) {
2101
+ let receipt = MessageReceiptUtils.getReceiptStatus(message);
2102
+ return receipt;
2103
+ }
2104
+ messageReadAndDelivered(message) {
2105
+ try {
2106
+ if (message.getReceiverType() == CometChatUIKitConstants.MessageReceiverType.user &&
2107
+ message?.getSender().getUid() == this.user?.getUid() &&
2108
+ message.getReceiver() == this.loggedInUser?.getUid()) {
2109
+ if (message.getReceiptType() == CometChatUIKitConstants.messages.DELIVERY) {
2110
+ //search for message
2111
+ let messageKey = this.messagesList.findIndex((m) => m.getId() == Number(message.getMessageId()));
2112
+ if (messageKey > -1) {
2113
+ this.messagesList[messageKey].setDeliveredAt(message.getDeliveredAt());
2114
+ this.ref.detectChanges();
2115
+ }
2116
+ // this.ref.detectChanges();
2117
+ this.markAllMessagAsDelivered(messageKey);
2118
+ }
2119
+ else if (message.getReceiptType() == CometChatUIKitConstants.messages.READ) {
2120
+ //search for message
2121
+ let messageKey = this.messagesList.findIndex((m) => m.getId() == Number(message.getMessageId()));
2122
+ if (messageKey > -1) {
2123
+ this.messagesList[messageKey].setReadAt(message?.getReadAt());
2124
+ this.ref.detectChanges();
2125
+ }
2126
+ this.ref.detectChanges();
2127
+ this.markAllMessagAsRead(messageKey);
2128
+ }
2129
+ }
2130
+ else if (message.getReceiverType() === CometChatUIKitConstants.MessageReceiverType.group &&
2131
+ message.getReceiver() === this.group?.getGuid()) {
2132
+ return;
2133
+ }
2134
+ }
2135
+ catch (error) {
2136
+ if (this.onError) {
2137
+ this.onError(error);
2138
+ }
2139
+ }
2140
+ this.ref.detectChanges();
2141
+ }
2142
+ /**
2143
+ * @param {CometChat.BaseMessage} readMessage
2144
+ */
2145
+ markAllMessagAsRead(messageKey) {
2146
+ for (let i = messageKey; i >= 0; i--) {
2147
+ if (!this.messagesList[i].getReadAt()) {
2148
+ this.messagesList[i].setReadAt(CometChatUIKitUtility.getUnixTimestamp());
2149
+ this.ref.detectChanges();
2150
+ }
2151
+ }
2152
+ CometChatMessageEvents.ccMessageRead.next(this.messagesList[messageKey]);
2153
+ }
2154
+ markAllMessagAsDelivered(messageKey) {
2155
+ for (let i = messageKey; i >= 0; i--) {
2156
+ if (!this.messagesList[i].getDeliveredAt()) {
2157
+ this.messagesList[i].setDeliveredAt(CometChatUIKitUtility.getUnixTimestamp());
2158
+ this.ref.detectChanges();
2159
+ }
2160
+ }
2161
+ }
2162
+ /**
2163
+ * Emits an Action Indicating that Group Data has been updated
2164
+ * @param
2165
+ */
2166
+ /**
2167
+ * When custom messages are received eg. Poll, Stickers emits action to update message list
2168
+ * @param message
2169
+ */
2170
+ /**
2171
+ * @param {CometChat.BaseMessage} message
2172
+ */
2173
+ customMessageReceived(message) {
2174
+ try {
2175
+ this.markMessageAsDelivered(message);
2176
+ if (this.group &&
2177
+ message.getReceiverType() === CometChatUIKitConstants.MessageReceiverType.group &&
2178
+ message.getReceiverId() === this.group?.getGuid()) {
2179
+ if ((!message?.getReadAt() && !message?.getParentMessageId() && this.isOnBottom) || (!message?.getReadAt() && message.getParentMessageId() && this.parentMessageId && this.isOnBottom)) {
2180
+ if (!this.disableReceipt) {
2181
+ CometChat.markAsRead(message).then(() => {
2182
+ CometChatMessageEvents.ccMessageRead.next(message);
2183
+ });
2184
+ }
2185
+ else {
2186
+ this.UnreadCount = [];
2187
+ this.ref.detectChanges();
2188
+ }
2189
+ }
2190
+ this.customMessageReceivedHandler(message, CometChatUIKitConstants.MessageReceiverType.group);
2191
+ }
2192
+ else if (this.user &&
2193
+ message.getReceiverType() === CometChatUIKitConstants.MessageReceiverType.user &&
2194
+ ((message?.getSender().getUid() === this.user?.getUid() &&
2195
+ message.getReceiverId() === this.loggedInUser?.getUid())
2196
+ || (this.loggedInUser?.getUid() === message?.getSender().getUid() &&
2197
+ message.getReceiverId() === this.user?.getUid()))) {
2198
+ if ((!message?.getReadAt() && !message?.getParentMessageId() && this.isOnBottom) || (!message?.getReadAt() && message.getParentMessageId() && this.parentMessageId && this.isOnBottom)) {
2199
+ if (!this.disableReceipt) {
2200
+ CometChat.markAsRead(message).then(() => {
2201
+ CometChatMessageEvents.ccMessageRead.next(message);
2202
+ });
2203
+ }
2204
+ else {
2205
+ this.UnreadCount = [];
2206
+ this.ref.detectChanges();
2207
+ }
2208
+ }
2209
+ this.customMessageReceivedHandler(message, CometChatUIKitConstants.MessageReceiverType.user);
2210
+ }
2211
+ }
2212
+ catch (error) {
2213
+ if (this.onError) {
2214
+ this.onError(error);
2215
+ }
2216
+ }
2217
+ this.ref.detectChanges();
2218
+ return true;
2219
+ }
2220
+ /**
2221
+ * TrackBy method to update UI when a change is detected
2222
+ */
2223
+ /**
2224
+ * @param {number} index
2225
+ * @param {any} item
2226
+ */
2227
+ getMessageId(index, item) {
2228
+ return item.editedAt || item.readAt || item.deliveredAt || item.id;
2229
+ }
2230
+ /**
2231
+ * Compares two dates and sets Date on a a new day
2232
+ */
2233
+ /**
2234
+ * @param {number} firstDate
2235
+ * @param {number} secondDate
2236
+ */
2237
+ isDateDifferent(firstDate, secondDate) {
2238
+ let firstDateObj, secondDateObj;
2239
+ firstDateObj = new Date(firstDate * 1000);
2240
+ secondDateObj = new Date(secondDate * 1000);
2241
+ return firstDateObj.getDate() !== secondDateObj.getDate() ||
2242
+ firstDateObj.getMonth() !== secondDateObj.getMonth() ||
2243
+ firstDateObj.getFullYear() !== secondDateObj.getFullYear();
2244
+ }
2245
+ /**
2246
+ * prepend Fetched Messages
2247
+ * @param {CometChat.BaseMessage} messages
2248
+ */
2249
+ prependMessages(messages) {
2250
+ try {
2251
+ this.messagesList = [...messages, ...this.messagesList];
2252
+ this.messageCount = this.messagesList.length;
2253
+ if (this.messageCount > this.thresholdValue) {
2254
+ this.keepRecentMessages = false;
2255
+ this.reInitializeMessageBuilder();
2256
+ }
2257
+ this.ngZone.run(() => {
2258
+ if (this.state != States.loaded) {
2259
+ this.state = States.loaded;
2260
+ }
2261
+ this.ref.detach(); // Detach the change detector
2262
+ });
2263
+ if (this.chatChanged) {
2264
+ CometChatUIEvents.ccActiveChatChanged.next({
2265
+ user: this.user,
2266
+ group: this.group,
2267
+ message: messages[messages?.length - 1]
2268
+ });
2269
+ this.chatChanged = false;
2270
+ this.scrollToBottom();
2271
+ }
2272
+ }
2273
+ catch (error) {
2274
+ this.state = States.error;
2275
+ if (this.onError) {
2276
+ this.onError(error);
2277
+ }
2278
+ }
2279
+ }
2280
+ /**
2281
+ * listening to bottom scroll using intersection observer
2282
+ */
2283
+ ioBottom() {
2284
+ const options = {
2285
+ root: this.listScroll.nativeElement,
2286
+ rootMargin: '-100% 0px 100px 0px',
2287
+ threshold: 0,
2288
+ };
2289
+ const callback = (entries) => {
2290
+ this.isOnBottom = false;
2291
+ const lastMessage = this.UnreadCount[this.UnreadCount.length - 1];
2292
+ this.isOnBottom = entries[0].isIntersecting;
2293
+ if (this.isOnBottom) {
2294
+ this.fetchNextMessage();
2295
+ if (!this.disableReceipt && this.UnreadCount?.length > 0) {
2296
+ CometChat.markAsRead(lastMessage).then((res) => {
2297
+ this.UnreadCount = [];
2298
+ let messageKey = this.messagesList.findIndex((m) => m.getId() === Number(res?.getMessageId()));
2299
+ if (messageKey > -1) {
2300
+ this.markAllMessagAsRead(messageKey);
2301
+ }
2302
+ this.ref.detectChanges();
2303
+ CometChatMessageEvents.ccMessageRead.next(lastMessage);
2304
+ });
2305
+ }
2306
+ else {
2307
+ this.UnreadCount = [];
2308
+ this.ref.detectChanges();
2309
+ }
2310
+ }
2311
+ };
2312
+ var observer = new IntersectionObserver(callback, options);
2313
+ observer.observe(this.bottom.nativeElement);
2314
+ }
2315
+ ;
2316
+ /**
2317
+ * listening to top scroll using intersection observer
2318
+ */
2319
+ ioTop() {
2320
+ const options = {
2321
+ root: this.listScroll.nativeElement,
2322
+ rootMargin: '200px 0px 0px 0px',
2323
+ threshold: 1.0
2324
+ };
2325
+ const callback = (entries) => {
2326
+ this.isOnBottom = false;
2327
+ if (entries[0].isIntersecting) {
2328
+ this.numberOfTopScroll++;
2329
+ if (this.numberOfTopScroll > 1) {
2330
+ this.fetchPreviousMessages();
2331
+ }
2332
+ }
2333
+ };
2334
+ var observer = new IntersectionObserver(callback, options);
2335
+ observer.observe(this.top.nativeElement);
2336
+ }
2337
+ /**
2338
+ * callback for deleteMessage
2339
+ * @param {CometChat.BaseMessage} object
2340
+ */
2341
+ /**
2342
+ * @param {CometChat.BaseMessage} messages
2343
+ */
2344
+ messageSent(messages) {
2345
+ const message = messages;
2346
+ const messageList = [...this.messagesList];
2347
+ let messageKey = messageList.findIndex((m) => m.getMuid() === message.getMuid());
2348
+ if (messageKey > -1) {
2349
+ messageList.splice(messageKey, 1, message);
2350
+ }
2351
+ this.messagesList = messageList;
2352
+ this.ref.detectChanges();
2353
+ this.scrollToBottom();
2354
+ }
2355
+ updateMessage(message, muid = false) {
2356
+ if (muid) {
2357
+ this.messageSent(message);
2358
+ }
2359
+ else {
2360
+ this.updateEditedMessage(message);
2361
+ }
2362
+ }
2363
+ showHeaderTitle(message) {
2364
+ if (this.alignment == MessageListAlignment.left) {
2365
+ return true;
2366
+ }
2367
+ else {
2368
+ if (this.group && message?.getCategory() != CometChatUIKitConstants.MessageCategory.action && !message?.getDeletedAt() && message?.getSender() && message?.getSender().getUid() != this.loggedInUser?.getUid() && this.alignment == MessageListAlignment.standard) {
2369
+ return true;
2370
+ }
2371
+ else {
2372
+ return false;
2373
+ }
2374
+ }
2375
+ }
2376
+ subscribeToEvents() {
2377
+ this.ccShowPanel = CometChatUIEvents.ccShowPanel.subscribe((data) => {
2378
+ this.smartReplyConfig = data.configuration;
2379
+ this.smartReplyMessage = data.message;
2380
+ this.enableSmartReply = true;
2381
+ this.showSmartReply = true;
2382
+ this.ref.detectChanges();
2383
+ });
2384
+ this.ccHidePanel = CometChatUIEvents.ccHidePanel.subscribe(() => {
2385
+ this.smartReplyMessage = null;
2386
+ this.enableSmartReply = false;
2387
+ this.showSmartReply = false;
2388
+ });
2389
+ this.ccGroupMemberAdded = CometChatGroupEvents.ccGroupMemberAdded.subscribe((item) => {
2390
+ item;
2391
+ this.appendMessages(item.messages);
2392
+ });
2393
+ this.ccGroupMemberBanned = CometChatGroupEvents.ccGroupMemberBanned.subscribe((item) => {
2394
+ this.addMessage(item.message);
2395
+ });
2396
+ this.ccGroupMemberKicked = CometChatGroupEvents.ccGroupMemberKicked.subscribe((item) => {
2397
+ this.addMessage(item.message);
2398
+ });
2399
+ this.ccGroupMemberScopeChanged = CometChatGroupEvents.ccGroupMemberScopeChanged.subscribe((item) => {
2400
+ this.addMessage(item.message);
2401
+ });
2402
+ this.ccGroupLeft = CometChatGroupEvents.ccGroupLeft.subscribe((item) => {
2403
+ this.addMessage(item.message);
2404
+ });
2405
+ this.ccMessageEdit = CometChatMessageEvents.ccMessageEdited.subscribe((object) => {
2406
+ if (object?.status == MessageStatus.success) {
2407
+ this.updateMessage(object.message);
2408
+ }
2409
+ });
2410
+ this.ccMessageSent = CometChatMessageEvents.ccMessageSent.subscribe((obj) => {
2411
+ let message = obj.message;
2412
+ switch (obj.status) {
2413
+ case MessageStatus.inprogress: {
2414
+ this.addMessage(message);
2415
+ this.playAudio();
2416
+ break;
2417
+ }
2418
+ case MessageStatus.success: {
2419
+ if (message.getParentMessageId() || this.parentMessageId) {
2420
+ this.updateReplyCount(message);
2421
+ }
2422
+ this.updateMessage(message, true);
2423
+ break;
2424
+ }
2425
+ case MessageStatus.success: {
2426
+ this.updateMessage(message);
2427
+ }
2428
+ }
2429
+ });
2430
+ this.ccMessageDelete = CometChatMessageEvents.ccMessageDeleted.subscribe((messageObject) => {
2431
+ this.removeMessage(messageObject);
2432
+ this.ref.detectChanges();
2433
+ });
2434
+ this.ccCallEnded = CometChatCallEvents.ccCallEnded.subscribe((call) => {
2435
+ this.showOngoingCall = false;
2436
+ this.sessionId = "";
2437
+ if (call) {
2438
+ this.addMessage(call);
2439
+ }
2440
+ this.ref.detectChanges();
2441
+ });
2442
+ this.ccCallRejected = CometChatCallEvents.ccCallRejected.subscribe((call) => {
2443
+ this.addMessage(call);
2444
+ });
2445
+ this.ccOutgoingCall = CometChatCallEvents.ccOutgoingCall.subscribe((call) => {
2446
+ this.addMessage(call);
2447
+ });
2448
+ this.ccCallAccepted = CometChatCallEvents.ccCallAccepted.subscribe((call) => {
2449
+ this.addMessage(call);
2450
+ });
2451
+ }
2452
+ getReplies() {
2453
+ let smartReply = this.smartReplyMessage;
2454
+ const smartReplyObject = smartReply?.metadata?.[SmartRepliesConstants.injected]?.extensions?.[SmartRepliesConstants.smart_reply];
2455
+ if (smartReplyObject?.reply_positive && smartReplyObject?.reply_neutral && smartReplyObject?.reply_negative) {
2456
+ const { reply_positive, reply_neutral, reply_negative } = smartReplyObject;
2457
+ return [reply_positive, reply_neutral, reply_negative];
2458
+ }
2459
+ return null;
2460
+ }
2461
+ unsubscribeToEvents() {
2462
+ this.ccGroupMemberAdded?.unsubscribe();
2463
+ this.ccGroupMemberBanned?.unsubscribe();
2464
+ this.ccGroupMemberJoined?.unsubscribe();
2465
+ this.ccGroupMemberKicked?.unsubscribe();
2466
+ this.ccOwnershipChanged?.unsubscribe();
2467
+ this.ccGroupLeft?.unsubscribe();
2468
+ this.ccMessageEdit?.unsubscribe();
2469
+ this.ccMessageSent?.unsubscribe();
2470
+ this.ccLiveReaction?.unsubscribe();
2471
+ this.ccMessageDelete?.unsubscribe();
2472
+ this.ccGroupMemberScopeChanged?.unsubscribe();
2473
+ }
2474
+ }
2475
+ CometChatMessageListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: CometChatMessageListComponent, deps: [{ token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i1.CometChatThemeService }], target: i0.ɵɵFactoryTarget.Component });
2476
+ CometChatMessageListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: CometChatMessageListComponent, selector: "cometchat-message-list", inputs: { hideError: "hideError", errorStateView: "errorStateView", loadingStateView: "loadingStateView", emptyStateView: "emptyStateView", errorStateText: "errorStateText", emptyStateText: "emptyStateText", loadingIconURL: "loadingIconURL", user: "user", group: "group", disableReceipt: "disableReceipt", disableSoundForMessages: "disableSoundForMessages", customSoundForMessages: "customSoundForMessages", readIcon: "readIcon", deliveredIcon: "deliveredIcon", sentIcon: "sentIcon", waitIcon: "waitIcon", errorIcon: "errorIcon", alignment: "alignment", showAvatar: "showAvatar", datePattern: "datePattern", timestampAlignment: "timestampAlignment", DateSeparatorPattern: "DateSeparatorPattern", templates: "templates", messagesRequestBuilder: "messagesRequestBuilder", newMessageIndicatorText: "newMessageIndicatorText", scrollToBottomOnNewMessages: "scrollToBottomOnNewMessages", thresholdValue: "thresholdValue", onThreadRepliesClick: "onThreadRepliesClick", headerView: "headerView", footerView: "footerView", parentMessageId: "parentMessageId", avatarStyle: "avatarStyle", backdropStyle: "backdropStyle", dateSeparatorStyle: "dateSeparatorStyle", messageListStyle: "messageListStyle", onError: "onError" }, viewQueries: [{ propertyName: "listScroll", first: true, predicate: ["listScroll"], descendants: true }, { propertyName: "bottom", first: true, predicate: ["bottom"], descendants: true }, { propertyName: "top", first: true, predicate: ["top"], descendants: true }, { propertyName: "textBubble", first: true, predicate: ["textBubble"], descendants: true }, { propertyName: "threadMessageBubble", first: true, predicate: ["threadMessageBubble"], descendants: true }, { propertyName: "fileBubble", first: true, predicate: ["fileBubble"], descendants: true }, { propertyName: "audioBubble", first: true, predicate: ["audioBubble"], descendants: true }, { propertyName: "videoBubble", first: true, predicate: ["videoBubble"], descendants: true }, { propertyName: "imageBubble", first: true, predicate: ["imageBubble"], descendants: true }, { propertyName: "stickerBubble", first: true, predicate: ["stickerBubble"], descendants: true }, { propertyName: "documentBubble", first: true, predicate: ["documentBubble"], descendants: true }, { propertyName: "whiteboardBubble", first: true, predicate: ["whiteboardBubble"], descendants: true }, { propertyName: "popoverRef", first: true, predicate: ["popoverRef"], descendants: true }, { propertyName: "directCalling", first: true, predicate: ["directCalling"], descendants: true }, { propertyName: "pollBubble", first: true, predicate: ["pollBubble"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cc-message-list__wrapper\" [ngStyle]=\"wrapperStyle()\">\n <div class=\"cc-message-list__header-view\">\n<div *ngIf=\"headerView\">\n <ng-container *ngTemplateOutlet=\"headerView\">\n </ng-container>\n</div>\n </div>\n <div class=\"cc-message-list\" #listScroll>\n <div class=\"cc-message-list__top\" #top>\n </div>\n <div class=\"cc-message-list__decorator-message\" *ngIf=\"state == states.loading || state == states.error || state == states.empty \"\n [ngStyle]=\"messageContainerStyle()\">\n <div class=\"cc-message-list__loading-view\" *ngIf=\"state == states.loading \">\n <cometchat-loader [iconURL]=\"loadingIconURL\" [loaderStyle]=\"loadingStyle()\">\n </cometchat-loader>\n <span class=\"cc-message-list__customview--loading\" *ngIf=\"state == states.loading && loadingStateView\">\n <ng-container *ngTemplateOutlet=\"loadingStateView\">\n </ng-container>\n </span>\n </div>\n <div class=\"cc-message-list__error-view\" *ngIf=\"state == states.error && !hideError \">\n <cometchat-label [labelStyle]=\"errorStyle()\" *ngIf=\"state == states.error && !hideError && !errorStateView\" [text]=\"errorStateText\"\n >\n </cometchat-label>\n <span class=\"cc-message-list__custom-view--error\" *ngIf=\"state == states.error && !hideError && errorStateView\">\n <ng-container *ngTemplateOutlet=\"errorStateView\">\n </ng-container>\n </span>\n </div>\n <div class=\"cc-message-list__empty-view\" *ngIf=\"state == states.empty\">\n <cometchat-label [labelStyle]=\"emptyStyle()\" *ngIf=\"state == states.empty && !emptyStateView\" [text]=\"emptyStateText\"\n >\n </cometchat-label>\n <span class=\"cc-message-list__custom-view--empty\" *ngIf=\"state == states.empty && emptyStateView\">\n <ng-container *ngTemplateOutlet=\"emptyStateView\">\n </ng-container>\n </span>\n </div>\n </div>\n <div class=\"cc-message-list__bubble\" *ngFor=\"let message of messagesList; let i = index\">\n <div class=\"cc-message-list__date-container\" *ngIf=\"(i === 0)\">\n <span class=\"cc-message-list__date\" >\n <cometchat-date [timestamp]=\"message!.getSentAt()\" [pattern]=\"DateSeparatorPattern\" [dateStyle]=\"dateSeparatorStyle\"\n >\n </cometchat-date>\n </span>\n </div>\n <div class=\"cc-message-list__date-container\" *ngIf=\"(i > 0 && isDateDifferent(messagesList[i - 1]?.getSentAt(), messagesList[i]?.getSentAt()))\n \">\n <span class=\"cc-message-list__date\" >\n <cometchat-date [timestamp]=\"message?.getSentAt()\" [pattern]=\"DateSeparatorPattern\" [dateStyle]=\"dateSeparatorStyle\"\n >\n </cometchat-date>\n </span>\n </div>\n <div *ngIf=\"getBubbleWrapper(message) \">\n <ng-container *ngTemplateOutlet=\"getBubbleWrapper(message)\">\n </ng-container>\n </div>\n <div>\n <cometchat-message-bubble *ngIf=\"!getBubbleWrapper(message)\" [leadingView]=\" showAvatar ? leadingView : null\" [bottomView]=\"enableReactions ? reactionView : null\"\n [headerView]=\"getHeaderView(message) || message?.getCategory() != MessageCategory.action && showHeaderTitle(message) ? bubbleHeader : null\" [footerView]=\"footerView\" [contentView]=\"contentView\" [threadView]=\"threadView\"\n [id]=\"message?.getId() || message?.getMuid()\" [options]=\"setMessageOptions(message)\"\n [messageBubbleStyle]=\"setMessageBubbleStyle(message)\" [alignment]=\"setBubbleAlignment(message)\">\n <ng-template #contentView>\n <ng-container *ngTemplateOutlet=\"getContentView(message);context:{ $implicit: message }\" >\n </ng-container>\n </ng-template>\n <ng-template #reactionView>\n <reactions-view [messageObject]=\"message\" [alignment]=\"setBubbleAlignment(message)\"\n [loggedInUser]=\"loggedInUser\" [reactionsStyle]=\"reactionsStyle(message)\"></reactions-view>\n </ng-template>\n <ng-template #footerView>\n <div class=\"cc-message-list__bubble-footer\">\n <div *ngIf=\"getFooterView(message);else bubbleFooter\">\n <ng-container *ngTemplateOutlet=\"getFooterView(message);context:{ $implicit: message }\" >\n </ng-container>\n </div>\n <ng-template #bubbleFooter>\n <div class=\"cc-message-list__bubble-date\" *ngIf=\"timestampAlignment == timestampEnum.bottom && message?.getCategory() != MessageCategory.action && !message.getDeletedAt() && message?.getCategory() != MessageCategory.call\">\n <cometchat-date [timestamp]=\"message?.getSentAt()\" [dateStyle]=\"bubbleDateStyle\" [pattern]=\"datePattern\">\n </cometchat-date>\n </div>\n <div *ngIf=\" !message?.getDeletedAt() && !disableReceipt && (!message?.getSender() ||this.loggedInUser.getUid() == message?.getSender()?.getUid()) && message?.getCategory() != MessageCategory.action && message?.getCategory() != MessageCategory.call\" class=\"cc-message-list__receipt\">\n <cometchat-receipt [receipt]=\"getMessageReceipt(message)\" [receiptStyle]=\"receiptStyle\" [waitIcon]=\"waitIcon\" [sentIcon]=\"sentIcon\" [deliveredIcon]=\"deliveredIcon\" [readIcon]=\"readIcon\" [errorIcon]=\"errorIcon\"></cometchat-receipt>\n </div>\n </ng-template>\n </div>\n </ng-template>\n<ng-template #leadingView>\n <div *ngIf=\" message?.getCategory() != MessageCategory.action && showHeaderTitle(message)\" >\n <cometchat-avatar [name]=\"message?.getSender()?.getName()\" [style]=\"avatarStyle\" [image]=\"message?.getSender()?.getAvatar()\">\n </cometchat-avatar>\n </div>\n</ng-template>\n<ng-template #bubbleHeader>\n <div *ngIf=\"getHeaderView(message);else defaultHeader\">\n <ng-container *ngTemplateOutlet=\"getHeaderView(message);context:{ $implicit: message }\" >\n </ng-container>\n </div>\n<ng-template #defaultHeader>\n <div class=\"cc-message-list__bubble-header\" *ngIf=\"message?.getCategory() != MessageCategory.action && showHeaderTitle(message) && message?.getCategory() != MessageCategory.call\">\n <cometchat-label [text]=\"message?.getSender()?.getName()\" [labelStyle]=\"labelStyle\"></cometchat-label>\n <cometchat-date [pattern]=\"datePattern\" [timestamp]=\"message?.getSentAt()\" [style]=\"bubbleDateStyle\" *ngIf=\"timestampAlignment == timestampEnum.top\"></cometchat-date>\n </div>\n</ng-template>\n</ng-template>\n<ng-template #threadView>\n <div class=\"cc-message-list__threadreplies\" *ngIf=\"message?.getReplyCount() && !message.getDeletedAt()\" >\n <cometchat-divider [dividerStyle]=\"dividerStyle\"></cometchat-divider>\n <cometchat-button [text]=\"getThreadCount(message)\" [buttonStyle]=\"getThreadViewStyle(message)\" [iconURL]=\"threadOpenIcon\" (cc-button-clicked)=\"openThreadView(message)\">\n </cometchat-button>\n </div>\n</ng-template>\n </cometchat-message-bubble>\n </div>\n </div>\n <div class=\"cc-message-list__bottom\" #bottom>\n </div>\n </div>\n <div class=\"cc-message-list__footer-view\">\n <div *ngIf=\"footerView;else footer\">\n <ng-container *ngTemplateOutlet=\"footerView\">\n </ng-container>\n </div>\n <ng-template #footer>\n <div class=\"cc-message-list__smart-replies\" *ngIf=\"showSmartReply && getReplies() && (!UnreadCount || UnreadCount.length == 0)\">\n <smart-replies [smartReplyStyle]=\"smartReplyStyle\" [replies]=\"getReplies()\" (cc-reply-clicked)=\"sendReply($event)\" (cc-close-clicked)=\"closeSmartReply()\">\n </smart-replies>\n </div>\n<div class=\"cc-message-list__message-indicator\" *ngIf=\"UnreadCount && UnreadCount.length > 0 && !isOnBottom\">\n <cometchat-button [text]=\"newMessageCount\" [buttonStyle]=\"unreadMessagesStyle\" (cc-button-clicked)=\"scrollToBottom()\"></cometchat-button>\n</div>\n </ng-template>\n </div>\n\n</div>\n<!-- default bubbles -->\n<ng-template #textBubble let-message>\n <cometchat-text-bubble *ngIf=\"message?.type == MessageTypesConstant.groupMember\" [textStyle]=\"setTextBubbleStyle(message)\" [text]=\"message?.message\"></cometchat-text-bubble>\n <cometchat-text-bubble *ngIf=\"message?.getDeletedAt()\" [textStyle]=\"setTextBubbleStyle(message)\" [text]=\"localize('MESSAGE_IS_DELETED')\"></cometchat-text-bubble>\n<cometchat-text-bubble *ngIf=\"!isTranslated(message) && !getLinkPreview(message) && !message?.deletedAt && message?.type != MessageTypesConstant.groupMember\" [textStyle]=\"setTextBubbleStyle(message)\" [text]=\"getTextMessage(message)\"></cometchat-text-bubble>\n<link-preview [linkPreviewStyle]=\"linkPreviewStyle\" (cc-link-clicked)=\"openLinkURL($event)\" *ngIf=\"!message?.getDeletedAt() && getLinkPreview(message) && enableLinkPreview\" [title]=\"getLinkPreviewDetails('title',message)\" [description]=\"getLinkPreviewDetails('description',message)\" [URL]=\"getLinkPreviewDetails('url',message)\" [image]=\"getLinkPreviewDetails('image',message)\" [favIconURL]=\"getLinkPreviewDetails('favicon',message)\">\n <cometchat-text-bubble\n *ngIf=\"!isTranslated(message) && getLinkPreview(message) && !message?.deletedAt && message?.type != MessageTypesConstant.groupMember\"\n [textStyle]=\"setTextBubbleStyle(message)\" [text]=\"getTextMessage(message)\"></cometchat-text-bubble>\n</link-preview>\n<message-translation-bubble [alignment]=\"getBubbleAlignment(message)\" *ngIf=\"isTranslated(message)\" [messageTranslationStyle]=\"setTranslationStyle(message)\" [translatedText]=\"isTranslated(message)\">\n <cometchat-text-bubble *ngIf=\" !message?.deletedAt && message?.type != MessageTypesConstant.groupMember\" [textStyle]=\"setTextBubbleStyle(message)\" [text]=\"message?.text\"></cometchat-text-bubble>\n\n</message-translation-bubble>\n</ng-template>\n<ng-template #fileBubble let-message>\n\n <cometchat-file-bubble [fileStyle]=\"setFileBubbleStyle(message)\" [downloadIconURL]=\"downloadIconURL\" [subtitle]=\"localize('SHARED_FILE')\" [title]=\"message?.data?.attachments ? message?.data?.attachments[0]?.name: ''\" [fileURL]=\"message?.data?.attachments ? message?.data?.attachments[0]?.url : ''\"></cometchat-file-bubble>\n</ng-template>\n<ng-template #audioBubble let-message>\n <cometchat-icon-button [disabled]=\"true\" *ngIf=\"message?.category == callConstant && message?.type == MessageTypesConstant.audio\" [iconURL]=\"getCallTypeIcon(message)\" [buttonStyle]=\"callStatusStyle(message)\" [text]=\"getCallActionMessage(message)\"></cometchat-icon-button>\n <cometchat-audio-bubble *ngIf=\"!message.getDeletedAt() && message?.category != callConstant\" [src]=\"message?.data?.attachments ? message?.data?.attachments[0]?.url : ''\" > </cometchat-audio-bubble>\n</ng-template>\n<ng-template #videoBubble let-message>\n <cometchat-icon-button [disabled]=\"true\" *ngIf=\"message?.category == callConstant && message?.type == MessageTypesConstant.video\" [iconURL]=\"getCallTypeIcon(message)\" [buttonStyle]=\"callStatusStyle(message)\" [text]=\"getCallActionMessage(message)\"></cometchat-icon-button>\n\n <cometchat-video-bubble *ngIf=\"!message.getDeletedAt() && message?.category != callConstant\" [videoStyle]=\"videoBubbleStyle\" [src]=\"message?.data?.attachments ? message?.data?.attachments[0]?.url : ''\" [poster]=\" getImageThumbnail(message)\"></cometchat-video-bubble>\n</ng-template>\n<ng-template #imageBubble let-message>\n <image-moderation (cc-show-dialog)=\"openWarningDialog($event)\" *ngIf=\"!message.getDeletedAt() && enableImageModeration\" [message]=\"message\" [imageModerationStyle]=\"imageModerationStyle\">\n <cometchat-image-bubble (cc-image-clicked)=\"openImageInFullScreen(message)\" [src]=\" getImageThumbnail(message)\" [placeholderImage]=\"placeholderIconURL\"></cometchat-image-bubble>\n </image-moderation>\n <cometchat-image-bubble (cc-image-clicked)=\"openImageInFullScreen(message)\" *ngIf=\"!message.getDeletedAt() && !enableImageModeration\" [src]=\" getImageThumbnail(message)\" [placeholderImage]=\"placeholderIconURL\"></cometchat-image-bubble>\n</ng-template>\n<ng-template #customTextBubble>\n</ng-template>\n<ng-template #stickerBubble let-message>\n <cometchat-image-bubble [src]=\"getSticker(message)\" [imageStyle]=\"imageBubbleStyle\" ></cometchat-image-bubble>\n\n</ng-template>\n<ng-template #whiteboardBubble let-message>\n <cometchat-document-bubble [hideSeparator]=\"false\" [iconAlignment]=\"documentBubbleAlignment\" [documentStyle]=\"documentBubbleStyle\" [URL]=\"getWhiteboardDocument(message)\" [ccClicked]=\"launchCollaborativeWhiteboardDocument\" [iconURL]=\"whiteboardIconURL\" [title]=\"whiteboardTitle\" [buttonText]=\"whiteboardButtonText\" [subtitle]=\"whiteboardSubitle\"></cometchat-document-bubble>\n\n</ng-template>\n<ng-template #documentBubble let-message>\n <cometchat-document-bubble [hideSeparator]=\"false\" [iconAlignment]=\"documentBubbleAlignment\" [documentStyle]=\"documentBubbleStyle\" [URL]=\"getWhiteboardDocument(message)\" [ccClicked]=\"launchCollaborativeWhiteboardDocument\" [iconURL]=\"documentIconURL\" [title]=\"documentTitle\" [buttonText]=\"documentButtonText\" [subtitle]=\"documentSubitle\"></cometchat-document-bubble>\n\n</ng-template>\n<ng-template #directCalling let-message>\n <cometchat-document-bubble [hideSeparator]=\"true\" [iconAlignment]=\"callBubbleAlignment\" [documentStyle]=\"getCallBubbleStyle(message)\" [URL]=\"getSessionId(message)\" [ccClicked]=\"startDirectCall\" [iconURL]=\"directCallIconURL\" [title]=\"getCallBubbleTitle(message)\" [buttonText]=\"joinCallButtonText\"></cometchat-document-bubble>\n\n</ng-template>\n<ng-template #pollBubble let-message>\n <polls-bubble [pollStyle]=\"pollBubbleStyle\" [pollQuestion]=\"getPollBubbleData(message,'question')\" [pollId]=\"getPollBubbleData(message,'id')\"\n [loggedInUser]=\"loggedInUser\" [senderUid]=\"getPollBubbleData(message)\" [metadata]=\"message?.metadata\"></polls-bubble>\n\n</ng-template>\n\n<!-- thread bubble view -->\n<ng-template #threadMessageBubble let-message>\n <div *ngIf=\"getBubbleWrapper(message)\">\n <ng-container *ngTemplateOutlet=\"getBubbleWrapper(message)\">\n </ng-container>\n </div>\n <cometchat-message-bubble *ngIf=\"!getBubbleWrapper(message)\" [bottomView]=\"enableReactions ? reactionView : null\" [leadingView]=\" showAvatar ? leadingView : null\" [headerView]=\"bubbleHeader\" [footerView]=\"footerView\"\n [contentView]=\"contentView\" [id]=\"message?.getId() || message?.getMuid()\" [messageBubbleStyle]=\"setMessageBubbleStyle(message)\" [alignment]=\"threadedAlignment\">\n <ng-template #contentView>\n <ng-container *ngTemplateOutlet=\"getContentView(message);context:{ $implicit: message }\" >\n </ng-container>\n </ng-template>\n <ng-template #reactionView>\n <reactions-view [messageObject]=\"message\" [alignment]=\"setBubbleAlignment(message)\"\n [loggedInUser]=\"loggedInUser\" [reactionsStyle]=\"reactionsStyle(message)\"></reactions-view>\n </ng-template>\n <ng-template #footerView>\n <div class=\"cc-message-list__bubble-footer\">\n <div *ngIf=\"getFooterView(message);else bubbleFooter\">\n <ng-container *ngTemplateOutlet=\"getFooterView(message);context:{ $implicit: message }\" >\n </ng-container>\n </div>\n <ng-template #bubbleFooter>\n <div class=\"cc-message-list__bubble-date\" *ngIf=\"timestampAlignment == timestampEnum.bottom && message?.getCategory() != MessageCategory.action && message?.getCategory() != MessageCategory.call\">\n <cometchat-date [timestamp]=\"message?.getSentAt()\" [dateStyle]=\"bubbleDateStyle\" [pattern]=\"datePattern\">\n </cometchat-date>\n </div>\n <div *ngIf=\" !message?.getDeletedAt() && !disableReceipt && (!message?.getSender() ||this.loggedInUser.getUid() == message?.getSender()?.getUid()) && message?.getCategory() != MessageCategory.action && message?.getCategory() != MessageCategory.call\" class=\"cc-message-list__receipt\">\n <cometchat-receipt [receipt]=\"getMessageReceipt(message)\" [receiptStyle]=\"receiptStyle\" [waitIcon]=\"waitIcon\" [sentIcon]=\"sentIcon\" [deliveredIcon]=\"\" [readIcon]=\"deliveredIcon\" [errorIcon]=\"errorIcon\"></cometchat-receipt>\n </div>\n </ng-template>\n </div>\n </ng-template>\n<ng-template #leadingView>\n<div *ngIf=\" message?.getCategory() != MessageCategory.action && showHeaderTitle(message)\" >\n<cometchat-avatar [name]=\"message?.getSender()?.getName()\" [style]=\"avatarStyle\" [image]=\"message?.getSender()?.getAvatar()\">\n</cometchat-avatar>\n</div>\n</ng-template>\n<ng-template #bubbleHeader>\n<div *ngIf=\"getHeaderView(message);else defaultHeader\">\n<ng-container *ngTemplateOutlet=\"getHeaderView(message);context:{ $implicit: message }\" >\n</ng-container>\n</div>\n<ng-template #defaultHeader>\n<div class=\"cc-message-list__bubble-header\" *ngIf=\"message?.getCategory() != MessageCategory.action && showHeaderTitle(message) && message?.getCategory() != MessageCategory.call\">\n<cometchat-label [text]=\"message?.getSender()?.getName()\" [labelStyle]=\"labelStyle\"></cometchat-label>\n<cometchat-date [pattern]=\"datePattern\" [timestamp]=\"message?.getSentAt()\" [style]=\"bubbleDateStyle\" *ngIf=\"timestampAlignment == timestampEnum.top\"></cometchat-date>\n</div>\n</ng-template>\n</ng-template>\n </cometchat-message-bubble>\n\n</ng-template>\n\n\n<!-- -->\n<ng-template #bubbleView></ng-template>\n<cometchat-popover [popoverStyle]=\"popoverStyle\" #popoverRef [placement]=\"keyboardAlignment\">\n<cometchat-emoji-keyboard (cc-emoji-clicked)=\"addReaction($event)\" slot=\"content\"></cometchat-emoji-keyboard>\n</cometchat-popover>\n<cometchat-backdrop *ngIf=\"openConfirmDialog\" [backdropStyle]=\"backdropStyle\">\n <cometchat-confirm-dialog [title]=\"''\" [messageText]=\"warningText\" (cc-confirm-clicked)=\"onConfirmClick()\" [cancelButtonText]=\"cancelText\" [confirmButtonText]=\"confirmText\" (cc-cancel-clicked)=\"onCancelClick()\" [confirmDialogStyle]=\"confirmDialogStyle\">\n\n </cometchat-confirm-dialog>\n</cometchat-backdrop>\n<full-screen-viewer (cc-close-clicked)=\"closeImageInFullScreen()\" *ngIf=\"openFullscreenView\" [URL]=\"imageurlToOpen\" [closeIconURL]=\"closeIconURL\" [fullScreenViewerStyle]=\"fullScreenViewerStyle\">\n\n</full-screen-viewer>\n\n<!-- ongoing callscreen for direct call -->\n<cometchat-ongoing-call *ngIf=\"showOngoingCall\" [ongoingCallStyle]=\"ongoingCallStyle\" [sessionID]=\"sessionId\"></cometchat-ongoing-call>\n", styles: [".cc-message-list{height:100%;width:100%;overflow-y:auto;position:relative}.cc-message-list__wrapper{height:100%;width:100%;padding:8px;overflow-y:hidden}.cc-message-list__bubble-footer{display:flex;justify-content:center;align-items:center}.cc-message-list__date-container{text-align:center;margin:5px 0}.cc-message-list__smart-replies{height:-moz-fit-content;height:fit-content;width:100%;position:absolute;bottom:0}.cc-message-list__date{border-radius:10px}.cc-message-list__threadreplies{min-width:130px;width:100%}.cc-message-list__message-indicator{height:25px;display:flex;align-items:center;justify-content:center;width:100%;bottom:0%;position:absolute}.cc-message-list__footer-view{z-index:2;position:relative;width:100%}.cc-message-list__decorator-message{margin:0;line-height:30px;word-wrap:break-word;padding:0 8px;width:100%;overflow:hidden;display:flex;align-items:center;justify-content:center;height:100%}.cc-message-list::-webkit-scrollbar{background:transparent;width:8px}.cc-message-list::-webkit-scrollbar-thumb{background:#e8e5e5;border-radius:8px}\n"], components: [{ type: i2.CometChatMessageBubbleComponent, selector: "cometchat-message-bubble", inputs: ["messageBubbleStyle", "alignment", "options", "id", "leadingView", "headerView", "replyView", "contentView", "threadView", "footerView", "bottomView", "moreIconURL", "topMenuSize"] }, { type: i3.CometChatOngoingCallComponent, selector: "cometchat-ongoing-call", inputs: ["ongoingCallStyle", "resizeIconHoverText", "sessionID", "minimizeIconURL", "maximizeIconURL", "callSettingsBuilder"] }], directives: [{ type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2477
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: CometChatMessageListComponent, decorators: [{
2478
+ type: Component,
2479
+ args: [{ selector: "cometchat-message-list", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cc-message-list__wrapper\" [ngStyle]=\"wrapperStyle()\">\n <div class=\"cc-message-list__header-view\">\n<div *ngIf=\"headerView\">\n <ng-container *ngTemplateOutlet=\"headerView\">\n </ng-container>\n</div>\n </div>\n <div class=\"cc-message-list\" #listScroll>\n <div class=\"cc-message-list__top\" #top>\n </div>\n <div class=\"cc-message-list__decorator-message\" *ngIf=\"state == states.loading || state == states.error || state == states.empty \"\n [ngStyle]=\"messageContainerStyle()\">\n <div class=\"cc-message-list__loading-view\" *ngIf=\"state == states.loading \">\n <cometchat-loader [iconURL]=\"loadingIconURL\" [loaderStyle]=\"loadingStyle()\">\n </cometchat-loader>\n <span class=\"cc-message-list__customview--loading\" *ngIf=\"state == states.loading && loadingStateView\">\n <ng-container *ngTemplateOutlet=\"loadingStateView\">\n </ng-container>\n </span>\n </div>\n <div class=\"cc-message-list__error-view\" *ngIf=\"state == states.error && !hideError \">\n <cometchat-label [labelStyle]=\"errorStyle()\" *ngIf=\"state == states.error && !hideError && !errorStateView\" [text]=\"errorStateText\"\n >\n </cometchat-label>\n <span class=\"cc-message-list__custom-view--error\" *ngIf=\"state == states.error && !hideError && errorStateView\">\n <ng-container *ngTemplateOutlet=\"errorStateView\">\n </ng-container>\n </span>\n </div>\n <div class=\"cc-message-list__empty-view\" *ngIf=\"state == states.empty\">\n <cometchat-label [labelStyle]=\"emptyStyle()\" *ngIf=\"state == states.empty && !emptyStateView\" [text]=\"emptyStateText\"\n >\n </cometchat-label>\n <span class=\"cc-message-list__custom-view--empty\" *ngIf=\"state == states.empty && emptyStateView\">\n <ng-container *ngTemplateOutlet=\"emptyStateView\">\n </ng-container>\n </span>\n </div>\n </div>\n <div class=\"cc-message-list__bubble\" *ngFor=\"let message of messagesList; let i = index\">\n <div class=\"cc-message-list__date-container\" *ngIf=\"(i === 0)\">\n <span class=\"cc-message-list__date\" >\n <cometchat-date [timestamp]=\"message!.getSentAt()\" [pattern]=\"DateSeparatorPattern\" [dateStyle]=\"dateSeparatorStyle\"\n >\n </cometchat-date>\n </span>\n </div>\n <div class=\"cc-message-list__date-container\" *ngIf=\"(i > 0 && isDateDifferent(messagesList[i - 1]?.getSentAt(), messagesList[i]?.getSentAt()))\n \">\n <span class=\"cc-message-list__date\" >\n <cometchat-date [timestamp]=\"message?.getSentAt()\" [pattern]=\"DateSeparatorPattern\" [dateStyle]=\"dateSeparatorStyle\"\n >\n </cometchat-date>\n </span>\n </div>\n <div *ngIf=\"getBubbleWrapper(message) \">\n <ng-container *ngTemplateOutlet=\"getBubbleWrapper(message)\">\n </ng-container>\n </div>\n <div>\n <cometchat-message-bubble *ngIf=\"!getBubbleWrapper(message)\" [leadingView]=\" showAvatar ? leadingView : null\" [bottomView]=\"enableReactions ? reactionView : null\"\n [headerView]=\"getHeaderView(message) || message?.getCategory() != MessageCategory.action && showHeaderTitle(message) ? bubbleHeader : null\" [footerView]=\"footerView\" [contentView]=\"contentView\" [threadView]=\"threadView\"\n [id]=\"message?.getId() || message?.getMuid()\" [options]=\"setMessageOptions(message)\"\n [messageBubbleStyle]=\"setMessageBubbleStyle(message)\" [alignment]=\"setBubbleAlignment(message)\">\n <ng-template #contentView>\n <ng-container *ngTemplateOutlet=\"getContentView(message);context:{ $implicit: message }\" >\n </ng-container>\n </ng-template>\n <ng-template #reactionView>\n <reactions-view [messageObject]=\"message\" [alignment]=\"setBubbleAlignment(message)\"\n [loggedInUser]=\"loggedInUser\" [reactionsStyle]=\"reactionsStyle(message)\"></reactions-view>\n </ng-template>\n <ng-template #footerView>\n <div class=\"cc-message-list__bubble-footer\">\n <div *ngIf=\"getFooterView(message);else bubbleFooter\">\n <ng-container *ngTemplateOutlet=\"getFooterView(message);context:{ $implicit: message }\" >\n </ng-container>\n </div>\n <ng-template #bubbleFooter>\n <div class=\"cc-message-list__bubble-date\" *ngIf=\"timestampAlignment == timestampEnum.bottom && message?.getCategory() != MessageCategory.action && !message.getDeletedAt() && message?.getCategory() != MessageCategory.call\">\n <cometchat-date [timestamp]=\"message?.getSentAt()\" [dateStyle]=\"bubbleDateStyle\" [pattern]=\"datePattern\">\n </cometchat-date>\n </div>\n <div *ngIf=\" !message?.getDeletedAt() && !disableReceipt && (!message?.getSender() ||this.loggedInUser.getUid() == message?.getSender()?.getUid()) && message?.getCategory() != MessageCategory.action && message?.getCategory() != MessageCategory.call\" class=\"cc-message-list__receipt\">\n <cometchat-receipt [receipt]=\"getMessageReceipt(message)\" [receiptStyle]=\"receiptStyle\" [waitIcon]=\"waitIcon\" [sentIcon]=\"sentIcon\" [deliveredIcon]=\"deliveredIcon\" [readIcon]=\"readIcon\" [errorIcon]=\"errorIcon\"></cometchat-receipt>\n </div>\n </ng-template>\n </div>\n </ng-template>\n<ng-template #leadingView>\n <div *ngIf=\" message?.getCategory() != MessageCategory.action && showHeaderTitle(message)\" >\n <cometchat-avatar [name]=\"message?.getSender()?.getName()\" [style]=\"avatarStyle\" [image]=\"message?.getSender()?.getAvatar()\">\n </cometchat-avatar>\n </div>\n</ng-template>\n<ng-template #bubbleHeader>\n <div *ngIf=\"getHeaderView(message);else defaultHeader\">\n <ng-container *ngTemplateOutlet=\"getHeaderView(message);context:{ $implicit: message }\" >\n </ng-container>\n </div>\n<ng-template #defaultHeader>\n <div class=\"cc-message-list__bubble-header\" *ngIf=\"message?.getCategory() != MessageCategory.action && showHeaderTitle(message) && message?.getCategory() != MessageCategory.call\">\n <cometchat-label [text]=\"message?.getSender()?.getName()\" [labelStyle]=\"labelStyle\"></cometchat-label>\n <cometchat-date [pattern]=\"datePattern\" [timestamp]=\"message?.getSentAt()\" [style]=\"bubbleDateStyle\" *ngIf=\"timestampAlignment == timestampEnum.top\"></cometchat-date>\n </div>\n</ng-template>\n</ng-template>\n<ng-template #threadView>\n <div class=\"cc-message-list__threadreplies\" *ngIf=\"message?.getReplyCount() && !message.getDeletedAt()\" >\n <cometchat-divider [dividerStyle]=\"dividerStyle\"></cometchat-divider>\n <cometchat-button [text]=\"getThreadCount(message)\" [buttonStyle]=\"getThreadViewStyle(message)\" [iconURL]=\"threadOpenIcon\" (cc-button-clicked)=\"openThreadView(message)\">\n </cometchat-button>\n </div>\n</ng-template>\n </cometchat-message-bubble>\n </div>\n </div>\n <div class=\"cc-message-list__bottom\" #bottom>\n </div>\n </div>\n <div class=\"cc-message-list__footer-view\">\n <div *ngIf=\"footerView;else footer\">\n <ng-container *ngTemplateOutlet=\"footerView\">\n </ng-container>\n </div>\n <ng-template #footer>\n <div class=\"cc-message-list__smart-replies\" *ngIf=\"showSmartReply && getReplies() && (!UnreadCount || UnreadCount.length == 0)\">\n <smart-replies [smartReplyStyle]=\"smartReplyStyle\" [replies]=\"getReplies()\" (cc-reply-clicked)=\"sendReply($event)\" (cc-close-clicked)=\"closeSmartReply()\">\n </smart-replies>\n </div>\n<div class=\"cc-message-list__message-indicator\" *ngIf=\"UnreadCount && UnreadCount.length > 0 && !isOnBottom\">\n <cometchat-button [text]=\"newMessageCount\" [buttonStyle]=\"unreadMessagesStyle\" (cc-button-clicked)=\"scrollToBottom()\"></cometchat-button>\n</div>\n </ng-template>\n </div>\n\n</div>\n<!-- default bubbles -->\n<ng-template #textBubble let-message>\n <cometchat-text-bubble *ngIf=\"message?.type == MessageTypesConstant.groupMember\" [textStyle]=\"setTextBubbleStyle(message)\" [text]=\"message?.message\"></cometchat-text-bubble>\n <cometchat-text-bubble *ngIf=\"message?.getDeletedAt()\" [textStyle]=\"setTextBubbleStyle(message)\" [text]=\"localize('MESSAGE_IS_DELETED')\"></cometchat-text-bubble>\n<cometchat-text-bubble *ngIf=\"!isTranslated(message) && !getLinkPreview(message) && !message?.deletedAt && message?.type != MessageTypesConstant.groupMember\" [textStyle]=\"setTextBubbleStyle(message)\" [text]=\"getTextMessage(message)\"></cometchat-text-bubble>\n<link-preview [linkPreviewStyle]=\"linkPreviewStyle\" (cc-link-clicked)=\"openLinkURL($event)\" *ngIf=\"!message?.getDeletedAt() && getLinkPreview(message) && enableLinkPreview\" [title]=\"getLinkPreviewDetails('title',message)\" [description]=\"getLinkPreviewDetails('description',message)\" [URL]=\"getLinkPreviewDetails('url',message)\" [image]=\"getLinkPreviewDetails('image',message)\" [favIconURL]=\"getLinkPreviewDetails('favicon',message)\">\n <cometchat-text-bubble\n *ngIf=\"!isTranslated(message) && getLinkPreview(message) && !message?.deletedAt && message?.type != MessageTypesConstant.groupMember\"\n [textStyle]=\"setTextBubbleStyle(message)\" [text]=\"getTextMessage(message)\"></cometchat-text-bubble>\n</link-preview>\n<message-translation-bubble [alignment]=\"getBubbleAlignment(message)\" *ngIf=\"isTranslated(message)\" [messageTranslationStyle]=\"setTranslationStyle(message)\" [translatedText]=\"isTranslated(message)\">\n <cometchat-text-bubble *ngIf=\" !message?.deletedAt && message?.type != MessageTypesConstant.groupMember\" [textStyle]=\"setTextBubbleStyle(message)\" [text]=\"message?.text\"></cometchat-text-bubble>\n\n</message-translation-bubble>\n</ng-template>\n<ng-template #fileBubble let-message>\n\n <cometchat-file-bubble [fileStyle]=\"setFileBubbleStyle(message)\" [downloadIconURL]=\"downloadIconURL\" [subtitle]=\"localize('SHARED_FILE')\" [title]=\"message?.data?.attachments ? message?.data?.attachments[0]?.name: ''\" [fileURL]=\"message?.data?.attachments ? message?.data?.attachments[0]?.url : ''\"></cometchat-file-bubble>\n</ng-template>\n<ng-template #audioBubble let-message>\n <cometchat-icon-button [disabled]=\"true\" *ngIf=\"message?.category == callConstant && message?.type == MessageTypesConstant.audio\" [iconURL]=\"getCallTypeIcon(message)\" [buttonStyle]=\"callStatusStyle(message)\" [text]=\"getCallActionMessage(message)\"></cometchat-icon-button>\n <cometchat-audio-bubble *ngIf=\"!message.getDeletedAt() && message?.category != callConstant\" [src]=\"message?.data?.attachments ? message?.data?.attachments[0]?.url : ''\" > </cometchat-audio-bubble>\n</ng-template>\n<ng-template #videoBubble let-message>\n <cometchat-icon-button [disabled]=\"true\" *ngIf=\"message?.category == callConstant && message?.type == MessageTypesConstant.video\" [iconURL]=\"getCallTypeIcon(message)\" [buttonStyle]=\"callStatusStyle(message)\" [text]=\"getCallActionMessage(message)\"></cometchat-icon-button>\n\n <cometchat-video-bubble *ngIf=\"!message.getDeletedAt() && message?.category != callConstant\" [videoStyle]=\"videoBubbleStyle\" [src]=\"message?.data?.attachments ? message?.data?.attachments[0]?.url : ''\" [poster]=\" getImageThumbnail(message)\"></cometchat-video-bubble>\n</ng-template>\n<ng-template #imageBubble let-message>\n <image-moderation (cc-show-dialog)=\"openWarningDialog($event)\" *ngIf=\"!message.getDeletedAt() && enableImageModeration\" [message]=\"message\" [imageModerationStyle]=\"imageModerationStyle\">\n <cometchat-image-bubble (cc-image-clicked)=\"openImageInFullScreen(message)\" [src]=\" getImageThumbnail(message)\" [placeholderImage]=\"placeholderIconURL\"></cometchat-image-bubble>\n </image-moderation>\n <cometchat-image-bubble (cc-image-clicked)=\"openImageInFullScreen(message)\" *ngIf=\"!message.getDeletedAt() && !enableImageModeration\" [src]=\" getImageThumbnail(message)\" [placeholderImage]=\"placeholderIconURL\"></cometchat-image-bubble>\n</ng-template>\n<ng-template #customTextBubble>\n</ng-template>\n<ng-template #stickerBubble let-message>\n <cometchat-image-bubble [src]=\"getSticker(message)\" [imageStyle]=\"imageBubbleStyle\" ></cometchat-image-bubble>\n\n</ng-template>\n<ng-template #whiteboardBubble let-message>\n <cometchat-document-bubble [hideSeparator]=\"false\" [iconAlignment]=\"documentBubbleAlignment\" [documentStyle]=\"documentBubbleStyle\" [URL]=\"getWhiteboardDocument(message)\" [ccClicked]=\"launchCollaborativeWhiteboardDocument\" [iconURL]=\"whiteboardIconURL\" [title]=\"whiteboardTitle\" [buttonText]=\"whiteboardButtonText\" [subtitle]=\"whiteboardSubitle\"></cometchat-document-bubble>\n\n</ng-template>\n<ng-template #documentBubble let-message>\n <cometchat-document-bubble [hideSeparator]=\"false\" [iconAlignment]=\"documentBubbleAlignment\" [documentStyle]=\"documentBubbleStyle\" [URL]=\"getWhiteboardDocument(message)\" [ccClicked]=\"launchCollaborativeWhiteboardDocument\" [iconURL]=\"documentIconURL\" [title]=\"documentTitle\" [buttonText]=\"documentButtonText\" [subtitle]=\"documentSubitle\"></cometchat-document-bubble>\n\n</ng-template>\n<ng-template #directCalling let-message>\n <cometchat-document-bubble [hideSeparator]=\"true\" [iconAlignment]=\"callBubbleAlignment\" [documentStyle]=\"getCallBubbleStyle(message)\" [URL]=\"getSessionId(message)\" [ccClicked]=\"startDirectCall\" [iconURL]=\"directCallIconURL\" [title]=\"getCallBubbleTitle(message)\" [buttonText]=\"joinCallButtonText\"></cometchat-document-bubble>\n\n</ng-template>\n<ng-template #pollBubble let-message>\n <polls-bubble [pollStyle]=\"pollBubbleStyle\" [pollQuestion]=\"getPollBubbleData(message,'question')\" [pollId]=\"getPollBubbleData(message,'id')\"\n [loggedInUser]=\"loggedInUser\" [senderUid]=\"getPollBubbleData(message)\" [metadata]=\"message?.metadata\"></polls-bubble>\n\n</ng-template>\n\n<!-- thread bubble view -->\n<ng-template #threadMessageBubble let-message>\n <div *ngIf=\"getBubbleWrapper(message)\">\n <ng-container *ngTemplateOutlet=\"getBubbleWrapper(message)\">\n </ng-container>\n </div>\n <cometchat-message-bubble *ngIf=\"!getBubbleWrapper(message)\" [bottomView]=\"enableReactions ? reactionView : null\" [leadingView]=\" showAvatar ? leadingView : null\" [headerView]=\"bubbleHeader\" [footerView]=\"footerView\"\n [contentView]=\"contentView\" [id]=\"message?.getId() || message?.getMuid()\" [messageBubbleStyle]=\"setMessageBubbleStyle(message)\" [alignment]=\"threadedAlignment\">\n <ng-template #contentView>\n <ng-container *ngTemplateOutlet=\"getContentView(message);context:{ $implicit: message }\" >\n </ng-container>\n </ng-template>\n <ng-template #reactionView>\n <reactions-view [messageObject]=\"message\" [alignment]=\"setBubbleAlignment(message)\"\n [loggedInUser]=\"loggedInUser\" [reactionsStyle]=\"reactionsStyle(message)\"></reactions-view>\n </ng-template>\n <ng-template #footerView>\n <div class=\"cc-message-list__bubble-footer\">\n <div *ngIf=\"getFooterView(message);else bubbleFooter\">\n <ng-container *ngTemplateOutlet=\"getFooterView(message);context:{ $implicit: message }\" >\n </ng-container>\n </div>\n <ng-template #bubbleFooter>\n <div class=\"cc-message-list__bubble-date\" *ngIf=\"timestampAlignment == timestampEnum.bottom && message?.getCategory() != MessageCategory.action && message?.getCategory() != MessageCategory.call\">\n <cometchat-date [timestamp]=\"message?.getSentAt()\" [dateStyle]=\"bubbleDateStyle\" [pattern]=\"datePattern\">\n </cometchat-date>\n </div>\n <div *ngIf=\" !message?.getDeletedAt() && !disableReceipt && (!message?.getSender() ||this.loggedInUser.getUid() == message?.getSender()?.getUid()) && message?.getCategory() != MessageCategory.action && message?.getCategory() != MessageCategory.call\" class=\"cc-message-list__receipt\">\n <cometchat-receipt [receipt]=\"getMessageReceipt(message)\" [receiptStyle]=\"receiptStyle\" [waitIcon]=\"waitIcon\" [sentIcon]=\"sentIcon\" [deliveredIcon]=\"\" [readIcon]=\"deliveredIcon\" [errorIcon]=\"errorIcon\"></cometchat-receipt>\n </div>\n </ng-template>\n </div>\n </ng-template>\n<ng-template #leadingView>\n<div *ngIf=\" message?.getCategory() != MessageCategory.action && showHeaderTitle(message)\" >\n<cometchat-avatar [name]=\"message?.getSender()?.getName()\" [style]=\"avatarStyle\" [image]=\"message?.getSender()?.getAvatar()\">\n</cometchat-avatar>\n</div>\n</ng-template>\n<ng-template #bubbleHeader>\n<div *ngIf=\"getHeaderView(message);else defaultHeader\">\n<ng-container *ngTemplateOutlet=\"getHeaderView(message);context:{ $implicit: message }\" >\n</ng-container>\n</div>\n<ng-template #defaultHeader>\n<div class=\"cc-message-list__bubble-header\" *ngIf=\"message?.getCategory() != MessageCategory.action && showHeaderTitle(message) && message?.getCategory() != MessageCategory.call\">\n<cometchat-label [text]=\"message?.getSender()?.getName()\" [labelStyle]=\"labelStyle\"></cometchat-label>\n<cometchat-date [pattern]=\"datePattern\" [timestamp]=\"message?.getSentAt()\" [style]=\"bubbleDateStyle\" *ngIf=\"timestampAlignment == timestampEnum.top\"></cometchat-date>\n</div>\n</ng-template>\n</ng-template>\n </cometchat-message-bubble>\n\n</ng-template>\n\n\n<!-- -->\n<ng-template #bubbleView></ng-template>\n<cometchat-popover [popoverStyle]=\"popoverStyle\" #popoverRef [placement]=\"keyboardAlignment\">\n<cometchat-emoji-keyboard (cc-emoji-clicked)=\"addReaction($event)\" slot=\"content\"></cometchat-emoji-keyboard>\n</cometchat-popover>\n<cometchat-backdrop *ngIf=\"openConfirmDialog\" [backdropStyle]=\"backdropStyle\">\n <cometchat-confirm-dialog [title]=\"''\" [messageText]=\"warningText\" (cc-confirm-clicked)=\"onConfirmClick()\" [cancelButtonText]=\"cancelText\" [confirmButtonText]=\"confirmText\" (cc-cancel-clicked)=\"onCancelClick()\" [confirmDialogStyle]=\"confirmDialogStyle\">\n\n </cometchat-confirm-dialog>\n</cometchat-backdrop>\n<full-screen-viewer (cc-close-clicked)=\"closeImageInFullScreen()\" *ngIf=\"openFullscreenView\" [URL]=\"imageurlToOpen\" [closeIconURL]=\"closeIconURL\" [fullScreenViewerStyle]=\"fullScreenViewerStyle\">\n\n</full-screen-viewer>\n\n<!-- ongoing callscreen for direct call -->\n<cometchat-ongoing-call *ngIf=\"showOngoingCall\" [ongoingCallStyle]=\"ongoingCallStyle\" [sessionID]=\"sessionId\"></cometchat-ongoing-call>\n", styles: [".cc-message-list{height:100%;width:100%;overflow-y:auto;position:relative}.cc-message-list__wrapper{height:100%;width:100%;padding:8px;overflow-y:hidden}.cc-message-list__bubble-footer{display:flex;justify-content:center;align-items:center}.cc-message-list__date-container{text-align:center;margin:5px 0}.cc-message-list__smart-replies{height:-moz-fit-content;height:fit-content;width:100%;position:absolute;bottom:0}.cc-message-list__date{border-radius:10px}.cc-message-list__threadreplies{min-width:130px;width:100%}.cc-message-list__message-indicator{height:25px;display:flex;align-items:center;justify-content:center;width:100%;bottom:0%;position:absolute}.cc-message-list__footer-view{z-index:2;position:relative;width:100%}.cc-message-list__decorator-message{margin:0;line-height:30px;word-wrap:break-word;padding:0 8px;width:100%;overflow:hidden;display:flex;align-items:center;justify-content:center;height:100%}.cc-message-list::-webkit-scrollbar{background:transparent;width:8px}.cc-message-list::-webkit-scrollbar-thumb{background:#e8e5e5;border-radius:8px}\n"] }]
2480
+ }], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: i1.CometChatThemeService }]; }, propDecorators: { listScroll: [{
2481
+ type: ViewChild,
2482
+ args: ["listScroll", { static: false }]
2483
+ }], bottom: [{
2484
+ type: ViewChild,
2485
+ args: ["bottom", { static: false }]
2486
+ }], top: [{
2487
+ type: ViewChild,
2488
+ args: ["top", { static: false }]
2489
+ }], textBubble: [{
2490
+ type: ViewChild,
2491
+ args: ["textBubble", { static: false }]
2492
+ }], threadMessageBubble: [{
2493
+ type: ViewChild,
2494
+ args: ["threadMessageBubble", { static: false }]
2495
+ }], fileBubble: [{
2496
+ type: ViewChild,
2497
+ args: ["fileBubble", { static: false }]
2498
+ }], audioBubble: [{
2499
+ type: ViewChild,
2500
+ args: ["audioBubble", { static: false }]
2501
+ }], videoBubble: [{
2502
+ type: ViewChild,
2503
+ args: ["videoBubble", { static: false }]
2504
+ }], imageBubble: [{
2505
+ type: ViewChild,
2506
+ args: ["imageBubble", { static: false }]
2507
+ }], stickerBubble: [{
2508
+ type: ViewChild,
2509
+ args: ["stickerBubble", { static: false }]
2510
+ }], documentBubble: [{
2511
+ type: ViewChild,
2512
+ args: ["documentBubble", { static: false }]
2513
+ }], whiteboardBubble: [{
2514
+ type: ViewChild,
2515
+ args: ["whiteboardBubble", { static: false }]
2516
+ }], popoverRef: [{
2517
+ type: ViewChild,
2518
+ args: ["popoverRef", { static: false }]
2519
+ }], directCalling: [{
2520
+ type: ViewChild,
2521
+ args: ["directCalling", { static: false }]
2522
+ }], pollBubble: [{
2523
+ type: ViewChild,
2524
+ args: ["pollBubble", { static: false }]
2525
+ }], hideError: [{
2526
+ type: Input
2527
+ }], errorStateView: [{
2528
+ type: Input
2529
+ }], loadingStateView: [{
2530
+ type: Input
2531
+ }], emptyStateView: [{
2532
+ type: Input
2533
+ }], errorStateText: [{
2534
+ type: Input
2535
+ }], emptyStateText: [{
2536
+ type: Input
2537
+ }], loadingIconURL: [{
2538
+ type: Input
2539
+ }], user: [{
2540
+ type: Input
2541
+ }], group: [{
2542
+ type: Input
2543
+ }], disableReceipt: [{
2544
+ type: Input
2545
+ }], disableSoundForMessages: [{
2546
+ type: Input
2547
+ }], customSoundForMessages: [{
2548
+ type: Input
2549
+ }], readIcon: [{
2550
+ type: Input
2551
+ }], deliveredIcon: [{
2552
+ type: Input
2553
+ }], sentIcon: [{
2554
+ type: Input
2555
+ }], waitIcon: [{
2556
+ type: Input
2557
+ }], errorIcon: [{
2558
+ type: Input
2559
+ }], alignment: [{
2560
+ type: Input
2561
+ }], showAvatar: [{
2562
+ type: Input
2563
+ }], datePattern: [{
2564
+ type: Input
2565
+ }], timestampAlignment: [{
2566
+ type: Input
2567
+ }], DateSeparatorPattern: [{
2568
+ type: Input
2569
+ }], templates: [{
2570
+ type: Input
2571
+ }], messagesRequestBuilder: [{
2572
+ type: Input
2573
+ }], newMessageIndicatorText: [{
2574
+ type: Input
2575
+ }], scrollToBottomOnNewMessages: [{
2576
+ type: Input
2577
+ }], thresholdValue: [{
2578
+ type: Input
2579
+ }], onThreadRepliesClick: [{
2580
+ type: Input
2581
+ }], headerView: [{
2582
+ type: Input
2583
+ }], footerView: [{
2584
+ type: Input
2585
+ }], parentMessageId: [{
2586
+ type: Input
2587
+ }], avatarStyle: [{
2588
+ type: Input
2589
+ }], backdropStyle: [{
2590
+ type: Input
2591
+ }], dateSeparatorStyle: [{
2592
+ type: Input
2593
+ }], messageListStyle: [{
2594
+ type: Input
2595
+ }], onError: [{
2596
+ type: Input
2597
+ }] } });
2598
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tZXRjaGF0LW1lc3NhZ2UtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGF0LXVpa2l0LWFuZ3VsYXIvc3JjL0NvbWV0Q2hhdE1lc3NhZ2VMaXN0L2NvbWV0Y2hhdC1tZXNzYWdlLWxpc3QvY29tZXRjaGF0LW1lc3NhZ2UtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGF0LXVpa2l0LWFuZ3VsYXIvc3JjL0NvbWV0Q2hhdE1lc3NhZ2VMaXN0L2NvbWV0Y2hhdC1tZXNzYWdlLWxpc3QvY29tZXRjaGF0LW1lc3NhZ2UtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFLTCxTQUFTLEVBQ1QsdUJBQXVCLEdBT3hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVoRCxPQUFPLEVBQUMsU0FBUyxFQUFDLFdBQVcsRUFBaUIsWUFBWSxFQUE0RSxNQUFNLDJCQUEyQixDQUFBO0FBRXZLLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBNEIscUJBQXFCLEVBQUMsdUJBQXVCLEVBQUUsY0FBYyxFQUFFLHNCQUFzQixFQUEwQixVQUFVLEVBQUUsc0JBQXNCLEVBQUUsYUFBYSxFQUFFLG9CQUFvQixFQUFnRyxpQkFBaUIsRUFBRSxTQUFTLEVBQVUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNqZSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsbUJBQW1CLEVBQUUsZ0NBQWdDLEVBQUUsOEJBQThCLEVBQUUsMkJBQTJCLEVBQUUsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQXdGLHFCQUFxQixFQUFFLDRCQUE0QixFQUFF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O2dCQUlHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFlRyxPQUFPO3NCQUFmLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIFZpZXdDaGlsZCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFJlbmRlcmVyMixcbiAgQXBwbGljYXRpb25SZWYsXG4gIE5nWm9uZSxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IENvbWV0Q2hhdCB9IGZyb20gXCJAY29tZXRjaGF0LXByby9jaGF0XCI7XG5pbXBvcnQgeyAgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7RGF0ZVN0eWxlLEF2YXRhclN0eWxlLCBNZW51TGlzdFN0eWxlLCBSZWNlaXB0U3R5bGUsIEJhc2VTdHlsZSwgRG9jdW1lbnRCdWJibGVTdHlsZSwgQ29uZmlybURpYWxvZ1N0eWxlLCBGdWxsU2NyZWVuVmlld2VyU3R5bGV9IGZyb20gJ0Bjb21ldGNoYXQvdWlraXQtZWxlbWVudHMnXG5pbXBvcnQgeyBDb21ldENoYXRUaGVtZVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vQ29tZXRDaGF0VGhlbWUuc2VydmljZVwiO1xuaW1wb3J0IHsgU3RhdGVzLCBsb2NhbGl6ZSwgTWVzc2FnZUxpc3RBbGlnbm1lbnQsIERhdGVQYXR0ZXJucywgVGltZXN0YW1wQWxpZ25tZW50LCBDb21ldENoYXRNZXNzYWdlVGVtcGxhdGUsIERvY3VtZW50SWNvbkFsaWdubWVudCxDb21ldENoYXRVSUtpdENvbnN0YW50cywgQ29tZXRDaGF0VGhlbWUsIE1lc3NhZ2VCdWJibGVBbGlnbm1lbnQsIENvbWV0Q2hhdE1lc3NhZ2VPcHRpb24sIGZvbnRIZWxwZXIsIENvbWV0Q2hhdE1lc3NhZ2VFdmVudHMsIE1lc3NhZ2VTdGF0dXMsIENvbWV0Q2hhdEdyb3VwRXZlbnRzLCBJR3JvdXBNZW1iZXJBZGRlZCwgSUdyb3VwTWVtYmVyS2lja2VkQmFubmVkLCBJR3JvdXBNZW1iZXJTY29wZUNoYW5nZWQsIElHcm91cExlZnQsIElNZXNzYWdlcywgQ29tZXRDaGF0VUlFdmVudHMsIFBsYWNlbWVudCwgSVBhbmVsLCBDb21ldENoYXRDYWxsRXZlbnRzIH0gZnJvbSBcIkBjb21ldGNoYXQvdWlraXQtcmVzb3VyY2VzXCI7XG5pbXBvcnQgeyBNZXNzYWdlTGlzdFN0eWxlLCBDb21ldENoYXRTb3VuZE1hbmFnZXIsIE1lc3NhZ2VSZWNlaXB0VXRpbHMsIENvbGxhYm9yYXRpdmVXaGl0ZWJvYXJkQ29uc3RhbnRzLCBDb2xsYWJvcmF0aXZlRG9jdW1lbnRDb25zdGFudHMsIE1lc3NhZ2VUcmFuc2xhdGlvbkNvbnN0YW50cywgTWVzc2FnZVRyYW5zbGF0aW9uU3R5bGUsIFJlYWN0aW9uc0NvbnN0YW50cywgUG9sbHNCdWJibGVTdHlsZSwgSW1hZ2VNb2RlcmF0aW9uU3R5bGUsIFNtYXJ0UmVwbGllc1N0eWxlLCBTbWFydFJlcGxpZXNDb25maWd1cmF0aW9uLCBTbWFydFJlcGxpZXNDb25zdGFudHMsIFRodW1ibmFpbEdlbmVyYXRpb25Db25zdGFudHMsIExpbmtQcmV2aWV3Q29uc3RhbnRzLCBDYWxsc2NyZWVuU3R5bGUsIENhbGxpbmdEZXRhaWxzVXRpbHMgLENvbWV0Q2hhdFVJS2l0VXRpbGl0eSwgQ29tZXRDaGF0VUlLaXRIZWxwZXJ9IGZyb20gXCJAY29tZXRjaGF0L3Vpa2l0LXNoYXJlZFwiO1xuaW1wb3J0IHsgQ2hhdENvbmZpZ3VyYXRvciB9IGZyb20gXCIuLi8uLi9TaGFyZWQvRnJhbWV3b3JrL0NoYXRDb25maWd1cmF0b3JcIjtcbmltcG9ydCB7IFN0aWNrZXJzQ29uc3RhbnRzLExpbmtQcmV2aWV3U3R5bGUgfSBmcm9tIFwiQGNvbWV0Y2hhdC91aWtpdC1zaGFyZWRcIjtcbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tIFwiQGFuZ3VsYXIvY29tcGlsZXIvc3JjL2kxOG4vaTE4bl9hc3RcIjtcblxuXG4vKipcbipcbiogQ29tZXRDaGF0TWVzc2FnZUxpc3QgaXMgYSB3cmFwcGVyIGNvbXBvbmVudCBmb3IgbWVzc2FnZUJ1YmJsZVxuKlxuKiBAdmVyc2lvbiAxLjAuMFxuKiBAYXV0aG9yIENvbWV0Q2hhdFRlYW1cbiogQGNvcHlyaWdodCDCqSAyMDIyIENvbWV0Q2hhdCBJbmMuXG4qXG4qL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImNvbWV0Y2hhdC1tZXNzYWdlLWxpc3RcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9jb21ldGNoYXQtbWVzc2FnZS1saXN0LmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9jb21ldGNoYXQtbWVzc2FnZS1saXN0LmNvbXBvbmVudC5zY3NzXCJdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQ29tZXRDaGF0TWVzc2FnZUxpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgQFZpZXdDaGlsZChcImxpc3RTY3JvbGxcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIGxpc3RTY3JvbGwhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKFwiYm90dG9tXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBib3R0b20hOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKFwidG9wXCIsIHsgc3RhdGljOiBmYWxzZSB9KSB0b3AhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKFwidGV4dEJ1YmJsZVwiLCB7IHN0YXRpYzogZmFsc2UgfSkgdGV4dEJ1YmJsZSE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoXCJ0aHJlYWRNZXNzYWdlQnViYmxlXCIsIHsgc3RhdGljOiBmYWxzZSB9KSB0aHJlYWRNZXNzYWdlQnViYmxlITogVGVtcGxhdGVSZWY8YW55PjtcbiAgQFZpZXdDaGlsZChcImZpbGVCdWJibGVcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIGZpbGVCdWJibGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKFwiYXVkaW9CdWJibGVcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIGF1ZGlvQnViYmxlITogVGVtcGxhdGVSZWY8YW55PjtcbiAgQFZpZXdDaGlsZChcInZpZGVvQnViYmxlXCIsIHsgc3RhdGljOiBmYWxzZSB9KSB2aWRlb0J1YmJsZSE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoXCJpbWFnZUJ1YmJsZVwiLCB7IHN0YXRpYzogZmFsc2UgfSkgaW1hZ2VCdWJibGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKFwic3RpY2tlckJ1YmJsZVwiLCB7IHN0YXRpYzogZmFsc2UgfSkgc3RpY2tlckJ1YmJsZSE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoXCJkb2N1bWVudEJ1YmJsZVwiLCB7IHN0YXRpYzogZmFsc2UgfSkgZG9jdW1lbnRCdWJibGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKFwid2hpdGVib2FyZEJ1YmJsZVwiLCB7IHN0YXRpYzogZmFsc2UgfSkgd2hpdGVib2FyZEJ1YmJsZSE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoXCJwb3BvdmVyUmVmXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBwb3BvdmVyUmVmITogYW55O1xuICBAVmlld0NoaWxkKFwiZGlyZWN0Q2FsbGluZ1wiLCB7IHN0YXRpYzogZmFsc2UgfSkgZGlyZWN0Q2FsbGluZyE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoXCJwb2xsQnViYmxlXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBwb2xsQnViYmxlITogVGVtcGxhdGVSZWY8YW55PjtcblxuXG4gIEBJbnB1dCgpIGhpZGVFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBlcnJvclN0YXRlVmlldyE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBJbnB1dCgpIGxvYWRpbmdTdGF0ZVZpZXchOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBASW5wdXQoKSBlbXB0eVN0YXRlVmlldyE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQElucHV0KCkgZXJyb3JTdGF0ZVRleHQ6IHN0cmluZyA9IGxvY2FsaXplKFwiU09NRVRISU5HX1dST05HXCIpO1xuICBASW5wdXQoKSBlbXB0eVN0YXRlVGV4dDogc3RyaW5nID0gbG9jYWxpemUoXCJOT19NRVNTQUdFU19GT1VORFwiKTtcbiAgQElucHV0KCkgbG9hZGluZ0ljb25VUkw6IHN0cmluZyA9IFwiYXNzZXRzL1NwaW5uZXIuc3ZnXCI7XG4gIEBJbnB1dCgpIHVzZXIhOiBDb21ldENoYXQuVXNlcjtcbiAgQElucHV0KCkgZ3JvdXAhOiBDb21ldENoYXQuR3JvdXA7XG4gIEBJbnB1dCgpIGRpc2FibGVSZWNlaXB0OiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgZGlzYWJsZVNvdW5kRm9yTWVzc2FnZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgY3VzdG9tU291bmRGb3JNZXNzYWdlczogc3RyaW5nID0gXCJcIjtcbiAgQElucHV0KCkgcmVhZEljb246IHN0cmluZyA9IFwiYXNzZXRzL21lc3NhZ2UtcmVhZC5zdmdcIjtcbiAgQElucHV0KCkgZGVsaXZlcmVkSWNvbjogc3RyaW5nID0gXCJhc3NldHMvbWVzc2FnZS1kZWxpdmVyZWQuc3ZnXCI7XG4gIEBJbnB1dCgpIHNlbnRJY29uOiBzdHJpbmcgPSBcImFzc2V0cy9tZXNzYWdlLXNlbnQuc3ZnXCI7XG4gIEBJbnB1dCgpIHdhaXRJY29uOiBzdHJpbmcgPSBcImFzc2V0cy93YWl0LnN2Z1wiO1xuICBASW5wdXQoKSBlcnJvckljb246IHN0cmluZyA9IFwiYXNzZXRzL3dhcm5pbmctc21hbGwuc3ZnXCJcbiAgQElucHV0KCkgYWxpZ25tZW50OiBNZXNzYWdlTGlzdEFsaWdubWVudCA9IE1lc3NhZ2VMaXN0QWxpZ25tZW50LnN0YW5kYXJkO1xuICBASW5wdXQoKSBzaG93QXZhdGFyOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgZGF0ZVBhdHRlcm46IERhdGVQYXR0ZXJucyA9IERhdGVQYXR0ZXJucy50aW1lO1xuICBASW5wdXQoKSB0aW1lc3RhbXBBbGlnbm1lbnQ6IFRpbWVzdGFtcEFsaWdubWVudCA9IFRpbWVzdGFtcEFsaWdubWVudC5ib3R0b207XG4gIEBJbnB1dCgpIERhdGVTZXBhcmF0b3JQYXR0ZXJuOiBEYXRlUGF0dGVybnMgPSBEYXRlUGF0dGVybnMuRGF5RGF0ZVRpbWU7XG4gIEBJbnB1dCgpIHRlbXBsYXRlczogQ29tZXRDaGF0TWVzc2FnZVRlbXBsYXRlW10gPSBbXTtcbiAgQElucHV0KCkgbWVzc2FnZXNSZXF1ZXN0QnVpbGRlciE6IENvbWV0Q2hhdC5NZXNzYWdlc1JlcXVlc3RCdWlsZGVyO1xuICBASW5wdXQoKSBuZXdNZXNzYWdlSW5kaWNhdG9yVGV4dDogc3RyaW5nID0gXCJcIjtcbiAgQElucHV0KCkgc2Nyb2xsVG9Cb3R0b21Pbk5ld01lc3NhZ2VzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRocmVzaG9sZFZhbHVlOiBudW1iZXIgPSAxMDAwO1xuICBASW5wdXQoKSBvblRocmVhZFJlcGxpZXNDbGljayE6ICgobWVzc2FnZTpDb21ldENoYXQuQmFzZU1lc3NhZ2UsdmlldzpUZW1wbGF0ZVJlZjxhbnk+KT0+dm9pZCkgfCBudWxsO1xuICBASW5wdXQoKSBoZWFkZXJWaWV3ITogVGVtcGxhdGVSZWY8YW55PjtcbiAgQElucHV0KCkgZm9vdGVyVmlldyE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBJbnB1dCgpIHBhcmVudE1lc3NhZ2VJZCE6IG51bWJlcjtcbiAgQElucHV0KCkgYXZhdGFyU3R5bGU6IEF2YXRhclN0eWxlID0ge1xuICAgIGJvcmRlclJhZGl1czogXCIxNnB4XCIsXG4gICAgd2lkdGg6IFwiMjhweFwiLFxuICAgIGhlaWdodDogXCIyOHB4XCIsXG4gIH07XG4gIEBJbnB1dCgpIGJhY2tkcm9wU3R5bGUgOkJhc2VTdHlsZSA9IHtcbiAgICBoZWlnaHQ6XCIxMDAlXCIsXG4gICAgd2lkdGg6XCIxMDAlXCIsXG4gICAgYmFja2dyb3VuZDpcInJnYmEoMCwgMCwgMCwgMC41KVwiXG4gIH1cbiAgQElucHV0KCkgZGF0ZVNlcGFyYXRvclN0eWxlOiBEYXRlU3R5bGUgPSB7XG4gICAgaGVpZ2h0OiBcIlwiLFxuICAgIHdpZHRoOiBcIlwiLFxuICB9O1xuICBASW5wdXQoKSBtZXNzYWdlTGlzdFN0eWxlOiBNZXNzYWdlTGlzdFN0eWxlID0ge1xuICAgIG5hbWVUZXh0Rm9udDogXCI2MDAgMTVweCBJbnRlclwiLFxuICAgIG5hbWVUZXh0Q29sb3I6IFwid2hpdGVcIixcbiAgICBUaW1lc3RhbXBUZXh0Rm9udDogXCJcIixcbiAgICBUaW1lc3RhbXBUZXh0Q29sb3I6IFwiXCIsXG4gICAgdGhyZWFkUmVwbHlTZXBhcmF0b3JDb2xvcjogXCJcIixcbiAgICB0aHJlYWRSZXBseVRleHRGb250OiBcIlwiLFxuICAgIHRocmVhZFJlcGx5SWNvblRpbnQ6IFwiXCIsXG4gICAgdGhyZWFkUmVwbHlUZXh0Q29sb3I6IFwiXCIsXG4gICAgZW1wdHlTdGF0ZVRleHRGb250OiBcIjcwMCAyMnB4IEludGVyXCIsXG4gICAgZW1wdHlTdGF0ZVRleHRDb2xvcjogXCIjYmNiY2JjXCIsXG4gICAgZXJyb3JTdGF0ZVRleHRGb250OiBcIjcwMCAyMnB4IEludGVyXCIsXG4gICAgZXJyb3JTdGF0ZVRleHRDb2xvcjogXCIjYmNiY2JjXCIsXG4gICAgbG9hZGluZ0ljb25UaW50OiBcImdyZXlcIixcbiAgfTtcbiAgQElucHV0KCkgb25FcnJvciA9IChlcnJvcjphbnkpPT57XG4gICAgY29uc29sZS5sb2coZXJyb3IpXG4gIH1cbiAgc3RhdGU6IFN0YXRlcyA9IFN0YXRlcy5sb2FkaW5nO1xuICAgb3B0aW9uc1N0eWxlOiBNZW51TGlzdFN0eWxlID0ge1xuICAgIHdpZHRoOiBcIlwiLFxuICAgIGhlaWdodDogXCJcIixcbiAgICBib3JkZXI6IFwiMXB4IHNvbGlkICNlOGU4ZThcIixcbiAgICBib3JkZXJSYWRpdXM6IFwiOHB4XCIsXG4gICAgYmFja2dyb3VuZDogXCJ3aGl0ZVwiLFxuICAgIHN1Ym1lbnVXaWR0aDogXCIxMDAlXCIsXG4gICAgc3VibWVudUhlaWdodDogXCIxMDAlXCIsXG4gICAgc3VibWVudUJvcmRlcjogXCIxcHggc29saWQgI2U4ZThlOFwiLFxuICAgIHN1Ym1lbnVCb3JkZXJSYWRpdXM6IFwiOHB4XCIsXG4gICAgc3VibWVudUJhY2tncm91bmQ6IFwid2hpdGVcIixcbiAgICBtb3JlSWNvblRpbnQ6XCJncmV5XCJcbiAgfTtcbiAgcmVjZWlwdFN0eWxlOlJlY2VpcHRTdHlsZSA9IHtcbiAgfVxuICBkb2N1bWVudEJ1YmJsZUFsaWdubWVudDpEb2N1bWVudEljb25BbGlnbm1lbnQgPSBEb2N1bWVudEljb25BbGlnbm1lbnQucmlnaHRcbiAgY2FsbEJ1YmJsZUFsaWdubWVudDpEb2N1bWVudEljb25BbGlnbm1lbnQgPSBEb2N1bWVudEljb25BbGlnbm1lbnQubGVmdFxuICBpbWFnZU1vZGVyYXRpb25TdHlsZTpJbWFnZU1vZGVyYXRpb25TdHlsZSA9IHt9XG5cbiAgdGltZXN0YW1wRW51bTogdHlwZW9mIFRpbWVzdGFtcEFsaWdubWVudD0gVGltZXN0YW1wQWxpZ25tZW50O1xuICBwdWJsaWMgY2hhdENoYW5nZWQ6Ym9vbGVhbiA9IHRydWVcbiAgLy8gcHVibGljIHByb3BlcnRpZXNcbiAgcHVibGljIHJlcXVlc3RCdWlsZGVyOiBhbnk7XG4gIHB1YmxpYyBjbG9zZUltYWdlTW9kZXJhdGlvbjphbnlcblxuICBwdWJsaWMgdGltZVN0YW1wQ29sb3I6IHN0cmluZyA9IFwiXCI7XG4gIHB1YmxpYyB0aW1lU3RhbXBGb250OiBzdHJpbmcgPSBcIlwiO1xuICBzbWFydFJlcGx5U3R5bGU6IFNtYXJ0UmVwbGllc1N0eWxlID0ge1xuICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICBoZWlnaHQ6IFwiMTAwJVwiLFxuICAgIGJvcmRlcjogXCJub25lXCIsXG4gIH1cbiAgcHVibGljIHNob3dTbWFydFJlcGx5OmJvb2xlYW4gPSBmYWxzZTtcbiAgY2NIaWRlUGFuZWwhOlN1YnNjcmlwdGlvbjtcbiAgY2NTaG93UGFuZWwhOlN1YnNjcmlwdGlvbjtcbiAgc21hcnRSZXBseU1lc3NhZ2U6Q29tZXRDaGF0LkJhc2VNZXNzYWdlIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBlbmFibGVTbWFydFJlcGx5OmJvb2xlYW4gPSBmYWxzZTtcbiAgc21hcnRSZXBseUNvbmZpZyE6U21hcnRSZXBsaWVzQ29uZmlndXJhdGlvbjtcbiAgcHVibGljIHRpbWVTdGFtcEJhY2tncm91bmQ6IHN0cmluZyA9IFwiXCI7XG4gIGxpbmtQcmV2aWV3U3R5bGU6TGlua1ByZXZpZXdTdHlsZSA9IHt9XG4gIHB1YmxpYyB1bnJlYWRNZXNzYWdlc1N0eWxlID0ge1xuICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgIGJhY2tncm91bmQ6IFwiIzMzOTlGRlwiLFxuICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgIGJ1dHRvblRleHRGb250OiBcIjQwMCAxM3B4IEludGVyXCIsXG4gICAgY29sb3I6IFwid2hpdGVcIixcbiAgICBib3JkZXI6XCJub25lXCIsXG4gICAgYm9yZGVyUmFkaXVzOlwiMTJweFwiXG4gIH1cbiAgcHVibGljIGRpdmlkZXJTdHlsZTpCYXNlU3R5bGUgPSB7XG4gICAgaGVpZ2h0OiBcIjFweFwiLFxuICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICBiYWNrZ3JvdW5kOiBcImdyZXlcIlxuICB9XG4gIHBvbGxCdWJibGVTdHlsZTpQb2xsc0J1YmJsZVN0eWxlID0ge31cbiAgbGFiZWxTdHlsZTphbnkgPSB7XG4gICAgdGV4dEZvbnQ6XCI0MDAgMTFweCBJbnRlclwiLFxuICAgIHRleHRDb2xvcjpcImdyZXlcIlxuICB9XG4gIGltYWdlQnViYmxlU3R5bGU6YW55ID0ge1xuICAgIGhlaWdodDpcIjEyOHB4XCIsXG4gICAgd2lkdGg6XCIxMjhweFwiLFxuICAgIGJvcmRlcjpcIm5vbmVcIixcbiAgICBib3JkZXJSYWRpdXM6XCIwXCIsXG4gICAgYmFja2dyb3VuZDpcInRyYW5zcGFyZW50XCJcbiAgfVxuICBtZXNzYWdlc0xpc3Q6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZVtdID0gW107XG4gIGJ1YmJsZURhdGVTdHlsZTpEYXRlU3R5bGUgPSB7XG4gIH1cbiAgd2hpdGVib2FyZEljb25VUkw6c3RyaW5nID0gXCJhc3NldHMvY29sbGFib3JhdGl2ZXdoaXRlYm9hcmQuc3ZnXCI7XG4gIGRvY3VtZW50SWNvblVSTDpzdHJpbmcgPSBcImFzc2V0cy9jb2xsYWJvcmF0aXZlZG9jdW1lbnQuc3ZnXCI7XG4gIGRpcmVjdENhbGxJY29uVVJMOnN0cmluZyA9IFwiYXNzZXRzL1ZpZGVvLWNhbGwyeC5zdmdcIjtcbiAgcGxhY2Vob2xkZXJJY29uVVJMOnN0cmluZyA9IFwiL2Fzc2V0cy9wbGFjZWhvbGRlci5wbmdcIlxuICBkb3dubG9hZEljb25VUkw6c3RyaW5nID0gXCJhc3NldHMvZG93bmxvYWQuc3ZnXCJcbiAgdHJhbnNsYXRpb25TdHlsZTpNZXNzYWdlVHJhbnNsYXRpb25TdHlsZSA9IHt9XG4gIGRvY3VtZW50QnViYmxlU3R5bGU6RG9jdW1lbnRCdWJibGVTdHlsZSA9IHt9XG4gIGNhbGxCdWJibGVTdHlsZTpEb2N1bWVudEJ1YmJsZVN0eWxlID0ge31cbiAgIHdoaXRlYm9hcmRUaXRsZTpzdHJpbmcgPSBsb2NhbGl6ZShcIkNPTExBQk9SQVRJVkVfV0hJVEVCT0FSRFwiKVxuICAgd2hpdGVib2FyZFN1Yml0bGU6c3RyaW5nID0gbG9jYWxpemUoXCJEUkFXX1dISVRFQk9BUkRfVE9HRVRIRVJcIilcbiAgIHdoaXRlYm9hcmRCdXR0b25UZXh0OnN0cmluZyA9ICBsb2NhbGl6ZShcIk9QRU5fV0hJVEVCT0FSRFwiKVxuICAgZG9jdW1lbnRUaXRsZTpzdHJpbmcgPSBsb2NhbGl6ZShcIkNPTExBQk9SQVRJVkVfRE9DVU1FTlRcIilcbiAgIGRvY3VtZW50U3ViaXRsZTpzdHJpbmcgPSBsb2NhbGl6ZShcIkRSQVdfRE9DVU1FTlRfVE9HRVRIRVJcIilcbiAgIGRvY3VtZW50QnV0dG9uVGV4dDpzdHJpbmcgPSBsb2NhbGl6ZShcIk9QRU5fRE9DVU1FTlRcIilcbiAgIGpvaW5DYWxsQnV0dG9uVGV4dDpzdHJpbmcgPSBsb2NhbGl6ZShcIkpPSU5cIilcbiAgdG9wT2JzZXJ2ZXIhOkludGVyc2VjdGlvbk9ic2VydmVyO1xuICBib3R0b21PYnNlcnZlciE6SW50ZXJzZWN0aW9uT2JzZXJ2ZXI7XG4gIGxvY2FsaXplOnR5cGVvZiBsb2NhbGl6ZSA9IGxvY2FsaXplXG4gIHJlaW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgTWVzc2FnZVR5cGVzQ29uc3RhbnQ6dHlwZW9mIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VUeXBlcyA9IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VUeXBlc1xuICBjYWxsQ29uc3RhbnQ6IHN0cmluZyA9IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VDYXRlZ29yeS5jYWxsXG4gIHB1YmxpYyB0eXBlc01hcDogYW55ID0ge1xuICB9XG4gIHB1YmxpYyBtZXNzYWdlVHlwZXNNYXA6IGFueSA9IHtcbiAgfVxuICB0aGVtZTogQ29tZXRDaGF0VGhlbWUgPSBuZXcgQ29tZXRDaGF0VGhlbWUoe30pXG4gIHB1YmxpYyBtc2dMaXN0ZW5lcklkID0gXCJtZXNzYWdlX1wiKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgcHVibGljIGdyb3VwTGlzdGVuZXJJZCA9IFwiZ3JvdXBfXCIrIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICBwdWJsaWMgY2FsbExpc3RlbmVySWQgPSBcImNhbGxfXCIrIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICBwdWJsaWMgbG9nZ2VkSW5Vc2VyITogQ29tZXRDaGF0LlVzZXI7XG4gIHB1YmxpYyBzdGF0ZXM6IHR5cGVvZiBTdGF0ZXMgPSBTdGF0ZXNcbiAgTWVzc2FnZUNhdGVnb3J5ID0gQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZUNhdGVnb3J5O1xuICBwdWJsaWMgbnVtYmVyT2ZUb3BTY3JvbGw6IG51bWJlciA9IDA7XG4gIGtlZXBSZWNlbnRNZXNzYWdlczogYm9vbGVhbiA9IHRydWU7XG4gIG1lc3NhZ2VUZW1wbGF0ZTogQ29tZXRDaGF0TWVzc2FnZVRlbXBsYXRlW10gPSBbXTtcblxuICBtZXNzYWdlQ291bnQhOiBudW1iZXI7XG4gIGlzT25Cb3R0b206IGJvb2xlYW4gPSBmYWxzZTtcbiAgVW5yZWFkQ291bnQ6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZVtdID0gW107XG4gIG5ld01lc3NhZ2VDb3VudDogbnVtYmVyIHwgc3RyaW5nID0gMDtcbiAgdHlwZTogc3RyaW5nID0gXCJcIjtcbiAgY29uZmlybVRleHQ6c3RyaW5nID0gbG9jYWxpemUoXCJZRVNcIilcbiAgY2FuY2VsVGV4dDpzdHJpbmcgPSBsb2NhbGl6ZShcIk5PXCIpXG4gIHdhcm5pbmdUZXh0OnN0cmluZyA9IFwiQXJlIHlvdSBzdXJlIHdhbnQgdG8gc2VlIHVuc2FmZSBjb250ZW50P1wiXG4gIGNjTWVzc2FnZURlbGV0ZSE6IFN1YnNjcmlwdGlvbjtcbiAgY2NNZXNzYWdlUmVhY3QhOiBTdWJzY3JpcHRpb247XG4gIGNjTWVzc2FnZVJlYWQhOiBTdWJzY3JpcHRpb247XG4gIHB1YmxpYyBjY01lc3NhZ2VFZGl0ITogU3Vic2NyaXB0aW9uO1xuICBwdWJsaWMgY2NMaXZlUmVhY3Rpb24hOiBTdWJzY3JpcHRpb247XG4gIHB1YmxpYyBjY01lc3NhZ2VTZW50ITogU3Vic2NyaXB0aW9uO1xuICBwdWJsaWMgY2NNZXNzYWdlRWRpdGVkITogU3Vic2NyaXB0aW9uO1xuICBjY0dyb3VwTWVtYmVyQWRkZWQhOlN1YnNjcmlwdGlvbjtcbiAgY2NHcm91cExlZnQhOlN1YnNjcmlwdGlvbjtcbiAgY2NHcm91cE1lbWJlckpvaW5lZCE6U3Vic2NyaXB0aW9uO1xuICBjY0dyb3VwTWVtYmVyS2lja2VkITpTdWJzY3JpcHRpb247XG4gIGNjR3JvdXBNZW1iZXJCYW5uZWQhOlN1YnNjcmlwdGlvbjtcbiAgY2NPd25lcnNoaXBDaGFuZ2VkITpTdWJzY3JpcHRpb247XG4gIGNjR3JvdXBEZWxldGVkITpTdWJzY3JpcHRpb247XG4gIGNjR3JvdXBDcmVhdGVkITpTdWJzY3JpcHRpb247XG4gIHB1YmxpYyBjY091dGdvaW5nQ2FsbCE6IFN1YnNjcmlwdGlvbjtcbiAgcHVibGljIGNjQ2FsbFJlamVjdGVkITogU3Vic2NyaXB0aW9uO1xuICBwdWJsaWMgY2NDYWxsRW5kZWQhOiBTdWJzY3JpcHRpb247XG4gIHB1YmxpYyBjY0NhbGxBY2NlcHRlZCE6U3Vic2NyaXB0aW9uO1xuICBjY0dyb3VwTWVtYmVyU2NvcGVDaGFuZ2VkITpTdWJzY3JpcHRpb247XG4gIHB1YmxpYyB0aHJlYWRlZEFsaWdubWVudDpNZXNzYWdlQnViYmxlQWxpZ25tZW50ID0gTWVzc2FnZUJ1YmJsZUFsaWdubWVudC5sZWZ0XG4gIG9wZW5FbW9qaUtleWJvYXJkOmJvb2xlYW4gPSBmYWxzZTtcbiAga2V5Ym9hcmRBbGlnbm1lbnQ6c3RyaW5nID0gUGxhY2VtZW50LnJpZ2h0XG4gIHBvcG92ZXJTdHlsZTphbnkgPSB7XG4gICAgaGVpZ2h0OlwiMzMwcHhcIixcbiAgICB3aWR0aDpcIjMyNXB4XCIsXG4gIH1cbiAgdmlkZW9CdWJibGVTdHlsZTogQmFzZVN0eWxlID0ge1xuICAgIGhlaWdodDogXCIxMzBweFwiLFxuICAgIHdpZHRoOiBcIjIzMHB4XCIsXG4gICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgICBib3JkZXJSYWRpdXM6IFwiOHB4XCIsXG4gICAgYmFja2dyb3VuZDogXCJ0cmFuc3BhcmVudFwiXG4gIH1cbiAgdGhyZWFkVmlld0FsaWdubWVudCA9IE1lc3NhZ2VCdWJibGVBbGlnbm1lbnQubGVmdFxuICB3aGl0ZWJvYXJkVVJMOiBzdHJpbmcgfCBVUkwgfCB1bmRlZmluZWQ7XG4gIGVuYWJsZURhdGFNYXNraW5nOmJvb2xlYW4gPSBmYWxzZTtcbiAgZW5hYmxlVGh1bWJuYWlsR2VuZXJhdGlvbjpib29sZWFuID0gZmFsc2U7XG4gIGVuYWJsZUxpbmtQcmV2aWV3OmJvb2xlYW4gPSBmYWxzZVxuICBlbmFibGVQb2xsczpib29sZWFuID0gZmFsc2U7XG4gIGVuYWJsZVJlYWN0aW9uczpib29sZWFuID0gZmFsc2U7XG4gIGVuYWJsZUltYWdlTW9kZXJhdGlvbjpib29sZWFuID0gZmFsc2U7XG4gIGVuYWJsZVN0aWNrZXJzOmJvb2xlYW4gPSBmYWxzZTtcbiAgZW5hYmxlV2hpdGVib2FyZDpib29sZWFuID0gZmFsc2VcbiAgZW5hYmxlRG9jdW1lbnQ6Ym9vbGVhbiA9IGZhbHNlXG4gIHNob3dPbmdvaW5nQ2FsbDogYm9vbGVhbiA9IGZhbHNlO1xuICBlbmFibGVDYWxsaW5nOmJvb2xlYW4gPSBmYWxzZTtcbiAgb25nb2luZ0NhbGxTdHlsZTogQ2FsbHNjcmVlblN0eWxlID0ge31cbiAgc2Vzc2lvbklkOiBzdHJpbmcgPSBcIlwiO1xuXG4gIGdldFRocmVhZFZpZXdTdHlsZShtZXNzYWdlOkNvbWV0Q2hhdC5CYXNlTWVzc2FnZSl7XG4gICAgaWYoKCFtZXNzYWdlLmdldFNlbmRlcigpIHx8IG1lc3NhZ2UuZ2V0U2VuZGVyKCkuZ2V0VWlkKCkgPT09IHRoaXMubG9nZ2VkSW5Vc2VyPy5nZXRVaWQoKSkgJiYgbWVzc2FnZT8uZ2V0VHlwZSgpID09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VUeXBlcy50ZXh0KXtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlaWdodDogXCIzMHB4XCIsXG4gICAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjBcIixcbiAgICAgICAgYmFja2dyb3VuZDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICBwYWRkaW5nOlwiMCA4cHhcIixcbiAgICAgICAgYnV0dG9uSWNvblRpbnQ6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICBmbGV4RmxvdzogXCJyb3ctcmV2ZXJzZVwiLFxuICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICBqdXN0aWZ5Q29udGVudDogXCJzcGFjZS1iZXR3ZWVuXCIsXG4gICAgICAgIGJ1dHRvblRleHRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoXCJkYXJrXCIpXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2V7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoZWlnaHQ6IFwiMzBweFwiLFxuICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgIGJvcmRlcjogXCJub25lXCIsXG4gICAgICAgIGJvcmRlclJhZGl1czogXCIwXCIsXG4gICAgICAgIGJhY2tncm91bmQ6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgcGFkZGluZzpcIjAgOHB4XCIsXG4gICAgICAgIGJ1dHRvbkljb25UaW50OlwiZ3JleVwiLFxuICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAgZmxleEZsb3c6IFwicm93LXJldmVyc2VcIixcbiAgICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgICAganVzdGlmeUNvbnRlbnQ6IFwic3BhY2UtYmV0d2VlblwiLFxuICAgICAgICBidXR0b25UZXh0Q29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0UHJpbWFyeSgpXG4gICAgICB9XG4gICAgfVxuICAgICAgfVxuICBjbG9zZUljb25VUkw6c3RyaW5nID0gXCJhc3NldHMvY2xvc2UyeC5zdmdcIlxuICB0aHJlYWRPcGVuSWNvbjpzdHJpbmcgPSBcImFzc2V0cy9zaWRlLWFycm93LnN2Z1wiXG4gIGNvbmZpcm1EaWFsb2dTdHlsZTpDb25maXJtRGlhbG9nU3R5bGUgPSB7fVxuICBwdWJsaWMgbWVzc2FnZVRvUmVhY3Q6Q29tZXRDaGF0LkJhc2VNZXNzYWdlIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBsaW1pdDpudW1iZXIgPSAzMDtcbiAgdHlwZXM6IHN0cmluZ1tdID0gW107XG4gIGNhdGVnb3JpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbmdab25lOiBOZ1pvbmUsIHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZixwcml2YXRlIHRoZW1lU2VydmljZTpDb21ldENoYXRUaGVtZVNlcnZpY2UpIHtcbiAgfVxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2codGhpcy50ZW1wbGF0ZXMpXG4gICAgdHJ5IHtcbiAgICAgIGlmIChjaGFuZ2VzW0NvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VSZWNlaXZlclR5cGUudXNlcl0gfHwgY2hhbmdlc1tDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlUmVjZWl2ZXJUeXBlLmdyb3VwXSkge1xuICAgICAgICB0aGlzLnNob3dFbmFibGVkRXh0ZW5zaW9ucygpXG4gICAgICAgIHRoaXMubnVtYmVyT2ZUb3BTY3JvbGwgPSAwXG4gICAgICAgIGlmKCF0aGlzLmxvZ2dlZEluVXNlcil7XG4gICAgICAgICAgQ29tZXRDaGF0LmdldExvZ2dlZGluVXNlcigpLnRoZW4oKHVzZXI6IENvbWV0Q2hhdC5Vc2VyIHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2dnZWRJblVzZXIgPSB1c2VyIGFzIENvbWV0Q2hhdC5Vc2VyXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1lc3NhZ2VzTGlzdCA9IFtdXG4gICAgICAgIGlmICh0aGlzLnVzZXIpIHtcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy51c2VyKS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aGlzLnVzZXIgPSB0aGlzLnVzZXI7XG4gICAgICAgICAgICB0aGlzLnR5cGUgPSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlUmVjZWl2ZXJUeXBlLnVzZXI7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVJlcXVlc3RCdWlsZGVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgQ29tZXRDaGF0LmdldFVzZXIodGhpcy51c2VyKVxuICAgICAgICAgICAgICAudGhlbigodXNlcjogQ29tZXRDaGF0LlVzZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXIgPSB1c2VyO1xuICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VSZWNlaXZlclR5cGUudXNlcjtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVJlcXVlc3RCdWlsZGVyKCk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZ3JvdXApIHtcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5ncm91cCkubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhpcy5ncm91cCA9IHRoaXMuZ3JvdXBcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VSZWNlaXZlclR5cGUuZ3JvdXBcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUmVxdWVzdEJ1aWxkZXIoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIENvbWV0Q2hhdC5nZXRHcm91cCh0aGlzLmdyb3VwKVxuICAgICAgICAgICAgICAudGhlbigoZ3JvdXA6IENvbWV0Q2hhdC5Hcm91cCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXAgPSBncm91cDtcbiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlUmVjZWl2ZXJUeXBlLmdyb3VwO1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlUmVxdWVzdEJ1aWxkZXIoKTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9SZW1vdmluZyBQcmV2aW91cyBDb252ZXJzYXRpb24gTGlzdGVuZXJzXG4gICAgICAgIENvbWV0Q2hhdC5yZW1vdmVNZXNzYWdlTGlzdGVuZXIodGhpcy5tc2dMaXN0ZW5lcklkKTtcbiAgICAgICAgQ29tZXRDaGF0LnJlbW92ZUdyb3VwTGlzdGVuZXIodGhpcy5ncm91cExpc3RlbmVySWQpO1xuICAgICAgICBDb21ldENoYXQucmVtb3ZlQ2FsbExpc3RlbmVyKHRoaXMuY2FsbExpc3RlbmVySWQpO1xuICAgICAgICB0aGlzLm1zZ0xpc3RlbmVySWQgPSBcIm1lc3NhZ2VfXCIrIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICB0aGlzLmdyb3VwTGlzdGVuZXJJZCA9IFwiZ3JvdXBfXCIrIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICB0aGlzLmNhbGxMaXN0ZW5lcklkID0gXCJjYWxsX1wiKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgLy8gQXR0YWNoIE1lc3NhZ2VMaXN0ZW5lcnMgZm9yIHRoZSBuZXcgY29udmVyc2F0aW9uXG4gICAgICAgIHRoaXMuYWRkTWVzc2FnZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6YW55KSB7XG4gICAgIGlmKHRoaXMub25FcnJvcil7XG4gICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpXG4gICAgIH1cbiAgICB9XG4gIH1cbiAgYWRkUmVhY3Rpb24gPSAoZXZlbnQ6YW55KT0+e1xuICAgIGxldCBlbW9qaSA9IGV2ZW50Py5kZXRhaWw/LmlkXG4gICAgdGhpcy5wb3BvdmVyUmVmLm5hdGl2ZUVsZW1lbnQub3BlbkNvbnRlbnRWaWV3KGV2ZW50KVxudGhpcy5yZWFjdFRvTWVzc2FnZXMoZW1vamkpXG5cbiAgfVxuICBnZXRDYWxsQnViYmxlVGl0bGUobWVzc2FnZTpDb21ldENoYXQuQmFzZU1lc3NhZ2Upe1xuICAgIGlmKCFtZXNzYWdlLmdldFNlbmRlcigpIHx8IG1lc3NhZ2UuZ2V0U2VuZGVyKCkuZ2V0VWlkKCkgPT0gdGhpcy5sb2dnZWRJblVzZXIuZ2V0VWlkKCkpe1xuICAgICAgcmV0dXJuIGxvY2FsaXplKFwiWU9VX0lOSVRJQVRFRF9HUk9VUF9DQUxMXCIpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIGAke21lc3NhZ2UuZ2V0U2VuZGVyKCkuZ2V0TmFtZSgpfSAgJHtsb2NhbGl6ZShcIklOSVRJQVRFRF9HUk9VUF9DQUxMXCIpfWBcbiAgICB9XG5cbiAgfVxuICBnZXRDYWxsQWN0aW9uTWVzc2FnZSA9IChjYWxsOkNvbWV0Q2hhdC5DYWxsKSA9PiB7XG5cblx0cmV0dXJuIENhbGxpbmdEZXRhaWxzVXRpbHMuZ2V0Q2FsbFN0YXR1cyhjYWxsLHRoaXMubG9nZ2VkSW5Vc2VyKVxuXHR9O1xuICByZWFjdFRvTWVzc2FnZXMoZW1vamk6c3RyaW5nKSB7XG4gICAgbGV0IHJlbW92ZUVtb2ppOmJvb2xlYW4gPSBmYWxzZVxuICAgIGxldCByZWFjdGlvbk9iamVjdDphbnkgPSB7fTtcbiAgICBsZXQgbmV3TWVzc2FnZU9iamVjdCE6Q29tZXRDaGF0LlRleHRNZXNzYWdlIHwgbnVsbDtcbiAgICBsZXQgbXNnT2JqZWN0OmFueSA9IHRoaXMubWVzc2FnZVRvUmVhY3Q7XG4gICAgY29uc3QgdXNlck9iamVjdDphbnkgPSB7fTtcbiAgICBpZih0aGlzLmxvZ2dlZEluVXNlcj8uZ2V0QXZhdGFyKCkpe1xuICAgICAgdXNlck9iamVjdFtcImF2YXRhclwiXSA9IHRoaXMubG9nZ2VkSW5Vc2VyPy5nZXRBdmF0YXIoKTtcbiAgICB9XG4gICAgaWYodGhpcy5sb2dnZWRJblVzZXI/LmdldE5hbWUoKSl7XG4gICAgICB1c2VyT2JqZWN0W1wibmFtZVwiXSA9IHRoaXMubG9nZ2VkSW5Vc2VyPy5nZXROYW1lKCk7XG4gICAgfVxuICAgIGxldCB1aWQ6YW55ID0gdGhpcy5sb2dnZWRJblVzZXI/LmdldFVpZCgpO1xuICAgIGNvbnN0IGVtb2ppT2JqZWN0ID0ge1xuICAgICAgW2Vtb2ppXToge1xuICAgICAgICBbdWlkXTogdXNlck9iamVjdCxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCByZWFjdGlvbkV4dGVuc2lvbnNEYXRhID0gQ29tZXRDaGF0VUlLaXRVdGlsaXR5LmNoZWNrTWVzc2FnZUZvckV4dGVuc2lvbnNEYXRhKFxuICAgICAgKHRoaXMubWVzc2FnZVRvUmVhY3QgYXMgQ29tZXRDaGF0LkJhc2VNZXNzYWdlKSxcbiAgICAgICBcInJlYWN0aW9uc1wiXG4gICAgICApO1xuICAgIGlmIChyZWFjdGlvbkV4dGVuc2lvbnNEYXRhKSB7XG4gICAgICBpZiAocmVhY3Rpb25FeHRlbnNpb25zRGF0YVtlbW9qaV0pIHtcbiAgICAgICAgLy9pZiB0aGUgcmVhY3Rpb25zIG1ldGFkYXRhIGhhcyB0aGUgc2VsZWN0ZWQgZW1vamkvcmVhY3Rpb24gZm9yIHRoZSBsb2dnZWRpbiB1c2VyXG4gICAgICAgIGlmIChyZWFjdGlvbkV4dGVuc2lvbnNEYXRhW2Vtb2ppXVt1aWRdKSB7XG4gICAgICAgICAgZGVsZXRlIHJlYWN0aW9uRXh0ZW5zaW9uc0RhdGFbZW1vamldO1xuICAgICAgICAgIHJlbW92ZUVtb2ppID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgZGF0YTphbnkgPSBtc2dPYmplY3RbXCJtZXRhZGF0YVwiXVtcIkBpbmplY3RlZFwiXVtcImV4dGVuc2lvbnNcIl1bXG4gICAgICAgICAgICBcInJlYWN0aW9uc1wiXG4gICAgICAgICAgXTtcbiAgICAgICAgICBkYXRhW2Vtb2ppXVt1aWRdID0gdXNlck9iamVjdFxuICAgICAgICAgcmVhY3Rpb25PYmplY3QgPSB7XG4gICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFtc2dPYmplY3Q/Lmhhc093blByb3BlcnR5KFwibWV0YWRhdGFcIikpIHtcbiAgICAgICAgICBtc2dPYmplY3RbXCJtZXRhZGF0YVwiXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghbXNnT2JqZWN0W1wibWV0YWRhdGFcIl0uaGFzT3duUHJvcGVydHkoXCJAaW5qZWN0ZWRcIikpIHtcbiAgICAgICAgICBtc2dPYmplY3RbXCJtZXRhZGF0YVwiXVtcIkBpbmplY3RlZFwiXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhbXNnT2JqZWN0W1wibWV0YWRhdGFcIl1bXCJAaW5qZWN0ZWRcIl0uaGFzT3duUHJvcGVydHkoXCJleHRlbnNpb25zXCIpXG4gICAgICAgICkge1xuICAgICAgICAgIG1zZ09iamVjdFtcIm1ldGFkYXRhXCJdW1wiQGluamVjdGVkXCJdW1wiZXh0ZW5zaW9uc1wiXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhbXNnT2JqZWN0W1wibWV0YWRhdGFcIl1bXCJAaW5qZWN0ZWRcIl1bXCJleHRlbnNpb25zXCJdLmhhc093blByb3BlcnR5KFxuICAgICAgICAgICAgXCJyZWFjdGlvbnNcIlxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgbXNnT2JqZWN0W1wibWV0YWRhdGFcIl1bXCJAaW5qZWN0ZWRcIl1bXCJleHRlbnNpb25zXCJdW1wicmVhY3Rpb25zXCJdID0ge307XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRhdGE6YW55ID0gbXNnT2JqZWN0W1wibWV0YWRhdGFcIl1bXCJAaW5qZWN0ZWRcIl1bXCJleHRlbnNpb25zXCJdW1wicmVhY3Rpb25zXCJdO1xuICAgICAgICByZWFjdGlvbk9iamVjdCA9IHsgLi4uZGF0YSwgLi4uZW1vamlPYmplY3QgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFtc2dPYmplY3Q/Lmhhc093blByb3BlcnR5KFwibWV0YWRhdGFcIikpIHtcbiAgICAgICAgbXNnT2JqZWN0W1wibWV0YWRhdGFcIl0gPSB7fTtcbiAgICAgIH1cbiAgICAgIGlmICghbXNnT2JqZWN0W1wibWV0YWRhdGFcIl0uaGFzT3duUHJvcGVydHkoXCJAaW5qZWN0ZWRcIikpIHtcbiAgICAgICAgbXNnT2JqZWN0W1wibWV0YWRhdGFcIl1bXCJAaW5qZWN0ZWRcIl0gPSB7fTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgIW1zZ09iamVjdFtcIm1ldGFkYXRhXCJdW1wiQGluamVjdGVkXCJdLmhhc093blByb3BlcnR5KFwiZXh0ZW5zaW9uc1wiKVxuICAgICAgKSB7XG4gICAgICAgIG1zZ09iamVjdFtcIm1ldGFkYXRhXCJdW1wiQGluamVjdGVkXCJdW1wiZXh0ZW5zaW9uc1wiXSA9IHt9O1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAhbXNnT2JqZWN0W1wibWV0YWRhdGFcIl1bXCJAaW5qZWN0ZWRcIl1bXCJleHRlbnNpb25zXCJdLmhhc093blByb3BlcnR5KFxuICAgICAgICAgIFwicmVhY3Rpb25zXCJcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIG1zZ09iamVjdFtcIm1ldGFkYXRhXCJdW1wiQGluamVjdGVkXCJdW1wiZXh0ZW5zaW9uc1wiXVtcInJlYWN0aW9uc1wiXSA9IHt9O1xuICAgICAgfVxuICAgICAgcmVhY3Rpb25PYmplY3QgPSB7XG4gICAgICAgIC4uLmVtb2ppT2JqZWN0LFxuICAgICAgfTtcbiAgICB9XG4gICAgdmFyIG1ldGFkYXRhT2JqZWN0OmFueTtcbiAgIGlmKHJlbW92ZUVtb2ppKXtcbiAgICAgbWV0YWRhdGFPYmplY3QgPSB7XG4gICAgICAuLi5tc2dPYmplY3RbXCJtZXRhZGF0YVwiXSxcbiAgfTtcbiAgIH1cbiAgIGVsc2V7XG4gICAgIG1ldGFkYXRhT2JqZWN0ID0ge1xuICAgICAgLi4ubXNnT2JqZWN0W1wibWV0YWRhdGFcIl0sXG4gICAgICBcIkBpbmplY3RlZFwiOiB7XG4gICAgICAgIC4uLm1zZ09iamVjdFtcIm1ldGFkYXRhXCJdW1wiQGluamVjdGVkXCJdLFxuICAgICAgICBleHRlbnNpb25zOiB7XG4gICAgICAgICAgLi4ubXNnT2JqZWN0W1wibWV0YWRhdGFcIl1bXCJAaW5qZWN0ZWRcIl1bXCJleHRlbnNpb25zXCJdLFxuICAgICAgICAgIHJlYWN0aW9uczoge1xuICAgICAgICAgICAgLi4ucmVhY3Rpb25PYmplY3QsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gIH07XG4gICB9XG4gICAgbmV3TWVzc2FnZU9iamVjdCA9IHRoaXMubWVzc2FnZVRvUmVhY3QgYXMgQ29tZXRDaGF0LlRleHRNZXNzYWdlO1xuICAgIG5ld01lc3NhZ2VPYmplY3Quc2V0TWV0YWRhdGEobWV0YWRhdGFPYmplY3QpXG4gICAgdGhpcy51cGRhdGVNZXNzYWdlKG5ld01lc3NhZ2VPYmplY3QpXG4gICAgdHJ5IHtcbiAgICAgIENvbWV0Q2hhdC5jYWxsRXh0ZW5zaW9uKFJlYWN0aW9uc0NvbnN0YW50cy5yZWFjdGlvbnMsIFJlYWN0aW9uc0NvbnN0YW50cy5wb3N0LCBSZWFjdGlvbnNDb25zdGFudHMudjEsIHtcbiAgICAgICAgbXNnSWQ6IHRoaXMubWVzc2FnZVRvUmVhY3Q/LmdldElkKCksXG4gICAgICAgIGVtb2ppOiBlbW9qaSxcbiAgICAgIH0pXG4gICAgICAgIC50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XG5cblxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yOkNvbWV0Q2hhdC5Db21ldENoYXRFeGNlcHRpb24pID0+IHtcblxuICAgICBjb25zb2xlLmxvZyhlcnJvcilcbiAgICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6YW55KSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcilcblxuICAgIH1cbiAgfVxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlVG9FdmVudHMoKVxuICAgIHRyeSB7XG4gICAgICAvL1JlbW92aW5nIE1lc3NhZ2UgTGlzdGVuZXJzXG4gICAgICBDb21ldENoYXQucmVtb3ZlTWVzc2FnZUxpc3RlbmVyKHRoaXMubXNnTGlzdGVuZXJJZCk7XG4gICAgICBDb21ldENoYXQucmVtb3ZlR3JvdXBMaXN0ZW5lcih0aGlzLmdyb3VwTGlzdGVuZXJJZCk7XG4gICAgICBDb21ldENoYXQucmVtb3ZlQ2FsbExpc3RlbmVyKHRoaXMuY2FsbExpc3RlbmVySWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yOmFueSkge1xuICAgICAgIGlmKHRoaXMub25FcnJvcil7XG50aGlzLm9uRXJyb3IoZXJyb3IpO1xufVxuICAgIH1cbiAgfVxuICByZWFjdGlvbnNTdHlsZShtZXNzYWdlOkNvbWV0Q2hhdC5CYXNlTWVzc2FnZSl7XG4gICAgbGV0IHNlbnRCeU1lOmJvb2xlYW4gPSAhbWVzc2FnZT8uZ2V0U2VuZGVyKCkgfHwgbWVzc2FnZS5nZXRTZW5kZXIoKS5nZXRVaWQoKSA9PSB0aGlzLmxvZ2dlZEluVXNlcj8uZ2V0VWlkKClcbiAgICBsZXQgaXNMZWZ0QWxpZ25lZDpib29sZWFuID0gdGhpcy5hbGlnbm1lbnQgPT0gTWVzc2FnZUxpc3RBbGlnbm1lbnQubGVmdCB8fCAhc2VudEJ5TWUgfHwgbWVzc2FnZT8uZ2V0Q2F0ZWdvcnkoKSAhPSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlQ2F0ZWdvcnkubWVzc2FnZVxuXG4gICAgaWYoaXNMZWZ0QWxpZ25lZCl7XG4gICAgICAgIHJldHVybiB7XG4gICAgICBoZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgICAgIGJvcmRlclJhZGl1czogXCIwXCIsXG4gICAgICBiYWNrZ3JvdW5kOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICB0ZXh0Rm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnN1YnRpdGxlMSksXG4gICAgICB0ZXh0Q29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gICAgICBhY3RpdmVUZXh0Q29sb3I6dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoXCJkYXJrXCIpLFxuICAgICAgYWN0aXZlVGV4dEZvbnQ6Zm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnN1YnRpdGxlMSksXG4gICAgICBhZGRSZWFjdGlvbkljb25UaW50OnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gICAgICBhY3RpdmVSZWFjdGlvbkJhY2tncm91bmQ6dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRQcmltYXJ5KCksXG4gICAgICByZWFjdGlvbkJhY2tncm91bmQ6XCJ0cmFuc3BhcmVudFwiLFxuICAgICAgcmVhY3Rpb25Cb3JkZXI6YDFweCBzb2xpZCAke3RoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MTAwKCl9YCxcbiAgICAgIHJlYWN0aW9uQm9yZGVyUmFkaXVzOlwiMTJweFwiLFxuICAgICAgYWRkUmVhY3Rpb25JY29uQmFja2dyb3VuZDp0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDEwMCgpXG5cbiAgICB9XG4gICAgfVxuICBlbHNle1xuICAgIHJldHVybiB7XG4gICAgICBoZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgICAgIGJvcmRlclJhZGl1czogXCIwXCIsXG4gICAgICBiYWNrZ3JvdW5kOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICB0ZXh0Rm9udDogICBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkuY2FwdGlvbjEpLFxuICAgICAgdGV4dENvbG9yOiAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoXCJkYXJrXCIpLFxuICAgICAgYWN0aXZlVGV4dENvbG9yOiAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRQcmltYXJ5KCksXG4gICAgICBhY3RpdmVUZXh0Rm9udDogIGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS5jYXB0aW9uMSksXG4gICAgICBhZGRSZWFjdGlvbkljb25UaW50OiAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoXCJkYXJrXCIpLFxuICAgICAgYWN0aXZlUmVhY3Rpb25CYWNrZ3JvdW5kOiAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoXCJkYXJrXCIpLFxuICAgICAgcmVhY3Rpb25CYWNrZ3JvdW5kOiAgXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgcmVhY3Rpb25Cb3JkZXI6YDFweCBzb2xpZCAke3RoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MTAwKCl9YCxcbiAgICAgIHJlYWN0aW9uQm9yZGVyUmFkaXVzOlwiMTJweFwiLFxuICAgICAgYWRkUmVhY3Rpb25JY29uQmFja2dyb3VuZDp0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDEwMChcImxpZ2h0XCIpXG4gICAgfVxuICB9XG4gIH1cbiAgc2hvd0Vtb2ppS2V5Ym9hcmQgPShpZDpudW1iZXIsZXZlbnQ6YW55KT0+e1xuICAgIGxldCBtZXNzYWdlOkNvbWV0Q2hhdC5CYXNlTWVzc2FnZSB8IGZhbHNlID0gdGhpcy5nZXRNZXNzYWdlQnlJZChpZClcbiAgICBpZihtZXNzYWdlKXtcbiAgICAgIHRoaXMubWVzc2FnZVRvUmVhY3QgPSBtZXNzYWdlXG4gICAgIHRoaXMua2V5Ym9hcmRBbGlnbm1lbnQgPSBtZXNzYWdlLmdldFNlbmRlcigpPy5nZXRVaWQoKSA9PSB0aGlzLmxvZ2dlZEluVXNlcj8uZ2V0VWlkKCkgPyBQbGFjZW1lbnQubGVmdCA6IFBsYWNlbWVudC5yaWdodFxuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG4gICAgICB0aGlzLnBvcG92ZXJSZWYubmF0aXZlRWxlbWVudC5vcGVuQ29udGVudFZpZXcoZXZlbnQpXG5cblxuICAgIH1cblxuICB9XG5cbiAgc2V0QnViYmxlVmlldyA9ICgpID0+IHtcbiAgICB0aGlzLm1lc3NhZ2VUZW1wbGF0ZS5mb3JFYWNoKChlbGVtZW50OiBDb21ldENoYXRNZXNzYWdlVGVtcGxhdGUpID0+IHtcbiAgICAgIHRoaXMubWVzc2FnZVR5cGVzTWFwW2VsZW1lbnQudHlwZV0gPSBlbGVtZW50XG4gICAgfSk7XG4gIH1cbiAgb3BlblRocmVhZFZpZXcgPSAobWVzc2FnZTpDb21ldENoYXQuQmFzZU1lc3NhZ2UpPT57XG4gICAgaWYodGhpcy5vblRocmVhZFJlcGxpZXNDbGljayl7XG4gICAgICB0aGlzLm9uVGhyZWFkUmVwbGllc0NsaWNrKG1lc3NhZ2UsIHRoaXMudGhyZWFkTWVzc2FnZUJ1YmJsZSlcbiAgICB9XG4gIH1cbiAgdGhyZWFkQ2FsbGJhY2sgPSAoaWQ6bnVtYmVyKT0+e1xuICAgIGxldCBtZXNzYWdlT2JqZWN0OmFueSA9IHRoaXMuZ2V0TWVzc2FnZUJ5SWQoaWQpXG50aGlzLm9wZW5UaHJlYWRWaWV3KG1lc3NhZ2VPYmplY3QpXG4gIH1cbiAgZGVsZXRlQ2FsbGJhY2sgPShpZDpudW1iZXIpPT57XG5sZXQgbWVzc2FnZU9iamVjdDphbnkgPSB0aGlzLmdldE1lc3NhZ2VCeUlkKGlkKVxudGhpcy5kZWxldGVNZXNzYWdlKG1lc3NhZ2VPYmplY3QpXG4gIH1cbiAgZWRpdENhbGxiYWNrID0oaWQ6bnVtYmVyKT0+e1xuICAgIGxldCBtZXNzYWdlT2JqZWN0OmFueSA9IHRoaXMuZ2V0TWVzc2FnZUJ5SWQoaWQpXG4gICAgdGhpcy5vbkVkaXRNZXNzYWdlKG1lc3NhZ2VPYmplY3QpXG4gIH1cbiAgY29weUNhbGxiYWNrID0oaWQ6bnVtYmVyKT0+e1xuICAgIGxldCBtZXNzYWdlT2JqZWN0OmFueSA9IHRoaXMuZ2V0TWVzc2FnZUJ5SWQoaWQpXG4gICAgdGhpcy5vbkNvcHlNZXNzYWdlKG1lc3NhZ2VPYmplY3QpXG4gIH1cbiAgZ2V0TWVzc2FnZUJ5SWQoaWQ6bnVtYmVyKXtcbiAgICBsZXQgbWVzc2FnZUtleSA9IHRoaXMubWVzc2FnZXNMaXN0LmZpbmRJbmRleChcbiAgICAgIChtKSA9PiBtLmdldElkKCkgPT09IGlkXG4gICAgKTtcbiAgICBpZihtZXNzYWdlS2V5ID4gLTEpe1xuICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZXNMaXN0W21lc3NhZ2VLZXldXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBpc1RyYW5zbGF0ZWQobWVzc2FnZTpDb21ldENoYXQuVGV4dE1lc3NhZ2UpOmFueXtcbiAgICBsZXQgdHJhbnNsYXRlZE1lc3NhZ2VPYmplY3Q6YW55ID0gbWVzc2FnZVxuICAgIGlmICh0cmFuc2xhdGVkTWVzc2FnZU9iamVjdCAmJiB0cmFuc2xhdGVkTWVzc2FnZU9iamVjdD8uZGF0YT8ubWV0YWRhdGEgJiYgdHJhbnNsYXRlZE1lc3NhZ2VPYmplY3Q/LmRhdGE/Lm1ldGFkYXRhW01lc3NhZ2VUcmFuc2xhdGlvbkNvbnN0YW50cy50cmFuc2xhdGVkX21lc3NhZ2VdKSB7XG4gICAgICByZXR1cm4gdHJhbnNsYXRlZE1lc3NhZ2VPYmplY3QuZGF0YS5tZXRhZGF0YVtNZXNzYWdlVHJhbnNsYXRpb25Db25zdGFudHMudHJhbnNsYXRlZF9tZXNzYWdlXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG4gIHVwZGF0ZVRyYW5zbGF0ZWRNZXNzYWdlID0gKHRyYW5zbGF0aW9uOiBhbnkpID0+IHtcbiAgICBjb25zdCByZWNlaXZlZE1lc3NhZ2UgPSB0cmFuc2xhdGlvbjtcbiAgICBjb25zdCB0cmFuc2xhdGVkVGV4dCA9IHJlY2VpdmVkTWVzc2FnZS50cmFuc2xhdGlvbnNbMF0ubWVzc2FnZV90cmFuc2xhdGVkO1xuICAgIGxldCBtZXNzYWdlTGlzdDogQ29tZXRDaGF0LkJhc2VNZXNzYWdlW10gPSBbLi4udGhpcy5tZXNzYWdlc0xpc3RdO1xuICAgIGxldCBtZXNzYWdlS2V5ID0gbWVzc2FnZUxpc3QuZmluZEluZGV4KFxuICAgICAgKG0pID0+IG0uZ2V0SWQoKSA9PT0gcmVjZWl2ZWRNZXNzYWdlLm1zZ0lkXG4gICAgKTtcbiAgICBsZXQgZGF0YTogYW55O1xuICAgIGlmIChtZXNzYWdlS2V5ID4gLTEpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2VPYmo6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSA9IG1lc3NhZ2VMaXN0W21lc3NhZ2VLZXldO1xuICAgICAgaWYgKChtZXNzYWdlT2JqIGFzIENvbWV0Q2hhdC5UZXh0TWVzc2FnZSkuZ2V0TWV0YWRhdGEoKSkge1xuICAgICAgICBkYXRhID0gKG1lc3NhZ2VPYmogYXMgQ29tZXRDaGF0LlRleHRNZXNzYWdlKS5nZXRNZXRhZGF0YSgpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIChtZXNzYWdlT2JqIGFzIENvbWV0Q2hhdC5UZXh0TWVzc2FnZSkuc2V0TWV0YWRhdGEoe30pXG4gICAgICAgIGRhdGEgPSAobWVzc2FnZU9iaiBhcyBDb21ldENoYXQuVGV4dE1lc3NhZ2UpLmdldE1ldGFkYXRhKClcbiAgICAgIH1cbiAgICAgIGRhdGFbTWVzc2FnZVRyYW5zbGF0aW9uQ29uc3RhbnRzLnRyYW5zbGF0ZWRfbWVzc2FnZV0gPSB0cmFuc2xhdGVkVGV4dDtcbiAgICAgIGNvbnN0IG5ld01lc3NhZ2VPYmo6IENvbWV0Q2hhdC5UZXh0TWVzc2FnZSB8IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSA9IG1lc3NhZ2VPYmo7XG4gICAgICBtZXNzYWdlTGlzdC5zcGxpY2UobWVzc2FnZUtleSwgMSwgbmV3TWVzc2FnZU9iaik7XG4gICAgICB0aGlzLm1lc3NhZ2VzTGlzdCA9IFsuLi5tZXNzYWdlTGlzdF07XG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG4gIHRyYW5zbGF0ZU1lc3NhZ2UgPSAoaWQ6bnVtYmVyKT0+e1xuICAgIGxldCBtZXNzYWdlOkNvbWV0Q2hhdC5CYXNlTWVzc2FnZSB8IGZhbHNlID0gdGhpcy5nZXRNZXNzYWdlQnlJZChpZClcbiAgICBpZihtZXNzYWdlKXtcbiAgICAgIENvbWV0Q2hhdC5jYWxsRXh0ZW5zaW9uKE1lc3NhZ2VUcmFuc2xhdGlvbkNvbnN0YW50cy5tZXNzYWdlX3RyYW5zbGF0aW9uLCBNZXNzYWdlVHJhbnNsYXRpb25Db25zdGFudHMucG9zdCwgTWVzc2FnZVRyYW5zbGF0aW9uQ29uc3RhbnRzLnYyX3RyYW5zbGF0ZSwge1xuICAgICAgICBcIm1zZ0lkXCI6IG1lc3NhZ2UuZ2V0SWQoKSxcbiAgICAgICAgXCJ0ZXh0XCI6IChtZXNzYWdlIGFzIENvbWV0Q2hhdC5UZXh0TWVzc2FnZSkuZ2V0VGV4dCgpLFxuICAgICAgICBcImxhbmd1YWdlc1wiOiBuYXZpZ2F0b3IubGFuZ3VhZ2VzXG4gICAgICB9KS50aGVuKChyZXN1bHQ6YW55KSA9PiB7XG4gICAgICAgIGlmKHJlc3VsdD8udHJhbnNsYXRpb25zWzBdPy5tZXNzYWdlX3RyYW5zbGF0ZWQgIT0gKG1lc3NhZ2UgYXMgQ29tZXRDaGF0LlRleHRNZXNzYWdlKT8uZ2V0VGV4dCgpKXtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRyYW5zbGF0ZWRNZXNzYWdlKHJlc3VsdCk7XG4gICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXN1bHQgb2YgdHJhbnNsYXRpb25zXG4gICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yOmFueSkgPT4ge1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cbiAgc2V0T3B0aW9uc0NhbGxiYWNrKG9wdGlvbnM6Q29tZXRDaGF0TWVzc2FnZU9wdGlvbltdKSB7XG4gICAgICBvcHRpb25zPy5mb3JFYWNoKChlbGVtZW50OiBDb21ldENoYXRNZXNzYWdlT3B0aW9uKSA9PiB7XG5cbiAgICAgICAgc3dpdGNoIChlbGVtZW50LmlkKSB7XG4gICAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlT3B0aW9uLmRlbGV0ZU1lc3NhZ2U6XG4gICAgICAgICAgICBpZighZWxlbWVudC5vbkNsaWNrKXtcbiAgICAgICAgICAgICAgZWxlbWVudC5vbkNsaWNrID0gdGhpcy5kZWxldGVDYWxsYmFja1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlT3B0aW9uLmVkaXRNZXNzYWdlOlxuICAgICAgICAgICAgaWYoIWVsZW1lbnQub25DbGljayl7XG4gICAgICAgICAgICAgIGVsZW1lbnQub25DbGljayA9IHRoaXMuZWRpdENhbGxiYWNrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VPcHRpb24udHJhbnNsYXRlTWVzc2FnZTpcbiAgICAgICAgICAgIGlmKCFlbGVtZW50Lm9uQ2xpY2spe1xuICAgICAgICAgICAgICBlbGVtZW50Lm9uQ2xpY2sgPSB0aGlzLnRyYW5zbGF0ZU1lc3NhZ2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZU9wdGlvbi5jb3B5TWVzc2FnZTpcbiAgICAgICAgICAgIGlmKCFlbGVtZW50Lm9uQ2xpY2spe1xuICAgICAgICAgICAgICBlbGVtZW50Lm9uQ2xpY2sgPSB0aGlzLmNvcHlDYWxsYmFja1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlT3B0aW9uLnJlYWN0VG9NZXNzYWdlOlxuICAgICAgICAgICAgaWYoIWVsZW1lbnQub25DbGljayl7XG4gICAgICAgICAgICAgIGVsZW1lbnQub25DbGljayA9IHRoaXMuc2hvd0Vtb2ppS2V5Ym9hcmRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlT3B0aW9uLnJlcGx5SW5UaHJlYWQ6XG4gICAgICAgICAgICAgIGlmKCFlbGVtZW50Lm9uQ2xpY2spe1xuICAgICAgICAgICAgICAgIGVsZW1lbnQub25DbGljayA9IHRoaXMudGhyZWFkQ2FsbGJhY2tcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHJldHVybiBvcHRpb25zXG4gIH1cbiAgICAvKipcbiAgICogc2VuZCBtZXNzYWdlIG9wdGlvbnMgYmFzZWQgb24gdHlwZVxuICAgKiBAcGFyYW0gIHtDb21ldENoYXQuQmFzZU1lc3NhZ2V9IG1zZ09iamVjdFxuICAgKi9cbiAgICAgc2V0TWVzc2FnZU9wdGlvbnMobXNnT2JqZWN0OiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpOiBDb21ldENoYXRNZXNzYWdlT3B0aW9uW10ge1xuICAgICAgbGV0IG9wdGlvbnMhOkNvbWV0Q2hhdE1lc3NhZ2VPcHRpb25bXTtcbiAgICAgIGlmICh0aGlzLm1lc3NhZ2VUZW1wbGF0ZSAmJiB0aGlzLm1lc3NhZ2VUZW1wbGF0ZS5sZW5ndGggPiAwICYmICFtc2dPYmplY3Q/LmdldERlbGV0ZWRBdCgpICAmJiBtc2dPYmplY3Q/LmdldFR5cGUoKSAhPSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlVHlwZXMuZ3JvdXBNZW1iZXIpIHtcblxuICAgICAgICB0aGlzLm1lc3NhZ2VUZW1wbGF0ZS5mb3JFYWNoKChlbGVtZW50OiBDb21ldENoYXRNZXNzYWdlVGVtcGxhdGUpID0+IHtcbiAgICAgICAgICBpZiAobXNnT2JqZWN0Py5nZXRJZCgpICYmIGVsZW1lbnQudHlwZSA9PSBtc2dPYmplY3Q/LmdldFR5cGUoKSAmJiBlbGVtZW50Py5vcHRpb25zKSB7XG4gICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLnNldE9wdGlvbnNDYWxsYmFjayhlbGVtZW50Py5vcHRpb25zKHRoaXMubG9nZ2VkSW5Vc2VyLG1zZ09iamVjdCx0aGlzLnRoZW1lU2VydmljZS50aGVtZSx0aGlzLmdyb3VwKSkgfHwgW11cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZWxzZXtcbiAgICAgICAgb3B0aW9ucyA9IFtdXG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9uc1xuICAgIH1cbiAgLyoqXG4gICAgICogcGFzc2luZyBzdHlsZSBiYXNlZCBvbiBtZXNzYWdlIG9iamVjdFxuICAgICAqIEBwYXJhbSAge0NvbWV0Q2hhdC5CYXNlTWVzc2FnZX0gbWVzc2FnZU9iamVjdFxuICAgICAqL1xuICBzZXRNZXNzYWdlQnViYmxlU3R5bGUobXNnOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpOiBCYXNlU3R5bGUge1xuXG4gICAgbGV0IHN0eWxlITogQmFzZVN0eWxlO1xuICAgIGlmIChtc2c/LmdldERlbGV0ZWRBdCgpKSB7XG4gICAgICBzdHlsZSA9IHtcbiAgICAgICAgYmFja2dyb3VuZDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICBib3JkZXI6IGAxcHggZGFzaGVkICR7dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ0MDAoKX1gLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFwiMTJweFwiLFxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmKG1zZz8uZ2V0VHlwZSgpID09ICBDb21ldENoYXRVSUtpdENvbnN0YW50cy5jYWxscy5tZWV0aW5nICYmICghbXNnPy5nZXRTZW5kZXIoKSB8fCBtc2c/LmdldFNlbmRlcigpLmdldFVpZCgpID09IHRoaXMubG9nZ2VkSW5Vc2VyLmdldFVpZCgpKSl7XG4gICAgICBzdHlsZSA9IHtcbiAgICAgICAgYmFja2dyb3VuZDogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRQcmltYXJ5KCksXG4gICAgICAgIGJvcmRlcjogYG5vbmVgLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFwiMTJweFwiLFxuICAgICAgfVxuXG4gICAgfVxuICAgIGVsc2UgaWYodGhpcy5nZXRMaW5rUHJldmlldyhtc2cgYXMgQ29tZXRDaGF0LlRleHRNZXNzYWdlKSl7XG4gICAgICBzdHlsZSA9IHtcbiAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjhweFwiLFxuICAgICAgICBiYWNrZ3JvdW5kOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDEwMCgpLFxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmKG1zZz8uZ2V0VHlwZSgpID09IFN0aWNrZXJzQ29uc3RhbnRzLnN0aWNrZXIpe1xuICAgICAgc3R5bGUgPSB7XG4gICAgICAgICAgYmFja2dyb3VuZDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICAgIGJvcmRlclJhZGl1czogXCIxMnB4XCIsXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKCFtc2c/LmdldERlbGV0ZWRBdCgpICYmIG1zZz8uZ2V0Q2F0ZWdvcnkoKSA9PSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlQ2F0ZWdvcnkubWVzc2FnZSAmJiBtc2c/LmdldFR5cGUoKSA9PSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlVHlwZXMudGV4dCAmJiAoIW1zZz8uZ2V0U2VuZGVyKCkgfHwgdGhpcy5sb2dnZWRJblVzZXIhLmdldFVpZCgpID09IG1zZz8uZ2V0U2VuZGVyKCkuZ2V0VWlkKCkpKSB7XG4gICAgICBzdHlsZSA9IHtcbiAgICAgICAgYmFja2dyb3VuZDogdGhpcy5hbGlnbm1lbnQgPT0gTWVzc2FnZUxpc3RBbGlnbm1lbnQubGVmdCA/IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MTAwKCkgOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldFByaW1hcnkoKSxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjEycHhcIixcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoIW1zZz8uZ2V0RGVsZXRlZEF0KCkgJiYgbXNnPy5nZXRDYXRlZ29yeSgpID09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VDYXRlZ29yeS5tZXNzYWdlICYmIG1zZz8uZ2V0VHlwZSgpID09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VUeXBlcy5hdWRpbykge1xuICAgICAgc3R5bGUgPSB7XG4gICAgICAgIGJvcmRlclJhZGl1czogXCJcIixcbiAgICAgICAgYmFja2dyb3VuZDogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQxMDAoKSxcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAobXNnPy5nZXRUeXBlKCkgPT0gQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZVR5cGVzLmdyb3VwTWVtYmVyIHx8IG1zZz8uZ2V0Q2F0ZWdvcnkoKSA9PSB0aGlzLmNhbGxDb25zdGFudCkge1xuICAgICAgc3R5bGUgPSB7XG4gICAgICAgIGJhY2tncm91bmQ6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjEycHhcIixcbiAgICAgICAgYm9yZGVyOiBgMXB4IHNvbGlkICR7dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQxMDAoKX1gXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICBpZihtc2c/LmdldFNlbmRlcigpICYmIG1zZz8uZ2V0U2VuZGVyKCkuZ2V0VWlkKCkgIT0gdGhpcy5sb2dnZWRJblVzZXIuZ2V0VWlkKCkpe1xuICAgICAgc3R5bGUgPSB7XG4gICAgICAgIGJhY2tncm91bmQ6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MTAwKCksXG4gICAgICAgIGJvcmRlclJhZGl1czogXCIxMnB4XCIsXG4gICAgICB9XG4gICAgIH1cbiAgICAgZWxzZXtcbiAgICAgIHN0eWxlID0ge1xuICAgICAgICBiYWNrZ3JvdW5kOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDEwMCgpLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFwiMTJweFwiLFxuICAgICAgfVxuICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHlsZVxuICB9XG4gIGdldFNlc3Npb25JZChtZXNzYWdlOkNvbWV0Q2hhdC5DdXN0b21NZXNzYWdlKXtcbiAgICBsZXQgZGF0YTphbnkgPSBtZXNzYWdlLmdldERhdGEoKVxuICAgIHJldHVybiBkYXRhPy5jdXN0b21EYXRhPy5zZXNzaW9uSURcbiAgfVxuICBnZXRXaGl0ZWJvYXJkRG9jdW1lbnQobWVzc2FnZTpDb21ldENoYXQuQ3VzdG9tTWVzc2FnZSl7XG4gICAgdHJ5IHtcbiAgICAgIGlmICggbWVzc2FnZT8uZ2V0RGF0YSgpKSB7XG4gICAgICAgIGNvbnN0IGRhdGE6YW55ID0gbWVzc2FnZS5nZXREYXRhKCk7XG4gICAgICAgIGlmIChkYXRhPy5tZXRhZGF0YSkge1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZGF0YT8ubWV0YWRhdGE7XG4gICAgICAgICAgaWYgKENvbWV0Q2hhdFVJS2l0VXRpbGl0eS5jaGVja0hhc093blByb3BlcnR5KG1ldGFkYXRhLFwiQGluamVjdGVkXCIpKSB7XG4gICAgICAgICAgICBjb25zdCBpbmplY3RlZE9iamVjdCA9IG1ldGFkYXRhW1wiQGluamVjdGVkXCJdO1xuICAgICAgICAgICAgaWYgKGluamVjdGVkT2JqZWN0Py5leHRlbnNpb25zKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbk9iamVjdCA9IGluamVjdGVkT2JqZWN0LmV4dGVuc2lvbnM7XG4gICAgICAgICAgICAgIHJldHVybiBleHRlbnNpb25PYmplY3RbQ29sbGFib3JhdGl2ZVdoaXRlYm9hcmRDb25zdGFudHMud2hpdGVib2FyZF0gPyAgZXh0ZW5zaW9uT2JqZWN0W0NvbGxhYm9yYXRpdmVXaGl0ZWJvYXJkQ29uc3RhbnRzLndoaXRlYm9hcmRdLmJvYXJkX3VybDogZXh0ZW5zaW9uT2JqZWN0W0NvbGxhYm9yYXRpdmVEb2N1bWVudENvbnN0YW50cy5kb2N1bWVudF0uZG9jdW1lbnRfdXJsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOmFueSkge1xuICAgICAgaWYodGhpcy5vbkVycm9yKXtcbiAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBvcGVuTGlua1VSTChldmVudDphbnkpe1xuICAgIHdpbmRvdy5vcGVuKGV2ZW50Py5kZXRhaWw/LnVybCwgJ19ibGFuaycpXG4gIH1cbiAgZ2V0U3RpY2tlcihtZXNzYWdlOkNvbWV0Q2hhdC5DdXN0b21NZXNzYWdlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBzdGlja2VyRGF0YTphbnkgPSBudWxsO1xuICAgICAgaWYgKFxuICAgICAgICBDb21ldENoYXRVSUtpdFV0aWxpdHkuY2hlY2tIYXNPd25Qcm9wZXJ0eShtZXNzYWdlLFN0aWNrZXJzQ29uc3RhbnRzLmRhdGEpICYmXG4gICAgICAgQ29tZXRDaGF0VUlLaXRVdGlsaXR5LmNoZWNrSGFzT3duUHJvcGVydHkoIChtZXNzYWdlIGFzIENvbWV0Q2hhdC5DdXN0b21NZXNzYWdlKS5nZXREYXRhKCksU3RpY2tlcnNDb25zdGFudHMuY3VzdG9tX2RhdGEpXG4gICAgICApIHtcbiAgICAgICAgc3RpY2tlckRhdGEgPSAobWVzc2FnZSBhcyBhbnkpLmRhdGEuY3VzdG9tRGF0YTtcbiAgICAgICAgaWYgKENvbWV0Q2hhdFVJS2l0VXRpbGl0eS5jaGVja0hhc093blByb3BlcnR5KHN0aWNrZXJEYXRhLFN0aWNrZXJzQ29uc3RhbnRzLnN0aWNrZXJfdXJsKSkge1xuICAgICAgICAgIHJldHVybiBzdGlja2VyRGF0YS5zdGlja2VyX3VybDtcbiAgICAgICAgfVxuICAgICAgICBlbHNle1xuICAgICAgICAgIHJldHVybiBcIlwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2V7XG4gICAgICAgIHJldHVybiBcIlwiXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6YW55KSB7XG4gICAgICAgaWYodGhpcy5vbkVycm9yKXtcbiAgICAgICAgIHRoaXMub25FcnJvcihlcnJvcilcbiAgICAgICB9XG4gICAgfVxuICB9XG4gIGdldENvbnRlbnRWaWV3ID0gKG1lc3NhZ2U6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsID0+IHtcbiAgICBpZiAodGhpcy5tZXNzYWdlVHlwZXNNYXBbbWVzc2FnZT8uZ2V0VHlwZSgpXSAmJiB0aGlzLm1lc3NhZ2VUeXBlc01hcFttZXNzYWdlPy5nZXRUeXBlKCldPy5jb250ZW50Vmlldykge1xuICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZVR5cGVzTWFwW21lc3NhZ2U/LmdldFR5cGUoKV0/LmNvbnRlbnRWaWV3KG1lc3NhZ2UpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIG1lc3NhZ2UuZ2V0RGVsZXRlZEF0KCkgPyAgdGhpcy50eXBlc01hcFtcInRleHRcIl0gOiB0aGlzLnR5cGVzTWFwW21lc3NhZ2U/LmdldFR5cGUoKV1cbiAgICB9XG4gIH1cbiAgZ2V0SGVhZGVyVmlldyhtZXNzYWdlOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbHtcbiAgICBsZXQgdmlldzogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwgPSBudWxsXG4gICAgaWYgKHRoaXMubWVzc2FnZVR5cGVzTWFwW21lc3NhZ2U/LmdldFR5cGUoKV0gJiYgdGhpcy5tZXNzYWdlVHlwZXNNYXBbbWVzc2FnZT8uZ2V0VHlwZSgpXT8uaGVhZGVyVmlldykge1xuICAgICAgdmlldyA9IHRoaXMubWVzc2FnZVR5cGVzTWFwW21lc3NhZ2U/LmdldFR5cGUoKV0/LmhlYWRlclZpZXcobWVzc2FnZSlcbiAgICAgIHJldHVybiB2aWV3XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cbiAgZ2V0Rm9vdGVyVmlldyhtZXNzYWdlOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCB7XG4gICAgbGV0IHZpZXc6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsID0gbnVsbFxuICAgIGlmICh0aGlzLm1lc3NhZ2VUeXBlc01hcFttZXNzYWdlPy5nZXRUeXBlKCldICYmIHRoaXMubWVzc2FnZVR5cGVzTWFwW21lc3NhZ2U/LmdldFR5cGUoKV0/LmZvb3RlclZpZXcpIHtcbiAgICAgIHZpZXcgPSB0aGlzLm1lc3NhZ2VUeXBlc01hcFttZXNzYWdlPy5nZXRUeXBlKCldPy5mb290ZXJWaWV3KG1lc3NhZ2UpXG4gICAgICByZXR1cm4gdmlldztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgc2V0QnViYmxlQWxpZ25tZW50ID0gKG1lc3NhZ2U6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSkgPT4ge1xuICAgIGxldCBhbGlnbm1lbnQ6TWVzc2FnZUJ1YmJsZUFsaWdubWVudCA9IE1lc3NhZ2VCdWJibGVBbGlnbm1lbnQuY2VudGVyXG4gICAgaWYgKHRoaXMuYWxpZ25tZW50ID09IE1lc3NhZ2VMaXN0QWxpZ25tZW50LmxlZnQpIHtcbiAgICAgIGFsaWdubWVudCA9IE1lc3NhZ2VCdWJibGVBbGlnbm1lbnQubGVmdFxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChtZXNzYWdlPy5nZXRUeXBlKCkgPT0gQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZVR5cGVzLmdyb3VwTWVtYmVyIHx8IG1lc3NhZ2UuZ2V0Q2F0ZWdvcnkoKSA9PSB0aGlzLmNhbGxDb25zdGFudCkge1xuICAgICAgICBhbGlnbm1lbnQgPSBNZXNzYWdlQnViYmxlQWxpZ25tZW50LmNlbnRlclxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoIW1lc3NhZ2U/LmdldFNlbmRlcigpIHx8IG1lc3NhZ2U/LmdldFNlbmRlcigpLmdldFVpZCgpID09IHRoaXMubG9nZ2VkSW5Vc2VyLmdldFVpZCgpICYmIG1lc3NhZ2U/LmdldFR5cGUoKSAhPSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlVHlwZXMuZ3JvdXBNZW1iZXIpIHtcbiAgICAgICAgYWxpZ25tZW50ID0gTWVzc2FnZUJ1YmJsZUFsaWdubWVudC5yaWdodFxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGFsaWdubWVudCA9IE1lc3NhZ2VCdWJibGVBbGlnbm1lbnQubGVmdFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYWxpZ25tZW50XG4gIH1cbiAgZ2V0Q2FsbEJ1YmJsZVN0eWxlKG1lc3NhZ2U6Q29tZXRDaGF0LkJhc2VNZXNzYWdlKXtcbiAgICBjb25zdCBpc0xlZnRBbGlnbmVkID0gdGhpcy5hbGlnbm1lbnQgPT0gTWVzc2FnZUxpc3RBbGlnbm1lbnQubGVmdDtcbiAgICBjb25zdCBpc1VzZXJTZW50TWVzc2FnZSA9ICFtZXNzYWdlPy5nZXRTZW5kZXIoKSB8fCB0aGlzLmxvZ2dlZEluVXNlciEuZ2V0VWlkKCkgPT09IG1lc3NhZ2U/LmdldFNlbmRlcigpLmdldFVpZCgpO1xuICAgIGlmKGlzVXNlclNlbnRNZXNzYWdlICYmICAhaXNMZWZ0QWxpZ25lZCl7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZUZvbnQ6ICBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkudGV4dDIpLFxuICAgICAgICB0aXRsZUNvbG9yOiAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoXCJkYXJrXCIpLFxuICAgICAgICBpY29uVGludDogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoXCJkYXJrXCIpLFxuICAgICAgICBidXR0b25UZXh0Rm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRleHQyKSxcbiAgICAgICAgYnV0dG9uVGV4dENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldFByaW1hcnkoKSxcbiAgICAgICAgYnV0dG9uQmFja2dyb3VuZDogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoXCJkYXJrXCIpLFxuICAgICAgICB3aWR0aDpcIjI0MHB4XCJcbiAgICAgIH1cblxuICAgIH1cbiAgICBlbHNle1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGl0bGVGb250OiAgZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRleHQyKSxcbiAgICAgICAgdGl0bGVDb2xvcjogIHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50KCksXG4gICAgICAgIGljb25UaW50OiAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRQcmltYXJ5KCksXG4gICAgICAgIGJ1dHRvblRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkudGV4dDIpLFxuICAgICAgICBidXR0b25UZXh0Q29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0UHJpbWFyeSgpLFxuICAgICAgICBidXR0b25CYWNrZ3JvdW5kOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudChcImRhcmtcIiksXG4gICAgICAgIHdpZHRoOlwiMjQwcHhcIlxuICAgICAgfVxuICAgIH1cblxuICB9XG4gIGdldEJ1YmJsZVdyYXBwZXIgPSAobWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwgPT4ge1xuICAgIGxldCB2aWV3OiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbDtcbiAgICBpZiAodGhpcy5tZXNzYWdlVHlwZXNNYXAgJiYgdGhpcy5tZXNzYWdlVHlwZXNNYXBbbWVzc2FnZT8uZ2V0VHlwZSgpXSAmJiB0aGlzLm1lc3NhZ2VUeXBlc01hcFttZXNzYWdlPy5nZXRUeXBlKCldLmJ1YmJsZVZpZXcpIHtcbiAgICAgIHZpZXcgPSB0aGlzLm1lc3NhZ2VUeXBlc01hcFttZXNzYWdlPy5nZXRUeXBlKCldLmJ1YmJsZVZpZXcobWVzc2FnZSlcbiAgICAgIHJldHVybiB2aWV3XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmlldyA9IG51bGxcbiAgICAgIHJldHVybiB2aWV3XG4gICAgfVxuICB9XG4gIGdldEJ1YmJsZUFsaWdubWVudChtZXNzYWdlOkNvbWV0Q2hhdC5CYXNlTWVzc2FnZSl7XG4gICAgcmV0dXJuIHRoaXMuYWxpZ25tZW50ID09IE1lc3NhZ2VMaXN0QWxpZ25tZW50LmxlZnQgfHwgKG1lc3NhZ2UuZ2V0U2VuZGVyKCkgJiYgbWVzc2FnZS5nZXRTZW5kZXIoKS5nZXRVaWQoKSAhPSB0aGlzLmxvZ2dlZEluVXNlci5nZXRVaWQoKSkgPyBNZXNzYWdlQnViYmxlQWxpZ25tZW50LmxlZnQgOiBNZXNzYWdlQnViYmxlQWxpZ25tZW50LnJpZ2h0XG4gIH1cbiAgc2V0VHJhbnNsYXRpb25TdHlsZSA9IChtZXNzYWdlOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpPT57XG4gICAgY29uc3QgaXNMZWZ0QWxpZ25lZCA9IHRoaXMuYWxpZ25tZW50ICE9PSBNZXNzYWdlTGlzdEFsaWdubWVudC5sZWZ0O1xuICAgIGNvbnN0IGlzVXNlclNlbnRNZXNzYWdlID0gIW1lc3NhZ2U/LmdldFNlbmRlcigpIHx8IHRoaXMubG9nZ2VkSW5Vc2VyIS5nZXRVaWQoKSA9PT0gbWVzc2FnZT8uZ2V0U2VuZGVyKCkuZ2V0VWlkKCk7XG4gICAgaWYgKCAhaXNMZWZ0QWxpZ25lZCkge1xuICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlVHJhbnNsYXRpb25TdHlsZSh7XG4gICAgICAgIHRyYW5zbGF0ZWRUZXh0Rm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRleHQzKSxcbiAgICAgICAgdHJhbnNsYXRlZFRleHRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoXCJsaWdodFwiKSxcbiAgICAgICAgaGVscFRleHRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ3MDAoKSxcbiAgICAgICAgaGVscFRleHRGb250OmZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS5jYXB0aW9uMiksXG4gICAgICAgIGJhY2tncm91bmQ6XCJ0cmFuc3BhcmVudFwiXG4gICAgICB9KTtcbiAgICB9XG4gICBlbHNle1xuICAgaWYgKGlzVXNlclNlbnRNZXNzYWdlKSB7XG4gICAgICByZXR1cm4gbmV3IE1lc3NhZ2VUcmFuc2xhdGlvblN0eWxlKHtcbiAgICAgICAgdHJhbnNsYXRlZFRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkudGV4dDMpLFxuICAgICAgICB0cmFuc2xhdGVkVGV4dENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudChcImRhcmtcIiksXG4gICAgICAgIGhlbHBUZXh0Q29sb3I6dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ3MDAoXCJkYXJrXCIpLFxuICAgICAgICBoZWxwVGV4dEZvbnQ6Zm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LmNhcHRpb24yKSxcbiAgICAgICAgYmFja2dyb3VuZDpcInRyYW5zcGFyZW50XCJcbiAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNle1xuICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlVHJhbnNsYXRpb25TdHlsZSh7XG4gICAgICAgIHRyYW5zbGF0ZWRUZXh0Rm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRleHQzKSxcbiAgICAgICAgdHJhbnNsYXRlZFRleHRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoXCJsaWdodFwiKSxcbiAgICAgICAgaGVscFRleHRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ3MDAoKSxcbiAgICAgICAgaGVscFRleHRGb250OmZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS5jYXB0aW9uMiksXG4gICAgICAgIGJhY2tncm91bmQ6XCJ0cmFuc3BhcmVudFwiXG4gICAgICB9KTtcbiAgICB9XG4gICB9XG4gIH1cbiAgZ2V0Q2FsbFR5cGVJY29uKG1lc3NhZ2U6Q29tZXRDaGF0LkJhc2VNZXNzYWdlKXtcbiAgICBpZiAobWVzc2FnZS5nZXRUeXBlKCkgPT0gQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZVR5cGVzLmF1ZGlvKSB7XG4gICAgICByZXR1cm4gXCJhc3NldHMvQXVkaW8tQ2FsbC5zdmdcIlxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiBcImFzc2V0cy9WaWRlby1jYWxsLnN2Z1wiXG4gICAgfVxuICB9XG4gIGNhbGxTdGF0dXNTdHlsZShtZXNzYWdlOiBDb21ldENoYXQuQmFzZU1lc3NhZ2Upe1xuICAgIGlmKG1lc3NhZ2UuZ2V0Q2F0ZWdvcnkoKSA9PSB0aGlzLmNhbGxDb25zdGFudCl7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBidXR0b25UZXh0Rm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnN1YnRpdGxlMiksXG4gICAgICAgIGJ1dHRvblRleHRDb2xvcjogQ2FsbGluZ0RldGFpbHNVdGlscy5pc01pc3NlZENhbGwobWVzc2FnZSBhcyBDb21ldENoYXQuQ2FsbCwgdGhpcy5sb2dnZWRJblVzZXIpID8gdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRFcnJvcigpIDogIHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gICAgICAgIGJvcmRlclJhZGl1czogXCIxMHB4XCIsXG4gICAgICAgIGJvcmRlcjogQ2FsbGluZ0RldGFpbHNVdGlscy5pc01pc3NlZENhbGwobWVzc2FnZSBhcyBDb21ldENoYXQuQ2FsbCwgdGhpcy5sb2dnZWRJblVzZXIpID8gYDFweCBzb2xpZCBSR0JBKDI1NSwgNTksIDQ4LCAwLjIpYCA6IGAxcHggc29saWQgJHt0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDEwMCgpfWAsXG4gICAgICAgIGJ1dHRvbkljb25UaW50OiBDYWxsaW5nRGV0YWlsc1V0aWxzLmlzTWlzc2VkQ2FsbChtZXNzYWdlIGFzIENvbWV0Q2hhdC5DYWxsLCB0aGlzLmxvZ2dlZEluVXNlcikgPyB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEVycm9yKCkgOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDYwMCgpLFxuICAgICAgICBiYWNrZ3JvdW5kOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIGljb25CYWNrZ3JvdW5kOlwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgcGFkZGluZzpcIjJweCAxMnB4IDJweCAwXCIsXG4gICAgICAgIGdhcDpcIjBcIixcbiAgICAgICAgaGVpZ2h0OlwiMjVweFwiLFxuICAgICAgICBqdXN0aWZ5Q29udGVudDpcImNlbnRlclwiXG4gICAgICB9O1xuICAgIH1cbiAgICBlbHNle1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cbiAgc2V0VGV4dEJ1YmJsZVN0eWxlID0gKG1lc3NhZ2U6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSkgPT4ge1xuICAgIGNvbnN0IGlzRGVsZXRlZCA9IG1lc3NhZ2UuZ2V0RGVsZXRlZEF0KCk7XG4gICAgY29uc3QgaXNMZWZ0QWxpZ25lZCA9IHRoaXMuYWxpZ25tZW50ICE9PSBNZXNzYWdlTGlzdEFsaWdubWVudC5sZWZ0O1xuICAgIGNvbnN0IGlzVGV4dE1lc3NhZ2UgPSBtZXNzYWdlLmdldENhdGVnb3J5KCkgPT09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VDYXRlZ29yeS5tZXNzYWdlICYmIG1lc3NhZ2U/LmdldFR5cGUoKSA9PT0gQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZVR5cGVzLnRleHQ7XG4gICAgY29uc3QgaXNVc2VyU2VudE1lc3NhZ2UgPSAhbWVzc2FnZT8uZ2V0U2VuZGVyKCkgfHwgdGhpcy5sb2dnZWRJblVzZXIhLmdldFVpZCgpID09PSBtZXNzYWdlPy5nZXRTZW5kZXIoKS5nZXRVaWQoKTtcbiAgICBjb25zdCBpc0dyb3VwTWVtYmVyTWVzc2FnZSA9IG1lc3NhZ2U/LmdldFR5cGUoKSA9PT0gQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZVR5cGVzLmdyb3VwTWVtYmVyO1xuICAgIGlmKHRoaXMuZ2V0TGlua1ByZXZpZXcobWVzc2FnZSBhcyBDb21ldENoYXQuVGV4dE1lc3NhZ2UpKXtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkudGV4dDMpLFxuICAgICAgICB0ZXh0Q29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50KClcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICghaXNEZWxldGVkICYmIGlzTGVmdEFsaWduZWQgJiYgaXNUZXh0TWVzc2FnZSAmJiBpc1VzZXJTZW50TWVzc2FnZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGV4dEZvbnQ6IGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS50ZXh0MyksXG4gICAgICAgIHRleHRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ5MDAoXCJsaWdodFwiKVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKCFpc0RlbGV0ZWQgJiYgaXNMZWZ0QWxpZ25lZCAmJiBpc1RleHRNZXNzYWdlICYmICFpc1VzZXJTZW50TWVzc2FnZSAmJiAhaXNHcm91cE1lbWJlck1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkudGV4dDMpLFxuICAgICAgICB0ZXh0Q29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50KClcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChpc0dyb3VwTWVtYmVyTWVzc2FnZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGV4dEZvbnQ6IGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS5zdWJ0aXRsZTIpLFxuICAgICAgICB0ZXh0Q29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKClcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkudGV4dDIpLFxuICAgICAgdGV4dENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDQwMCgpXG4gICAgfTtcbiAgfVxuICBzZXRGaWxlQnViYmxlU3R5bGUobWVzc2FnZTpDb21ldENoYXQuQmFzZU1lc3NhZ2UpOmFueXtcbiAgICBjb25zdCBpc0ZpbGVNZXNzYWdlID0gbWVzc2FnZS5nZXRDYXRlZ29yeSgpID09PSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlQ2F0ZWdvcnkubWVzc2FnZSAmJiBtZXNzYWdlPy5nZXRUeXBlKCkgPT09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VUeXBlcy5maWxlO1xuaWYoaXNGaWxlTWVzc2FnZSl7XG4gIHJldHVybiB7XG4gICAgdGl0bGVGb250OiBmb250SGVscGVyKHRoaXMudGhlbWUudHlwb2dyYXBoeS5zdWJ0aXRsZTEpLFxuICAgIHRpdGxlQ29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50KCksXG4gICAgc3VidGl0bGVGb250OiBmb250SGVscGVyKHRoaXMudGhlbWUudHlwb2dyYXBoeS5zdWJ0aXRsZTIpLFxuICAgIHN1YnRpdGxlQ29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gICAgaWNvblRpbnQ6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0UHJpbWFyeSgpLFxuICB9O1xufVxuZWxzZXtcbiAgcmV0dXJuXG59XG4gIH1cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuaW9Cb3R0b20oKTtcbiAgICB0aGlzLmlvVG9wKCk7XG4gICAgdGhpcy5jaGVja01lc3NhZ2VUZW1wbGF0ZSgpXG4gIH1cbiAgc3RhcnREaXJlY3RDYWxsID0oc2Vzc2lvbklkOnN0cmluZykgPT57XG4gICAgICB0aGlzLnNlc3Npb25JZCA9IHNlc3Npb25JZFxuICAgICAgdGhpcy5zaG93T25nb2luZ0NhbGwgPSB0cnVlO1xuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG5cbiAgfVxuICBsYXVuY2hDb2xsYWJvcmF0aXZlV2hpdGVib2FyZERvY3VtZW50ID0odXJsOnN0cmluZyk9PiB7XG4gICAgd2luZG93Lm9wZW4odXJsLCBcIlwiLCBcImZ1bGxzY3JlZW49eWVzLCBzY3JvbGxiYXJzPWF1dG9cIik7XG4gIH1cblxuXG4gICAgLyoqXG4gICAqIEV4dHJhY3RpbmcgIHR5cGVzIGFuZCBjYXRlZ29yaWVzIGZyb20gdGVtcGxhdGVcbiAgICpcbiAgICovXG5cblxuICBjaGVja01lc3NhZ2VUZW1wbGF0ZSgpe1xuICAgIHRoaXMudHlwZXNNYXAgPSB7XG4gICAgICB0ZXh0OiB0aGlzLnRleHRCdWJibGUsXG4gICAgICBmaWxlOiB0aGlzLmZpbGVCdWJibGUsXG4gICAgICBhdWRpbzogdGhpcy5hdWRpb0J1YmJsZSxcbiAgICAgIHZpZGVvOiB0aGlzLnZpZGVvQnViYmxlLFxuICAgICAgaW1hZ2U6IHRoaXMuaW1hZ2VCdWJibGUsXG4gICAgICBncm91cE1lbWJlcjogdGhpcy50ZXh0QnViYmxlLFxuICAgICAgZXh0ZW5zaW9uX3N0aWNrZXI6dGhpcy5zdGlja2VyQnViYmxlLFxuICAgICAgZXh0ZW5zaW9uX3doaXRlYm9hcmQ6dGhpcy53aGl0ZWJvYXJkQnViYmxlLFxuICAgICAgZXh0ZW5zaW9uX2RvY3VtZW50OnRoaXMuZG9jdW1lbnRCdWJibGUsXG4gICAgICBleHRlbnNpb25fcG9sbDp0aGlzLnBvbGxCdWJibGUsXG4gICAgICBtZWV0aW5nOnRoaXMuZGlyZWN0Q2FsbGluZ1xuXG4gICAgfVxuICAgIHRoaXMuc2V0QnViYmxlVmlldygpXG4gIH1cbiAgZ2V0UG9sbEJ1YmJsZURhdGEobWVzc2FnZTpDb21ldENoYXQuQ3VzdG9tTWVzc2FnZSwgdHlwZT86c3RyaW5nKXtcbiAgIGxldCBkYXRhOmFueSA9ICBtZXNzYWdlLmdldEN1c3RvbURhdGEoKVxuICAgIGlmKHR5cGUpe1xuICAgICByZXR1cm4gZGF0YVt0eXBlXVxuICAgIH1cbiAgICBlbHNle1xuICAgICAgcmV0dXJuIG1lc3NhZ2UuZ2V0U2VuZGVyKCkuZ2V0VWlkKClcbiAgICB9XG4gIH1cbiAgZ2V0VGhyZWFkQ291bnQobWVzc2FnZTpDb21ldENoYXQuQmFzZU1lc3NhZ2UpIHtcbiAgICBjb25zdCByZXBseUNvdW50ID0gbWVzc2FnZT8uZ2V0UmVwbHlDb3VudCgpIHx8IDA7XG4gICAgY29uc3Qgc3VmZml4ID0gcmVwbHlDb3VudCA9PT0gMSA/IGxvY2FsaXplKFwiUkVQTFlcIikgOiBsb2NhbGl6ZShcIlJFUExJRVNcIik7XG4gICAgcmV0dXJuIGAke2xvY2FsaXplKFwiVklFV1wiKX0gJHtyZXBseUNvdW50fSAke3N1ZmZpeH1gO1xuICB9XG4gIHNob3dFbmFibGVkRXh0ZW5zaW9ucygpe1xuICAgIGlmIChDaGF0Q29uZmlndXJhdG9yLm5hbWVzLmluY2x1ZGVzKCd0ZXh0bW9kZXJhdG9yJykpIHtcbiAgICAgIHRoaXMuZW5hYmxlRGF0YU1hc2tpbmcgPSB0cnVlXG4gICAgfVxuICAgIGlmIChDaGF0Q29uZmlndXJhdG9yLm5hbWVzLmluY2x1ZGVzKCd0aHVtYm5haWxnZW5lcmF0aW9uJykpIHtcbiAgICAgIHRoaXMuZW5hYmxlVGh1bWJuYWlsR2VuZXJhdGlvbiA9IHRydWVcbiAgICB9XG4gICAgaWYgKENoYXRDb25maWd1cmF0b3IubmFtZXMuaW5jbHVkZXMoJ2xpbmtwcmV2aWV3JykpIHtcbiAgICAgIHRoaXMuZW5hYmxlTGlua1ByZXZpZXcgPSB0cnVlXG4gICAgfVxuICAgIGlmIChDaGF0Q29uZmlndXJhdG9yLm5hbWVzLmluY2x1ZGVzKCdwb2xscycpKSB7XG4gICAgICB0aGlzLmVuYWJsZVBvbGxzID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAoQ2hhdENvbmZpZ3VyYXRvci5uYW1lcy5pbmNsdWRlcygncmVhY3Rpb25zJykpIHtcbiAgICAgIHRoaXMuZW5hYmxlUmVhY3Rpb25zID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAoQ2hhdENvbmZpZ3VyYXRvci5uYW1lcy5pbmNsdWRlcygnaW1hZ2Vtb2RlcmF0aW9uJykpIHtcbiAgICAgIHRoaXMuZW5hYmxlSW1hZ2VNb2RlcmF0aW9uID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAoQ2hhdENvbmZpZ3VyYXRvci5uYW1lcy5pbmNsdWRlcygnc3RpY2tlcnMnKSkge1xuICAgICAgdGhpcy5lbmFibGVTdGlja2VycyA9IHRydWVcbiAgICB9XG4gICAgaWYgKENoYXRDb25maWd1cmF0b3IubmFtZXMuaW5jbHVkZXMoJ2NvbGxhYm9yYXRpdmV3aGl0ZWJvYXJkJykpIHtcbiAgICAgIHRoaXMuZW5hYmxlV2hpdGVib2FyZCA9IHRydWVcbiAgICB9XG4gICAgaWYgKENoYXRDb25maWd1cmF0b3IubmFtZXMuaW5jbHVkZXMoJ2NvbGxhYm9yYXRpdmVkb2N1bWVudCcpKSB7XG4gICAgICB0aGlzLmVuYWJsZURvY3VtZW50ID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAoQ2hhdENvbmZpZ3VyYXRvci5uYW1lcy5pbmNsdWRlcygnY2FsbGluZycpKSB7XG4gICAgICB0aGlzLmVuYWJsZUNhbGxpbmcgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9wZW5Db25maXJtRGlhbG9nOmJvb2xlYW4gPSBmYWxzZVxuICBwdWJsaWMgb3BlbkZ1bGxzY3JlZW5WaWV3OmJvb2xlYW4gPSBmYWxzZVxuICBwdWJsaWMgaW1hZ2V1cmxUb09wZW46c3RyaW5nID0gXCJcIjtcbiAgZnVsbFNjcmVlblZpZXdlclN0eWxlOkZ1bGxTY3JlZW5WaWV3ZXJTdHlsZSA9IHtcbmhlaWdodDpcIjEwMCVcIixcbndpZHRoOlwiMTAwJVwiLFxuY2xvc2VJY29uVGludDpcImJsdWVcIlxuICB9XG4gIG9wZW5JbWFnZUluRnVsbFNjcmVlbihtZXNzYWdlOmFueSl7XG4gICAgdGhpcy5pbWFnZXVybFRvT3BlbiA9IG1lc3NhZ2U/LmRhdGE/LmF0dGFjaG1lbnRzWzBdPy51cmxcbiAgICB0aGlzLm9wZW5GdWxsc2NyZWVuVmlldyA9IHRydWVcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgfVxuICBjbG9zZUltYWdlSW5GdWxsU2NyZWVuKCl7XG4gICAgdGhpcy5pbWFnZXVybFRvT3BlbiA9IFwiXCJcbiAgICB0aGlzLm9wZW5GdWxsc2NyZWVuVmlldyA9IGZhbHNlXG4gICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG4gIH1cbiAgb3Blbldhcm5pbmdEaWFsb2coZXZlbnQ6YW55KXtcbnRoaXMuY2xvc2VJbWFnZU1vZGVyYXRpb24gPSBldmVudD8uZGV0YWlsPy5vbkNvbmZpcm1cbnRoaXMub3BlbkNvbmZpcm1EaWFsb2cgPSB0cnVlO1xudGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG5cbiAgfVxuICBvbkNvbmZpcm1DbGljayA9ICgpPT57XG4gICAgdGhpcy5vcGVuQ29uZmlybURpYWxvZyA9IGZhbHNlO1xuICAgIGlmKHRoaXMuY2xvc2VJbWFnZU1vZGVyYXRpb24gKXtcbiAgICAgIHRoaXMuY2xvc2VJbWFnZU1vZGVyYXRpb24gKClcbiAgICB9XG4gICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG4gIH1cbiAgb25DYW5jZWxDbGljaygpe1xuICAgIHRoaXMub3BlbkNvbmZpcm1EaWFsb2cgPSBmYWxzZTtcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgfVxuICBnZXRUZXh0TWVzc2FnZShtZXNzYWdlOiBDb21ldENoYXQuVGV4dE1lc3NhZ2UpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLmVuYWJsZURhdGFNYXNraW5nID8gQ29tZXRDaGF0VUlLaXRVdGlsaXR5LmdldEV4dGVuc2lvbkRhdGEobWVzc2FnZSkgOiBudWxsO1xuICAgIHJldHVybiB0ZXh0Py50cmltKCk/Lmxlbmd0aCA+IDAgPyB0ZXh0IDogbWVzc2FnZS5nZXRUZXh0KCk7XG4gIH1cbiAgZ2V0TGlua1ByZXZpZXcobWVzc2FnZTpDb21ldENoYXQuVGV4dE1lc3NhZ2UpOmFueXtcbiAgICB0cnkge1xuICAgICAgaWYgKG1lc3NhZ2U/LmdldE1ldGFkYXRhKCkgJiYgdGhpcy5lbmFibGVMaW5rUHJldmlldykge1xuICAgICAgICBjb25zdCBtZXRhZGF0YTphbnkgPSBtZXNzYWdlLmdldE1ldGFkYXRhKCk7XG4gICAgICAgIGNvbnN0IGluamVjdGVkT2JqZWN0ID0gbWV0YWRhdGFbTGlua1ByZXZpZXdDb25zdGFudHMuaW5qZWN0ZWRdO1xuICAgICAgICBpZiAoaW5qZWN0ZWRPYmplY3QgJiYgaW5qZWN0ZWRPYmplY3Q/LmV4dGVuc2lvbnMpIHtcbiAgICAgICAgICBjb25zdCBleHRlbnNpb25zT2JqZWN0ID0gaW5qZWN0ZWRPYmplY3QuZXh0ZW5zaW9ucztcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBleHRlbnNpb25zT2JqZWN0ICYmXG4gICAgICAgICAgICBDb21ldENoYXRVSUtpdFV0aWxpdHkuY2hlY2tIYXNPd25Qcm9wZXJ0eShleHRlbnNpb25zT2JqZWN0LExpbmtQcmV2aWV3Q29uc3RhbnRzLmxpbmtfcHJldmlldylcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmtQcmV2aWV3T2JqZWN0ID0gZXh0ZW5zaW9uc09iamVjdFtMaW5rUHJldmlld0NvbnN0YW50cy5saW5rX3ByZXZpZXddO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBsaW5rUHJldmlld09iamVjdCAmJlxuICAgICAgICAgICAgICBDb21ldENoYXRVSUtpdFV0aWxpdHkuY2hlY2tIYXNPd25Qcm9wZXJ0eShsaW5rUHJldmlld09iamVjdCwgTGlua1ByZXZpZXdDb25zdGFudHMubGlua3MpICYmXG4gICAgICAgICAgICAgIGxpbmtQcmV2aWV3T2JqZWN0WyBMaW5rUHJldmlld0NvbnN0YW50cy5saW5rc10ubGVuZ3RoXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGxpbmtQcmV2aWV3T2JqZWN0WyBMaW5rUHJldmlld0NvbnN0YW50cy5saW5rc11bMF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZXtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjphbnkpIHtcbiAgICAgICBpZih0aGlzLm9uRXJyb3Ipe1xuICAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yKVxuICAgICAgIH1cbiAgICB9XG4gIH1cbiAgIGdldEltYWdlVGh1bWJuYWlsKG1zZzogQ29tZXRDaGF0Lk1lZGlhTWVzc2FnZSk6IHN0cmluZyB7XG4gICAgY29uc3QgbWVzc2FnZTphbnkgPSBtc2cgYXMgQ29tZXRDaGF0Lk1lZGlhTWVzc2FnZTtcbiAgICBsZXQgaW1hZ2VVUkwgPSBcIlwiO1xuICAgIGlmICh0aGlzLmVuYWJsZVRodW1ibmFpbEdlbmVyYXRpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhOmFueSA9IG1lc3NhZ2UuZ2V0TWV0YWRhdGEoKTtcbiAgICAgICAgY29uc3QgaW5qZWN0ZWRPYmplY3QgPSBtZXRhZGF0YT8uW1RodW1ibmFpbEdlbmVyYXRpb25Db25zdGFudHMuaW5qZWN0ZWRdIGFzIHsgZXh0ZW5zaW9ucz86IGFueSB9O1xuICAgICAgICBjb25zdCBleHRlbnNpb25zT2JqZWN0ID0gaW5qZWN0ZWRPYmplY3Q/LmV4dGVuc2lvbnM7XG4gICAgICAgIGNvbnN0IHRodW1ibmFpbEdlbmVyYXRpb25PYmplY3QgPSBleHRlbnNpb25zT2JqZWN0W1RodW1ibmFpbEdlbmVyYXRpb25Db25zdGFudHMudGh1bWJuYWlsX2dlbmVyYXRpb25dO1xuICAgICAgICBjb25zdCBpbWFnZVRvRG93bmxvYWQgPSB0aHVtYm5haWxHZW5lcmF0aW9uT2JqZWN0Py51cmxfc21hbGw7XG4gICAgICAgIGlmIChpbWFnZVRvRG93bmxvYWQpIHtcbiAgICAgICAgICBpbWFnZVVSTCA9IGltYWdlVG9Eb3dubG9hZFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGltYWdlVVJMID0gbWVzc2FnZT8uZGF0YT8uYXR0YWNobWVudHMgPyBtZXNzYWdlPy5kYXRhPy5hdHRhY2htZW50c1swXT8udXJsIDogXCJcIjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHRoaXMub25FcnJvcikge1xuICAgICAgICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW1hZ2VVUkwgPSBtZXNzYWdlPy5kYXRhPy5hdHRhY2htZW50cyA/IG1lc3NhZ2U/LmRhdGE/LmF0dGFjaG1lbnRzWzBdPy51cmwgOiBcIlwiO1xuICAgIH1cbiAgICByZXR1cm4gaW1hZ2VVUkw7XG4gIH1cbiAgZ2V0TGlua1ByZXZpZXdEZXRhaWxzKGtleTpzdHJpbmcsbWVzc2FnZTpDb21ldENoYXQuVGV4dE1lc3NhZ2UpOnN0cmluZ3tcbiAgICBsZXQgbGlua1ByZXZpZXdPYmplY3Q6YW55ID0gdGhpcy5nZXRMaW5rUHJldmlldyhtZXNzYWdlKVxuICAgIGlmKE9iamVjdC5rZXlzKGxpbmtQcmV2aWV3T2JqZWN0KS5sZW5ndGggPiAwKXtcbiAgICAgIHJldHVybiBsaW5rUHJldmlld09iamVjdFtrZXldXG4gICAgfVxuICAgIGVsc2V7XG4gICAgICByZXR1cm4gXCJcIlxuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gICAgdGhpcy5zZXRNZXNzYWdlc1N0eWxlKClcbiAgICB0aGlzLnNldEF2YXRhclN0eWxlKClcbiAgICB0aGlzLnNldERhdGVTdHlsZSgpXG4gICAgdGhpcy5zZXRSZWNlaXB0U3R5bGUoKVxuICAgIHRoaXMuc3Vic2NyaWJlVG9FdmVudHMoKVxuICAgIHRoaXMuc2V0T25nb2luZ0NhbGxTdHlsZSgpXG4gICAgdGhpcy5zdGF0ZSA9IFN0YXRlcy5sb2FkaW5nXG4gICAgQ29tZXRDaGF0LmdldExvZ2dlZGluVXNlcigpLnRoZW4oKHVzZXI6IENvbWV0Q2hhdC5Vc2VyIHwgbnVsbCkgPT4ge1xuICAgICAgdGhpcy5sb2dnZWRJblVzZXIgPSB1c2VyIGFzIENvbWV0Q2hhdC5Vc2VyXG4gICAgfSkuY2F0Y2goKGVycm9yOkNvbWV0Q2hhdC5Db21ldENoYXRFeGNlcHRpb24pPT57XG4gICAgICBpZih0aGlzLm9uRXJyb3Ipe1xuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpXG4gICAgICB9XG4gICAgfSlcbiAgICB0aGlzLmRhdGVTZXBhcmF0b3JTdHlsZS5iYWNrZ3JvdW5kID0gIHRoaXMuZGF0ZVNlcGFyYXRvclN0eWxlLmJhY2tncm91bmQgIHx8ICB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDYwMCgpXG4gICAgdGhpcy5kaXZpZGVyU3R5bGUuYmFja2dyb3VuZCA9IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MTAwKClcbiAgfVxuICBzZXRPbmdvaW5nQ2FsbFN0eWxlID0gKCkgPT4ge1xuICAgIGxldCBkZWZhdWx0U3R5bGUgPSBuZXcgQ2FsbHNjcmVlblN0eWxlKHtcbiAgICAgIG1heEhlaWdodDogXCIxMDAlXCIsXG4gICAgICBtYXhXaWR0aDogXCIxMDAlXCIsXG4gICAgICBib3JkZXI6IFwibm9uZVwiLFxuICAgICAgYm9yZGVyUmFkaXVzOiBcIjBcIixcbiAgICAgIGJhY2tncm91bmQ6IFwiIzFjMjIyNlwiLFxuICAgICAgbWluSGVpZ2h0OiBcIjQwMHB4XCIsXG4gICAgICBtaW5XaWR0aDogXCI0MDBweFwiLFxuICAgICAgbWluaW1pemVJY29uVGludDogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ5MDAoKSxcbiAgICAgIG1heGltaXplSWNvblRpbnQ6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50OTAwKCksXG4gICAgfSlcbiAgICB0aGlzLm9uZ29pbmdDYWxsU3R5bGUgPSB7IC4uLmRlZmF1bHRTdHlsZSwgLi4udGhpcy5vbmdvaW5nQ2FsbFN0eWxlIH1cbiAgfVxuICBzZXRBdmF0YXJTdHlsZSgpe1xuICAgIGxldCBkZWZhdWx0U3R5bGU6QXZhdGFyU3R5bGUgPSBuZXcgQXZhdGFyU3R5bGUoe1xuICAgICAgYm9yZGVyUmFkaXVzOiBcIjI0cHhcIixcbiAgICAgIHdpZHRoOiBcIjI4cHhcIixcbiAgICAgIGhlaWdodDogXCIyOHB4XCIsXG4gICAgICBib3JkZXI6IFwibm9uZVwiLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDcwMCgpLFxuICAgICAgbmFtZVRleHRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ5MDAoKSxcbiAgICAgIGJhY2tncm91bmRTaXplOiBcImNvdmVyXCIsXG4gICAgICBuYW1lVGV4dEZvbnQ6IGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS5zdWJ0aXRsZTEpLFxuICAgICAgb3V0ZXJWaWV3Qm9yZGVyOiBcIlwiLFxuICAgICAgb3V0ZXJWaWV3Qm9yZGVyU3BhY2luZzogXCJcIixcbiAgICB9KVxuICAgIHRoaXMuYXZhdGFyU3R5bGUgPSB7Li4uZGVmYXVsdFN0eWxlLC4uLnRoaXMuYXZhdGFyU3R5bGV9XG4gIH1cbnNldERhdGVTdHlsZSgpe1xuIGxldCBkZWZhdWx0U3R5bGUgPSBuZXcgRGF0ZVN0eWxlKHtcbiAgdGV4dEZvbnQ6IGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS5zdWJ0aXRsZTEpLFxuICB0ZXh0Q29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gIGJhY2tncm91bmQ6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MTAwKCksXG4gIGhlaWdodDogXCIxMDAlXCIsXG4gIHdpZHRoOiBcIjEwMCVcIixcbiAgYm9yZGVyOiBgMXB4IHNvbGlkICR7dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQxMDAoKX1gLFxuICBib3JkZXJSYWRpdXM6IFwiOHB4XCIsXG4gIH0pXG4gIHRoaXMuZGF0ZVNlcGFyYXRvclN0eWxlID0gey4uLmRlZmF1bHRTdHlsZSwuLi50aGlzLmRhdGVTZXBhcmF0b3JTdHlsZX1cbn1cbiAgc2V0TWVzc2FnZXNTdHlsZSgpe1xuICAgIHRoaXMuc21hcnRSZXBseVN0eWxlID0ge1xuICAgICAgcmVwbHlUZXh0Rm9udDpmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkuY2FwdGlvbjEpLFxuICAgICAgcmVwbHlUZXh0Q29sb3I6dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoKSxcbiAgICAgIHJlcGx5QmFja2dyb3VuZDp0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEJhY2tncm91bmQoKSxcbiAgICAgIGJveFNoYWRvdzpgMHB4IDBweCAxcHggJHt0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDYwMCgpfWAsXG4gICAgICBjbG9zZUljb25UaW50OnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gICAgICBiYWNrZ3JvdW5kOnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QmFja2dyb3VuZCgpLFxuICAgICAgLi4udGhpcy5zbWFydFJlcGx5U3R5bGVcbiAgICB9XG4gICAgdGhpcy5mdWxsU2NyZWVuVmlld2VyU3R5bGUuY2xvc2VJY29uVGludCA9IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0UHJpbWFyeSgpXG4gICAgbGV0IGRlZmF1bHRTdHlsZTpNZXNzYWdlTGlzdFN0eWxlID0gbmV3IE1lc3NhZ2VMaXN0U3R5bGUoe1xuICAgICAgYmFja2dyb3VuZDp0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEJhY2tncm91bmQoKSxcbiAgICAgIGJvcmRlcjpgbm9uZWAsXG4gICAgICBlbXB0eVN0YXRlVGV4dEZvbnQ6Zm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRpdGxlMSksXG4gICAgICBlbXB0eVN0YXRlVGV4dENvbG9yOnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gICAgICBlcnJvclN0YXRlVGV4dEZvbnQ6Zm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRpdGxlMSksXG4gICAgICBlcnJvclN0YXRlVGV4dENvbG9yOnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gICAgICBsb2FkaW5nSWNvblRpbnQ6dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ2MDAoKSxcbiAgICAgIG5hbWVUZXh0Rm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRpdGxlMiksXG4gICAgICBuYW1lVGV4dENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDYwMCgpLFxuICAgICAgdGhyZWFkUmVwbHlTZXBhcmF0b3JDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ0MDAoKSxcbiAgICAgIHRocmVhZFJlcGx5VGV4dEZvbnQ6IGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS5zdWJ0aXRsZTEpLFxuICAgICAgdGhyZWFkUmVwbHlJY29uVGludDogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ2MDAoKSxcbiAgICAgIHRocmVhZFJlcGx5VGV4dENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDYwMCgpLFxuICAgICAgVGltZXN0YW1wVGV4dEZvbnQ6IGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS5jYXB0aW9uMiksXG4gICAgICBUaW1lc3RhbXBUZXh0Q29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gICAgfSlcbiAgICB0aGlzLm1lc3NhZ2VMaXN0U3R5bGUgPSB7Li4uZGVmYXVsdFN0eWxlLC4uLnRoaXMubWVzc2FnZUxpc3RTdHlsZX1cbiAgICB0aGlzLmJ1YmJsZURhdGVTdHlsZSA9IHtcbiAgICAgIHRleHRDb2xvcjogdGhpcy5tZXNzYWdlTGlzdFN0eWxlLlRpbWVzdGFtcFRleHRDb2xvciB8fCB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDYwMCgpLFxuICAgICAgdGV4dEZvbnQ6IHRoaXMubWVzc2FnZUxpc3RTdHlsZS5UaW1lc3RhbXBUZXh0Rm9udCB8fCBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkuY2FwdGlvbjIpXG4gICAgfVxuICAgIHRoaXMubGlua1ByZXZpZXdTdHlsZSA9ICAgbmV3IExpbmtQcmV2aWV3U3R5bGUoe1xuICAgICAgdGl0bGVDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoKSxcbiAgICAgIHRpdGxlRm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRpdGxlMiksXG4gICAgICBkZXNjcmlwdGlvbkNvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDYwMCgpLFxuICAgICAgZGVzY3JpcHRpb25Gb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkuc3VidGl0bGUyKSxcbiAgICAgIGJhY2tncm91bmQ6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgICB3aWR0aDogXCIxMDAlXCJcbiAgICB9KVxuICAgIHRoaXMuZG9jdW1lbnRCdWJibGVTdHlsZSA9IHtcbiAgICAgIHRpdGxlRm9udDogIGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS50ZXh0MiksXG4gICAgICB0aXRsZUNvbG9yOiAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoKSxcbiAgICAgIHN1YnRpdGxlRm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnN1YnRpdGxlMiksXG4gICAgICBzdWJ0aXRsZUNvbG9yOiAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ2MDAoKSxcbiAgICAgIGljb25UaW50OiAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ3MDAoKSxcbiAgICAgIGJ1dHRvblRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkudGV4dDIpLFxuICAgICAgYnV0dG9uVGV4dENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldFByaW1hcnkoKSxcbiAgICAgIGJ1dHRvbkJhY2tncm91bmQ6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgIHNlcGFyYXRvckNvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDIwMCgpXG4gICAgfVxuXG4gICAgdGhpcy5wb2xsQnViYmxlU3R5bGUgPSB7XG4gICAgICBib3JkZXJSYWRpdXM6IFwiOHB4XCIsXG4gICAgICBiYWNrZ3JvdW5kOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICB2b3RlUGVyY2VudFRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkuc3VidGl0bGUyKSxcbiAgICAgIHZvdGVQZXJjZW50VGV4dENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDYwMCgpLFxuICAgICAgcG9sbFF1ZXN0aW9uVGV4dEZvbnQ6IGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS5zdWJ0aXRsZTEpLFxuICAgICAgcG9sbFF1ZXN0aW9uVGV4dENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudCgpLFxuICAgICAgcG9sbE9wdGlvblRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkudGV4dDIpLFxuICAgICAgcG9sbE9wdGlvblRleHRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoKSxcbiAgICAgIHBvbGxPcHRpb25CYWNrZ3JvdW5kOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDkwMCgpLFxuICAgICAgb3B0aW9uc0ljb25UaW50OiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDYwMCgpLFxuICAgICAgdG90YWxWb3RlQ291bnRUZXh0Rm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnN1YnRpdGxlMiksXG4gICAgICB0b3RhbFZvdGVDb3VudFRleHRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ2MDAoKSxcbiAgICAgIHNlbGVjdGVkUG9sbE9wdGlvbkJhY2tncm91bmQ6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MjAwKCksXG4gICAgICB1c2VyU2VsZWN0ZWRPcHRpb25CYWNrZ3JvdW5kOnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0UHJpbWFyeSgpLFxuICAgICAgcG9sbE9wdGlvbkJvcmRlcjpgMXB4IHNvbGlkICR7dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQxMDAoKX1gLFxuICAgICAgcG9sbE9wdGlvbkJvcmRlclJhZGl1czpcIjhweFwiXG4gICAgfVxuICAgIHRoaXMuaW1hZ2VNb2RlcmF0aW9uU3R5bGUgPSB7XG4gICAgICBmaWx0ZXJDb2xvcjp0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldFByaW1hcnkoKSxcbiAgICAgIGhlaWdodDpcIjEwMCVcIixcbiAgICAgIHdpZHRoOlwiMTAwJVwiLFxuICAgICAgYm9yZGVyOlwibm9uZVwiLFxuICAgICAgd2FybmluZ1RleHRDb2xvcjp0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudChcImRhcmtcIiksXG4gICAgICB3YXJuaW5nVGV4dEZvbnQ6Zm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRpdGxlMiksXG4gICAgfVxuICAgIHRoaXMuY29uZmlybURpYWxvZ1N0eWxlID0ge1xuICAgICAgY29uZmlybUJ1dHRvbkJhY2tncm91bmQ6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0RXJyb3IoKSxcbiAgICAgIGNhbmNlbEJ1dHRvbkJhY2tncm91bmQ6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0U2Vjb25kYXJ5KCksXG4gICAgICBjb25maXJtQnV0dG9uVGV4dENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDkwMChcImxpZ2h0XCIpLFxuICAgICAgY29uZmlybUJ1dHRvblRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkudGV4dDIpLFxuICAgICAgY2FuY2VsQnV0dG9uVGV4dENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDkwMChcImRhcmtcIiksXG4gICAgICBjYW5jZWxCdXR0b25UZXh0Rm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRleHQyKSxcbiAgICAgIHRpdGxlRm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRpdGxlMSksXG4gICAgICB0aXRsZUNvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudCgpLFxuICAgICAgbWVzc2FnZVRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkuc3VidGl0bGUyKSxcbiAgICAgIG1lc3NhZ2VUZXh0Q29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gICAgICBiYWNrZ3JvdW5kOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEJhY2tncm91bmQoKSxcbiAgICAgIGhlaWdodDpcIjEwMCVcIixcbiAgICAgIHdpZHRoOlwiMTAwJVwiLFxuICAgICAgYm9yZGVyOmAxcHggc29saWQgJHt0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDEwMCgpfWAsXG4gICAgICBib3JkZXJSYWRpdXM6XCI4cHhcIlxuICAgIH1cbiAgfVxuICBzZXRSZWNlaXB0U3R5bGUoKXtcbiAgICB0aGlzLnJlY2VpcHRTdHlsZSA9IG5ldyBSZWNlaXB0U3R5bGUoe1xud2FpdEljb25UaW50OnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NzAwKCksXG5zZW50SWNvblRpbnQ6dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ2MDAoKSxcbmRlbGl2ZXJlZEljb25UaW50OnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG5yZWFkSWNvblRpbnQ6dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRQcmltYXJ5KCksXG5lcnJvckljb25UaW50OnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0RXJyb3IoKSxcbiAgICB9KVxuICAgIHRoaXMucmVjZWlwdFN0eWxlID0gey4uLnRoaXMucmVjZWlwdFN0eWxlfVxuICB9XG4gIGNyZWF0ZVJlcXVlc3RCdWlsZGVyKCl7XG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlcyB8fCB0aGlzLnRlbXBsYXRlcz8ubGVuZ3RoID09IDApIHtcbiAgICAgIHRoaXMubWVzc2FnZVRlbXBsYXRlID0gQ2hhdENvbmZpZ3VyYXRvci5nZXREYXRhU291cmNlKCkuZ2V0QWxsTWVzc2FnZVRlbXBsYXRlcygpXG4gICAgICB0aGlzLmNhdGVnb3JpZXMgPSBDaGF0Q29uZmlndXJhdG9yLmdldERhdGFTb3VyY2UoKS5nZXRBbGxNZXNzYWdlQ2F0ZWdvcmllcygpXG4gICAgICB0aGlzLnR5cGVzID0gQ2hhdENvbmZpZ3VyYXRvci5nZXREYXRhU291cmNlKCkuZ2V0QWxsTWVzc2FnZVR5cGVzKClcbiAgICB9XG4gICAgZWxzZSB7XG5cbiAgICAgIHRoaXMubWVzc2FnZVRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZXNcbiAgICB9XG4gICAgdGhpcy5zdGF0ZSA9IFN0YXRlcy5sb2FkaW5nXG4gICAgdGhpcy5yZXF1ZXN0QnVpbGRlciA9IG51bGxcbiAgICBpZiAodGhpcy51c2VyIHx8IHRoaXMuZ3JvdXApIHtcbiAgICAgIGlmICghdGhpcy5tZXNzYWdlc1JlcXVlc3RCdWlsZGVyKSB7XG4gICAgICAgIGlmICh0aGlzLnVzZXIpIHtcbiAgICAgICAgICB0aGlzLnJlcXVlc3RCdWlsZGVyID0gbmV3IENvbWV0Q2hhdC5NZXNzYWdlc1JlcXVlc3RCdWlsZGVyKClcbiAgICAgICAgICAgIC5zZXRVSUQodGhpcy51c2VyLmdldFVpZCgpKVxuICAgICAgICAgICAgLnNldExpbWl0KHRoaXMubGltaXQpXG4gICAgICAgICAgICAuc2V0VHlwZXModGhpcy50eXBlcylcbiAgICAgICAgICAgIC5zZXRDYXRlZ29yaWVzKHRoaXMuY2F0ZWdvcmllcylcbiAgICAgICAgICAgIC5oaWRlUmVwbGllcyh0cnVlKVxuICAgICAgICAgICAgLmJ1aWxkKClcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlcXVlc3RCdWlsZGVyID0gbmV3IENvbWV0Q2hhdC5NZXNzYWdlc1JlcXVlc3RCdWlsZGVyKClcbiAgICAgICAgICAgIC5zZXRHVUlEKHRoaXMuZ3JvdXAuZ2V0R3VpZCgpKVxuICAgICAgICAgICAgLnNldExpbWl0KHRoaXMubGltaXQpXG4gICAgICAgICAgICAuc2V0VHlwZXModGhpcy50eXBlcylcbiAgICAgICAgICAgIC5oaWRlUmVwbGllcyh0cnVlKVxuICAgICAgICAgICAgLnNldENhdGVnb3JpZXModGhpcy5jYXRlZ29yaWVzKVxuICAgICAgICAgICAgLmJ1aWxkKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMucmVxdWVzdEJ1aWxkZXIgPSB0aGlzLm1lc3NhZ2VzUmVxdWVzdEJ1aWxkZXIuYnVpbGQoKVxuICAgICAgfVxuICAgICAgdGhpcy5mZXRjaFByZXZpb3VzTWVzc2FnZXMoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gKiBMaXN0ZW5lciBUbyBSZWNlaXZlIE1lc3NhZ2VzIGluIFJlYWwgVGltZVxuICogQHBhcmFtXG4gKi9cbiAgZmV0Y2hQcmV2aW91c01lc3NhZ2VzID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnJlaW5pdGlhbGl6ZWQpIHtcbiAgICAgIGlmICh0aGlzLm1lc3NhZ2VzUmVxdWVzdEJ1aWxkZXIpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0QnVpbGRlciA9IHRoaXMubWVzc2FnZXNSZXF1ZXN0QnVpbGRlci5zZXRNZXNzYWdlSWQodGhpcy5tZXNzYWdlc0xpc3RbMF0uZ2V0SWQoKSkuYnVpbGQoKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnVzZXIpIHtcbiAgICAgICAgICB0aGlzLnJlcXVlc3RCdWlsZGVyID0gbmV3IENvbWV0Q2hhdC5NZXNzYWdlc1JlcXVlc3RCdWlsZGVyKCkuc2V0VUlEKHRoaXMudXNlci5nZXRVaWQoKSlcbiAgICAgICAgICAgIC5zZXRMaW1pdCh0aGlzLmxpbWl0KVxuICAgICAgICAgICAgLnNldFR5cGVzKHRoaXMudHlwZXMpXG4gICAgICAgICAgICAuc2V0TWVzc2FnZUlkKHRoaXMubWVzc2FnZXNMaXN0WzBdLmdldElkKCkpXG4gICAgICAgICAgICAuc2V0Q2F0ZWdvcmllcyh0aGlzLmNhdGVnb3JpZXMpXG4gICAgICAgICAgICAuaGlkZVJlcGxpZXModHJ1ZSlcbiAgICAgICAgICAgIC5idWlsZCgpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZXF1ZXN0QnVpbGRlciA9IG5ldyBDb21ldENoYXQuTWVzc2FnZXNSZXF1ZXN0QnVpbGRlcigpLnNldEdVSUQodGhpcy5ncm91cC5nZXRHdWlkKCkpXG4gICAgICAgICAgICAuc2V0TGltaXQodGhpcy5saW1pdClcbiAgICAgICAgICAgIC5zZXRUeXBlcyh0aGlzLnR5cGVzKVxuICAgICAgICAgICAgLnNldE1lc3NhZ2VJZCh0aGlzLm1lc3NhZ2VzTGlzdFswXS5nZXRJZCgpKVxuICAgICAgICAgICAgLnNldENhdGVnb3JpZXModGhpcy5jYXRlZ29yaWVzKVxuICAgICAgICAgICAgLmhpZGVSZXBsaWVzKHRydWUpXG4gICAgICAgICAgICAuYnVpbGQoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucmVxdWVzdEJ1aWxkZXIuZmV0Y2hQcmV2aW91cygpLnRoZW4oXG4gICAgICAobWVzc2FnZUxpc3Q6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZVtdKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2VMaXN0KVxuICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGVzLmxvYWRpbmc7XG4gICAgICAgIC8vIE5vIE1lc3NhZ2VzIEZvdW5kXG4gICAgICAgIGlmIChtZXNzYWdlTGlzdC5sZW5ndGggPT09IDAgJiYgdGhpcy5tZXNzYWdlc0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlcy5lbXB0eTtcbiAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlTGlzdCAmJiBtZXNzYWdlTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbGV0IGxhc3RNZXNzYWdlID0gbWVzc2FnZUxpc3RbbWVzc2FnZUxpc3QubGVuZ3RoIC0gMV1cbiAgICAgICAgICBpZiAobGFzdE1lc3NhZ2U/LmdldFNlbmRlcigpLmdldFVpZCgpICE9IHRoaXMubG9nZ2VkSW5Vc2VyPy5nZXRVaWQoKSAmJiAhbGFzdE1lc3NhZ2UuZ2V0RGVsaXZlcmVkQXQoKSkge1xuICAgICAgICAgICAgLy9tYXJrIHRoZSBtZXNzYWdlIGFzIGRlbGl2ZXJlZFxuICAgICAgICAgICAgaWYoIXRoaXMuZGlzYWJsZVJlY2VpcHQpe1xuICAgICAgICAgICAgICBDb21ldENoYXQubWFya0FzRGVsaXZlcmVkKGxhc3RNZXNzYWdlKS50aGVuKChyZWNlaXB0OkNvbWV0Q2hhdC5NZXNzYWdlUmVjZWlwdCk9PntcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZUtleSA9IHRoaXMubWVzc2FnZXNMaXN0LmZpbmRJbmRleCgobTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKSA9PiBtLmdldElkKCkgPT09IE51bWJlcihyZWNlaXB0Py5nZXRNZXNzYWdlSWQoKSkpO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlS2V5ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXJrQWxsTWVzc2FnQXNEZWxpdmVyZWQobWVzc2FnZUtleSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWxhc3RNZXNzYWdlPy5nZXRSZWFkQXQoKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVSZWNlaXB0KSB7XG4gICAgICAgICAgICAgIENvbWV0Q2hhdC5tYXJrQXNSZWFkKGxhc3RNZXNzYWdlKS50aGVuKChyZWNlaXB0OkNvbWV0Q2hhdC5NZXNzYWdlUmVjZWlwdCk9PntcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZUtleSA9IHRoaXMubWVzc2FnZXNMaXN0LmZpbmRJbmRleCgobTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKSA9PiBtLmdldElkKCkgPT09IE51bWJlcihyZWNlaXB0Py5nZXRNZXNzYWdlSWQoKSkpO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlS2V5ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXJrQWxsTWVzc2FnQXNSZWFkKG1lc3NhZ2VLZXkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3I6YW55KT0+e1xuICAgICAgICAgICAgICAgIGlmKHRoaXMub25FcnJvcil7XG4gICAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5VbnJlYWRDb3VudCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGVzLmxvYWRlZFxuICAgICAgICAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgLy9pZiB0aGUgc2VuZGVyIG9mIHRoZSBtZXNzYWdlIGlzIG5vdCB0aGUgbG9nZ2VkaW4gdXNlciwgbWFyayBpdCBhcyByZWFkLlxuICAgICAgICAgICAgbGV0IHByZXZTY3JvbGxIZWlnaHQgPSB0aGlzLmxpc3RTY3JvbGwubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5saXN0U2Nyb2xsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID1cbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RTY3JvbGwubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQgLSBwcmV2U2Nyb2xsSGVpZ2h0O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnNob3dTbWFydFJlcGx5ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNtYXJ0UmVwbHlNZXNzYWdlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMucHJlcGVuZE1lc3NhZ2VzKG1lc3NhZ2VMaXN0KVxuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlcy5sb2FkZWRcbiAgICAgICAgfVxuICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSxcbiAgICAgIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZXMuZXJyb3I7XG4gICAgICAgIGlmKHRoaXMub25FcnJvcil7XG50aGlzLm9uRXJyb3IoZXJyb3IpO1xufVxuICAgICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgICkuY2F0Y2goKGVycm9yOiBhbnkpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxuICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlcy5lcnJvcjtcbiAgICAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSlcbiAgfVxuICBmZXRjaE5leHRNZXNzYWdlID0gKCkgPT4ge1xuICAgIGxldCBpbmRleCA9IHRoaXMubWVzc2FnZXNMaXN0Lmxlbmd0aCAtIDFcbiAgICBpZiAodGhpcy5yZWluaXRpYWxpemVkKSB7XG4gICAgICBpZiAodGhpcy5tZXNzYWdlc1JlcXVlc3RCdWlsZGVyKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdEJ1aWxkZXIgPSB0aGlzLm1lc3NhZ2VzUmVxdWVzdEJ1aWxkZXIuc2V0TWVzc2FnZUlkKHRoaXMubWVzc2FnZXNMaXN0W2luZGV4XS5nZXRJZCgpKS5idWlsZCgpXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMudXNlcikge1xuICAgICAgICAgIHRoaXMucmVxdWVzdEJ1aWxkZXIgPSBuZXcgQ29tZXRDaGF0Lk1lc3NhZ2VzUmVxdWVzdEJ1aWxkZXIoKS5zZXRVSUQodGhpcy51c2VyLmdldFVpZCgpKVxuICAgICAgICAgICAgLnNldExpbWl0KHRoaXMubGltaXQpXG4gICAgICAgICAgICAuc2V0VHlwZXModGhpcy50eXBlcylcbiAgICAgICAgICAgIC5zZXRNZXNzYWdlSWQodGhpcy5tZXNzYWdlc0xpc3RbaW5kZXhdLmdldElkKCkpXG4gICAgICAgICAgICAuc2V0Q2F0ZWdvcmllcyh0aGlzLmNhdGVnb3JpZXMpXG4gICAgICAgICAgICAuaGlkZVJlcGxpZXModHJ1ZSlcbiAgICAgICAgICAgIC5idWlsZCgpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZXF1ZXN0QnVpbGRlciA9IG5ldyBDb21ldENoYXQuTWVzc2FnZXNSZXF1ZXN0QnVpbGRlcigpLnNldEdVSUQodGhpcy5ncm91cC5nZXRHdWlkKCkpXG4gICAgICAgICAgICAuc2V0TGltaXQodGhpcy5saW1pdClcbiAgICAgICAgICAgIC5zZXRUeXBlcyh0aGlzLnR5cGVzKVxuICAgICAgICAgICAgLnNldE1lc3NhZ2VJZCh0aGlzLm1lc3NhZ2VzTGlzdFtpbmRleF0uZ2V0SWQoKSlcbiAgICAgICAgICAgIC5zZXRDYXRlZ29yaWVzKHRoaXMuY2F0ZWdvcmllcylcbiAgICAgICAgICAgIC5oaWRlUmVwbGllcyh0cnVlKVxuICAgICAgICAgICAgLmJ1aWxkKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5yZXF1ZXN0QnVpbGRlci5mZXRjaE5leHQoKS50aGVuKFxuICAgICAgICAobWVzc2FnZUxpc3Q6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZVtdKSA9PiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlcy5sb2FkaW5nO1xuICAgICAgICAgIC8vIE5vIE1lc3NhZ2VzIEZvdW5kXG4gICAgICAgICAgaWYgKG1lc3NhZ2VMaXN0Lmxlbmd0aCA9PT0gMCAmJiB0aGlzLm1lc3NhZ2VzTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZXMuZW1wdHk7XG4gICAgICAgICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtZXNzYWdlTGlzdCAmJiBtZXNzYWdlTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBsYXN0TWVzc2FnZSA9IG1lc3NhZ2VMaXN0W21lc3NhZ2VMaXN0Lmxlbmd0aCAtIDFdXG4gICAgICAgICAgICBpZiAoIWxhc3RNZXNzYWdlPy5nZXRSZWFkQXQoKSAmJiBsYXN0TWVzc2FnZT8uZ2V0U2VuZGVyKCkuZ2V0VWlkKCkgIT0gdGhpcy5sb2dnZWRJblVzZXI/LmdldFVpZCgpKSB7XG4gICAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlUmVjZWlwdCkge1xuICAgICAgICAgICAgICAgIENvbWV0Q2hhdC5tYXJrQXNSZWFkKGxhc3RNZXNzYWdlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLlVucmVhZENvdW50ID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoIWxhc3RNZXNzYWdlPy5nZXREZWxpdmVyZWRBdCgpICYmIGxhc3RNZXNzYWdlPy5nZXRTZW5kZXIoKS5nZXRVaWQoKSAhPSB0aGlzLmxvZ2dlZEluVXNlcj8uZ2V0VWlkKCkpe1xuICAgICAgICAgICAgIHRoaXMubWFya01lc3NhZ2VBc0RlbGl2ZXJlZChsYXN0TWVzc2FnZSlcbiAgICAgICAgICAgICB0aGlzLm1hcmtBbGxNZXNzYWdBc0RlbGl2ZXJlZChtZXNzYWdlTGlzdC5sZW5ndGggLSAxKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlcy5sb2FkZWRcblxuICAgICAgICAgICAgICBsZXQgcHJldlNjcm9sbEhlaWdodCA9IHRoaXMubGlzdFNjcm9sbC5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0U2Nyb2xsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID1cbiAgICAgICAgICAgICAgICAgIHRoaXMubGlzdFNjcm9sbC5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodCAtIHByZXZTY3JvbGxIZWlnaHQ7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLmFwcGVuZE1lc3NhZ2VzKG1lc3NhZ2VMaXN0KVxuICAgICAgICAgICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlcy5lcnJvcjtcbiAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcilcbiAgICAgICAgICBpZih0aGlzLm9uRXJyb3Ipe1xudGhpcy5vbkVycm9yKGVycm9yKTtcbn1cbiAgICAgICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICApLmNhdGNoKChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxuICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGVzLmVycm9yO1xuICAgICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSlcbiAgICB9XG4gIH1cbiAgYXBwZW5kTWVzc2FnZXMgPSAobWVzc2FnZXM6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZVtdKSA9PiB7XG4gICAgdGhpcy5tZXNzYWdlc0xpc3QucHVzaCguLi5tZXNzYWdlcylcbiAgICB0aGlzLm1lc3NhZ2VDb3VudCA9IHRoaXMubWVzc2FnZXNMaXN0Lmxlbmd0aDtcbiAgICBpZiAodGhpcy5tZXNzYWdlQ291bnQgPiB0aGlzLnRocmVzaG9sZFZhbHVlKSB7XG4gICAgICB0aGlzLmtlZXBSZWNlbnRNZXNzYWdlcyA9IHRydWVcbiAgICAgIHRoaXMucmVJbml0aWFsaXplTWVzc2FnZUJ1aWxkZXIoKTtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZSA9IFN0YXRlcy5sb2FkZWRcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cbiAgYWRkTWVzc2FnZUV2ZW50TGlzdGVuZXJzKCkge1xuICAgIHRyeSB7XG4gICAgICBDb21ldENoYXQuYWRkTWVzc2FnZUxpc3RlbmVyKFxuICAgICAgICB0aGlzLm1zZ0xpc3RlbmVySWQsXG4gICAgICAgIG5ldyBDb21ldENoYXQuTWVzc2FnZUxpc3RlbmVyKHtcbiAgICAgICAgICBvblRleHRNZXNzYWdlUmVjZWl2ZWQ6ICh0ZXh0TWVzc2FnZTogQ29tZXRDaGF0LlRleHRNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VVcGRhdGUoQ29tZXRDaGF0VUlLaXRDb25zdGFudHMubWVzc2FnZXMuVEVYVF9NRVNTQUdFX1JFQ0VJVkVELCB0ZXh0TWVzc2FnZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkN1c3RvbU1lc3NhZ2VSZWNlaXZlZDogKGN1c3RvbU1lc3NhZ2U6IENvbWV0Q2hhdC5DdXN0b21NZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VVcGRhdGUoQ29tZXRDaGF0VUlLaXRDb25zdGFudHMubWVzc2FnZXMuQ1VTVE9NX01FU1NBR0VfUkVDRUlWRUQsIGN1c3RvbU1lc3NhZ2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25NZWRpYU1lc3NhZ2VSZWNlaXZlZDogKG1lZGlhTWVzc2FnZTogQ29tZXRDaGF0Lk1lZGlhTWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVXBkYXRlKENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLm1lc3NhZ2VzLk1FRElBX01FU1NBR0VfUkVDRUlWRUQsIG1lZGlhTWVzc2FnZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbk1lc3NhZ2VzRGVsaXZlcmVkOiAobWVzc2FnZVJlY2VpcHQ6IENvbWV0Q2hhdC5NZXNzYWdlUmVjZWlwdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVXBkYXRlKENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLm1lc3NhZ2VzLk1FU1NBR0VfREVMSVZFUkVELCBtZXNzYWdlUmVjZWlwdCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbk1lc3NhZ2VzUmVhZDogKG1lc3NhZ2VSZWNlaXB0OiBDb21ldENoYXQuTWVzc2FnZVJlY2VpcHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVVwZGF0ZShDb21ldENoYXRVSUtpdENvbnN0YW50cy5tZXNzYWdlcy5NRVNTQUdFX1JFQUQsIG1lc3NhZ2VSZWNlaXB0KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uTWVzc2FnZURlbGV0ZWQ6IChkZWxldGVkTWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VVcGRhdGUoQ29tZXRDaGF0VUlLaXRDb25zdGFudHMubWVzc2FnZXMuTUVTU0FHRV9ERUxFVEVELCBkZWxldGVkTWVzc2FnZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbk1lc3NhZ2VFZGl0ZWQ6IChlZGl0ZWRNZXNzYWdlOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVVwZGF0ZShDb21ldENoYXRVSUtpdENvbnN0YW50cy5tZXNzYWdlcy5NRVNTQUdFX0VESVRFRCwgZWRpdGVkTWVzc2FnZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblRyYW5zaWVudE1lc3NhZ2VSZWNlaXZlZDogKHRyYW5zaWVudE1lc3NhZ2U6IENvbWV0Q2hhdC5UcmFuc2llbnRNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICBsZXQgbGl2ZVJlYWN0aW9uOiBhbnkgPSB0cmFuc2llbnRNZXNzYWdlLmdldERhdGEoKTtcbiAgICAgICAgICAgIGlmICh0cmFuc2llbnRNZXNzYWdlLmdldFJlY2VpdmVyVHlwZSgpID09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VSZWNlaXZlclR5cGUudXNlciAmJiB0aGlzLnVzZXIgJiYgdHJhbnNpZW50TWVzc2FnZT8uZ2V0U2VuZGVyKCkuZ2V0VWlkKCkgPT0gdGhpcy51c2VyLmdldFVpZCgpICYmIHRyYW5zaWVudE1lc3NhZ2UuZ2V0UmVjZWl2ZXJJZCgpID09IHRoaXMubG9nZ2VkSW5Vc2VyPy5nZXRVaWQoKSkge1xuICAgICAgICAgICAgICBDb21ldENoYXRNZXNzYWdlRXZlbnRzLmNjTGl2ZVJlYWN0aW9uLm5leHQobGl2ZVJlYWN0aW9uW1wiTElWRV9SRUFDVElPTlwiXSlcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHJhbnNpZW50TWVzc2FnZS5nZXRSZWNlaXZlclR5cGUoKSA9PSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlUmVjZWl2ZXJUeXBlLmdyb3VwICYmIHRoaXMuZ3JvdXAgJiYgdHJhbnNpZW50TWVzc2FnZS5nZXRSZWNlaXZlcklkKCkgPT0gdGhpcy5ncm91cC5nZXRHdWlkKCkgJiYgdHJhbnNpZW50TWVzc2FnZT8uZ2V0U2VuZGVyKCkuZ2V0VWlkKCkgIT0gdGhpcy5sb2dnZWRJblVzZXI/LmdldFVpZCgpKSB7XG4gICAgICAgICAgICAgIENvbWV0Q2hhdE1lc3NhZ2VFdmVudHMuY2NMaXZlUmVhY3Rpb24ubmV4dChsaXZlUmVhY3Rpb25bXCJMSVZFX1JFQUNUSU9OXCJdKVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBDb21ldENoYXQuYWRkR3JvdXBMaXN0ZW5lcihcbiAgICAgICAgdGhpcy5ncm91cExpc3RlbmVySWQsXG4gICAgICAgIG5ldyBDb21ldENoYXQuR3JvdXBMaXN0ZW5lcih7XG4gICAgICAgICAgb25Hcm91cE1lbWJlclNjb3BlQ2hhbmdlZDogKFxuICAgICAgICAgICAgbWVzc2FnZTogbnVsbCB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNoYW5nZWRVc2VyOiBDb21ldENoYXQuVXNlcixcbiAgICAgICAgICAgIG5ld1Njb3BlOiBDb21ldENoYXQuR3JvdXBNZW1iZXJTY29wZSxcbiAgICAgICAgICAgIG9sZFNjb3BlOiBDb21ldENoYXQuR3JvdXBNZW1iZXJTY29wZSxcbiAgICAgICAgICAgIGNoYW5nZWRHcm91cDogbnVsbCB8IHVuZGVmaW5lZFxuICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVXBkYXRlKFxuICAgICAgICAgICAgICBDb21ldENoYXRVSUtpdENvbnN0YW50cy5ncm91cE1lbWJlckFjdGlvbi5TQ09QRV9DSEFOR0UsXG4gICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgIGNoYW5nZWRHcm91cCxcbiAgICAgICAgICAgICAgeyB1c2VyOiBjaGFuZ2VkVXNlciwgc2NvcGU6IG5ld1Njb3BlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkdyb3VwTWVtYmVyS2lja2VkOiAobWVzc2FnZTogbnVsbCB8IHVuZGVmaW5lZCwga2lja2VkVXNlcjogQ29tZXRDaGF0LlVzZXIsIGtpY2tlZEJ5OiBDb21ldENoYXQuVXNlciwga2lja2VkRnJvbTogbnVsbCB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVXBkYXRlKFxuICAgICAgICAgICAgICBDb21ldENoYXRVSUtpdENvbnN0YW50cy5ncm91cE1lbWJlckFjdGlvbi5LSUNLRUQsXG4gICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgIGtpY2tlZEZyb20sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1c2VyOiBraWNrZWRVc2VyLFxuICAgICAgICAgICAgICAgIGhhc0pvaW5lZDogZmFsc2UsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkdyb3VwTWVtYmVyQmFubmVkOiAobWVzc2FnZTogbnVsbCB8IHVuZGVmaW5lZCwgYmFubmVkVXNlcjogQ29tZXRDaGF0LlVzZXIsIGJhbm5lZEJ5OiBDb21ldENoYXQuVXNlciwgYmFubmVkRnJvbTogbnVsbCB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVXBkYXRlKFxuICAgICAgICAgICAgICBDb21ldENoYXRVSUtpdENvbnN0YW50cy5ncm91cE1lbWJlckFjdGlvbi5CQU5ORUQsXG4gICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgIGJhbm5lZEZyb20sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1c2VyOiBiYW5uZWRVc2VyLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Hcm91cE1lbWJlclVuYmFubmVkOiAoXG4gICAgICAgICAgICBtZXNzYWdlOiBudWxsIHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgdW5iYW5uZWRVc2VyOiBDb21ldENoYXQuVXNlcixcbiAgICAgICAgICAgIHVuYmFubmVkQnk6IENvbWV0Q2hhdC5Vc2VyLFxuICAgICAgICAgICAgdW5iYW5uZWRGcm9tOiBudWxsIHwgdW5kZWZpbmVkXG4gICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VVcGRhdGUoXG4gICAgICAgICAgICAgIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLmdyb3VwTWVtYmVyQWN0aW9uLlVOQkFOTkVELFxuICAgICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgICB1bmJhbm5lZEZyb20sXG4gICAgICAgICAgICAgIHsgdXNlcjogdW5iYW5uZWRVc2VyIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbk1lbWJlckFkZGVkVG9Hcm91cDogKFxuICAgICAgICAgICAgbWVzc2FnZTogbnVsbCB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHVzZXJBZGRlZDogQ29tZXRDaGF0LlVzZXIsXG4gICAgICAgICAgICB1c2VyQWRkZWRCeTogQ29tZXRDaGF0LlVzZXIsXG4gICAgICAgICAgICB1c2VyQWRkZWRJbjogbnVsbCB8IHVuZGVmaW5lZFxuICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVXBkYXRlKFxuICAgICAgICAgICAgICBDb21ldENoYXRVSUtpdENvbnN0YW50cy5ncm91cE1lbWJlckFjdGlvbi5BRERFRCxcbiAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgdXNlckFkZGVkSW4sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1c2VyOiB1c2VyQWRkZWQsXG4gICAgICAgICAgICAgICAgaGFzSm9pbmVkOiB0cnVlLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Hcm91cE1lbWJlckxlZnQ6IChtZXNzYWdlOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UsIGxlYXZpbmdVc2VyOiBDb21ldENoYXQuR3JvdXBNZW1iZXIsIGdyb3VwOiBDb21ldENoYXQuR3JvdXApID0+IHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVVwZGF0ZShDb21ldENoYXRVSUtpdENvbnN0YW50cy5ncm91cE1lbWJlckFjdGlvbi5MRUZULCBtZXNzYWdlLCBncm91cCwge1xuICAgICAgICAgICAgICB1c2VyOiBsZWF2aW5nVXNlcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Hcm91cE1lbWJlckpvaW5lZDogKG1lc3NhZ2U6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSwgam9pbmVkVXNlcjogQ29tZXRDaGF0Lkdyb3VwTWVtYmVyLCBqb2luZWRHcm91cDogQ29tZXRDaGF0Lkdyb3VwKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VVcGRhdGUoXG4gICAgICAgICAgICAgIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLmdyb3VwTWVtYmVyQWN0aW9uLkpPSU5FRCxcbiAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgam9pbmVkR3JvdXAsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1c2VyOiBqb2luZWRVc2VyLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgaWYodGhpcy5lbmFibGVDYWxsaW5nKXtcbiAgICAgICAgQ29tZXRDaGF0LmFkZENhbGxMaXN0ZW5lcihcbiAgICAgICAgICB0aGlzLmNhbGxMaXN0ZW5lcklkLFxuICAgICAgICAgIG5ldyBDb21ldENoYXQuQ2FsbExpc3RlbmVyKHtcbiAgICAgICAgICAgIG9uSW5jb21pbmdDYWxsUmVjZWl2ZWQ6IChjYWxsOiBDb21ldENoYXQuQ2FsbCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmFkZE1lc3NhZ2UoY2FsbClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkluY29taW5nQ2FsbENhbmNlbGxlZDogKGNhbGw6IENvbWV0Q2hhdC5DYWxsKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuYWRkTWVzc2FnZShjYWxsKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uT3V0Z29pbmdDYWxsUmVqZWN0ZWQ6IChjYWxsOiBDb21ldENoYXQuQ2FsbCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmFkZE1lc3NhZ2UoY2FsbClcblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uT3V0Z29pbmdDYWxsQWNjZXB0ZWQ6IChjYWxsOiBDb21ldENoYXQuQ2FsbCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmFkZE1lc3NhZ2UoY2FsbClcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYodGhpcy5vbkVycm9yKXtcbnRoaXMub25FcnJvcihlcnJvcik7XG59XG4gICAgfVxuICB9XG4gIC8qKlxuKlxuKiBAcGFyYW1cbiovXG4gIC8qKlxuICAgKiBVcGRhdGVzIG1lc3NhZ2VMaXN0IG9uIGJhc2lzIG9mIHVzZXIgYWN0aXZpdHkgb3IgZ3JvdXAgYWN0aXZpdHkgb3IgY2FsbGluZyBhY3Rpdml0eVxuICAgKiBAcGFyYW0gIHthbnk9bnVsbH0ga2V5XG4gICAqIEBwYXJhbSAge0NvbWV0Q2hhdC5NZXNzYWdlUmVjZWlwdCB8IENvbWV0Q2hhdC5CYXNlTWVzc2FnZX0gbWVzc2FnZVxuICAgKiBAcGFyYW0gIHtDb21ldENoYXQuR3JvdXAgfCBudWxsPW51bGx9IGdyb3VwXG4gICAqIEBwYXJhbSAge2FueT1udWxsfSBvcHRpb25zXG4gICAqL1xuICBtZXNzYWdlVXBkYXRlKGtleTogc3RyaW5nIHwgbnVsbCA9IG51bGwsIG1lc3NhZ2U6IENvbWV0Q2hhdC5NZXNzYWdlUmVjZWlwdCB8IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSB8IGFueSA9IG51bGwsIGdyb3VwOiBDb21ldENoYXQuR3JvdXAgfCBudWxsID0gbnVsbCwgb3B0aW9uczogYW55ID0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLm1lc3NhZ2VzLlRFWFRfTUVTU0FHRV9SRUNFSVZFRDpcbiAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5tZXNzYWdlcy5NRURJQV9NRVNTQUdFX1JFQ0VJVkVEOlxuICAgICAgICAgIHRoaXMubWVzc2FnZVJlY2VpdmVkKG1lc3NhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLm1lc3NhZ2VzLk1FU1NBR0VfREVMSVZFUkVEOlxuICAgICAgICBjYXNlIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLm1lc3NhZ2VzLk1FU1NBR0VfUkVBRDpcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VSZWFkQW5kRGVsaXZlcmVkKG1lc3NhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLm1lc3NhZ2VzLk1FU1NBR0VfREVMRVRFRDpcbiAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5tZXNzYWdlcy5NRVNTQUdFX0VESVRFRDoge1xuICAgICAgICAgIHRoaXMubWVzc2FnZUVkaXRlZChtZXNzYWdlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLmdyb3VwTWVtYmVyQWN0aW9uLlNDT1BFX0NIQU5HRTpcbiAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5ncm91cE1lbWJlckFjdGlvbi5KT0lORUQ6XG4gICAgICAgIGNhc2UgQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuZ3JvdXBNZW1iZXJBY3Rpb24uTEVGVDpcbiAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5ncm91cE1lbWJlckFjdGlvbi5BRERFRDpcbiAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5ncm91cE1lbWJlckFjdGlvbi5LSUNLRUQ6XG4gICAgICAgIGNhc2UgQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuZ3JvdXBNZW1iZXJBY3Rpb24uQkFOTkVEOlxuICAgICAgICBjYXNlIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLmdyb3VwTWVtYmVyQWN0aW9uLlVOQkFOTkVEOiB7XG4gICAgICAgICAgdGhpcy5hZGRNZXNzYWdlKG1lc3NhZ2UpXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5tZXNzYWdlcy5DVVNUT01fTUVTU0FHRV9SRUNFSVZFRDpcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tTWVzc2FnZVJlY2VpdmVkKG1lc3NhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmKHRoaXMub25FcnJvcil7XG50aGlzLm9uRXJyb3IoZXJyb3IpO1xufVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogdHJhbnNsYXRlIG1lc3NhZ2UgdGhlbiBjYWxsIHVwZGF0ZSBtZXNzYWdlXG4gKiBAcGFyYW0gIHtDb21ldENoYXQuQmFzZU1lc3NhZ2V9IG1lc3NhZ2VcbiAqL1xuICAvLyB0cmFuc2xhdGVNZXNzYWdlKG1lc3NhZ2U6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSkge1xuICAvLyB9XG4gIC8qKlxuICAgKiBAcGFyYW0gIHtDb21ldENoYXQuQmFzZU1lc3NhZ2V9IG1lc3NhZ2VcbiAgICovXG4gIG1hcmtNZXNzYWdlQXNEZWxpdmVyZWQgPSAobWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKSA9PiB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVSZWNlaXB0ICYmICBtZXNzYWdlPy5nZXRTZW5kZXIoKS5nZXRVaWQoKSAhPT0gdGhpcy5sb2dnZWRJblVzZXI/LmdldFVpZCgpICYmIG1lc3NhZ2UuaGFzT3duUHJvcGVydHkoXCJkZWxpdmVyZWRBdFwiKSA9PT0gZmFsc2UpIHtcbiAgICAgIENvbWV0Q2hhdC5tYXJrQXNEZWxpdmVyZWQobWVzc2FnZSlcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiBXaGVuIE1lc3NhZ2UgaXMgUmVjZWl2ZWRcbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICovXG4gIC8qKlxuICAgKiBAcGFyYW0gIHtDb21ldENoYXQuQmFzZU1lc3NhZ2V9IG1lc3NhZ2VcbiAgICovXG4gIG1lc3NhZ2VSZWNlaXZlZChtZXNzYWdlOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpIHtcbiAgICB0aGlzLm1hcmtNZXNzYWdlQXNEZWxpdmVyZWQobWVzc2FnZSlcbiAgICB0cnkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmdyb3VwICYmXG4gICAgICAgIG1lc3NhZ2UuZ2V0UmVjZWl2ZXJUeXBlKCkgPT09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VSZWNlaXZlclR5cGUuZ3JvdXAgJiZcbiAgICAgICAgbWVzc2FnZS5nZXRSZWNlaXZlcklkKCkgPT09IHRoaXMuZ3JvdXA/LmdldEd1aWQoKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZVJlY2VpdmVkSGFuZGxlcihtZXNzYWdlLCBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlUmVjZWl2ZXJUeXBlLmdyb3VwKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHRoaXMudXNlciAmJlxuICAgICAgICBtZXNzYWdlLmdldFJlY2VpdmVyVHlwZSgpID09PSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlUmVjZWl2ZXJUeXBlLnVzZXIgJiZcbiAgICAgICAgbWVzc2FnZT8uZ2V0U2VuZGVyKCkuZ2V0VWlkKCkgPT09IHRoaXMudXNlcj8uZ2V0VWlkKClcbiAgICAgICkge1xuICAgICAgICBpZiAoKCFtZXNzYWdlPy5nZXRSZWFkQXQoKSAmJiAhbWVzc2FnZT8uZ2V0UGFyZW50TWVzc2FnZUlkKCkgICYmIHRoaXMuaXNPbkJvdHRvbSkgfHwgKCFtZXNzYWdlPy5nZXRSZWFkQXQoKSAmJiBtZXNzYWdlLmdldFBhcmVudE1lc3NhZ2VJZCgpICYmIHRoaXMucGFyZW50TWVzc2FnZUlkICAmJiB0aGlzLmlzT25Cb3R0b20pKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVSZWNlaXB0KSB7XG4gICAgICAgICAgICBDb21ldENoYXQubWFya0FzUmVhZChtZXNzYWdlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBDb21ldENoYXRNZXNzYWdlRXZlbnRzLmNjTWVzc2FnZVJlYWQubmV4dCggbWVzc2FnZSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuVW5yZWFkQ291bnQgPSBbXTtcbiAgICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBDb21ldENoYXRNZXNzYWdlRXZlbnRzLmNjTWVzc2FnZVJlYWQubmV4dCggbWVzc2FnZSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1lc3NhZ2VSZWNlaXZlZEhhbmRsZXIobWVzc2FnZSwgQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZVJlY2VpdmVyVHlwZS51c2VyKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZih0aGlzLm9uRXJyb3Ipe1xudGhpcy5vbkVycm9yKGVycm9yKTtcbn1cbiAgICB9XG4gICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG4gIC8qKlxuICogVXBkYXRpbmcgdGhlIHJlcGx5IGNvdW50IG9mIFRocmVhZCBQYXJlbnQgTWVzc2FnZVxuICogQHBhcmFtICB7Q29tZXRDaGF0LkJhc2VNZXNzYWdlfSBtZXNzYWdlc1xuICovXG4gIHVwZGF0ZVJlcGx5Q291bnQobWVzc2FnZXM6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWNlaXZlZE1lc3NhZ2UgPSBtZXNzYWdlcztcbiAgICAgIGxldCBtZXNzYWdlTGlzdDogQ29tZXRDaGF0LkJhc2VNZXNzYWdlW10gPSBbLi4udGhpcy5tZXNzYWdlc0xpc3RdO1xuICAgICAgbGV0IG1lc3NhZ2VLZXkgPSBtZXNzYWdlTGlzdC5maW5kSW5kZXgoXG4gICAgICAgIChtKSA9PiBtLmdldElkKCkgPT09IHJlY2VpdmVkTWVzc2FnZS5nZXRQYXJlbnRNZXNzYWdlSWQoKVxuICAgICAgKTtcbiAgICAgIGlmIChtZXNzYWdlS2V5ID4gLTEpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZU9iajogQ29tZXRDaGF0LkJhc2VNZXNzYWdlID0gbWVzc2FnZUxpc3RbbWVzc2FnZUtleV07XG4gICAgICAgIGxldCByZXBseUNvdW50ID0gbWVzc2FnZU9iai5nZXRSZXBseUNvdW50KCkgPyBtZXNzYWdlT2JqLmdldFJlcGx5Q291bnQoKSA6IDA7XG4gICAgICAgIHJlcGx5Q291bnQgPSByZXBseUNvdW50ICsgMTtcbiAgICAgICAgbWVzc2FnZU9iai5zZXRSZXBseUNvdW50KHJlcGx5Q291bnQpO1xuICAgICAgICBtZXNzYWdlTGlzdC5zcGxpY2UobWVzc2FnZUtleSwgMSwgbWVzc2FnZU9iaik7XG4gICAgICAgIHRoaXMubWVzc2FnZXNMaXN0ID0gWy4uLm1lc3NhZ2VMaXN0XTtcbiAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmKHRoaXMub25FcnJvcil7XG50aGlzLm9uRXJyb3IoZXJyb3IpO1xufVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogQHBhcmFtICB7Q29tZXRDaGF0LkJhc2VNZXNzYWdlfSBtZXNzYWdlXG4gICAqIEBwYXJhbSAge3N0cmluZ30gdHlwZVxuICAgKi9cbiAgbWVzc2FnZVJlY2VpdmVkSGFuZGxlciA9IChtZXNzYWdlOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UsIHR5cGU6IHN0cmluZykgPT4ge1xuICAgICsrdGhpcy5tZXNzYWdlQ291bnQ7XG4gICAgaWYgKG1lc3NhZ2UuZ2V0UGFyZW50TWVzc2FnZUlkKCkpIHtcbiAgICAgIHRoaXMudXBkYXRlUmVwbHlDb3VudChtZXNzYWdlKTtcbiAgICAgIHRoaXMuYWRkTWVzc2FnZShtZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMubWVzc2FnZUNvdW50ID4gdGhpcy50aHJlc2hvbGRWYWx1ZSkge1xuICAgICAgICB0aGlzLmtlZXBSZWNlbnRNZXNzYWdlcyA9IHRydWVcbiAgICAgICAgdGhpcy5yZUluaXRpYWxpemVNZXNzYWdlQnVpbGRlcigpO1xuICAgICAgfVxuICAgICAgdGhpcy5hZGRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgaWYgKCF0aGlzLmlzT25Cb3R0b20pIHtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsVG9Cb3R0b21Pbk5ld01lc3NhZ2VzKSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKClcbiAgICAgICAgICB9LCAxMDApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGxldCBjb3VudFRleHQgPSBsb2NhbGl6ZShcIk5FV19NRVNTQUdFU1wiKVxuICAgICAgICAgIGlmICh0aGlzLm5ld01lc3NhZ2VJbmRpY2F0b3JUZXh0ICYmIHRoaXMubmV3TWVzc2FnZUluZGljYXRvclRleHQgIT0gXCJcIikge1xuICAgICAgICAgICAgY291bnRUZXh0ID0gdGhpcy5uZXdNZXNzYWdlSW5kaWNhdG9yVGV4dFxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvdW50VGV4dCA9IHRoaXMuVW5yZWFkQ291bnQubGVuZ3RoID4gMCA/ICBsb2NhbGl6ZShcIk5FV19NRVNTQUdFU1wiKSA6ICBsb2NhbGl6ZShcIk5FV19NRVNTQUdFXCIpXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuVW5yZWFkQ291bnQucHVzaChtZXNzYWdlKVxuICAgICAgICAgIHRoaXMubmV3TWVzc2FnZUNvdW50ID0gXCIg4oaTIFwiICsgdGhpcy5VbnJlYWRDb3VudC5sZW5ndGggKyBcIiBcIiArIGNvdW50VGV4dDtcbiAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnBsYXlBdWRpbygpO1xuICAgIC8vaGFuZGxpbmcgZG9tIGxhZyAtIGluY3JlbWVudCBjb3VudCBvbmx5IGZvciBtYWluIG1lc3NhZ2UgbGlzdFxuICAgIGlmIChtZXNzYWdlLmhhc093blByb3BlcnR5KFwicGFyZW50TWVzc2FnZUlkXCIpID09PSBmYWxzZSAmJiB0aGlzLnBhcmVudE1lc3NhZ2VJZCkge1xuICAgICAgKyt0aGlzLm1lc3NhZ2VDb3VudDtcbiAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICAgIH0gZWxzZSBpZiAobWVzc2FnZS5oYXNPd25Qcm9wZXJ0eShcInBhcmVudE1lc3NhZ2VJZFwiKSA9PT0gdHJ1ZSAmJiB0aGlzLnBhcmVudE1lc3NhZ2VJZCkge1xuICAgICAgaWYgKG1lc3NhZ2UuZ2V0UGFyZW50TWVzc2FnZUlkKCkgPT09IHRoaXMucGFyZW50TWVzc2FnZUlkICYmIHRoaXMuaXNPbkJvdHRvbSkge1xuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZVJlY2VpcHQpIHtcbiAgICAgICAgICBDb21ldENoYXQubWFya0FzUmVhZChtZXNzYWdlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgQ29tZXRDaGF0TWVzc2FnZUV2ZW50cy5jY01lc3NhZ2VSZWFkLm5leHQoIG1lc3NhZ2UpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5VbnJlYWRDb3VudCA9IFtdO1xuICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgfVxuICB9O1xuICBwbGF5QXVkaW8oKSB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVTb3VuZEZvck1lc3NhZ2VzKSB7XG4gICAgICBpZiAodGhpcy5jdXN0b21Tb3VuZEZvck1lc3NhZ2VzKSB7XG4gICAgICAgIENvbWV0Q2hhdFNvdW5kTWFuYWdlci5wbGF5KENvbWV0Q2hhdFNvdW5kTWFuYWdlci5Tb3VuZC5pbmNvbWluZ01lc3NhZ2UsIHRoaXMuY3VzdG9tU291bmRGb3JNZXNzYWdlcylcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBDb21ldENoYXRTb3VuZE1hbmFnZXIucGxheShDb21ldENoYXRTb3VuZE1hbmFnZXIuU291bmQuaW5jb21pbmdNZXNzYWdlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZUluaXRpYWxpemVNZXNzYWdlTGlzdCgpIHtcbiAgICB0aGlzLnJlaW5pdGlhbGl6ZWQgPSB0cnVlXG4gICAgdGhpcy5tc2dMaXN0ZW5lcklkID0gXCJtZXNzYWdlX1wiKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICB0aGlzLmdyb3VwTGlzdGVuZXJJZCA9IFwiZ3JvdXBfXCIrIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIHRoaXMuY2FsbExpc3RlbmVySWQgPSBcImNhbGxfXCIrIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIHRoaXMuYWRkTWVzc2FnZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgaWYgKHRoaXMubWVzc2FnZXNSZXF1ZXN0QnVpbGRlcikge1xuICAgICAgaWYgKHRoaXMua2VlcFJlY2VudE1lc3NhZ2VzKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZXNMaXN0LnNwbGljZSgxLCB0aGlzLm1lc3NhZ2VzTGlzdC5sZW5ndGggLSAzMCk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlc0xpc3Quc3BsaWNlKDMwKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVxdWVzdEJ1aWxkZXIgPSB0aGlzLm1lc3NhZ2VzUmVxdWVzdEJ1aWxkZXJcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpZiAodGhpcy5rZWVwUmVjZW50TWVzc2FnZXMpIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlc0xpc3Quc3BsaWNlKDEsIHRoaXMubWVzc2FnZXNMaXN0Lmxlbmd0aCAtIDMwKTtcbiAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKClcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLm1lc3NhZ2VzTGlzdC5zcGxpY2UoMzApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cbiAgcmVJbml0aWFsaXplTWVzc2FnZUJ1aWxkZXIgPSAoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnBhcmVudE1lc3NhZ2VJZCkge1xuICAgICAgdGhpcy5tZXNzYWdlQ291bnQgPSAwO1xuICAgIH1cbiAgICB0aGlzLnJlcXVlc3RCdWlsZGVyID0gbnVsbFxuICAgIENvbWV0Q2hhdC5yZW1vdmVNZXNzYWdlTGlzdGVuZXIodGhpcy5tc2dMaXN0ZW5lcklkKTtcbiAgICBDb21ldENoYXQucmVtb3ZlR3JvdXBMaXN0ZW5lcih0aGlzLmdyb3VwTGlzdGVuZXJJZCk7XG4gICAgQ29tZXRDaGF0LnJlbW92ZUNhbGxMaXN0ZW5lcih0aGlzLmNhbGxMaXN0ZW5lcklkKVxuICAgIHRoaXMucmVJbml0aWFsaXplTWVzc2FnZUxpc3QoKVxuICB9O1xuICBnZXRNZXNzYWdlUmVjZWlwdChtZXNzYWdlOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpIHtcbiAgICBsZXQgcmVjZWlwdCA9ICAgTWVzc2FnZVJlY2VpcHRVdGlscy5nZXRSZWNlaXB0U3RhdHVzKG1lc3NhZ2UpXG4gICAgcmV0dXJuIHJlY2VpcHRcbiAgfVxuICBtZXNzYWdlUmVhZEFuZERlbGl2ZXJlZChtZXNzYWdlOiBDb21ldENoYXQuTWVzc2FnZVJlY2VpcHQpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKFxuICAgICAgICBtZXNzYWdlLmdldFJlY2VpdmVyVHlwZSgpID09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VSZWNlaXZlclR5cGUudXNlciAmJlxuICAgICAgICBtZXNzYWdlPy5nZXRTZW5kZXIoKS5nZXRVaWQoKSA9PSB0aGlzLnVzZXI/LmdldFVpZCgpICYmXG4gICAgICAgIG1lc3NhZ2UuZ2V0UmVjZWl2ZXIoKSA9PSB0aGlzLmxvZ2dlZEluVXNlcj8uZ2V0VWlkKClcbiAgICAgICkge1xuICAgICAgICBpZiAobWVzc2FnZS5nZXRSZWNlaXB0VHlwZSgpID09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLm1lc3NhZ2VzLkRFTElWRVJZKSB7XG4gICAgICAgICAgLy9zZWFyY2ggZm9yIG1lc3NhZ2VcbiAgICAgICAgICBsZXQgbWVzc2FnZUtleSA9IHRoaXMubWVzc2FnZXNMaXN0LmZpbmRJbmRleChcbiAgICAgICAgICAgIChtOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpID0+IG0uZ2V0SWQoKSA9PSBOdW1iZXIobWVzc2FnZS5nZXRNZXNzYWdlSWQoKSlcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChtZXNzYWdlS2V5ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXNMaXN0W21lc3NhZ2VLZXldLnNldERlbGl2ZXJlZEF0KG1lc3NhZ2UuZ2V0RGVsaXZlcmVkQXQoKSlcbiAgICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIHRoaXMubWFya0FsbE1lc3NhZ0FzRGVsaXZlcmVkKCBtZXNzYWdlS2V5KTtcbiAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLmdldFJlY2VpcHRUeXBlKCkgPT0gQ29tZXRDaGF0VUlLaXRDb25zdGFudHMubWVzc2FnZXMuUkVBRCkge1xuICAgICAgICAgIC8vc2VhcmNoIGZvciBtZXNzYWdlXG4gICAgICAgICAgbGV0IG1lc3NhZ2VLZXkgPSB0aGlzLm1lc3NhZ2VzTGlzdC5maW5kSW5kZXgoXG4gICAgICAgICAgICAobTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKSA9PiBtLmdldElkKCkgPT0gTnVtYmVyKG1lc3NhZ2UuZ2V0TWVzc2FnZUlkKCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAobWVzc2FnZUtleSA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VzTGlzdFttZXNzYWdlS2V5XS5zZXRSZWFkQXQobWVzc2FnZT8uZ2V0UmVhZEF0KCkpO1xuICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgdGhpcy5tYXJrQWxsTWVzc2FnQXNSZWFkKCBtZXNzYWdlS2V5KVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBtZXNzYWdlLmdldFJlY2VpdmVyVHlwZSgpID09PSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlUmVjZWl2ZXJUeXBlLmdyb3VwICYmXG4gICAgICAgIG1lc3NhZ2UuZ2V0UmVjZWl2ZXIoKSA9PT0gdGhpcy5ncm91cD8uZ2V0R3VpZCgpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYodGhpcy5vbkVycm9yKXtcbnRoaXMub25FcnJvcihlcnJvcik7XG59XG4gICAgfVxuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICB9XG4gIC8qKlxuICogQHBhcmFtICB7Q29tZXRDaGF0LkJhc2VNZXNzYWdlfSByZWFkTWVzc2FnZVxuICovXG4gICBtYXJrQWxsTWVzc2FnQXNSZWFkKCBtZXNzYWdlS2V5OiBudW1iZXIpIHtcbiAgICBmb3IobGV0IGkgPSBtZXNzYWdlS2V5OyBpID49MDsgaS0tKXtcbiAgICAgIGlmICghdGhpcy5tZXNzYWdlc0xpc3RbaV0uZ2V0UmVhZEF0KCkpIHtcbiAgICB0aGlzLm1lc3NhZ2VzTGlzdFtpXS5zZXRSZWFkQXQoQ29tZXRDaGF0VUlLaXRVdGlsaXR5LmdldFVuaXhUaW1lc3RhbXAoKSk7XG4gICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG4gICAgfVxuICAgIENvbWV0Q2hhdE1lc3NhZ2VFdmVudHMuY2NNZXNzYWdlUmVhZC5uZXh0KCB0aGlzLm1lc3NhZ2VzTGlzdFttZXNzYWdlS2V5XSlcbiAgICB9XG4gIG1hcmtBbGxNZXNzYWdBc0RlbGl2ZXJlZChtZXNzYWdlS2V5OiBudW1iZXIpIHtcbiAgICBmb3IgKGxldCBpID0gbWVzc2FnZUtleTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmICghdGhpcy5tZXNzYWdlc0xpc3RbaV0uZ2V0RGVsaXZlcmVkQXQoKSkge1xuICAgICAgICB0aGlzLm1lc3NhZ2VzTGlzdFtpXS5zZXREZWxpdmVyZWRBdChDb21ldENoYXRVSUtpdFV0aWxpdHkuZ2V0VW5peFRpbWVzdGFtcCgpKTtcbiAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogRW1pdHMgYW4gQWN0aW9uIEluZGljYXRpbmcgdGhhdCBhIG1lc3NhZ2Ugd2FzIGRlbGV0ZWQgYnkgdGhlIHVzZXIvcGVyc29uIHlvdSBhcmUgY2hhdHRpbmcgd2l0aFxuICAgKiBAcGFyYW0ge0NvbWV0Q2hhdC5CYXNlTWVzc2FnZX0gbWVzc2FnZVxuICAgKi9cbiAgLyoqXG4gICAqIERldGVjdHMgaWYgdGhlIG1lc3NhZ2UgdGhhdCB3YXMgZWRpdCBpcyB5b3VyIGN1cnJlbnQgb3BlbiBjb252ZXJzYXRpb24gd2luZG93XG4gICAqIEBwYXJhbSB7Q29tZXRDaGF0LkJhc2VNZXNzYWdlfSBtZXNzYWdlXG4gICAqL1xuICBtZXNzYWdlRWRpdGVkID0gKG1lc3NhZ2U6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuZ3JvdXAgJiZcbiAgICAgICAgbWVzc2FnZS5nZXRSZWNlaXZlclR5cGUoKSA9PT0gQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZVJlY2VpdmVyVHlwZS5ncm91cCAmJlxuICAgICAgICBtZXNzYWdlLmdldFJlY2VpdmVySWQoKSA9PT0gdGhpcy5ncm91cD8uZ2V0R3VpZCgpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy51cGRhdGVFZGl0ZWRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdGhpcy51c2VyICYmXG4gICAgICAgIG1lc3NhZ2UuZ2V0UmVjZWl2ZXJUeXBlKCkgPT09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VSZWNlaXZlclR5cGUudXNlciAmJlxuICAgICAgICB0aGlzLmxvZ2dlZEluVXNlcj8uZ2V0VWlkKCkgPT09IG1lc3NhZ2UuZ2V0UmVjZWl2ZXJJZCgpICYmXG4gICAgICAgIG1lc3NhZ2U/LmdldFNlbmRlcigpLmdldFVpZCgpID09PSB0aGlzLnVzZXI/LmdldFVpZCgpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy51cGRhdGVFZGl0ZWRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdGhpcy51c2VyICYmXG4gICAgICAgIG1lc3NhZ2UuZ2V0UmVjZWl2ZXJUeXBlKCkgPT09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VSZWNlaXZlclR5cGUudXNlciAmJlxuICAgICAgICB0aGlzLmxvZ2dlZEluVXNlcj8uZ2V0VWlkKCkgPT09IG1lc3NhZ2U/LmdldFNlbmRlcigpLmdldFVpZCgpICYmXG4gICAgICAgIG1lc3NhZ2UuZ2V0UmVjZWl2ZXJJZCgpID09PSB0aGlzLnVzZXI/LmdldFVpZCgpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy51cGRhdGVFZGl0ZWRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmKHRoaXMub25FcnJvcil7XG50aGlzLm9uRXJyb3IoZXJyb3IpO1xufVxuICAgIH1cbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgfTtcbiAgLyoqXG4gICAqIEVtaXRzIGFuIEFjdGlvbiBJbmRpY2F0aW5nIHRoYXQgYSBtZXNzYWdlIHdhcyBkZWxldGVkIGJ5IHRoZSB1c2VyL3BlcnNvbiB5b3UgYXJlIGNoYXR0aW5nIHdpdGhcbiAgICogQHBhcmFtIHtDb21ldENoYXQuQmFzZU1lc3NhZ2V9IG1lc3NhZ2VcbiAgICovXG4gIHVwZGF0ZUVkaXRlZE1lc3NhZ2UgPSAobWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKSA9PiB7XG4gICAgY29uc3QgbWVzc2FnZUxpc3QgPSB0aGlzLm1lc3NhZ2VzTGlzdDtcbiAgICBjb25zdCBtZXNzYWdlS2V5ID0gbWVzc2FnZUxpc3QuZmluZEluZGV4KG0gPT4gbS5nZXRJZCgpID09PSBtZXNzYWdlLmdldElkKCkpO1xuICAgIGlmIChtZXNzYWdlS2V5ID4gLTEpIHtcbiAgICAgIHRoaXMubWVzc2FnZXNMaXN0ID0gW1xuICAgICAgICAuLi5tZXNzYWdlTGlzdC5zbGljZSgwLCBtZXNzYWdlS2V5KSxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgLi4ubWVzc2FnZUxpc3Quc2xpY2UobWVzc2FnZUtleSArIDEpXG4gICAgICBdO1xuICAgIH1cbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH07XG4gIC8qKlxuICAgKiBFbWl0cyBhbiBBY3Rpb24gSW5kaWNhdGluZyB0aGF0IEdyb3VwIERhdGEgaGFzIGJlZW4gdXBkYXRlZFxuICAgKiBAcGFyYW1cbiAgICovXG4gIC8qKlxuICAgKiBXaGVuIGN1c3RvbSBtZXNzYWdlcyBhcmUgcmVjZWl2ZWQgZWcuIFBvbGwsIFN0aWNrZXJzIGVtaXRzIGFjdGlvbiB0byB1cGRhdGUgbWVzc2FnZSBsaXN0XG4gICAqIEBwYXJhbSBtZXNzYWdlXG4gICAqL1xuICAvKipcbiAgICogQHBhcmFtICB7Q29tZXRDaGF0LkJhc2VNZXNzYWdlfSBtZXNzYWdlXG4gICAqL1xuICBjdXN0b21NZXNzYWdlUmVjZWl2ZWQobWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKTogYW55IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5tYXJrTWVzc2FnZUFzRGVsaXZlcmVkKG1lc3NhZ2UpO1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmdyb3VwICYmXG4gICAgICAgIG1lc3NhZ2UuZ2V0UmVjZWl2ZXJUeXBlKCkgPT09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VSZWNlaXZlclR5cGUuZ3JvdXAgJiZcbiAgICAgICAgbWVzc2FnZS5nZXRSZWNlaXZlcklkKCkgPT09IHRoaXMuZ3JvdXA/LmdldEd1aWQoKVxuICAgICAgKSB7XG4gICAgICAgIGlmICgoIW1lc3NhZ2U/LmdldFJlYWRBdCgpICYmICFtZXNzYWdlPy5nZXRQYXJlbnRNZXNzYWdlSWQoKSAgJiYgdGhpcy5pc09uQm90dG9tKSB8fCAoIW1lc3NhZ2U/LmdldFJlYWRBdCgpICYmIG1lc3NhZ2UuZ2V0UGFyZW50TWVzc2FnZUlkKCkgJiYgdGhpcy5wYXJlbnRNZXNzYWdlSWQgJiYgdGhpcy5pc09uQm90dG9tKSApIHtcbiAgICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZVJlY2VpcHQpIHtcbiAgICAgICAgICAgIENvbWV0Q2hhdC5tYXJrQXNSZWFkKG1lc3NhZ2UpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIENvbWV0Q2hhdE1lc3NhZ2VFdmVudHMuY2NNZXNzYWdlUmVhZC5uZXh0KCBtZXNzYWdlKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5VbnJlYWRDb3VudCA9IFtdO1xuICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VzdG9tTWVzc2FnZVJlY2VpdmVkSGFuZGxlcihtZXNzYWdlLCBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlUmVjZWl2ZXJUeXBlLmdyb3VwKVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoXG4gICAgICAgIHRoaXMudXNlciAmJlxuICAgICAgICBtZXNzYWdlLmdldFJlY2VpdmVyVHlwZSgpID09PSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlUmVjZWl2ZXJUeXBlLnVzZXIgJiZcbiAgICAgICAgKChtZXNzYWdlPy5nZXRTZW5kZXIoKS5nZXRVaWQoKSA9PT0gdGhpcy51c2VyPy5nZXRVaWQoKSAmJlxuICAgICAgICAgIG1lc3NhZ2UuZ2V0UmVjZWl2ZXJJZCgpID09PSB0aGlzLmxvZ2dlZEluVXNlcj8uZ2V0VWlkKCkpXG4gICAgICAgICAgfHwgKFxuICAgICAgICAgICAgdGhpcy5sb2dnZWRJblVzZXI/LmdldFVpZCgpID09PSBtZXNzYWdlPy5nZXRTZW5kZXIoKS5nZXRVaWQoKSAmJlxuICAgICAgICAgICAgbWVzc2FnZS5nZXRSZWNlaXZlcklkKCkgPT09IHRoaXMudXNlcj8uZ2V0VWlkKClcbiAgICAgICAgICApKVxuICAgICAgKSB7XG4gICAgICAgIGlmICgoIW1lc3NhZ2U/LmdldFJlYWRBdCgpICYmICFtZXNzYWdlPy5nZXRQYXJlbnRNZXNzYWdlSWQoKSAmJiB0aGlzLmlzT25Cb3R0b20pIHx8ICghbWVzc2FnZT8uZ2V0UmVhZEF0KCkgJiYgbWVzc2FnZS5nZXRQYXJlbnRNZXNzYWdlSWQoKSAmJiB0aGlzLnBhcmVudE1lc3NhZ2VJZCAmJiB0aGlzLmlzT25Cb3R0b20pKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVSZWNlaXB0KSB7XG4gICAgICAgICAgICBDb21ldENoYXQubWFya0FzUmVhZChtZXNzYWdlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBDb21ldENoYXRNZXNzYWdlRXZlbnRzLmNjTWVzc2FnZVJlYWQubmV4dCggbWVzc2FnZSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuVW5yZWFkQ291bnQgPSBbXTtcbiAgICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1c3RvbU1lc3NhZ2VSZWNlaXZlZEhhbmRsZXIobWVzc2FnZSwgQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZVJlY2VpdmVyVHlwZS51c2VyKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmKHRoaXMub25FcnJvcil7XG50aGlzLm9uRXJyb3IoZXJyb3IpO1xufVxuICAgIH1cbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSAge0NvbWV0Q2hhdC5CYXNlTWVzc2FnZX0gbWVzc2FnZVxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IHR5cGVcbiAgICovXG4gIGN1c3RvbU1lc3NhZ2VSZWNlaXZlZEhhbmRsZXIgPSAobWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlLCB0eXBlOiBzdHJpbmcpID0+IHtcbiAgICArK3RoaXMubWVzc2FnZUNvdW50O1xuICAgIC8vIGFkZCByZWNlaXZlZCBtZXNzYWdlIHRvIG1lc3NhZ2VzIGxpc3RcbiAgICBpZiAobWVzc2FnZS5nZXRQYXJlbnRNZXNzYWdlSWQoKSkge1xuICAgICAgdGhpcy51cGRhdGVSZXBseUNvdW50KG1lc3NhZ2UpO1xuICAgICAgdGhpcy5hZGRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5tZXNzYWdlQ291bnQgPiB0aGlzLnRocmVzaG9sZFZhbHVlKSB7XG4gICAgICAgIHRoaXMua2VlcFJlY2VudE1lc3NhZ2VzID0gdHJ1ZVxuICAgICAgICB0aGlzLnJlSW5pdGlhbGl6ZU1lc3NhZ2VCdWlsZGVyKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmFkZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICBpZiAoIXRoaXMuaXNPbkJvdHRvbSkge1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxUb0JvdHRvbU9uTmV3TWVzc2FnZXMpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKVxuICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgbGV0IGNvdW50VGV4dCA9IGxvY2FsaXplKFwiTkVXX01FU1NBR0VTXCIpXG4gICAgICAgICAgaWYgKHRoaXMubmV3TWVzc2FnZUluZGljYXRvclRleHQgJiYgdGhpcy5uZXdNZXNzYWdlSW5kaWNhdG9yVGV4dCAhPSBcIlwiKSB7XG4gICAgICAgICAgICBjb3VudFRleHQgPSB0aGlzLm5ld01lc3NhZ2VJbmRpY2F0b3JUZXh0XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY291bnRUZXh0ID0gdGhpcy5VbnJlYWRDb3VudC5sZW5ndGggPiAwID8gIGxvY2FsaXplKFwiTkVXX01FU1NBR0VTXCIpIDogIGxvY2FsaXplKFwiTkVXX01FU1NBR0VcIilcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5VbnJlYWRDb3VudC5wdXNoKG1lc3NhZ2UpXG4gICAgICAgICAgdGhpcy5uZXdNZXNzYWdlQ291bnQgPSBcIiDihpMgXCIgKyB0aGlzLlVucmVhZENvdW50Lmxlbmd0aCArIFwiIFwiICsgY291bnRUZXh0O1xuICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucGxheUF1ZGlvKCk7XG4gICAgLy9oYW5kbGluZyBkb20gbGFnIC0gaW5jcmVtZW50IGNvdW50IG9ubHkgZm9yIG1haW4gbWVzc2FnZSBsaXN0XG4gICAgaWYgKG1lc3NhZ2UuaGFzT3duUHJvcGVydHkoXCJwYXJlbnRNZXNzYWdlSWRcIikgPT09IGZhbHNlICYmICF0aGlzLnBhcmVudE1lc3NhZ2VJZCkge1xuICAgICAgKyt0aGlzLm1lc3NhZ2VDb3VudDtcbiAgICAgIC8vaWYgdGhlIHVzZXIgaGFzIG5vdCBzY3JvbGxlZCBpbiBjaGF0IHdpbmRvdyhzY3JvbGwgaXMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgY2hhdCB3aW5kb3cpXG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLmhhc093blByb3BlcnR5KFwicGFyZW50TWVzc2FnZUlkXCIpID09PSB0cnVlICYmIHRoaXMucGFyZW50TWVzc2FnZUlkICAmJiB0aGlzLmlzT25Cb3R0b20pIHtcbiAgICAgIGlmIChtZXNzYWdlLmdldFBhcmVudE1lc3NhZ2VJZCgpID09PSB0aGlzLnBhcmVudE1lc3NhZ2VJZCApIHtcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVSZWNlaXB0ICkge1xuICAgICAgICAgIENvbWV0Q2hhdC5tYXJrQXNSZWFkKG1lc3NhZ2UpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICBDb21ldENoYXRNZXNzYWdlRXZlbnRzLmNjTWVzc2FnZVJlYWQubmV4dCggbWVzc2FnZSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLlVucmVhZENvdW50ID0gW107XG4gICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgIH1cbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH07XG4gIC8qKlxuICAgKiBUcmFja0J5IG1ldGhvZCB0byB1cGRhdGUgVUkgd2hlbiBhIGNoYW5nZSBpcyBkZXRlY3RlZFxuICAgKi9cbiAgLyoqXG4gICAqIEBwYXJhbSAge251bWJlcn0gaW5kZXhcbiAgICogQHBhcmFtICB7YW55fSBpdGVtXG4gICAqL1xuICBnZXRNZXNzYWdlSWQoaW5kZXg6IG51bWJlciwgaXRlbTogYW55KSB7XG4gICAgcmV0dXJuIGl0ZW0uZWRpdGVkQXQgfHwgaXRlbS5yZWFkQXQgfHwgaXRlbS5kZWxpdmVyZWRBdCB8fCBpdGVtLmlkO1xuICB9XG4gIC8qKlxuICAgKiBDb21wYXJlcyB0d28gZGF0ZXMgYW5kIHNldHMgRGF0ZSBvbiBhIGEgbmV3IGRheVxuICAgKi9cbiAgLyoqXG4gICAqIEBwYXJhbSAge251bWJlcn0gZmlyc3REYXRlXG4gICAqIEBwYXJhbSAge251bWJlcn0gc2Vjb25kRGF0ZVxuICAgKi9cbiAgIGlzRGF0ZURpZmZlcmVudChmaXJzdERhdGU6IG51bWJlciB8IHVuZGVmaW5lZCwgc2Vjb25kRGF0ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgbGV0IGZpcnN0RGF0ZU9iajogRGF0ZSwgc2Vjb25kRGF0ZU9iajogRGF0ZTtcbiAgICBmaXJzdERhdGVPYmogPSBuZXcgRGF0ZShmaXJzdERhdGUhICogMTAwMCk7XG4gICAgc2Vjb25kRGF0ZU9iaiA9IG5ldyBEYXRlKHNlY29uZERhdGUhICogMTAwMCk7XG4gICAgcmV0dXJuIGZpcnN0RGF0ZU9iai5nZXREYXRlKCkgIT09IHNlY29uZERhdGVPYmouZ2V0RGF0ZSgpIHx8XG4gICAgICBmaXJzdERhdGVPYmouZ2V0TW9udGgoKSAhPT0gc2Vjb25kRGF0ZU9iai5nZXRNb250aCgpIHx8XG4gICAgICBmaXJzdERhdGVPYmouZ2V0RnVsbFllYXIoKSAhPT0gc2Vjb25kRGF0ZU9iai5nZXRGdWxsWWVhcigpO1xuICB9XG4gIC8qKlxuICAgKiBwcmVwZW5kIEZldGNoZWQgTWVzc2FnZXNcbiAgICogQHBhcmFtIHtDb21ldENoYXQuQmFzZU1lc3NhZ2V9IG1lc3NhZ2VzXG4gICAqL1xuICAgcHJlcGVuZE1lc3NhZ2VzKG1lc3NhZ2VzOiBDb21ldENoYXQuQmFzZU1lc3NhZ2VbXSkge1xuICAgICB0cnkge1xuICAgICAgIHRoaXMubWVzc2FnZXNMaXN0ID0gWy4uLm1lc3NhZ2VzLCAuLi50aGlzLm1lc3NhZ2VzTGlzdF07XG4gICAgICAgdGhpcy5tZXNzYWdlQ291bnQgPSB0aGlzLm1lc3NhZ2VzTGlzdC5sZW5ndGg7XG4gICAgICAgaWYgKHRoaXMubWVzc2FnZUNvdW50ID4gdGhpcy50aHJlc2hvbGRWYWx1ZSkge1xuICAgICAgICAgdGhpcy5rZWVwUmVjZW50TWVzc2FnZXMgPSBmYWxzZTtcbiAgICAgICAgIHRoaXMucmVJbml0aWFsaXplTWVzc2FnZUJ1aWxkZXIoKTtcbiAgICAgICB9XG4gICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICBpZih0aGlzLnN0YXRlICE9IFN0YXRlcy5sb2FkZWQpe1xuICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGVzLmxvYWRlZFxuICAgICAgIH1cbiAgICAgICAgIHRoaXMucmVmLmRldGFjaCgpOyAvLyBEZXRhY2ggdGhlIGNoYW5nZSBkZXRlY3RvclxuICAgICAgIH0pO1xuICBpZih0aGlzLmNoYXRDaGFuZ2VkKXtcblxuICAgQ29tZXRDaGF0VUlFdmVudHMuY2NBY3RpdmVDaGF0Q2hhbmdlZC5uZXh0KHtcbiAgICAgIHVzZXI6dGhpcy51c2VyLFxuICAgICAgZ3JvdXA6dGhpcy5ncm91cCxcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2VzW21lc3NhZ2VzPy5sZW5ndGggLTFdXG4gICAgfSlcbiAgICB0aGlzLmNoYXRDaGFuZ2VkID0gZmFsc2VcbiAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gIH1cbiAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZXMuZXJyb3JcbiAgICAgICBpZiAodGhpcy5vbkVycm9yKSB7XG4gICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgIH1cbiAgICAgfVxuICAgfVxuICAvKipcbiAgICogbGlzdGVuaW5nIHRvIGJvdHRvbSBzY3JvbGwgdXNpbmcgaW50ZXJzZWN0aW9uIG9ic2VydmVyXG4gICAqL1xuICAgaW9Cb3R0b20oKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIHJvb3Q6IHRoaXMubGlzdFNjcm9sbC5uYXRpdmVFbGVtZW50LFxuICAgICAgcm9vdE1hcmdpbjogJy0xMDAlIDBweCAxMDBweCAwcHgnLFxuICAgICAgdGhyZXNob2xkOiAwLFxuICAgIH07XG4gICAgY29uc3QgY2FsbGJhY2sgPSAoZW50cmllczogYW55KSA9PiB7XG50aGlzLmlzT25Cb3R0b20gPSBmYWxzZVxuICAgICAgY29uc3QgbGFzdE1lc3NhZ2UgPSB0aGlzLlVucmVhZENvdW50W3RoaXMuVW5yZWFkQ291bnQubGVuZ3RoIC0gMV07XG4gICAgICB0aGlzLmlzT25Cb3R0b20gPSBlbnRyaWVzWzBdLmlzSW50ZXJzZWN0aW5nO1xuICAgICAgaWYodGhpcy5pc09uQm90dG9tKXtcbiAgICAgICAgdGhpcy5mZXRjaE5leHRNZXNzYWdlKClcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVSZWNlaXB0ICYmIHRoaXMuVW5yZWFkQ291bnQ/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBDb21ldENoYXQubWFya0FzUmVhZChsYXN0TWVzc2FnZSkudGhlbigocmVzOiBDb21ldENoYXQuTWVzc2FnZVJlY2VpcHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuVW5yZWFkQ291bnQgPSBbXTtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlS2V5ID0gdGhpcy5tZXNzYWdlc0xpc3QuZmluZEluZGV4KChtOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpID0+IG0uZ2V0SWQoKSA9PT0gTnVtYmVyKHJlcz8uZ2V0TWVzc2FnZUlkKCkpKTtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlS2V5ID4gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtBbGxNZXNzYWdBc1JlYWQobWVzc2FnZUtleSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgICAgICAgICAgIENvbWV0Q2hhdE1lc3NhZ2VFdmVudHMuY2NNZXNzYWdlUmVhZC5uZXh0KCBsYXN0TWVzc2FnZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5VbnJlYWRDb3VudCA9IFtdO1xuICAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdmFyIG9ic2VydmVyOkludGVyc2VjdGlvbk9ic2VydmVyID0gICBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoY2FsbGJhY2ssIG9wdGlvbnMpO1xuICAgIG9ic2VydmVyLm9ic2VydmUodGhpcy5ib3R0b20ubmF0aXZlRWxlbWVudClcbiAgfTtcbiAgLyoqXG4gKiBsaXN0ZW5pbmcgdG8gdG9wIHNjcm9sbCB1c2luZyBpbnRlcnNlY3Rpb24gb2JzZXJ2ZXJcbiAqL1xuICBpb1RvcCgpe1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICByb290OiB0aGlzLmxpc3RTY3JvbGwubmF0aXZlRWxlbWVudCxcbiAgICAgIHJvb3RNYXJnaW46ICcyMDBweCAwcHggMHB4IDBweCcsXG4gICAgICB0aHJlc2hvbGQ6IDEuMFxuICAgIH1cbiAgICBjb25zdCBjYWxsYmFjayA9IChlbnRyaWVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuaXNPbkJvdHRvbSA9IGZhbHNlXG4gICAgICBpZiAoZW50cmllc1swXS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICB0aGlzLm51bWJlck9mVG9wU2Nyb2xsKys7XG4gICAgICAgIGlmICh0aGlzLm51bWJlck9mVG9wU2Nyb2xsID4gMSkge1xuICAgICAgICAgIHRoaXMuZmV0Y2hQcmV2aW91c01lc3NhZ2VzKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgIHZhciBvYnNlcnZlcjpJbnRlcnNlY3Rpb25PYnNlcnZlciA9ICAgbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGNhbGxiYWNrLCBvcHRpb25zKTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMudG9wLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG4gIC8vIHB1YmxpYyBtZXRob2RzXG4gIGFkZE1lc3NhZ2UgPSAobWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKSA9PiB7XG4gICAgaWYoIW1lc3NhZ2U/LmdldFBhcmVudE1lc3NhZ2VJZCgpIHx8IHRoaXMucGFyZW50TWVzc2FnZUlkKXtcbiAgICAgIHRoaXMubWVzc2FnZXNMaXN0LnB1c2gobWVzc2FnZSlcbiAgICAgIGlmKCFtZXNzYWdlPy5nZXRTZW5kZXIoKSB8fCAgdGhpcy5sb2dnZWRJblVzZXI/LmdldFVpZCgpID09IG1lc3NhZ2U/LmdldFNlbmRlcigpPy5nZXRVaWQoKSB8fCB0aGlzLmlzT25Cb3R0b20pe1xuICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKClcbiAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG4gICAgICB9XG4gICAgIH1cblxuICAgIGlmKHRoaXMuc3RhdGUgIT0gU3RhdGVzLmxvYWRlZCl7XG4gICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlcy5sb2FkZWRcbiAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgICB9XG4gICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG4gIH1cbiAgICAvKipcbiAgICogY2FsbGJhY2sgZm9yIGNvcHkgbWVzc2FnZVxuICAgKiBAcGFyYW0gIHtDb21ldENoYXQuVGV4dE1lc3NhZ2V9IG9iamVjdFxuICAgKi9cbiAgICAgb25Db3B5TWVzc2FnZSA9IChvYmplY3Q6IENvbWV0Q2hhdC5UZXh0TWVzc2FnZSkgPT4ge1xuICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQob2JqZWN0LmdldFRleHQoKSlcbiAgICB9XG4gICAgICAvKipcbiAgICogY2FsbGJhY2sgZm9yIGRlbGV0ZU1lc3NhZ2VcbiAgICogQHBhcmFtICB7Q29tZXRDaGF0LkJhc2VNZXNzYWdlfSBvYmplY3RcbiAgICovXG4gICAgLyoqXG4gICAqIEBwYXJhbSAge0NvbWV0Q2hhdC5CYXNlTWVzc2FnZX0gbWVzc2FnZXNcbiAgICovXG4gICAgIG1lc3NhZ2VTZW50KG1lc3NhZ2VzOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2U6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSA9IG1lc3NhZ2VzO1xuICAgICAgY29uc3QgbWVzc2FnZUxpc3Q6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZVtdID0gWy4uLnRoaXMubWVzc2FnZXNMaXN0XTtcbiAgICAgIGxldCBtZXNzYWdlS2V5ID0gbWVzc2FnZUxpc3QuZmluZEluZGV4KChtOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpID0+IG0uZ2V0TXVpZCgpID09PSBtZXNzYWdlLmdldE11aWQoKSk7XG4gICAgICBpZiAobWVzc2FnZUtleSA+IC0xKSB7XG4gICAgICAgIG1lc3NhZ2VMaXN0LnNwbGljZShtZXNzYWdlS2V5LCAxLCBtZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubWVzc2FnZXNMaXN0ID0gbWVzc2FnZUxpc3Q7XG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICB9XG4gICAgICAvKipcbiAgICogY2FsbGJhY2sgZm9yIGVkaXRNZXNzYWdlIG9wdGlvblxuICAgKiBAcGFyYW0gIHtDb21ldENoYXQuQmFzZU1lc3NhZ2V9IG9iamVjdFxuICAgKi9cbiAgb25FZGl0TWVzc2FnZSA9IChvYmplY3Q6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSkgPT4ge1xuICAgIENvbWV0Q2hhdE1lc3NhZ2VFdmVudHMuY2NNZXNzYWdlRWRpdGVkLm5leHQoe21lc3NhZ2U6b2JqZWN0LHN0YXR1czpNZXNzYWdlU3RhdHVzLmlucHJvZ3Jlc3N9KTtcbiAgfVxuICB1cGRhdGVNZXNzYWdlKG1lc3NhZ2U6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSwgbXVpZDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKG11aWQpIHtcbiAgICAgIHRoaXMubWVzc2FnZVNlbnQobWVzc2FnZSlcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZUVkaXRlZE1lc3NhZ2UobWVzc2FnZSlcbiAgICB9XG4gIH1cbiAgcmVtb3ZlTWVzc2FnZSA9IChtZXNzYWdlOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWVzc2FnZUtleSA9IHRoaXMubWVzc2FnZXNMaXN0LmZpbmRJbmRleChtc2cgPT4gbXNnPy5nZXRJZCgpID09PSBtZXNzYWdlLmdldElkKCkpO1xuICAgICAgaWYgKG1lc3NhZ2VLZXkgPiAtMSkge1xuICAgICAgICB0aGlzLm1lc3NhZ2VzTGlzdC5zcGxpY2UobWVzc2FnZUtleSwgMSwgbWVzc2FnZSk7XG4gICAgICAgIHRoaXMubWVzc2FnZXNMaXN0ID0gWy4uLnRoaXMubWVzc2FnZXNMaXN0XTtcbiAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZih0aGlzLm9uRXJyb3Ipe1xudGhpcy5vbkVycm9yKGVycm9yKTtcbn1cbiAgICB9XG4gIH07XG4gIGRlbGV0ZU1lc3NhZ2UgPSAobWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2VJZDogYW55ID0gbWVzc2FnZS5nZXRJZCgpO1xuICAgICAgQ29tZXRDaGF0LmRlbGV0ZU1lc3NhZ2UobWVzc2FnZUlkKVxuICAgICAgICAudGhlbigoZGVsZXRlZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgIENvbWV0Q2hhdE1lc3NhZ2VFdmVudHMuY2NNZXNzYWdlRGVsZXRlZC5uZXh0KGRlbGV0ZWRNZXNzYWdlKVxuICAgICAgICAgIC8vIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yOmFueSkgPT4ge1xuICAgICAgICAgIGlmKHRoaXMub25FcnJvcil7XG50aGlzLm9uRXJyb3IoZXJyb3IpO1xufVxuICAgICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcjphbnkpIHtcbiAgICAgICBpZih0aGlzLm9uRXJyb3Ipe1xudGhpcy5vbkVycm9yKGVycm9yKTtcbn1cbiAgICB9XG4gIH1cbiAgc2Nyb2xsVG9Cb3R0b20gPSAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmxpc3RTY3JvbGwubmF0aXZlRWxlbWVudC5zY3JvbGwoe1xuICAgICAgICAgIHRvcDogdGhpcy5saXN0U2Nyb2xsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0LFxuICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlzT25Cb3R0b20gPSB0cnVlO1xuICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9LCAxMCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYodGhpcy5vbkVycm9yKXtcbnRoaXMub25FcnJvcihlcnJvcik7XG59XG4gICAgfVxuICB9XG4gIHNob3dIZWFkZXJUaXRsZShtZXNzYWdlOkNvbWV0Q2hhdC5CYXNlTWVzc2FnZSl7XG4gICAgaWYodGhpcy5hbGlnbm1lbnQgPT0gTWVzc2FnZUxpc3RBbGlnbm1lbnQubGVmdCl7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgZWxzZXtcbiAgICAgaWYodGhpcy5ncm91cCAmJiAgbWVzc2FnZT8uZ2V0Q2F0ZWdvcnkoKSAhPSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlQ2F0ZWdvcnkuYWN0aW9uICYmICFtZXNzYWdlPy5nZXREZWxldGVkQXQoKSAmJiBtZXNzYWdlPy5nZXRTZW5kZXIoKSAmJiBtZXNzYWdlPy5nZXRTZW5kZXIoKS5nZXRVaWQoKSAhPSB0aGlzLmxvZ2dlZEluVXNlcj8uZ2V0VWlkKCkgJiYgdGhpcy5hbGlnbm1lbnQgPT0gTWVzc2FnZUxpc3RBbGlnbm1lbnQuc3RhbmRhcmQpe1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgZWxzZXtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICB9XG4gICBzdWJzY3JpYmVUb0V2ZW50cygpIHtcbiAgICB0aGlzLmNjU2hvd1BhbmVsID0gQ29tZXRDaGF0VUlFdmVudHMuY2NTaG93UGFuZWwuc3Vic2NyaWJlKChkYXRhOklQYW5lbCk9PntcbiAgICAgIHRoaXMuc21hcnRSZXBseUNvbmZpZyA9IGRhdGEuY29uZmlndXJhdGlvbiFcbiAgICAgIHRoaXMuc21hcnRSZXBseU1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2UhXG4gICAgICB0aGlzLmVuYWJsZVNtYXJ0UmVwbHkgPSB0cnVlXG4gICAgICB0aGlzLnNob3dTbWFydFJlcGx5ID0gdHJ1ZVxuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG5cbiAgICAgICAgICB9KVxuICAgICAgICAgIHRoaXMuY2NIaWRlUGFuZWwgPSBDb21ldENoYXRVSUV2ZW50cy5jY0hpZGVQYW5lbC5zdWJzY3JpYmUoKCk9PntcblxuICAgICAgICAgICAgdGhpcy5zbWFydFJlcGx5TWVzc2FnZSA9IG51bGxcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlU21hcnRSZXBseSA9IGZhbHNlXG4gICAgICAgICAgICB0aGlzLnNob3dTbWFydFJlcGx5ID0gZmFsc2VcblxuICAgICAgICAgIH0pXG4gICB0aGlzLmNjR3JvdXBNZW1iZXJBZGRlZCA9IENvbWV0Q2hhdEdyb3VwRXZlbnRzLmNjR3JvdXBNZW1iZXJBZGRlZC5zdWJzY3JpYmUoKGl0ZW06IElHcm91cE1lbWJlckFkZGVkKSA9PiB7XG4gICAgIGl0ZW1cbiAgIHRoaXMuYXBwZW5kTWVzc2FnZXMoaXRlbS5tZXNzYWdlcyEpXG4gICB9KVxuICAgdGhpcy5jY0dyb3VwTWVtYmVyQmFubmVkID0gQ29tZXRDaGF0R3JvdXBFdmVudHMuY2NHcm91cE1lbWJlckJhbm5lZC5zdWJzY3JpYmUoKGl0ZW06IElHcm91cE1lbWJlcktpY2tlZEJhbm5lZCkgPT4ge1xuICAgIHRoaXMuYWRkTWVzc2FnZShpdGVtLm1lc3NhZ2UhKVxuICAgfSlcbiAgIHRoaXMuY2NHcm91cE1lbWJlcktpY2tlZCA9IENvbWV0Q2hhdEdyb3VwRXZlbnRzLmNjR3JvdXBNZW1iZXJLaWNrZWQuc3Vic2NyaWJlKChpdGVtOiBJR3JvdXBNZW1iZXJLaWNrZWRCYW5uZWQpID0+IHtcbiAgICAgdGhpcy5hZGRNZXNzYWdlKGl0ZW0ubWVzc2FnZSEpXG4gICB9KVxuICAgdGhpcy5jY0dyb3VwTWVtYmVyU2NvcGVDaGFuZ2VkID0gQ29tZXRDaGF0R3JvdXBFdmVudHMuY2NHcm91cE1lbWJlclNjb3BlQ2hhbmdlZC5zdWJzY3JpYmUoKGl0ZW06IElHcm91cE1lbWJlclNjb3BlQ2hhbmdlZCkgPT4ge1xuICAgIHRoaXMuYWRkTWVzc2FnZShpdGVtLm1lc3NhZ2UhKVxuICB9KVxuICAgdGhpcy5jY0dyb3VwTGVmdCA9IENvbWV0Q2hhdEdyb3VwRXZlbnRzLmNjR3JvdXBMZWZ0LnN1YnNjcmliZSgoaXRlbTogSUdyb3VwTGVmdCkgPT4ge1xuICAgIHRoaXMuYWRkTWVzc2FnZShpdGVtLm1lc3NhZ2UhKVxuICAgfSlcbiAgICB0aGlzLmNjTWVzc2FnZUVkaXQgPSBDb21ldENoYXRNZXNzYWdlRXZlbnRzLmNjTWVzc2FnZUVkaXRlZC5zdWJzY3JpYmUoKG9iamVjdDogSU1lc3NhZ2VzKSA9PiB7XG4gICAgICAgaWYob2JqZWN0Py5zdGF0dXMgPT0gTWVzc2FnZVN0YXR1cy5zdWNjZXNzKXtcbiAgICAgICAgdGhpcy51cGRhdGVNZXNzYWdlKG9iamVjdC5tZXNzYWdlISlcbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMuY2NNZXNzYWdlU2VudCA9IENvbWV0Q2hhdE1lc3NhZ2VFdmVudHMuY2NNZXNzYWdlU2VudC5zdWJzY3JpYmUoKG9iajogSU1lc3NhZ2VzKSA9PiB7XG4gICAgICBsZXQgbWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlID0gb2JqLm1lc3NhZ2UhXG4gICAgICBzd2l0Y2ggKG9iai5zdGF0dXMpIHtcbiAgICAgICAgY2FzZSBNZXNzYWdlU3RhdHVzLmlucHJvZ3Jlc3M6IHtcbiAgICAgICAgICB0aGlzLmFkZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgdGhpcy5wbGF5QXVkaW8oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIE1lc3NhZ2VTdGF0dXMuc3VjY2Vzczoge1xuICAgICAgICAgaWYobWVzc2FnZS5nZXRQYXJlbnRNZXNzYWdlSWQoKSB8fCB0aGlzLnBhcmVudE1lc3NhZ2VJZCl7XG4gICAgICAgICB0aGlzLnVwZGF0ZVJlcGx5Q291bnQobWVzc2FnZSlcbiAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnVwZGF0ZU1lc3NhZ2UobWVzc2FnZSwgdHJ1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBNZXNzYWdlU3RhdHVzLnN1Y2Nlc3M6IHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZU1lc3NhZ2UobWVzc2FnZSlcbiAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMuY2NNZXNzYWdlRGVsZXRlID0gQ29tZXRDaGF0TWVzc2FnZUV2ZW50cy5jY01lc3NhZ2VEZWxldGVkLnN1YnNjcmliZSgobWVzc2FnZU9iamVjdDogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKSA9PiB7XG4gICAgIHRoaXMucmVtb3ZlTWVzc2FnZShtZXNzYWdlT2JqZWN0KVxuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pXG4gICAgdGhpcy5jY0NhbGxFbmRlZCA9IENvbWV0Q2hhdENhbGxFdmVudHMuY2NDYWxsRW5kZWQuc3Vic2NyaWJlKChjYWxsOkNvbWV0Q2hhdC5DYWxsKT0+e1xuICAgICAgdGhpcy5zaG93T25nb2luZ0NhbGwgPSBmYWxzZVxuICAgICAgdGhpcy5zZXNzaW9uSWQgPSBcIlwiXG4gICAgICBpZihjYWxsKXtcbiAgICAgICAgdGhpcy5hZGRNZXNzYWdlKGNhbGwpXG4gICAgICB9XG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgICB9KVxuICAgIHRoaXMuY2NDYWxsUmVqZWN0ZWQgPSBDb21ldENoYXRDYWxsRXZlbnRzLmNjQ2FsbFJlamVjdGVkLnN1YnNjcmliZSgoY2FsbDogQ29tZXRDaGF0LkNhbGwpID0+IHtcbiAgICAgdGhpcy5hZGRNZXNzYWdlKGNhbGwpXG4gICAgfSlcbiAgICB0aGlzLmNjT3V0Z29pbmdDYWxsID0gQ29tZXRDaGF0Q2FsbEV2ZW50cy5jY091dGdvaW5nQ2FsbC5zdWJzY3JpYmUoKGNhbGw6IENvbWV0Q2hhdC5DYWxsKSA9PiB7XG5cbiAgICAgIHRoaXMuYWRkTWVzc2FnZShjYWxsKVxuICAgIH0pXG4gICAgdGhpcy5jY0NhbGxBY2NlcHRlZCA9IENvbWV0Q2hhdENhbGxFdmVudHMuY2NDYWxsQWNjZXB0ZWQuc3Vic2NyaWJlKChjYWxsOiBDb21ldENoYXQuQ2FsbCkgPT4ge1xuICAgICAgdGhpcy5hZGRNZXNzYWdlKGNhbGwpXG4gICAgfSlcbiAgfVxuICBjbG9zZVNtYXJ0UmVwbHkgPSgpPT57XG4gICAgdGhpcy5zaG93U21hcnRSZXBseSA9IGZhbHNlXG4gICAgdGhpcy5zbWFydFJlcGx5TWVzc2FnZSA9IG51bGxcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgIH1cbiAgc2VuZFJlcGx5ID0oZXZlbnQ6YW55KT0+e1xuICAgIGxldCByZXBseTpzdHJpbmcgPSBldmVudD8uZGV0YWlsPy5yZXBseVxuaWYodGhpcy5zbWFydFJlcGx5Q29uZmlnLmNjU21hcnRSZXBsaWVzQ2xpY2tlZCl7XG50aGlzLnNtYXJ0UmVwbHlDb25maWcuY2NTbWFydFJlcGxpZXNDbGlja2VkKHJlcGx5LHRoaXMuc21hcnRSZXBseU1lc3NhZ2UhLHRoaXMub25FcnJvcix0aGlzLmN1c3RvbVNvdW5kRm9yTWVzc2FnZXMsdGhpcy5kaXNhYmxlU291bmRGb3JNZXNzYWdlcylcbnRoaXMuY2xvc2VTbWFydFJlcGx5KClcbn1cbiAgfVxuICBnZXRSZXBsaWVzKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgbGV0IHNtYXJ0UmVwbHk6YW55ID0gdGhpcy5zbWFydFJlcGx5TWVzc2FnZVxuICAgIGNvbnN0IHNtYXJ0UmVwbHlPYmplY3QgPSBzbWFydFJlcGx5Py5tZXRhZGF0YT8uW1NtYXJ0UmVwbGllc0NvbnN0YW50cy5pbmplY3RlZF0/LmV4dGVuc2lvbnM/LltTbWFydFJlcGxpZXNDb25zdGFudHMuc21hcnRfcmVwbHldO1xuICAgIGlmIChzbWFydFJlcGx5T2JqZWN0Py5yZXBseV9wb3NpdGl2ZSAmJiBzbWFydFJlcGx5T2JqZWN0Py5yZXBseV9uZXV0cmFsICYmIHNtYXJ0UmVwbHlPYmplY3Q/LnJlcGx5X25lZ2F0aXZlKSB7XG5cbiAgICAgIGNvbnN0IHsgcmVwbHlfcG9zaXRpdmUsIHJlcGx5X25ldXRyYWwsIHJlcGx5X25lZ2F0aXZlIH0gPSBzbWFydFJlcGx5T2JqZWN0O1xuICAgICAgcmV0dXJuIFtyZXBseV9wb3NpdGl2ZSwgcmVwbHlfbmV1dHJhbCwgcmVwbHlfbmVnYXRpdmVdO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB1bnN1YnNjcmliZVRvRXZlbnRzKCkge1xuICAgIHRoaXMuY2NHcm91cE1lbWJlckFkZGVkPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2NHcm91cE1lbWJlckJhbm5lZD8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmNjR3JvdXBNZW1iZXJKb2luZWQ/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jY0dyb3VwTWVtYmVyS2lja2VkPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2NPd25lcnNoaXBDaGFuZ2VkPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2NHcm91cExlZnQ/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jY01lc3NhZ2VFZGl0Py51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2NNZXNzYWdlU2VudD8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmNjTGl2ZVJlYWN0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2NNZXNzYWdlRGVsZXRlPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2NHcm91cE1lbWJlclNjb3BlQ2hhbmdlZD8udW5zdWJzY3JpYmUoKVxuICB9XG4gIC8qKlxuKiBzdHlsaW5nIHBhcnRcbiovXG4gIGNoYXRzTGlzdFN0eWxlID0gKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBoZWlnaHQ6IHRoaXMubWVzc2FnZUxpc3RTdHlsZS5oZWlnaHQsXG4gICAgICBiYWNrZ3JvdW5kOiB0aGlzLm1lc3NhZ2VMaXN0U3R5bGUuYmFja2dyb3VuZCxcbiAgICB9O1xuICB9XG4gIG1lc3NhZ2VDb250YWluZXJTdHlsZSA9ICgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IHRoaXMubWVzc2FnZUxpc3RTdHlsZS53aWR0aCxcbiAgICB9O1xuICB9XG4gIGVycm9yU3R5bGUgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHRGb250OiB0aGlzLm1lc3NhZ2VMaXN0U3R5bGUuZXJyb3JTdGF0ZVRleHRGb250LFxuICAgICAgdGV4dENvbG9yOiB0aGlzLm1lc3NhZ2VMaXN0U3R5bGUuZXJyb3JTdGF0ZVRleHRDb2xvcixcbiAgICB9XG4gIH1cbiAgZW1wdHlTdHlsZSA9ICgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dEZvbnQ6IHRoaXMubWVzc2FnZUxpc3RTdHlsZS5lbXB0eVN0YXRlVGV4dEZvbnQsXG4gICAgICB0ZXh0Q29sb3I6IHRoaXMubWVzc2FnZUxpc3RTdHlsZS5lbXB0eVN0YXRlVGV4dENvbG9yLFxuICAgIH1cbiAgfVxuICBsb2FkaW5nU3R5bGUgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGljb25UaW50OiB0aGlzLm1lc3NhZ2VMaXN0U3R5bGUubG9hZGluZ0ljb25UaW50LFxuICAgIH1cbiAgfVxuICB3cmFwcGVyU3R5bGUgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlaWdodDogdGhpcy5tZXNzYWdlTGlzdFN0eWxlLmhlaWdodCxcbiAgICAgIHdpZHRoOiB0aGlzLm1lc3NhZ2VMaXN0U3R5bGUud2lkdGgsXG4gICAgICBiYWNrZ3JvdW5kOiB0aGlzLm1lc3NhZ2VMaXN0U3R5bGUuYmFja2dyb3VuZCxcbiAgICAgIGJvcmRlcjogdGhpcy5tZXNzYWdlTGlzdFN0eWxlLmJvcmRlcixcbiAgICAgIGJvcmRlclJhZGl1czogdGhpcy5tZXNzYWdlTGlzdFN0eWxlLmJvcmRlclJhZGl1c1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNjLW1lc3NhZ2UtbGlzdF9fd3JhcHBlclwiIFtuZ1N0eWxlXT1cIndyYXBwZXJTdHlsZSgpXCI+XG4gIDxkaXYgY2xhc3M9XCJjYy1tZXNzYWdlLWxpc3RfX2hlYWRlci12aWV3XCI+XG48ZGl2ICpuZ0lmPVwiaGVhZGVyVmlld1wiPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyVmlld1wiPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNjLW1lc3NhZ2UtbGlzdFwiICNsaXN0U2Nyb2xsPlxuICAgIDxkaXYgY2xhc3M9XCJjYy1tZXNzYWdlLWxpc3RfX3RvcFwiICN0b3A+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNjLW1lc3NhZ2UtbGlzdF9fZGVjb3JhdG9yLW1lc3NhZ2VcIiAqbmdJZj1cInN0YXRlID09IHN0YXRlcy5sb2FkaW5nIHx8IHN0YXRlID09IHN0YXRlcy5lcnJvciAgfHwgc3RhdGUgPT0gc3RhdGVzLmVtcHR5IFwiXG4gICAgICBbbmdTdHlsZV09XCJtZXNzYWdlQ29udGFpbmVyU3R5bGUoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNjLW1lc3NhZ2UtbGlzdF9fbG9hZGluZy12aWV3XCIgKm5nSWY9XCJzdGF0ZSA9PSBzdGF0ZXMubG9hZGluZyBcIj5cbiAgICAgICAgPGNvbWV0Y2hhdC1sb2FkZXIgW2ljb25VUkxdPVwibG9hZGluZ0ljb25VUkxcIiBbbG9hZGVyU3R5bGVdPVwibG9hZGluZ1N0eWxlKClcIj5cbiAgICAgICAgPC9jb21ldGNoYXQtbG9hZGVyPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNjLW1lc3NhZ2UtbGlzdF9fY3VzdG9tdmlldy0tbG9hZGluZ1wiICpuZ0lmPVwic3RhdGUgPT0gc3RhdGVzLmxvYWRpbmcgICYmIGxvYWRpbmdTdGF0ZVZpZXdcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ1N0YXRlVmlld1wiPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYy1tZXNzYWdlLWxpc3RfX2Vycm9yLXZpZXdcIiAqbmdJZj1cInN0YXRlID09IHN0YXRlcy5lcnJvciAgJiYgIWhpZGVFcnJvciBcIj5cbiAgICAgICAgPGNvbWV0Y2hhdC1sYWJlbCBbbGFiZWxTdHlsZV09XCJlcnJvclN0eWxlKClcIiAqbmdJZj1cInN0YXRlID09IHN0YXRlcy5lcnJvciAgJiYgIWhpZGVFcnJvciAmJiAhZXJyb3JTdGF0ZVZpZXdcIiBbdGV4dF09XCJlcnJvclN0YXRlVGV4dFwiXG4gICAgICAgICAgPlxuICAgICAgICA8L2NvbWV0Y2hhdC1sYWJlbD5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjYy1tZXNzYWdlLWxpc3RfX2N1c3RvbS12aWV3LS1lcnJvclwiICpuZ0lmPVwic3RhdGUgPT0gc3RhdGVzLmVycm9yICAmJiAhaGlkZUVycm9yICYmIGVycm9yU3RhdGVWaWV3XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImVycm9yU3RhdGVWaWV3XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNjLW1lc3NhZ2UtbGlzdF9fZW1wdHktdmlld1wiICpuZ0lmPVwic3RhdGUgPT0gc3RhdGVzLmVtcHR5XCI+XG4gICAgICAgIDxjb21ldGNoYXQtbGFiZWwgW2xhYmVsU3R5bGVdPVwiZW1wdHlTdHlsZSgpXCIgKm5nSWY9XCJzdGF0ZSA9PSBzdGF0ZXMuZW1wdHkgJiYgIWVtcHR5U3RhdGVWaWV3XCIgW3RleHRdPVwiZW1wdHlTdGF0ZVRleHRcIlxuICAgICAgICAgID5cbiAgICAgICAgPC9jb21ldGNoYXQtbGFiZWw+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY2MtbWVzc2FnZS1saXN0X19jdXN0b20tdmlldy0tZW1wdHlcIiAqbmdJZj1cInN0YXRlID09IHN0YXRlcy5lbXB0eSAmJiBlbXB0eVN0YXRlVmlld1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJlbXB0eVN0YXRlVmlld1wiPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2MtbWVzc2FnZS1saXN0X19idWJibGVcIiAqbmdGb3I9XCJsZXQgbWVzc2FnZSBvZiBtZXNzYWdlc0xpc3Q7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYy1tZXNzYWdlLWxpc3RfX2RhdGUtY29udGFpbmVyXCIgKm5nSWY9XCIoaSA9PT0gMClcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjYy1tZXNzYWdlLWxpc3RfX2RhdGVcIiA+XG4gICAgICAgICAgPGNvbWV0Y2hhdC1kYXRlIFt0aW1lc3RhbXBdPVwibWVzc2FnZSEuZ2V0U2VudEF0KClcIiAgW3BhdHRlcm5dPVwiRGF0ZVNlcGFyYXRvclBhdHRlcm5cIiBbZGF0ZVN0eWxlXT1cImRhdGVTZXBhcmF0b3JTdHlsZVwiXG4gICAgICAgICAgID5cbiAgICAgICAgICA8L2NvbWV0Y2hhdC1kYXRlPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYy1tZXNzYWdlLWxpc3RfX2RhdGUtY29udGFpbmVyXCIgKm5nSWY9XCIoaSA+IDAgJiYgaXNEYXRlRGlmZmVyZW50KG1lc3NhZ2VzTGlzdFtpIC0gMV0/LmdldFNlbnRBdCgpLCBtZXNzYWdlc0xpc3RbaV0/LmdldFNlbnRBdCgpKSlcbiAgICAgICAgXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY2MtbWVzc2FnZS1saXN0X19kYXRlXCIgID5cbiAgICAgICAgICA8Y29tZXRjaGF0LWRhdGUgW3RpbWVzdGFtcF09XCJtZXNzYWdlPy5nZXRTZW50QXQoKVwiIFtwYXR0ZXJuXT1cIkRhdGVTZXBhcmF0b3JQYXR0ZXJuXCIgICBbZGF0ZVN0eWxlXT1cImRhdGVTZXBhcmF0b3JTdHlsZVwiXG4gICAgICAgICAgID5cbiAgICAgICAgICA8L2NvbWV0Y2hhdC1kYXRlPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImdldEJ1YmJsZVdyYXBwZXIobWVzc2FnZSkgXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdldEJ1YmJsZVdyYXBwZXIobWVzc2FnZSlcIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgPGRpdj5cbiAgICAgICAgPGNvbWV0Y2hhdC1tZXNzYWdlLWJ1YmJsZSAgKm5nSWY9XCIhZ2V0QnViYmxlV3JhcHBlcihtZXNzYWdlKVwiIFtsZWFkaW5nVmlld109XCIgc2hvd0F2YXRhciA/IGxlYWRpbmdWaWV3IDogbnVsbFwiIFtib3R0b21WaWV3XT1cImVuYWJsZVJlYWN0aW9ucyA/IHJlYWN0aW9uVmlldyA6IG51bGxcIlxuICAgICAgICBbaGVhZGVyVmlld109XCJnZXRIZWFkZXJWaWV3KG1lc3NhZ2UpIHx8IG1lc3NhZ2U/LmdldENhdGVnb3J5KCkgIT0gTWVzc2FnZUNhdGVnb3J5LmFjdGlvbiAmJiBzaG93SGVhZGVyVGl0bGUobWVzc2FnZSkgPyBidWJibGVIZWFkZXIgOiBudWxsXCIgW2Zvb3RlclZpZXddPVwiZm9vdGVyVmlld1wiICBbY29udGVudFZpZXddPVwiY29udGVudFZpZXdcIiBbdGhyZWFkVmlld109XCJ0aHJlYWRWaWV3XCJcbiAgICAgICAgIFtpZF09XCJtZXNzYWdlPy5nZXRJZCgpIHx8IG1lc3NhZ2U/LmdldE11aWQoKVwiIFtvcHRpb25zXT1cInNldE1lc3NhZ2VPcHRpb25zKG1lc3NhZ2UpXCJcbiAgICAgICAgICBbbWVzc2FnZUJ1YmJsZVN0eWxlXT1cInNldE1lc3NhZ2VCdWJibGVTdHlsZShtZXNzYWdlKVwiICBbYWxpZ25tZW50XT1cInNldEJ1YmJsZUFsaWdubWVudChtZXNzYWdlKVwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2NvbnRlbnRWaWV3PlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJnZXRDb250ZW50VmlldyhtZXNzYWdlKTtjb250ZXh0OnsgJGltcGxpY2l0OiBtZXNzYWdlIH1cIiA+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVhY3Rpb25WaWV3PlxuICAgICAgICAgIDxyZWFjdGlvbnMtdmlldyBbbWVzc2FnZU9iamVjdF09XCJtZXNzYWdlXCIgW2FsaWdubWVudF09XCJzZXRCdWJibGVBbGlnbm1lbnQobWVzc2FnZSlcIlxuICAgICAgICAgIFtsb2dnZWRJblVzZXJdPVwibG9nZ2VkSW5Vc2VyXCIgW3JlYWN0aW9uc1N0eWxlXT1cInJlYWN0aW9uc1N0eWxlKG1lc3NhZ2UpXCI+PC9yZWFjdGlvbnMtdmlldz5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgPG5nLXRlbXBsYXRlICNmb290ZXJWaWV3PlxuICAgICAgICAgIDxkaXYgIGNsYXNzPVwiY2MtbWVzc2FnZS1saXN0X19idWJibGUtZm9vdGVyXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2V0Rm9vdGVyVmlldyhtZXNzYWdlKTtlbHNlIGJ1YmJsZUZvb3RlclwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0Rm9vdGVyVmlldyhtZXNzYWdlKTtjb250ZXh0OnsgJGltcGxpY2l0OiBtZXNzYWdlIH1cIiA+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2J1YmJsZUZvb3Rlcj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNjLW1lc3NhZ2UtbGlzdF9fYnViYmxlLWRhdGVcIiAqbmdJZj1cInRpbWVzdGFtcEFsaWdubWVudCA9PSB0aW1lc3RhbXBFbnVtLmJvdHRvbSAmJiBtZXNzYWdlPy5nZXRDYXRlZ29yeSgpICE9IE1lc3NhZ2VDYXRlZ29yeS5hY3Rpb24gJiYgIW1lc3NhZ2UuZ2V0RGVsZXRlZEF0KCkgJiYgbWVzc2FnZT8uZ2V0Q2F0ZWdvcnkoKSAhPSBNZXNzYWdlQ2F0ZWdvcnkuY2FsbFwiPlxuICAgICAgICAgICAgICAgIDxjb21ldGNoYXQtZGF0ZSBbdGltZXN0YW1wXT1cIm1lc3NhZ2U/LmdldFNlbnRBdCgpXCIgW2RhdGVTdHlsZV09XCJidWJibGVEYXRlU3R5bGVcIiBbcGF0dGVybl09XCJkYXRlUGF0dGVyblwiPlxuICAgICAgICAgICAgICAgIDwvY29tZXRjaGF0LWRhdGU+XG4gICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiAhbWVzc2FnZT8uZ2V0RGVsZXRlZEF0KCkgJiYgICFkaXNhYmxlUmVjZWlwdCAmJiAoIW1lc3NhZ2U/LmdldFNlbmRlcigpIHx8dGhpcy5sb2dnZWRJblVzZXIuZ2V0VWlkKCkgPT0gbWVzc2FnZT8uZ2V0U2VuZGVyKCk/LmdldFVpZCgpKSAmJiBtZXNzYWdlPy5nZXRDYXRlZ29yeSgpICE9IE1lc3NhZ2VDYXRlZ29yeS5hY3Rpb24gJiYgbWVzc2FnZT8uZ2V0Q2F0ZWdvcnkoKSAhPSBNZXNzYWdlQ2F0ZWdvcnkuY2FsbFwiIGNsYXNzPVwiY2MtbWVzc2FnZS1saXN0X19yZWNlaXB0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxjb21ldGNoYXQtcmVjZWlwdCBbcmVjZWlwdF09XCJnZXRNZXNzYWdlUmVjZWlwdChtZXNzYWdlKVwiIFtyZWNlaXB0U3R5bGVdPVwicmVjZWlwdFN0eWxlXCIgW3dhaXRJY29uXT1cIndhaXRJY29uXCIgW3NlbnRJY29uXT1cInNlbnRJY29uXCIgW2RlbGl2ZXJlZEljb25dPVwiZGVsaXZlcmVkSWNvblwiIFtyZWFkSWNvbl09XCJyZWFkSWNvblwiIFtlcnJvckljb25dPVwiZXJyb3JJY29uXCI+PC9jb21ldGNoYXQtcmVjZWlwdD5cbiAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjbGVhZGluZ1ZpZXc+XG4gIDxkaXYgICpuZ0lmPVwiIG1lc3NhZ2U/LmdldENhdGVnb3J5KCkgIT0gTWVzc2FnZUNhdGVnb3J5LmFjdGlvbiAgJiYgc2hvd0hlYWRlclRpdGxlKG1lc3NhZ2UpXCIgPlxuICAgIDxjb21ldGNoYXQtYXZhdGFyIFtuYW1lXT1cIm1lc3NhZ2U/LmdldFNlbmRlcigpPy5nZXROYW1lKClcIiBbc3R5bGVdPVwiYXZhdGFyU3R5bGVcIiBbaW1hZ2VdPVwibWVzc2FnZT8uZ2V0U2VuZGVyKCk/LmdldEF2YXRhcigpXCI+XG4gICAgPC9jb21ldGNoYXQtYXZhdGFyPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2J1YmJsZUhlYWRlcj5cbiAgPGRpdiAqbmdJZj1cImdldEhlYWRlclZpZXcobWVzc2FnZSk7ZWxzZSBkZWZhdWx0SGVhZGVyXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdldEhlYWRlclZpZXcobWVzc2FnZSk7Y29udGV4dDp7ICRpbXBsaWNpdDogbWVzc2FnZSB9XCIgPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEhlYWRlcj5cbiAgPGRpdiAgY2xhc3M9XCJjYy1tZXNzYWdlLWxpc3RfX2J1YmJsZS1oZWFkZXJcIiAqbmdJZj1cIm1lc3NhZ2U/LmdldENhdGVnb3J5KCkgIT0gTWVzc2FnZUNhdGVnb3J5LmFjdGlvbiAmJiBzaG93SGVhZGVyVGl0bGUobWVzc2FnZSkgJiYgbWVzc2FnZT8uZ2V0Q2F0ZWdvcnkoKSAhPSBNZXNzYWdlQ2F0ZWdvcnkuY2FsbFwiPlxuICAgIDxjb21ldGNoYXQtbGFiZWwgW3RleHRdPVwibWVzc2FnZT8uZ2V0U2VuZGVyKCk/LmdldE5hbWUoKVwiIFtsYWJlbFN0eWxlXT1cImxhYmVsU3R5bGVcIj48L2NvbWV0Y2hhdC1sYWJlbD5cbiAgICA8Y29tZXRjaGF0LWRhdGUgW3BhdHRlcm5dPVwiZGF0ZVBhdHRlcm5cIiBbdGltZXN0YW1wXT1cIm1lc3NhZ2U/LmdldFNlbnRBdCgpXCIgW3N0eWxlXT1cImJ1YmJsZURhdGVTdHlsZVwiICpuZ0lmPVwidGltZXN0YW1wQWxpZ25tZW50ID09IHRpbWVzdGFtcEVudW0udG9wXCI+PC9jb21ldGNoYXQtZGF0ZT5cbiAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI3RocmVhZFZpZXc+XG4gIDxkaXYgY2xhc3M9XCJjYy1tZXNzYWdlLWxpc3RfX3RocmVhZHJlcGxpZXNcIiAqbmdJZj1cIm1lc3NhZ2U/LmdldFJlcGx5Q291bnQoKSAmJiAhbWVzc2FnZS5nZXREZWxldGVkQXQoKVwiID5cbiAgICA8Y29tZXRjaGF0LWRpdmlkZXIgW2RpdmlkZXJTdHlsZV09XCJkaXZpZGVyU3R5bGVcIj48L2NvbWV0Y2hhdC1kaXZpZGVyPlxuICAgIDxjb21ldGNoYXQtYnV0dG9uIFt0ZXh0XT1cImdldFRocmVhZENvdW50KG1lc3NhZ2UpXCIgW2J1dHRvblN0eWxlXT1cImdldFRocmVhZFZpZXdTdHlsZShtZXNzYWdlKVwiIFtpY29uVVJMXT1cInRocmVhZE9wZW5JY29uXCIgKGNjLWJ1dHRvbi1jbGlja2VkKT1cIm9wZW5UaHJlYWRWaWV3KG1lc3NhZ2UpXCI+XG4gICAgPC9jb21ldGNoYXQtYnV0dG9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4gICAgICA8L2NvbWV0Y2hhdC1tZXNzYWdlLWJ1YmJsZT5cbiAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2MtbWVzc2FnZS1saXN0X19ib3R0b21cIiAjYm90dG9tPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNjLW1lc3NhZ2UtbGlzdF9fZm9vdGVyLXZpZXdcIj5cbiAgICA8ZGl2ICpuZ0lmPVwiZm9vdGVyVmlldztlbHNlIGZvb3RlclwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvb3RlclZpZXdcIj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxuZy10ZW1wbGF0ZSAjZm9vdGVyPlxuICAgICAgPGRpdiBjbGFzcz1cImNjLW1lc3NhZ2UtbGlzdF9fc21hcnQtcmVwbGllc1wiICpuZ0lmPVwic2hvd1NtYXJ0UmVwbHkgJiYgZ2V0UmVwbGllcygpICYmICghVW5yZWFkQ291bnQgfHwgVW5yZWFkQ291bnQubGVuZ3RoID09IDApXCI+XG4gICAgICAgIDxzbWFydC1yZXBsaWVzIFtzbWFydFJlcGx5U3R5bGVdPVwic21hcnRSZXBseVN0eWxlXCIgW3JlcGxpZXNdPVwiZ2V0UmVwbGllcygpXCIgKGNjLXJlcGx5LWNsaWNrZWQpPVwic2VuZFJlcGx5KCRldmVudClcIiAoY2MtY2xvc2UtY2xpY2tlZCk9XCJjbG9zZVNtYXJ0UmVwbHkoKVwiPlxuICAgICAgICA8L3NtYXJ0LXJlcGxpZXM+XG4gICAgICA8L2Rpdj5cbjxkaXYgY2xhc3M9XCJjYy1tZXNzYWdlLWxpc3RfX21lc3NhZ2UtaW5kaWNhdG9yXCIgKm5nSWY9XCJVbnJlYWRDb3VudCAmJiBVbnJlYWRDb3VudC5sZW5ndGggPiAwICYmICFpc09uQm90dG9tXCI+XG4gIDxjb21ldGNoYXQtYnV0dG9uIFt0ZXh0XT1cIm5ld01lc3NhZ2VDb3VudFwiIFtidXR0b25TdHlsZV09XCJ1bnJlYWRNZXNzYWdlc1N0eWxlXCIgKGNjLWJ1dHRvbi1jbGlja2VkKT1cInNjcm9sbFRvQm90dG9tKClcIj48L2NvbWV0Y2hhdC1idXR0b24+XG48L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cblxuPC9kaXY+XG48IS0tIGRlZmF1bHQgYnViYmxlcyAtLT5cbjxuZy10ZW1wbGF0ZSAjdGV4dEJ1YmJsZSBsZXQtbWVzc2FnZT5cbiAgPGNvbWV0Y2hhdC10ZXh0LWJ1YmJsZSAqbmdJZj1cIm1lc3NhZ2U/LnR5cGUgPT0gTWVzc2FnZVR5cGVzQ29uc3RhbnQuZ3JvdXBNZW1iZXJcIiBbdGV4dFN0eWxlXT1cInNldFRleHRCdWJibGVTdHlsZShtZXNzYWdlKVwiIFt0ZXh0XT1cIm1lc3NhZ2U/Lm1lc3NhZ2VcIj48L2NvbWV0Y2hhdC10ZXh0LWJ1YmJsZT5cbiAgPGNvbWV0Y2hhdC10ZXh0LWJ1YmJsZSAqbmdJZj1cIm1lc3NhZ2U/LmdldERlbGV0ZWRBdCgpXCIgW3RleHRTdHlsZV09XCJzZXRUZXh0QnViYmxlU3R5bGUobWVzc2FnZSlcIiBbdGV4dF09XCJsb2NhbGl6ZSgnTUVTU0FHRV9JU19ERUxFVEVEJylcIj48L2NvbWV0Y2hhdC10ZXh0LWJ1YmJsZT5cbjxjb21ldGNoYXQtdGV4dC1idWJibGUgKm5nSWY9XCIhaXNUcmFuc2xhdGVkKG1lc3NhZ2UpICYmICFnZXRMaW5rUHJldmlldyhtZXNzYWdlKSAmJiAhbWVzc2FnZT8uZGVsZXRlZEF0ICYmIG1lc3NhZ2U/LnR5cGUgIT0gTWVzc2FnZVR5cGVzQ29uc3RhbnQuZ3JvdXBNZW1iZXJcIiBbdGV4dFN0eWxlXT1cInNldFRleHRCdWJibGVTdHlsZShtZXNzYWdlKVwiIFt0ZXh0XT1cImdldFRleHRNZXNzYWdlKG1lc3NhZ2UpXCI+PC9jb21ldGNoYXQtdGV4dC1idWJibGU+XG48bGluay1wcmV2aWV3IFtsaW5rUHJldmlld1N0eWxlXT1cImxpbmtQcmV2aWV3U3R5bGVcIiAoY2MtbGluay1jbGlja2VkKT1cIm9wZW5MaW5rVVJMKCRldmVudClcIiAqbmdJZj1cIiFtZXNzYWdlPy5nZXREZWxldGVkQXQoKSAmJiBnZXRMaW5rUHJldmlldyhtZXNzYWdlKSAmJiBlbmFibGVMaW5rUHJldmlld1wiIFt0aXRsZV09XCJnZXRMaW5rUHJldmlld0RldGFpbHMoJ3RpdGxlJyxtZXNzYWdlKVwiIFtkZXNjcmlwdGlvbl09XCJnZXRMaW5rUHJldmlld0RldGFpbHMoJ2Rlc2NyaXB0aW9uJyxtZXNzYWdlKVwiIFtVUkxdPVwiZ2V0TGlua1ByZXZpZXdEZXRhaWxzKCd1cmwnLG1lc3NhZ2UpXCIgW2ltYWdlXT1cImdldExpbmtQcmV2aWV3RGV0YWlscygnaW1hZ2UnLG1lc3NhZ2UpXCIgW2Zhdkljb25VUkxdPVwiZ2V0TGlua1ByZXZpZXdEZXRhaWxzKCdmYXZpY29uJyxtZXNzYWdlKVwiPlxuICA8Y29tZXRjaGF0LXRleHQtYnViYmxlXG4gICpuZ0lmPVwiIWlzVHJhbnNsYXRlZChtZXNzYWdlKSAmJiBnZXRMaW5rUHJldmlldyhtZXNzYWdlKSAmJiAhbWVzc2FnZT8uZGVsZXRlZEF0ICYmIG1lc3NhZ2U/LnR5cGUgIT0gTWVzc2FnZVR5cGVzQ29uc3RhbnQuZ3JvdXBNZW1iZXJcIlxuICBbdGV4dFN0eWxlXT1cInNldFRleHRCdWJibGVTdHlsZShtZXNzYWdlKVwiIFt0ZXh0XT1cImdldFRleHRNZXNzYWdlKG1lc3NhZ2UpXCI+PC9jb21ldGNoYXQtdGV4dC1idWJibGU+XG48L2xpbmstcHJldmlldz5cbjxtZXNzYWdlLXRyYW5zbGF0aW9uLWJ1YmJsZSBbYWxpZ25tZW50XT1cImdldEJ1YmJsZUFsaWdubWVudChtZXNzYWdlKVwiICpuZ0lmPVwiaXNUcmFuc2xhdGVkKG1lc3NhZ2UpXCIgIFttZXNzYWdlVHJhbnNsYXRpb25TdHlsZV09XCJzZXRUcmFuc2xhdGlvblN0eWxlKG1lc3NhZ2UpXCIgW3RyYW5zbGF0ZWRUZXh0XT1cImlzVHJhbnNsYXRlZChtZXNzYWdlKVwiPlxuICA8Y29tZXRjaGF0LXRleHQtYnViYmxlICpuZ0lmPVwiICFtZXNzYWdlPy5kZWxldGVkQXQgJiYgbWVzc2FnZT8udHlwZSAhPSBNZXNzYWdlVHlwZXNDb25zdGFudC5ncm91cE1lbWJlclwiIFt0ZXh0U3R5bGVdPVwic2V0VGV4dEJ1YmJsZVN0eWxlKG1lc3NhZ2UpXCIgW3RleHRdPVwibWVzc2FnZT8udGV4dFwiPjwvY29tZXRjaGF0LXRleHQtYnViYmxlPlxuXG48L21lc3NhZ2UtdHJhbnNsYXRpb24tYnViYmxlPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjZmlsZUJ1YmJsZSBsZXQtbWVzc2FnZT5cblxuICA8Y29tZXRjaGF0LWZpbGUtYnViYmxlIFtmaWxlU3R5bGVdPVwic2V0RmlsZUJ1YmJsZVN0eWxlKG1lc3NhZ2UpXCIgW2Rvd25sb2FkSWNvblVSTF09XCJkb3dubG9hZEljb25VUkxcIiBbc3VidGl0bGVdPVwibG9jYWxpemUoJ1NIQVJFRF9GSUxFJylcIiBbdGl0bGVdPVwibWVzc2FnZT8uZGF0YT8uYXR0YWNobWVudHMgPyBtZXNzYWdlPy5kYXRhPy5hdHRhY2htZW50c1swXT8ubmFtZTogJydcIiBbZmlsZVVSTF09XCJtZXNzYWdlPy5kYXRhPy5hdHRhY2htZW50cyA/IG1lc3NhZ2U/LmRhdGE/LmF0dGFjaG1lbnRzWzBdPy51cmwgOiAnJ1wiPjwvY29tZXRjaGF0LWZpbGUtYnViYmxlPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjYXVkaW9CdWJibGUgbGV0LW1lc3NhZ2U+XG4gIDxjb21ldGNoYXQtaWNvbi1idXR0b24gW2Rpc2FibGVkXT1cInRydWVcIiAqbmdJZj1cIm1lc3NhZ2U/LmNhdGVnb3J5ID09IGNhbGxDb25zdGFudCAmJiBtZXNzYWdlPy50eXBlID09IE1lc3NhZ2VUeXBlc0NvbnN0YW50LmF1ZGlvXCIgW2ljb25VUkxdPVwiZ2V0Q2FsbFR5cGVJY29uKG1lc3NhZ2UpXCIgW2J1dHRvblN0eWxlXT1cImNhbGxTdGF0dXNTdHlsZShtZXNzYWdlKVwiIFt0ZXh0XT1cImdldENhbGxBY3Rpb25NZXNzYWdlKG1lc3NhZ2UpXCI+PC9jb21ldGNoYXQtaWNvbi1idXR0b24+XG4gIDxjb21ldGNoYXQtYXVkaW8tYnViYmxlICpuZ0lmPVwiIW1lc3NhZ2UuZ2V0RGVsZXRlZEF0KCkgJiYgbWVzc2FnZT8uY2F0ZWdvcnkgIT0gY2FsbENvbnN0YW50XCIgIFtzcmNdPVwibWVzc2FnZT8uZGF0YT8uYXR0YWNobWVudHMgPyBtZXNzYWdlPy5kYXRhPy5hdHRhY2htZW50c1swXT8udXJsIDogJydcIiA+IDwvY29tZXRjaGF0LWF1ZGlvLWJ1YmJsZT5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI3ZpZGVvQnViYmxlIGxldC1tZXNzYWdlPlxuICA8Y29tZXRjaGF0LWljb24tYnV0dG9uIFtkaXNhYmxlZF09XCJ0cnVlXCIgKm5nSWY9XCJtZXNzYWdlPy5jYXRlZ29yeSA9PSBjYWxsQ29uc3RhbnQgJiYgbWVzc2FnZT8udHlwZSA9PSBNZXNzYWdlVHlwZXNDb25zdGFudC52aWRlb1wiIFtpY29uVVJMXT1cImdldENhbGxUeXBlSWNvbihtZXNzYWdlKVwiIFtidXR0b25TdHlsZV09XCJjYWxsU3RhdHVzU3R5bGUobWVzc2FnZSlcIiBbdGV4dF09XCJnZXRDYWxsQWN0aW9uTWVzc2FnZShtZXNzYWdlKVwiPjwvY29tZXRjaGF0LWljb24tYnV0dG9uPlxuXG4gIDxjb21ldGNoYXQtdmlkZW8tYnViYmxlICpuZ0lmPVwiIW1lc3NhZ2UuZ2V0RGVsZXRlZEF0KCkgJiYgbWVzc2FnZT8uY2F0ZWdvcnkgIT0gY2FsbENvbnN0YW50XCIgW3ZpZGVvU3R5bGVdPVwidmlkZW9CdWJibGVTdHlsZVwiIFtzcmNdPVwibWVzc2FnZT8uZGF0YT8uYXR0YWNobWVudHMgPyBtZXNzYWdlPy5kYXRhPy5hdHRhY2htZW50c1swXT8udXJsIDogJydcIiBbcG9zdGVyXT1cIiBnZXRJbWFnZVRodW1ibmFpbChtZXNzYWdlKVwiPjwvY29tZXRjaGF0LXZpZGVvLWJ1YmJsZT5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2ltYWdlQnViYmxlIGxldC1tZXNzYWdlPlxuIDxpbWFnZS1tb2RlcmF0aW9uICAoY2Mtc2hvdy1kaWFsb2cpPVwib3Blbldhcm5pbmdEaWFsb2coJGV2ZW50KVwiICpuZ0lmPVwiIW1lc3NhZ2UuZ2V0RGVsZXRlZEF0KCkgJiYgZW5hYmxlSW1hZ2VNb2RlcmF0aW9uXCIgW21lc3NhZ2VdPVwibWVzc2FnZVwiIFtpbWFnZU1vZGVyYXRpb25TdHlsZV09XCJpbWFnZU1vZGVyYXRpb25TdHlsZVwiPlxuICA8Y29tZXRjaGF0LWltYWdlLWJ1YmJsZSAoY2MtaW1hZ2UtY2xpY2tlZCk9XCJvcGVuSW1hZ2VJbkZ1bGxTY3JlZW4obWVzc2FnZSlcIiAgIFtzcmNdPVwiIGdldEltYWdlVGh1bWJuYWlsKG1lc3NhZ2UpXCIgW3BsYWNlaG9sZGVySW1hZ2VdPVwicGxhY2Vob2xkZXJJY29uVVJMXCI+PC9jb21ldGNoYXQtaW1hZ2UtYnViYmxlPlxuIDwvaW1hZ2UtbW9kZXJhdGlvbj5cbiAgPGNvbWV0Y2hhdC1pbWFnZS1idWJibGUgKGNjLWltYWdlLWNsaWNrZWQpPVwib3BlbkltYWdlSW5GdWxsU2NyZWVuKG1lc3NhZ2UpXCIgKm5nSWY9XCIhbWVzc2FnZS5nZXREZWxldGVkQXQoKSAmJiAhZW5hYmxlSW1hZ2VNb2RlcmF0aW9uXCIgIFtzcmNdPVwiIGdldEltYWdlVGh1bWJuYWlsKG1lc3NhZ2UpXCIgW3BsYWNlaG9sZGVySW1hZ2VdPVwicGxhY2Vob2xkZXJJY29uVVJMXCI+PC9jb21ldGNoYXQtaW1hZ2UtYnViYmxlPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjY3VzdG9tVGV4dEJ1YmJsZT5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI3N0aWNrZXJCdWJibGUgIGxldC1tZXNzYWdlPlxuICA8Y29tZXRjaGF0LWltYWdlLWJ1YmJsZSBbc3JjXT1cImdldFN0aWNrZXIobWVzc2FnZSlcIiBbaW1hZ2VTdHlsZV09XCJpbWFnZUJ1YmJsZVN0eWxlXCIgPjwvY29tZXRjaGF0LWltYWdlLWJ1YmJsZT5cblxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjd2hpdGVib2FyZEJ1YmJsZSAgbGV0LW1lc3NhZ2U+XG4gIDxjb21ldGNoYXQtZG9jdW1lbnQtYnViYmxlIFtoaWRlU2VwYXJhdG9yXT1cImZhbHNlXCIgW2ljb25BbGlnbm1lbnRdPVwiZG9jdW1lbnRCdWJibGVBbGlnbm1lbnRcIiBbZG9jdW1lbnRTdHlsZV09XCJkb2N1bWVudEJ1YmJsZVN0eWxlXCIgW1VSTF09XCJnZXRXaGl0ZWJvYXJkRG9jdW1lbnQobWVzc2FnZSlcIiBbY2NDbGlja2VkXT1cImxhdW5jaENvbGxhYm9yYXRpdmVXaGl0ZWJvYXJkRG9jdW1lbnRcIiBbaWNvblVSTF09XCJ3aGl0ZWJvYXJkSWNvblVSTFwiIFt0aXRsZV09XCJ3aGl0ZWJvYXJkVGl0bGVcIiBbYnV0dG9uVGV4dF09XCJ3aGl0ZWJvYXJkQnV0dG9uVGV4dFwiIFtzdWJ0aXRsZV09XCJ3aGl0ZWJvYXJkU3ViaXRsZVwiPjwvY29tZXRjaGF0LWRvY3VtZW50LWJ1YmJsZT5cblxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjZG9jdW1lbnRCdWJibGUgIGxldC1tZXNzYWdlPlxuICA8Y29tZXRjaGF0LWRvY3VtZW50LWJ1YmJsZSBbaGlkZVNlcGFyYXRvcl09XCJmYWxzZVwiIFtpY29uQWxpZ25tZW50XT1cImRvY3VtZW50QnViYmxlQWxpZ25tZW50XCIgW2RvY3VtZW50U3R5bGVdPVwiZG9jdW1lbnRCdWJibGVTdHlsZVwiIFtVUkxdPVwiZ2V0V2hpdGVib2FyZERvY3VtZW50KG1lc3NhZ2UpXCIgW2NjQ2xpY2tlZF09XCJsYXVuY2hDb2xsYWJvcmF0aXZlV2hpdGVib2FyZERvY3VtZW50XCIgW2ljb25VUkxdPVwiZG9jdW1lbnRJY29uVVJMXCIgW3RpdGxlXT1cImRvY3VtZW50VGl0bGVcIiBbYnV0dG9uVGV4dF09XCJkb2N1bWVudEJ1dHRvblRleHRcIiBbc3VidGl0bGVdPVwiZG9jdW1lbnRTdWJpdGxlXCI+PC9jb21ldGNoYXQtZG9jdW1lbnQtYnViYmxlPlxuXG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNkaXJlY3RDYWxsaW5nICBsZXQtbWVzc2FnZT5cbiAgPGNvbWV0Y2hhdC1kb2N1bWVudC1idWJibGUgIFtoaWRlU2VwYXJhdG9yXT1cInRydWVcIiBbaWNvbkFsaWdubWVudF09XCJjYWxsQnViYmxlQWxpZ25tZW50XCIgW2RvY3VtZW50U3R5bGVdPVwiZ2V0Q2FsbEJ1YmJsZVN0eWxlKG1lc3NhZ2UpXCIgW1VSTF09XCJnZXRTZXNzaW9uSWQobWVzc2FnZSlcIiBbY2NDbGlja2VkXT1cInN0YXJ0RGlyZWN0Q2FsbFwiIFtpY29uVVJMXT1cImRpcmVjdENhbGxJY29uVVJMXCIgW3RpdGxlXT1cImdldENhbGxCdWJibGVUaXRsZShtZXNzYWdlKVwiIFtidXR0b25UZXh0XT1cImpvaW5DYWxsQnV0dG9uVGV4dFwiPjwvY29tZXRjaGF0LWRvY3VtZW50LWJ1YmJsZT5cblxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjcG9sbEJ1YmJsZSAgbGV0LW1lc3NhZ2U+XG4gIDxwb2xscy1idWJibGUgW3BvbGxTdHlsZV09XCJwb2xsQnViYmxlU3R5bGVcIiAgW3BvbGxRdWVzdGlvbl09XCJnZXRQb2xsQnViYmxlRGF0YShtZXNzYWdlLCdxdWVzdGlvbicpXCIgW3BvbGxJZF09XCJnZXRQb2xsQnViYmxlRGF0YShtZXNzYWdlLCdpZCcpXCJcbiAgIFtsb2dnZWRJblVzZXJdPVwibG9nZ2VkSW5Vc2VyXCIgW3NlbmRlclVpZF09XCJnZXRQb2xsQnViYmxlRGF0YShtZXNzYWdlKVwiIFttZXRhZGF0YV09XCJtZXNzYWdlPy5tZXRhZGF0YVwiPjwvcG9sbHMtYnViYmxlPlxuXG48L25nLXRlbXBsYXRlPlxuXG48IS0tIHRocmVhZCBidWJibGUgdmlldyAtLT5cbjxuZy10ZW1wbGF0ZSAjdGhyZWFkTWVzc2FnZUJ1YmJsZSBsZXQtbWVzc2FnZT5cbiAgPGRpdiAqbmdJZj1cImdldEJ1YmJsZVdyYXBwZXIobWVzc2FnZSlcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0QnViYmxlV3JhcHBlcihtZXNzYWdlKVwiPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbiAgPGNvbWV0Y2hhdC1tZXNzYWdlLWJ1YmJsZSAgKm5nSWY9XCIhZ2V0QnViYmxlV3JhcHBlcihtZXNzYWdlKVwiIFtib3R0b21WaWV3XT1cImVuYWJsZVJlYWN0aW9ucyA/IHJlYWN0aW9uVmlldyA6IG51bGxcIiBbbGVhZGluZ1ZpZXddPVwiIHNob3dBdmF0YXIgPyBsZWFkaW5nVmlldyA6IG51bGxcIiBbaGVhZGVyVmlld109XCJidWJibGVIZWFkZXJcIiBbZm9vdGVyVmlld109XCJmb290ZXJWaWV3XCJcbiAgW2NvbnRlbnRWaWV3XT1cImNvbnRlbnRWaWV3XCIgIFtpZF09XCJtZXNzYWdlPy5nZXRJZCgpIHx8IG1lc3NhZ2U/LmdldE11aWQoKVwiICBbbWVzc2FnZUJ1YmJsZVN0eWxlXT1cInNldE1lc3NhZ2VCdWJibGVTdHlsZShtZXNzYWdlKVwiICBbYWxpZ25tZW50XT1cInRocmVhZGVkQWxpZ25tZW50XCI+XG4gICAgPG5nLXRlbXBsYXRlICNjb250ZW50Vmlldz5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJnZXRDb250ZW50VmlldyhtZXNzYWdlKTtjb250ZXh0OnsgJGltcGxpY2l0OiBtZXNzYWdlIH1cIiA+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjcmVhY3Rpb25WaWV3PlxuICAgICAgPHJlYWN0aW9ucy12aWV3IFttZXNzYWdlT2JqZWN0XT1cIm1lc3NhZ2VcIiBbYWxpZ25tZW50XT1cInNldEJ1YmJsZUFsaWdubWVudChtZXNzYWdlKVwiXG4gICAgICBbbG9nZ2VkSW5Vc2VyXT1cImxvZ2dlZEluVXNlclwiIFtyZWFjdGlvbnNTdHlsZV09XCJyZWFjdGlvbnNTdHlsZShtZXNzYWdlKVwiPjwvcmVhY3Rpb25zLXZpZXc+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICA8bmctdGVtcGxhdGUgI2Zvb3RlclZpZXc+XG4gICAgICA8ZGl2ICBjbGFzcz1cImNjLW1lc3NhZ2UtbGlzdF9fYnViYmxlLWZvb3RlclwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2V0Rm9vdGVyVmlldyhtZXNzYWdlKTtlbHNlIGJ1YmJsZUZvb3RlclwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJnZXRGb290ZXJWaWV3KG1lc3NhZ2UpO2NvbnRleHQ6eyAkaW1wbGljaXQ6IG1lc3NhZ2UgfVwiID5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjYnViYmxlRm9vdGVyPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYy1tZXNzYWdlLWxpc3RfX2J1YmJsZS1kYXRlXCIgKm5nSWY9XCJ0aW1lc3RhbXBBbGlnbm1lbnQgPT0gdGltZXN0YW1wRW51bS5ib3R0b20gJiYgbWVzc2FnZT8uZ2V0Q2F0ZWdvcnkoKSAhPSBNZXNzYWdlQ2F0ZWdvcnkuYWN0aW9uICYmIG1lc3NhZ2U/LmdldENhdGVnb3J5KCkgIT0gTWVzc2FnZUNhdGVnb3J5LmNhbGxcIj5cbiAgICAgICAgICAgIDxjb21ldGNoYXQtZGF0ZSBbdGltZXN0YW1wXT1cIm1lc3NhZ2U/LmdldFNlbnRBdCgpXCIgW2RhdGVTdHlsZV09XCJidWJibGVEYXRlU3R5bGVcIiBbcGF0dGVybl09XCJkYXRlUGF0dGVyblwiPlxuICAgICAgICAgICAgPC9jb21ldGNoYXQtZGF0ZT5cbiAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiAhbWVzc2FnZT8uZ2V0RGVsZXRlZEF0KCkgJiYgICFkaXNhYmxlUmVjZWlwdCAmJiAoIW1lc3NhZ2U/LmdldFNlbmRlcigpIHx8dGhpcy5sb2dnZWRJblVzZXIuZ2V0VWlkKCkgPT0gbWVzc2FnZT8uZ2V0U2VuZGVyKCk/LmdldFVpZCgpKSAmJiBtZXNzYWdlPy5nZXRDYXRlZ29yeSgpICE9IE1lc3NhZ2VDYXRlZ29yeS5hY3Rpb24gJiYgbWVzc2FnZT8uZ2V0Q2F0ZWdvcnkoKSAhPSBNZXNzYWdlQ2F0ZWdvcnkuY2FsbFwiIGNsYXNzPVwiY2MtbWVzc2FnZS1saXN0X19yZWNlaXB0XCI+XG4gICAgICAgICAgICAgICAgPGNvbWV0Y2hhdC1yZWNlaXB0IFtyZWNlaXB0XT1cImdldE1lc3NhZ2VSZWNlaXB0KG1lc3NhZ2UpXCIgW3JlY2VpcHRTdHlsZV09XCJyZWNlaXB0U3R5bGVcIiBbd2FpdEljb25dPVwid2FpdEljb25cIiBbc2VudEljb25dPVwic2VudEljb25cIiBbZGVsaXZlcmVkSWNvbl09XCJcIiBbcmVhZEljb25dPVwiZGVsaXZlcmVkSWNvblwiIFtlcnJvckljb25dPVwiZXJyb3JJY29uXCI+PC9jb21ldGNoYXQtcmVjZWlwdD5cbiAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgICA8L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNsZWFkaW5nVmlldz5cbjxkaXYgICpuZ0lmPVwiIG1lc3NhZ2U/LmdldENhdGVnb3J5KCkgIT0gTWVzc2FnZUNhdGVnb3J5LmFjdGlvbiAmJiBzaG93SGVhZGVyVGl0bGUobWVzc2FnZSlcIiA+XG48Y29tZXRjaGF0LWF2YXRhciBbbmFtZV09XCJtZXNzYWdlPy5nZXRTZW5kZXIoKT8uZ2V0TmFtZSgpXCIgW3N0eWxlXT1cImF2YXRhclN0eWxlXCIgW2ltYWdlXT1cIm1lc3NhZ2U/LmdldFNlbmRlcigpPy5nZXRBdmF0YXIoKVwiPlxuPC9jb21ldGNoYXQtYXZhdGFyPlxuPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNidWJibGVIZWFkZXI+XG48ZGl2ICpuZ0lmPVwiZ2V0SGVhZGVyVmlldyhtZXNzYWdlKTtlbHNlIGRlZmF1bHRIZWFkZXJcIj5cbjxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJnZXRIZWFkZXJWaWV3KG1lc3NhZ2UpO2NvbnRleHQ6eyAkaW1wbGljaXQ6IG1lc3NhZ2UgfVwiID5cbjwvbmctY29udGFpbmVyPlxuPC9kaXY+XG48bmctdGVtcGxhdGUgI2RlZmF1bHRIZWFkZXI+XG48ZGl2ICBjbGFzcz1cImNjLW1lc3NhZ2UtbGlzdF9fYnViYmxlLWhlYWRlclwiICpuZ0lmPVwibWVzc2FnZT8uZ2V0Q2F0ZWdvcnkoKSAhPSBNZXNzYWdlQ2F0ZWdvcnkuYWN0aW9uICYmIHNob3dIZWFkZXJUaXRsZShtZXNzYWdlKSAmJiBtZXNzYWdlPy5nZXRDYXRlZ29yeSgpICE9IE1lc3NhZ2VDYXRlZ29yeS5jYWxsXCI+XG48Y29tZXRjaGF0LWxhYmVsIFt0ZXh0XT1cIm1lc3NhZ2U/LmdldFNlbmRlcigpPy5nZXROYW1lKClcIiBbbGFiZWxTdHlsZV09XCJsYWJlbFN0eWxlXCI+PC9jb21ldGNoYXQtbGFiZWw+XG48Y29tZXRjaGF0LWRhdGUgW3BhdHRlcm5dPVwiZGF0ZVBhdHRlcm5cIiBbdGltZXN0YW1wXT1cIm1lc3NhZ2U/LmdldFNlbnRBdCgpXCIgW3N0eWxlXT1cImJ1YmJsZURhdGVTdHlsZVwiICpuZ0lmPVwidGltZXN0YW1wQWxpZ25tZW50ID09IHRpbWVzdGFtcEVudW0udG9wXCI+PC9jb21ldGNoYXQtZGF0ZT5cbjwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbjwvbmctdGVtcGxhdGU+XG4gIDwvY29tZXRjaGF0LW1lc3NhZ2UtYnViYmxlPlxuXG48L25nLXRlbXBsYXRlPlxuXG5cbjwhLS0gIC0tPlxuPG5nLXRlbXBsYXRlICNidWJibGVWaWV3PjwvbmctdGVtcGxhdGU+XG48Y29tZXRjaGF0LXBvcG92ZXIgW3BvcG92ZXJTdHlsZV09XCJwb3BvdmVyU3R5bGVcIiAgI3BvcG92ZXJSZWYgW3BsYWNlbWVudF09XCJrZXlib2FyZEFsaWdubWVudFwiPlxuPGNvbWV0Y2hhdC1lbW9qaS1rZXlib2FyZCAoY2MtZW1vamktY2xpY2tlZCk9XCJhZGRSZWFjdGlvbigkZXZlbnQpXCIgIHNsb3Q9XCJjb250ZW50XCI+PC9jb21ldGNoYXQtZW1vamkta2V5Ym9hcmQ+XG48L2NvbWV0Y2hhdC1wb3BvdmVyPlxuPGNvbWV0Y2hhdC1iYWNrZHJvcCAqbmdJZj1cIm9wZW5Db25maXJtRGlhbG9nXCIgW2JhY2tkcm9wU3R5bGVdPVwiYmFja2Ryb3BTdHlsZVwiPlxuICA8Y29tZXRjaGF0LWNvbmZpcm0tZGlhbG9nIFt0aXRsZV09XCInJ1wiIFttZXNzYWdlVGV4dF09XCJ3YXJuaW5nVGV4dFwiIChjYy1jb25maXJtLWNsaWNrZWQpPVwib25Db25maXJtQ2xpY2soKVwiIFtjYW5jZWxCdXR0b25UZXh0XT1cImNhbmNlbFRleHRcIiBbY29uZmlybUJ1dHRvblRleHRdPVwiY29uZmlybVRleHRcIiAoY2MtY2FuY2VsLWNsaWNrZWQpPVwib25DYW5jZWxDbGljaygpXCIgW2NvbmZpcm1EaWFsb2dTdHlsZV09XCJjb25maXJtRGlhbG9nU3R5bGVcIj5cblxuICA8L2NvbWV0Y2hhdC1jb25maXJtLWRpYWxvZz5cbjwvY29tZXRjaGF0LWJhY2tkcm9wPlxuPGZ1bGwtc2NyZWVuLXZpZXdlciAoY2MtY2xvc2UtY2xpY2tlZCk9XCJjbG9zZUltYWdlSW5GdWxsU2NyZWVuKClcIiAqbmdJZj1cIm9wZW5GdWxsc2NyZWVuVmlld1wiIFtVUkxdPVwiaW1hZ2V1cmxUb09wZW5cIiBbY2xvc2VJY29uVVJMXT1cImNsb3NlSWNvblVSTFwiIFtmdWxsU2NyZWVuVmlld2VyU3R5bGVdPVwiZnVsbFNjcmVlblZpZXdlclN0eWxlXCI+XG5cbjwvZnVsbC1zY3JlZW4tdmlld2VyPlxuXG48IS0tIG9uZ29pbmcgY2FsbHNjcmVlbiBmb3IgZGlyZWN0IGNhbGwgLS0+XG48Y29tZXRjaGF0LW9uZ29pbmctY2FsbCAqbmdJZj1cInNob3dPbmdvaW5nQ2FsbFwiIFtvbmdvaW5nQ2FsbFN0eWxlXT1cIm9uZ29pbmdDYWxsU3R5bGVcIiBbc2Vzc2lvbklEXT1cInNlc3Npb25JZFwiPjwvY29tZXRjaGF0LW9uZ29pbmctY2FsbD5cbiJdfQ==