mediasfu-angular 1.0.2 → 2.0.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 (281) hide show
  1. package/README.md +686 -578
  2. package/dist/README.md +677 -578
  3. package/dist/fesm2022/mediasfu-angular.mjs +5551 -2944
  4. package/dist/fesm2022/mediasfu-angular.mjs.map +1 -1
  5. package/dist/lib/@types/types.d.ts +22 -1
  6. package/dist/lib/components/breakout-components/breakout-rooms-modal.component.d.ts +1 -0
  7. package/dist/lib/components/mediasfu-components/mediasfu-broadcast.component.d.ts +153 -61
  8. package/dist/lib/components/mediasfu-components/mediasfu-chat.component.d.ts +154 -66
  9. package/dist/lib/components/mediasfu-components/mediasfu-conference.component.d.ts +190 -76
  10. package/dist/lib/components/mediasfu-components/mediasfu-generic.component.d.ts +184 -70
  11. package/dist/lib/components/mediasfu-components/mediasfu-webinar.component.d.ts +192 -78
  12. package/dist/lib/components/menu-components/menu-modal/menu-modal.component.d.ts +6 -1
  13. package/dist/lib/components/menu-components/share-buttons-component/share-buttons-component.component.d.ts +5 -2
  14. package/dist/lib/components/misc-components/confirm-here-modal/confirm-here-modal.component.d.ts +4 -2
  15. package/dist/lib/components/misc-components/pre-join-page/pre-join-page.component.d.ts +71 -66
  16. package/dist/lib/components/misc-components/share-event-modal/share-event-modal.component.d.ts +5 -1
  17. package/dist/lib/consumers/connect-local-ips.service.d.ts +81 -0
  18. package/dist/lib/consumers/connect-send-transport-audio.service.d.ts +43 -11
  19. package/dist/lib/consumers/connect-send-transport-screen.service.d.ts +87 -46
  20. package/dist/lib/consumers/connect-send-transport-video.service.d.ts +89 -43
  21. package/dist/lib/consumers/connect-send-transport.service.d.ts +5 -1
  22. package/dist/lib/consumers/create-send-transport.service.d.ts +130 -40
  23. package/dist/lib/consumers/disconnect-send-transport-audio.service.d.ts +77 -40
  24. package/dist/lib/consumers/disconnect-send-transport-screen.service.d.ts +48 -14
  25. package/dist/lib/consumers/disconnect-send-transport-video.service.d.ts +81 -44
  26. package/dist/lib/consumers/get-piped-producers-alt.service.d.ts +5 -1
  27. package/dist/lib/consumers/receive-all-piped-transports.service.d.ts +5 -1
  28. package/dist/lib/consumers/resume-send-transport-audio.service.d.ts +54 -21
  29. package/dist/lib/consumers/stream-success-audio-switch.service.d.ts +124 -40
  30. package/dist/lib/consumers/trigger.service.d.ts +3 -0
  31. package/dist/lib/methods/exit-methods/confirm-exit.service.d.ts +5 -1
  32. package/dist/lib/methods/recording-methods/start-recording.service.d.ts +3 -0
  33. package/dist/lib/methods/recording-methods/stop-recording.service.d.ts +4 -1
  34. package/dist/lib/methods/recording-methods/update-recording.service.d.ts +3 -0
  35. package/dist/lib/methods/stream-methods/click-audio.service.d.ts +3 -0
  36. package/dist/lib/methods/utils/check-limits-and-make-request.service.d.ts +23 -0
  37. package/dist/lib/methods/utils/create-response-join-room.util.d.ts +33 -0
  38. package/dist/lib/methods/utils/create-room-on-media-sfu.service.d.ts +25 -0
  39. package/dist/lib/methods/utils/initial-values.util.d.ts +6 -0
  40. package/dist/lib/methods/utils/join-room-on-media-sfu.service.d.ts +52 -0
  41. package/dist/lib/methods/whiteboard-methods/capture-canvas-stream.service.d.ts +37 -20
  42. package/dist/lib/producers/producer-emits/join-local-room.service.d.ts +125 -0
  43. package/dist/lib/producers/socket-receive-methods/all-members-rest.service.d.ts +7 -2
  44. package/dist/lib/producers/socket-receive-methods/all-members.service.d.ts +7 -2
  45. package/dist/lib/producers/socket-receive-methods/disconnect-user-self.service.d.ts +5 -1
  46. package/dist/lib/sockets/socket-manager.service.d.ts +90 -0
  47. package/dist/public-api.d.ts +11 -1
  48. package/package.json +17 -20
  49. package/dist/esm2022/lib/@types/types.mjs +0 -2
  50. package/dist/esm2022/lib/components/background-components/background-modal/background-modal.component.mjs +0 -799
  51. package/dist/esm2022/lib/components/breakout-components/breakout-rooms-modal.component.mjs +0 -366
  52. package/dist/esm2022/lib/components/breakout-components/edit-room-modal/edit-room-modal.component.mjs +0 -143
  53. package/dist/esm2022/lib/components/breakout-components/room-list/room-list.component.mjs +0 -40
  54. package/dist/esm2022/lib/components/co-host-components/co-host-modal/co-host-modal.component.mjs +0 -245
  55. package/dist/esm2022/lib/components/display-components/alert-component/alert.component.component.mjs +0 -79
  56. package/dist/esm2022/lib/components/display-components/audio-card/audio-card.component.mjs +0 -356
  57. package/dist/esm2022/lib/components/display-components/audio-grid/audio-grid.component.mjs +0 -80
  58. package/dist/esm2022/lib/components/display-components/card-video-display/card-video-display.component.mjs +0 -129
  59. package/dist/esm2022/lib/components/display-components/control-buttons-alt-component/control-buttons-alt-component.component.mjs +0 -138
  60. package/dist/esm2022/lib/components/display-components/control-buttons-component/control-buttons-component.component.mjs +0 -231
  61. package/dist/esm2022/lib/components/display-components/control-buttons-component-touch/control-buttons-component-touch.component.mjs +0 -282
  62. package/dist/esm2022/lib/components/display-components/control-widgets/menu-participants-widget.component.mjs +0 -82
  63. package/dist/esm2022/lib/components/display-components/control-widgets/menu-record-widget.component.mjs +0 -65
  64. package/dist/esm2022/lib/components/display-components/control-widgets/menu-widget.component.mjs +0 -137
  65. package/dist/esm2022/lib/components/display-components/control-widgets/message-widget.component.mjs +0 -137
  66. package/dist/esm2022/lib/components/display-components/control-widgets/record-timer-widget.component.mjs +0 -51
  67. package/dist/esm2022/lib/components/display-components/control-widgets/screenshare-widget.component.mjs +0 -101
  68. package/dist/esm2022/lib/components/display-components/flexible-grid/flexible-grid.component.mjs +0 -151
  69. package/dist/esm2022/lib/components/display-components/flexible-video/flexible-video.component.mjs +0 -250
  70. package/dist/esm2022/lib/components/display-components/loading-modal/loading-modal.component.mjs +0 -102
  71. package/dist/esm2022/lib/components/display-components/main-aspect-component/main-aspect-component.component.mjs +0 -140
  72. package/dist/esm2022/lib/components/display-components/main-container-component/main-container-component.component.mjs +0 -131
  73. package/dist/esm2022/lib/components/display-components/main-grid-component/main-grid-component.component.mjs +0 -120
  74. package/dist/esm2022/lib/components/display-components/main-screen-component/main-screen-component.component.mjs +0 -201
  75. package/dist/esm2022/lib/components/display-components/meeting-progress-timer/meeting-progress-timer.component.mjs +0 -115
  76. package/dist/esm2022/lib/components/display-components/mini-audio/mini-audio.component.mjs +0 -319
  77. package/dist/esm2022/lib/components/display-components/mini-card/mini-card.component.mjs +0 -161
  78. package/dist/esm2022/lib/components/display-components/mini-card-audio/mini-card-audio.component.mjs +0 -230
  79. package/dist/esm2022/lib/components/display-components/other-grid-component/other-grid-component.component.mjs +0 -126
  80. package/dist/esm2022/lib/components/display-components/pagination/pagination.component.mjs +0 -334
  81. package/dist/esm2022/lib/components/display-components/sub-aspect-component/sub-aspect-component.component.mjs +0 -112
  82. package/dist/esm2022/lib/components/display-components/video-card/video-card.component.mjs +0 -392
  83. package/dist/esm2022/lib/components/display-settings-components/display-settings-modal.component.mjs +0 -106
  84. package/dist/esm2022/lib/components/event-settings-components/event-settings-modal/event-settings-modal.component.mjs +0 -199
  85. package/dist/esm2022/lib/components/exit-components/confirm-exit-modal/confirm-exit-modal.component.mjs +0 -132
  86. package/dist/esm2022/lib/components/media-settings-components/media-settings-modal/media-settings-modal.component.mjs +0 -220
  87. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-broadcast.component.mjs +0 -4238
  88. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-chat.component.mjs +0 -3754
  89. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-conference.component.mjs +0 -5071
  90. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-generic.component.mjs +0 -5380
  91. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-webinar.component.mjs +0 -5068
  92. package/dist/esm2022/lib/components/menu-components/custom-buttons/custom-buttons.component.mjs +0 -83
  93. package/dist/esm2022/lib/components/menu-components/meeting-id-component/meeting-id-component.component.mjs +0 -27
  94. package/dist/esm2022/lib/components/menu-components/meeting-passcode-component/meeting-passcode-component.component.mjs +0 -27
  95. package/dist/esm2022/lib/components/menu-components/menu-modal/menu-modal.component.mjs +0 -125
  96. package/dist/esm2022/lib/components/menu-components/share-buttons-component/share-buttons-component.component.mjs +0 -106
  97. package/dist/esm2022/lib/components/message-components/message-panel/message-panel.component.mjs +0 -228
  98. package/dist/esm2022/lib/components/message-components/messages-modal/messages-modal.component.mjs +0 -277
  99. package/dist/esm2022/lib/components/misc-components/confirm-here-modal/confirm-here-modal.component.mjs +0 -130
  100. package/dist/esm2022/lib/components/misc-components/pre-join-page/pre-join-page.component.mjs +0 -343
  101. package/dist/esm2022/lib/components/misc-components/share-event-modal/share-event-modal.component.mjs +0 -127
  102. package/dist/esm2022/lib/components/misc-components/welcome-page/welcome-page.component.mjs +0 -241
  103. package/dist/esm2022/lib/components/participants-components/participant-list/participant-list.component.mjs +0 -82
  104. package/dist/esm2022/lib/components/participants-components/participant-list-item/participant-list-item.component.mjs +0 -139
  105. package/dist/esm2022/lib/components/participants-components/participant-list-others/participant-list-others.component.mjs +0 -40
  106. package/dist/esm2022/lib/components/participants-components/participant-list-others-item/participant-list-others-item.component.mjs +0 -60
  107. package/dist/esm2022/lib/components/participants-components/participants-modal/participants-modal.component.mjs +0 -124
  108. package/dist/esm2022/lib/components/polls-components/poll-modal/poll-modal.component.mjs +0 -201
  109. package/dist/esm2022/lib/components/recording-components/advanced-panel-component/advanced-panel-components.component.mjs +0 -92
  110. package/dist/esm2022/lib/components/recording-components/recording-modal/recording-modal.component.mjs +0 -133
  111. package/dist/esm2022/lib/components/recording-components/standard-panel-component/standard-panel-component.component.mjs +0 -90
  112. package/dist/esm2022/lib/components/requests-components/render-request-component/render-request-component.component.mjs +0 -81
  113. package/dist/esm2022/lib/components/requests-components/requests-modal/requests-modal.component.mjs +0 -147
  114. package/dist/esm2022/lib/components/screenboard-components/screenboard/screenboard.component.mjs +0 -627
  115. package/dist/esm2022/lib/components/screenboard-components/screenboard-modal/screenboard-modal.component.mjs +0 -391
  116. package/dist/esm2022/lib/components/waiting-components/waiting-room-modal.component.mjs +0 -201
  117. package/dist/esm2022/lib/components/whiteboard-components/configure-whiteboard-modal/configure-whiteboard-modal.component.mjs +0 -286
  118. package/dist/esm2022/lib/components/whiteboard-components/whiteboard/whiteboard.component.mjs +0 -1833
  119. package/dist/esm2022/lib/consumers/add-videos-grid.service.mjs +0 -345
  120. package/dist/esm2022/lib/consumers/auto-adjust.service.mjs +0 -109
  121. package/dist/esm2022/lib/consumers/calculate-rows-and-columns.service.mjs +0 -60
  122. package/dist/esm2022/lib/consumers/change-vids.service.mjs +0 -551
  123. package/dist/esm2022/lib/consumers/check-grid.service.mjs +0 -93
  124. package/dist/esm2022/lib/consumers/check-permission.service.mjs +0 -105
  125. package/dist/esm2022/lib/consumers/check-screen-share.service.mjs +0 -106
  126. package/dist/esm2022/lib/consumers/close-and-resize.service.mjs +0 -331
  127. package/dist/esm2022/lib/consumers/compare-active-names.service.mjs +0 -106
  128. package/dist/esm2022/lib/consumers/compare-screen-states.service.mjs +0 -98
  129. package/dist/esm2022/lib/consumers/connect-ips.service.mjs +0 -154
  130. package/dist/esm2022/lib/consumers/connect-recv-transport.service.mjs +0 -146
  131. package/dist/esm2022/lib/consumers/connect-send-transport-audio.service.mjs +0 -84
  132. package/dist/esm2022/lib/consumers/connect-send-transport-screen.service.mjs +0 -102
  133. package/dist/esm2022/lib/consumers/connect-send-transport-video.service.mjs +0 -99
  134. package/dist/esm2022/lib/consumers/connect-send-transport.service.mjs +0 -140
  135. package/dist/esm2022/lib/consumers/consumer-resume.service.mjs +0 -368
  136. package/dist/esm2022/lib/consumers/control-media.service.mjs +0 -113
  137. package/dist/esm2022/lib/consumers/create-send-transport.service.mjs +0 -172
  138. package/dist/esm2022/lib/consumers/disconnect-send-transport-audio.service.mjs +0 -108
  139. package/dist/esm2022/lib/consumers/disconnect-send-transport-screen.service.mjs +0 -84
  140. package/dist/esm2022/lib/consumers/disconnect-send-transport-video.service.mjs +0 -101
  141. package/dist/esm2022/lib/consumers/disp-streams.service.mjs +0 -513
  142. package/dist/esm2022/lib/consumers/generate-page-content.service.mjs +0 -106
  143. package/dist/esm2022/lib/consumers/get-estimate.service.mjs +0 -120
  144. package/dist/esm2022/lib/consumers/get-piped-producers-alt.service.mjs +0 -82
  145. package/dist/esm2022/lib/consumers/get-producers-piped.service.mjs +0 -79
  146. package/dist/esm2022/lib/consumers/get-videos.service.mjs +0 -91
  147. package/dist/esm2022/lib/consumers/mix-streams.service.mjs +0 -95
  148. package/dist/esm2022/lib/consumers/on-screen-changes.service.mjs +0 -103
  149. package/dist/esm2022/lib/consumers/prepopulate-user-media.service.mjs +0 -541
  150. package/dist/esm2022/lib/consumers/process-consumer-transports-audio.service.mjs +0 -101
  151. package/dist/esm2022/lib/consumers/process-consumer-transports.service.mjs +0 -128
  152. package/dist/esm2022/lib/consumers/re-port.service.mjs +0 -114
  153. package/dist/esm2022/lib/consumers/re-update-inter.service.mjs +0 -239
  154. package/dist/esm2022/lib/consumers/readjust.service.mjs +0 -173
  155. package/dist/esm2022/lib/consumers/receive-all-piped-transports.service.mjs +0 -87
  156. package/dist/esm2022/lib/consumers/receive-room-messages.service.mjs +0 -69
  157. package/dist/esm2022/lib/consumers/reorder-streams.service.mjs +0 -239
  158. package/dist/esm2022/lib/consumers/request-screen-share.service.mjs +0 -101
  159. package/dist/esm2022/lib/consumers/resume-pause-audio-streams.service.mjs +0 -150
  160. package/dist/esm2022/lib/consumers/resume-pause-streams.service.mjs +0 -103
  161. package/dist/esm2022/lib/consumers/resume-send-transport-audio.service.mjs +0 -91
  162. package/dist/esm2022/lib/consumers/signal-new-consumer-transport.service.mjs +0 -136
  163. package/dist/esm2022/lib/consumers/socket-receive-methods/join-consume-room.service.mjs +0 -96
  164. package/dist/esm2022/lib/consumers/socket-receive-methods/new-pipe-producer.service.mjs +0 -100
  165. package/dist/esm2022/lib/consumers/socket-receive-methods/producer-closed.service.mjs +0 -78
  166. package/dist/esm2022/lib/consumers/start-share-screen.service.mjs +0 -120
  167. package/dist/esm2022/lib/consumers/stop-share-screen.service.mjs +0 -175
  168. package/dist/esm2022/lib/consumers/stream-success-audio-switch.service.mjs +0 -185
  169. package/dist/esm2022/lib/consumers/stream-success-audio.service.mjs +0 -210
  170. package/dist/esm2022/lib/consumers/stream-success-screen.service.mjs +0 -193
  171. package/dist/esm2022/lib/consumers/stream-success-video.service.mjs +0 -260
  172. package/dist/esm2022/lib/consumers/switch-user-audio.service.mjs +0 -120
  173. package/dist/esm2022/lib/consumers/switch-user-video-alt.service.mjs +0 -260
  174. package/dist/esm2022/lib/consumers/switch-user-video.service.mjs +0 -172
  175. package/dist/esm2022/lib/consumers/trigger.service.mjs +0 -210
  176. package/dist/esm2022/lib/consumers/update-mini-cards-grid.service.mjs +0 -135
  177. package/dist/esm2022/lib/consumers/update-participant-audio-decibels.service.mjs +0 -84
  178. package/dist/esm2022/lib/methods/background-methods/launch-background.service.mjs +0 -48
  179. package/dist/esm2022/lib/methods/breakout-room-methods/breakout-room-updated.service.mjs +0 -183
  180. package/dist/esm2022/lib/methods/breakout-room-methods/launch-breakout-rooms.service.mjs +0 -46
  181. package/dist/esm2022/lib/methods/co-host-methods/launch-co-host.service.mjs +0 -46
  182. package/dist/esm2022/lib/methods/co-host-methods/modify-co-host-settings.service.mjs +0 -104
  183. package/dist/esm2022/lib/methods/display-settings-methods/launch-display-settings.service.mjs +0 -46
  184. package/dist/esm2022/lib/methods/display-settings-methods/modify-display-settings.service.mjs +0 -194
  185. package/dist/esm2022/lib/methods/exit-methods/confirm-exit.service.mjs +0 -52
  186. package/dist/esm2022/lib/methods/exit-methods/launch-confirm-exit.service.mjs +0 -42
  187. package/dist/esm2022/lib/methods/media-settings-methods/launch-media-settings.service.mjs +0 -85
  188. package/dist/esm2022/lib/methods/menu-methods/launch-menu-modal.service.mjs +0 -44
  189. package/dist/esm2022/lib/methods/message-methods/launch-messages.service.mjs +0 -45
  190. package/dist/esm2022/lib/methods/message-methods/send-message.service.mjs +0 -143
  191. package/dist/esm2022/lib/methods/participants-methods/launch-participants.service.mjs +0 -47
  192. package/dist/esm2022/lib/methods/participants-methods/message-participants.service.mjs +0 -98
  193. package/dist/esm2022/lib/methods/participants-methods/mute-participants.service.mjs +0 -96
  194. package/dist/esm2022/lib/methods/participants-methods/remove-participants.service.mjs +0 -107
  195. package/dist/esm2022/lib/methods/polls-methods/handle-create-poll.service.mjs +0 -75
  196. package/dist/esm2022/lib/methods/polls-methods/handle-end-poll.service.mjs +0 -72
  197. package/dist/esm2022/lib/methods/polls-methods/handle-vote-poll.service.mjs +0 -83
  198. package/dist/esm2022/lib/methods/polls-methods/launch-poll.service.mjs +0 -43
  199. package/dist/esm2022/lib/methods/polls-methods/poll-updated.service.mjs +0 -95
  200. package/dist/esm2022/lib/methods/recording-methods/check-pause-state.service.mjs +0 -69
  201. package/dist/esm2022/lib/methods/recording-methods/check-resume-state.service.mjs +0 -56
  202. package/dist/esm2022/lib/methods/recording-methods/confirm-recording.service.mjs +0 -278
  203. package/dist/esm2022/lib/methods/recording-methods/launch-recording.service.mjs +0 -125
  204. package/dist/esm2022/lib/methods/recording-methods/record-pause-timer.service.mjs +0 -67
  205. package/dist/esm2022/lib/methods/recording-methods/record-resume-timer.service.mjs +0 -130
  206. package/dist/esm2022/lib/methods/recording-methods/record-start-timer.service.mjs +0 -134
  207. package/dist/esm2022/lib/methods/recording-methods/record-update-timer.service.mjs +0 -80
  208. package/dist/esm2022/lib/methods/recording-methods/start-recording.service.mjs +0 -197
  209. package/dist/esm2022/lib/methods/recording-methods/stop-recording.service.mjs +0 -112
  210. package/dist/esm2022/lib/methods/recording-methods/update-recording.service.mjs +0 -272
  211. package/dist/esm2022/lib/methods/requests-methods/launch-requests.service.mjs +0 -51
  212. package/dist/esm2022/lib/methods/requests-methods/respond-to-requests.service.mjs +0 -84
  213. package/dist/esm2022/lib/methods/settings-methods/launch-settings.service.mjs +0 -51
  214. package/dist/esm2022/lib/methods/settings-methods/modify-settings.service.mjs +0 -109
  215. package/dist/esm2022/lib/methods/stream-methods/click-audio.service.mjs +0 -275
  216. package/dist/esm2022/lib/methods/stream-methods/click-chat.service.mjs +0 -75
  217. package/dist/esm2022/lib/methods/stream-methods/click-screen-share.service.mjs +0 -178
  218. package/dist/esm2022/lib/methods/stream-methods/click-video.service.mjs +0 -271
  219. package/dist/esm2022/lib/methods/stream-methods/switch-audio.service.mjs +0 -80
  220. package/dist/esm2022/lib/methods/stream-methods/switch-video-alt.service.mjs +0 -116
  221. package/dist/esm2022/lib/methods/stream-methods/switch-video.service.mjs +0 -132
  222. package/dist/esm2022/lib/methods/utils/format-number.service.mjs +0 -57
  223. package/dist/esm2022/lib/methods/utils/generate-random-messages.service.mjs +0 -120
  224. package/dist/esm2022/lib/methods/utils/generate-random-participants.service.mjs +0 -126
  225. package/dist/esm2022/lib/methods/utils/generate-random-polls.service.mjs +0 -78
  226. package/dist/esm2022/lib/methods/utils/generate-random-request-list.service.mjs +0 -90
  227. package/dist/esm2022/lib/methods/utils/generate-random-waiting-room-list.service.mjs +0 -59
  228. package/dist/esm2022/lib/methods/utils/get-modal-position.util.mjs +0 -32
  229. package/dist/esm2022/lib/methods/utils/get-overlay-position.util.mjs +0 -31
  230. package/dist/esm2022/lib/methods/utils/initial-values.util.mjs +0 -379
  231. package/dist/esm2022/lib/methods/utils/meeting-timer/start-meeting-progress-timer.service.mjs +0 -96
  232. package/dist/esm2022/lib/methods/utils/mini-audio-player/mini-audio-player.component.mjs +0 -315
  233. package/dist/esm2022/lib/methods/utils/producer/a-params.service.mjs +0 -58
  234. package/dist/esm2022/lib/methods/utils/producer/h-params.service.mjs +0 -87
  235. package/dist/esm2022/lib/methods/utils/producer/screen-params.service.mjs +0 -61
  236. package/dist/esm2022/lib/methods/utils/producer/v-params.service.mjs +0 -87
  237. package/dist/esm2022/lib/methods/utils/producer/video-capture-constraints.service.mjs +0 -84
  238. package/dist/esm2022/lib/methods/utils/sleep.util.mjs +0 -17
  239. package/dist/esm2022/lib/methods/utils/sound-player.service.mjs +0 -63
  240. package/dist/esm2022/lib/methods/utils/validate-alphanumeric.service.mjs +0 -49
  241. package/dist/esm2022/lib/methods/waiting-methods/launch-waiting.service.mjs +0 -41
  242. package/dist/esm2022/lib/methods/waiting-methods/respond-to-waiting.service.mjs +0 -69
  243. package/dist/esm2022/lib/methods/whiteboard-methods/capture-canvas-stream.service.mjs +0 -98
  244. package/dist/esm2022/lib/methods/whiteboard-methods/launch-configure-whiteboard.service.mjs +0 -44
  245. package/dist/esm2022/lib/producer-client/producer-client-emits/create-device-client.service.mjs +0 -74
  246. package/dist/esm2022/lib/producer-client/producer-client-emits/join-room-client.service.mjs +0 -96
  247. package/dist/esm2022/lib/producer-client/producer-client-emits/update-room-parameters-client.service.mjs +0 -276
  248. package/dist/esm2022/lib/producers/producer-emits/join-con-room.service.mjs +0 -152
  249. package/dist/esm2022/lib/producers/producer-emits/join-room.service.mjs +0 -152
  250. package/dist/esm2022/lib/producers/socket-receive-methods/all-members-rest.service.mjs +0 -228
  251. package/dist/esm2022/lib/producers/socket-receive-methods/all-members.service.mjs +0 -218
  252. package/dist/esm2022/lib/producers/socket-receive-methods/all-waiting-room-members.service.mjs +0 -57
  253. package/dist/esm2022/lib/producers/socket-receive-methods/ban-participant.service.mjs +0 -76
  254. package/dist/esm2022/lib/producers/socket-receive-methods/control-media-host.service.mjs +0 -183
  255. package/dist/esm2022/lib/producers/socket-receive-methods/disconnect-user-self.service.mjs +0 -50
  256. package/dist/esm2022/lib/producers/socket-receive-methods/disconnect.service.mjs +0 -64
  257. package/dist/esm2022/lib/producers/socket-receive-methods/get-domains.service.mjs +0 -78
  258. package/dist/esm2022/lib/producers/socket-receive-methods/host-request-response.service.mjs +0 -150
  259. package/dist/esm2022/lib/producers/socket-receive-methods/meeting-ended.service.mjs +0 -73
  260. package/dist/esm2022/lib/producers/socket-receive-methods/meeting-still-there.service.mjs +0 -47
  261. package/dist/esm2022/lib/producers/socket-receive-methods/meeting-time-remaining.service.mjs +0 -63
  262. package/dist/esm2022/lib/producers/socket-receive-methods/participant-requested.service.mjs +0 -63
  263. package/dist/esm2022/lib/producers/socket-receive-methods/person-joined.service.mjs +0 -54
  264. package/dist/esm2022/lib/producers/socket-receive-methods/producer-media-closed.service.mjs +0 -129
  265. package/dist/esm2022/lib/producers/socket-receive-methods/producer-media-paused.service.mjs +0 -152
  266. package/dist/esm2022/lib/producers/socket-receive-methods/producer-media-resumed.service.mjs +0 -99
  267. package/dist/esm2022/lib/producers/socket-receive-methods/re-initiate-recording.service.mjs +0 -67
  268. package/dist/esm2022/lib/producers/socket-receive-methods/receive-message.service.mjs +0 -134
  269. package/dist/esm2022/lib/producers/socket-receive-methods/recording-notice.service.mjs +0 -233
  270. package/dist/esm2022/lib/producers/socket-receive-methods/room-record-params.service.mjs +0 -121
  271. package/dist/esm2022/lib/producers/socket-receive-methods/screen-producer-id.service.mjs +0 -86
  272. package/dist/esm2022/lib/producers/socket-receive-methods/start-records.service.mjs +0 -60
  273. package/dist/esm2022/lib/producers/socket-receive-methods/stopped-recording.service.mjs +0 -62
  274. package/dist/esm2022/lib/producers/socket-receive-methods/time-left-recording.service.mjs +0 -57
  275. package/dist/esm2022/lib/producers/socket-receive-methods/update-consuming-domains.service.mjs +0 -105
  276. package/dist/esm2022/lib/producers/socket-receive-methods/update-media-settings.service.mjs +0 -66
  277. package/dist/esm2022/lib/producers/socket-receive-methods/updated-co-host.service.mjs +0 -96
  278. package/dist/esm2022/lib/producers/socket-receive-methods/user-waiting.service.mjs +0 -52
  279. package/dist/esm2022/lib/sockets/socket-manager.service.mjs +0 -113
  280. package/dist/esm2022/mediasfu-angular.mjs +0 -5
  281. package/dist/esm2022/public-api.mjs +0 -187
