stream-chat-angular 6.0.0-beta.5 → 6.0.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/README.md +2 -2
  2. package/assets/i18n/en.d.ts +0 -1
  3. package/assets/version.d.ts +1 -1
  4. package/{esm2022 → esm2020}/assets/i18n/en.mjs +1 -2
  5. package/{esm2022 → esm2020}/assets/version.mjs +2 -2
  6. package/esm2020/lib/attachment-configuration.service.mjs +182 -0
  7. package/esm2020/lib/attachment-list/attachment-list.component.mjs +232 -0
  8. package/esm2020/lib/attachment-preview-list/attachment-preview-list.component.mjs +55 -0
  9. package/esm2020/lib/attachment.service.mjs +481 -0
  10. package/esm2020/lib/avatar/avatar.component.mjs +160 -0
  11. package/esm2020/lib/avatar-placeholder/avatar-placeholder.component.mjs +66 -0
  12. package/esm2020/lib/channel/channel.component.mjs +45 -0
  13. package/esm2020/lib/channel-header/channel-header.component.mjs +72 -0
  14. package/esm2020/lib/channel-list/channel-list.component.mjs +47 -0
  15. package/esm2020/lib/channel-preview/channel-preview.component.mjs +155 -0
  16. package/esm2020/lib/channel-query.mjs +77 -0
  17. package/esm2020/lib/channel.service.mjs +1561 -0
  18. package/esm2020/lib/chat-client.service.mjs +233 -0
  19. package/esm2020/lib/custom-templates.service.mjs +244 -0
  20. package/{esm2022 → esm2020}/lib/date-parser.service.mjs +5 -5
  21. package/esm2020/lib/file-utils.mjs +35 -0
  22. package/{esm2022 → esm2020}/lib/get-channel-display-text.mjs +1 -1
  23. package/esm2020/lib/get-message-translation.mjs +12 -0
  24. package/esm2020/lib/icon/icon-placeholder/icon-placeholder.component.mjs +28 -0
  25. package/{esm2022 → esm2020}/lib/icon/icon.component.mjs +5 -5
  26. package/{esm2022 → esm2020}/lib/icon/icon.module.mjs +11 -11
  27. package/{esm2022 → esm2020}/lib/icon/loading-indicator/loading-indicator.component.mjs +5 -5
  28. package/esm2020/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +20 -0
  29. package/{esm2022 → esm2020}/lib/list-users.mjs +1 -1
  30. package/esm2020/lib/message/message.component.mjs +486 -0
  31. package/esm2020/lib/message-actions-box/message-actions-box.component.mjs +123 -0
  32. package/esm2020/lib/message-actions.service.mjs +187 -0
  33. package/esm2020/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +71 -0
  34. package/esm2020/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +333 -0
  35. package/{esm2022 → esm2020}/lib/message-input/emoji-input.service.mjs +7 -7
  36. package/esm2020/lib/message-input/message-input-config.service.mjs +50 -0
  37. package/esm2020/lib/message-input/message-input.component.mjs +507 -0
  38. package/{esm2022 → esm2020}/lib/message-input/textarea/textarea.component.mjs +6 -6
  39. package/{esm2022 → esm2020}/lib/message-input/textarea.directive.mjs +5 -5
  40. package/{esm2022 → esm2020}/lib/message-input/voice-recorder.service.mjs +5 -5
  41. package/{esm2022 → esm2020}/lib/message-list/group-styles.mjs +1 -1
  42. package/esm2020/lib/message-list/message-list.component.mjs +717 -0
  43. package/esm2020/lib/message-preview.mjs +21 -0
  44. package/esm2020/lib/message-reactions/message-reactions.component.mjs +168 -0
  45. package/esm2020/lib/message-reactions-selector/message-reactions-selector.component.mjs +61 -0
  46. package/{esm2022 → esm2020}/lib/message-reactions.service.mjs +6 -6
  47. package/esm2020/lib/message-text/message-text.component.mjs +143 -0
  48. package/esm2020/lib/message.service.mjs +43 -0
  49. package/{esm2022 → esm2020}/lib/modal/modal.component.mjs +6 -6
  50. package/esm2020/lib/notification/notification.component.mjs +20 -0
  51. package/esm2020/lib/notification-list/notification-list.component.mjs +36 -0
  52. package/{esm2022 → esm2020}/lib/notification.service.mjs +6 -6
  53. package/esm2020/lib/paginated-list/paginated-list.component.mjs +94 -0
  54. package/{esm2022 → esm2020}/lib/parse-date.mjs +1 -1
  55. package/esm2020/lib/read-by.mjs +12 -0
  56. package/esm2020/lib/stream-autocomplete-textarea.module.mjs +33 -0
  57. package/{esm2022 → esm2020}/lib/stream-avatar.module.mjs +5 -5
  58. package/{esm2022 → esm2020}/lib/stream-chat.module.mjs +59 -59
  59. package/{esm2022 → esm2020}/lib/stream-i18n.service.mjs +6 -6
  60. package/esm2020/lib/stream-textarea.module.mjs +31 -0
  61. package/{esm2022 → esm2020}/lib/theme.service.mjs +6 -6
  62. package/esm2020/lib/thread/thread.component.mjs +51 -0
  63. package/{esm2022 → esm2020}/lib/transliteration.service.mjs +5 -5
  64. package/esm2020/lib/types-custom.mjs +2 -0
  65. package/esm2020/lib/types.mjs +2 -0
  66. package/esm2020/lib/user-list/user-list.component.mjs +47 -0
  67. package/esm2020/lib/virtualized-list.service.mjs +271 -0
  68. package/{esm2022 → esm2020}/lib/virtualized-message-list.service.mjs +1 -1
  69. package/{esm2022 → esm2020}/lib/voice-recorder/amplitude-recorder.service.mjs +5 -5
  70. package/{esm2022 → esm2020}/lib/voice-recorder/audio-recorder.service.mjs +5 -5
  71. package/{esm2022 → esm2020}/lib/voice-recorder/media-recorder.mjs +1 -1
  72. package/esm2020/lib/voice-recorder/mp3-transcoder.mjs +61 -0
  73. package/esm2020/lib/voice-recorder/transcoder.service.mjs +121 -0
  74. package/esm2020/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.mjs +35 -0
  75. package/esm2020/lib/voice-recorder/voice-recorder.component.mjs +80 -0
  76. package/{esm2022 → esm2020}/lib/voice-recorder/voice-recorder.module.mjs +9 -9
  77. package/esm2020/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +112 -0
  78. package/esm2020/lib/voice-recording/voice-recording.component.mjs +91 -0
  79. package/{esm2022 → esm2020}/lib/voice-recording/voice-recording.module.mjs +5 -5
  80. package/{esm2022 → esm2020}/lib/wave-form-sampler.mjs +1 -1
  81. package/esm2020/public-api.mjs +86 -0
  82. package/esm2020/stream-chat.mjs +2 -0
  83. package/fesm2015/stream-chat-angular.mjs +9171 -0
  84. package/fesm2015/stream-chat-angular.mjs.map +1 -0
  85. package/{fesm2022 → fesm2020}/stream-chat-angular.mjs +1251 -961
  86. package/fesm2020/stream-chat-angular.mjs.map +1 -0
  87. package/lib/attachment-configuration.service.d.ts +12 -12
  88. package/lib/attachment-list/attachment-list.component.d.ts +15 -10
  89. package/lib/attachment-preview-list/attachment-preview-list.component.d.ts +1 -1
  90. package/lib/attachment.service.d.ts +12 -10
  91. package/lib/avatar/avatar.component.d.ts +7 -7
  92. package/lib/avatar-placeholder/avatar-placeholder.component.d.ts +5 -5
  93. package/lib/channel/channel.component.d.ts +1 -1
  94. package/lib/channel-header/channel-header.component.d.ts +2 -2
  95. package/lib/channel-list/channel-list.component.d.ts +3 -4
  96. package/lib/channel-preview/channel-preview.component.d.ts +6 -6
  97. package/lib/channel-query.d.ts +26 -0
  98. package/lib/channel.service.d.ts +146 -154
  99. package/lib/chat-client.service.d.ts +17 -15
  100. package/lib/custom-templates.service.d.ts +50 -50
  101. package/lib/get-channel-display-text.d.ts +1 -2
  102. package/lib/get-message-translation.d.ts +3 -3
  103. package/lib/icon/icon-placeholder/icon-placeholder.component.d.ts +2 -2
  104. package/lib/icon/icon.component.d.ts +2 -2
  105. package/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.d.ts +1 -1
  106. package/lib/message/message.component.d.ts +6 -6
  107. package/lib/message-actions-box/message-actions-box.component.d.ts +5 -4
  108. package/lib/message-actions.service.d.ts +10 -10
  109. package/lib/message-bounce-prompt/message-bounce-prompt.component.d.ts +1 -1
  110. package/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.d.ts +5 -5
  111. package/lib/message-input/emoji-input.service.d.ts +2 -2
  112. package/lib/message-input/message-input-config.service.d.ts +3 -3
  113. package/lib/message-input/message-input.component.d.ts +10 -33
  114. package/lib/message-input/textarea/textarea.component.d.ts +3 -3
  115. package/lib/message-input/textarea.directive.d.ts +1 -1
  116. package/lib/message-list/group-styles.d.ts +1 -1
  117. package/lib/message-list/message-list.component.d.ts +3 -2
  118. package/lib/message-preview.d.ts +2 -3
  119. package/lib/message-reactions/message-reactions.component.d.ts +9 -8
  120. package/lib/message-reactions-selector/message-reactions-selector.component.d.ts +6 -5
  121. package/lib/message-reactions.service.d.ts +4 -4
  122. package/lib/message-text/message-text.component.d.ts +5 -5
  123. package/lib/message.service.d.ts +6 -7
  124. package/lib/modal/modal.component.d.ts +1 -1
  125. package/lib/notification/notification.component.d.ts +2 -2
  126. package/lib/notification-list/notification-list.component.d.ts +1 -0
  127. package/lib/notification.service.d.ts +1 -1
  128. package/lib/paginated-list/paginated-list.component.d.ts +2 -5
  129. package/lib/read-by.d.ts +1 -2
  130. package/lib/stream-i18n.service.d.ts +1 -1
  131. package/lib/theme.service.d.ts +1 -1
  132. package/lib/thread/thread.component.d.ts +3 -3
  133. package/lib/types-custom.d.ts +15 -0
  134. package/lib/types.d.ts +116 -155
  135. package/lib/user-list/user-list.component.d.ts +2 -3
  136. package/lib/virtualized-message-list.service.d.ts +1 -1
  137. package/lib/voice-recorder/amplitude-recorder.service.d.ts +2 -2
  138. package/lib/voice-recorder/media-recorder.d.ts +2 -2
  139. package/lib/voice-recorder/transcoder.service.d.ts +4 -4
  140. package/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.d.ts +1 -0
  141. package/lib/voice-recorder/voice-recorder.component.d.ts +2 -2
  142. package/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.d.ts +3 -3
  143. package/lib/voice-recording/voice-recording.component.d.ts +2 -3
  144. package/package.json +21 -15
  145. package/public-api.d.ts +3 -0
  146. package/src/assets/i18n/en.ts +0 -1
  147. package/src/assets/version.ts +1 -1
  148. package/esm2022/lib/attachment-configuration.service.mjs +0 -185
  149. package/esm2022/lib/attachment-list/attachment-list.component.mjs +0 -212
  150. package/esm2022/lib/attachment-preview-list/attachment-preview-list.component.mjs +0 -55
  151. package/esm2022/lib/attachment.service.mjs +0 -479
  152. package/esm2022/lib/avatar/avatar.component.mjs +0 -157
  153. package/esm2022/lib/avatar-placeholder/avatar-placeholder.component.mjs +0 -66
  154. package/esm2022/lib/channel/channel.component.mjs +0 -45
  155. package/esm2022/lib/channel-header/channel-header.component.mjs +0 -72
  156. package/esm2022/lib/channel-list/channel-list.component.mjs +0 -50
  157. package/esm2022/lib/channel-preview/channel-preview.component.mjs +0 -150
  158. package/esm2022/lib/channel.service.mjs +0 -1393
  159. package/esm2022/lib/chat-client.service.mjs +0 -227
  160. package/esm2022/lib/custom-templates.service.mjs +0 -244
  161. package/esm2022/lib/file-utils.mjs +0 -35
  162. package/esm2022/lib/get-message-translation.mjs +0 -12
  163. package/esm2022/lib/icon/icon-placeholder/icon-placeholder.component.mjs +0 -28
  164. package/esm2022/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +0 -20
  165. package/esm2022/lib/message/message.component.mjs +0 -486
  166. package/esm2022/lib/message-actions-box/message-actions-box.component.mjs +0 -120
  167. package/esm2022/lib/message-actions.service.mjs +0 -187
  168. package/esm2022/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +0 -71
  169. package/esm2022/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +0 -333
  170. package/esm2022/lib/message-input/message-input-config.service.mjs +0 -50
  171. package/esm2022/lib/message-input/message-input.component.mjs +0 -507
  172. package/esm2022/lib/message-list/message-list.component.mjs +0 -715
  173. package/esm2022/lib/message-preview.mjs +0 -21
  174. package/esm2022/lib/message-reactions/message-reactions.component.mjs +0 -165
  175. package/esm2022/lib/message-reactions-selector/message-reactions-selector.component.mjs +0 -57
  176. package/esm2022/lib/message-text/message-text.component.mjs +0 -143
  177. package/esm2022/lib/message.service.mjs +0 -43
  178. package/esm2022/lib/notification/notification.component.mjs +0 -20
  179. package/esm2022/lib/notification-list/notification-list.component.mjs +0 -33
  180. package/esm2022/lib/paginated-list/paginated-list.component.mjs +0 -94
  181. package/esm2022/lib/read-by.mjs +0 -12
  182. package/esm2022/lib/stream-autocomplete-textarea.module.mjs +0 -33
  183. package/esm2022/lib/stream-textarea.module.mjs +0 -31
  184. package/esm2022/lib/thread/thread.component.mjs +0 -51
  185. package/esm2022/lib/types.mjs +0 -2
  186. package/esm2022/lib/user-list/user-list.component.mjs +0 -47
  187. package/esm2022/lib/virtualized-list.service.mjs +0 -273
  188. package/esm2022/lib/voice-recorder/mp3-transcoder.mjs +0 -61
  189. package/esm2022/lib/voice-recorder/transcoder.service.mjs +0 -121
  190. package/esm2022/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.mjs +0 -32
  191. package/esm2022/lib/voice-recorder/voice-recorder.component.mjs +0 -80
  192. package/esm2022/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +0 -112
  193. package/esm2022/lib/voice-recording/voice-recording.component.mjs +0 -91
  194. package/esm2022/public-api.mjs +0 -82
  195. package/fesm2022/stream-chat-angular.mjs.map +0 -1
  196. /package/{esm2022 → esm2020}/lib/format-duration.mjs +0 -0
  197. /package/{esm2022 → esm2020}/lib/injection-tokens.mjs +0 -0
  198. /package/{esm2022 → esm2020}/lib/is-image-attachment.mjs +0 -0
  199. /package/{esm2022 → esm2020}/lib/is-on-separate-date.mjs +0 -0
  200. /package/{esm2022 → esm2020}/lib/is-safari.mjs +0 -0
  201. /package/{esm2022 → esm2020}/lib/message-input/textarea.interface.mjs +0 -0
  202. /package/{esm2022 → esm2020}/stream-chat-angular.mjs +0 -0