@@ -1,210 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- /**
4
- * Handles the successful streaming of audio by setting up the necessary transports and updating the relevant states.
5
- *
6
- * This method updates the local media stream with the new audio track, manages the transport connection,
7
- * and updates the participants' states to reflect changes in audio settings.
8
- *
9
- * @param {StreamSuccessAudioOptions} options - The options for streaming success audio.
10
- * @param {MediaStream} options.stream - The media stream containing the audio track.
11
- * @param {StreamSuccessAudioParameters} options.parameters - The parameters required for setting up the audio stream.
12
- * @param {Socket} options.parameters.socket - The socket connection for real-time communication.
13
- * @param {Participant[]} options.parameters.participants - The list of participants in the session.
14
- * @param {MediaStream | null} options.parameters.localStream - The local media stream that includes video and audio tracks.
15
- * @param {boolean} options.parameters.transportCreated - Indicates if the audio transport has been created.
16
- * @param {boolean} options.parameters.transportCreatedAudio - Indicates if the audio transport has been created.
17
- * @param {boolean} options.parameters.audioAlreadyOn - Indicates if the audio is already active.
18
- * @param {boolean} options.parameters.micAction - Indicates the microphone action state.
19
- * @param {ProducerOptions} options.parameters.audioParams - The current audio parameters for the producer.
20
- * @param {MediaStream | null} options.parameters.localStreamAudio - The local audio stream.
21
- * @param {string} options.parameters.defAudioID - The default audio device ID for the stream.
22
- * @param {string} options.parameters.userDefaultAudioInputDevice - The user default audio input device.
23
- * @param {ProducerOptions} options.parameters.params - Additional parameters for the producer.
24
- * @param {ProducerOptions} [options.parameters.audioParamse] - Additional audio parameters.
25
- * @param {ProducerOptions} options.parameters.aParams - Producer parameters for the audio.
26
- * @param {string} options.parameters.hostLabel - The label of the host for this session.
27
- * @param {string} options.parameters.islevel - The participant's level (e.g., admin, regular user).
28
- * @param {string} options.parameters.member - The member name for identification.
29
- * @param {boolean} options.parameters.updateMainWindow - Indicates if the main window needs to be updated.
30
- * @param {boolean} options.parameters.lock_screen - Indicates if the screen is locked for participants.
31
- * @param {boolean} options.parameters.shared - Indicates if the screen is currently shared.
32
- * @param {boolean} options.parameters.videoAlreadyOn - Indicates if the video stream is currently active.
33
- * @param {ShowAlert} [options.parameters.showAlert] - Optional function to show alert messages.
34
- * @param {Function} options.parameters.updateParticipants - Function to update the list of participants.
35
- * @param {Function} options.parameters.updateTransportCreated - Function to update the audio transport created status.
36
- * @param {Function} options.parameters.updateTransportCreatedAudio - Function to update the audio transport created status.
37
- * @param {Function} options.parameters.updateAudioAlreadyOn - Function to update the audio active status.
38
- * @param {Function} options.parameters.updateMicAction - Function to update the microphone action state.
39
- * @param {Function} options.parameters.updateAudioParams - Function to update the audio parameters.
40
- * @param {Function} options.parameters.updateLocalStream - Function to update the local stream.
41
- * @param {Function} options.parameters.updateLocalStreamAudio - Function to update the local audio stream.
42
- * @param {Function} options.parameters.updateDefAudioID - Function to update the default audio device ID.
43
- * @param {Function} options.parameters.updateUserDefaultAudioInputDevice - Function to update the default audio input device.
44
- * @param {Function} options.parameters.updateUpdateMainWindow - Function to update the main window status.
45
- * @param {Function} options.parameters.createSendTransport - Function to create a send transport for audio.
46
- * @param {Function} options.parameters.connectSendTransportAudio - Function to connect the send transport for audio.
47
- * @param {Function} options.parameters.resumeSendTransportAudio - Function to resume the send transport for audio.
48
- * @param {Function} options.parameters.prepopulateUserMedia - Function to prepopulate user media based on current settings.
49
- *
50
- * @returns {Promise<void>} A promise that resolves when the audio streaming setup is complete.
51
- *
52
- * @throws {Error} Throws an error if there is an issue during the audio stream setup.
53
- *
54
- * @example
55
- * await streamSuccessAudio({
56
- * stream: newAudioStream,
57
- * parameters: {
58
- * socket: socketInstance,
59
- * participants: participantList,
60
- * // other parameters...
61
- * },
62
- * });
63
- */
64
- export class StreamSuccessAudio {
65
- /**
66
- * Handles the successful streaming of audio by setting up the necessary transports and updating the relevant states.
67
- *
68
- * @param {Object} options - The options for streaming success audio.
69
- * @param {MediaStream} options.stream - The media stream containing the audio track.
70
- * @param {Object} options.parameters - The parameters required for setting up the audio stream.
71
- * @param {Object} options.parameters.socket - The socket connection.
72
- * @param {Array} options.parameters.participants - The list of participants.
73
- * @param {MediaStream} options.parameters.localStream - The local media stream.
74
- * @param {boolean} options.parameters.transportCreated - Flag indicating if the transport is created.
75
- * @param {boolean} options.parameters.transportCreatedAudio - Flag indicating if the audio transport is created.
76
- * @param {boolean} options.parameters.audioAlreadyOn - Flag indicating if the audio is already on.
77
- * @param {boolean} options.parameters.micAction - Flag indicating the microphone action.
78
- * @param {Object} options.parameters.audioParams - The audio parameters.
79
- * @param {MediaStream} options.parameters.localStreamAudio - The local audio stream.
80
- * @param {string} options.parameters.defAudioID - The default audio device ID.
81
- * @param {string} options.parameters.userDefaultAudioInputDevice - The user default audio input device.
82
- * @param {Object} options.parameters.params - Additional parameters.
83
- * @param {Object} options.parameters.audioParamse - Additional audio parameters.
84
- * @param {Object} options.parameters.aParams - Additional parameters for audio.
85
- * @param {string} options.parameters.hostLabel - The label of the host.
86
- * @param {string} options.parameters.islevel - The level of the user.
87
- * @param {string} options.parameters.member - The member name.
88
- * @param {boolean} options.parameters.updateMainWindow - Flag indicating if the main window should be updated.
89
- * @param {boolean} options.parameters.lock_screen - Flag indicating if the screen is locked.
90
- * @param {boolean} options.parameters.shared - Flag indicating if the screen is shared.
91
- * @param {boolean} options.parameters.videoAlreadyOn - Flag indicating if the video is already on.
92
- * @param {Function} options.parameters.showAlert - Function to show alert messages.
93
- * @param {Function} options.parameters.updateParticipants - Function to update participants.
94
- * @param {Function} options.parameters.updateTransportCreated - Function to update transport created flag.
95
- * @param {Function} options.parameters.updateTransportCreatedAudio - Function to update audio transport created flag.
96
- * @param {Function} options.parameters.updateAudioAlreadyOn - Function to update audio already on flag.
97
- * @param {Function} options.parameters.updateMicAction - Function to update microphone action flag.
98
- * @param {Function} options.parameters.updateAudioParams - Function to update audio parameters.
99
- * @param {Function} options.parameters.updateLocalStream - Function to update local stream.
100
- * @param {Function} options.parameters.updateLocalStreamAudio - Function to update local audio stream.
101
- * @param {Function} options.parameters.updateDefAudioID - Function to update default audio device ID.
102
- * @param {Function} options.parameters.updateUserDefaultAudioInputDevice - Function to update user default audio input device.
103
- * @param {Function} options.parameters.updateUpdateMainWindow - Function to update main window flag.
104
- * @param {Function} options.parameters.createSendTransport - Function to create send transport.
105
- * @param {Function} options.parameters.connectSendTransportAudio - Function to connect send transport audio.
106
- * @param {Function} options.parameters.resumeSendTransportAudio - Function to resume send transport audio.
107
- * @param {Function} options.parameters.prepopulateUserMedia - Function to prepopulate user media.
108
- * @returns {Promise<void>} A promise that resolves when the audio streaming setup is complete.
109
- */
110
- async streamSuccessAudio({ stream, parameters }) {
111
- let { socket, participants, localStream, transportCreated, transportCreatedAudio, audioAlreadyOn, micAction, audioParams, localStreamAudio, defAudioID, userDefaultAudioInputDevice, params, audioParamse, aParams, hostLabel, islevel, member, updateMainWindow, lock_screen, shared, videoAlreadyOn, showAlert,
112
- // update functions
113
- updateParticipants, updateTransportCreated, updateTransportCreatedAudio, updateAudioAlreadyOn, updateMicAction, updateAudioParams, updateLocalStream, updateLocalStreamAudio, updateDefAudioID, updateUserDefaultAudioInputDevice, updateUpdateMainWindow,
114
- // mediasfu functions
115
- createSendTransport, connectSendTransportAudio, resumeSendTransportAudio, prepopulateUserMedia, } = parameters;
116
- localStreamAudio = stream;
117
- updateLocalStreamAudio(localStreamAudio);
118
- // Add the audio stream track to the localStream
119
- if (localStream == null) {
120
- localStream = new MediaStream([localStreamAudio.getAudioTracks()[0]]);
121
- updateLocalStream(localStream);
122
- }
123
- else {
124
- localStream.addTrack(localStreamAudio.getAudioTracks()[0]);
125
- updateLocalStream(localStream);
126
- }
127
- const audioTracked = localStream.getAudioTracks()[0];
128
- defAudioID = audioTracked.getSettings().deviceId || '';
129
- userDefaultAudioInputDevice = defAudioID;
130
- // Update the state variables
131
- updateDefAudioID(defAudioID);
132
- updateUserDefaultAudioInputDevice(userDefaultAudioInputDevice);
133
- try {
134
- params = aParams;
135
- audioParamse = { ...params };
136
- audioParams = { track: localStream.getAudioTracks()[0], ...audioParamse };
137
- updateAudioParams(audioParams);
138
- // Create transport if not created else connect transport
139
- if (!transportCreated) {
140
- try {
141
- await createSendTransport({
142
- parameters: {
143
- ...parameters,
144
- audioParams: audioParams,
145
- },
146
- option: 'audio',
147
- });
148
- }
149
- catch (error) {
150
- console.error('Error creating send transport:', error);
151
- }
152
- }
153
- else {
154
- if (!transportCreatedAudio) {
155
- await connectSendTransportAudio({
156
- audioParams,
157
- parameters,
158
- });
159
- }
160
- else {
161
- await resumeSendTransportAudio({ parameters });
162
- }
163
- }
164
- }
165
- catch (error) {
166
- showAlert?.({
167
- message: error.message,
168
- type: 'danger',
169
- duration: 3000,
170
- });
171
- }
172
- // Update the participants array to reflect the change
173
- audioAlreadyOn = true;
174
- updateAudioAlreadyOn(audioAlreadyOn);
175
- if (micAction) {
176
- micAction = false;
177
- updateMicAction(micAction);
178
- }
179
- participants.forEach((participant) => {
180
- if (participant.socketId == socket.id && participant.name == member) {
181
- participant.muted = false;
182
- }
183
- });
184
- updateParticipants(participants);
185
- // Update the transport created state
186
- transportCreated = true;
187
- transportCreatedAudio = true;
188
- updateTransportCreated(transportCreated);
189
- updateTransportCreatedAudio(transportCreatedAudio);
190
- // Reupdate screen display if host
191
- if (videoAlreadyOn == false && islevel == '2') {
192
- if (!lock_screen && !shared) {
193
- updateMainWindow = true;
194
- updateUpdateMainWindow(updateMainWindow);
195
- await prepopulateUserMedia({ name: hostLabel, parameters });
196
- updateMainWindow = false;
197
- updateUpdateMainWindow(updateMainWindow);
198
- }
199
- }
200
- }
201
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: StreamSuccessAudio, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
202
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: StreamSuccessAudio, providedIn: 'root' });
203
- }
204
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: StreamSuccessAudio, decorators: [{
205
- type: Injectable,
206
- args: [{
207
- providedIn: 'root',
208
- }]
209
- }] });
210
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLXN1Y2Nlc3MtYXVkaW8uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21lZGlhc2Z1LWFuZ3VsYXIvc3JjL2xpYi9jb25zdW1lcnMvc3RyZWFtLXN1Y2Nlc3MtYXVkaW8uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQXlFM0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRERztBQUtILE1BQU0sT0FBTyxrQkFBa0I7SUFDN0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BNENHO0lBRUgsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBNkI7UUFDeEUsSUFBSSxFQUNGLE1BQU0sRUFDTixZQUFZLEVBQ1osV0FBVyxFQUNYLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsY0FBYyxFQUNkLFNBQVMsRUFDVCxXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDViwyQkFBMkIsRUFDM0IsTUFBTSxFQUNOLFlBQVksRUFDWixPQUFPLEVBQ1AsU0FBUyxFQUNULE9BQU8sRUFDUCxNQUFNLEVBQ04sZ0JBQWdCLEVBQ2hCLFdBQVcsRUFDWCxNQUFNLEVBQ04sY0FBYyxFQUNkLFNBQVM7UUFFVCxtQkFBbUI7UUFDbkIsa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUN0QiwyQkFBMkIsRUFDM0Isb0JBQW9CLEVBQ3BCLGVBQWUsRUFDZixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDaEIsaUNBQWlDLEVBQ2pDLHNCQUFzQjtRQUV0QixxQkFBcUI7UUFDckIsbUJBQW1CLEVBQ25CLHlCQUF5QixFQUN6Qix3QkFBd0IsRUFDeEIsb0JB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QUFHLEtBQUssQ0FBQztZQUM1QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVqQyxxQ0FBcUM7UUFDckMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLHFCQUFxQixHQUFHLElBQUksQ0FBQztRQUM3QixzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pDLDJCQUEyQixDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFFbkQsa0NBQWtDO1FBQ2xDLElBQUksY0FBYyxJQUFJLEtBQUssSUFBSSxPQUFPLElBQUksR0FBRyxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUM1QixnQkFBZ0IsR0FBRyxJQUFJLENBQUM7Z0JBQ3hCLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3pDLE1BQU0sb0JBQW9CLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7Z0JBQzVELGdCQUFnQixHQUFHLEtBQUssQ0FBQztnQkFDekIsc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUMzQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7dUdBdExVLGtCQUFrQjsyR0FBbEIsa0JBQWtCLGNBRmpCLE1BQU07OzJGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTb2NrZXQgfSBmcm9tICdzb2NrZXQuaW8tY2xpZW50JztcbmltcG9ydCB7XG4gIFBhcnRpY2lwYW50LFxuICBQcmVwb3B1bGF0ZVVzZXJNZWRpYVBhcmFtZXRlcnMsXG4gIFNob3dBbGVydCxcbiAgQ3JlYXRlU2VuZFRyYW5zcG9ydFBhcmFtZXRlcnMsXG4gIENvbm5lY3RTZW5kVHJhbnNwb3J0QXVkaW9QYXJhbWV0ZXJzLFxuICBSZXN1bWVTZW5kVHJhbnNwb3J0QXVkaW9QYXJhbWV0ZXJzLFxuICBQcmVwb3B1bGF0ZVVzZXJNZWRpYVR5cGUsXG4gIENyZWF0ZVNlbmRUcmFuc3BvcnRUeXBlLFxuICBDb25uZWN0U2VuZFRyYW5zcG9ydEF1ZGlvVHlwZSxcbiAgUmVzdW1lU2VuZFRyYW5zcG9ydEF1ZGlvVHlwZSxcbn0gZnJvbSAnLi4vQHR5cGVzL3R5cGVzJztcbmltcG9ydCB7IFByb2R1Y2VyT3B0aW9ucyB9IGZyb20gJ21lZGlhc291cC1jbGllbnQvbGliL3R5cGVzJztcbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtU3VjY2Vzc0F1ZGlvUGFyYW1ldGVyc1xuICBleHRlbmRzIENyZWF0ZVNlbmRUcmFuc3BvcnRQYXJhbWV0ZXJzLFxuICAgIENvbm5lY3RTZW5kVHJhbnNwb3J0QXVkaW9QYXJhbWV0ZXJzLFxuICAgIFJlc3VtZVNlbmRUcmFuc3BvcnRBdWRpb1BhcmFtZXRlcnMsXG4gICAgUHJlcG9wdWxhdGVVc2VyTWVkaWFQYXJhbWV0ZXJzIHtcbiAgc29ja2V0OiBTb2NrZXQ7XG4gIHBhcnRpY2lwYW50czogUGFydGljaXBhbnRbXTtcbiAgbG9jYWxTdHJlYW06IE1lZGlhU3RyZWFtIHwgbnVsbDtcbiAgdHJhbnNwb3J0Q3JlYXRlZDogYm9vbGVhbjtcbiAgdHJhbnNwb3J0Q3JlYXRlZEF1ZGlvOiBib29sZWFuO1xuICBhdWRpb0FscmVhZHlPbjogYm9vbGVhbjtcbiAgbWljQWN0aW9uOiBib29sZWFuO1xuICBhdWRpb1BhcmFtczogUHJvZHVjZXJPcHRpb25zO1xuICBsb2NhbFN0cmVhbUF1ZGlvOiBNZWRpYVN0cmVhbSB8IG51bGw7XG4gIGRlZkF1ZGlvSUQ6IHN0cmluZztcbiAgdXNlckRlZmF1bHRBdWRpb0lucHV0RGV2aWNlOiBzdHJpbmc7XG4gIHBhcmFtczogUHJvZHVjZXJPcHRpb25zO1xuICBhdWRpb1BhcmFtc2U/OiBQcm9kdWNlck9wdGlvbnM7XG4gIGFQYXJhbXM6IFByb2R1Y2VyT3B0aW9ucztcbiAgaG9zdExhYmVsOiBzdHJpbmc7XG4gIGlzbGV2ZWw6IHN0cmluZztcbiAgbWVtYmVyOiBzdHJpbmc7XG4gIHVwZGF0ZU1haW5XaW5kb3c6IGJvb2xlYW47XG4gIGxvY2tfc2NyZWVuOiBib29sZWFuO1xuICBzaGFyZWQ6IGJvb2xlYW47XG4gIHZpZGVvQWxyZWFkeU9uOiBib29sZWFuO1xuICBzaG93QWxlcnQ/OiBTaG93QWxlcnQ7XG5cbiAgdXBkYXRlUGFydGljaXBhbnRzOiAocGFydGljaXBhbnRzOiBQYXJ0aWNpcGFudFtdKSA9PiB2b2lkO1xuICB1cGRhdGVUcmFuc3BvcnRDcmVhdGVkOiAodHJhbnNwb3J0Q3JlYXRlZDogYm9vbGVhbikgPT4gdm9pZDtcbiAgdXBkYXRlVHJhbnNwb3J0Q3JlYXRlZEF1ZGlvOiAodHJhbnNwb3J0Q3JlYXRlZEF1ZGlvOiBib29sZWFuKSA9PiB2b2lkO1xuICB1cGRhdGVBdWRpb0FscmVhZHlPbjogKGF1ZGlvQWxyZWFkeU9uOiBib29sZWFuKSA9PiB2b2lkO1xuICB1cGRhdGVNaWNBY3Rpb246IChtaWNBY3Rpb246IGJvb2xlYW4pID0+IHZvaWQ7XG4gIHVwZGF0ZUF1ZGlvUGFyYW1zOiAoYXVkaW9QYXJhbXM6IFByb2R1Y2VyT3B0aW9ucykgPT4gdm9pZDtcbiAgdXBkYXRlTG9jYWxTdHJlYW06IChsb2NhbFN0cmVhbTogTWVkaWFTdHJlYW0gfCBudWxsKSA9PiB2b2lkO1xuICB1cGRhdGVMb2NhbFN0cmVhbUF1ZGlvOiAobG9jYWxTdHJlYW1BdWRpbzogTWVkaWFTdHJlYW0gfCBudWxsKSA9PiB2b2lkO1xuICB1cGRhdGVEZWZBdWRpb0lEOiAoZGVmQXVkaW9JRDogc3RyaW5nKSA9PiB2b2lkO1xuICB1cGRhdGVVc2VyRGVmYXVsdEF1ZGlvSW5wdXREZXZpY2U6ICh1c2VyRGVmYXVsdEF1ZGlvSW5wdXREZXZpY2U6IHN0cmluZykgPT4gdm9pZDtcbiAgdXBkYXRlVXBkYXRlTWFpbldpbmRvdzogKHVwZGF0ZU1haW5XaW5kb3c6IGJvb2xlYW4pID0+IHZvaWQ7XG5cbiAgLy8gbWVkaWFzZnUgZnVuY3Rpb25zXG4gIGNyZWF0ZVNlbmRUcmFuc3BvcnQ6IENyZWF0ZVNlbmRUcmFuc3BvcnRUeXBlO1xuICBjb25uZWN0U2VuZFRyYW5zcG9ydEF1ZGlvOiBDb25uZWN0U2VuZFRyYW5zcG9ydEF1ZGlvVHlwZTtcbiAgcmVzdW1lU2VuZFRyYW5zcG9ydEF1ZGlvOiBSZXN1bWVTZW5kVHJhbnNwb3J0QXVkaW9UeXBlO1xuICBwcmVwb3B1bGF0ZVVzZXJNZWRpYTogUHJlcG9wdWxhdGVVc2VyTWVkaWFUeXBlO1xuXG4gIGdldFVwZGF0ZWRBbGxQYXJhbXM6ICgpID0+IFN0cmVhbVN1Y2Nlc3NBdWRpb1BhcmFtZXRlcnM7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1TdWNjZXNzQXVkaW9PcHRpb25zIHtcbiAgc3RyZWFtOiBNZWRpYVN0cmVhbTtcbiAgcGFyYW1ldGVyczogU3RyZWFtU3VjY2Vzc0F1ZGlvUGFyYW1ldGVycztcbn1cblxuLy8gRXhwb3J0IHRoZSB0eXBlIGRlZmluaXRpb24gZm9yIHRoZSBmdW5jdGlvblxuZXhwb3J0IHR5cGUgU3RyZWFtU3VjY2Vzc0F1ZGlvVHlwZSA9IChvcHRpb25zOiBTdHJlYW1TdWNjZXNzQXVkaW9PcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4vKipcbiAqIEhhbmRsZXMgdGhlIHN1Y2Nlc3NmdWwgc3RyZWFtaW5nIG9mIGF1ZGlvIGJ5IHNldHRpbmcgdXAgdGhlIG5lY2Vzc2FyeSB0cmFuc3BvcnRzIGFuZCB1cGRhdGluZyB0aGUgcmVsZXZhbnQgc3RhdGVzLlxuICpcbiAqIFRoaXMgbWV0aG9kIHVwZGF0ZXMgdGhlIGxvY2FsIG1lZGlhIHN0cmVhbSB3aXRoIHRoZSBuZXcgYXVkaW8gdHJhY2ssIG1hbmFnZXMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uLFxuICogYW5kIHVwZGF0ZXMgdGhlIHBhcnRpY2lwYW50cycgc3RhdGVzIHRvIHJlZmxlY3QgY2hhbmdlcyBpbiBhdWRpbyBzZXR0aW5ncy5cbiAqXG4gKiBAcGFyYW0ge1N0cmVhbVN1Y2Nlc3NBdWRpb09wdGlvbnN9IG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3Igc3RyZWFtaW5nIHN1Y2Nlc3MgYXVkaW8uXG4gKiBAcGFyYW0ge01lZGlhU3RyZWFtfSBvcHRpb25zLnN0cmVhbSAtIFRoZSBtZWRpYSBzdHJlYW0gY29udGFpbmluZyB0aGUgYXVkaW8gdHJhY2suXG4gKiBAcGFyYW0ge1N0cmVhbVN1Y2Nlc3NBdWRpb1BhcmFtZXRlcnN9IG9wdGlvbnMucGFyYW1ldGVycyAtIFRoZSBwYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBzZXR0aW5nIHVwIHRoZSBhdWRpbyBzdHJlYW0uXG4gKiBAcGFyYW0ge1NvY2tldH0gb3B0aW9ucy5wYXJhbWV0ZXJzLnNvY2tldCAtIFRoZSBzb2NrZXQgY29ubmVjdGlvbiBmb3IgcmVhbC10aW1lIGNvbW11bmljYXRpb24uXG4gKiBAcGFyYW0ge1BhcnRpY2lwYW50W119IG9wdGlvbnMucGFyYW1ldGVycy5wYXJ0aWNpcGFudHMgLSBUaGUgbGlzdCBvZiBwYXJ0aWNpcGFudHMgaW4gdGhlIHNlc3Npb24uXG4gKiBAcGFyYW0ge01lZGlhU3RyZWFtIHwgbnVsbH0gb3B0aW9ucy5wYXJhbWV0ZXJzLmxvY2FsU3RyZWFtIC0gVGhlIGxvY2FsIG1lZGlhIHN0cmVhbSB0aGF0IGluY2x1ZGVzIHZpZGVvIGFuZCBhdWRpbyB0cmFja3MuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMucGFyYW1ldGVycy50cmFuc3BvcnRDcmVhdGVkIC0gSW5kaWNhdGVzIGlmIHRoZSBhdWRpbyB0cmFuc3BvcnQgaGFzIGJlZW4gY3JlYXRlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLnRyYW5zcG9ydENyZWF0ZWRBdWRpbyAtIEluZGljYXRlcyBpZiB0aGUgYXVkaW8gdHJhbnNwb3J0IGhhcyBiZWVuIGNyZWF0ZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMucGFyYW1ldGVycy5hdWRpb0FscmVhZHlPbiAtIEluZGljYXRlcyBpZiB0aGUgYXVkaW8gaXMgYWxyZWFkeSBhY3RpdmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMucGFyYW1ldGVycy5taWNBY3Rpb24gLSBJbmRpY2F0ZXMgdGhlIG1pY3JvcGhvbmUgYWN0aW9uIHN0YXRlLlxuICogQHBhcmFtIHtQcm9kdWNlck9wdGlvbnN9IG9wdGlvbnMucGFyYW1ldGVycy5hdWRpb1BhcmFtcyAtIFRoZSBjdXJyZW50IGF1ZGlvIHBhcmFtZXRlcnMgZm9yIHRoZSBwcm9kdWNlci5cbiAqIEBwYXJhbSB7TWVkaWFTdHJlYW0gfCBudWxsfSBvcHRpb25zLnBhcmFtZXRlcnMubG9jYWxTdHJlYW1BdWRpbyAtIFRoZSBsb2NhbCBhdWRpbyBzdHJlYW0uXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5wYXJhbWV0ZXJzLmRlZkF1ZGlvSUQgLSBUaGUgZGVmYXVsdCBhdWRpbyBkZXZpY2UgSUQgZm9yIHRoZSBzdHJlYW0uXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5wYXJhbWV0ZXJzLnVzZXJEZWZhdWx0QXVkaW9JbnB1dERldmljZSAtIFRoZSB1c2VyIGRlZmF1bHQgYXVkaW8gaW5wdXQgZGV2aWNlLlxuICogQHBhcmFtIHtQcm9kdWNlck9wdGlvbnN9IG9wdGlvbnMucGFyYW1ldGVycy5wYXJhbXMgLSBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHRoZSBwcm9kdWNlci5cbiAqIEBwYXJhbSB7UHJvZHVjZXJPcHRpb25zfSBbb3B0aW9ucy5wYXJhbWV0ZXJzLmF1ZGlvUGFyYW1zZV0gLSBBZGRpdGlvbmFsIGF1ZGlvIHBhcmFtZXRlcnMuXG4gKiBAcGFyYW0ge1Byb2R1Y2VyT3B0aW9uc30gb3B0aW9ucy5wYXJhbWV0ZXJzLmFQYXJhbXMgLSBQcm9kdWNlciBwYXJhbWV0ZXJzIGZvciB0aGUgYXVkaW8uXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5wYXJhbWV0ZXJzLmhvc3RMYWJlbCAtIFRoZSBsYWJlbCBvZiB0aGUgaG9zdCBmb3IgdGhpcyBzZXNzaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMucGFyYW1ldGVycy5pc2xldmVsIC0gVGhlIHBhcnRpY2lwYW50J3MgbGV2ZWwgKGUuZy4sIGFkbWluLCByZWd1bGFyIHVzZXIpLlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMucGFyYW1ldGVycy5tZW1iZXIgLSBUaGUgbWVtYmVyIG5hbWUgZm9yIGlkZW50aWZpY2F0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLnBhcmFtZXRlcnMudXBkYXRlTWFpbldpbmRvdyAtIEluZGljYXRlcyBpZiB0aGUgbWFpbiB3aW5kb3cgbmVlZHMgdG8gYmUgdXBkYXRlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLmxvY2tfc2NyZWVuIC0gSW5kaWNhdGVzIGlmIHRoZSBzY3JlZW4gaXMgbG9ja2VkIGZvciBwYXJ0aWNpcGFudHMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMucGFyYW1ldGVycy5zaGFyZWQgLSBJbmRpY2F0ZXMgaWYgdGhlIHNjcmVlbiBpcyBjdXJyZW50bHkgc2hhcmVkLlxuICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLnBhcmFtZXRlcnMudmlkZW9BbHJlYWR5T24gLSBJbmRpY2F0ZXMgaWYgdGhlIHZpZGVvIHN0cmVhbSBpcyBjdXJyZW50bHkgYWN0aXZlLlxuICogQHBhcmFtIHtTaG93QWxlcnR9IFtvcHRpb25zLnBhcmFtZXRlcnMuc2hvd0FsZXJ0XSAtIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHNob3cgYWxlcnQgbWVzc2FnZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLnBhcmFtZXRlcnMudXBkYXRlUGFydGljaXBhbnRzIC0gRnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBsaXN0IG9mIHBhcnRpY2lwYW50cy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMucGFyYW1ldGVycy51cGRhdGVUcmFuc3BvcnRDcmVhdGVkIC0gRnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBhdWRpbyB0cmFuc3BvcnQgY3JlYXRlZCBzdGF0dXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLnBhcmFtZXRlcnMudXBkYXRlVHJhbnNwb3J0Q3JlYXRlZEF1ZGlvIC0gRnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBhdWRpbyB0cmFuc3BvcnQgY3JlYXRlZCBzdGF0dXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLnBhcmFtZXRlcnMudXBkYXRlQXVkaW9BbHJlYWR5T24gLSBGdW5jdGlvbiB0byB1cGRhdGUgdGhlIGF1ZGlvIGFjdGl2ZSBzdGF0dXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLnBhcmFtZXRlcnMudXBkYXRlTWljQWN0aW9uIC0gRnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBtaWNyb3Bob25lIGFjdGlvbiBzdGF0ZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMucGFyYW1ldGVycy51cGRhdGVBdWRpb1BhcmFtcyAtIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgYXVkaW8gcGFyYW1ldGVycy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMucGFyYW1ldGVycy51cGRhdGVMb2NhbFN0cmVhbSAtIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgbG9jYWwgc3RyZWFtLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLnVwZGF0ZUxvY2FsU3RyZWFtQXVkaW8gLSBGdW5jdGlvbiB0byB1cGRhdGUgdGhlIGxvY2FsIGF1ZGlvIHN0cmVhbS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMucGFyYW1ldGVycy51cGRhdGVEZWZBdWRpb0lEIC0gRnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBkZWZhdWx0IGF1ZGlvIGRldmljZSBJRC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMucGFyYW1ldGVycy51cGRhdGVVc2VyRGVmYXVsdEF1ZGlvSW5wdXREZXZpY2UgLSBGdW5jdGlvbiB0byB1cGRhdGUgdGhlIGRlZmF1bHQgYXVkaW8gaW5wdXQgZGV2aWNlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLnVwZGF0ZVVwZGF0ZU1haW5XaW5kb3cgLSBGdW5jdGlvbiB0byB1cGRhdGUgdGhlIG1haW4gd2luZG93IHN0YXR1cy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMucGFyYW1ldGVycy5jcmVhdGVTZW5kVHJhbnNwb3J0IC0gRnVuY3Rpb24gdG8gY3JlYXRlIGEgc2VuZCB0cmFuc3BvcnQgZm9yIGF1ZGlvLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLmNvbm5lY3RTZW5kVHJhbnNwb3J0QXVkaW8gLSBGdW5jdGlvbiB0byBjb25uZWN0IHRoZSBzZW5kIHRyYW5zcG9ydCBmb3IgYXVkaW8uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLnBhcmFtZXRlcnMucmVzdW1lU2VuZFRyYW5zcG9ydEF1ZGlvIC0gRnVuY3Rpb24gdG8gcmVzdW1lIHRoZSBzZW5kIHRyYW5zcG9ydCBmb3IgYXVkaW8uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLnBhcmFtZXRlcnMucHJlcG9wdWxhdGVVc2VyTWVkaWEgLSBGdW5jdGlvbiB0byBwcmVwb3B1bGF0ZSB1c2VyIG1lZGlhIGJhc2VkIG9uIGN1cnJlbnQgc2V0dGluZ3MuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGF1ZGlvIHN0cmVhbWluZyBzZXR1cCBpcyBjb21wbGV0ZS5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZXJlIGlzIGFuIGlzc3VlIGR1cmluZyB0aGUgYXVkaW8gc3RyZWFtIHNldHVwLlxuICpcbiAqIEBleGFtcGxlXG4gKiBhd2FpdCBzdHJlYW1TdWNjZXNzQXVkaW8oe1xuICogICBzdHJlYW06IG5ld0F1ZGlvU3RyZWFtLFxuICogICBwYXJhbWV0ZXJzOiB7XG4gKiAgICAgc29ja2V0OiBzb2NrZXRJbnN0YW5jZSxcbiAqICAgICBwYXJ0aWNpcGFudHM6IHBhcnRpY2lwYW50TGlzdCxcbiAqICAgICAvLyBvdGhlciBwYXJhbWV0ZXJzLi4uXG4gKiAgIH0sXG4gKiB9KTtcbiAqL1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgU3RyZWFtU3VjY2Vzc0F1ZGlvIHtcbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIHN1Y2Nlc3NmdWwgc3RyZWFtaW5nIG9mIGF1ZGlvIGJ5IHNldHRpbmcgdXAgdGhlIG5lY2Vzc2FyeSB0cmFuc3BvcnRzIGFuZCB1cGRhdGluZyB0aGUgcmVsZXZhbnQgc3RhdGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciBzdHJlYW1pbmcgc3VjY2VzcyBhdWRpby5cbiAgICogQHBhcmFtIHtNZWRpYVN0cmVhbX0gb3B0aW9ucy5zdHJlYW0gLSBUaGUgbWVkaWEgc3RyZWFtIGNvbnRhaW5pbmcgdGhlIGF1ZGlvIHRyYWNrLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5wYXJhbWV0ZXJzIC0gVGhlIHBhcmFtZXRlcnMgcmVxdWlyZWQgZm9yIHNldHRpbmcgdXAgdGhlIGF1ZGlvIHN0cmVhbS5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMucGFyYW1ldGVycy5zb2NrZXQgLSBUaGUgc29ja2V0IGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7QXJyYXl9IG9wdGlvbnMucGFyYW1ldGVycy5wYXJ0aWNpcGFudHMgLSBUaGUgbGlzdCBvZiBwYXJ0aWNpcGFudHMuXG4gICAqIEBwYXJhbSB7TWVkaWFTdHJlYW19IG9wdGlvbnMucGFyYW1ldGVycy5sb2NhbFN0cmVhbSAtIFRoZSBsb2NhbCBtZWRpYSBzdHJlYW0uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLnRyYW5zcG9ydENyZWF0ZWQgLSBGbGFnIGluZGljYXRpbmcgaWYgdGhlIHRyYW5zcG9ydCBpcyBjcmVhdGVkLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMucGFyYW1ldGVycy50cmFuc3BvcnRDcmVhdGVkQXVkaW8gLSBGbGFnIGluZGljYXRpbmcgaWYgdGhlIGF1ZGlvIHRyYW5zcG9ydCBpcyBjcmVhdGVkLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMucGFyYW1ldGVycy5hdWRpb0FscmVhZHlPbiAtIEZsYWcgaW5kaWNhdGluZyBpZiB0aGUgYXVkaW8gaXMgYWxyZWFkeSBvbi5cbiAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLnBhcmFtZXRlcnMubWljQWN0aW9uIC0gRmxhZyBpbmRpY2F0aW5nIHRoZSBtaWNyb3Bob25lIGFjdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMucGFyYW1ldGVycy5hdWRpb1BhcmFtcyAtIFRoZSBhdWRpbyBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge01lZGlhU3RyZWFtfSBvcHRpb25zLnBhcmFtZXRlcnMubG9jYWxTdHJlYW1BdWRpbyAtIFRoZSBsb2NhbCBhdWRpbyBzdHJlYW0uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnBhcmFtZXRlcnMuZGVmQXVkaW9JRCAtIFRoZSBkZWZhdWx0IGF1ZGlvIGRldmljZSBJRC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMucGFyYW1ldGVycy51c2VyRGVmYXVsdEF1ZGlvSW5wdXREZXZpY2UgLSBUaGUgdXNlciBkZWZhdWx0IGF1ZGlvIGlucHV0IGRldmljZS5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMucGFyYW1ldGVycy5wYXJhbXMgLSBBZGRpdGlvbmFsIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLnBhcmFtZXRlcnMuYXVkaW9QYXJhbXNlIC0gQWRkaXRpb25hbCBhdWRpbyBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5wYXJhbWV0ZXJzLmFQYXJhbXMgLSBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGF1ZGlvLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5wYXJhbWV0ZXJzLmhvc3RMYWJlbCAtIFRoZSBsYWJlbCBvZiB0aGUgaG9zdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMucGFyYW1ldGVycy5pc2xldmVsIC0gVGhlIGxldmVsIG9mIHRoZSB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5wYXJhbWV0ZXJzLm1lbWJlciAtIFRoZSBtZW1iZXIgbmFtZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLnBhcmFtZXRlcnMudXBkYXRlTWFpbldpbmRvdyAtIEZsYWcgaW5kaWNhdGluZyBpZiB0aGUgbWFpbiB3aW5kb3cgc2hvdWxkIGJlIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLmxvY2tfc2NyZWVuIC0gRmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBzY3JlZW4gaXMgbG9ja2VkLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMucGFyYW1ldGVycy5zaGFyZWQgLSBGbGFnIGluZGljYXRpbmcgaWYgdGhlIHNjcmVlbiBpcyBzaGFyZWQuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLnZpZGVvQWxyZWFkeU9uIC0gRmxhZyBpbmRpY2F0aW5nIGlmIHRoZSB2aWRlbyBpcyBhbHJlYWR5IG9uLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLnBhcmFtZXRlcnMuc2hvd0FsZXJ0IC0gRnVuY3Rpb24gdG8gc2hvdyBhbGVydCBtZXNzYWdlcy5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLnVwZGF0ZVBhcnRpY2lwYW50cyAtIEZ1bmN0aW9uIHRvIHVwZGF0ZSBwYXJ0aWNpcGFudHMuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMucGFyYW1ldGVycy51cGRhdGVUcmFuc3BvcnRDcmVhdGVkIC0gRnVuY3Rpb24gdG8gdXBkYXRlIHRyYW5zcG9ydCBjcmVhdGVkIGZsYWcuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMucGFyYW1ldGVycy51cGRhdGVUcmFuc3BvcnRDcmVhdGVkQXVkaW8gLSBGdW5jdGlvbiB0byB1cGRhdGUgYXVkaW8gdHJhbnNwb3J0IGNyZWF0ZWQgZmxhZy5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLnVwZGF0ZUF1ZGlvQWxyZWFkeU9uIC0gRnVuY3Rpb24gdG8gdXBkYXRlIGF1ZGlvIGFscmVhZHkgb24gZmxhZy5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLnVwZGF0ZU1pY0FjdGlvbiAtIEZ1bmN0aW9uIHRvIHVwZGF0ZSBtaWNyb3Bob25lIGFjdGlvbiBmbGFnLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLnBhcmFtZXRlcnMudXBkYXRlQXVkaW9QYXJhbXMgLSBGdW5jdGlvbiB0byB1cGRhdGUgYXVkaW8gcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLnVwZGF0ZUxvY2FsU3RyZWFtIC0gRnVuY3Rpb24gdG8gdXBkYXRlIGxvY2FsIHN0cmVhbS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLnVwZGF0ZUxvY2FsU3RyZWFtQXVkaW8gLSBGdW5jdGlvbiB0byB1cGRhdGUgbG9jYWwgYXVkaW8gc3RyZWFtLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLnBhcmFtZXRlcnMudXBkYXRlRGVmQXVkaW9JRCAtIEZ1bmN0aW9uIHRvIHVwZGF0ZSBkZWZhdWx0IGF1ZGlvIGRldmljZSBJRC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLnVwZGF0ZVVzZXJEZWZhdWx0QXVkaW9JbnB1dERldmljZSAtIEZ1bmN0aW9uIHRvIHVwZGF0ZSB1c2VyIGRlZmF1bHQgYXVkaW8gaW5wdXQgZGV2aWNlLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLnBhcmFtZXRlcnMudXBkYXRlVXBkYXRlTWFpbldpbmRvdyAtIEZ1bmN0aW9uIHRvIHVwZGF0ZSBtYWluIHdpbmRvdyBmbGFnLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLnBhcmFtZXRlcnMuY3JlYXRlU2VuZFRyYW5zcG9ydCAtIEZ1bmN0aW9uIHRvIGNyZWF0ZSBzZW5kIHRyYW5zcG9ydC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLmNvbm5lY3RTZW5kVHJhbnNwb3J0QXVkaW8gLSBGdW5jdGlvbiB0byBjb25uZWN0IHNlbmQgdHJhbnNwb3J0IGF1ZGlvLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLnBhcmFtZXRlcnMucmVzdW1lU2VuZFRyYW5zcG9ydEF1ZGlvIC0gRnVuY3Rpb24gdG8gcmVzdW1lIHNlbmQgdHJhbnNwb3J0IGF1ZGlvLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLnBhcmFtZXRlcnMucHJlcG9wdWxhdGVVc2VyTWVkaWEgLSBGdW5jdGlvbiB0byBwcmVwb3B1bGF0ZSB1c2VyIG1lZGlhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYXVkaW8gc3RyZWFtaW5nIHNldHVwIGlzIGNvbXBsZXRlLlxuICAgKi9cblxuICBhc3luYyBzdHJlYW1TdWNjZXNzQXVkaW8oeyBzdHJlYW0sIHBhcmFtZXRlcnMgfTogU3RyZWFtU3VjY2Vzc0F1ZGlvT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB7XG4gICAgICBzb2NrZXQsXG4gICAgICBwYXJ0aWNpcGFudHMsXG4gICAgICBsb2NhbFN0cmVhbSxcbiAgICAgIHRyYW5zcG9ydENyZWF0ZWQsXG4gICAgICB0cmFuc3BvcnRDcmVhdGVkQXVkaW8sXG4gICAgICBhdWRpb0FscmVhZHlPbixcbiAgICAgIG1pY0FjdGlvbixcbiAgICAgIGF1ZGlvUGFyYW1zLFxuICAgICAgbG9jYWxTdHJlYW1BdWRpbyxcbiAgICAgIGRlZkF1ZGlvSUQsXG4gICAgICB1c2VyRGVmYXVsdEF1ZGlvSW5wdXREZXZpY2UsXG4gICAgICBwYXJhbXMsXG4gICAgICBhdWRpb1BhcmFtc2UsXG4gICAgICBhUGFyYW1zLFxuICAgICAgaG9zdExhYmVsLFxuICAgICAgaXNsZXZlbCxcbiAgICAgIG1lbWJlcixcbiAgICAgIHVwZGF0ZU1haW5XaW5kb3csXG4gICAgICBsb2NrX3NjcmVlbixcbiAgICAgIHNoYXJlZCxcbiAgICAgIHZpZGVvQWxyZWFkeU9uLFxuICAgICAgc2hvd0FsZXJ0LFxuXG4gICAgICAvLyB1cGRhdGUgZnVuY3Rpb25zXG4gICAgICB1cGRhdGVQYXJ0aWNpcGFudHMsXG4gICAgICB1cGRhdGVUcmFuc3BvcnRDcmVhdGVkLFxuICAgICAgdXBkYXRlVHJhbnNwb3J0Q3JlYXRlZEF1ZGlvLFxuICAgICAgdXBkYXRlQXVkaW9BbHJlYWR5T24sXG4gICAgICB1cGRhdGVNaWNBY3Rpb24sXG4gICAgICB1cGRhdGVBdWRpb1BhcmFtcyxcbiAgICAgIHVwZGF0ZUxvY2FsU3RyZWFtLFxuICAgICAgdXBkYXRlTG9jYWxTdHJlYW1BdWRpbyxcbiAgICAgIHVwZGF0ZURlZkF1ZGlvSUQsXG4gICAgICB1cGRhdGVVc2VyRGVmYXVsdEF1ZGlvSW5wdXREZXZpY2UsXG4gICAgICB1cGRhdGVVcGRhdGVNYWluV2luZG93LFxuXG4gICAgICAvLyBtZWRpYXNmdSBmdW5jdGlvbnNcbiAgICAgIGNyZWF0ZVNlbmRUcmFuc3BvcnQsXG4gICAgICBjb25uZWN0U2VuZFRyYW5zcG9ydEF1ZGlvLFxuICAgICAgcmVzdW1lU2VuZFRyYW5zcG9ydEF1ZGlvLFxuICAgICAgcHJlcG9wdWxhdGVVc2VyTWVkaWEsXG4gICAgfSA9IHBhcmFtZXRlcnM7XG5cbiAgICBsb2NhbFN0cmVhbUF1ZGlvID0gc3RyZWFtO1xuICAgIHVwZGF0ZUxvY2FsU3RyZWFtQXVkaW8obG9jYWxTdHJlYW1BdWRpbyk7XG5cbiAgICAvLyBBZGQgdGhlIGF1ZGlvIHN0cmVhbSB0cmFjayB0byB0aGUgbG9jYWxTdHJlYW1cbiAgICBpZiAobG9jYWxTdHJlYW0gPT0gbnVsbCkge1xuICAgICAgbG9jYWxTdHJlYW0gPSBuZXcgTWVkaWFTdHJlYW0oW2xvY2FsU3RyZWFtQXVkaW8uZ2V0QXVkaW9UcmFja3MoKVswXV0pO1xuICAgICAgdXBkYXRlTG9jYWxTdHJlYW0obG9jYWxTdHJlYW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2NhbFN0cmVhbS5hZGRUcmFjayhsb2NhbFN0cmVhbUF1ZGlvLmdldEF1ZGlvVHJhY2tzKClbMF0pO1xuICAgICAgdXBkYXRlTG9jYWxTdHJlYW0obG9jYWxTdHJlYW0pO1xuICAgIH1cblxuICAgIGNvbnN0IGF1ZGlvVHJhY2tlZCA9IGxvY2FsU3RyZWFtLmdldEF1ZGlvVHJhY2tzKClbMF07XG4gICAgZGVmQXVkaW9JRCA9IGF1ZGlvVHJhY2tlZC5nZXRTZXR0aW5ncygpLmRldmljZUlkIHx8ICcnO1xuICAgIHVzZXJEZWZhdWx0QXVkaW9JbnB1dERldmljZSA9IGRlZkF1ZGlvSUQ7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHN0YXRlIHZhcmlhYmxlc1xuICAgIHVwZGF0ZURlZkF1ZGlvSUQoZGVmQXVkaW9JRCk7XG4gICAgdXBkYXRlVXNlckRlZmF1bHRBdWRpb0lucHV0RGV2aWNlKHVzZXJEZWZhdWx0QXVkaW9JbnB1dERldmljZSk7XG5cbiAgICB0cnkge1xuICAgICAgcGFyYW1zID0gYVBhcmFtcztcbiAgICAgIGF1ZGlvUGFyYW1zZSA9IHsgLi4ucGFyYW1zIH07XG5cbiAgICAgIGF1ZGlvUGFyYW1zID0geyB0cmFjazogbG9jYWxTdHJlYW0uZ2V0QXVkaW9UcmFja3MoKVswXSwgLi4uYXVkaW9QYXJhbXNlIH07XG4gICAgICB1cGRhdGVBdWRpb1BhcmFtcyhhdWRpb1BhcmFtcyk7XG5cbiAgICAgIC8vIENyZWF0ZSB0cmFuc3BvcnQgaWYgbm90IGNyZWF0ZWQgZWxzZSBjb25uZWN0IHRyYW5zcG9ydFxuICAgICAgaWYgKCF0cmFuc3BvcnRDcmVhdGVkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgY3JlYXRlU2VuZFRyYW5zcG9ydCh7XG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgIC4uLnBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgIGF1ZGlvUGFyYW1zOiBhdWRpb1BhcmFtcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcHRpb246ICdhdWRpbycsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgY3JlYXRpbmcgc2VuZCB0cmFuc3BvcnQ6JywgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXRyYW5zcG9ydENyZWF0ZWRBdWRpbykge1xuICAgICAgICAgIGF3YWl0IGNvbm5lY3RTZW5kVHJhbnNwb3J0QXVkaW8oe1xuICAgICAgICAgICAgYXVkaW9QYXJhbXMsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHJlc3VtZVNlbmRUcmFuc3BvcnRBdWRpbyh7IHBhcmFtZXRlcnMgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBzaG93QWxlcnQ/Lih7XG4gICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgIHR5cGU6ICdkYW5nZXInLFxuICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgcGFydGljaXBhbnRzIGFycmF5IHRvIHJlZmxlY3QgdGhlIGNoYW5nZVxuICAgIGF1ZGlvQWxyZWFkeU9uID0gdHJ1ZTtcbiAgICB1cGRhdGVBdWRpb0FscmVhZHlPbihhdWRpb0FscmVhZHlPbik7XG5cbiAgICBpZiAobWljQWN0aW9uKSB7XG4gICAgICBtaWNBY3Rpb24gPSBmYWxzZTtcbiAgICAgIHVwZGF0ZU1pY0FjdGlvbihtaWNBY3Rpb24pO1xuICAgIH1cblxuICAgIHBhcnRpY2lwYW50cy5mb3JFYWNoKChwYXJ0aWNpcGFudDogYW55KSA9PiB7XG4gICAgICBpZiAocGFydGljaXBhbnQuc29ja2V0SWQgPT0gc29ja2V0LmlkICYmIHBhcnRpY2lwYW50Lm5hbWUgPT0gbWVtYmVyKSB7XG4gICAgICAgIHBhcnRpY2lwYW50Lm11dGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdXBkYXRlUGFydGljaXBhbnRzKHBhcnRpY2lwYW50cyk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHRyYW5zcG9ydCBjcmVhdGVkIHN0YXRlXG4gICAgdHJhbnNwb3J0Q3JlYXRlZCA9IHRydWU7XG4gICAgdHJhbnNwb3J0Q3JlYXRlZEF1ZGlvID0gdHJ1ZTtcbiAgICB1cGRhdGVUcmFuc3BvcnRDcmVhdGVkKHRyYW5zcG9ydENyZWF0ZWQpO1xuICAgIHVwZGF0ZVRyYW5zcG9ydENyZWF0ZWRBdWRpbyh0cmFuc3BvcnRDcmVhdGVkQXVkaW8pO1xuXG4gICAgLy8gUmV1cGRhdGUgc2NyZWVuIGRpc3BsYXkgaWYgaG9zdFxuICAgIGlmICh2aWRlb0FscmVhZHlPbiA9PSBmYWxzZSAmJiBpc2xldmVsID09ICcyJykge1xuICAgICAgaWYgKCFsb2NrX3NjcmVlbiAmJiAhc2hhcmVkKSB7XG4gICAgICAgIHVwZGF0ZU1haW5XaW5kb3cgPSB0cnVlO1xuICAgICAgICB1cGRhdGVVcGRhdGVNYWluV2luZG93KHVwZGF0ZU1haW5XaW5kb3cpO1xuICAgICAgICBhd2FpdCBwcmVwb3B1bGF0ZVVzZXJNZWRpYSh7IG5hbWU6IGhvc3RMYWJlbCwgcGFyYW1ldGVycyB9KTtcbiAgICAgICAgdXBkYXRlTWFpbldpbmRvdyA9IGZhbHNlO1xuICAgICAgICB1cGRhdGVVcGRhdGVNYWluV2luZG93KHVwZGF0ZU1haW5XaW5kb3cpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
@@ -1,193 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- /**
4
- * Handles the successful initiation of screen sharing.
5
- *
6
- * This method sets up the necessary transport connections for screen sharing,
7
- * updates relevant application states, and notifies participants of the screen
8
- * sharing status.
9
- *
10
- * @param {StreamSuccessScreenOptions} options - The options for the screen sharing success handler.
11
- * @param {MediaStream} options.stream - The media stream to be shared.
12
- * @param {StreamSuccessScreenParameters} options.parameters - The parameters required for screen sharing.
13
- * @param {Socket} options.parameters.socket - The socket instance for real-time communication.
14
- * @param {boolean} options.parameters.transportCreated - Flag indicating if the transport is already created.
15
- * @param {MediaStream | null} options.parameters.localStreamScreen - The local screen media stream.
16
- * @param {boolean} options.parameters.screenAlreadyOn - Flag indicating if the screen is already being shared.
17
- * @param {boolean} options.parameters.screenAction - Flag indicating if the screen share action is requested.
18
- * @param {boolean} options.parameters.transportCreatedScreen - Flag indicating if the screen transport is created.
19
- * @param {string} options.parameters.hostLabel - The label of the host for this session.
20
- * @param {string} options.parameters.eventType - The type of event (e.g., conference).
21
- * @param {ShowAlert} [options.parameters.showAlert] - Optional function to show alert messages.
22
- * @param {boolean} options.parameters.annotateScreenStream - Flag indicating if screen annotation is enabled.
23
- * @param {Function} options.parameters.updateTransportCreatedScreen - Function to update the screen transport creation state.
24
- * @param {Function} options.parameters.updateScreenAlreadyOn - Function to update the screen sharing state.
25
- * @param {Function} options.parameters.updateScreenAction - Function to update the screen action state.
26
- * @param {Function} options.parameters.updateTransportCreated - Function to update the transport creation state.
27
- * @param {Function} options.parameters.updateLocalStreamScreen - Function to update the local screen stream.
28
- * @param {Function} options.parameters.updateShared - Function to update the shared state.
29
- * @param {Function} options.parameters.updateIsScreenboardModalVisible - Function to update the screenboard modal visibility.
30
- * @param {Function} options.parameters.sleep - Function to pause execution for a specified time.
31
- * @param {Function} options.parameters.createSendTransport - Function to create a send transport for screen sharing.
32
- * @param {Function} options.parameters.connectSendTransportScreen - Function to connect the send transport for screen sharing.
33
- * @param {Function} options.parameters.disconnectSendTransportScreen - Function to disconnect the send transport for screen sharing.
34
- * @param {Function} options.parameters.stopShareScreen - Function to stop the screen sharing process.
35
- * @param {Function} options.parameters.reorderStreams - Function to reorder streams based on current state.
36
- * @param {Function} options.parameters.prepopulateUserMedia - Function to prepopulate user media based on current settings.
37
- * @param {Function} options.parameters.rePort - Function to reinitialize ports if needed.
38
- *
39
- * @returns {Promise<void>} A promise that resolves when the screen sharing setup is complete.
40
- *
41
- * @throws {Error} Throws an error if there is an issue during the screen sharing setup.
42
- *
43
- * @example
44
- * await streamSuccessScreen({
45
- * stream: newScreenStream,
46
- * parameters: {
47
- * socket: socketInstance,
48
- * localStreamScreen: null,
49
- * // other parameters...
50
- * },
51
- * });
52
- */
53
- export class StreamSuccessScreen {
54
- /**
55
- * Handles the successful initiation of screen sharing.
56
- *
57
- * @param {StreamSuccessScreenOptions} options - The options for the screen sharing success handler.
58
- * @param {MediaStream} options.stream - The media stream to be shared.
59
- * @param {Object} options.parameters - The parameters required for screen sharing.
60
- * @param {Function} options.parameters.getUpdatedAllParams - Function to get updated parameters.
61
- * @param {Socket} options.parameters.socket - The socket instance for communication.
62
- * @param {boolean} options.parameters.transportCreated - Flag indicating if the transport is already created.
63
- * @param {MediaStream} options.parameters.localStreamScreen - The local screen media stream.
64
- * @param {boolean} options.parameters.screenAlreadyOn - Flag indicating if the screen is already being shared.
65
- * @param {boolean} options.parameters.screenAction - Flag indicating if the screen share action is requested.
66
- * @param {boolean} options.parameters.transportCreatedScreen - Flag indicating if the screen transport is created.
67
- * @param {string} options.parameters.hostLabel - The label of the host.
68
- * @param {string} options.parameters.eventType - The type of the event (e.g., conference).
69
- * @param {Function} options.parameters.showAlert - Function to show alerts.
70
- * @param {boolean} options.parameters.annotateScreenStream - Flag indicating if screen annotation is enabled.
71
- * @param {Function} options.parameters.updateTransportCreatedScreen - Function to update the screen transport creation state.
72
- * @param {Function} options.parameters.updateScreenAlreadyOn - Function to update the screen sharing state.
73
- * @param {Function} options.parameters.updateScreenAction - Function to update the screen action state.
74
- * @param {Function} options.parameters.updateTransportCreated - Function to update the transport creation state.
75
- * @param {Function} options.parameters.updateLocalStreamScreen - Function to update the local screen stream.
76
- * @param {Function} options.parameters.updateShared - Function to update the shared state.
77
- * @param {Function} options.parameters.updateIsScreenboardModalVisible - Function to update the screenboard modal visibility.
78
- * @param {Function} options.parameters.sleep - Function to pause execution for a specified duration.
79
- * @param {Function} options.parameters.createSendTransport - Function to create a send transport.
80
- * @param {Function} options.parameters.connectSendTransportScreen - Function to connect the send transport for screen sharing.
81
- * @param {Function} options.parameters.disconnectSendTransportScreen - Function to disconnect the send transport for screen sharing.
82
- * @param {Function} options.parameters.stopShareScreen - Function to stop screen sharing.
83
- * @param {Function} options.parameters.reorderStreams - Function to reorder streams.
84
- * @param {Function} options.parameters.prepopulateUserMedia - Function to prepopulate user media.
85
- * @param {Function} options.parameters.rePort - Function to reinitialize ports.
86
- *
87
- * @returns {Promise<void>} A promise that resolves when the screen sharing setup is complete.
88
- */
89
- async streamSuccessScreen({ stream, parameters }) {
90
- let { getUpdatedAllParams } = parameters;
91
- parameters = getUpdatedAllParams();
92
- let { socket, transportCreated, localStreamScreen, screenAlreadyOn, screenAction, transportCreatedScreen, hostLabel, eventType, showAlert, annotateScreenStream,
93
- // updates for the above
94
- updateTransportCreatedScreen, updateScreenAlreadyOn, updateScreenAction, updateTransportCreated, updateLocalStreamScreen, updateShared, updateIsScreenboardModalVisible, sleep,
95
- // mediasfu functions
96
- createSendTransport, connectSendTransportScreen, disconnectSendTransportScreen, stopShareScreen, reorderStreams, prepopulateUserMedia, rePort, } = parameters;
97
- // Share screen on success
98
- localStreamScreen = stream;
99
- updateLocalStreamScreen(localStreamScreen);
100
- try {
101
- // Create transport if not created else connect transport
102
- if (!transportCreated) {
103
- await createSendTransport({
104
- option: 'screen',
105
- parameters: { ...parameters, localStreamScreen },
106
- });
107
- }
108
- else {
109
- await connectSendTransportScreen({
110
- stream: localStreamScreen,
111
- parameters: { ...parameters, localStreamScreen },
112
- });
113
- }
114
- // Alert the socket that you are sharing screen
115
- socket.emit('startScreenShare');
116
- }
117
- catch (error) {
118
- showAlert?.({
119
- message: error.message,
120
- type: 'danger',
121
- duration: 3000,
122
- });
123
- }
124
- // Reupdate the screen display
125
- try {
126
- updateShared(true);
127
- await prepopulateUserMedia({
128
- name: hostLabel,
129
- parameters: { ...parameters, localStreamScreen, shared: true },
130
- });
131
- }
132
- catch {
133
- /* handle error */
134
- }
135
- // Update the participants array to reflect the change
136
- screenAlreadyOn = true;
137
- updateScreenAlreadyOn(screenAlreadyOn);
138
- // Reorder streams if required
139
- try {
140
- if (eventType == 'conference') {
141
- await reorderStreams({ add: false, screenChanged: true, parameters });
142
- await prepopulateUserMedia({ name: hostLabel, parameters });
143
- }
144
- else {
145
- await reorderStreams({ parameters });
146
- }
147
- }
148
- catch (error) {
149
- try {
150
- await rePort({ parameters });
151
- }
152
- catch {
153
- /* handle error */
154
- }
155
- }
156
- // Handle screen share end
157
- localStreamScreen.getVideoTracks()[0].onended = async function () {
158
- // Supports both manual and automatic screen share end
159
- await disconnectSendTransportScreen({ parameters });
160
- await stopShareScreen({ parameters });
161
- };
162
- // If user requested to share screen, update the screenAction state
163
- if (screenAction == true) {
164
- screenAction = false;
165
- }
166
- updateScreenAction(screenAction);
167
- // Update the transport created state
168
- transportCreatedScreen = true;
169
- updateTransportCreatedScreen(transportCreatedScreen);
170
- updateTransportCreated(transportCreated);
171
- // Handle screen annotation modal
172
- try {
173
- if (annotateScreenStream) {
174
- annotateScreenStream = false;
175
- updateIsScreenboardModalVisible(true);
176
- await sleep({ ms: 500 });
177
- updateIsScreenboardModalVisible(false);
178
- }
179
- }
180
- catch (error) {
181
- //console.log('Error handling screen annotation:', error);
182
- }
183
- }
184
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: StreamSuccessScreen, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
185
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: StreamSuccessScreen, providedIn: 'root' });
186
- }
187
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: StreamSuccessScreen, decorators: [{
188
- type: Injectable,
189
- args: [{
190
- providedIn: 'root',
191
- }]
192
- }] });
193
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLXN1Y2Nlc3Mtc2NyZWVuLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZWRpYXNmdS1hbmd1bGFyL3NyYy9saWIvY29uc3VtZXJzL3N0cmVhbS1zdWNjZXNzLXNjcmVlbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBc0UzQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlERztBQUtILE1BQU0sT0FBTyxtQkFBbUI7SUFDOUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FrQ0c7SUFDSCxLQUFLLENBQUMsbUJBQW1CLENBQUMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUE4QjtRQUMxRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsR0FBRyxVQUFVLENBQUM7UUFDekMsVUFBVSxHQUFHLG1CQUFtQixFQUFFLENBQUM7UUFFbkMsSUFBSSxFQUNGLE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixZQUFZLEVBQ1osc0JBQXNCLEVBQ3RCLFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULG9CQUFvQjtRQUVwQix3QkFBd0I7UUFDeEIsNEJBQTRCLEVBQzVCLHFCQUFxQixFQUNyQixrQkFBa0IsRUFDbEIsc0JBQXNCLEVBQ3RCLHVCQUF1QixFQUN2QixZQUFZLEVBQ1osK0JBQStCLEVBQy9CLEtBQUs7UUFFTCxxQkFBcUI7UUFDckIsbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQiw2QkFBNkIsRUFDN0IsZUFBZSxFQUNmLGNBQWMsRUFDZCxvQkFBb0IsRUFDcEIsTUFBTSxHQUNQLEdBQUcsVUFBVSxDQUFDO1FBRWYsMEJBQTBCO1FBQzFCLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztRQUMzQix1QkFBdUIs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b0JBQW9CLEdBQUcsS0FBSyxDQUFDO2dCQUM3QiwrQkFBK0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDekIsK0JBQStCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekMsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsMERBQTBEO1FBQzVELENBQUM7SUFDSCxDQUFDO3VHQWhLVSxtQkFBbUI7MkdBQW5CLG1CQUFtQixjQUZsQixNQUFNOzsyRkFFUCxtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU29ja2V0IH0gZnJvbSAnc29ja2V0LmlvLWNsaWVudCc7XG5pbXBvcnQge1xuICBTbGVlcFR5cGUsXG4gIENyZWF0ZVNlbmRUcmFuc3BvcnRUeXBlLFxuICBDb25uZWN0U2VuZFRyYW5zcG9ydFNjcmVlblR5cGUsXG4gIERpc2Nvbm5lY3RTZW5kVHJhbnNwb3J0U2NyZWVuVHlwZSxcbiAgU3RvcFNoYXJlU2NyZWVuVHlwZSxcbiAgUmVvcmRlclN0cmVhbXNUeXBlLFxuICBQcmVwb3B1bGF0ZVVzZXJNZWRpYVR5cGUsXG4gIFJlUG9ydFR5cGUsXG4gIFNob3dBbGVydCxcbiAgQ3JlYXRlU2VuZFRyYW5zcG9ydFBhcmFtZXRlcnMsXG4gIENvbm5lY3RTZW5kVHJhbnNwb3J0U2NyZWVuUGFyYW1ldGVycyxcbiAgRGlzY29ubmVjdFNlbmRUcmFuc3BvcnRTY3JlZW5QYXJhbWV0ZXJzLFxuICBTdG9wU2hhcmVTY3JlZW5QYXJhbWV0ZXJzLFxuICBSZW9yZGVyU3RyZWFtc1BhcmFtZXRlcnMsXG4gIFByZXBvcHVsYXRlVXNlck1lZGlhUGFyYW1ldGVycyxcbiAgRXZlbnRUeXBlLFxufSBmcm9tICcuLi9AdHlwZXMvdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVhbVN1Y2Nlc3NTY3JlZW5QYXJhbWV0ZXJzXG4gIGV4dGVuZHMgQ3JlYXRlU2VuZFRyYW5zcG9ydFBhcmFtZXRlcnMsXG4gICAgQ29ubmVjdFNlbmRUcmFuc3BvcnRTY3JlZW5QYXJhbWV0ZXJzLFxuICAgIERpc2Nvbm5lY3RTZW5kVHJhbnNwb3J0U2NyZWVuUGFyYW1ldGVycyxcbiAgICBTdG9wU2hhcmVTY3JlZW5QYXJhbWV0ZXJzLFxuICAgIFJlb3JkZXJTdHJlYW1zUGFyYW1ldGVycyxcbiAgICBQcmVwb3B1bGF0ZVVzZXJNZWRpYVBhcmFtZXRlcnMge1xuICBzb2NrZXQ6IFNvY2tldDtcbiAgdHJhbnNwb3J0Q3JlYXRlZDogYm9vbGVhbjtcbiAgbG9jYWxTdHJlYW1TY3JlZW46IE1lZGlhU3RyZWFtIHwgbnVsbDtcbiAgc2NyZWVuQWxyZWFkeU9uOiBib29sZWFuO1xuICBzY3JlZW5BY3Rpb246IGJvb2xlYW47XG4gIHRyYW5zcG9ydENyZWF0ZWRTY3JlZW46IGJvb2xlYW47XG4gIGhvc3RMYWJlbDogc3RyaW5nO1xuICBldmVudFR5cGU6IEV2ZW50VHlwZTtcbiAgc2hvd0FsZXJ0PzogU2hvd0FsZXJ0O1xuICBhbm5vdGF0ZVNjcmVlblN0cmVhbTogYm9vbGVhbjtcbiAgc2hhcmVkOiBib29sZWFuO1xuXG4gIHVwZGF0ZVRyYW5zcG9ydENyZWF0ZWRTY3JlZW46ICh0cmFuc3BvcnRDcmVhdGVkU2NyZWVuOiBib29sZWFuKSA9PiB2b2lkO1xuICB1cGRhdGVTY3JlZW5BbHJlYWR5T246IChzY3JlZW5BbHJlYWR5T246IGJvb2xlYW4pID0+IHZvaWQ7XG4gIHVwZGF0ZVNjcmVlbkFjdGlvbjogKHNjcmVlbkFjdGlvbjogYm9vbGVhbikgPT4gdm9pZDtcbiAgdXBkYXRlVHJhbnNwb3J0Q3JlYXRlZDogKHRyYW5zcG9ydENyZWF0ZWQ6IGJvb2xlYW4pID0+IHZvaWQ7XG4gIHVwZGF0ZUxvY2FsU3RyZWFtU2NyZWVuOiAobG9jYWxTdHJlYW1TY3JlZW46IE1lZGlhU3RyZWFtIHwgbnVsbCkgPT4gdm9pZDtcbiAgdXBkYXRlU2hhcmVkOiAoc2hhcmVkOiBib29sZWFuKSA9PiB2b2lkO1xuICB1cGRhdGVJc1NjcmVlbmJvYXJkTW9kYWxWaXNpYmxlOiAoaXNWaXNpYmxlOiBib29sZWFuKSA9PiB2b2lkO1xuXG4gIC8vIG1lZGlhc2Z1IGZ1bmN0aW9uc1xuICBzbGVlcDogU2xlZXBUeXBlO1xuICBjcmVhdGVTZW5kVHJhbnNwb3J0OiBDcmVhdGVTZW5kVHJhbnNwb3J0VHlwZTtcbiAgY29ubmVjdFNlbmRUcmFuc3BvcnRTY3JlZW46IENvbm5lY3RTZW5kVHJhbnNwb3J0U2NyZWVuVHlwZTtcbiAgZGlzY29ubmVjdFNlbmRUcmFuc3BvcnRTY3JlZW46IERpc2Nvbm5lY3RTZW5kVHJhbnNwb3J0U2NyZWVuVHlwZTtcbiAgc3RvcFNoYXJlU2NyZWVuOiBTdG9wU2hhcmVTY3JlZW5UeXBlO1xuICByZW9yZGVyU3RyZWFtczogUmVvcmRlclN0cmVhbXNUeXBlO1xuICBwcmVwb3B1bGF0ZVVzZXJNZWRpYTogUHJlcG9wdWxhdGVVc2VyTWVkaWFUeXBlO1xuICByZVBvcnQ6IFJlUG9ydFR5cGU7XG5cbiAgZ2V0VXBkYXRlZEFsbFBhcmFtczogKCkgPT4gU3RyZWFtU3VjY2Vzc1NjcmVlblBhcmFtZXRlcnM7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1TdWNjZXNzU2NyZWVuT3B0aW9ucyB7XG4gIHN0cmVhbTogTWVkaWFTdHJlYW07XG4gIHBhcmFtZXRlcnM6IFN0cmVhbVN1Y2Nlc3NTY3JlZW5QYXJhbWV0ZXJzO1xufVxuXG4vLyBFeHBvcnQgdGhlIHR5cGUgZGVmaW5pdGlvbiBmb3IgdGhlIGZ1bmN0aW9uXG5leHBvcnQgdHlwZSBTdHJlYW1TdWNjZXNzU2NyZWVuVHlwZSA9IChvcHRpb25zOiBTdHJlYW1TdWNjZXNzU2NyZWVuT3B0aW9ucykgPT4gUHJvbWlzZTx2b2lkPjtcblxuLyoqXG4gKiBIYW5kbGVzIHRoZSBzdWNjZXNzZnVsIGluaXRpYXRpb24gb2Ygc2NyZWVuIHNoYXJpbmcuXG4gKlxuICogVGhpcyBtZXRob2Qgc2V0cyB1cCB0aGUgbmVjZXNzYXJ5IHRyYW5zcG9ydCBjb25uZWN0aW9ucyBmb3Igc2NyZWVuIHNoYXJpbmcsXG4gKiB1cGRhdGVzIHJlbGV2YW50IGFwcGxpY2F0aW9uIHN0YXRlcywgYW5kIG5vdGlmaWVzIHBhcnRpY2lwYW50cyBvZiB0aGUgc2NyZWVuXG4gKiBzaGFyaW5nIHN0YXR1cy5cbiAqXG4gKiBAcGFyYW0ge1N0cmVhbVN1Y2Nlc3NTY3JlZW5PcHRpb25zfSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBzY3JlZW4gc2hhcmluZyBzdWNjZXNzIGhhbmRsZXIuXG4gKiBAcGFyYW0ge01lZGlhU3RyZWFtfSBvcHRpb25zLnN0cmVhbSAtIFRoZSBtZWRpYSBzdHJlYW0gdG8gYmUgc2hhcmVkLlxuICogQHBhcmFtIHtTdHJlYW1TdWNjZXNzU2NyZWVuUGFyYW1ldGVyc30gb3B0aW9ucy5wYXJhbWV0ZXJzIC0gVGhlIHBhcmFtZXRlcnMgcmVxdWlyZWQgZm9yIHNjcmVlbiBzaGFyaW5nLlxuICogQHBhcmFtIHtTb2NrZXR9IG9wdGlvbnMucGFyYW1ldGVycy5zb2NrZXQgLSBUaGUgc29ja2V0IGluc3RhbmNlIGZvciByZWFsLXRpbWUgY29tbXVuaWNhdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLnRyYW5zcG9ydENyZWF0ZWQgLSBGbGFnIGluZGljYXRpbmcgaWYgdGhlIHRyYW5zcG9ydCBpcyBhbHJlYWR5IGNyZWF0ZWQuXG4gKiBAcGFyYW0ge01lZGlhU3RyZWFtIHwgbnVsbH0gb3B0aW9ucy5wYXJhbWV0ZXJzLmxvY2FsU3RyZWFtU2NyZWVuIC0gVGhlIGxvY2FsIHNjcmVlbiBtZWRpYSBzdHJlYW0uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMucGFyYW1ldGVycy5zY3JlZW5BbHJlYWR5T24gLSBGbGFnIGluZGljYXRpbmcgaWYgdGhlIHNjcmVlbiBpcyBhbHJlYWR5IGJlaW5nIHNoYXJlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLnNjcmVlbkFjdGlvbiAtIEZsYWcgaW5kaWNhdGluZyBpZiB0aGUgc2NyZWVuIHNoYXJlIGFjdGlvbiBpcyByZXF1ZXN0ZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMucGFyYW1ldGVycy50cmFuc3BvcnRDcmVhdGVkU2NyZWVuIC0gRmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBzY3JlZW4gdHJhbnNwb3J0IGlzIGNyZWF0ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5wYXJhbWV0ZXJzLmhvc3RMYWJlbCAtIFRoZSBsYWJlbCBvZiB0aGUgaG9zdCBmb3IgdGhpcyBzZXNzaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMucGFyYW1ldGVycy5ldmVudFR5cGUgLSBUaGUgdHlwZSBvZiBldmVudCAoZS5nLiwgY29uZmVyZW5jZSkuXG4gKiBAcGFyYW0ge1Nob3dBbGVydH0gW29wdGlvbnMucGFyYW1ldGVycy5zaG93QWxlcnRdIC0gT3B0aW9uYWwgZnVuY3Rpb24gdG8gc2hvdyBhbGVydCBtZXNzYWdlcy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLmFubm90YXRlU2NyZWVuU3RyZWFtIC0gRmxhZyBpbmRpY2F0aW5nIGlmIHNjcmVlbiBhbm5vdGF0aW9uIGlzIGVuYWJsZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLnBhcmFtZXRlcnMudXBkYXRlVHJhbnNwb3J0Q3JlYXRlZFNjcmVlbiAtIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgc2NyZWVuIHRyYW5zcG9ydCBjcmVhdGlvbiBzdGF0ZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMucGFyYW1ldGVycy51cGRhdGVTY3JlZW5BbHJlYWR5T24gLSBGdW5jdGlvbiB0byB1cGRhdGUgdGhlIHNjcmVlbiBzaGFyaW5nIHN0YXRlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLnVwZGF0ZVNjcmVlbkFjdGlvbiAtIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgc2NyZWVuIGFjdGlvbiBzdGF0ZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMucGFyYW1ldGVycy51cGRhdGVUcmFuc3BvcnRDcmVhdGVkIC0gRnVuY3Rpb24gdG8gdXBkYXRlIHRoZSB0cmFuc3BvcnQgY3JlYXRpb24gc3RhdGUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLnBhcmFtZXRlcnMudXBkYXRlTG9jYWxTdHJlYW1TY3JlZW4gLSBGdW5jdGlvbiB0byB1cGRhdGUgdGhlIGxvY2FsIHNjcmVlbiBzdHJlYW0uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLnBhcmFtZXRlcnMudXBkYXRlU2hhcmVkIC0gRnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBzaGFyZWQgc3RhdGUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLnBhcmFtZXRlcnMudXBkYXRlSXNTY3JlZW5ib2FyZE1vZGFsVmlzaWJsZSAtIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgc2NyZWVuYm9hcmQgbW9kYWwgdmlzaWJpbGl0eS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMucGFyYW1ldGVycy5zbGVlcCAtIEZ1bmN0aW9uIHRvIHBhdXNlIGV4ZWN1dGlvbiBmb3IgYSBzcGVjaWZpZWQgdGltZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMucGFyYW1ldGVycy5jcmVhdGVTZW5kVHJhbnNwb3J0IC0gRnVuY3Rpb24gdG8gY3JlYXRlIGEgc2VuZCB0cmFuc3BvcnQgZm9yIHNjcmVlbiBzaGFyaW5nLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLmNvbm5lY3RTZW5kVHJhbnNwb3J0U2NyZWVuIC0gRnVuY3Rpb24gdG8gY29ubmVjdCB0aGUgc2VuZCB0cmFuc3BvcnQgZm9yIHNjcmVlbiBzaGFyaW5nLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLmRpc2Nvbm5lY3RTZW5kVHJhbnNwb3J0U2NyZWVuIC0gRnVuY3Rpb24gdG8gZGlzY29ubmVjdCB0aGUgc2VuZCB0cmFuc3BvcnQgZm9yIHNjcmVlbiBzaGFyaW5nLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLnN0b3BTaGFyZVNjcmVlbiAtIEZ1bmN0aW9uIHRvIHN0b3AgdGhlIHNjcmVlbiBzaGFyaW5nIHByb2Nlc3MuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLnBhcmFtZXRlcnMucmVvcmRlclN0cmVhbXMgLSBGdW5jdGlvbiB0byByZW9yZGVyIHN0cmVhbXMgYmFzZWQgb24gY3VycmVudCBzdGF0ZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMucGFyYW1ldGVycy5wcmVwb3B1bGF0ZVVzZXJNZWRpYSAtIEZ1bmN0aW9uIHRvIHByZXBvcHVsYXRlIHVzZXIgbWVkaWEgYmFzZWQgb24gY3VycmVudCBzZXR0aW5ncy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMucGFyYW1ldGVycy5yZVBvcnQgLSBGdW5jdGlvbiB0byByZWluaXRpYWxpemUgcG9ydHMgaWYgbmVlZGVkLlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzY3JlZW4gc2hhcmluZyBzZXR1cCBpcyBjb21wbGV0ZS5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZXJlIGlzIGFuIGlzc3VlIGR1cmluZyB0aGUgc2NyZWVuIHNoYXJpbmcgc2V0dXAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGF3YWl0IHN0cmVhbVN1Y2Nlc3NTY3JlZW4oe1xuICogICBzdHJlYW06IG5ld1NjcmVlblN0cmVhbSxcbiAqICAgcGFyYW1ldGVyczoge1xuICogICAgIHNvY2tldDogc29ja2V0SW5zdGFuY2UsXG4gKiAgICAgbG9jYWxTdHJlYW1TY3JlZW46IG51bGwsXG4gKiAgICAgLy8gb3RoZXIgcGFyYW1ldGVycy4uLlxuICogICB9LFxuICogfSk7XG4gKi9cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFN0cmVhbVN1Y2Nlc3NTY3JlZW4ge1xuICAvKipcbiAgICogSGFuZGxlcyB0aGUgc3VjY2Vzc2Z1bCBpbml0aWF0aW9uIG9mIHNjcmVlbiBzaGFyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmVhbVN1Y2Nlc3NTY3JlZW5PcHRpb25zfSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBzY3JlZW4gc2hhcmluZyBzdWNjZXNzIGhhbmRsZXIuXG4gICAqIEBwYXJhbSB7TWVkaWFTdHJlYW19IG9wdGlvbnMuc3RyZWFtIC0gVGhlIG1lZGlhIHN0cmVhbSB0byBiZSBzaGFyZWQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLnBhcmFtZXRlcnMgLSBUaGUgcGFyYW1ldGVycyByZXF1aXJlZCBmb3Igc2NyZWVuIHNoYXJpbmcuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMucGFyYW1ldGVycy5nZXRVcGRhdGVkQWxsUGFyYW1zIC0gRnVuY3Rpb24gdG8gZ2V0IHVwZGF0ZWQgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtTb2NrZXR9IG9wdGlvbnMucGFyYW1ldGVycy5zb2NrZXQgLSBUaGUgc29ja2V0IGluc3RhbmNlIGZvciBjb21tdW5pY2F0aW9uLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMucGFyYW1ldGVycy50cmFuc3BvcnRDcmVhdGVkIC0gRmxhZyBpbmRpY2F0aW5nIGlmIHRoZSB0cmFuc3BvcnQgaXMgYWxyZWFkeSBjcmVhdGVkLlxuICAgKiBAcGFyYW0ge01lZGlhU3RyZWFtfSBvcHRpb25zLnBhcmFtZXRlcnMubG9jYWxTdHJlYW1TY3JlZW4gLSBUaGUgbG9jYWwgc2NyZWVuIG1lZGlhIHN0cmVhbS5cbiAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLnBhcmFtZXRlcnMuc2NyZWVuQWxyZWFkeU9uIC0gRmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBzY3JlZW4gaXMgYWxyZWFkeSBiZWluZyBzaGFyZWQuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLnNjcmVlbkFjdGlvbiAtIEZsYWcgaW5kaWNhdGluZyBpZiB0aGUgc2NyZWVuIHNoYXJlIGFjdGlvbiBpcyByZXF1ZXN0ZWQuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLnRyYW5zcG9ydENyZWF0ZWRTY3JlZW4gLSBGbGFnIGluZGljYXRpbmcgaWYgdGhlIHNjcmVlbiB0cmFuc3BvcnQgaXMgY3JlYXRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMucGFyYW1ldGVycy5ob3N0TGFiZWwgLSBUaGUgbGFiZWwgb2YgdGhlIGhvc3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnBhcmFtZXRlcnMuZXZlbnRUeXBlIC0gVGhlIHR5cGUgb2YgdGhlIGV2ZW50IChlLmcuLCBjb25mZXJlbmNlKS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLnNob3dBbGVydCAtIEZ1bmN0aW9uIHRvIHNob3cgYWxlcnRzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMucGFyYW1ldGVycy5hbm5vdGF0ZVNjcmVlblN0cmVhbSAtIEZsYWcgaW5kaWNhdGluZyBpZiBzY3JlZW4gYW5ub3RhdGlvbiBpcyBlbmFibGVkLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLnBhcmFtZXRlcnMudXBkYXRlVHJhbnNwb3J0Q3JlYXRlZFNjcmVlbiAtIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgc2NyZWVuIHRyYW5zcG9ydCBjcmVhdGlvbiBzdGF0ZS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLnVwZGF0ZVNjcmVlbkFscmVhZHlPbiAtIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgc2NyZWVuIHNoYXJpbmcgc3RhdGUuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMucGFyYW1ldGVycy51cGRhdGVTY3JlZW5BY3Rpb24gLSBGdW5jdGlvbiB0byB1cGRhdGUgdGhlIHNjcmVlbiBhY3Rpb24gc3RhdGUuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMucGFyYW1ldGVycy51cGRhdGVUcmFuc3BvcnRDcmVhdGVkIC0gRnVuY3Rpb24gdG8gdXBkYXRlIHRoZSB0cmFuc3BvcnQgY3JlYXRpb24gc3RhdGUuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMucGFyYW1ldGVycy51cGRhdGVMb2NhbFN0cmVhbVNjcmVlbiAtIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgbG9jYWwgc2NyZWVuIHN0cmVhbS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLnVwZGF0ZVNoYXJlZCAtIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgc2hhcmVkIHN0YXRlLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLnBhcmFtZXRlcnMudXBkYXRlSXNTY3JlZW5ib2FyZE1vZGFsVmlzaWJsZSAtIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgc2NyZWVuYm9hcmQgbW9kYWwgdmlzaWJpbGl0eS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLnNsZWVwIC0gRnVuY3Rpb24gdG8gcGF1c2UgZXhlY3V0aW9uIGZvciBhIHNwZWNpZmllZCBkdXJhdGlvbi5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLmNyZWF0ZVNlbmRUcmFuc3BvcnQgLSBGdW5jdGlvbiB0byBjcmVhdGUgYSBzZW5kIHRyYW5zcG9ydC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5wYXJhbWV0ZXJzLmNvbm5lY3RTZW5kVHJhbnNwb3J0U2NyZWVuIC0gRnVuY3Rpb24gdG8gY29ubmVjdCB0aGUgc2VuZCB0cmFuc3BvcnQgZm9yIHNjcmVlbiBzaGFyaW5nLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLnBhcmFtZXRlcnMuZGlzY29ubmVjdFNlbmRUcmFuc3BvcnRTY3JlZW4gLSBGdW5jdGlvbiB0byBkaXNjb25uZWN0IHRoZSBzZW5kIHRyYW5zcG9ydCBmb3Igc2NyZWVuIHNoYXJpbmcuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMucGFyYW1ldGVycy5zdG9wU2hhcmVTY3JlZW4gLSBGdW5jdGlvbiB0byBzdG9wIHNjcmVlbiBzaGFyaW5nLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLnBhcmFtZXRlcnMucmVvcmRlclN0cmVhbXMgLSBGdW5jdGlvbiB0byByZW9yZGVyIHN0cmVhbXMuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMucGFyYW1ldGVycy5wcmVwb3B1bGF0ZVVzZXJNZWRpYSAtIEZ1bmN0aW9uIHRvIHByZXBvcHVsYXRlIHVzZXIgbWVkaWEuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMucGFyYW1ldGVycy5yZVBvcnQgLSBGdW5jdGlvbiB0byByZWluaXRpYWxpemUgcG9ydHMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzY3JlZW4gc2hhcmluZyBzZXR1cCBpcyBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHN0cmVhbVN1Y2Nlc3NTY3JlZW4oeyBzdHJlYW0sIHBhcmFtZXRlcnMgfTogU3RyZWFtU3VjY2Vzc1NjcmVlbk9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgeyBnZXRVcGRhdGVkQWxsUGFyYW1zIH0gPSBwYXJhbWV0ZXJzO1xuICAgIHBhcmFtZXRlcnMgPSBnZXRVcGRhdGVkQWxsUGFyYW1zKCk7XG5cbiAgICBsZXQge1xuICAgICAgc29ja2V0LFxuICAgICAgdHJhbnNwb3J0Q3JlYXRlZCxcbiAgICAgIGxvY2FsU3RyZWFtU2NyZWVuLFxuICAgICAgc2NyZWVuQWxyZWFkeU9uLFxuICAgICAgc2NyZWVuQWN0aW9uLFxuICAgICAgdHJhbnNwb3J0Q3JlYXRlZFNjcmVlbixcbiAgICAgIGhvc3RMYWJlbCxcbiAgICAgIGV2ZW50VHlwZSxcbiAgICAgIHNob3dBbGVydCxcbiAgICAgIGFubm90YXRlU2NyZWVuU3RyZWFtLFxuXG4gICAgICAvLyB1cGRhdGVzIGZvciB0aGUgYWJvdmVcbiAgICAgIHVwZGF0ZVRyYW5zcG9ydENyZWF0ZWRTY3JlZW4sXG4gICAgICB1cGRhdGVTY3JlZW5BbHJlYWR5T24sXG4gICAgICB1cGRhdGVTY3JlZW5BY3Rpb24sXG4gICAgICB1cGRhdGVUcmFuc3BvcnRDcmVhdGVkLFxuICAgICAgdXBkYXRlTG9jYWxTdHJlYW1TY3JlZW4sXG4gICAgICB1cGRhdGVTaGFyZWQsXG4gICAgICB1cGRhdGVJc1NjcmVlbmJvYXJkTW9kYWxWaXNpYmxlLFxuICAgICAgc2xlZXAsXG5cbiAgICAgIC8vIG1lZGlhc2Z1IGZ1bmN0aW9uc1xuICAgICAgY3JlYXRlU2VuZFRyYW5zcG9ydCxcbiAgICAgIGNvbm5lY3RTZW5kVHJhbnNwb3J0U2NyZWVuLFxuICAgICAgZGlzY29ubmVjdFNlbmRUcmFuc3BvcnRTY3JlZW4sXG4gICAgICBzdG9wU2hhcmVTY3JlZW4sXG4gICAgICByZW9yZGVyU3RyZWFtcyxcbiAgICAgIHByZXBvcHVsYXRlVXNlck1lZGlhLFxuICAgICAgcmVQb3J0LFxuICAgIH0gPSBwYXJhbWV0ZXJzO1xuXG4gICAgLy8gU2hhcmUgc2NyZWVuIG9uIHN1Y2Nlc3NcbiAgICBsb2NhbFN0cmVhbVNjcmVlbiA9IHN0cmVhbTtcbiAgICB1cGRhdGVMb2NhbFN0cmVhbVNjcmVlbihsb2NhbFN0cmVhbVNjcmVlbik7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIHRyYW5zcG9ydCBpZiBub3QgY3JlYXRlZCBlbHNlIGNvbm5lY3QgdHJhbnNwb3J0XG4gICAgICBpZiAoIXRyYW5zcG9ydENyZWF0ZWQpIHtcbiAgICAgICAgYXdhaXQgY3JlYXRlU2VuZFRyYW5zcG9ydCh7XG4gICAgICAgICAgb3B0aW9uOiAnc2NyZWVuJyxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7IC4uLnBhcmFtZXRlcnMsIGxvY2FsU3RyZWFtU2NyZWVuIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgY29ubmVjdFNlbmRUcmFuc3BvcnRTY3JlZW4oe1xuICAgICAgICAgIHN0cmVhbTogbG9jYWxTdHJlYW1TY3JlZW4sXG4gICAgICAgICAgcGFyYW1ldGVyczogeyAuLi5wYXJhbWV0ZXJzLCBsb2NhbFN0cmVhbVNjcmVlbiB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gQWxlcnQgdGhlIHNvY2tldCB0aGF0IHlvdSBhcmUgc2hhcmluZyBzY3JlZW5cbiAgICAgIHNvY2tldC5lbWl0KCdzdGFydFNjcmVlblNoYXJlJyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgc2hvd0FsZXJ0Py4oe1xuICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICB0eXBlOiAnZGFuZ2VyJyxcbiAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBSZXVwZGF0ZSB0aGUgc2NyZWVuIGRpc3BsYXlcbiAgICB0cnkge1xuICAgICAgdXBkYXRlU2hhcmVkKHRydWUpO1xuICAgICAgYXdhaXQgcHJlcG9wdWxhdGVVc2VyTWVkaWEoe1xuICAgICAgICBuYW1lOiBob3N0TGFiZWwsXG4gICAgICAgIHBhcmFtZXRlcnM6IHsgLi4ucGFyYW1ldGVycywgbG9jYWxTdHJlYW1TY3JlZW4sIHNoYXJlZDogdHJ1ZSB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBoYW5kbGUgZXJyb3IgKi9cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIHBhcnRpY2lwYW50cyBhcnJheSB0byByZWZsZWN0IHRoZSBjaGFuZ2VcbiAgICBzY3JlZW5BbHJlYWR5T24gPSB0cnVlO1xuICAgIHVwZGF0ZVNjcmVlbkFscmVhZHlPbihzY3JlZW5BbHJlYWR5T24pO1xuXG4gICAgLy8gUmVvcmRlciBzdHJlYW1zIGlmIHJlcXVpcmVkXG4gICAgdHJ5IHtcbiAgICAgIGlmIChldmVudFR5cGUgPT0gJ2NvbmZlcmVuY2UnKSB7XG4gICAgICAgIGF3YWl0IHJlb3JkZXJTdHJlYW1zKHsgYWRkOiBmYWxzZSwgc2NyZWVuQ2hhbmdlZDogdHJ1ZSwgcGFyYW1ldGVycyB9KTtcbiAgICAgICAgYXdhaXQgcHJlcG9wdWxhdGVVc2VyTWVkaWEoeyBuYW1lOiBob3N0TGFiZWwsIHBhcmFtZXRlcnMgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCByZW9yZGVyU3RyZWFtcyh7IHBhcmFtZXRlcnMgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHJlUG9ydCh7IHBhcmFtZXRlcnMgfSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogaGFuZGxlIGVycm9yICovXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNjcmVlbiBzaGFyZSBlbmRcbiAgICBsb2NhbFN0cmVhbVNjcmVlbi5nZXRWaWRlb1RyYWNrcygpWzBdLm9uZW5kZWQgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBTdXBwb3J0cyBib3RoIG1hbnVhbCBhbmQgYXV0b21hdGljIHNjcmVlbiBzaGFyZSBlbmRcbiAgICAgIGF3YWl0IGRpc2Nvbm5lY3RTZW5kVHJhbnNwb3J0U2NyZWVuKHsgcGFyYW1ldGVycyB9KTtcbiAgICAgIGF3YWl0IHN0b3BTaGFyZVNjcmVlbih7IHBhcmFtZXRlcnMgfSk7XG4gICAgfTtcblxuICAgIC8vIElmIHVzZXIgcmVxdWVzdGVkIHRvIHNoYXJlIHNjcmVlbiwgdXBkYXRlIHRoZSBzY3JlZW5BY3Rpb24gc3RhdGVcbiAgICBpZiAoc2NyZWVuQWN0aW9uID09IHRydWUpIHtcbiAgICAgIHNjcmVlbkFjdGlvbiA9IGZhbHNlO1xuICAgIH1cbiAgICB1cGRhdGVTY3JlZW5BY3Rpb24oc2NyZWVuQWN0aW9uKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgdHJhbnNwb3J0IGNyZWF0ZWQgc3RhdGVcbiAgICB0cmFuc3BvcnRDcmVhdGVkU2NyZWVuID0gdHJ1ZTtcbiAgICB1cGRhdGVUcmFuc3BvcnRDcmVhdGVkU2NyZWVuKHRyYW5zcG9ydENyZWF0ZWRTY3JlZW4pO1xuICAgIHVwZGF0ZVRyYW5zcG9ydENyZWF0ZWQodHJhbnNwb3J0Q3JlYXRlZCk7XG5cbiAgICAvLyBIYW5kbGUgc2NyZWVuIGFubm90YXRpb24gbW9kYWxcbiAgICB0cnkge1xuICAgICAgaWYgKGFubm90YXRlU2NyZWVuU3RyZWFtKSB7XG4gICAgICAgIGFubm90YXRlU2NyZWVuU3RyZWFtID0gZmFsc2U7XG4gICAgICAgIHVwZGF0ZUlzU2NyZWVuYm9hcmRNb2RhbFZpc2libGUodHJ1ZSk7XG4gICAgICAgIGF3YWl0IHNsZWVwKHsgbXM6IDUwMCB9KTtcbiAgICAgICAgdXBkYXRlSXNTY3JlZW5ib2FyZE1vZGFsVmlzaWJsZShmYWxzZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vY29uc29sZS5sb2coJ0Vycm9yIGhhbmRsaW5nIHNjcmVlbiBhbm5vdGF0aW9uOicsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==