@@ -1,273 +0,0 @@
1
- import { BehaviorSubject, Subject, combineLatest, distinctUntilChanged, filter, merge, of, pairwise, switchMap, take, } from 'rxjs';
2
- /**
3
- * The `VirtualizedListService` removes items from a list that are not currently displayed. This is a high-level overview of how it works:
4
- * - Create a new instance for each list that needs virtualization
5
- * - Input: Provide a reactive stream that emits all items in the list
6
- * - Input: Provide a reactive stream that emit the current scroll position (top, middle or bottom)
7
- * - Input: maximum number of items that are allowed in the list (in practice the service can make the virtualized list half this number, you should take this into account when choosing the value)
8
- * - Output: The service will emit the current list of displayed items via the virtualized items reactive stream
9
- * - For simplicity, the service won't track the height of the items, nor it needs an exact scroll location -> this is how removing items work:
10
- * - If scroll location is bottom/top items around the current bottom/top item will be emitted in the virtualized items stream
11
- * - If scroll location is middle, the service won't remove items, if new items are received, those will be appended to the virtualized list (this means that in theory the list can grow very big if a lot of new items are received while the user is scrolled somewhere, this is a trade-off for the simplicity of no height tracking)
12
- * - Since there is no height tracking, you should make sure to provide a maximum number that is big enough to fill the biggest expected screen size twice
13
- * - If the user scrolls to the bottom/top and there are no more local items to show, the service will trigger a query to load more items
14
- * - Input: you should provide the page size to use, in order for the service to determine if loading is necessary
15
- *
16
- * The `VirtualizedMessageListService` provides an implementation for the message list component.
17
- */
18
- export class VirtualizedListService {
19
- constructor(allItems$, scrollPosition$, jumpToItem$, pageSize = 25, maxItemCount = pageSize * 4) {
20
- this.allItems$ = allItems$;
21
- this.scrollPosition$ = scrollPosition$;
22
- this.jumpToItem$ = jumpToItem$;
23
- this.pageSize = pageSize;
24
- this.maxItemCount = maxItemCount;
25
- this.queryStateSubject = new BehaviorSubject({
26
- state: 'success',
27
- });
28
- this.bufferOnTop = 0;
29
- this.bufferOnBottom = 0;
30
- this.loadFromBuffer$ = new Subject();
31
- this.virtualizedItemsSubject = new BehaviorSubject([]);
32
- this.subscriptions = [];
33
- this.virtualizedItems$ = this.virtualizedItemsSubject.asObservable();
34
- this.queryState$ = this.queryStateSubject.asObservable();
35
- this.subscriptions.push(this.virtualizedItems$.subscribe((virtaluzedItems) => {
36
- this.allItems$.pipe(take(1)).subscribe((allItems) => {
37
- if (virtaluzedItems.length === allItems.length) {
38
- this.bufferOnTop = 0;
39
- this.bufferOnBottom = 0;
40
- }
41
- else if (virtaluzedItems.length === 0) {
42
- this.bufferOnTop = allItems.length;
43
- this.bufferOnBottom = 0;
44
- }
45
- else {
46
- this.bufferOnTop = allItems.indexOf(virtaluzedItems[0]);
47
- this.bufferOnBottom =
48
- allItems.length -
49
- allItems.indexOf(virtaluzedItems[virtaluzedItems.length - 1]) -
50
- 1;
51
- }
52
- });
53
- }));
54
- this.subscriptions.push(merge(this.allItems$, this.loadFromBuffer$)
55
- .pipe(switchMap(() => {
56
- return combineLatest([
57
- this.allItems$.pipe(take(1)),
58
- this.scrollPosition$.pipe(take(1)),
59
- ]);
60
- }))
61
- .subscribe(([items, scrollPosition]) => {
62
- if (scrollPosition === 'middle') {
63
- return;
64
- }
65
- const currentItems = this.virtualizedItemsSubject.getValue();
66
- if (items.length <= this.maxItemCount) {
67
- this.virtualizedItemsSubject.next(items);
68
- }
69
- else {
70
- let startIndex = 0;
71
- let endIndex = undefined;
72
- const numberOfItemsToRemove = items.length - Math.round(this.maxItemCount / 2);
73
- const numberOfItemsAfterRemove = items.length - numberOfItemsToRemove;
74
- switch (scrollPosition) {
75
- case 'top':
76
- if (currentItems.length > 0) {
77
- const middleIndex = items.findIndex((i) => this.isEqual(i, currentItems[0]));
78
- if (middleIndex !== -1) {
79
- startIndex = Math.max(0, middleIndex - Math.ceil(numberOfItemsAfterRemove / 2));
80
- endIndex = startIndex + numberOfItemsAfterRemove;
81
- }
82
- }
83
- else {
84
- endIndex = numberOfItemsAfterRemove;
85
- }
86
- break;
87
- case 'bottom':
88
- if (currentItems.length > 0) {
89
- const middleIndex = items.findIndex((i) => this.isEqual(i, currentItems[currentItems.length - 1]));
90
- if (middleIndex !== -1) {
91
- endIndex = Math.min(items.length, middleIndex +
92
- Math.floor(numberOfItemsAfterRemove / 2) +
93
- 1);
94
- startIndex = endIndex - numberOfItemsAfterRemove;
95
- }
96
- }
97
- else {
98
- startIndex = items.length - numberOfItemsAfterRemove;
99
- }
100
- break;
101
- }
102
- const virtualizedItems = items.slice(startIndex, endIndex);
103
- this.virtualizedItemsSubject.next(virtualizedItems);
104
- }
105
- }));
106
- this.subscriptions.push(this.scrollPosition$
107
- .pipe(distinctUntilChanged())
108
- .subscribe((position) => {
109
- if (this.queryStateSubject.getValue().state === `loading-${position}`) {
110
- return;
111
- }
112
- if (position === 'top') {
113
- if (this.bufferOnTop < this.pageSize) {
114
- void this.loadMore(position);
115
- }
116
- else {
117
- this.loadMoreFromBuffer('top');
118
- }
119
- }
120
- else if (position === 'bottom') {
121
- if (this.bufferOnBottom < this.pageSize) {
122
- void this.loadMore(position);
123
- }
124
- else {
125
- this.loadMoreFromBuffer('bottom');
126
- }
127
- }
128
- }));
129
- this.subscriptions.push(this.allItems$
130
- .pipe(pairwise(), filter(() => {
131
- let scrollPosition;
132
- this.scrollPosition$
133
- .pipe(take(1))
134
- .subscribe((s) => (scrollPosition = s));
135
- return scrollPosition === 'middle';
136
- }))
137
- .subscribe(([prevItems, currentItems]) => {
138
- if (currentItems.length < this.maxItemCount ||
139
- this.virtualizedItems.length === 0) {
140
- this.virtualizedItemsSubject.next(currentItems);
141
- }
142
- else {
143
- const currentFirstItem = this.virtualizedItems[0];
144
- const currentLastItem = this.virtualizedItems[this.virtualizedItems.length - 1];
145
- const prevStartIndex = prevItems.findIndex((i) => this.isEqual(i, currentFirstItem));
146
- const prevEndIndex = prevItems.findIndex((i) => this.isEqual(i, currentLastItem));
147
- const isStartRemainedSame = currentItems[prevStartIndex]
148
- ? this.isEqual(currentItems[prevStartIndex], currentFirstItem)
149
- : false;
150
- const isEndRemainedSame = currentItems[prevEndIndex]
151
- ? this.isEqual(currentItems[prevEndIndex], currentLastItem)
152
- : false;
153
- const hasNewItemsBottom = prevEndIndex === prevItems.length - 1 && isEndRemainedSame
154
- ? prevItems.length !== currentItems.length
155
- : false;
156
- if (isStartRemainedSame && isEndRemainedSame) {
157
- const endIndex = hasNewItemsBottom ? undefined : prevEndIndex + 1;
158
- this.virtualizedItemsSubject.next(currentItems.slice(prevStartIndex, endIndex));
159
- }
160
- let currentStartIndex = isStartRemainedSame ? prevStartIndex : -1;
161
- let currentEndIndex = isEndRemainedSame ? prevEndIndex : -1;
162
- if (!isStartRemainedSame) {
163
- currentStartIndex = currentItems.findIndex((i) => this.isEqual(i, currentFirstItem));
164
- }
165
- if (!isEndRemainedSame) {
166
- currentEndIndex = currentItems.findIndex((i) => this.isEqual(i, currentLastItem));
167
- }
168
- const hasNewItemsTop = prevStartIndex === 0 && !isStartRemainedSame
169
- ? currentStartIndex !== 0
170
- : false;
171
- if (currentStartIndex !== -1 && currentEndIndex !== -1) {
172
- const startIndex = hasNewItemsTop ? 0 : currentStartIndex;
173
- this.virtualizedItemsSubject.next(currentItems.slice(startIndex, currentEndIndex + 1));
174
- }
175
- else {
176
- if (currentStartIndex === -1 && currentEndIndex !== -1) {
177
- currentStartIndex = Math.max(0, currentEndIndex - (prevEndIndex - prevStartIndex));
178
- }
179
- if (currentEndIndex === -1 && currentStartIndex !== -1) {
180
- currentEndIndex = Math.min(currentItems.length - 1, currentStartIndex + (prevEndIndex - prevStartIndex));
181
- }
182
- this.virtualizedItemsSubject.next(currentItems.slice(currentStartIndex, currentEndIndex + 1));
183
- }
184
- }
185
- }));
186
- if (this.jumpToItem$) {
187
- this.subscriptions.push(this.jumpToItem$
188
- .pipe(switchMap((jumpToItem) => combineLatest([this.allItems$.pipe(take(1)), of(jumpToItem)])))
189
- .subscribe(([allItems, jumpToItem]) => {
190
- if (jumpToItem.item) {
191
- if (allItems.length < this.maxItemCount) {
192
- this.virtualizedItemsSubject.next(allItems);
193
- }
194
- else {
195
- const itemIndex = allItems.findIndex((i) =>
196
- // @ts-expect-error TODO: do we know a better typing here?
197
- this.isEqual(i, jumpToItem.item));
198
- if (itemIndex === -1) {
199
- return;
200
- }
201
- else {
202
- const position = jumpToItem.position || 'middle';
203
- const numberOfItemsToRemove = allItems.length - Math.round(this.maxItemCount / 2);
204
- const numberOfItemsAfterRemove = allItems.length - numberOfItemsToRemove;
205
- let startIndex = -1;
206
- let endIndex = -1;
207
- switch (position) {
208
- case 'top':
209
- startIndex = itemIndex;
210
- endIndex = Math.min(allItems.length, startIndex + numberOfItemsAfterRemove);
211
- break;
212
- case 'bottom':
213
- endIndex = itemIndex + 1;
214
- startIndex = Math.max(0, endIndex - numberOfItemsAfterRemove);
215
- break;
216
- case 'middle': {
217
- const itemsOnTop = itemIndex;
218
- const itemsOnBottom = allItems.length - itemIndex;
219
- if (itemsOnTop < Math.ceil(numberOfItemsAfterRemove / 2)) {
220
- startIndex = 0;
221
- }
222
- if (itemsOnBottom <
223
- Math.floor(numberOfItemsAfterRemove / 2) + 1) {
224
- endIndex = allItems.length;
225
- }
226
- if (startIndex === -1) {
227
- if (endIndex !== -1) {
228
- startIndex = endIndex - numberOfItemsAfterRemove;
229
- }
230
- else {
231
- startIndex =
232
- itemIndex - Math.ceil(numberOfItemsAfterRemove / 2);
233
- }
234
- }
235
- if (endIndex === -1) {
236
- endIndex = startIndex + numberOfItemsAfterRemove;
237
- }
238
- }
239
- }
240
- this.virtualizedItemsSubject.next(allItems.slice(startIndex, endIndex));
241
- }
242
- }
243
- }
244
- }));
245
- }
246
- }
247
- /**
248
- * The current value of virtualized items
249
- */
250
- get virtualizedItems() {
251
- return this.virtualizedItemsSubject.getValue();
252
- }
253
- /**
254
- * Remove all subscriptions, call this once you're done using an instance of this service
255
- */
256
- dispose() {
257
- this.subscriptions.forEach((s) => s.unsubscribe());
258
- }
259
- loadMoreFromBuffer(_) {
260
- this.loadFromBuffer$.next();
261
- }
262
- async loadMore(direction) {
263
- this.queryStateSubject.next({ state: `loading-${direction}` });
264
- try {
265
- await this.query(direction);
266
- this.queryStateSubject.next({ state: 'success' });
267
- }
268
- catch (e) {
269
- this.queryStateSubject.next({ state: 'error', error: e });
270
- }
271
- }
272
- }
273
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbGl6ZWQtbGlzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL3ZpcnR1YWxpemVkLWxpc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZUFBZSxFQUVmLE9BQU8sRUFFUCxhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixLQUFLLEVBQ0wsRUFBRSxFQUNGLFFBQVEsRUFDUixTQUFTLEVBQ1QsSUFBSSxHQUNMLE1BQU0sTUFBTSxDQUFDO0FBUWQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxPQUFnQixzQkFBc0I7SUFrQjFDLFlBQ1UsU0FBMEIsRUFDMUIsZUFBMEQsRUFDbEQsV0FHZCxFQUNjLFdBQVcsRUFBRSxFQUNiLGVBQWUsUUFBUSxHQUFHLENBQUM7UUFQbkMsY0FBUyxHQUFULFNBQVMsQ0FBaUI7UUFDMUIsb0JBQWUsR0FBZixlQUFlLENBQTJDO1FBQ2xELGdCQUFXLEdBQVgsV0FBVyxDQUd6QjtRQUNjLGFBQVEsR0FBUixRQUFRLENBQUs7UUFDYixpQkFBWSxHQUFaLFlBQVksQ0FBZTtRQWpCbkMsc0JBQWlCLEdBQUcsSUFBSSxlQUFlLENBQTRCO1lBQzNFLEtBQUssRUFBRSxTQUFTO1NBQ2pCLENBQUMsQ0FBQztRQUNPLGdCQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLG9CQUFlLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUN4Qyw0QkFBdUIsR0FBRyxJQUFJLGVBQWUsQ0FBTSxFQUFFLENBQUMsQ0FBQztRQUN2RCxrQkFBYSxHQUFtQixFQUFFLENBQUM7UUFZekMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNyRSxJQUFJLENBQUMsV0FBVyxH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QUFDLHVCQUF1QixDQUFDLElBQUksQ0FDL0IsUUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQ3JDLENBQUM7eUJBQ0g7cUJBQ0Y7aUJBQ0Y7WUFDSCxDQUFDLENBQUMsQ0FDTCxDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPO1FBQ0wsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFUyxrQkFBa0IsQ0FBQyxDQUFnQztRQUMzRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFTyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQXdDO1FBQzdELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsV0FBVyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDL0QsSUFBSTtZQUNGLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7U0FDbkQ7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzNEO0lBQ0gsQ0FBQztDQU9GIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBPYnNlcnZhYmxlLFxuICBTdWJqZWN0LFxuICBTdWJzY3JpcHRpb24sXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIG1lcmdlLFxuICBvZixcbiAgcGFpcndpc2UsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBWaXJ0dWFsaXplZExpc3RRdWVyeURpcmVjdGlvbixcbiAgVmlydHVhbGl6ZWRMaXN0UXVlcnlTdGF0ZSxcbiAgVmlydHVhbGl6ZWRMaXN0U2Nyb2xsUG9zaXRpb24sXG4gIFZpcnR1YWxpemVkTGlzdFZlcnRpY2FsSXRlbVBvc2l0aW9uLFxufSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBUaGUgYFZpcnR1YWxpemVkTGlzdFNlcnZpY2VgIHJlbW92ZXMgaXRlbXMgZnJvbSBhIGxpc3QgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBkaXNwbGF5ZWQuIFRoaXMgaXMgYSBoaWdoLWxldmVsIG92ZXJ2aWV3IG9mIGhvdyBpdCB3b3JrczpcbiAqIC0gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIGZvciBlYWNoIGxpc3QgdGhhdCBuZWVkcyB2aXJ0dWFsaXphdGlvblxuICogLSBJbnB1dDogUHJvdmlkZSBhIHJlYWN0aXZlIHN0cmVhbSB0aGF0IGVtaXRzIGFsbCBpdGVtcyBpbiB0aGUgbGlzdFxuICogLSBJbnB1dDogUHJvdmlkZSBhIHJlYWN0aXZlIHN0cmVhbSB0aGF0IGVtaXQgdGhlIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uICh0b3AsIG1pZGRsZSBvciBib3R0b20pXG4gKiAtIElucHV0OiBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0aGF0IGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IChpbiBwcmFjdGljZSB0aGUgc2VydmljZSBjYW4gbWFrZSB0aGUgdmlydHVhbGl6ZWQgbGlzdCBoYWxmIHRoaXMgbnVtYmVyLCB5b3Ugc2hvdWxkIHRha2UgdGhpcyBpbnRvIGFjY291bnQgd2hlbiBjaG9vc2luZyB0aGUgdmFsdWUpXG4gKiAtIE91dHB1dDogVGhlIHNlcnZpY2Ugd2lsbCBlbWl0IHRoZSBjdXJyZW50IGxpc3Qgb2YgZGlzcGxheWVkIGl0ZW1zIHZpYSB0aGUgdmlydHVhbGl6ZWQgaXRlbXMgcmVhY3RpdmUgc3RyZWFtXG4gKiAtIEZvciBzaW1wbGljaXR5LCB0aGUgc2VydmljZSB3b24ndCB0cmFjayB0aGUgaGVpZ2h0IG9mIHRoZSBpdGVtcywgbm9yIGl0IG5lZWRzIGFuIGV4YWN0IHNjcm9sbCBsb2NhdGlvbiAtPiB0aGlzIGlzIGhvdyByZW1vdmluZyBpdGVtcyB3b3JrOlxuICogICAtIElmIHNjcm9sbCBsb2NhdGlvbiBpcyBib3R0b20vdG9wIGl0ZW1zIGFyb3VuZCB0aGUgY3VycmVudCBib3R0b20vdG9wIGl0ZW0gd2lsbCBiZSBlbWl0dGVkIGluIHRoZSB2aXJ0dWFsaXplZCBpdGVtcyBzdHJlYW1cbiAqICAgLSBJZiBzY3JvbGwgbG9jYXRpb24gaXMgbWlkZGxlLCB0aGUgc2VydmljZSB3b24ndCByZW1vdmUgaXRlbXMsIGlmIG5ldyBpdGVtcyBhcmUgcmVjZWl2ZWQsIHRob3NlIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIHZpcnR1YWxpemVkIGxpc3QgICh0aGlzIG1lYW5zIHRoYXQgaW4gdGhlb3J5IHRoZSBsaXN0IGNhbiBncm93IHZlcnkgYmlnIGlmIGEgbG90IG9mIG5ldyBpdGVtcyBhcmUgcmVjZWl2ZWQgd2hpbGUgdGhlIHVzZXIgaXMgc2Nyb2xsZWQgc29tZXdoZXJlLCB0aGlzIGlzIGEgdHJhZGUtb2ZmIGZvciB0aGUgc2ltcGxpY2l0eSBvZiBubyBoZWlnaHQgdHJhY2tpbmcpXG4gKiAgIC0gU2luY2UgdGhlcmUgaXMgbm8gaGVpZ2h0IHRyYWNraW5nLCB5b3Ugc2hvdWxkIG1ha2Ugc3VyZSB0byBwcm92aWRlIGEgbWF4aW11bSBudW1iZXIgdGhhdCBpcyBiaWcgZW5vdWdoIHRvIGZpbGwgdGhlIGJpZ2dlc3QgZXhwZWN0ZWQgc2NyZWVuIHNpemUgdHdpY2VcbiAqIC0gSWYgdGhlIHVzZXIgc2Nyb2xscyB0byB0aGUgYm90dG9tL3RvcCBhbmQgdGhlcmUgYXJlIG5vIG1vcmUgbG9jYWwgaXRlbXMgdG8gc2hvdywgdGhlIHNlcnZpY2Ugd2lsbCB0cmlnZ2VyIGEgcXVlcnkgdG8gbG9hZCBtb3JlIGl0ZW1zXG4gKiAgIC0gSW5wdXQ6IHlvdSBzaG91bGQgcHJvdmlkZSB0aGUgcGFnZSBzaXplIHRvIHVzZSwgaW4gb3JkZXIgZm9yIHRoZSBzZXJ2aWNlIHRvIGRldGVybWluZSBpZiBsb2FkaW5nIGlzIG5lY2Vzc2FyeVxuICpcbiAqIFRoZSBgVmlydHVhbGl6ZWRNZXNzYWdlTGlzdFNlcnZpY2VgIHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIGZvciB0aGUgbWVzc2FnZSBsaXN0IGNvbXBvbmVudC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFZpcnR1YWxpemVkTGlzdFNlcnZpY2U8VD4ge1xuICAvKipcbiAgICogVGhlIGl0ZW1zIHRoYXQgc2hvdWxkIGJlIGN1cnJlbnRseSBkaXNwbGF5ZWQsIGEgc3Vic2V0IG9mIGFsbCBpdGVtc1xuICAgKi9cbiAgdmlydHVhbGl6ZWRJdGVtcyQ6IE9ic2VydmFibGU8VFtdPjtcbiAgLyoqXG4gICAqIFRoZSByZXN1bHQgb2YgdGhlIGxhc3QgcXVlcnkgdXNlZCB0byBsb2FkIG1vcmUgaXRlbXNcbiAgICovXG4gIHF1ZXJ5U3RhdGUkOiBPYnNlcnZhYmxlPFZpcnR1YWxpemVkTGlzdFF1ZXJ5U3RhdGU+O1xuICBwcm90ZWN0ZWQgcXVlcnlTdGF0ZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFZpcnR1YWxpemVkTGlzdFF1ZXJ5U3RhdGU+KHtcbiAgICBzdGF0ZTogJ3N1Y2Nlc3MnLFxuICB9KTtcbiAgcHJvdGVjdGVkIGJ1ZmZlck9uVG9wID0gMDtcbiAgcHJvdGVjdGVkIGJ1ZmZlck9uQm90dG9tID0gMDtcbiAgcHJvdGVjdGVkIGxvYWRGcm9tQnVmZmVyJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgdmlydHVhbGl6ZWRJdGVtc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRbXT4oW10pO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhbGxJdGVtcyQ6IE9ic2VydmFibGU8VFtdPixcbiAgICBwcml2YXRlIHNjcm9sbFBvc2l0aW9uJDogT2JzZXJ2YWJsZTxWaXJ0dWFsaXplZExpc3RTY3JvbGxQb3NpdGlvbj4sXG4gICAgcHVibGljIHJlYWRvbmx5IGp1bXBUb0l0ZW0kPzogT2JzZXJ2YWJsZTx7XG4gICAgICBpdGVtOiBQYXJ0aWFsPFQ+IHwgdW5kZWZpbmVkO1xuICAgICAgcG9zaXRpb24/OiBWaXJ0dWFsaXplZExpc3RWZXJ0aWNhbEl0ZW1Qb3NpdGlvbjtcbiAgICB9PixcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGFnZVNpemUgPSAyNSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWF4SXRlbUNvdW50ID0gcGFnZVNpemUgKiA0LFxuICApIHtcbiAgICB0aGlzLnZpcnR1YWxpemVkSXRlbXMkID0gdGhpcy52aXJ0dWFsaXplZEl0ZW1zU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnF1ZXJ5U3RhdGUkID0gdGhpcy5xdWVyeVN0YXRlU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMudmlydHVhbGl6ZWRJdGVtcyQuc3Vic2NyaWJlKCh2aXJ0YWx1emVkSXRlbXMpID0+IHtcbiAgICAgICAgdGhpcy5hbGxJdGVtcyQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKGFsbEl0ZW1zKSA9PiB7XG4gICAgICAgICAgaWYgKHZpcnRhbHV6ZWRJdGVtcy5sZW5ndGggPT09IGFsbEl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXJPblRvcCA9IDA7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlck9uQm90dG9tID0gMDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHZpcnRhbHV6ZWRJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyT25Ub3AgPSBhbGxJdGVtcy5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlck9uQm90dG9tID0gMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5idWZmZXJPblRvcCA9IGFsbEl0ZW1zLmluZGV4T2YodmlydGFsdXplZEl0ZW1zWzBdKTtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyT25Cb3R0b20gPVxuICAgICAgICAgICAgICBhbGxJdGVtcy5sZW5ndGggLVxuICAgICAgICAgICAgICBhbGxJdGVtcy5pbmRleE9mKHZpcnRhbHV6ZWRJdGVtc1t2aXJ0YWx1emVkSXRlbXMubGVuZ3RoIC0gMV0pIC1cbiAgICAgICAgICAgICAgMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIG1lcmdlKHRoaXMuYWxsSXRlbXMkLCB0aGlzLmxvYWRGcm9tQnVmZmVyJClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgICAgdGhpcy5hbGxJdGVtcyQucGlwZSh0YWtlKDEpKSxcbiAgICAgICAgICAgICAgdGhpcy5zY3JvbGxQb3NpdGlvbiQucGlwZSh0YWtlKDEpKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKFtpdGVtcywgc2Nyb2xsUG9zaXRpb25dKSA9PiB7XG4gICAgICAgICAgaWYgKHNjcm9sbFBvc2l0aW9uID09PSAnbWlkZGxlJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBjdXJyZW50SXRlbXMgPSB0aGlzLnZpcnR1YWxpemVkSXRlbXNTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA8PSB0aGlzLm1heEl0ZW1Db3VudCkge1xuICAgICAgICAgICAgdGhpcy52aXJ0dWFsaXplZEl0ZW1zU3ViamVjdC5uZXh0KGl0ZW1zKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSAwO1xuICAgICAgICAgICAgbGV0IGVuZEluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgbnVtYmVyT2ZJdGVtc1RvUmVtb3ZlID1cbiAgICAgICAgICAgICAgaXRlbXMubGVuZ3RoIC0gTWF0aC5yb3VuZCh0aGlzLm1heEl0ZW1Db3VudCAvIDIpO1xuICAgICAgICAgICAgY29uc3QgbnVtYmVyT2ZJdGVtc0FmdGVyUmVtb3ZlID1cbiAgICAgICAgICAgICAgaXRlbXMubGVuZ3RoIC0gbnVtYmVyT2ZJdGVtc1RvUmVtb3ZlO1xuICAgICAgICAgICAgc3dpdGNoIChzY3JvbGxQb3NpdGlvbikge1xuICAgICAgICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbWlkZGxlSW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGkpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNFcXVhbChpLCBjdXJyZW50SXRlbXNbMF0pLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGlmIChtaWRkbGVJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IE1hdGgubWF4KFxuICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgbWlkZGxlSW5kZXggLSBNYXRoLmNlaWwobnVtYmVyT2ZJdGVtc0FmdGVyUmVtb3ZlIC8gMiksXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGVuZEluZGV4ID0gc3RhcnRJbmRleCArIG51bWJlck9mSXRlbXNBZnRlclJlbW92ZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZW5kSW5kZXggPSBudW1iZXJPZkl0ZW1zQWZ0ZXJSZW1vdmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbWlkZGxlSW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGkpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNFcXVhbChpLCBjdXJyZW50SXRlbXNbY3VycmVudEl0ZW1zLmxlbmd0aCAtIDFdKSxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBpZiAobWlkZGxlSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGVuZEluZGV4ID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgIG1pZGRsZUluZGV4ICtcbiAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IobnVtYmVyT2ZJdGVtc0FmdGVyUmVtb3ZlIC8gMikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IGVuZEluZGV4IC0gbnVtYmVyT2ZJdGVtc0FmdGVyUmVtb3ZlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gaXRlbXMubGVuZ3RoIC0gbnVtYmVyT2ZJdGVtc0FmdGVyUmVtb3ZlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZpcnR1YWxpemVkSXRlbXMgPSBpdGVtcy5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgICAgICB0aGlzLnZpcnR1YWxpemVkSXRlbXNTdWJqZWN0Lm5leHQodmlydHVhbGl6ZWRJdGVtcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5zY3JvbGxQb3NpdGlvbiRcbiAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcbiAgICAgICAgLnN1YnNjcmliZSgocG9zaXRpb24pID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnF1ZXJ5U3RhdGVTdWJqZWN0LmdldFZhbHVlKCkuc3RhdGUgPT09IGBsb2FkaW5nLSR7cG9zaXRpb259YFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocG9zaXRpb24gPT09ICd0b3AnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5idWZmZXJPblRvcCA8IHRoaXMucGFnZVNpemUpIHtcbiAgICAgICAgICAgICAgdm9pZCB0aGlzLmxvYWRNb3JlKHBvc2l0aW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMubG9hZE1vcmVGcm9tQnVmZmVyKCd0b3AnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSAnYm90dG9tJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYnVmZmVyT25Cb3R0b20gPCB0aGlzLnBhZ2VTaXplKSB7XG4gICAgICAgICAgICAgIHZvaWQgdGhpcy5sb2FkTW9yZShwb3NpdGlvbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmxvYWRNb3JlRnJvbUJ1ZmZlcignYm90dG9tJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5hbGxJdGVtcyRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgcGFpcndpc2UoKSxcbiAgICAgICAgICBmaWx0ZXIoKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHNjcm9sbFBvc2l0aW9uITogVmlydHVhbGl6ZWRMaXN0U2Nyb2xsUG9zaXRpb247XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFBvc2l0aW9uJFxuICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgICAuc3Vic2NyaWJlKChzKSA9PiAoc2Nyb2xsUG9zaXRpb24gPSBzKSk7XG4gICAgICAgICAgICByZXR1cm4gc2Nyb2xsUG9zaXRpb24gPT09ICdtaWRkbGUnO1xuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKFtwcmV2SXRlbXMsIGN1cnJlbnRJdGVtc10pID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjdXJyZW50SXRlbXMubGVuZ3RoIDwgdGhpcy5tYXhJdGVtQ291bnQgfHxcbiAgICAgICAgICAgIHRoaXMudmlydHVhbGl6ZWRJdGVtcy5sZW5ndGggPT09IDBcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMudmlydHVhbGl6ZWRJdGVtc1N1YmplY3QubmV4dChjdXJyZW50SXRlbXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50Rmlyc3RJdGVtID0gdGhpcy52aXJ0dWFsaXplZEl0ZW1zWzBdO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudExhc3RJdGVtID1cbiAgICAgICAgICAgICAgdGhpcy52aXJ0dWFsaXplZEl0ZW1zW3RoaXMudmlydHVhbGl6ZWRJdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGNvbnN0IHByZXZTdGFydEluZGV4ID0gcHJldkl0ZW1zLmZpbmRJbmRleCgoaSkgPT5cbiAgICAgICAgICAgICAgdGhpcy5pc0VxdWFsKGksIGN1cnJlbnRGaXJzdEl0ZW0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHByZXZFbmRJbmRleCA9IHByZXZJdGVtcy5maW5kSW5kZXgoKGkpID0+XG4gICAgICAgICAgICAgIHRoaXMuaXNFcXVhbChpLCBjdXJyZW50TGFzdEl0ZW0pLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgaXNTdGFydFJlbWFpbmVkU2FtZSA9IGN1cnJlbnRJdGVtc1twcmV2U3RhcnRJbmRleF1cbiAgICAgICAgICAgICAgPyB0aGlzLmlzRXF1YWwoY3VycmVudEl0ZW1zW3ByZXZTdGFydEluZGV4XSwgY3VycmVudEZpcnN0SXRlbSlcbiAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IGlzRW5kUmVtYWluZWRTYW1lID0gY3VycmVudEl0ZW1zW3ByZXZFbmRJbmRleF1cbiAgICAgICAgICAgICAgPyB0aGlzLmlzRXF1YWwoY3VycmVudEl0ZW1zW3ByZXZFbmRJbmRleF0sIGN1cnJlbnRMYXN0SXRlbSlcbiAgICAgICAgICAgICAgOiBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgaGFzTmV3SXRlbXNCb3R0b20gPVxuICAgICAgICAgICAgICBwcmV2RW5kSW5kZXggPT09IHByZXZJdGVtcy5sZW5ndGggLSAxICYmIGlzRW5kUmVtYWluZWRTYW1lXG4gICAgICAgICAgICAgICAgPyBwcmV2SXRlbXMubGVuZ3RoICE9PSBjdXJyZW50SXRlbXMubGVuZ3RoXG4gICAgICAgICAgICAgICAgOiBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKGlzU3RhcnRSZW1haW5lZFNhbWUgJiYgaXNFbmRSZW1haW5lZFNhbWUpIHtcbiAgICAgICAgICAgICAgY29uc3QgZW5kSW5kZXggPSBoYXNOZXdJdGVtc0JvdHRvbSA/IHVuZGVmaW5lZCA6IHByZXZFbmRJbmRleCArIDE7XG4gICAgICAgICAgICAgIHRoaXMudmlydHVhbGl6ZWRJdGVtc1N1YmplY3QubmV4dChcbiAgICAgICAgICAgICAgICBjdXJyZW50SXRlbXMuc2xpY2UocHJldlN0YXJ0SW5kZXgsIGVuZEluZGV4KSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGN1cnJlbnRTdGFydEluZGV4ID0gaXNTdGFydFJlbWFpbmVkU2FtZSA/IHByZXZTdGFydEluZGV4IDogLTE7XG4gICAgICAgICAgICBsZXQgY3VycmVudEVuZEluZGV4ID0gaXNFbmRSZW1haW5lZFNhbWUgPyBwcmV2RW5kSW5kZXggOiAtMTtcblxuICAgICAgICAgICAgaWYgKCFpc1N0YXJ0UmVtYWluZWRTYW1lKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRTdGFydEluZGV4ID0gY3VycmVudEl0ZW1zLmZpbmRJbmRleCgoaSkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLmlzRXF1YWwoaSwgY3VycmVudEZpcnN0SXRlbSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzRW5kUmVtYWluZWRTYW1lKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRFbmRJbmRleCA9IGN1cnJlbnRJdGVtcy5maW5kSW5kZXgoKGkpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5pc0VxdWFsKGksIGN1cnJlbnRMYXN0SXRlbSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGhhc05ld0l0ZW1zVG9wID1cbiAgICAgICAgICAgICAgcHJldlN0YXJ0SW5kZXggPT09IDAgJiYgIWlzU3RhcnRSZW1haW5lZFNhbWVcbiAgICAgICAgICAgICAgICA/IGN1cnJlbnRTdGFydEluZGV4ICE9PSAwXG4gICAgICAgICAgICAgICAgOiBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRTdGFydEluZGV4ICE9PSAtMSAmJiBjdXJyZW50RW5kSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBoYXNOZXdJdGVtc1RvcCA/IDAgOiBjdXJyZW50U3RhcnRJbmRleDtcbiAgICAgICAgICAgICAgdGhpcy52aXJ0dWFsaXplZEl0ZW1zU3ViamVjdC5uZXh0KFxuICAgICAgICAgICAgICAgIGN1cnJlbnRJdGVtcy5zbGljZShzdGFydEluZGV4LCBjdXJyZW50RW5kSW5kZXggKyAxKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50U3RhcnRJbmRleCA9PT0gLTEgJiYgY3VycmVudEVuZEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRTdGFydEluZGV4ID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgY3VycmVudEVuZEluZGV4IC0gKHByZXZFbmRJbmRleCAtIHByZXZTdGFydEluZGV4KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbmRJbmRleCA9PT0gLTEgJiYgY3VycmVudFN0YXJ0SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEVuZEluZGV4ID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgICAgICBjdXJyZW50SXRlbXMubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGFydEluZGV4ICsgKHByZXZFbmRJbmRleCAtIHByZXZTdGFydEluZGV4KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy52aXJ0dWFsaXplZEl0ZW1zU3ViamVjdC5uZXh0KFxuICAgICAgICAgICAgICAgIGN1cnJlbnRJdGVtcy5zbGljZShjdXJyZW50U3RhcnRJbmRleCwgY3VycmVudEVuZEluZGV4ICsgMSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICApO1xuICAgIGlmICh0aGlzLmp1bXBUb0l0ZW0kKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgdGhpcy5qdW1wVG9JdGVtJFxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKChqdW1wVG9JdGVtKSA9PlxuICAgICAgICAgICAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLmFsbEl0ZW1zJC5waXBlKHRha2UoMSkpLCBvZihqdW1wVG9JdGVtKV0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSgoW2FsbEl0ZW1zLCBqdW1wVG9JdGVtXSkgPT4ge1xuICAgICAgICAgICAgaWYgKGp1bXBUb0l0ZW0uaXRlbSkge1xuICAgICAgICAgICAgICBpZiAoYWxsSXRlbXMubGVuZ3RoIDwgdGhpcy5tYXhJdGVtQ291bnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpcnR1YWxpemVkSXRlbXNTdWJqZWN0Lm5leHQoYWxsSXRlbXMpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1JbmRleCA9IGFsbEl0ZW1zLmZpbmRJbmRleCgoaSkgPT5cbiAgICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVE9ETzogZG8gd2Uga25vdyBhIGJldHRlciB0eXBpbmcgaGVyZT9cbiAgICAgICAgICAgICAgICAgIHRoaXMuaXNFcXVhbChpLCBqdW1wVG9JdGVtLml0ZW0pLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1JbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBqdW1wVG9JdGVtLnBvc2l0aW9uIHx8ICdtaWRkbGUnO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbnVtYmVyT2ZJdGVtc1RvUmVtb3ZlID1cbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMubGVuZ3RoIC0gTWF0aC5yb3VuZCh0aGlzLm1heEl0ZW1Db3VudCAvIDIpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbnVtYmVyT2ZJdGVtc0FmdGVyUmVtb3ZlID1cbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMubGVuZ3RoIC0gbnVtYmVyT2ZJdGVtc1RvUmVtb3ZlO1xuICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICAgIGxldCBlbmRJbmRleCA9IC0xO1xuXG4gICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IGl0ZW1JbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICBlbmRJbmRleCA9IE1hdGgubWluKFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCArIG51bWJlck9mSXRlbXNBZnRlclJlbW92ZSxcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgICAgICAgICAgICAgIGVuZEluZGV4ID0gaXRlbUluZGV4ICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kSW5kZXggLSBudW1iZXJPZkl0ZW1zQWZ0ZXJSZW1vdmUsXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWlkZGxlJzoge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zT25Ub3AgPSBpdGVtSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbXNPbkJvdHRvbSA9IGFsbEl0ZW1zLmxlbmd0aCAtIGl0ZW1JbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtc09uVG9wIDwgTWF0aC5jZWlsKG51bWJlck9mSXRlbXNBZnRlclJlbW92ZSAvIDIpXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNPbkJvdHRvbSA8XG4gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKG51bWJlck9mSXRlbXNBZnRlclJlbW92ZSAvIDIpICsgMVxuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kSW5kZXggPSBhbGxJdGVtcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0SW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5kSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBlbmRJbmRleCAtIG51bWJlck9mSXRlbXNBZnRlclJlbW92ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1JbmRleCAtIE1hdGguY2VpbChudW1iZXJPZkl0ZW1zQWZ0ZXJSZW1vdmUgLyAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5kSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRJbmRleCA9IHN0YXJ0SW5kZXggKyBudW1iZXJPZkl0ZW1zQWZ0ZXJSZW1vdmU7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHRoaXMudmlydHVhbGl6ZWRJdGVtc1N1YmplY3QubmV4dChcbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMuc2xpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXgpLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHZhbHVlIG9mIHZpcnR1YWxpemVkIGl0ZW1zXG4gICAqL1xuICBnZXQgdmlydHVhbGl6ZWRJdGVtcygpIHtcbiAgICByZXR1cm4gdGhpcy52aXJ0dWFsaXplZEl0ZW1zU3ViamVjdC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbGwgc3Vic2NyaXB0aW9ucywgY2FsbCB0aGlzIG9uY2UgeW91J3JlIGRvbmUgdXNpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBzZXJ2aWNlXG4gICAqL1xuICBkaXNwb3NlKCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGxvYWRNb3JlRnJvbUJ1ZmZlcihfOiBWaXJ0dWFsaXplZExpc3RRdWVyeURpcmVjdGlvbikge1xuICAgIHRoaXMubG9hZEZyb21CdWZmZXIkLm5leHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZE1vcmUoZGlyZWN0aW9uOiBWaXJ0dWFsaXplZExpc3RRdWVyeURpcmVjdGlvbikge1xuICAgIHRoaXMucXVlcnlTdGF0ZVN1YmplY3QubmV4dCh7IHN0YXRlOiBgbG9hZGluZy0ke2RpcmVjdGlvbn1gIH0pO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnF1ZXJ5KGRpcmVjdGlvbik7XG4gICAgICB0aGlzLnF1ZXJ5U3RhdGVTdWJqZWN0Lm5leHQoeyBzdGF0ZTogJ3N1Y2Nlc3MnIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMucXVlcnlTdGF0ZVN1YmplY3QubmV4dCh7IHN0YXRlOiAnZXJyb3InLCBlcnJvcjogZSB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgaXNFcXVhbDogKHQxOiBULCB0MjogVCkgPT4gYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcXVlcnk6IChcbiAgICBkaXJlY3Rpb246IFZpcnR1YWxpemVkTGlzdFF1ZXJ5RGlyZWN0aW9uLFxuICApID0+IFByb21pc2U8dW5rbm93bj47XG59XG4iXX0=
@@ -1,61 +0,0 @@
1
- const ENCODING_BIT_RATE = 128; // kbps;
2
- const COUNT_SAMPLES_PER_ENCODED_BLOCK = 1152;
3
- const SAMPLE_RATE = 16000;
4
- const readFileAsArrayBuffer = (blob) => new Promise((resolve, reject) => {
5
- const blobReader = new FileReader();
6
- blobReader.onload = () => {
7
- resolve(blobReader.result);
8
- };
9
- blobReader.onerror = () => {
10
- reject(new Error(blobReader.error?.message));
11
- };
12
- blobReader.readAsArrayBuffer(blob);
13
- });
14
- const toAudioBuffer = async (blob) => {
15
- const audioCtx = new AudioContext();
16
- const arrayBuffer = await readFileAsArrayBuffer(blob);
17
- const decodedData = await audioCtx.decodeAudioData(arrayBuffer);
18
- if (audioCtx.state !== 'closed')
19
- await audioCtx.close();
20
- return decodedData;
21
- };
22
- const renderAudio = async (audioBuffer, sampleRate) => {
23
- const offlineAudioCtx = new OfflineAudioContext(audioBuffer.numberOfChannels, audioBuffer.duration * sampleRate, sampleRate);
24
- const source = offlineAudioCtx.createBufferSource();
25
- source.buffer = audioBuffer;
26
- source.connect(offlineAudioCtx.destination);
27
- source.start();
28
- return await offlineAudioCtx.startRendering();
29
- };
30
- const float32ArrayToInt16Array = (float32Arr) => {
31
- const int16Arr = new Int16Array(float32Arr.length);
32
- for (let i = 0; i < float32Arr.length; i++) {
33
- const float32Value = float32Arr[i];
34
- // Clamp the float value between -1 and 1
35
- const clampedValue = Math.max(-1, Math.min(1, float32Value));
36
- // Convert the float value to a signed 16-bit integer
37
- int16Arr[i] = Math.round(clampedValue * 32767);
38
- }
39
- return int16Arr;
40
- };
41
- const splitDataByChannel = (audioBuffer) => Array.from({ length: audioBuffer.numberOfChannels }, (_, i) => audioBuffer.getChannelData(i)).map(float32ArrayToInt16Array);
42
- /* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-argument */
43
- export async function encodeWebmToMp3(blob, lameJs) {
44
- const audioBuffer = await renderAudio(await toAudioBuffer(blob), SAMPLE_RATE);
45
- const channelCount = audioBuffer.numberOfChannels;
46
- const dataByChannel = splitDataByChannel(audioBuffer);
47
- const mp3Encoder = new lameJs.Mp3Encoder(channelCount, SAMPLE_RATE, ENCODING_BIT_RATE);
48
- const dataBuffer = [];
49
- let remaining = dataByChannel[0].length;
50
- for (let i = 0; remaining >= COUNT_SAMPLES_PER_ENCODED_BLOCK; i += COUNT_SAMPLES_PER_ENCODED_BLOCK) {
51
- const [leftChannelBlock, rightChannelBlock] = dataByChannel.map((channel) => channel.subarray(i, i + COUNT_SAMPLES_PER_ENCODED_BLOCK));
52
- dataBuffer.push(new Int8Array(mp3Encoder.encodeBuffer(leftChannelBlock, rightChannelBlock)));
53
- remaining -= COUNT_SAMPLES_PER_ENCODED_BLOCK;
54
- }
55
- const lastBlock = mp3Encoder.flush();
56
- if (lastBlock.length)
57
- dataBuffer.push(new Int8Array(lastBlock));
58
- return new Blob(dataBuffer, { type: 'audio/mp3;sbu_type=voice' });
59
- }
60
- /* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-argument */
61
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXAzLXRyYW5zY29kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvdm9pY2UtcmVjb3JkZXIvbXAzLXRyYW5zY29kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUMsQ0FBQyxRQUFRO0FBQ3ZDLE1BQU0sK0JBQStCLEdBQUcsSUFBSSxDQUFDO0FBQzdDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQztBQUUxQixNQUFNLHFCQUFxQixHQUFHLENBQUMsSUFBVSxFQUF3QixFQUFFLENBQ2pFLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO0lBQzlCLE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7SUFDcEMsVUFBVSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUU7UUFDdkIsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFxQixDQUFDLENBQUM7SUFDNUMsQ0FBQyxDQUFDO0lBRUYsVUFBVSxDQUFDLE9BQU8sR0FBRyxHQUFHLEVBQUU7UUFDeEIsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDLENBQUM7SUFFRixVQUFVLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckMsQ0FBQyxDQUFDLENBQUM7QUFFTCxNQUFNLGFBQWEsR0FBRyxLQUFLLEVBQUUsSUFBVSxFQUFFLEVBQUU7SUFDekMsTUFBTSxRQUFRLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUVwQyxNQUFNLFdBQVcsR0FBRyxNQUFNLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RELE1BQU0sV0FBVyxHQUFHLE1BQU0sUUFBUSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJ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QUFDLEdBQUcsK0JBQStCLENBQUMsQ0FDekQsQ0FBQztRQUNGLFVBQVUsQ0FBQyxJQUFJLENBQ2IsSUFBSSxTQUFTLENBQ1gsVUFBVSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUIsQ0FBQyxDQUM3RCxDQUNGLENBQUM7UUFDRixTQUFTLElBQUksK0JBQStCLENBQUM7S0FDOUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDckMsSUFBSSxTQUFTLENBQUMsTUFBTTtRQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNoRSxPQUFPLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUNELHFOQUFxTiIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IEVOQ09ESU5HX0JJVF9SQVRFID0gMTI4OyAvLyBrYnBzO1xuY29uc3QgQ09VTlRfU0FNUExFU19QRVJfRU5DT0RFRF9CTE9DSyA9IDExNTI7XG5jb25zdCBTQU1QTEVfUkFURSA9IDE2MDAwO1xuXG5jb25zdCByZWFkRmlsZUFzQXJyYXlCdWZmZXIgPSAoYmxvYjogQmxvYik6IFByb21pc2U8QXJyYXlCdWZmZXI+ID0+XG4gIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBibG9iUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICBibG9iUmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIHJlc29sdmUoYmxvYlJlYWRlci5yZXN1bHQgYXMgQXJyYXlCdWZmZXIpO1xuICAgIH07XG5cbiAgICBibG9iUmVhZGVyLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICByZWplY3QobmV3IEVycm9yKGJsb2JSZWFkZXIuZXJyb3I/Lm1lc3NhZ2UpKTtcbiAgICB9O1xuXG4gICAgYmxvYlJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKTtcbiAgfSk7XG5cbmNvbnN0IHRvQXVkaW9CdWZmZXIgPSBhc3luYyAoYmxvYjogQmxvYikgPT4ge1xuICBjb25zdCBhdWRpb0N0eCA9IG5ldyBBdWRpb0NvbnRleHQoKTtcblxuICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IHJlYWRGaWxlQXNBcnJheUJ1ZmZlcihibG9iKTtcbiAgY29uc3QgZGVjb2RlZERhdGEgPSBhd2FpdCBhdWRpb0N0eC5kZWNvZGVBdWRpb0RhdGEoYXJyYXlCdWZmZXIpO1xuICBpZiAoYXVkaW9DdHguc3RhdGUgIT09ICdjbG9zZWQnKSBhd2FpdCBhdWRpb0N0eC5jbG9zZSgpO1xuICByZXR1cm4gZGVjb2RlZERhdGE7XG59O1xuXG5jb25zdCByZW5kZXJBdWRpbyA9IGFzeW5jIChhdWRpb0J1ZmZlcjogQXVkaW9CdWZmZXIsIHNhbXBsZVJhdGU6IG51bWJlcikgPT4ge1xuICBjb25zdCBvZmZsaW5lQXVkaW9DdHggPSBuZXcgT2ZmbGluZUF1ZGlvQ29udGV4dChcbiAgICBhdWRpb0J1ZmZlci5udW1iZXJPZkNoYW5uZWxzLFxuICAgIGF1ZGlvQnVmZmVyLmR1cmF0aW9uICogc2FtcGxlUmF0ZSxcbiAgICBzYW1wbGVSYXRlLFxuICApO1xuICBjb25zdCBzb3VyY2UgPSBvZmZsaW5lQXVkaW9DdHguY3JlYXRlQnVmZmVyU291cmNlKCk7XG4gIHNvdXJjZS5idWZmZXIgPSBhdWRpb0J1ZmZlcjtcbiAgc291cmNlLmNvbm5lY3Qob2ZmbGluZUF1ZGlvQ3R4LmRlc3RpbmF0aW9uKTtcbiAgc291cmNlLnN0YXJ0KCk7XG5cbiAgcmV0dXJuIGF3YWl0IG9mZmxpbmVBdWRpb0N0eC5zdGFydFJlbmRlcmluZygpO1xufTtcblxuY29uc3QgZmxvYXQzMkFycmF5VG9JbnQxNkFycmF5ID0gKGZsb2F0MzJBcnI6IEZsb2F0MzJBcnJheSkgPT4ge1xuICBjb25zdCBpbnQxNkFyciA9IG5ldyBJbnQxNkFycmF5KGZsb2F0MzJBcnIubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmbG9hdDMyQXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZmxvYXQzMlZhbHVlID0gZmxvYXQzMkFycltpXTtcbiAgICAvLyBDbGFtcCB0aGUgZmxvYXQgdmFsdWUgYmV0d2VlbiAtMSBhbmQgMVxuICAgIGNvbnN0IGNsYW1wZWRWYWx1ZSA9IE1hdGgubWF4KC0xLCBNYXRoLm1pbigxLCBmbG9hdDMyVmFsdWUpKTtcbiAgICAvLyBDb252ZXJ0IHRoZSBmbG9hdCB2YWx1ZSB0byBhIHNpZ25lZCAxNi1iaXQgaW50ZWdlclxuICAgIGludDE2QXJyW2ldID0gTWF0aC5yb3VuZChjbGFtcGVkVmFsdWUgKiAzMjc2Nyk7XG4gIH1cbiAgcmV0dXJuIGludDE2QXJyO1xufTtcblxuY29uc3Qgc3BsaXREYXRhQnlDaGFubmVsID0gKGF1ZGlvQnVmZmVyOiBBdWRpb0J1ZmZlcikgPT5cbiAgQXJyYXkuZnJvbSh7IGxlbmd0aDogYXVkaW9CdWZmZXIubnVtYmVyT2ZDaGFubmVscyB9LCAoXywgaSkgPT5cbiAgICBhdWRpb0J1ZmZlci5nZXRDaGFubmVsRGF0YShpKSxcbiAgKS5tYXAoZmxvYXQzMkFycmF5VG9JbnQxNkFycmF5KTtcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50LCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWNhbGwsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hcmd1bWVudCAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuY29kZVdlYm1Ub01wMyhibG9iOiBCbG9iLCBsYW1lSnM6IGFueSkge1xuICBjb25zdCBhdWRpb0J1ZmZlciA9IGF3YWl0IHJlbmRlckF1ZGlvKGF3YWl0IHRvQXVkaW9CdWZmZXIoYmxvYiksIFNBTVBMRV9SQVRFKTtcbiAgY29uc3QgY2hhbm5lbENvdW50ID0gYXVkaW9CdWZmZXIubnVtYmVyT2ZDaGFubmVscztcbiAgY29uc3QgZGF0YUJ5Q2hhbm5lbCA9IHNwbGl0RGF0YUJ5Q2hhbm5lbChhdWRpb0J1ZmZlcik7XG4gIGNvbnN0IG1wM0VuY29kZXIgPSBuZXcgbGFtZUpzLk1wM0VuY29kZXIoXG4gICAgY2hhbm5lbENvdW50LFxuICAgIFNBTVBMRV9SQVRFLFxuICAgIEVOQ09ESU5HX0JJVF9SQVRFLFxuICApO1xuXG4gIGNvbnN0IGRhdGFCdWZmZXI6IEludDhBcnJheVtdID0gW107XG4gIGxldCByZW1haW5pbmcgPSBkYXRhQnlDaGFubmVsWzBdLmxlbmd0aDtcbiAgZm9yIChcbiAgICBsZXQgaSA9IDA7XG4gICAgcmVtYWluaW5nID49IENPVU5UX1NBTVBMRVNfUEVSX0VOQ09ERURfQkxPQ0s7XG4gICAgaSArPSBDT1VOVF9TQU1QTEVTX1BFUl9FTkNPREVEX0JMT0NLXG4gICkge1xuICAgIGNvbnN0IFtsZWZ0Q2hhbm5lbEJsb2NrLCByaWdodENoYW5uZWxCbG9ja10gPSBkYXRhQnlDaGFubmVsLm1hcCgoY2hhbm5lbCkgPT5cbiAgICAgIGNoYW5uZWwuc3ViYXJyYXkoaSwgaSArIENPVU5UX1NBTVBMRVNfUEVSX0VOQ09ERURfQkxPQ0spLFxuICAgICk7XG4gICAgZGF0YUJ1ZmZlci5wdXNoKFxuICAgICAgbmV3IEludDhBcnJheShcbiAgICAgICAgbXAzRW5jb2Rlci5lbmNvZGVCdWZmZXIobGVmdENoYW5uZWxCbG9jaywgcmlnaHRDaGFubmVsQmxvY2spLFxuICAgICAgKSxcbiAgICApO1xuICAgIHJlbWFpbmluZyAtPSBDT1VOVF9TQU1QTEVTX1BFUl9FTkNPREVEX0JMT0NLO1xuICB9XG5cbiAgY29uc3QgbGFzdEJsb2NrID0gbXAzRW5jb2Rlci5mbHVzaCgpO1xuICBpZiAobGFzdEJsb2NrLmxlbmd0aCkgZGF0YUJ1ZmZlci5wdXNoKG5ldyBJbnQ4QXJyYXkobGFzdEJsb2NrKSk7XG4gIHJldHVybiBuZXcgQmxvYihkYXRhQnVmZmVyLCB7IHR5cGU6ICdhdWRpby9tcDM7c2J1X3R5cGU9dm9pY2UnIH0pO1xufVxuLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnQsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFyZ3VtZW50ICovXG4iXX0=
@@ -1,121 +0,0 @@
1
- import { Injectable, NgModule } from '@angular/core';
2
- import { readBlobAsArrayBuffer } from '../file-utils';
3
- import * as i0 from "@angular/core";
4
- const WAV_HEADER_LENGTH_BYTES = 44;
5
- const BYTES_PER_SAMPLE = 2;
6
- const RIFF_FILE_MAX_BYTES = 4294967295;
7
- const HEADER = {
8
- AUDIO_FORMAT: { offset: 20, value: 1 },
9
- BITS_PER_SAMPLE: { offset: 34, value: BYTES_PER_SAMPLE * 8 },
10
- BLOCK_ALIGN: { offset: 32 },
11
- BYTE_RATE: { offset: 28 },
12
- CHANNEL_COUNT: { offset: 22 },
13
- CHUNK_ID: { offset: 0, value: 0x52494646 },
14
- CHUNK_SIZE: { offset: 4 },
15
- FILE_FORMAT: { offset: 8, value: 0x57415645 },
16
- SAMPLE_RATE: { offset: 24 },
17
- SUBCHUNK1_ID: { offset: 12, value: 0x666d7420 },
18
- SUBCHUNK1_SIZE: { offset: 16, value: 16 },
19
- SUBCHUNK2_ID: { offset: 36, value: 0x64617461 },
20
- SUBCHUNK2_SIZE: { offset: 40 }, // actual audio data size
21
- };
22
- /**
23
- * The `TranscoderService` is used to transcibe audio recording to a format that's supported by all major browsers. The SDK uses this to create voice messages.
24
- *
25
- * If you want to use your own transcoder you can provide a `customTranscoder`.
26
- */
27
- export class TranscoderService {
28
- constructor() {
29
- this.config = {
30
- sampleRate: 16000,
31
- };
32
- this.splitDataByChannel = (audioBuffer) => Array.from({ length: audioBuffer.numberOfChannels }, (_, i) => audioBuffer.getChannelData(i));
33
- }
34
- /**
35
- * The default transcoder will leave audio/mp4 files as is, and transcode webm files to wav. If you want to customize this, you can provide your own transcoder using the `customTranscoder` field
36
- * @param blob
37
- * @returns the transcoded file
38
- */
39
- async transcode(blob) {
40
- if (this.customTranscoder) {
41
- return this.customTranscoder(blob);
42
- }
43
- if (blob.type.includes('audio/mp4')) {
44
- return blob;
45
- }
46
- const audioBuffer = await this.renderAudio(await this.toAudioBuffer(blob), this.config.sampleRate);
47
- const numberOfSamples = audioBuffer.duration * this.config.sampleRate;
48
- const fileSizeBytes = numberOfSamples * audioBuffer.numberOfChannels * BYTES_PER_SAMPLE +
49
- WAV_HEADER_LENGTH_BYTES;
50
- const arrayBuffer = new ArrayBuffer(fileSizeBytes);
51
- this.writeWavHeader({
52
- arrayBuffer,
53
- channelCount: audioBuffer.numberOfChannels,
54
- sampleRate: this.config.sampleRate,
55
- });
56
- this.writeWavAudioData({
57
- arrayBuffer,
58
- dataByChannel: this.splitDataByChannel(audioBuffer),
59
- });
60
- return new Blob([arrayBuffer], { type: 'audio/wav' });
61
- }
62
- async renderAudio(audioBuffer, sampleRate) {
63
- const offlineAudioCtx = new OfflineAudioContext(audioBuffer.numberOfChannels, audioBuffer.duration * sampleRate, sampleRate);
64
- const source = offlineAudioCtx.createBufferSource();
65
- source.buffer = audioBuffer;
66
- source.connect(offlineAudioCtx.destination);
67
- source.start();
68
- return await offlineAudioCtx.startRendering();
69
- }
70
- async toAudioBuffer(blob) {
71
- const audioCtx = new AudioContext();
72
- const arrayBuffer = await readBlobAsArrayBuffer(blob);
73
- const decodedData = await audioCtx.decodeAudioData(arrayBuffer);
74
- if (audioCtx.state !== 'closed')
75
- await audioCtx.close();
76
- return decodedData;
77
- }
78
- writeWavAudioData({ arrayBuffer, dataByChannel, }) {
79
- const dataView = new DataView(arrayBuffer);
80
- const channelCount = dataByChannel.length;
81
- dataByChannel.forEach((channelData, channelIndex) => {
82
- let writeOffset = WAV_HEADER_LENGTH_BYTES + channelCount * channelIndex;
83
- channelData.forEach((float32Value) => {
84
- dataView.setInt16(writeOffset, float32Value < 0
85
- ? Math.max(-1, float32Value) * 32768
86
- : Math.min(1, float32Value) * 32767, true);
87
- writeOffset += channelCount * BYTES_PER_SAMPLE;
88
- });
89
- });
90
- }
91
- writeWavHeader({ arrayBuffer, channelCount, sampleRate, }) {
92
- const byteRate = sampleRate * channelCount * BYTES_PER_SAMPLE; // bytes/sec
93
- const blockAlign = channelCount * BYTES_PER_SAMPLE;
94
- const dataView = new DataView(arrayBuffer);
95
- /*
96
- * The maximum size of a RIFF file is 4294967295 bytes and since the header takes up 44 bytes there are 4294967251 bytes left for the
97
- * data chunk.
98
- */
99
- const dataChunkSize = Math.min(dataView.byteLength - WAV_HEADER_LENGTH_BYTES, RIFF_FILE_MAX_BYTES - WAV_HEADER_LENGTH_BYTES);
100
- dataView.setUint32(HEADER.CHUNK_ID.offset, HEADER.CHUNK_ID.value); // "RIFF"
101
- dataView.setUint32(HEADER.CHUNK_SIZE.offset, arrayBuffer.byteLength - 8, true); // adjustment for the first two headers - chunk id + file size
102
- dataView.setUint32(HEADER.FILE_FORMAT.offset, HEADER.FILE_FORMAT.value); // "WAVE"
103
- dataView.setUint32(HEADER.SUBCHUNK1_ID.offset, HEADER.SUBCHUNK1_ID.value); // "fmt "
104
- dataView.setUint32(HEADER.SUBCHUNK1_SIZE.offset, HEADER.SUBCHUNK1_SIZE.value, true);
105
- dataView.setUint16(HEADER.AUDIO_FORMAT.offset, HEADER.AUDIO_FORMAT.value, true);
106
- dataView.setUint16(HEADER.CHANNEL_COUNT.offset, channelCount, true);
107
- dataView.setUint32(HEADER.SAMPLE_RATE.offset, sampleRate, true);
108
- dataView.setUint32(HEADER.BYTE_RATE.offset, byteRate, true);
109
- dataView.setUint16(HEADER.BLOCK_ALIGN.offset, blockAlign, true);
110
- dataView.setUint16(HEADER.BITS_PER_SAMPLE.offset, HEADER.BITS_PER_SAMPLE.value, true);
111
- dataView.setUint32(HEADER.SUBCHUNK2_ID.offset, HEADER.SUBCHUNK2_ID.value); // "data"
112
- dataView.setUint32(HEADER.SUBCHUNK2_SIZE.offset, dataChunkSize, true);
113
- }
114
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: TranscoderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
115
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: TranscoderService, providedIn: NgModule }); }
116
- }
117
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: TranscoderService, decorators: [{
118
- type: Injectable,
119
- args: [{ providedIn: NgModule }]
120
- }], ctorParameters: () => [] });
121
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNjb2Rlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL3ZvaWNlLXJlY29yZGVyL3RyYW5zY29kZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBVXRELE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxDQUFDO0FBQ25DLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDO0FBRXZDLE1BQU0sTUFBTSxHQUFHO0lBQ2IsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO0lBQ3RDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixHQUFHLENBQUMsRUFBRTtJQUM1RCxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO0lBQzNCLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7SUFDekIsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtJQUM3QixRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7SUFDMUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRTtJQUN6QixXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7SUFDN0MsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtJQUMzQixZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7SUFDL0MsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO0lBQ3pDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRTtJQUMvQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUseUJBQXlCO0NBQ2pELENBQUM7QUFlWDs7OztHQUlHO0FBRUgsTUFBTSxPQUFPLGlCQUFpQjtJQUs1QjtRQUpBLFdBQU0sR0FBcUI7WUFDekIsVUFBVSxFQUFFLEtBQUs7U0FDbEIsQ0FBQztRQXVJUSx1QkFBa0IsR0FBRyxDQUFDLFdBQXdCLEVBQUUsRUFBRSxDQUMxRCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQzVELFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQzlCLENBQUM7SUF4SVcsQ0FBQztJQUVoQjs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFVO1FBQ3hCLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3pCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3BDO1FBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUNuQyxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUN4QyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUN2QixDQUFDO1FBQ0YsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUN0RSxNQUFNLGFBQWEsR0FDakIsZUFBZSxHQUFHLFdBQVcsQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0I7WUFDakUsdUJBQXVCLENBQUM7UUFFMUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUNsQixXQUFXO1lBQ1gsWUFBWSxFQUFFLFdBQVcsQ0FBQyxnQkFBZ0I7WUFDMUMsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtTQUNuQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFDckIsV0FBVztZQUNYLGFBQWEsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDO1NBQ3BELENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFUyxLQUFLLENBQUMsV0FBVyxDQUFDLFdBQXdCLEVBQUUsVUFBa0I7UUFDdEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxtQkFBbUIsQ0FDN0MsV0FBVyxDQUFDLGdCQUFnQixFQUM1QixXQUFXLENBQUMsUUFBUSxHQUFHLFVBQVUsRUFDakMsVUFBVSxDQUNYLENBQUM7UUFDRixNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUNwRCxNQUFNLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQztRQUM1QixNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1QyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFZixPQUFPLE1BQU0sZUFBZSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFUyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQVU7UUFDdEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVwQyxNQUFNLFdBQVcsR0FBRyxNQUFNLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RELE1BQU0sV0FBVyxHQUFHLE1BQU0sUUFBUSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNoRSxJQUFJLFFBQVEsQ0FBQyxLQUFLLEtBQUssUUFBUTtZQUFFLE1BQU0sUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFUyxpQkFBaUIsQ0FBQyxFQUMxQixXQUFXLEVBQ1gsYUFBYSxHQUNRO1FBQ3JCLE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFFMUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsRUFBRTtZQUNsRCxJQUFJLFdBQVcsR0FBRyx1QkFBdUIsR0FBRyxZQUFZLEdBQUcsWUFBWSxDQUFDO1lBRXhFLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRTtnQkFDbkMsUUFBUSxDQUFDLFFBQVEsQ0FDZixXQUFXLEVBQ1gsWUFBWSxHQUFHLENBQUM7b0JBQ2QsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLEdBQUcsS0FBSztvQkFDcEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHLEtBQUssRUFDckMsSUFBSSxDQUNMLENBQUM7Z0JBQ0YsV0FBVyxJQUFJLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQztZQUNqRCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLGNBQWMsQ0FBQyxFQUN2QixXQUFXLEVBQ1gsWUFBWSxFQUNaLFVBQVUsR0FDWTtRQUN0QixNQUFNLFFBQVEsR0FBRyxVQUFVLEdBQUcsWUFBWSxHQUFHLGdCQUFnQixDQUFDLENBQUMsWUFBWTtRQUMzRSxNQUFNLFVBQVUsR0FBRyxZQUFZLEdBQUcsZ0JBQWdCLENBQUM7UUFFbkQsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0M7OztXQUdHO1FBQ0gsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDNUIsUUFBUSxDQUFDLFVBQVUsR0FBRyx1QkFBdUIsRUFDN0MsbUJBQW1CLEdBQUcsdUJBQXVCLENBQzlDLENBQUM7UUFFRixRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQzVFLFFBQVEsQ0FBQyxTQUFTLENBQ2hCLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUN4QixXQUFXLENBQUMsVUFBVSxHQUFHLENBQUMsRUFDMUIsSUFBSSxDQUNMLENBQUMsQ0FBQyw4REFBOEQ7UUFDakUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUztRQUVsRixRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQ3BGLFFBQVEsQ0FBQyxTQUFTLENBQ2hCLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUM1QixNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFDM0IsSUFBSSxDQUNMLENBQUM7UUFDRixRQUFRLENBQUMsU0FBUyxDQUNoQixNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFDMUIsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQ3pCLElBQUksQ0FDTCxDQUFDO1FBQ0YsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUQsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEUsUUFBUSxDQUFDLFNBQVMsQ0FDaEIsTUFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQzdCLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUM1QixJQUFJLENBQ0wsQ0FBQztRQUVGLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDcEYsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEUsQ0FBQzs4R0F4SVUsaUJBQWlCO2tIQUFqQixpQkFBaUIsY0FESixRQUFROzsyRkFDckIsaUJBQWlCO2tCQUQ3QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyByZWFkQmxvYkFzQXJyYXlCdWZmZXIgfSBmcm9tICcuLi9maWxlLXV0aWxzJztcblxuZXhwb3J0IHR5cGUgVHJhbnNjb2RlckNvbmZpZyA9IHtcbiAgc2FtcGxlUmF0ZTogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgVHJhbnNjb2RlUGFyYW1zID0gVHJhbnNjb2RlckNvbmZpZyAmIHtcbiAgYmxvYjogQmxvYjtcbn07XG5cbmNvbnN0IFdBVl9IRUFERVJfTEVOR1RIX0JZVEVTID0gNDQ7XG5jb25zdCBCWVRFU19QRVJfU0FNUExFID0gMjtcbmNvbnN0IFJJRkZfRklMRV9NQVhfQllURVMgPSA0Mjk0OTY3Mjk1O1xuXG5jb25zdCBIRUFERVIgPSB7XG4gIEFVRElPX0ZPUk1BVDogeyBvZmZzZXQ6IDIwLCB2YWx1ZTogMSB9LCAvLyBQQ00gPSAxXG4gIEJJVFNfUEVSX1NBTVBMRTogeyBvZmZzZXQ6IDM0LCB2YWx1ZTogQllURVNfUEVSX1NBTVBMRSAqIDggfSwgLy8gMTYgYml0cyBlbmNvZGluZ1xuICBCTE9DS19BTElHTjogeyBvZmZzZXQ6IDMyIH0sXG4gIEJZVEVfUkFURTogeyBvZmZzZXQ6IDI4IH0sXG4gIENIQU5ORUxfQ09VTlQ6IHsgb2Zmc2V0OiAyMiB9LCAvLyAxIC0gbW9ubywgMiAtIHN0ZXJlb1xuICBDSFVOS19JRDogeyBvZmZzZXQ6IDAsIHZhbHVlOiAweDUyNDk0NjQ2IH0sIC8vIGhleCByZXByZXNlbnRhdGlvbiBvZiBzdHJpbmcgXCJSSUZGXCIgKFJlc291cmNlIEludGVyY2hhbmdlIEZpbGUgRm9ybWF0KSAtIGlkZW50aWZpZXMgdGhlIGZpbGUgc3RydWN0dXJlIHRoYXQgZGVmaW5lcyBhIGNsYXNzIG9mIG1vcmUgc3BlY2lmaWMgZmlsZSBmb3JtYXRzLCBlLmcuIFdBVkVcbiAgQ0hVTktfU0laRTogeyBvZmZzZXQ6IDQgfSxcbiAgRklMRV9GT1JNQVQ6IHsgb2Zmc2V0OiA4LCB2YWx1ZTogMHg1NzQxNTY0NSB9LCAvLyBoZXggcmVwcmVzZW50YXRpb24gb2Ygc3RyaW5nIFwiV0FWRVwiXG4gIFNBTVBMRV9SQVRFOiB7IG9mZnNldDogMjQgfSxcbiAgU1VCQ0hVTksxX0lEOiB7IG9mZnNldDogMTIsIHZhbHVlOiAweDY2NmQ3NDIwIH0sIC8vIGhleCByZXByZXNlbnRhdGlvbiBvZiBzdHJpbmcgXCJmbXQgXCIgLSBpZGVudGlmaWVzIHRoZSBzdGFydCBvZiBcImZvcm1hdFwiIHNlY3Rpb24gb2YgdGhlIGhlYWRlclxuICBTVUJDSFVOSzFfU0laRTogeyBvZmZzZXQ6IDE2LCB2YWx1ZTogMTYgfSwgLy8gU3ViY2h1bmsxIFNpemUgd2l0aG91dCBTVUJDSFVOSzFfSUQgYW5kIFNVQkNIVU5LMV9TSVpFIGZpZWxkc1xuICBTVUJDSFVOSzJfSUQ6IHsgb2Zmc2V0OiAzNiwgdmFsdWU6IDB4NjQ2MTc0NjEgfSwgLy8gaGV4IHJlcHJlc2VudGF0aW9uIG9mIHN0cmluZyBcImRhdGFcIiAtIGlkZW50aWZpZXMgdGhlIHN0YXJ0IG9mIGFjdHVhbCBhdWRpbyBkYXRhIHNlY3Rpb25cbiAgU1VCQ0hVTksyX1NJWkU6IHsgb2Zmc2V0OiA0MCB9LCAvLyBhY3R1YWwgYXVkaW8gZGF0YSBzaXplXG59IGFzIGNvbnN0O1xuXG50eXBlIFdyaXRlV2F2ZUhlYWRlclBhcmFtcyA9IHtcbiAgYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyO1xuICAvLyAxIC0gbW9ubywgMiAtIHN0ZXJlb1xuICBjaGFubmVsQ291bnQ6IG51bWJlcjtcbiAgLy8gTnVtYmVyIG9mIHNhbXBsZXMgcGVyIHNlY29uZCwgZS5nLiA0NDEwMEh6XG4gIHNhbXBsZVJhdGU6IG51bWJlcjtcbn07XG5cbnR5cGUgV3JpdGVBdWRpb0RhdGFQYXJhbXMgPSB7XG4gIGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlcjtcbiAgZGF0YUJ5Q2hhbm5lbDogRmxvYXQzMkFycmF5W107XG59O1xuXG4vKipcbiAqIFRoZSBgVHJhbnNjb2RlclNlcnZpY2VgIGlzIHVzZWQgdG8gdHJhbnNjaWJlIGF1ZGlvIHJlY29yZGluZyB0byBhIGZvcm1hdCB0aGF0J3Mgc3VwcG9ydGVkIGJ5IGFsbCBtYWpvciBicm93c2Vycy4gVGhlIFNESyB1c2VzIHRoaXMgdG8gY3JlYXRlIHZvaWNlIG1lc3NhZ2VzLlxuICpcbiAqIElmIHlvdSB3YW50IHRvIHVzZSB5b3VyIG93biB0cmFuc2NvZGVyIHlvdSBjYW4gcHJvdmlkZSBhIGBjdXN0b21UcmFuc2NvZGVyYC5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiBOZ01vZHVsZSB9KVxuZXhwb3J0IGNsYXNzIFRyYW5zY29kZXJTZXJ2aWNlIHtcbiAgY29uZmlnOiBUcmFuc2NvZGVyQ29uZmlnID0ge1xuICAgIHNhbXBsZVJhdGU6IDE2MDAwLFxuICB9O1xuICBjdXN0b21UcmFuc2NvZGVyPzogKGJsb2I6IEJsb2IpID0+IEJsb2IgfCBQcm9taXNlPEJsb2I+O1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IHRyYW5zY29kZXIgd2lsbCBsZWF2ZSBhdWRpby9tcDQgZmlsZXMgYXMgaXMsIGFuZCB0cmFuc2NvZGUgd2VibSBmaWxlcyB0byB3YXYuIElmIHlvdSB3YW50IHRvIGN1c3RvbWl6ZSB0aGlzLCB5b3UgY2FuIHByb3ZpZGUgeW91ciBvd24gdHJhbnNjb2RlciB1c2luZyB0aGUgYGN1c3RvbVRyYW5zY29kZXJgIGZpZWxkXG4gICAqIEBwYXJhbSBibG9iXG4gICAqIEByZXR1cm5zIHRoZSB0cmFuc2NvZGVkIGZpbGVcbiAgICovXG4gIGFzeW5jIHRyYW5zY29kZShibG9iOiBCbG9iKSB7XG4gICAgaWYgKHRoaXMuY3VzdG9tVHJhbnNjb2Rlcikge1xuICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tVHJhbnNjb2RlcihibG9iKTtcbiAgICB9XG4gICAgaWYgKGJsb2IudHlwZS5pbmNsdWRlcygnYXVkaW8vbXA0JykpIHtcbiAgICAgIHJldHVybiBibG9iO1xuICAgIH1cbiAgICBjb25zdCBhdWRpb0J1ZmZlciA9IGF3YWl0IHRoaXMucmVuZGVyQXVkaW8oXG4gICAgICBhd2FpdCB0aGlzLnRvQXVkaW9CdWZmZXIoYmxvYiksXG4gICAgICB0aGlzLmNvbmZpZy5zYW1wbGVSYXRlLFxuICAgICk7XG4gICAgY29uc3QgbnVtYmVyT2ZTYW1wbGVzID0gYXVkaW9CdWZmZXIuZHVyYXRpb24gKiB0aGlzLmNvbmZpZy5zYW1wbGVSYXRlO1xuICAgIGNvbnN0IGZpbGVTaXplQnl0ZXMgPVxuICAgICAgbnVtYmVyT2ZTYW1wbGVzICogYXVkaW9CdWZmZXIubnVtYmVyT2ZDaGFubmVscyAqIEJZVEVTX1BFUl9TQU1QTEUgK1xuICAgICAgV0FWX0hFQURFUl9MRU5HVEhfQllURVM7XG5cbiAgICBjb25zdCBhcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihmaWxlU2l6ZUJ5dGVzKTtcbiAgICB0aGlzLndyaXRlV2F2SGVhZGVyKHtcbiAgICAgIGFycmF5QnVmZmVyLFxuICAgICAgY2hhbm5lbENvdW50OiBhdWRpb0J1ZmZlci5udW1iZXJPZkNoYW5uZWxzLFxuICAgICAgc2FtcGxlUmF0ZTogdGhpcy5jb25maWcuc2FtcGxlUmF0ZSxcbiAgICB9KTtcbiAgICB0aGlzLndyaXRlV2F2QXVkaW9EYXRhKHtcbiAgICAgIGFycmF5QnVmZmVyLFxuICAgICAgZGF0YUJ5Q2hhbm5lbDogdGhpcy5zcGxpdERhdGFCeUNoYW5uZWwoYXVkaW9CdWZmZXIpLFxuICAgIH0pO1xuICAgIHJldHVybiBuZXcgQmxvYihbYXJyYXlCdWZmZXJdLCB7IHR5cGU6ICdhdWRpby93YXYnIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlbmRlckF1ZGlvKGF1ZGlvQnVmZmVyOiBBdWRpb0J1ZmZlciwgc2FtcGxlUmF0ZTogbnVtYmVyKSB7XG4gICAgY29uc3Qgb2ZmbGluZUF1ZGlvQ3R4ID0gbmV3IE9mZmxpbmVBdWRpb0NvbnRleHQoXG4gICAgICBhdWRpb0J1ZmZlci5udW1iZXJPZkNoYW5uZWxzLFxuICAgICAgYXVkaW9CdWZmZXIuZHVyYXRpb24gKiBzYW1wbGVSYXRlLFxuICAgICAgc2FtcGxlUmF0ZSxcbiAgICApO1xuICAgIGNvbnN0IHNvdXJjZSA9IG9mZmxpbmVBdWRpb0N0eC5jcmVhdGVCdWZmZXJTb3VyY2UoKTtcbiAgICBzb3VyY2UuYnVmZmVyID0gYXVkaW9CdWZmZXI7XG4gICAgc291cmNlLmNvbm5lY3Qob2ZmbGluZUF1ZGlvQ3R4LmRlc3RpbmF0aW9uKTtcbiAgICBzb3VyY2Uuc3RhcnQoKTtcblxuICAgIHJldHVybiBhd2FpdCBvZmZsaW5lQXVkaW9DdHguc3RhcnRSZW5kZXJpbmcoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyB0b0F1ZGlvQnVmZmVyKGJsb2I6IEJsb2IpIHtcbiAgICBjb25zdCBhdWRpb0N0eCA9IG5ldyBBdWRpb0NvbnRleHQoKTtcblxuICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgcmVhZEJsb2JBc0FycmF5QnVmZmVyKGJsb2IpO1xuICAgIGNvbnN0IGRlY29kZWREYXRhID0gYXdhaXQgYXVkaW9DdHguZGVjb2RlQXVkaW9EYXRhKGFycmF5QnVmZmVyKTtcbiAgICBpZiAoYXVkaW9DdHguc3RhdGUgIT09ICdjbG9zZWQnKSBhd2FpdCBhdWRpb0N0eC5jbG9zZSgpO1xuICAgIHJldHVybiBkZWNvZGVkRGF0YTtcbiAgfVxuXG4gIHByb3RlY3RlZCB3cml0ZVdhdkF1ZGlvRGF0YSh7XG4gICAgYXJyYXlCdWZmZXIsXG4gICAgZGF0YUJ5Q2hhbm5lbCxcbiAgfTogV3JpdGVBdWRpb0RhdGFQYXJhbXMpIHtcbiAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhhcnJheUJ1ZmZlcik7XG4gICAgY29uc3QgY2hhbm5lbENvdW50ID0gZGF0YUJ5Q2hhbm5lbC5sZW5ndGg7XG5cbiAgICBkYXRhQnlDaGFubmVsLmZvckVhY2goKGNoYW5uZWxEYXRhLCBjaGFubmVsSW5kZXgpID0+IHtcbiAgICAgIGxldCB3cml0ZU9mZnNldCA9IFdBVl9IRUFERVJfTEVOR1RIX0JZVEVTICsgY2hhbm5lbENvdW50ICogY2hhbm5lbEluZGV4O1xuXG4gICAgICBjaGFubmVsRGF0YS5mb3JFYWNoKChmbG9hdDMyVmFsdWUpID0+IHtcbiAgICAgICAgZGF0YVZpZXcuc2V0SW50MTYoXG4gICAgICAgICAgd3JpdGVPZmZzZXQsXG4gICAgICAgICAgZmxvYXQzMlZhbHVlIDwgMFxuICAgICAgICAgICAgPyBNYXRoLm1heCgtMSwgZmxvYXQzMlZhbHVlKSAqIDMyNzY4XG4gICAgICAgICAgICA6IE1hdGgubWluKDEsIGZsb2F0MzJWYWx1ZSkgKiAzMjc2NyxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICApO1xuICAgICAgICB3cml0ZU9mZnNldCArPSBjaGFubmVsQ291bnQgKiBCWVRFU19QRVJfU0FNUExFO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgd3JpdGVXYXZIZWFkZXIoe1xuICAgIGFycmF5QnVmZmVyLFxuICAgIGNoYW5uZWxDb3VudCxcbiAgICBzYW1wbGVSYXRlLFxuICB9OiBXcml0ZVdhdmVIZWFkZXJQYXJhbXMpIHtcbiAgICBjb25zdCBieXRlUmF0ZSA9IHNhbXBsZVJhdGUgKiBjaGFubmVsQ291bnQgKiBCWVRFU19QRVJfU0FNUExFOyAvLyBieXRlcy9zZWNcbiAgICBjb25zdCBibG9ja0FsaWduID0gY2hhbm5lbENvdW50ICogQllURVNfUEVSX1NBTVBMRTtcblxuICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyKTtcbiAgICAvKlxuICAgICAqIFRoZSBtYXhpbXVtIHNpemUgb2YgYSBSSUZGIGZpbGUgaXMgNDI5NDk2NzI5NSBieXRlcyBhbmQgc2luY2UgdGhlIGhlYWRlciB0YWtlcyB1cCA0NCBieXRlcyB0aGVyZSBhcmUgNDI5NDk2NzI1MSBieXRlcyBsZWZ0IGZvciB0aGVcbiAgICAgKiBkYXRhIGNodW5rLlxuICAgICAqL1xuICAgIGNvbnN0IGRhdGFDaHVua1NpemUgPSBNYXRoLm1pbihcbiAgICAgIGRhdGFWaWV3LmJ5dGVMZW5ndGggLSBXQVZfSEVBREVSX0xFTkdUSF9CWVRFUyxcbiAgICAgIFJJRkZfRklMRV9NQVhfQllURVMgLSBXQVZfSEVBREVSX0xFTkdUSF9CWVRFUyxcbiAgICApO1xuXG4gICAgZGF0YVZpZXcuc2V0VWludDMyKEhFQURFUi5DSFVOS19JRC5vZmZzZXQsIEhFQURFUi5DSFVOS19JRC52YWx1ZSk7IC8vIFwiUklGRlwiXG4gICAgZGF0YVZpZXcuc2V0VWludDMyKFxuICAgICAgSEVBREVSLkNIVU5LX1NJWkUub2Zmc2V0LFxuICAgICAgYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCAtIDgsXG4gICAgICB0cnVlLFxuICAgICk7IC8vIGFkanVzdG1lbnQgZm9yIHRoZSBmaXJzdCB0d28gaGVhZGVycyAtIGNodW5rIGlkICsgZmlsZSBzaXplXG4gICAgZGF0YVZpZXcuc2V0VWludDMyKEhFQURFUi5GSUxFX0ZPUk1BVC5vZmZzZXQsIEhFQURFUi5GSUxFX0ZPUk1BVC52YWx1ZSk7IC8vIFwiV0FWRVwiXG5cbiAgICBkYXRhVmlldy5zZXRVaW50MzIoSEVBREVSLlNVQkNIVU5LMV9JRC5vZmZzZXQsIEhFQURFUi5TVUJDSFVOSzFfSUQudmFsdWUpOyAvLyBcImZtdCBcIlxuICAgIGRhdGFWaWV3LnNldFVpbnQzMihcbiAgICAgIEhFQURFUi5TVUJDSFVOSzFfU0laRS5vZmZzZXQsXG4gICAgICBIRUFERVIuU1VCQ0hVTksxX1NJWkUudmFsdWUsXG4gICAgICB0cnVlLFxuICAgICk7XG4gICAgZGF0YVZpZXcuc2V0VWludDE2KFxuICAgICAgSEVBREVSLkFVRElPX0ZPUk1BVC5vZmZzZXQsXG4gICAgICBIRUFERVIuQVVESU9fRk9STUFULnZhbHVlLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICAgIGRhdGFWaWV3LnNldFVpbnQxNihIRUFERVIuQ0hBTk5FTF9DT1VOVC5vZmZzZXQsIGNoYW5uZWxDb3VudCwgdHJ1ZSk7XG4gICAgZGF0YVZpZXcuc2V0VWludDMyKEhFQURFUi5TQU1QTEVfUkFURS5vZmZzZXQsIHNhbXBsZVJhdGUsIHRydWUpO1xuICAgIGRhdGFWaWV3LnNldFVpbnQzMihIRUFERVIuQllURV9SQVRFLm9mZnNldCwgYnl0ZVJhdGUsIHRydWUpO1xuICAgIGRhdGFWaWV3LnNldFVpbnQxNihIRUFERVIuQkxPQ0tfQUxJR04ub2Zmc2V0LCBibG9ja0FsaWduLCB0cnVlKTtcbiAgICBkYXRhVmlldy5zZXRVaW50MTYoXG4gICAgICBIRUFERVIuQklUU19QRVJfU0FNUExFLm9mZnNldCxcbiAgICAgIEhFQURFUi5CSVRTX1BFUl9TQU1QTEUudmFsdWUsXG4gICAgICB0cnVlLFxuICAgICk7XG5cbiAgICBkYXRhVmlldy5zZXRVaW50MzIoSEVBREVSLlNVQkNIVU5LMl9JRC5vZmZzZXQsIEhFQURFUi5TVUJDSFVOSzJfSUQudmFsdWUpOyAvLyBcImRhdGFcIlxuICAgIGRhdGFWaWV3LnNldFVpbnQzMihIRUFERVIuU1VCQ0hVTksyX1NJWkUub2Zmc2V0LCBkYXRhQ2h1bmtTaXplLCB0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzcGxpdERhdGFCeUNoYW5uZWwgPSAoYXVkaW9CdWZmZXI6IEF1ZGlvQnVmZmVyKSA9PlxuICAgIEFycmF5LmZyb20oeyBsZW5ndGg6IGF1ZGlvQnVmZmVyLm51bWJlck9mQ2hhbm5lbHMgfSwgKF8sIGkpID0+XG4gICAgICBhdWRpb0J1ZmZlci5nZXRDaGFubmVsRGF0YShpKSxcbiAgICApO1xufVxuIl19
@@ -1,32 +0,0 @@
1
- import { Component } from '@angular/core';
2
- import { formatDuration } from '../../format-duration';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "../amplitude-recorder.service";
5
- import * as i2 from "../audio-recorder.service";
6
- import * as i3 from "@angular/common";
7
- /**
8
- * The `VoiceRecorderWavebarComponent` displays the amplitudes of the recording while the recoding is in progress
9
- */
10
- export class VoiceRecorderWavebarComponent {
11
- constructor(amplitudeRecorder, audioRecorder) {
12
- this.amplitudeRecorder = amplitudeRecorder;
13
- this.audioRecorder = audioRecorder;
14
- this.isLongerThanOneHour = false;
15
- this.amplitudes$ = this.amplitudeRecorder.amplitudes$;
16
- this.formattedDuration = formatDuration(this.audioRecorder.durationMs / 1000);
17
- this.durationComputeInterval = setInterval(() => {
18
- this.isLongerThanOneHour = this.audioRecorder.durationMs / 1000 > 3600;
19
- this.formattedDuration = formatDuration(this.audioRecorder.durationMs / 1000);
20
- }, 1000);
21
- }
22
- ngOnDestroy() {
23
- clearInterval(this.durationComputeInterval);
24
- }
25
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: VoiceRecorderWavebarComponent, deps: [{ token: i1.AmplitudeRecorderService }, { token: i2.AudioRecorderService }], target: i0.ɵɵFactoryTarget.Component }); }
26
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.0", type: VoiceRecorderWavebarComponent, selector: "stream-voice-recorder-wavebar", ngImport: i0, template: "<div\n class=\"str-chat__recording-timer\"\n [class.str-chat__recording-timer--hours]=\"isLongerThanOneHour\"\n>\n {{ formattedDuration }}\n</div>\n<div class=\"str-chat__waveform-box-container\">\n <div class=\"str-chat__audio_recorder__waveform-box\">\n @for (amplitude of amplitudes$ | async; track $index) {\n <div\n class=\"str-chat__wave-progress-bar__amplitude-bar\"\n [style.--str-chat__wave-progress-bar__amplitude-bar-height]=\"\n (amplitude ?? 0) * 100 + '%'\n \"\n ></div>\n }\n </div>\n</div>\n", dependencies: [{ kind: "pipe", type: i3.AsyncPipe, name: "async" }] }); }
27
- }
28
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: VoiceRecorderWavebarComponent, decorators: [{
29
- type: Component,
30
- args: [{ selector: 'stream-voice-recorder-wavebar', template: "<div\n class=\"str-chat__recording-timer\"\n [class.str-chat__recording-timer--hours]=\"isLongerThanOneHour\"\n>\n {{ formattedDuration }}\n</div>\n<div class=\"str-chat__waveform-box-container\">\n <div class=\"str-chat__audio_recorder__waveform-box\">\n @for (amplitude of amplitudes$ | async; track $index) {\n <div\n class=\"str-chat__wave-progress-bar__amplitude-bar\"\n [style.--str-chat__wave-progress-bar__amplitude-bar-height]=\"\n (amplitude ?? 0) * 100 + '%'\n \"\n ></div>\n }\n </div>\n</div>\n" }]
31
- }], ctorParameters: () => [{ type: i1.AmplitudeRecorderService }, { type: i2.AudioRecorderService }] });
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UtcmVjb3JkZXItd2F2ZWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvdm9pY2UtcmVjb3JkZXIvdm9pY2UtcmVjb3JkZXItd2F2ZWJhci92b2ljZS1yZWNvcmRlci13YXZlYmFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi92b2ljZS1yZWNvcmRlci92b2ljZS1yZWNvcmRlci13YXZlYmFyL3ZvaWNlLXJlY29yZGVyLXdhdmViYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUlyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7O0FBRXZEOztHQUVHO0FBTUgsTUFBTSxPQUFPLDZCQUE2QjtJQU14QyxZQUNVLGlCQUEyQyxFQUMzQyxhQUFtQztRQURuQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQTBCO1FBQzNDLGtCQUFhLEdBQWIsYUFBYSxDQUFzQjtRQUo3Qyx3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFNMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDO1FBQ3RELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxjQUFjLENBQ3JDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxHQUFHLElBQUksQ0FDckMsQ0FBQztRQUNGLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQzlDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxjQUFjLENBQ3JDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxHQUFHLElBQUksQ0FDckMsQ0FBQztRQUNKLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxXQUFXO1FBQ1QsYUFBYSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQzlDLENBQUM7OEdBeEJVLDZCQUE2QjtrR0FBN0IsNkJBQTZCLHFFQ2QxQyxnakJBa0JBOzsyRkRKYSw2QkFBNkI7a0JBTHpDLFNBQVM7K0JBQ0UsK0JBQStCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFtcGxpdHVkZVJlY29yZGVyU2VydmljZSB9IGZyb20gJy4uL2FtcGxpdHVkZS1yZWNvcmRlci5zZXJ2aWNlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEF1ZGlvUmVjb3JkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vYXVkaW8tcmVjb3JkZXIuc2VydmljZSc7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvbiB9IGZyb20gJy4uLy4uL2Zvcm1hdC1kdXJhdGlvbic7XG5cbi8qKlxuICogVGhlIGBWb2ljZVJlY29yZGVyV2F2ZWJhckNvbXBvbmVudGAgZGlzcGxheXMgdGhlIGFtcGxpdHVkZXMgb2YgdGhlIHJlY29yZGluZyB3aGlsZSB0aGUgcmVjb2RpbmcgaXMgaW4gcHJvZ3Jlc3NcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3RyZWFtLXZvaWNlLXJlY29yZGVyLXdhdmViYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdm9pY2UtcmVjb3JkZXItd2F2ZWJhci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlczogW10sXG59KVxuZXhwb3J0IGNsYXNzIFZvaWNlUmVjb3JkZXJXYXZlYmFyQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgYW1wbGl0dWRlcyQ6IE9ic2VydmFibGU8bnVtYmVyW10+O1xuICBmb3JtYXR0ZWREdXJhdGlvbjogc3RyaW5nO1xuICBkdXJhdGlvbkNvbXB1dGVJbnRlcnZhbDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+O1xuICBpc0xvbmdlclRoYW5PbmVIb3VyID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhbXBsaXR1ZGVSZWNvcmRlcjogQW1wbGl0dWRlUmVjb3JkZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXVkaW9SZWNvcmRlcjogQXVkaW9SZWNvcmRlclNlcnZpY2UsXG4gICkge1xuICAgIHRoaXMuYW1wbGl0dWRlcyQgPSB0aGlzLmFtcGxpdHVkZVJlY29yZGVyLmFtcGxpdHVkZXMkO1xuICAgIHRoaXMuZm9ybWF0dGVkRHVyYXRpb24gPSBmb3JtYXREdXJhdGlvbihcbiAgICAgIHRoaXMuYXVkaW9SZWNvcmRlci5kdXJhdGlvbk1zIC8gMTAwMCxcbiAgICApO1xuICAgIHRoaXMuZHVyYXRpb25Db21wdXRlSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLmlzTG9uZ2VyVGhhbk9uZUhvdXIgPSB0aGlzLmF1ZGlvUmVjb3JkZXIuZHVyYXRpb25NcyAvIDEwMDAgPiAzNjAwO1xuICAgICAgdGhpcy5mb3JtYXR0ZWREdXJhdGlvbiA9IGZvcm1hdER1cmF0aW9uKFxuICAgICAgICB0aGlzLmF1ZGlvUmVjb3JkZXIuZHVyYXRpb25NcyAvIDEwMDAsXG4gICAgICApO1xuICAgIH0sIDEwMDApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLmR1cmF0aW9uQ29tcHV0ZUludGVydmFsKTtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cInN0ci1jaGF0X19yZWNvcmRpbmctdGltZXJcIlxuICBbY2xhc3Muc3RyLWNoYXRfX3JlY29yZGluZy10aW1lci0taG91cnNdPVwiaXNMb25nZXJUaGFuT25lSG91clwiXG4+XG4gIHt7IGZvcm1hdHRlZER1cmF0aW9uIH19XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJzdHItY2hhdF9fd2F2ZWZvcm0tYm94LWNvbnRhaW5lclwiPlxuICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX2F1ZGlvX3JlY29yZGVyX193YXZlZm9ybS1ib3hcIj5cbiAgICBAZm9yIChhbXBsaXR1ZGUgb2YgYW1wbGl0dWRlcyQgfCBhc3luYzsgdHJhY2sgJGluZGV4KSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3dhdmUtcHJvZ3Jlc3MtYmFyX19hbXBsaXR1ZGUtYmFyXCJcbiAgICAgICAgW3N0eWxlLi0tc3RyLWNoYXRfX3dhdmUtcHJvZ3Jlc3MtYmFyX19hbXBsaXR1ZGUtYmFyLWhlaWdodF09XCJcbiAgICAgICAgICAoYW1wbGl0dWRlID8/IDApICogMTAwICsgJyUnXG4gICAgICAgIFwiXG4gICAgICA+PC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbjwvZGl2PlxuIl19