botframework-webchat-component 4.13.0 → 4.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. package/.eslintignore +1 -9
  2. package/.eslintrc.yml +6 -0
  3. package/lib/Activity/Avatar.d.ts +10 -0
  4. package/lib/Activity/Avatar.d.ts.map +1 -0
  5. package/lib/Activity/Avatar.js +2 -1
  6. package/lib/Activity/Bubble.d.ts +11 -0
  7. package/lib/Activity/Bubble.d.ts.map +1 -0
  8. package/lib/Activity/Bubble.js +2 -2
  9. package/lib/Activity/CarouselFilmStrip.js +20 -30
  10. package/lib/Activity/CarouselFilmStripAttachment.js +120 -0
  11. package/lib/Activity/CarouselLayout.js +5 -5
  12. package/lib/Activity/Speak.d.ts +10 -0
  13. package/lib/Activity/Speak.d.ts.map +1 -0
  14. package/lib/Activity/Speak.js +10 -12
  15. package/lib/Activity/StackedLayout.d.ts +18 -0
  16. package/lib/Activity/StackedLayout.d.ts.map +1 -0
  17. package/lib/Activity/StackedLayout.js +18 -14
  18. package/lib/Assets/TypingAnimation.js +2 -2
  19. package/lib/Attachment/Assets/DownloadIcon.js +3 -1
  20. package/lib/Attachment/AudioAttachment.js +2 -2
  21. package/lib/Attachment/AudioContent.d.ts +11 -0
  22. package/lib/Attachment/AudioContent.d.ts.map +1 -0
  23. package/lib/Attachment/AudioContent.js +4 -4
  24. package/lib/Attachment/FileContent.d.ts +10 -0
  25. package/lib/Attachment/FileContent.d.ts.map +1 -0
  26. package/lib/Attachment/FileContent.js +4 -9
  27. package/lib/Attachment/HTMLVideoContent.d.ts +11 -0
  28. package/lib/Attachment/HTMLVideoContent.d.ts.map +1 -0
  29. package/lib/Attachment/HTMLVideoContent.js +2 -2
  30. package/lib/Attachment/ImageContent.d.ts +8 -0
  31. package/lib/Attachment/ImageContent.d.ts.map +1 -0
  32. package/lib/Attachment/ImageContent.js +2 -2
  33. package/lib/Attachment/TextContent.d.ts +8 -0
  34. package/lib/Attachment/TextContent.d.ts.map +1 -0
  35. package/lib/Attachment/TextContent.js +4 -4
  36. package/lib/Attachment/VideoAttachment.js +2 -2
  37. package/lib/Attachment/VideoContent.d.ts +11 -0
  38. package/lib/Attachment/VideoContent.d.ts.map +1 -0
  39. package/lib/Attachment/VideoContent.js +1 -1
  40. package/lib/Attachment/VimeoContent.d.ts +10 -0
  41. package/lib/Attachment/VimeoContent.d.ts.map +1 -0
  42. package/lib/Attachment/VimeoContent.js +8 -8
  43. package/lib/Attachment/YouTubeContent.d.ts +10 -0
  44. package/lib/Attachment/YouTubeContent.d.ts.map +1 -0
  45. package/lib/Attachment/YouTubeContent.js +5 -5
  46. package/lib/Avatar/ImageAvatar.js +2 -2
  47. package/lib/Avatar/InitialsAvatar.js +2 -2
  48. package/lib/BasicConnectivityStatus.js +2 -2
  49. package/lib/BasicSendBox.d.ts +9 -0
  50. package/lib/BasicSendBox.d.ts.map +1 -0
  51. package/lib/BasicSendBox.js +6 -5
  52. package/lib/BasicToast.js +4 -4
  53. package/lib/BasicToaster.js +4 -4
  54. package/lib/BasicTranscript.js +143 -123
  55. package/lib/BasicTypingIndicator.d.ts +5 -0
  56. package/lib/BasicTypingIndicator.d.ts.map +1 -0
  57. package/lib/BasicTypingIndicator.js +2 -2
  58. package/lib/BasicWebChat.d.ts +9 -0
  59. package/lib/BasicWebChat.d.ts.map +1 -0
  60. package/lib/BasicWebChat.js +6 -4
  61. package/lib/Composer.d.ts +23 -0
  62. package/lib/Composer.d.ts.map +1 -0
  63. package/lib/Composer.js +33 -55
  64. package/lib/ConnectivityStatus/Assets/ErrorNotificationIcon.js +2 -2
  65. package/lib/ConnectivityStatus/Assets/SpinnerAnimation.js +2 -2
  66. package/lib/ConnectivityStatus/Assets/WarningNotificationIcon.js +2 -2
  67. package/lib/ConnectivityStatus/Connected.js +1 -1
  68. package/lib/ConnectivityStatus/Connecting.js +4 -4
  69. package/lib/ConnectivityStatus/FailedToConnect.js +2 -2
  70. package/lib/ConnectivityStatus/JavaScriptError.js +2 -2
  71. package/lib/Dictation.js +13 -4
  72. package/lib/ErrorBox.d.ts +8 -0
  73. package/lib/ErrorBox.d.ts.map +1 -0
  74. package/lib/ErrorBox.js +2 -2
  75. package/lib/Middleware/Activity/createCoreMiddleware.d.ts +3 -0
  76. package/lib/Middleware/Activity/createCoreMiddleware.d.ts.map +1 -0
  77. package/lib/Middleware/Activity/createCoreMiddleware.js +1 -1
  78. package/lib/Middleware/ActivityStatus/AbsoluteTime.js +1 -1
  79. package/lib/Middleware/ActivityStatus/RelativeTime.js +1 -1
  80. package/lib/Middleware/ActivityStatus/SendStatus/SendFailedRetry.js +3 -3
  81. package/lib/Middleware/ActivityStatus/SendStatus/SendStatus.d.ts +11 -0
  82. package/lib/Middleware/ActivityStatus/SendStatus/SendStatus.d.ts.map +1 -0
  83. package/lib/Middleware/ActivityStatus/SendStatus/SendStatus.js +4 -4
  84. package/lib/Middleware/ActivityStatus/Timestamp.d.ts +9 -0
  85. package/lib/Middleware/ActivityStatus/Timestamp.d.ts.map +1 -0
  86. package/lib/Middleware/ActivityStatus/Timestamp.js +2 -2
  87. package/lib/Middleware/ActivityStatus/createCoreMiddleware.d.ts +3 -0
  88. package/lib/Middleware/ActivityStatus/createCoreMiddleware.d.ts.map +1 -0
  89. package/lib/Middleware/ActivityStatus/createCoreMiddleware.js +1 -1
  90. package/lib/Middleware/ActivityStatus/createSendStatusMiddleware.js +5 -3
  91. package/lib/Middleware/ActivityStatus/createTimestampMiddleware.js +1 -1
  92. package/lib/Middleware/Attachment/createCoreMiddleware.d.ts +3 -0
  93. package/lib/Middleware/Attachment/createCoreMiddleware.d.ts.map +1 -0
  94. package/lib/Middleware/Attachment/createCoreMiddleware.js +9 -9
  95. package/lib/Middleware/AttachmentForScreenReader/AudioAttachment.js +1 -1
  96. package/lib/Middleware/AttachmentForScreenReader/FileAttachment.js +1 -1
  97. package/lib/Middleware/AttachmentForScreenReader/ImageAttachment.js +1 -1
  98. package/lib/Middleware/AttachmentForScreenReader/TextAttachment.js +1 -1
  99. package/lib/Middleware/AttachmentForScreenReader/VideoAttachment.js +1 -1
  100. package/lib/Middleware/AttachmentForScreenReader/createCoreMiddleware.d.ts +3 -0
  101. package/lib/Middleware/AttachmentForScreenReader/createCoreMiddleware.d.ts.map +1 -0
  102. package/lib/Middleware/AttachmentForScreenReader/createCoreMiddleware.js +9 -5
  103. package/lib/Middleware/Avatar/createCoreMiddleware.d.ts +11 -0
  104. package/lib/Middleware/Avatar/createCoreMiddleware.d.ts.map +1 -0
  105. package/lib/Middleware/Avatar/createCoreMiddleware.js +2 -2
  106. package/lib/Middleware/CardAction/createCoreMiddleware.js +2 -2
  107. package/lib/Middleware/GroupActivities/createCoreMiddleware.js +1 -1
  108. package/lib/Middleware/ScrollToEndButton/ScrollToEndButton.js +71 -0
  109. package/lib/Middleware/ScrollToEndButton/createScrollToEndButtonMiddleware.d.ts +3 -0
  110. package/lib/Middleware/ScrollToEndButton/createScrollToEndButtonMiddleware.d.ts.map +1 -0
  111. package/lib/Middleware/ScrollToEndButton/createScrollToEndButtonMiddleware.js +27 -0
  112. package/lib/Middleware/Toast/createCoreMiddleware.d.ts +4 -0
  113. package/lib/Middleware/Toast/createCoreMiddleware.d.ts.map +1 -0
  114. package/lib/Middleware/Toast/createCoreMiddleware.js +1 -1
  115. package/lib/Middleware/TypingIndicator/createCoreMiddleware.d.ts +3 -0
  116. package/lib/Middleware/TypingIndicator/createCoreMiddleware.d.ts.map +1 -0
  117. package/lib/Middleware/TypingIndicator/createCoreMiddleware.js +3 -2
  118. package/lib/ReactWebChat.d.ts +10 -0
  119. package/lib/ReactWebChat.d.ts.map +1 -0
  120. package/lib/ReactWebChat.js +19 -7
  121. package/lib/ScreenReaderActivity.js +64 -45
  122. package/lib/SendBox/Assets/AttachmentIcon.js +3 -1
  123. package/lib/SendBox/Assets/MicrophoneIcon.js +3 -1
  124. package/lib/SendBox/Assets/SendIcon.js +2 -2
  125. package/lib/SendBox/AutoResizeTextArea.d.ts +23 -0
  126. package/lib/SendBox/AutoResizeTextArea.d.ts.map +1 -0
  127. package/lib/SendBox/AutoResizeTextArea.js +6 -6
  128. package/lib/SendBox/DictationInterims.d.ts +9 -0
  129. package/lib/SendBox/DictationInterims.d.ts.map +1 -0
  130. package/lib/SendBox/DictationInterims.js +2 -2
  131. package/lib/SendBox/IconButton.js +2 -2
  132. package/lib/SendBox/MicrophoneButton.d.ts +11 -0
  133. package/lib/SendBox/MicrophoneButton.d.ts.map +1 -0
  134. package/lib/SendBox/MicrophoneButton.js +25 -24
  135. package/lib/SendBox/SendButton.d.ts +9 -0
  136. package/lib/SendBox/SendButton.d.ts.map +1 -0
  137. package/lib/SendBox/SendButton.js +7 -5
  138. package/lib/SendBox/SuggestedAction.js +5 -9
  139. package/lib/SendBox/SuggestedActions.d.ts +5 -0
  140. package/lib/SendBox/SuggestedActions.d.ts.map +1 -0
  141. package/lib/SendBox/SuggestedActions.js +10 -7
  142. package/lib/SendBox/TextBox.d.ts +28 -0
  143. package/lib/SendBox/TextBox.d.ts.map +1 -0
  144. package/lib/SendBox/TextBox.js +12 -7
  145. package/lib/SendBox/UploadButton.d.ts +9 -0
  146. package/lib/SendBox/UploadButton.d.ts.map +1 -0
  147. package/lib/SendBox/UploadButton.js +5 -5
  148. package/lib/Styles/StyleSet/Activities.d.ts +5 -0
  149. package/lib/Styles/StyleSet/Activities.d.ts.map +1 -0
  150. package/lib/Styles/StyleSet/AudioAttachment.d.ts +6 -0
  151. package/lib/Styles/StyleSet/AudioAttachment.d.ts.map +1 -0
  152. package/lib/Styles/StyleSet/AudioContent.d.ts +4 -0
  153. package/lib/Styles/StyleSet/AudioContent.d.ts.map +1 -0
  154. package/lib/Styles/StyleSet/AutoResizeTextArea.d.ts +37 -0
  155. package/lib/Styles/StyleSet/AutoResizeTextArea.d.ts.map +1 -0
  156. package/lib/Styles/StyleSet/Avatar.d.ts +9 -0
  157. package/lib/Styles/StyleSet/Avatar.d.ts.map +1 -0
  158. package/lib/Styles/StyleSet/BasicTranscript.d.ts +77 -0
  159. package/lib/Styles/StyleSet/BasicTranscript.d.ts.map +1 -0
  160. package/lib/Styles/StyleSet/Bubble.d.ts +5 -0
  161. package/lib/Styles/StyleSet/Bubble.d.ts.map +1 -0
  162. package/lib/Styles/StyleSet/Bubble.js +1 -1
  163. package/lib/Styles/StyleSet/CarouselFilmStrip.d.ts +5 -0
  164. package/lib/Styles/StyleSet/CarouselFilmStrip.d.ts.map +1 -0
  165. package/lib/Styles/StyleSet/CarouselFilmStrip.js +2 -18
  166. package/lib/Styles/StyleSet/CarouselFilmStripAttachment.d.ts +3 -0
  167. package/lib/Styles/StyleSet/CarouselFilmStripAttachment.d.ts.map +1 -0
  168. package/lib/Styles/StyleSet/CarouselFilmStripAttachment.js +63 -0
  169. package/lib/Styles/StyleSet/CarouselFlipper.d.ts +27 -0
  170. package/lib/Styles/StyleSet/CarouselFlipper.d.ts.map +1 -0
  171. package/lib/Styles/StyleSet/ConnectivityNotification.d.ts +13 -0
  172. package/lib/Styles/StyleSet/ConnectivityNotification.d.ts.map +1 -0
  173. package/lib/Styles/StyleSet/DictationInterims.d.ts +13 -0
  174. package/lib/Styles/StyleSet/DictationInterims.d.ts.map +1 -0
  175. package/lib/Styles/StyleSet/ErrorBox.d.ts +33 -0
  176. package/lib/Styles/StyleSet/ErrorBox.d.ts.map +1 -0
  177. package/lib/Styles/StyleSet/ErrorNotification.d.ts +23 -0
  178. package/lib/Styles/StyleSet/ErrorNotification.d.ts.map +1 -0
  179. package/lib/Styles/StyleSet/FileContent.d.ts +32 -0
  180. package/lib/Styles/StyleSet/FileContent.d.ts.map +1 -0
  181. package/lib/Styles/StyleSet/ImageAvatar.d.ts +7 -0
  182. package/lib/Styles/StyleSet/ImageAvatar.d.ts.map +1 -0
  183. package/lib/Styles/StyleSet/InitialsAvatar.d.ts +19 -0
  184. package/lib/Styles/StyleSet/InitialsAvatar.d.ts.map +1 -0
  185. package/lib/Styles/StyleSet/MicrophoneButton.d.ts +13 -0
  186. package/lib/Styles/StyleSet/MicrophoneButton.d.ts.map +1 -0
  187. package/lib/Styles/StyleSet/Root.d.ts +8 -0
  188. package/lib/Styles/StyleSet/Root.d.ts.map +1 -0
  189. package/lib/Styles/StyleSet/ScrollToEndButton.d.ts +36 -0
  190. package/lib/Styles/StyleSet/ScrollToEndButton.d.ts.map +1 -0
  191. package/lib/Styles/StyleSet/ScrollToEndButton.js +36 -34
  192. package/lib/Styles/StyleSet/SendBox.d.ts +24 -0
  193. package/lib/Styles/StyleSet/SendBox.d.ts.map +1 -0
  194. package/lib/Styles/StyleSet/SendBoxButton.d.ts +33 -0
  195. package/lib/Styles/StyleSet/SendBoxButton.d.ts.map +1 -0
  196. package/lib/Styles/StyleSet/SendBoxTextBox.d.ts +41 -0
  197. package/lib/Styles/StyleSet/SendBoxTextBox.d.ts.map +1 -0
  198. package/lib/Styles/StyleSet/SendStatus.d.ts +8 -0
  199. package/lib/Styles/StyleSet/SendStatus.d.ts.map +1 -0
  200. package/lib/Styles/StyleSet/SingleAttachmentActivity.d.ts +11 -0
  201. package/lib/Styles/StyleSet/SingleAttachmentActivity.d.ts.map +1 -0
  202. package/lib/Styles/StyleSet/SpinnerAnimation.d.ts +15 -0
  203. package/lib/Styles/StyleSet/SpinnerAnimation.d.ts.map +1 -0
  204. package/lib/Styles/StyleSet/StackedLayout.d.ts +63 -0
  205. package/lib/Styles/StyleSet/StackedLayout.d.ts.map +1 -0
  206. package/lib/Styles/StyleSet/SuggestedAction.d.ts +49 -0
  207. package/lib/Styles/StyleSet/SuggestedAction.d.ts.map +1 -0
  208. package/lib/Styles/StyleSet/SuggestedAction.js +2 -2
  209. package/lib/Styles/StyleSet/SuggestedActions.d.ts +118 -0
  210. package/lib/Styles/StyleSet/SuggestedActions.d.ts.map +1 -0
  211. package/lib/Styles/StyleSet/TextContent.d.ts +28 -0
  212. package/lib/Styles/StyleSet/TextContent.d.ts.map +1 -0
  213. package/lib/Styles/StyleSet/Toast.d.ts +65 -0
  214. package/lib/Styles/StyleSet/Toast.d.ts.map +1 -0
  215. package/lib/Styles/StyleSet/Toaster.d.ts +111 -0
  216. package/lib/Styles/StyleSet/Toaster.d.ts.map +1 -0
  217. package/lib/Styles/StyleSet/TypingAnimation.d.ts +8 -0
  218. package/lib/Styles/StyleSet/TypingAnimation.d.ts.map +1 -0
  219. package/lib/Styles/StyleSet/TypingIndicator.d.ts +11 -0
  220. package/lib/Styles/StyleSet/TypingIndicator.d.ts.map +1 -0
  221. package/lib/Styles/StyleSet/UploadButton.d.ts +14 -0
  222. package/lib/Styles/StyleSet/UploadButton.d.ts.map +1 -0
  223. package/lib/Styles/StyleSet/VideoAttachment.d.ts +2 -0
  224. package/lib/Styles/StyleSet/VideoAttachment.d.ts.map +1 -0
  225. package/lib/Styles/StyleSet/VideoContent.d.ts +6 -0
  226. package/lib/Styles/StyleSet/VideoContent.d.ts.map +1 -0
  227. package/lib/Styles/StyleSet/VimeoContent.d.ts +7 -0
  228. package/lib/Styles/StyleSet/VimeoContent.d.ts.map +1 -0
  229. package/lib/Styles/StyleSet/WarningNotification.d.ts +22 -0
  230. package/lib/Styles/StyleSet/WarningNotification.d.ts.map +1 -0
  231. package/lib/Styles/StyleSet/YouTubeContent.d.ts +7 -0
  232. package/lib/Styles/StyleSet/YouTubeContent.d.ts.map +1 -0
  233. package/lib/Styles/createStyleSet.d.ts +1103 -0
  234. package/lib/Styles/createStyleSet.d.ts.map +1 -0
  235. package/lib/Styles/createStyleSet.js +44 -41
  236. package/lib/Styles/mirrorStyle.js +2 -2
  237. package/lib/Toast/CollapseIcon.js +3 -1
  238. package/lib/Toast/DismissIcon.js +3 -1
  239. package/lib/Toast/ExpandIcon.js +3 -1
  240. package/lib/Toast/NotificationIcon.js +1 -1
  241. package/lib/Toast/createToastMiddleware.d.ts +4 -0
  242. package/lib/Toast/createToastMiddleware.d.ts.map +1 -0
  243. package/lib/Toast/createToastMiddleware.js +2 -2
  244. package/lib/Utils/AccessKeySink/Surface.js +7 -5
  245. package/lib/Utils/AccessibleButton.js +6 -4
  246. package/lib/Utils/AccessibleInputText.d.ts +21 -0
  247. package/lib/Utils/AccessibleInputText.d.ts.map +1 -0
  248. package/lib/Utils/AccessibleInputText.js +29 -25
  249. package/lib/Utils/AccessibleTextArea.d.ts +20 -0
  250. package/lib/Utils/AccessibleTextArea.d.ts.map +1 -0
  251. package/lib/Utils/AccessibleTextArea.js +35 -24
  252. package/lib/Utils/CroppedImage.js +2 -2
  253. package/lib/Utils/Fade.js +2 -2
  254. package/lib/Utils/FocusRedirector.js +3 -3
  255. package/lib/Utils/InlineMarkdown.js +6 -6
  256. package/lib/Utils/TypeFocusSink/FocusBox.js +6 -4
  257. package/lib/Utils/TypeFocusSink/getTabIndex.d.ts +2 -0
  258. package/lib/Utils/TypeFocusSink/getTabIndex.d.ts.map +1 -0
  259. package/lib/Utils/TypeFocusSink/getTabIndex.js +1 -1
  260. package/lib/Utils/TypeFocusSink/navigableEvent.js +1 -1
  261. package/lib/Utils/activityAltText.js +100 -0
  262. package/lib/Utils/addTargetBlankToHyperlinksMarkdown.js +1 -1
  263. package/lib/Utils/createCustomEvent.js +1 -1
  264. package/lib/Utils/debounce.js +1 -1
  265. package/lib/Utils/detectBrowser.js +1 -1
  266. package/lib/Utils/downscaleImageToDataURL/downscaleImageToDataURLUsingWorker.js +2 -2
  267. package/lib/Utils/downscaleImageToDataURL/index.js +2 -2
  268. package/lib/Utils/filterMap.js +1 -1
  269. package/lib/Utils/findLastIndex.js +2 -2
  270. package/lib/Utils/mapMap.js +1 -1
  271. package/lib/Utils/readDataURIToBlob.js +2 -2
  272. package/lib/Utils/singleToArray.js +1 -1
  273. package/lib/connectToWebChat.js +5 -3
  274. package/lib/hooks/index.d.ts +21 -0
  275. package/lib/hooks/index.d.ts.map +1 -0
  276. package/lib/hooks/index.js +1 -1
  277. package/lib/hooks/internal/BypassSpeechSynthesisPonyfill.js +97 -39
  278. package/lib/hooks/internal/UITracker.js +2 -2
  279. package/lib/hooks/internal/useAcknowledgedActivity.js +2 -2
  280. package/lib/hooks/internal/useDispatchScrollPosition.js +1 -1
  281. package/lib/hooks/internal/useDispatchTranscriptFocus.js +1 -1
  282. package/lib/hooks/internal/useEnterKeyHint.js +1 -1
  283. package/lib/hooks/internal/useForceRender.js +2 -2
  284. package/lib/hooks/internal/useForceRenderAtInterval.js +2 -2
  285. package/lib/hooks/internal/useInternalRenderMarkdownInline.js +1 -1
  286. package/lib/hooks/internal/useLocalizeAccessKey.js +2 -2
  287. package/lib/hooks/internal/useMemoize.js +2 -2
  288. package/lib/hooks/internal/useNavigatorPlatform.js +1 -1
  289. package/lib/hooks/internal/useNonce.js +1 -1
  290. package/lib/hooks/internal/useRegisterFocusSendBox.js +1 -1
  291. package/lib/hooks/internal/useRegisterFocusTranscript.js +1 -1
  292. package/lib/hooks/internal/useRegisterScrollRelative.js +1 -1
  293. package/lib/hooks/internal/useRegisterScrollTo.js +1 -1
  294. package/lib/hooks/internal/useRegisterScrollToEnd.js +1 -1
  295. package/lib/hooks/internal/useReplaceEmoticon.js +2 -2
  296. package/lib/hooks/internal/useResumeAudioContext.js +33 -0
  297. package/lib/hooks/internal/useScrollRelative.js +1 -1
  298. package/lib/hooks/internal/useSettableDictateAbortable.js +1 -1
  299. package/lib/hooks/internal/useSuggestedActionsAccessKey.js +1 -1
  300. package/lib/hooks/internal/useUniqueId.d.ts +2 -0
  301. package/lib/hooks/internal/useUniqueId.d.ts.map +1 -0
  302. package/lib/hooks/internal/useUniqueId.js +1 -1
  303. package/lib/hooks/useDictateAbortable.d.ts +2 -0
  304. package/lib/hooks/useDictateAbortable.d.ts.map +1 -0
  305. package/lib/hooks/useDictateAbortable.js +2 -2
  306. package/lib/hooks/useFocus.d.ts +2 -0
  307. package/lib/hooks/useFocus.d.ts.map +1 -0
  308. package/lib/hooks/useFocus.js +1 -1
  309. package/lib/hooks/useFocusSendBox.d.ts +3 -0
  310. package/lib/hooks/useFocusSendBox.d.ts.map +1 -0
  311. package/lib/hooks/useFocusSendBox.js +2 -1
  312. package/lib/hooks/useObserveScrollPosition.d.ts +3 -0
  313. package/lib/hooks/useObserveScrollPosition.d.ts.map +1 -0
  314. package/lib/hooks/useObserveScrollPosition.js +2 -2
  315. package/lib/hooks/useObserveTranscriptFocus.d.ts +5 -0
  316. package/lib/hooks/useObserveTranscriptFocus.d.ts.map +1 -0
  317. package/lib/hooks/useObserveTranscriptFocus.js +2 -2
  318. package/lib/hooks/useRenderMarkdownAsHTML.d.ts +5 -0
  319. package/lib/hooks/useRenderMarkdownAsHTML.d.ts.map +1 -0
  320. package/lib/hooks/useRenderMarkdownAsHTML.js +2 -2
  321. package/lib/hooks/useScrollDown.d.ts +4 -0
  322. package/lib/hooks/useScrollDown.d.ts.map +1 -0
  323. package/lib/hooks/useScrollDown.js +1 -1
  324. package/lib/hooks/useScrollTo.d.ts +5 -0
  325. package/lib/hooks/useScrollTo.d.ts.map +1 -0
  326. package/lib/hooks/useScrollTo.js +1 -1
  327. package/lib/hooks/useScrollToEnd.d.ts +2 -0
  328. package/lib/hooks/useScrollToEnd.d.ts.map +1 -0
  329. package/lib/hooks/useScrollToEnd.js +1 -1
  330. package/lib/hooks/useScrollUp.d.ts +4 -0
  331. package/lib/hooks/useScrollUp.d.ts.map +1 -0
  332. package/lib/hooks/useScrollUp.js +1 -1
  333. package/lib/hooks/useSendFiles.d.ts +2 -0
  334. package/lib/hooks/useSendFiles.d.ts.map +1 -0
  335. package/lib/hooks/useSendFiles.js +3 -3
  336. package/lib/hooks/useStyleSet.d.ts +2 -0
  337. package/lib/hooks/useStyleSet.d.ts.map +1 -0
  338. package/lib/hooks/useStyleSet.js +1 -1
  339. package/lib/hooks/useWebSpeechPonyfill.d.ts +3 -0
  340. package/lib/hooks/useWebSpeechPonyfill.d.ts.map +1 -0
  341. package/lib/hooks/useWebSpeechPonyfill.js +1 -1
  342. package/lib/index.d.ts +209 -22
  343. package/lib/index.d.ts.map +1 -1
  344. package/lib/index.js +19 -19
  345. package/lib/tsconfig.json +1 -1
  346. package/lib/types/ScrollPosition.d.ts +6 -0
  347. package/lib/types/ScrollPosition.d.ts.map +1 -0
  348. package/lib/types/ScrollPosition.js +2 -0
  349. package/package.json +38 -38
  350. package/src/Activity/{Avatar.js → Avatar.tsx} +9 -2
  351. package/src/Activity/{Bubble.js → Bubble.tsx} +10 -2
  352. package/src/Activity/CarouselFilmStrip.js +20 -29
  353. package/src/Activity/CarouselFilmStripAttachment.js +92 -0
  354. package/src/Activity/{Speak.js → Speak.tsx} +12 -5
  355. package/src/Activity/{StackedLayout.js → StackedLayout.tsx} +36 -11
  356. package/src/Attachment/Assets/DownloadIcon.js +8 -1
  357. package/src/Attachment/{AudioContent.js → AudioContent.tsx} +12 -3
  358. package/src/Attachment/{FileContent.js → FileContent.tsx} +10 -7
  359. package/src/Attachment/{HTMLVideoContent.js → HTMLVideoContent.tsx} +10 -2
  360. package/src/Attachment/{ImageContent.js → ImageContent.tsx} +7 -2
  361. package/src/Attachment/{TextContent.js → TextContent.tsx} +14 -7
  362. package/src/Attachment/{VideoContent.js → VideoContent.tsx} +10 -2
  363. package/src/Attachment/{VimeoContent.js → VimeoContent.tsx} +15 -8
  364. package/src/Attachment/{YouTubeContent.js → YouTubeContent.tsx} +12 -5
  365. package/src/{BasicSendBox.js → BasicSendBox.tsx} +9 -5
  366. package/src/BasicToaster.js +4 -4
  367. package/src/BasicTranscript.js +114 -98
  368. package/src/{BasicTypingIndicator.js → BasicTypingIndicator.tsx} +1 -1
  369. package/src/{BasicWebChat.js → BasicWebChat.tsx} +13 -4
  370. package/src/{Composer.js → Composer.tsx} +41 -42
  371. package/src/Dictation.js +13 -4
  372. package/src/{ErrorBox.js → ErrorBox.tsx} +7 -2
  373. package/src/Middleware/Activity/{createCoreMiddleware.js → createCoreMiddleware.tsx} +2 -1
  374. package/src/Middleware/ActivityStatus/SendStatus/{SendStatus.js → SendStatus.tsx} +8 -3
  375. package/src/Middleware/ActivityStatus/{Timestamp.js → Timestamp.tsx} +8 -2
  376. package/src/Middleware/ActivityStatus/{createCoreMiddleware.js → createCoreMiddleware.tsx} +3 -1
  377. package/src/Middleware/ActivityStatus/createSendStatusMiddleware.js +8 -6
  378. package/src/Middleware/ActivityStatus/createTimestampMiddleware.js +10 -8
  379. package/src/Middleware/Attachment/{createCoreMiddleware.js → createCoreMiddleware.tsx} +8 -7
  380. package/src/Middleware/AttachmentForScreenReader/{createCoreMiddleware.js → createCoreMiddleware.tsx} +4 -3
  381. package/src/Middleware/Avatar/{createCoreMiddleware.js → createCoreMiddleware.tsx} +10 -3
  382. package/src/Middleware/CardAction/createCoreMiddleware.js +43 -41
  383. package/src/Middleware/GroupActivities/createCoreMiddleware.js +6 -4
  384. package/src/Middleware/ScrollToEndButton/ScrollToEndButton.js +45 -0
  385. package/src/Middleware/ScrollToEndButton/createScrollToEndButtonMiddleware.ts +17 -0
  386. package/src/Middleware/Toast/{createCoreMiddleware.js → createCoreMiddleware.tsx} +3 -1
  387. package/src/Middleware/TypingIndicator/{createCoreMiddleware.js → createCoreMiddleware.tsx} +3 -4
  388. package/src/{ReactWebChat.js → ReactWebChat.tsx} +25 -7
  389. package/src/ScreenReaderActivity.js +47 -37
  390. package/src/SendBox/Assets/AttachmentIcon.js +1 -1
  391. package/src/SendBox/Assets/MicrophoneIcon.js +1 -1
  392. package/src/SendBox/{AutoResizeTextArea.js → AutoResizeTextArea.tsx} +30 -4
  393. package/src/SendBox/{DictationInterims.js → DictationInterims.tsx} +6 -2
  394. package/src/SendBox/{MicrophoneButton.js → MicrophoneButton.tsx} +35 -25
  395. package/src/SendBox/{SendButton.js → SendButton.tsx} +8 -3
  396. package/src/SendBox/SuggestedAction.js +1 -15
  397. package/src/SendBox/{SuggestedActions.js → SuggestedActions.tsx} +42 -21
  398. package/src/SendBox/{TextBox.js → TextBox.tsx} +21 -7
  399. package/src/SendBox/{UploadButton.js → UploadButton.tsx} +7 -3
  400. package/src/Styles/StyleSet/CarouselFilmStrip.ts +0 -20
  401. package/src/Styles/StyleSet/CarouselFilmStripAttachment.ts +56 -0
  402. package/src/Styles/StyleSet/ScrollToEndButton.ts +33 -31
  403. package/src/Styles/StyleSet/SuggestedAction.ts +1 -1
  404. package/src/Styles/createStyleSet.ts +41 -39
  405. package/src/Toast/CollapseIcon.js +9 -1
  406. package/src/Toast/DismissIcon.js +9 -1
  407. package/src/Toast/ExpandIcon.js +9 -1
  408. package/src/Toast/{createToastMiddleware.js → createToastMiddleware.tsx} +3 -2
  409. package/src/Utils/{AccessibleInputText.js → AccessibleInputText.tsx} +48 -5
  410. package/src/Utils/{AccessibleTextArea.js → AccessibleTextArea.tsx} +67 -6
  411. package/src/Utils/TypeFocusSink/FocusBox.js +4 -4
  412. package/src/Utils/TypeFocusSink/getTabIndex.ts +1 -1
  413. package/src/Utils/activityAltText.ts +135 -0
  414. package/src/Utils/findLastIndex.spec.js +2 -0
  415. package/src/Utils/intersectionOf.spec.js +2 -0
  416. package/src/Utils/mapMap.spec.js +2 -0
  417. package/src/Utils/removeInline.spec.js +2 -0
  418. package/src/Utils/{singleToArray.js → singleToArray.ts} +1 -1
  419. package/src/Utils/walkMarkdownTokens.spec.js +3 -3
  420. package/src/hooks/{index.js → index.ts} +1 -0
  421. package/src/hooks/internal/BypassSpeechSynthesisPonyfill.js +68 -17
  422. package/src/hooks/internal/useMemoize.spec.js +2 -0
  423. package/src/hooks/internal/useResumeAudioContext.ts +7 -0
  424. package/src/hooks/internal/useScrollRelative.js +4 -3
  425. package/src/hooks/internal/{useUniqueId.js → useUniqueId.ts} +1 -1
  426. package/src/hooks/{useDictateAbortable.js → useDictateAbortable.ts} +1 -1
  427. package/src/hooks/{useFocus.js → useFocus.ts} +1 -1
  428. package/src/hooks/{useFocusSendBox.js → useFocusSendBox.ts} +2 -1
  429. package/src/hooks/{useObserveScrollPosition.js → useObserveScrollPosition.ts} +6 -1
  430. package/src/hooks/{useObserveTranscriptFocus.js → useObserveTranscriptFocus.ts} +6 -1
  431. package/src/hooks/{useRenderMarkdownAsHTML.js → useRenderMarkdownAsHTML.ts} +6 -2
  432. package/src/hooks/{useScrollDown.js → useScrollDown.ts} +1 -1
  433. package/src/hooks/{useScrollTo.js → useScrollTo.ts} +5 -1
  434. package/src/hooks/{useScrollToEnd.js → useScrollToEnd.ts} +1 -1
  435. package/src/hooks/{useScrollUp.js → useScrollUp.ts} +1 -1
  436. package/src/hooks/{useSendFiles.js → useSendFiles.ts} +3 -2
  437. package/src/hooks/{useStyleSet.js → useStyleSet.ts} +1 -1
  438. package/src/hooks/useWebSpeechPonyfill.ts +7 -0
  439. package/src/index.ts +7 -11
  440. package/src/tsconfig.json +1 -1
  441. package/src/types/ScrollPosition.ts +6 -0
  442. package/lib/Activity/ScrollToEndButton.js +0 -81
  443. package/lib/Attachment/Assets/ErrorIcon.js +0 -22
  444. package/lib/Utils/remarkStripMarkdown.js +0 -26
  445. package/lib/hooks/internal/useStripMarkdown.js +0 -19
  446. package/src/Activity/ScrollToEndButton.js +0 -58
  447. package/src/Attachment/Assets/ErrorIcon.js +0 -9
  448. package/src/Utils/remarkStripMarkdown.js +0 -13
  449. package/src/hooks/internal/useStripMarkdown.js +0 -7
  450. package/src/hooks/useWebSpeechPonyfill.js +0 -5
  451. package/src/index.tsx +0 -35
@@ -41,8 +41,6 @@ var _ScreenReaderActivity = _interopRequireDefault(require("./ScreenReaderActivi
41
41
 
42
42
  var _ScreenReaderText = _interopRequireDefault(require("./ScreenReaderText"));
43
43
 
44
- var _ScrollToEndButton = _interopRequireDefault(require("./Activity/ScrollToEndButton"));
45
-
46
44
  var _Speak = _interopRequireDefault(require("./Activity/Speak"));
47
45
 
48
46
  var _tabbableElements = _interopRequireDefault(require("./Utils/tabbableElements"));
@@ -71,13 +69,13 @@ var _useStyleToEmotionObject = _interopRequireDefault(require("./hooks/internal/
71
69
 
72
70
  var _useUniqueId = _interopRequireDefault(require("./hooks/internal/useUniqueId"));
73
71
 
74
- function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
72
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
75
73
 
76
- function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
74
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
77
75
 
78
76
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
79
77
 
80
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
78
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
81
79
 
82
80
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
83
81
 
@@ -87,7 +85,7 @@ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableTo
87
85
 
88
86
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
89
87
 
90
- function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
88
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
91
89
 
92
90
  function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
93
91
 
@@ -99,7 +97,7 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
99
97
 
100
98
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
101
99
 
102
- function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
100
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
103
101
 
104
102
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
105
103
 
@@ -107,6 +105,7 @@ var useActivities = _botframeworkWebchatApi.hooks.useActivities,
107
105
  useCreateActivityRenderer = _botframeworkWebchatApi.hooks.useCreateActivityRenderer,
108
106
  useCreateActivityStatusRenderer = _botframeworkWebchatApi.hooks.useCreateActivityStatusRenderer,
109
107
  useCreateAvatarRenderer = _botframeworkWebchatApi.hooks.useCreateAvatarRenderer,
108
+ useCreateScrollToEndButtonRenderer = _botframeworkWebchatApi.hooks.useCreateScrollToEndButtonRenderer,
110
109
  useDirection = _botframeworkWebchatApi.hooks.useDirection,
111
110
  useGroupActivities = _botframeworkWebchatApi.hooks.useGroupActivities,
112
111
  useLocalizer = _botframeworkWebchatApi.hooks.useLocalizer,
@@ -318,6 +317,8 @@ var InternalTranscript = function InternalTranscript(_ref) {
318
317
  var firstInSenderGroup = !indexWithinSenderGroup;
319
318
  var lastInSenderGroup = indexWithinSenderGroup === activitiesWithSameSender.length - 1;
320
319
  activitiesWithSameSenderAndStatus.forEach(function (activity, indexWithinSenderAndStatusGroup) {
320
+ var _activity$channelData, _activity$channelData2, _activity$channelData3, _activity$channelData4, _activity$channelData5;
321
+
321
322
  // We only show the timestamp at the end of the sender group. But we always show the "Send failed, retry" prompt.
322
323
  var renderActivityStatus = createActivityStatusRenderer({
323
324
  activity: activity
@@ -331,13 +332,10 @@ var InternalTranscript = function InternalTranscript(_ref) {
331
332
  renderActivity = _activitiesWithRender.renderActivity;
332
333
 
333
334
  var key = (0, _getActivityUniqueId.default)(activity) || renderingElements.length;
334
- var _activity$channelData = activity.channelData;
335
- _activity$channelData = _activity$channelData === void 0 ? {} : _activity$channelData;
336
- var _activity$channelData2 = _activity$channelData.messageBack;
337
- _activity$channelData2 = _activity$channelData2 === void 0 ? {} : _activity$channelData2;
338
- var messageBackDisplayText = _activity$channelData2.displayText,
339
- role = activity.from.role,
340
- text = activity.text;
335
+ var baseAltText = typeof (activity === null || activity === void 0 ? void 0 : (_activity$channelData = activity.channelData) === null || _activity$channelData === void 0 ? void 0 : _activity$channelData['webchat:fallback-text']) === 'string' ? activity === null || activity === void 0 ? void 0 : (_activity$channelData2 = activity.channelData) === null || _activity$channelData2 === void 0 ? void 0 : _activity$channelData2['webchat:fallback-text'] : (activity === null || activity === void 0 ? void 0 : (_activity$channelData3 = activity.channelData) === null || _activity$channelData3 === void 0 ? void 0 : (_activity$channelData4 = _activity$channelData3.messageBack) === null || _activity$channelData4 === void 0 ? void 0 : _activity$channelData4.displayText) || activity.text; // If "webchat:fallback-text" field is set to empty string, the activity must not be narrated.
336
+
337
+ var supportScreenReader = (activity === null || activity === void 0 ? void 0 : (_activity$channelData5 = activity.channelData) === null || _activity$channelData5 === void 0 ? void 0 : _activity$channelData5['webchat:fallback-text']) !== '';
338
+ var role = activity.from.role;
341
339
  var topSideNub = role === 'user' ? topSideUserNub : topSideBotNub;
342
340
  var showCallout; // Depending on the "showAvatarInGroup" setting, the avatar will render in different positions.
343
341
 
@@ -408,15 +406,16 @@ var InternalTranscript = function InternalTranscript(_ref) {
408
406
  // retry prompt. And show the screen reader version of the timestamp.
409
407
  hideTimestamp: hideAllTimestamps || indexWithinSenderAndStatusGroup !== activitiesWithSameSenderAndStatus.length - 1,
410
408
  key: key,
411
- // When "liveRegionKey" changes, it will show up in the live region momentarily.
412
- liveRegionKey: key + '|' + (messageBackDisplayText || text),
409
+ // When "liveRegionKey" changes or contents that made up the alt text changed, it will show up in the live region momentarily.
410
+ liveRegionKey: key + '|' + baseAltText,
413
411
  renderActivity: renderActivity,
414
412
  renderActivityStatus: renderActivityStatus,
415
413
  renderAvatar: renderAvatar,
416
414
  role: role,
417
415
  // TODO: [P2] #2858 We should use core/definitions/speakingActivity for this predicate instead
418
416
  shouldSpeak: activity.channelData && activity.channelData.speak,
419
- showCallout: showCallout
417
+ showCallout: showCallout,
418
+ supportScreenReader: supportScreenReader
420
419
  });
421
420
  });
422
421
  });
@@ -509,6 +508,11 @@ var InternalTranscript = function InternalTranscript(_ref) {
509
508
  }
510
509
  }
511
510
  }, [activityElementsRef, rootElementRef, scrollToBottomScrollTo]);
511
+ var scrollToEnd = (0, _react.useCallback)(function () {
512
+ return scrollToBottomScrollToEnd({
513
+ behavior: 'smooth'
514
+ });
515
+ }, [scrollToBottomScrollToEnd]);
512
516
  var scrollRelative = (0, _react.useCallback)(function (direction) {
513
517
  var _ref10 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
514
518
  displacement = _ref10.displacement;
@@ -537,7 +541,7 @@ var InternalTranscript = function InternalTranscript(_ref) {
537
541
  // We call `useRegisterScrollXXX` to register a callback function, the `useScrollXXX` will multiplex the call into each instance of <BasicTranscript>.
538
542
 
539
543
  (0, _useRegisterScrollTo.default)(scrollTo);
540
- (0, _useRegisterScrollToEnd.default)(scrollToBottomScrollToEnd);
544
+ (0, _useRegisterScrollToEnd.default)(scrollToEnd);
541
545
  (0, _useRegisterScrollRelative.default)(scrollRelative);
542
546
  var dispatchScrollPosition = (0, _useDispatchScrollPosition.default)();
543
547
  var patchedDispatchScrollPosition = (0, _react.useMemo)(function () {
@@ -824,9 +828,12 @@ var InternalTranscript = function InternalTranscript(_ref) {
824
828
  "aria-relevant": "additions",
825
829
  "aria-roledescription": transcriptRoleDescription,
826
830
  role: "log"
827
- }, renderingElements.map(function (_ref23) {
828
- var activity = _ref23.activity,
829
- liveRegionKey = _ref23.liveRegionKey;
831
+ }, renderingElements.filter(function (_ref23) {
832
+ var supportScreenReader = _ref23.supportScreenReader;
833
+ return supportScreenReader;
834
+ }).map(function (_ref24) {
835
+ var activity = _ref24.activity,
836
+ liveRegionKey = _ref24.liveRegionKey;
830
837
  return /*#__PURE__*/_react.default.createElement(_Fade.default, {
831
838
  fadeAfter: internalLiveRegionFadeAfter,
832
839
  key: liveRegionKey
@@ -840,27 +847,28 @@ var InternalTranscript = function InternalTranscript(_ref) {
840
847
  onFocusActivity: handleFocusActivity,
841
848
  onFocusFiller: handleFocusFiller,
842
849
  terminatorRef: terminatorRef
843
- }, renderingElements.map(function (_ref24, index) {
844
- var activity = _ref24.activity,
845
- callbackRef = _ref24.callbackRef,
846
- focusActivity = _ref24.focusActivity,
847
- handleFocus = _ref24.handleFocus,
848
- handleKeyDown = _ref24.handleKeyDown,
849
- handleMouseDownCapture = _ref24.handleMouseDownCapture,
850
- hideTimestamp = _ref24.hideTimestamp,
851
- key = _ref24.key,
852
- renderActivity = _ref24.renderActivity,
853
- renderActivityStatus = _ref24.renderActivityStatus,
854
- renderAvatar = _ref24.renderAvatar,
855
- role = _ref24.role,
856
- shouldSpeak = _ref24.shouldSpeak,
857
- showCallout = _ref24.showCallout;
858
-
859
- var _ref25 = activityElementsRef.current.find(function (entry) {
850
+ }, renderingElements.map(function (_ref25, index) {
851
+ var activity = _ref25.activity,
852
+ callbackRef = _ref25.callbackRef,
853
+ focusActivity = _ref25.focusActivity,
854
+ handleFocus = _ref25.handleFocus,
855
+ handleKeyDown = _ref25.handleKeyDown,
856
+ handleMouseDownCapture = _ref25.handleMouseDownCapture,
857
+ hideTimestamp = _ref25.hideTimestamp,
858
+ key = _ref25.key,
859
+ renderActivity = _ref25.renderActivity,
860
+ renderActivityStatus = _ref25.renderActivityStatus,
861
+ renderAvatar = _ref25.renderAvatar,
862
+ role = _ref25.role,
863
+ shouldSpeak = _ref25.shouldSpeak,
864
+ showCallout = _ref25.showCallout,
865
+ supportScreenReader = _ref25.supportScreenReader;
866
+
867
+ var _ref26 = activityElementsRef.current.find(function (entry) {
860
868
  return entry.activity === activity;
861
869
  }) || {},
862
- ariaLabelID = _ref25.ariaLabelID,
863
- element = _ref25.element;
870
+ ariaLabelID = _ref26.ariaLabelID,
871
+ element = _ref26.element;
864
872
 
865
873
  var activeDescendant = focusedActivityKey === key;
866
874
  var isContentInteractive = !!(element ? (0, _tabbableElements.default)(element.querySelector('.webchat__basic-transcript__activity-box')).length : 0);
@@ -880,7 +888,7 @@ var InternalTranscript = function InternalTranscript(_ref) {
880
888
  onKeyDown: handleKeyDown,
881
889
  onMouseDownCapture: handleMouseDownCapture,
882
890
  ref: callbackRef
883
- }, /*#__PURE__*/_react.default.createElement(_ScreenReaderActivity.default, {
891
+ }, supportScreenReader && /*#__PURE__*/_react.default.createElement(_ScreenReaderActivity.default, {
884
892
  activity: activity,
885
893
  id: ariaLabelID,
886
894
  renderAttachments: false
@@ -934,8 +942,8 @@ InternalTranscript.propTypes = {
934
942
  className: _propTypes.default.string
935
943
  };
936
944
 
937
- var InternalScreenReaderTranscript = function InternalScreenReaderTranscript(_ref26) {
938
- var renderingElements = _ref26.renderingElements;
945
+ var InternalScreenReaderTranscript = function InternalScreenReaderTranscript(_ref27) {
946
+ var renderingElements = _ref27.renderingElements;
939
947
  var localize = useLocalizer();
940
948
 
941
949
  var _useStyleOptions3 = useStyleOptions(),
@@ -949,9 +957,9 @@ var InternalScreenReaderTranscript = function InternalScreenReaderTranscript(_re
949
957
  "aria-relevant": "additions",
950
958
  "aria-roledescription": transcriptRoleDescription,
951
959
  role: "log"
952
- }, renderingElements.map(function (_ref27) {
953
- var activity = _ref27.activity,
954
- liveRegionKey = _ref27.liveRegionKey;
960
+ }, renderingElements.map(function (_ref28) {
961
+ var activity = _ref28.activity,
962
+ liveRegionKey = _ref28.liveRegionKey;
955
963
  return /*#__PURE__*/_react.default.createElement(_Fade.default, {
956
964
  fadeAfter: internalLiveRegionFadeAfter,
957
965
  key: liveRegionKey
@@ -970,40 +978,46 @@ InternalScreenReaderTranscript.propTypes = {
970
978
  })).isRequired
971
979
  }; // Separating high-frequency hooks to improve performance.
972
980
 
973
- var InternalTranscriptScrollable = function InternalTranscriptScrollable(_ref28) {
974
- var activities = _ref28.activities,
975
- children = _ref28.children,
976
- onFocusActivity = _ref28.onFocusActivity,
977
- onFocusFiller = _ref28.onFocusFiller,
978
- terminatorRef = _ref28.terminatorRef;
981
+ var InternalTranscriptScrollable = function InternalTranscriptScrollable(_ref29) {
982
+ var activities = _ref29.activities,
983
+ children = _ref29.children,
984
+ onFocusActivity = _ref29.onFocusActivity,
985
+ onFocusFiller = _ref29.onFocusFiller,
986
+ terminatorRef = _ref29.terminatorRef;
979
987
 
980
988
  var _useStyleSet3 = (0, _useStyleSet5.default)(),
981
989
  _useStyleSet4 = _slicedToArray(_useStyleSet3, 1),
982
990
  activitiesStyleSet = _useStyleSet4[0].activities;
983
991
 
984
- var _useStyleOptions5 = useStyleOptions(),
985
- _useStyleOptions6 = _slicedToArray(_useStyleOptions5, 1),
986
- hideScrollToEndButton = _useStyleOptions6[0].hideScrollToEndButton;
987
-
988
992
  var _useAnimatingToEnd = (0, _reactScrollToBottom.useAnimatingToEnd)(),
989
993
  _useAnimatingToEnd2 = _slicedToArray(_useAnimatingToEnd, 1),
990
994
  animatingToEnd = _useAnimatingToEnd2[0];
991
995
 
996
+ var _useAtEnd = (0, _reactScrollToBottom.useAtEnd)(),
997
+ _useAtEnd2 = _slicedToArray(_useAtEnd, 1),
998
+ atEnd = _useAtEnd2[0];
999
+
992
1000
  var _useSticky = (0, _reactScrollToBottom.useSticky)(),
993
1001
  _useSticky2 = _slicedToArray(_useSticky, 1),
994
1002
  sticky = _useSticky2[0];
995
1003
 
1004
+ var _useStyleOptions5 = useStyleOptions(),
1005
+ _useStyleOptions6 = _slicedToArray(_useStyleOptions5, 1),
1006
+ styleOptions = _useStyleOptions6[0];
1007
+
996
1008
  var lastVisibleActivityId = (0, _getActivityUniqueId.default)(activities[activities.length - 1] || {}); // Activity ID of the last visible activity in the list.
997
1009
 
998
1010
  var localize = useLocalizer();
999
- var scrollToEndButtonRef = (0, _react.useRef)();
1011
+ var scrollToEnd = (0, _reactScrollToBottom.useScrollToEnd)();
1000
1012
  var lastReadActivityIdRef = (0, _react.useRef)(lastVisibleActivityId);
1001
1013
  var transcriptRoleDescription = localize('TRANSCRIPT_ARIA_ROLE_ALT');
1002
- var allActivitiesRead = lastVisibleActivityId === lastReadActivityIdRef.current;
1003
1014
  var handleScrollToEndButtonClick = (0, _react.useCallback)(function () {
1004
- // After the "New message" button is clicked, focus on the first unread activity.
1005
- var index = activities.findIndex(function (_ref29) {
1006
- var id = _ref29.id;
1015
+ scrollToEnd({
1016
+ behavior: 'smooth'
1017
+ }); // After the "New message" button is clicked, focus on the first unread activity.
1018
+
1019
+ var index = activities.findIndex(function (_ref30) {
1020
+ var id = _ref30.id;
1007
1021
  return id === lastReadActivityIdRef.current;
1008
1022
  });
1009
1023
 
@@ -1017,46 +1031,26 @@ var InternalTranscriptScrollable = function InternalTranscriptScrollable(_ref28)
1017
1031
 
1018
1032
  var current = terminatorRef.current;
1019
1033
  current && current.focus();
1020
- }, [activities, lastReadActivityIdRef, onFocusActivity, terminatorRef]);
1034
+ }, [activities, lastReadActivityIdRef, onFocusActivity, scrollToEnd, terminatorRef]);
1021
1035
 
1022
- if (sticky) {
1023
- // If it is sticky, the user is at the bottom of the transcript, everything is read.
1036
+ if (atEnd || sticky) {
1037
+ // If it is sticky or at the end, the user is at the bottom of the transcript, everything is read.
1024
1038
  // So mark the activity ID as read.
1025
1039
  lastReadActivityIdRef.current = lastVisibleActivityId;
1026
- } // Finds where we should render the "New messages" button, in index. Returns -1 to hide the button.
1027
-
1028
-
1029
- var renderSeparatorAfterIndex = (0, _react.useMemo)(function () {
1030
- // Don't show the button if:
1031
- // - All activities have been read
1032
- // - Currently animating towards bottom
1033
- // - "New messages" button must not flash when: 1. Type "help", 2. Scroll to top, 3. Type "help" again, 4. Expect the "New messages" button not flashy
1034
- // - Hidden by style options
1035
- // - It is already at the bottom (sticky)
1036
- // Any changes to this logic, verify:
1037
- // - "New messages" button should persist while programmatically scrolling to mid-point of the transcript:
1038
- // 1. Type "help"
1039
- // 2. Type "proactive", then immediately scroll to top
1040
- // Expect: the "New messages" button should appear
1041
- // 3. Run hook "useScrollTo({ scrollTop: 500 })"
1042
- // Expect: when the scroll is animating to 500px, the "New messages" button should kept on the screen
1043
- // - "New messages" button must not flashy:
1044
- // 1. Type "help"
1045
- // 2. Scroll to top
1046
- // Expect: no "New messages" button is shown
1047
- // 3. Type "help" again
1048
- // Expect: "New messages" button must not flash-appear
1049
- if (allActivitiesRead || animatingToEnd || hideScrollToEndButton || sticky) {
1050
- return -1;
1051
- }
1040
+ }
1052
1041
 
1053
- return activities.findIndex(function (activity) {
1042
+ var ScrollToEndButton = useCreateScrollToEndButtonRenderer()({
1043
+ atEnd: animatingToEnd || atEnd || sticky,
1044
+ styleOptions: styleOptions,
1045
+ // Unread means:
1046
+ // 1. Last read is not the last one in the transcript, and;
1047
+ // 2. Last read is still in the transcript.
1048
+ unread: lastVisibleActivityId !== lastReadActivityIdRef.current && !!~activities.findIndex(function (activity) {
1054
1049
  return (0, _getActivityUniqueId.default)(activity) === lastReadActivityIdRef.current;
1055
- });
1056
- }, [activities, allActivitiesRead, animatingToEnd, hideScrollToEndButton, lastReadActivityIdRef, sticky]);
1057
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, renderSeparatorAfterIndex !== -1 && /*#__PURE__*/_react.default.createElement(_ScrollToEndButton.default, {
1058
- onClick: handleScrollToEndButtonClick,
1059
- ref: scrollToEndButtonRef
1050
+ })
1051
+ });
1052
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, ScrollToEndButton && /*#__PURE__*/_react.default.createElement(ScrollToEndButton, {
1053
+ onClick: handleScrollToEndButtonClick
1060
1054
  }), !!_react.default.Children.count(children) && /*#__PURE__*/_react.default.createElement(_FocusRedirector.default, {
1061
1055
  className: "webchat__basic-transcript__sentinel",
1062
1056
  redirectRef: terminatorRef
@@ -1081,9 +1075,9 @@ InternalTranscriptScrollable.propTypes = {
1081
1075
  terminatorRef: _propTypes.default.any.isRequired
1082
1076
  };
1083
1077
 
1084
- var SetScroller = function SetScroller(_ref30) {
1085
- var activityElementsRef = _ref30.activityElementsRef,
1086
- scrollerRef = _ref30.scrollerRef;
1078
+ var SetScroller = function SetScroller(_ref31) {
1079
+ var activityElementsRef = _ref31.activityElementsRef,
1080
+ scrollerRef = _ref31.scrollerRef;
1087
1081
 
1088
1082
  var _useStyleOptions7 = useStyleOptions(),
1089
1083
  _useStyleOptions8 = _slicedToArray(_useStyleOptions7, 1),
@@ -1093,45 +1087,71 @@ var SetScroller = function SetScroller(_ref30) {
1093
1087
  autoScrollSnapOnPage = _useStyleOptions8$.autoScrollSnapOnPage,
1094
1088
  autoScrollSnapOnPageOffset = _useStyleOptions8$.autoScrollSnapOnPageOffset;
1095
1089
 
1090
+ var _useActivities3 = useActivities(),
1091
+ _useActivities4 = _slicedToArray(_useActivities3, 1),
1092
+ activities = _useActivities4[0];
1093
+
1096
1094
  var _useAcknowledgedActiv3 = (0, _useAcknowledgedActivity.default)(),
1097
1095
  _useAcknowledgedActiv4 = _slicedToArray(_useAcknowledgedActiv3, 1),
1098
1096
  lastAcknowledgedActivity = _useAcknowledgedActiv4[0];
1099
1097
 
1098
+ var activitiesRef = (0, _react.useRef)(activities);
1100
1099
  var lastAcknowledgedActivityRef = (0, _react.useRef)(lastAcknowledgedActivity);
1100
+ activitiesRef.current = activities;
1101
1101
  lastAcknowledgedActivityRef.current = lastAcknowledgedActivity;
1102
- scrollerRef.current = (0, _react.useCallback)(function (_ref31) {
1103
- var offsetHeight = _ref31.offsetHeight,
1104
- scrollTop = _ref31.scrollTop;
1102
+ scrollerRef.current = (0, _react.useCallback)(function (_ref32) {
1103
+ var offsetHeight = _ref32.offsetHeight,
1104
+ scrollTop = _ref32.scrollTop;
1105
1105
  var patchedAutoScrollSnapOnActivity = typeof autoScrollSnapOnActivity === 'number' ? Math.max(0, autoScrollSnapOnActivity) : autoScrollSnapOnActivity ? 1 : 0;
1106
1106
  var patchedAutoScrollSnapOnPage = typeof autoScrollSnapOnPage === 'number' ? Math.max(0, Math.min(1, autoScrollSnapOnPage)) : autoScrollSnapOnPage ? 1 : 0;
1107
1107
  var patchedAutoScrollSnapOnActivityOffset = typeof autoScrollSnapOnActivityOffset === 'number' ? autoScrollSnapOnActivityOffset : 0;
1108
1108
  var patchedAutoScrollSnapOnPageOffset = typeof autoScrollSnapOnPageOffset === 'number' ? autoScrollSnapOnPageOffset : 0;
1109
1109
 
1110
1110
  if (patchedAutoScrollSnapOnActivity || patchedAutoScrollSnapOnPage) {
1111
+ var _activities = activitiesRef.current;
1112
+ var activityElements = activityElementsRef.current;
1111
1113
  var _lastAcknowledgedActivity = lastAcknowledgedActivityRef.current;
1112
1114
  var values = [];
1113
1115
 
1114
- if (patchedAutoScrollSnapOnActivity) {
1115
- var _ref32 = activityElementsRef.current[activityElementsRef.current.findIndex(function (_ref33) {
1116
- var activity = _ref33.activity;
1117
- return activity === _lastAcknowledgedActivity;
1118
- }) + patchedAutoScrollSnapOnActivity] || {},
1119
- nthUnacknowledgedActivityElement = _ref32.element;
1116
+ var lastAcknowledgedActivityIndex = _activities.indexOf(_lastAcknowledgedActivity);
1117
+
1118
+ if (~lastAcknowledgedActivityIndex) {
1119
+ // The activity that we acknowledged could be not rendered, such as post back activity.
1120
+ // When calculating scroll snap, we can only base on the first unacknowledged-and-rendering activity.
1121
+ var firstUnacknowledgedActivityElementIndex = -1;
1122
+
1123
+ var _loop2 = function _loop2(index, length) {
1124
+ var activity = _activities[index];
1125
+ var activityElementIndex = activityElements.findIndex(function (entry) {
1126
+ return entry.activity === activity;
1127
+ });
1128
+
1129
+ if (~activityElementIndex) {
1130
+ firstUnacknowledgedActivityElementIndex = activityElementIndex;
1131
+ return "break";
1132
+ }
1133
+ };
1134
+
1135
+ for (var index = lastAcknowledgedActivityIndex + 1, length = _activities.length; index < length; index++) {
1136
+ var _ret = _loop2(index, length);
1120
1137
 
1121
- if (nthUnacknowledgedActivityElement) {
1122
- values.push(nthUnacknowledgedActivityElement.offsetTop + nthUnacknowledgedActivityElement.offsetHeight - offsetHeight - scrollTop + patchedAutoScrollSnapOnActivityOffset);
1138
+ if (_ret === "break") break;
1123
1139
  }
1124
- }
1125
1140
 
1126
- if (patchedAutoScrollSnapOnPage) {
1127
- var _ref34 = activityElementsRef.current[activityElementsRef.current.findIndex(function (_ref35) {
1128
- var activity = _ref35.activity;
1129
- return activity === _lastAcknowledgedActivity;
1130
- }) + 1] || {},
1131
- firstUnacknowledgedActivityElement = _ref34.element;
1141
+ if (~firstUnacknowledgedActivityElementIndex) {
1142
+ if (patchedAutoScrollSnapOnActivity) {
1143
+ // Gets the activity element which we should snap to.
1144
+ var nthUnacknowledgedActivityElement = activityElements[firstUnacknowledgedActivityElementIndex + patchedAutoScrollSnapOnActivity - 1].element;
1132
1145
 
1133
- if (firstUnacknowledgedActivityElement) {
1134
- values.push(firstUnacknowledgedActivityElement.offsetTop - scrollTop - offsetHeight * (1 - patchedAutoScrollSnapOnPage) + patchedAutoScrollSnapOnPageOffset);
1146
+ if (nthUnacknowledgedActivityElement) {
1147
+ values.push(nthUnacknowledgedActivityElement.offsetTop + nthUnacknowledgedActivityElement.offsetHeight - offsetHeight - scrollTop + patchedAutoScrollSnapOnActivityOffset);
1148
+ }
1149
+ }
1150
+
1151
+ if (patchedAutoScrollSnapOnPage) {
1152
+ var firstUnacknowledgedActivityElement = activityElements[firstUnacknowledgedActivityElementIndex].element;
1153
+ values.push(firstUnacknowledgedActivityElement.offsetTop - scrollTop - offsetHeight * (1 - patchedAutoScrollSnapOnPage) + patchedAutoScrollSnapOnPageOffset);
1154
+ }
1135
1155
  }
1136
1156
  }
1137
1157
 
@@ -1141,12 +1161,12 @@ var SetScroller = function SetScroller(_ref30) {
1141
1161
  }
1142
1162
 
1143
1163
  return Infinity;
1144
- }, [activityElementsRef, autoScrollSnapOnActivity, autoScrollSnapOnActivityOffset, autoScrollSnapOnPage, autoScrollSnapOnPageOffset, lastAcknowledgedActivityRef]);
1164
+ }, [activitiesRef, activityElementsRef, autoScrollSnapOnActivity, autoScrollSnapOnActivityOffset, autoScrollSnapOnPage, autoScrollSnapOnPageOffset, lastAcknowledgedActivityRef]);
1145
1165
  return false;
1146
1166
  };
1147
1167
 
1148
- var BasicTranscript = function BasicTranscript(_ref36) {
1149
- var className = _ref36.className;
1168
+ var BasicTranscript = function BasicTranscript(_ref33) {
1169
+ var className = _ref33.className;
1150
1170
  var activityElementsRef = (0, _react.useRef)([]);
1151
1171
  var scrollerRef = (0, _react.useRef)(function () {
1152
1172
  return Infinity;
@@ -1173,4 +1193,4 @@ BasicTranscript.propTypes = {
1173
1193
  };
1174
1194
  var _default = BasicTranscript;
1175
1195
  exports.default = _default;
1176
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9CYXNpY1RyYW5zY3JpcHQuanMiXSwibmFtZXMiOlsidXNlQWN0aXZpdGllcyIsImhvb2tzIiwidXNlQ3JlYXRlQWN0aXZpdHlSZW5kZXJlciIsInVzZUNyZWF0ZUFjdGl2aXR5U3RhdHVzUmVuZGVyZXIiLCJ1c2VDcmVhdGVBdmF0YXJSZW5kZXJlciIsInVzZURpcmVjdGlvbiIsInVzZUdyb3VwQWN0aXZpdGllcyIsInVzZUxvY2FsaXplciIsInVzZVN0eWxlT3B0aW9ucyIsIlJPT1RfU1RZTEUiLCJkaXNwbGF5IiwiZmxleERpcmVjdGlvbiIsIm92ZXJmbG93IiwicG9zaXRpb24iLCJmbGV4Iiwib3ZlcmZsb3dYIiwiV2Via2l0T3ZlcmZsb3dTY3JvbGxpbmciLCJsaXN0U3R5bGVUeXBlIiwidmFsaWRhdGVBbGxBY3Rpdml0aWVzVGFnZ2VkIiwiYWN0aXZpdGllcyIsImJpbnMiLCJldmVyeSIsImFjdGl2aXR5Iiwic29tZSIsImJpbiIsImluY2x1ZGVzIiwiSW50ZXJuYWxUcmFuc2NyaXB0IiwiYWN0aXZpdHlFbGVtZW50c1JlZiIsImNsYXNzTmFtZSIsImJhc2ljVHJhbnNjcmlwdFN0eWxlU2V0IiwiYmFzaWNUcmFuc2NyaXB0IiwiYnViYmxlRnJvbVVzZXJOdWJPZmZzZXQiLCJidWJibGVOdWJPZmZzZXQiLCJncm91cFRpbWVzdGFtcCIsImludGVybmFsTGl2ZVJlZ2lvbkZhZGVBZnRlciIsInNob3dBdmF0YXJJbkdyb3VwIiwiZm9jdXNlZEFjdGl2aXR5S2V5Iiwic2V0Rm9jdXNlZEFjdGl2aXR5S2V5IiwiZGlyZWN0aW9uIiwiY3JlYXRlQWN0aXZpdHlSZW5kZXJlciIsImNyZWF0ZUFjdGl2aXR5U3RhdHVzUmVuZGVyZXIiLCJjcmVhdGVBdmF0YXJSZW5kZXJlciIsImZvY3VzIiwiZ3JvdXBBY3Rpdml0aWVzIiwibG9jYWxpemUiLCJyb290Q2xhc3NOYW1lIiwicm9vdEVsZW1lbnRSZWYiLCJ0ZXJtaW5hdG9yUmVmIiwiYWN0aXZpdHlJbnRlcmFjdGl2ZUFsdCIsInRlcm1pbmF0b3JUZXh0IiwidHJhbnNjcmlwdEFyaWFMYWJlbCIsInRyYW5zY3JpcHRSb2xlRGVzY3JpcHRpb24iLCJoaWRlQWxsVGltZXN0YW1wcyIsImNyZWF0ZUFjdGl2aXR5UmVuZGVyZXJXaXRoTGl0ZXJhbEFyZ3MiLCJuZXh0VmlzaWJsZUFjdGl2aXR5IiwiYWN0aXZpdGllc1dpdGhSZW5kZXJlciIsImNyZWF0ZUFjdGl2aXR5UmVuZGVyZXJXaXRoTGl0ZXJhbEFyZ3NNZW1vaXplZCIsImluZGV4IiwibGVuZ3RoIiwicmVuZGVyQWN0aXZpdHkiLCJzcGxpY2UiLCJ2aXNpYmxlQWN0aXZpdGllcyIsIm1hcCIsImFjdGl2aXRpZXNHcm91cEJ5U2VuZGVyIiwic2VuZGVyIiwiYWN0aXZpdGllc0dyb3VwQnlTdGF0dXMiLCJzdGF0dXMiLCJjb25zb2xlIiwid2FybiIsImFjdGl2aXR5VHJlZSIsInZpc2libGVBY3Rpdml0aWVzUGVuZGluZ0dyb3VwaW5nIiwic2VuZGVyVHJlZSIsImFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlciIsImZpbmQiLCJwdXNoIiwiZm9yRWFjaCIsImFjdGl2aXRpZXNXaXRoU2FtZVN0YXR1cyIsImFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlckFuZFN0YXR1cyIsInJlbW92ZUlubGluZSIsInJlbmRlcmluZ0VsZW1lbnRzIiwidG9wU2lkZUJvdE51YiIsInRvcFNpZGVVc2VyTnViIiwiZmlyc3RBY3Rpdml0eSIsInJlbmRlckF2YXRhciIsImluZGV4V2l0aGluU2VuZGVyR3JvdXAiLCJmaXJzdEluU2VuZGVyR3JvdXAiLCJsYXN0SW5TZW5kZXJHcm91cCIsImluZGV4V2l0aGluU2VuZGVyQW5kU3RhdHVzR3JvdXAiLCJyZW5kZXJBY3Rpdml0eVN0YXR1cyIsImZpcnN0SW5TZW5kZXJBbmRTdGF0dXNHcm91cCIsImxhc3RJblNlbmRlckFuZFN0YXR1c0dyb3VwIiwiZW50cnkiLCJrZXkiLCJjaGFubmVsRGF0YSIsIm1lc3NhZ2VCYWNrIiwibWVzc2FnZUJhY2tEaXNwbGF5VGV4dCIsImRpc3BsYXlUZXh0Iiwicm9sZSIsImZyb20iLCJ0ZXh0IiwidG9wU2lkZU51YiIsInNob3dDYWxsb3V0IiwiZm9jdXNBY3Rpdml0eSIsInJvb3RFbGVtZW50IiwiY3VycmVudCIsImNhbGxiYWNrUmVmIiwiYWN0aXZpdHlFbGVtZW50IiwiYWN0aXZpdHlJRCIsImlkIiwiZWxlbWVudCIsImhhbmRsZUZvY3VzIiwiaGFuZGxlS2V5RG93biIsImV2ZW50IiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJoYW5kbGVNb3VzZURvd25DYXB0dXJlIiwidGFyZ2V0IiwidGFiSW5kZXgiLCJnZXRBdHRyaWJ1dGUiLCJoaWRlVGltZXN0YW1wIiwibGl2ZVJlZ2lvbktleSIsInNob3VsZFNwZWFrIiwic3BlYWsiLCJhY3Rpdml0eUVsZW1lbnRzIiwiZWxlbWVudElkIiwiZXhpc3RpbmdFbnRyeSIsImFyaWFMYWJlbElEIiwidG9TdHJpbmciLCJzdWJzdHIiLCJmb2N1c2VkIiwibGFzdEVsZW1lbnQiLCJyZW5kZXJpbmdBY3Rpdml0aWVzIiwic2Nyb2xsVG9Cb3R0b21TY3JvbGxUbyIsInNjcm9sbFRvQm90dG9tU2Nyb2xsVG9FbmQiLCJzY3JvbGxUbyIsImJlaGF2aW9yIiwiRXJyb3IiLCJzY3JvbGxUb3AiLCJzY3JvbGxhYmxlRWxlbWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJnZXRDbGllbnRSZWN0cyIsImFjdGl2aXR5RWxlbWVudEhlaWdodCIsImhlaWdodCIsImFjdGl2aXR5RWxlbWVudFkiLCJ5Iiwic2Nyb2xsYWJsZUhlaWdodCIsImFjdGl2aXR5RWxlbWVudE9mZnNldFRvcCIsIk1hdGgiLCJtaW4iLCJzY3JvbGxSZWxhdGl2ZSIsImRpc3BsYWNlbWVudCIsInNjcm9sbGFibGUiLCJuZXh0U2Nyb2xsVG9wIiwib2Zmc2V0SGVpZ2h0IiwibWF4Iiwic2Nyb2xsSGVpZ2h0IiwiZGlzcGF0Y2hTY3JvbGxQb3NpdGlvbiIsInBhdGNoZWREaXNwYXRjaFNjcm9sbFBvc2l0aW9uIiwicmV2ZXJzZSIsImxhc3RJbnRlcmFjdGVkQWN0aXZpdHkiLCJpbmRleE9mTGFzdEludGVyYWN0ZWRBY3Rpdml0eSIsImluZGV4T2YiLCJhY3RpdmVEZXNjZW5kYW50RWxlbWVudElkIiwic2Nyb2xsQWN0aXZlRGVzY2VuZGFudEludG9WaWV3IiwiYWN0aXZlRGVzY2VuZGFudCIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJjb250YWlucyIsImFjdGl2ZUVsZW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJzdHlsZSIsInNjcm9sbEludG9WaWV3IiwiYmxvY2siLCJzY3JvbGxUb3BBdFRvcFNpZGUiLCJvZmZzZXRUb3AiLCJzY3JvbGxUb3BBdEJvdHRvbVNpZGUiLCJoYW5kbGVUcmFuc2NyaXB0Rm9jdXMiLCJjdXJyZW50VGFyZ2V0IiwidW5kZWZpbmVkIiwiZm9jdXNSZWxhdGl2ZUFjdGl2aXR5IiwiZGVsdGEiLCJpc05hTiIsImZpbmRJbmRleCIsIm5leHRJbmRleCIsIm5leHRGb2N1c2VkQWN0aXZpdHkiLCJoYW5kbGVUcmFuc2NyaXB0S2V5RG93biIsImZyb21FbmRPZlRyYW5zY3JpcHRJbmRpY2F0b3IiLCJmcm9tVHJhbnNjcmlwdCIsImhhbmRsZWQiLCJJbmZpbml0eSIsImZvY3VzZWRBY3Rpdml0eUVudHJ5IiwiZm9jdXNlZEFjdGl2aXR5RWxlbWVudCIsImZpbHRlciIsImZpcnN0VGFiYmFibGVFbGVtZW50IiwibGFiZWxJZCIsInNldEJvdHRvbW1vc3RGb2N1c2VkQWN0aXZpdHlLZXlJZk5lZWRlZCIsImxhc3RBY3Rpdml0eUtleSIsImhhbmRsZVRyYW5zY3JpcHRLZXlEb3duQ2FwdHVyZSIsImFsdEtleSIsImN0cmxLZXkiLCJtZXRhS2V5IiwiZm9jdXNUcmFuc2NyaXB0Q2FsbGJhY2siLCJoYW5kbGVGb2N1c0FjdGl2aXR5IiwiZGlzcGF0Y2hUcmFuc2NyaXB0Rm9jdXMiLCJmb2N1c2VkQWN0aXZpdHkiLCJoYW5kbGVGb2N1c0ZpbGxlciIsImlzQ29udGVudEludGVyYWN0aXZlIiwiZGVmYXVsdFByb3BzIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwic2hhcGUiLCJhcnJheSIsImlzUmVxdWlyZWQiLCJzdHJpbmciLCJJbnRlcm5hbFNjcmVlblJlYWRlclRyYW5zY3JpcHQiLCJhcnJheU9mIiwiYW55IiwiSW50ZXJuYWxUcmFuc2NyaXB0U2Nyb2xsYWJsZSIsImNoaWxkcmVuIiwib25Gb2N1c0FjdGl2aXR5Iiwib25Gb2N1c0ZpbGxlciIsImFjdGl2aXRpZXNTdHlsZVNldCIsImhpZGVTY3JvbGxUb0VuZEJ1dHRvbiIsImFuaW1hdGluZ1RvRW5kIiwic3RpY2t5IiwibGFzdFZpc2libGVBY3Rpdml0eUlkIiwic2Nyb2xsVG9FbmRCdXR0b25SZWYiLCJsYXN0UmVhZEFjdGl2aXR5SWRSZWYiLCJhbGxBY3Rpdml0aWVzUmVhZCIsImhhbmRsZVNjcm9sbFRvRW5kQnV0dG9uQ2xpY2siLCJmaXJzdFVucmVhZEFjdGl2aXR5IiwicmVuZGVyU2VwYXJhdG9yQWZ0ZXJJbmRleCIsIlJlYWN0IiwiQ2hpbGRyZW4iLCJjb3VudCIsImZ1bmMiLCJTZXRTY3JvbGxlciIsInNjcm9sbGVyUmVmIiwiYXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5IiwiYXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5T2Zmc2V0IiwiYXV0b1Njcm9sbFNuYXBPblBhZ2UiLCJhdXRvU2Nyb2xsU25hcE9uUGFnZU9mZnNldCIsImxhc3RBY2tub3dsZWRnZWRBY3Rpdml0eSIsImxhc3RBY2tub3dsZWRnZWRBY3Rpdml0eVJlZiIsInBhdGNoZWRBdXRvU2Nyb2xsU25hcE9uQWN0aXZpdHkiLCJwYXRjaGVkQXV0b1Njcm9sbFNuYXBPblBhZ2UiLCJwYXRjaGVkQXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5T2Zmc2V0IiwicGF0Y2hlZEF1dG9TY3JvbGxTbmFwT25QYWdlT2Zmc2V0IiwidmFsdWVzIiwibnRoVW5hY2tub3dsZWRnZWRBY3Rpdml0eUVsZW1lbnQiLCJmaXJzdFVuYWNrbm93bGVkZ2VkQWN0aXZpdHlFbGVtZW50IiwicmVkdWNlIiwibWluVmFsdWUiLCJ2YWx1ZSIsIkJhc2ljVHJhbnNjcmlwdCIsInNjcm9sbGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFTQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUdFQSxhLEdBUUVDLDZCLENBUkZELGE7SUFDQUUseUIsR0FPRUQsNkIsQ0FQRkMseUI7SUFDQUMsK0IsR0FNRUYsNkIsQ0FORkUsK0I7SUFDQUMsdUIsR0FLRUgsNkIsQ0FMRkcsdUI7SUFDQUMsWSxHQUlFSiw2QixDQUpGSSxZO0lBQ0FDLGtCLEdBR0VMLDZCLENBSEZLLGtCO0lBQ0FDLFksR0FFRU4sNkIsQ0FGRk0sWTtJQUNBQyxlLEdBQ0VQLDZCLENBREZPLGU7QUFHRixJQUFNQyxVQUFVLEdBQUc7QUFDakIsaUNBQStCO0FBQzdCQyxJQUFBQSxPQUFPLEVBQUUsTUFEb0I7QUFFN0JDLElBQUFBLGFBQWEsRUFBRSxRQUZjO0FBRzdCQyxJQUFBQSxRQUFRLEVBQUUsUUFIbUI7QUFJN0I7QUFDQTtBQUNBO0FBQ0FDLElBQUFBLFFBQVEsRUFBRSxVQVBtQjtBQVM3Qiw0Q0FBd0M7QUFDdENDLE1BQUFBLElBQUksRUFBRTtBQURnQyxLQVRYO0FBYTdCLGdEQUE0QztBQUMxQ0osTUFBQUEsT0FBTyxFQUFFLE1BRGlDO0FBRTFDQyxNQUFBQSxhQUFhLEVBQUUsUUFGMkI7QUFHMUNJLE1BQUFBLFNBQVMsRUFBRSxRQUgrQjtBQUkxQ0MsTUFBQUEsdUJBQXVCLEVBQUU7QUFKaUIsS0FiZjtBQW9CN0IsZ0RBQTRDO0FBQzFDQyxNQUFBQSxhQUFhLEVB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QUEsUUFBUSxFQUFFa0I7QUFBdkMsa0JBQ0UsNkJBQUMsV0FBRDtBQUFhLElBQUEsbUJBQW1CLEVBQUVwTyxtQkFBbEM7QUFBdUQsSUFBQSxXQUFXLEVBQUVrTjtBQUFwRSxJQURGLGVBRUUsNkJBQUMsa0JBQUQ7QUFBb0IsSUFBQSxtQkFBbUIsRUFBRWxOLG1CQUF6QztBQUE4RCxJQUFBLFNBQVMsRUFBRUM7QUFBekUsSUFGRixDQURGO0FBTUQsQ0FaRDs7QUFjQWtPLGVBQWUsQ0FBQy9DLFlBQWhCLEdBQStCO0FBQzdCbkwsRUFBQUEsU0FBUyxFQUFFO0FBRGtCLENBQS9CO0FBSUFrTyxlQUFlLENBQUM5QyxTQUFoQixHQUE0QjtBQUMxQnBMLEVBQUFBLFNBQVMsRUFBRXFMLG1CQUFVSTtBQURLLENBQTVCO2VBSWV5QyxlIiwic291cmNlUm9vdCI6ImNvbXBvbmVudDovLy8iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgbm8tbWFnaWMtbnVtYmVyczogW1wiZXJyb3JcIiwgeyBcImlnbm9yZVwiOiBbLTEsIDAsIDEsIDIsIDUsIDM2XSB9XSAqL1xuXG5pbXBvcnQgeyBob29rcyB9IGZyb20gJ2JvdGZyYW1ld29yay13ZWJjaGF0LWFwaSc7XG5pbXBvcnQge1xuICBDb21wb3NlciBhcyBSZWFjdFNjcm9sbFRvQm90dG9tQ29tcG9zZXIsXG4gIFBhbmVsIGFzIFJlYWN0U2Nyb2xsVG9Cb3R0b21QYW5lbCxcbiAgdXNlQW5pbWF0aW5nVG9FbmQsXG4gIHVzZU9ic2VydmVTY3JvbGxQb3NpdGlvbixcbiAgdXNlU2Nyb2xsVG8sXG4gIHVzZVNjcm9sbFRvRW5kLFxuICB1c2VTdGlja3lcbn0gZnJvbSAncmVhY3Qtc2Nyb2xsLXRvLWJvdHRvbSc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgcmFuZG9tIGZyb20gJ21hdGgtcmFuZG9tJztcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgQmFzaWNUeXBpbmdJbmRpY2F0b3IgZnJvbSAnLi9CYXNpY1R5cGluZ0luZGljYXRvcic7XG5pbXBvcnQgRmFkZSBmcm9tICcuL1V0aWxzL0ZhZGUnO1xuaW1wb3J0IEZvY3VzUmVkaXJlY3RvciBmcm9tICcuL1V0aWxzL0ZvY3VzUmVkaXJlY3Rvcic7XG5pbXBvcnQgZ2V0QWN0aXZpdHlVbmlxdWVJZCBmcm9tICcuL1V0aWxzL2dldEFjdGl2aXR5VW5pcXVlSWQnO1xuaW1wb3J0IGdldFRhYkluZGV4IGZyb20gJy4vVXRpbHMvVHlwZUZvY3VzU2luay9nZXRUYWJJbmRleCc7XG5pbXBvcnQgaW5wdXR0YWJsZUtleSBmcm9tICcuL1V0aWxzL1R5cGVGb2N1c1NpbmsvaW5wdXR0YWJsZUtleSc7XG5pbXBvcnQgaW50ZXJzZWN0aW9uT2YgZnJvbSAnLi9VdGlscy9pbnRlcnNlY3Rpb25PZic7XG5pbXBvcnQgaXNaZXJvT3JQb3NpdGl2ZSBmcm9tICcuL1V0aWxzL2lzWmVyb09yUG9zaXRpdmUnO1xuaW1wb3J0IHJlbW92ZUlubGluZSBmcm9tICcuL1V0aWxzL3JlbW92ZUlubGluZSc7XG5pbXBvcnQgU2NyZWVuUmVhZGVyQWN0aXZpdHkgZnJvbSAnLi9TY3JlZW5SZWFkZXJBY3Rpdml0eSc7XG5pbXBvcnQgU2NyZWVuUmVhZGVyVGV4dCBmcm9tICcuL1NjcmVlblJlYWRlclRleHQnO1xuaW1wb3J0IFNjcm9sbFRvRW5kQnV0dG9uIGZyb20gJy4vQWN0aXZpdHkvU2Nyb2xsVG9FbmRCdXR0b24nO1xuaW1wb3J0IFNwZWFrQWN0aXZpdHkgZnJvbSAnLi9BY3Rpdml0eS9TcGVhayc7XG5pbXBvcnQgdGFiYmFibGVFbGVtZW50cyBmcm9tICcuL1V0aWxzL3RhYmJhYmxlRWxlbWVudHMnO1xuaW1wb3J0IHVzZUFja25vd2xlZGdlZEFjdGl2aXR5IGZyb20gJy4vaG9va3MvaW50ZXJuYWwvdXNlQWNrbm93bGVkZ2VkQWN0aXZpdHknO1xuaW1wb3J0IHVzZURpc3BhdGNoU2Nyb2xsUG9zaXRpb24gZnJvbSAnLi9ob29rcy9pbnRlcm5hbC91c2VEaXNwYXRjaFNjcm9sbFBvc2l0aW9uJztcbmltcG9ydCB1c2VEaXNwYXRjaFRyYW5zY3JpcHRGb2N1cyBmcm9tICcuL2hvb2tzL2ludGVybmFsL3VzZURpc3BhdGNoVHJhbnNjcmlwdEZvY3VzJztcbmltcG9ydCB1c2VGb2N1cyBmcm9tICcuL2hvb2tzL3VzZUZvY3VzJztcbmltcG9ydCB1c2VNZW1vaXplIGZyb20gJy4vaG9va3MvaW50ZXJuYWwvdXNlTWVtb2l6ZSc7XG5pbXBvcnQgdXNlUmVnaXN0ZXJGb2N1c1RyYW5zY3JpcHQgZnJvbSAnLi9ob29rcy9pbnRlcm5hbC91c2VSZWdpc3RlckZvY3VzVHJhbnNjcmlwdCc7XG5pbXBvcnQgdXNlUmVnaXN0ZXJTY3JvbGxSZWxhdGl2ZSBmcm9tICcuL2hvb2tzL2ludGVybmFsL3VzZVJlZ2lzdGVyU2Nyb2xsUmVsYXRpdmUnO1xuaW1wb3J0IHVzZVJlZ2lzdGVyU2Nyb2xsVG8gZnJvbSAnLi9ob29rcy9pbnRlcm5hbC91c2VSZWdpc3RlclNjcm9sbFRvJztcbmltcG9ydCB1c2VSZWdpc3RlclNjcm9sbFRvRW5kIGZyb20gJy4vaG9va3MvaW50ZXJuYWwvdXNlUmVnaXN0ZXJTY3JvbGxUb0VuZCc7XG5pbXBvcnQgdXNlU3R5bGVTZXQgZnJvbSAnLi9ob29rcy91c2VTdHlsZVNldCc7XG5pbXBvcnQgdXNlU3R5bGVUb0Vtb3Rpb25PYmplY3QgZnJvbSAnLi9ob29rcy9pbnRlcm5hbC91c2VTdHlsZVRvRW1vdGlvbk9iamVjdCc7XG5pbXBvcnQgdXNlVW5pcXVlSWQgZnJvbSAnLi9ob29rcy9pbnRlcm5hbC91c2VVbmlxdWVJZCc7XG5cbmNvbnN0IHtcbiAgdXNlQWN0aXZpdGllcyxcbiAgdXNlQ3JlYXRlQWN0aXZpdHlSZW5kZXJlcixcbiAgdXNlQ3JlYXRlQWN0aXZpdHlTdGF0dXNSZW5kZXJlcixcbiAgdXNlQ3JlYXRlQXZhdGFyUmVuZGVyZXIsXG4gIHVzZURpcmVjdGlvbixcbiAgdXNlR3JvdXBBY3Rpdml0aWVzLFxuICB1c2VMb2NhbGl6ZXIsXG4gIHVzZVN0eWxlT3B0aW9uc1xufSA9IGhvb2tzO1xuXG5jb25zdCBST09UX1NUWUxFID0ge1xuICAnJi53ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0Jzoge1xuICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgLy8gTWFrZSBzdXJlIHRvIHNldCBcInBvc2l0aW9uOiByZWxhdGl2ZVwiIGhlcmUgdG8gZm9ybSBhbm90aGVyIHN0YWNraW5nIGNvbnRleHQgZm9yIHRoZSBzY3JvbGwtdG8tZW5kIGJ1dHRvbi5cbiAgICAvLyBTdGFja2luZyBjb250ZXh0IGhlbHAgaXNvbGF0aW5nIGVsZW1lbnRzIHRoYXQgdXNlIFwiei1pbmRleFwiIGZyb20gZ2xvYmFsIHBvbGx1dGlvbi5cbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1Bvc2l0aW9uaW5nL1VuZGVyc3RhbmRpbmdfel9pbmRleC9UaGVfc3RhY2tpbmdfY29udGV4dFxuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuXG4gICAgJyYgLndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2ZpbGxlcic6IHtcbiAgICAgIGZsZXg6IDFcbiAgICB9LFxuXG4gICAgJyYgLndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX3Njcm9sbGFibGUnOiB7XG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICAgIG92ZXJmbG93WDogJ2hpZGRlbicsXG4gICAgICBXZWJraXRPdmVyZmxvd1Njcm9sbGluZzogJ3RvdWNoJ1xuICAgIH0sXG5cbiAgICAnJiAud2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fdHJhbnNjcmlwdCc6IHtcbiAgICAgIGxpc3RTdHlsZVR5cGU6ICdub25lJ1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gdmFsaWRhdGVBbGxBY3Rpdml0aWVzVGFnZ2VkKGFjdGl2aXRpZXMsIGJpbnMpIHtcbiAgcmV0dXJuIGFjdGl2aXRpZXMuZXZlcnkoYWN0aXZpdHkgPT4gYmlucy5zb21lKGJpbiA9PiBiaW4uaW5jbHVkZXMoYWN0aXZpdHkpKSk7XG59XG5cbmNvbnN0IEludGVybmFsVHJhbnNjcmlwdCA9ICh7IGFjdGl2aXR5RWxlbWVudHNSZWYsIGNsYXNzTmFtZSB9KSA9PiB7XG4gIGNvbnN0IFt7IGJhc2ljVHJhbnNjcmlwdDogYmFzaWNUcmFuc2NyaXB0U3R5bGVTZXQgfV0gPSB1c2VTdHlsZVNldCgpO1xuICBjb25zdCBbXG4gICAgeyBidWJibGVGcm9tVXNlck51Yk9mZnNldCwgYnViYmxlTnViT2Zmc2V0LCBncm91cFRpbWVzdGFtcCwgaW50ZXJuYWxMaXZlUmVnaW9uRmFkZUFmdGVyLCBzaG93QXZhdGFySW5Hcm91cCB9XG4gIF0gPSB1c2VTdHlsZU9wdGlvbnMoKTtcbiAgY29uc3QgW2ZvY3VzZWRBY3Rpdml0eUtleSwgc2V0Rm9jdXNlZEFjdGl2aXR5S2V5XSA9IHVzZVN0YXRlKCk7XG4gIGNvbnN0IFthY3Rpdml0aWVzXSA9IHVzZUFjdGl2aXRpZXMoKTtcbiAgY29uc3QgW2RpcmVjdGlvbl0gPSB1c2VEaXJlY3Rpb24oKTtcbiAgY29uc3QgY3JlYXRlQWN0aXZpdHlSZW5kZXJlciA9IHVzZUNyZWF0ZUFjdGl2aXR5UmVuZGVyZXIoKTtcbiAgY29uc3QgY3JlYXRlQWN0aXZpdHlTdGF0dXNSZW5kZXJlciA9IHVzZUNyZWF0ZUFjdGl2aXR5U3RhdHVzUmVuZGVyZXIoKTtcbiAgY29uc3QgY3JlYXRlQXZhdGFyUmVuZGVyZXIgPSB1c2VDcmVhdGVBdmF0YXJSZW5kZXJlcigpO1xuICBjb25zdCBmb2N1cyA9IHVzZUZvY3VzKCk7XG4gIGNvbnN0IGdyb3VwQWN0aXZpdGllcyA9IHVzZUdyb3VwQWN0aXZpdGllcygpO1xuICBjb25zdCBsb2NhbGl6ZSA9IHVzZUxvY2FsaXplcigpO1xuICBjb25zdCByb290Q2xhc3NOYW1lID0gdXNlU3R5bGVUb0Vtb3Rpb25PYmplY3QoKShST09UX1NUWUxFKSArICcnO1xuICBjb25zdCByb290RWxlbWVudFJlZiA9IHVzZVJlZigpO1xuICBjb25zdCB0ZXJtaW5hdG9yUmVmID0gdXNlUmVmKCk7XG5cbiAgY29uc3QgYWN0aXZpdHlJbnRlcmFjdGl2ZUFsdCA9IGxvY2FsaXplKCdBQ1RJVklUWV9JTlRFUkFDVElWRV9MQUJFTF9BTFQnKTtcbiAgY29uc3QgdGVybWluYXRvclRleHQgPSBsb2NhbGl6ZSgnVFJBTlNDUklQVF9URVJNSU5BVE9SX1RFWFQnKTtcbiAgY29uc3QgdHJhbnNjcmlwdEFyaWFMYWJlbCA9IGxvY2FsaXplKCdUUkFOU0NSSVBUX0FSSUFfTEFCRUxfQUxUJyk7XG4gIGNvbnN0IHRyYW5zY3JpcHRSb2xlRGVzY3JpcHRpb24gPSBsb2NhbGl6ZSgnVFJBTlNDUklQVF9BUklBX1JPTEVfQUxUJyk7XG5cbiAgY29uc3QgaGlkZUFsbFRpbWVzdGFtcHMgPSBncm91cFRpbWVzdGFtcCA9PT0gZmFsc2U7XG5cbiAgLy8gR2V0cyByZW5kZXJlciBmb3IgZXZlcnkgYWN0aXZpdHkuXG4gIC8vIEFjdGl2aXRpZXMgdGhhdCBhcmUgbm90IHZpc2libGUgd2lsbCByZXR1cm4gYSBmYWxzeSByZW5kZXJlci5cblxuICAvLyBDb252ZXJ0ZWQgZnJvbSBjcmVhdGVBY3Rpdml0eVJlbmRlcmVyKHsgYWN0aXZpdHksIG5leHRWaXNpYmxlQWN0aXZpdHkgfSkgdG8gY3JlYXRlQWN0aXZpdHlSZW5kZXJlcihhY3Rpdml0eSwgbmV4dFZpc2libGVBY3Rpdml0eSkuXG4gIC8vIFRoaXMgaXMgZm9yIHRoZSBtZW1vaXphdGlvbiBmdW5jdGlvbiB0byBjYWNoZSB0aGUgYXJndW1lbnRzLiBNZW1vaXplciBjYW4gb25seSBjYWNoZSBsaXRlcmFsIGFyZ3VtZW50cy5cbiAgY29uc3QgY3JlYXRlQWN0aXZpdHlSZW5kZXJlcldpdGhMaXRlcmFsQXJncyA9IHVzZUNhbGxiYWNrKFxuICAgIChhY3Rpdml0eSwgbmV4dFZpc2libGVBY3Rpdml0eSkgPT4gY3JlYXRlQWN0aXZpdHlSZW5kZXJlcih7IGFjdGl2aXR5LCBuZXh0VmlzaWJsZUFjdGl2aXR5IH0pLFxuICAgIFtjcmVhdGVBY3Rpdml0eVJlbmRlcmVyXVxuICApO1xuXG4gIC8vIENyZWF0ZSBhIG1lbW9pemVkIGNvbnRleHQgb2YgdGhlIGNyZWF0ZUFjdGl2aXR5UmVuZGVyZXIgZnVuY3Rpb24uXG4gIGNvbnN0IGFjdGl2aXRpZXNXaXRoUmVuZGVyZXIgPSB1c2VNZW1vaXplKFxuICAgIGNyZWF0ZUFjdGl2aXR5UmVuZGVyZXJXaXRoTGl0ZXJhbEFyZ3MsXG4gICAgY3JlYXRlQWN0aXZpdHlSZW5kZXJlcldpdGhMaXRlcmFsQXJnc01lbW9pemVkID0+IHtcbiAgICAgIC8vIEFsbCBjYWxscyB0byBjcmVhdGVBY3Rpdml0eVJlbmRlcmVyV2l0aExpdGVyYWxBcmdzTWVtb2l6ZWQoKSBpbiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgbWVtb2l6ZWQgKExSVSA9IDEpLlxuICAgICAgLy8gSW4gdGhlIG5leHQgcmVuZGVyIGN5Y2xlLCBjYWxscyB0byBjcmVhdGVBY3Rpdml0eVJlbmRlcmVyV2l0aExpdGVyYWxBcmdzTWVtb2l6ZWQoKSBtaWdodCByZXR1cm4gdGhlIG1lbW9pemVkIHJlc3VsdCBpbnN0ZWFkLlxuICAgICAgLy8gVGhpcyBpcyBhbiBpbXByb3ZlbWVudCB0byBSZWFjdCB1c2VNZW1vKCksIGJlY2F1c2UgaXQgb25seSBhbGxvd3MgMSBtZW1vaXphdGlvbi5cbiAgICAgIC8vIHVzZU1lbW9pemUoKSBhbGxvd3MgYW55IG51bWJlciBvZiBtZW1vaXphdGlvbi5cblxuICAgICAgY29uc3QgYWN0aXZpdGllc1dpdGhSZW5kZXJlciA9IFtdO1xuICAgICAgbGV0IG5leHRWaXNpYmxlQWN0aXZpdHk7XG5cbiAgICAgIGZvciAobGV0IGluZGV4ID0gYWN0aXZpdGllcy5sZW5ndGggLSAxOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7XG4gICAgICAgIGNvbnN0IGFjdGl2aXR5ID0gYWN0aXZpdGllc1tpbmRleF07XG4gICAgICAgIGNvbnN0IHJlbmRlckFjdGl2aXR5ID0gY3JlYXRlQWN0aXZpdHlSZW5kZXJlcldpdGhMaXRlcmFsQXJnc01lbW9pemVkKGFjdGl2aXR5LCBuZXh0VmlzaWJsZUFjdGl2aXR5KTtcblxuICAgICAgICBpZiAocmVuZGVyQWN0aXZpdHkpIHtcbiAgICAgICAgICBhY3Rpdml0aWVzV2l0aFJlbmRlcmVyLnNwbGljZSgwLCAwLCB7XG4gICAgICAgICAgICBhY3Rpdml0eSxcbiAgICAgICAgICAgIHJlbmRlckFjdGl2aXR5XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBuZXh0VmlzaWJsZUFjdGl2aXR5ID0gYWN0aXZpdHk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjdGl2aXRpZXNXaXRoUmVuZGVyZXI7XG4gICAgfSxcbiAgICBbYWN0aXZpdGllc11cbiAgKTtcblxuICBjb25zdCB2aXNpYmxlQWN0aXZpdGllcyA9IHVzZU1lbW8oKCkgPT4gYWN0aXZpdGllc1dpdGhSZW5kZXJlci5tYXAoKHsgYWN0aXZpdHkgfSkgPT4gYWN0aXZpdHkpLCBbXG4gICAgYWN0aXZpdGllc1dpdGhSZW5kZXJlclxuICBdKTtcblxuICAvLyBUYWcgYWN0aXZpdGllcyBiYXNlZCBvbiB0eXBlcy5cbiAgLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdGFnIGludG8gMiB0eXBlczogc2VuZGVyIGFuZCBzdGF0dXMuXG5cbiAgY29uc3QgeyBhY3Rpdml0aWVzR3JvdXBCeVNlbmRlciwgYWN0aXZpdGllc0dyb3VwQnlTdGF0dXMgfSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHsgc2VuZGVyOiBhY3Rpdml0aWVzR3JvdXBCeVNlbmRlciwgc3RhdHVzOiBhY3Rpdml0aWVzR3JvdXBCeVN0YXR1cyB9ID0gZ3JvdXBBY3Rpdml0aWVzKHtcbiAgICAgIGFjdGl2aXRpZXM6IHZpc2libGVBY3Rpdml0aWVzXG4gICAgfSk7XG5cbiAgICBpZiAoIXZhbGlkYXRlQWxsQWN0aXZpdGllc1RhZ2dlZCh2aXNpYmxlQWN0aXZpdGllcywgYWN0aXZpdGllc0dyb3VwQnlTZW5kZXIpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdib3RmcmFtZXdvcmstd2ViY2hhdDogTm90IGV2ZXJ5IGFjdGl2aXRpZXMgYXJlIGdyb3VwZWQgaW4gdGhlIFwic2VuZGVyXCIgcHJvcGVydHkuIFBsZWFzZSBmaXggXCJncm91cEFjdGl2aXRpZXNNaWRkbGV3YXJlXCIgYW5kIGdyb3VwIGV2ZXJ5IGFjdGl2aXRpZXMuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXZhbGlkYXRlQWxsQWN0aXZpdGllc1RhZ2dlZCh2aXNpYmxlQWN0aXZpdGllcywgYWN0aXZpdGllc0dyb3VwQnlTdGF0dXMpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdib3RmcmFtZXdvcmstd2ViY2hhdDogTm90IGV2ZXJ5IGFjdGl2aXRpZXMgYXJlIGdyb3VwZWQgaW4gdGhlIFwic3RhdHVzXCIgcHJvcGVydHkuIFBsZWFzZSBmaXggXCJncm91cEFjdGl2aXRpZXNNaWRkbGV3YXJlXCIgYW5kIGdyb3VwIGV2ZXJ5IGFjdGl2aXRpZXMuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWN0aXZpdGllc0dyb3VwQnlTZW5kZXIsXG4gICAgICBhY3Rpdml0aWVzR3JvdXBCeVN0YXR1c1xuICAgIH07XG4gIH0sIFtncm91cEFjdGl2aXRpZXMsIHZpc2libGVBY3Rpdml0aWVzXSk7XG5cbiAgLy8gQ3JlYXRlIGEgdHJlZSBvZiBhY3Rpdml0aWVzIHdpdGggMiBkaW1lbnNpb25zOiBzZW5kZXIsIGZvbGxvd2VkIGJ5IHN0YXR1cy5cblxuICBjb25zdCBhY3Rpdml0eVRyZWUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCB2aXNpYmxlQWN0aXZpdGllc1BlbmRpbmdHcm91cGluZyA9IFsuLi52aXNpYmxlQWN0aXZpdGllc107XG4gICAgY29uc3QgYWN0aXZpdHlUcmVlID0gW107XG5cbiAgICB3aGlsZSAodmlzaWJsZUFjdGl2aXRpZXNQZW5kaW5nR3JvdXBpbmcubGVuZ3RoKSB7XG4gICAgICBjb25zdCBbYWN0aXZpdHldID0gdmlzaWJsZUFjdGl2aXRpZXNQZW5kaW5nR3JvdXBpbmc7XG4gICAgICBjb25zdCBzZW5kZXJUcmVlID0gW107XG4gICAgICBjb25zdCBhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXIgPSBhY3Rpdml0aWVzR3JvdXBCeVNlbmRlci5maW5kKGFjdGl2aXRpZXMgPT4gYWN0aXZpdGllcy5pbmNsdWRlcyhhY3Rpdml0eSkpO1xuXG4gICAgICBhY3Rpdml0eVRyZWUucHVzaChzZW5kZXJUcmVlKTtcblxuICAgICAgYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyLmZvckVhY2goYWN0aXZpdHkgPT4ge1xuICAgICAgICBjb25zdCBhY3Rpdml0aWVzV2l0aFNhbWVTdGF0dXMgPSBhY3Rpdml0aWVzR3JvdXBCeVN0YXR1cy5maW5kKGFjdGl2aXRpZXMgPT4gYWN0aXZpdGllcy5pbmNsdWRlcyhhY3Rpdml0eSkpO1xuXG4gICAgICAgIGNvbnN0IGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlckFuZFN0YXR1cyA9IGludGVyc2VjdGlvbk9mKFxuICAgICAgICAgIHZpc2libGVBY3Rpdml0aWVzUGVuZGluZ0dyb3VwaW5nLFxuICAgICAgICAgIGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlcixcbiAgICAgICAgICBhY3Rpdml0aWVzV2l0aFNhbWVTdGF0dXNcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyQW5kU3RhdHVzLmxlbmd0aCkge1xuICAgICAgICAgIHNlbmRlclRyZWUucHVzaChhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXJBbmRTdGF0dXMpO1xuICAgICAgICAgIHJlbW92ZUlubGluZSh2aXNpYmxlQWN0aXZpdGllc1BlbmRpbmdHcm91cGluZywgLi4uYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyQW5kU3RhdHVzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQXNzZXJ0aW9uOiBBbGwgYWN0aXZpdGllcyBpbiB2aXNpYmxlQWN0aXZpdGllcywgbXVzdCBiZSBhc3NpZ25lZCB0byB0aGUgYWN0aXZpdHlUcmVlXG4gICAgaWYgKFxuICAgICAgIXZpc2libGVBY3Rpdml0aWVzLmV2ZXJ5KGFjdGl2aXR5ID0+XG4gICAgICAgIGFjdGl2aXR5VHJlZS5zb21lKGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlciA9PlxuICAgICAgICAgIGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlci5zb21lKGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlckFuZFN0YXR1cyA9PlxuICAgICAgICAgICAgYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyQW5kU3RhdHVzLmluY2x1ZGVzKGFjdGl2aXR5KVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICkge1xuICAgICAgY29uc29sZS53YXJuKCdib3RmcmFtZXdvcmstd2ViY2hhdCBpbnRlcm5hbDogTm90IGFsbCB2aXNpYmxlIGFjdGl2aXRpZXMgYXJlIGdyb3VwZWQgaW4gdGhlIGFjdGl2aXR5VHJlZS4nLCB7XG4gICAgICAgIHZpc2libGVBY3Rpdml0aWVzLFxuICAgICAgICBhY3Rpdml0eVRyZWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhY3Rpdml0eVRyZWU7XG4gIH0sIFthY3Rpdml0aWVzR3JvdXBCeVNlbmRlciwgYWN0aXZpdGllc0dyb3VwQnlTdGF0dXMsIHZpc2libGVBY3Rpdml0aWVzXSk7XG5cbiAgLy8gRmxhdHRlbiB0aGUgdHJlZSBiYWNrIGludG8gYW4gYXJyYXkgd2l0aCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHJlbmRlcmluZy5cblxuICBjb25zdCByZW5kZXJpbmdFbGVtZW50cyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHJlbmRlcmluZ0VsZW1lbnRzID0gW107XG4gICAgY29uc3QgdG9wU2lkZUJvdE51YiA9IGlzWmVyb09yUG9zaXRpdmUoYnViYmxlTnViT2Zmc2V0KTtcbiAgICBjb25zdCB0b3BTaWRlVXNlck51YiA9IGlzWmVyb09yUG9zaXRpdmUoYnViYmxlRnJvbVVzZXJOdWJPZmZzZXQpO1xuXG4gICAgYWN0aXZpdHlUcmVlLmZvckVhY2goYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyID0+IHtcbiAgICAgIGNvbnN0IFtbZmlyc3RBY3Rpdml0eV1dID0gYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyO1xuICAgICAgY29uc3QgcmVuZGVyQXZhdGFyID0gY3JlYXRlQXZhdGFyUmVuZGVyZXIoeyBhY3Rpdml0eTogZmlyc3RBY3Rpdml0eSB9KTtcblxuICAgICAgYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyLmZvckVhY2goKGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlckFuZFN0YXR1cywgaW5kZXhXaXRoaW5TZW5kZXJHcm91cCkgPT4ge1xuICAgICAgICBjb25zdCBmaXJzdEluU2VuZGVyR3JvdXAgPSAhaW5kZXhXaXRoaW5TZW5kZXJHcm91cDtcbiAgICAgICAgY29uc3QgbGFzdEluU2VuZGVyR3JvdXAgPSBpbmRleFdpdGhpblNlbmRlckdyb3VwID09PSBhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXIubGVuZ3RoIC0gMTtcblxuICAgICAgICBhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXJBbmRTdGF0dXMuZm9yRWFjaCgoYWN0aXZpdHksIGluZGV4V2l0aGluU2VuZGVyQW5kU3RhdHVzR3JvdXApID0+IHtcbiAgICAgICAgICAvLyBXZSBvbmx5IHNob3cgdGhlIHRpbWVzdGFtcCBhdCB0aGUgZW5kIG9mIHRoZSBzZW5kZXIgZ3JvdXAuIEJ1dCB3ZSBhbHdheXMgc2hvdyB0aGUgXCJTZW5kIGZhaWxlZCwgcmV0cnlcIiBwcm9tcHQuXG4gICAgICAgICAgY29uc3QgcmVuZGVyQWN0aXZpdHlTdGF0dXMgPSBjcmVhdGVBY3Rpdml0eVN0YXR1c1JlbmRlcmVyKHtcbiAgICAgICAgICAgIGFjdGl2aXR5XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCBmaXJzdEluU2VuZGVyQW5kU3RhdHVzR3JvdXAgPSAhaW5kZXhXaXRoaW5TZW5kZXJBbmRTdGF0dXNHcm91cDtcbiAgICAgICAgICBjb25zdCBsYXN0SW5TZW5kZXJBbmRTdGF0dXNHcm91cCA9XG4gICAgICAgICAgICBpbmRleFdpdGhpblNlbmRlckFuZFN0YXR1c0dyb3VwID09PSBhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXJBbmRTdGF0dXMubGVuZ3RoIC0gMTtcblxuICAgICAgICAgIGNvbnN0IHsgcmVuZGVyQWN0aXZpdHkgfSA9IGFjdGl2aXRpZXNXaXRoUmVuZGVyZXIuZmluZChlbnRyeSA9PiBlbnRyeS5hY3Rpdml0eSA9PT0gYWN0aXZpdHkpO1xuICAgICAgICAgIGNvbnN0IGtleSA9IGdldEFjdGl2aXR5VW5pcXVlSWQoYWN0aXZpdHkpIHx8IHJlbmRlcmluZ0VsZW1lbnRzLmxlbmd0aDtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjaGFubmVsRGF0YTogeyBtZXNzYWdlQmFjazogeyBkaXNwbGF5VGV4dDogbWVzc2FnZUJhY2tEaXNwbGF5VGV4dCB9ID0ge30gfSA9IHt9LFxuICAgICAgICAgICAgZnJvbTogeyByb2xlIH0sXG4gICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgfSA9IGFjdGl2aXR5O1xuXG4gICAgICAgICAgY29uc3QgdG9wU2lkZU51YiA9IHJvbGUgPT09ICd1c2VyJyA/IHRvcFNpZGVVc2VyTnViIDogdG9wU2lkZUJvdE51YjtcblxuICAgICAgICAgIGxldCBzaG93Q2FsbG91dDtcblxuICAgICAgICAgIC8vIERlcGVuZGluZyBvbiB0aGUgXCJzaG93QXZhdGFySW5Hcm91cFwiIHNldHRpbmcsIHRoZSBhdmF0YXIgd2lsbCByZW5kZXIgaW4gZGlmZmVyZW50IHBvc2l0aW9ucy5cbiAgICAgICAgICBpZiAoc2hvd0F2YXRhckluR3JvdXAgPT09ICdzZW5kZXInKSB7XG4gICAgICAgICAgICBpZiAodG9wU2lkZU51Yikge1xuICAgICAgICAgICAgICBzaG93Q2FsbG91dCA9IGZpcnN0SW5TZW5kZXJHcm91cCAmJiBmaXJzdEluU2VuZGVyQW5kU3RhdHVzR3JvdXA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzaG93Q2FsbG91dCA9IGxhc3RJblNlbmRlckdyb3VwICYmIGxhc3RJblNlbmRlckFuZFN0YXR1c0dyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoc2hvd0F2YXRhckluR3JvdXAgPT09ICdzdGF0dXMnKSB7XG4gICAgICAgICAgICBpZiAodG9wU2lkZU51Yikge1xuICAgICAgICAgICAgICBzaG93Q2FsbG91dCA9IGZpcnN0SW5TZW5kZXJBbmRTdGF0dXNHcm91cDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNob3dDYWxsb3V0ID0gbGFzdEluU2VuZGVyQW5kU3RhdHVzR3JvdXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNob3dDYWxsb3V0ID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBmb2N1c0FjdGl2aXR5ID0gKCkgPT4ge1xuICAgICAgICAgICAgc2V0Rm9jdXNlZEFjdGl2aXR5S2V5KGdldEFjdGl2aXR5VW5pcXVlSWQoYWN0aXZpdHkpKTtcblxuICAgICAgICAgICAgLy8gSUUxMSBuZWVkIHRvIG1hbnVhbGx5IGZvY3VzIG9uIHRoZSB0cmFuc2NyaXB0LlxuICAgICAgICAgICAgY29uc3QgeyBjdXJyZW50OiByb290RWxlbWVudCB9ID0gcm9vdEVsZW1lbnRSZWY7XG5cbiAgICAgICAgICAgIHJvb3RFbGVtZW50ICYmIHJvb3RFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHJlbmRlcmluZ0VsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgYWN0aXZpdHksXG5cbiAgICAgICAgICAgIC8vIEFmdGVyIHRoZSBlbGVtZW50IGlzIG1vdW50ZWQsIHNldCBpdCB0byBhY3Rpdml0eUVsZW1lbnRzUmVmLlxuICAgICAgICAgICAgY2FsbGJhY2tSZWY6IGFjdGl2aXR5RWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gYWN0aXZpdHlFbGVtZW50c1JlZi5jdXJyZW50LmZpbmQoKHsgYWN0aXZpdHlJRCB9KSA9PiBhY3Rpdml0eUlEID09PSBhY3Rpdml0eS5pZCk7XG5cbiAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgZW50cnkuZWxlbWVudCA9IGFjdGl2aXR5RWxlbWVudDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgcHV0IHRoZSBmb2N1cyBvbiB0aGUgdHJhbnNjcmlwdCBhbmQgdGhlIGFjdGl2aXR5LlxuICAgICAgICAgICAgZm9jdXNBY3Rpdml0eSxcblxuICAgICAgICAgICAgLy8gV2hlbiBhIGNoaWxkIG9mIHRoZSBhY3Rpdml0eSByZWNlaXZlcyBmb2N1cywgbm90aWZ5IHRoZSB0cmFuc2NyaXB0IHRvIHNldCB0aGUgYXJpYS1hY3RpdmVkZXNjZW5kYW50IHRvIHRoaXMgYWN0aXZpdHkuXG4gICAgICAgICAgICBoYW5kbGVGb2N1czogKCkgPT4ge1xuICAgICAgICAgICAgICBzZXRGb2N1c2VkQWN0aXZpdHlLZXkoZ2V0QWN0aXZpdHlVbmlxdWVJZChhY3Rpdml0eSkpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgaGFuZGxlS2V5RG93bjogZXZlbnQgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICBzZXRGb2N1c2VkQWN0aXZpdHlLZXkoZ2V0QWN0aXZpdHlVbmlxdWVJZChhY3Rpdml0eSkpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgeyBjdXJyZW50IH0gPSByb290RWxlbWVudFJlZjtcblxuICAgICAgICAgICAgICAgIGN1cnJlbnQgJiYgY3VycmVudC5mb2N1cygpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBGb3IgYWNjZXNzaWJpbGl0eTogd2hlbiB0aGUgdXNlciBwcmVzcyB1cC9kb3duIGFycm93IGtleXMsIHdlIHB1dCBhIHZpc3VhbCBmb2N1cyBpbmRpY2F0b3IgYXJvdW5kIHRoZSBmb2N1c2VkIGFjdGl2aXR5LlxuICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGRvIHRoZSBzYW1lIGZvciBtb3VzZSwgdGhhdCBpcyB3aHkgd2UgaGF2ZSB0aGUgY2xpY2sgaGFuZGxlciBoZXJlLlxuICAgICAgICAgICAgLy8gV2UgYXJlIGRvaW5nIGl0IGluIGV2ZW50IGNhcHR1cmUgcGhhc2UgdG8gcHJldmVudCBvdGhlciBjb21wb25lbnRzIGZyb20gc3RvcHBpbmcgZXZlbnQgcHJvcGFnYXRpb24gdG8gdXMuXG4gICAgICAgICAgICBoYW5kbGVNb3VzZURvd25DYXB0dXJlOiAoeyB0YXJnZXQgfSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0YWJJbmRleCA9IGdldFRhYkluZGV4KHRhcmdldCk7XG5cbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0YWJJbmRleCAhPT0gJ251bWJlcicgfHwgdGFiSW5kZXggPCAwIHx8IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNBY3Rpdml0eSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBcImhpZGVUaW1lc3RhbXBcIiBpcyBhIHJlbmRlci10aW1lIHBhcmFtZXRlciBmb3IgcmVuZGVyQWN0aXZpdHlTdGF0dXMoKS5cbiAgICAgICAgICAgIC8vIElmIHRydWUsIGl0IHdpbGwgaGlkZSB0aGUgdGltZXN0YW1wLCBidXQgaXQgd2lsbCBjb250aW51ZSB0byBzaG93IHRoZVxuICAgICAgICAgICAgLy8gcmV0cnkgcHJvbXB0LiBBbmQgc2hvdyB0aGUgc2NyZWVuIHJlYWRlciB2ZXJzaW9uIG9mIHRoZSB0aW1lc3RhbXAuXG4gICAgICAgICAgICBoaWRlVGltZXN0YW1wOlxuICAgICAgICAgICAgICBoaWRlQWxsVGltZXN0YW1wcyB8fCBpbmRleFdpdGhpblNlbmRlckFuZFN0YXR1c0dyb3VwICE9PSBhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXJBbmRTdGF0dXMubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgIGtleSxcblxuICAgICAgICAgICAgLy8gV2hlbiBcImxpdmVSZWdpb25LZXlcIiBjaGFuZ2VzLCBpdCB3aWxsIHNob3cgdXAgaW4gdGhlIGxpdmUgcmVnaW9uIG1vbWVudGFyaWx5LlxuICAgICAgICAgICAgbGl2ZVJlZ2lvbktleToga2V5ICsgJ3wnICsgKG1lc3NhZ2VCYWNrRGlzcGxheVRleHQgfHwgdGV4dCksXG4gICAgICAgICAgICByZW5kZXJBY3Rpdml0eSxcbiAgICAgICAgICAgIHJlbmRlckFjdGl2aXR5U3RhdHVzLFxuICAgICAgICAgICAgcmVuZGVyQXZhdGFyLFxuICAgICAgICAgICAgcm9sZSxcblxuICAgICAgICAgICAgLy8gVE9ETzogW1AyXSAjMjg1OCBXZSBzaG91bGQgdXNlIGNvcmUvZGVmaW5pdGlvbnMvc3BlYWtpbmdBY3Rpdml0eSBmb3IgdGhpcyBwcmVkaWNhdGUgaW5zdGVhZFxuICAgICAgICAgICAgc2hvdWxkU3BlYWs6IGFjdGl2aXR5LmNoYW5uZWxEYXRhICYmIGFjdGl2aXR5LmNoYW5uZWxEYXRhLnNwZWFrLFxuICAgICAgICAgICAgc2hvd0NhbGxvdXRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgY3VycmVudDogYWN0aXZpdHlFbGVtZW50cyB9ID0gYWN0aXZpdHlFbGVtZW50c1JlZjtcblxuICAgIC8vIFVwZGF0ZSBhY3Rpdml0eUVsZW1lbnRSZWYgd2l0aCBuZXcgc2V0cyBvZiBhY3Rpdml0eSwgd2hpbGUgcmV0YWluaW5nIHRoZSBleGlzdGluZyByZWZlcmVuY2luZyBlbGVtZW50IGlmIGV4aXN0cy5cbiAgICBhY3Rpdml0eUVsZW1lbnRzUmVmLmN1cnJlbnQgPSByZW5kZXJpbmdFbGVtZW50cy5tYXAoKHsgYWN0aXZpdHksIGFjdGl2aXR5OiB7IGlkIH0sIGVsZW1lbnRJZCwga2V5IH0pID0+IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nRW50cnkgPSBhY3Rpdml0eUVsZW1lbnRzLmZpbmQoZW50cnkgPT4gZW50cnkua2V5ID09PSBrZXkpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhY3Rpdml0eSxcbiAgICAgICAgYWN0aXZpdHlJRDogaWQsXG4gICAgICAgIGFyaWFMYWJlbElEOiBleGlzdGluZ0VudHJ5XG4gICAgICAgICAgPyBleGlzdGluZ0VudHJ5LmFyaWFMYWJlbElEXG4gICAgICAgICAgOiBgd2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHktbGFiZWwtJHtyYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDUpfWAsXG4gICAgICAgIGVsZW1lbnQ6IGV4aXN0aW5nRW50cnkgJiYgZXhpc3RpbmdFbnRyeS5lbGVtZW50LFxuICAgICAgICBlbGVtZW50SWQsXG4gICAgICAgIGtleVxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIFRoZXJlIG11c3QgYmUgb25lIGZvY3VzZWQgKGEuay5hLiBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQpIGRlc2lnbmF0ZWQuIFdlIGRlZmF1bHQgaXQgdG8gdGhlIGxhc3Qgb25lLlxuICAgIGlmICghcmVuZGVyaW5nRWxlbWVudHMuZmluZCgoeyBmb2N1c2VkIH0pID0+IGZvY3VzZWQpKSB7XG4gICAgICBjb25zdCBsYXN0RWxlbWVudCA9IHJlbmRlcmluZ0VsZW1lbnRzW3JlbmRlcmluZ0VsZW1lbnRzLmxlbmd0aCAtIDFdO1xuXG4gICAgICBpZiAobGFzdEVsZW1lbnQpIHtcbiAgICAgICAgbGFzdEVsZW1lbnQuZm9jdXNlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbmRlcmluZ0VsZW1lbnRzO1xuICB9LCBbXG4gICAgYWN0aXZpdGllc1dpdGhSZW5kZXJlcixcbiAgICBhY3Rpdml0eUVsZW1lbnRzUmVmLFxuICAgIGFjdGl2aXR5VHJlZSxcbiAgICBidWJibGVGcm9tVXNlck51Yk9mZnNldCxcbiAgICBidWJibGVOdWJPZmZzZXQsXG4gICAgY3JlYXRlQWN0aXZpdHlTdGF0dXNSZW5kZXJlcixcbiAgICBjcmVhdGVBdmF0YXJSZW5kZXJlcixcbiAgICBoaWRlQWxsVGltZXN0YW1wcyxcbiAgICByb290RWxlbWVudFJlZixcbiAgICBzaG93QXZhdGFySW5Hcm91cFxuICBdKTtcblxuICBjb25zdCByZW5kZXJpbmdBY3Rpdml0aWVzID0gdXNlTWVtbygoKSA9PiByZW5kZXJpbmdFbGVtZW50cy5tYXAoKHsgYWN0aXZpdHkgfSkgPT4gYWN0aXZpdHkpLCBbcmVuZGVyaW5nRWxlbWVudHNdKTtcblxuICBjb25zdCBzY3JvbGxUb0JvdHRvbVNjcm9sbFRvID0gdXNlU2Nyb2xsVG8oKTtcbiAgY29uc3Qgc2Nyb2xsVG9Cb3R0b21TY3JvbGxUb0VuZCA9IHVzZVNjcm9sbFRvRW5kKCk7XG5cbiAgY29uc3Qgc2Nyb2xsVG8gPSB1c2VDYWxsYmFjayhcbiAgICAocG9zaXRpb24sIHsgYmVoYXZpb3IgPSAnYXV0bycgfSA9IHt9KSA9PiB7XG4gICAgICBpZiAoIXBvc2l0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnYm90ZnJhbWV3b3JrLXdlYmNoYXQ6IEZpcnN0IGFyZ3VtZW50IHBhc3NlZCB0byBcInVzZVNjcm9sbFRvXCIgbXVzdCBiZSBhIFNjcm9sbFBvc2l0aW9uIG9iamVjdC4nXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgYWN0aXZpdHlJRCwgc2Nyb2xsVG9wIH0gPSBwb3NpdGlvbjtcblxuICAgICAgaWYgKHR5cGVvZiBzY3JvbGxUb3AgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNjcm9sbFRvQm90dG9tU2Nyb2xsVG8oc2Nyb2xsVG9wLCB7IGJlaGF2aW9yIH0pO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYWN0aXZpdHlJRCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgeyBjdXJyZW50OiByb290RWxlbWVudCB9ID0gcm9vdEVsZW1lbnRSZWY7XG4gICAgICAgIGNvbnN0IHsgZWxlbWVudDogYWN0aXZpdHlFbGVtZW50IH0gPVxuICAgICAgICAgIGFjdGl2aXR5RWxlbWVudHNSZWYuY3VycmVudC5maW5kKGVudHJ5ID0+IGVudHJ5LmFjdGl2aXR5SUQgPT09IGFjdGl2aXR5SUQpIHx8IHt9O1xuXG4gICAgICAgIGNvbnN0IHNjcm9sbGFibGVFbGVtZW50ID0gcm9vdEVsZW1lbnQucXVlcnlTZWxlY3RvcignLndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX3Njcm9sbGFibGUnKTtcblxuICAgICAgICBpZiAoc2Nyb2xsYWJsZUVsZW1lbnQgJiYgYWN0aXZpdHlFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgW3sgaGVpZ2h0OiBhY3Rpdml0eUVsZW1lbnRIZWlnaHQsIHk6IGFjdGl2aXR5RWxlbWVudFkgfV0gPSBhY3Rpdml0eUVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICAgICAgICBjb25zdCBbeyBoZWlnaHQ6IHNjcm9sbGFibGVIZWlnaHQgfV0gPSBzY3JvbGxhYmxlRWxlbWVudC5nZXRDbGllbnRSZWN0cygpO1xuXG4gICAgICAgICAgY29uc3QgYWN0aXZpdHlFbGVtZW50T2Zmc2V0VG9wID0gYWN0aXZpdHlFbGVtZW50WSArIHNjcm9sbGFibGVFbGVtZW50LnNjcm9sbFRvcDtcblxuICAgICAgICAgIGNvbnN0IHNjcm9sbFRvcCA9IE1hdGgubWluKFxuICAgICAgICAgICAgYWN0aXZpdHlFbGVtZW50T2Zmc2V0VG9wLFxuICAgICAgICAgICAgYWN0aXZpdHlFbGVtZW50T2Zmc2V0VG9wIC0gc2Nyb2xsYWJsZUhlaWdodCArIGFjdGl2aXR5RWxlbWVudEhlaWdodFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBzY3JvbGxUb0JvdHRvbVNjcm9sbFRvKHNjcm9sbFRvcCwgeyBiZWhhdmlvciB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW2FjdGl2aXR5RWxlbWVudHNSZWYsIHJvb3RFbGVtZW50UmVmLCBzY3JvbGxUb0JvdHRvbVNjcm9sbFRvXVxuICApO1xuXG4gIGNvbnN0IHNjcm9sbFJlbGF0aXZlID0gdXNlQ2FsbGJhY2soXG4gICAgKGRpcmVjdGlvbiwgeyBkaXNwbGFjZW1lbnQgfSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB7IGN1cnJlbnQ6IHJvb3RFbGVtZW50IH0gPSByb290RWxlbWVudFJlZjtcblxuICAgICAgaWYgKCFyb290RWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNjcm9sbGFibGUgPSByb290RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcud2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fc2Nyb2xsYWJsZScpO1xuICAgICAgbGV0IG5leHRTY3JvbGxUb3A7XG5cbiAgICAgIGlmICh0eXBlb2YgZGlzcGxhY2VtZW50ID09PSAnbnVtYmVyJykge1xuICAgICAgICBuZXh0U2Nyb2xsVG9wID0gc2Nyb2xsYWJsZS5zY3JvbGxUb3AgKyAoZGlyZWN0aW9uID09PSAnZG93bicgPyAxIDogLTEpICogZGlzcGxhY2VtZW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dFNjcm9sbFRvcCA9IHNjcm9sbGFibGUuc2Nyb2xsVG9wICsgKGRpcmVjdGlvbiA9PT0gJ2Rvd24nID8gMSA6IC0xKSAqIHNjcm9sbGFibGUub2Zmc2V0SGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICBzY3JvbGxUbyhcbiAgICAgICAge1xuICAgICAgICAgIHNjcm9sbFRvcDogTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Nyb2xsYWJsZS5zY3JvbGxIZWlnaHQgLSBzY3JvbGxhYmxlLm9mZnNldEhlaWdodCwgbmV4dFNjcm9sbFRvcCkpXG4gICAgICAgIH0sXG4gICAgICAgIHsgYmVoYXZpb3I6ICdzbW9vdGgnIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICBbcm9vdEVsZW1lbnRSZWYsIHNjcm9sbFRvXVxuICApO1xuXG4gIC8vIFNpbmNlIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGluc3RhbmNlcyBvZiA8QmFzaWNUcmFuc2NyaXB0PiBpbnNpZGUgdGhlIDxDb21wb3Nlcj4sIHdoZW4gdGhlIGRldmVsb3BlciBjYWxscyBgc2Nyb2xsWFhYYCwgd2UgbmVlZCB0byBjYWxsIGl0IG9uIGFsbCBpbnN0YW5jZXMuXG4gIC8vIFdlIGNhbGwgYHVzZVJlZ2lzdGVyU2Nyb2xsWFhYYCB0byByZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uLCB0aGUgYHVzZVNjcm9sbFhYWGAgd2lsbCBtdWx0aXBsZXggdGhlIGNhbGwgaW50byBlYWNoIGluc3RhbmNlIG9mIDxCYXNpY1RyYW5zY3JpcHQ+LlxuICB1c2VSZWdpc3RlclNjcm9sbFRvKHNjcm9sbFRvKTtcbiAgdXNlUmVnaXN0ZXJTY3JvbGxUb0VuZChzY3JvbGxUb0JvdHRvbVNjcm9sbFRvRW5kKTtcbiAgdXNlUmVnaXN0ZXJTY3JvbGxSZWxhdGl2ZShzY3JvbGxSZWxhdGl2ZSk7XG5cbiAgY29uc3QgZGlzcGF0Y2hTY3JvbGxQb3NpdGlvbiA9IHVzZURpc3BhdGNoU2Nyb2xsUG9zaXRpb24oKTtcbiAgY29uc3QgcGF0Y2hlZERpc3BhdGNoU2Nyb2xsUG9zaXRpb24gPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIWRpc3BhdGNoU2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gKHsgc2Nyb2xsVG9wIH0pID0+IHtcbiAgICAgIGNvbnN0IHsgY3VycmVudDogcm9vdEVsZW1lbnQgfSA9IHJvb3RFbGVtZW50UmVmO1xuXG4gICAgICBpZiAoIXJvb3RFbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2Nyb2xsYWJsZUVsZW1lbnQgPSByb290RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcud2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fc2Nyb2xsYWJsZScpO1xuXG4gICAgICBjb25zdCBbeyBoZWlnaHQ6IG9mZnNldEhlaWdodCB9ID0ge31dID0gc2Nyb2xsYWJsZUVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKTtcblxuICAgICAgLy8gRmluZCB0aGUgYWN0aXZpdHkganVzdCBhYm92ZSBzY3JvbGwgdmlldyBib3R0b20uXG4gICAgICAvLyBJZiB0aGUgc2Nyb2xsIHZpZXcgaXMgYWxyZWFkeSBvbiB0b3AsIGdldCB0aGUgZmlyc3QgYWN0aXZpdHkuXG4gICAgICBjb25zdCBlbnRyeSA9IHNjcm9sbGFibGVFbGVtZW50LnNjcm9sbFRvcFxuICAgICAgICA/IFsuLi5hY3Rpdml0eUVsZW1lbnRzUmVmLmN1cnJlbnRdLnJldmVyc2UoKS5maW5kKCh7IGVsZW1lbnQgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgW3sgeSB9ID0ge31dID0gZWxlbWVudC5nZXRDbGllbnRSZWN0cygpO1xuXG4gICAgICAgICAgICByZXR1cm4geSA8IG9mZnNldEhlaWdodDtcbiAgICAgICAgICB9KVxuICAgICAgICA6IGFjdGl2aXR5RWxlbWVudHNSZWYuY3VycmVudFswXTtcblxuICAgICAgY29uc3QgeyBhY3Rpdml0eUlEIH0gPSBlbnRyeSB8fCB7fTtcblxuICAgICAgZGlzcGF0Y2hTY3JvbGxQb3NpdGlvbih7IC4uLihhY3Rpdml0eUlEID8geyBhY3Rpdml0eUlEIH0gOiB7fSksIHNjcm9sbFRvcCB9KTtcbiAgICB9O1xuICB9LCBbYWN0aXZpdHlFbGVtZW50c1JlZiwgZGlzcGF0Y2hTY3JvbGxQb3NpdGlvbiwgcm9vdEVsZW1lbnRSZWZdKTtcblxuICB1c2VPYnNlcnZlU2Nyb2xsUG9zaXRpb24ocGF0Y2hlZERpc3BhdGNoU2Nyb2xsUG9zaXRpb24pO1xuXG4gIGNvbnN0IFtsYXN0SW50ZXJhY3RlZEFjdGl2aXR5XSA9IHVzZUFja25vd2xlZGdlZEFjdGl2aXR5KCk7XG5cbiAgY29uc3QgaW5kZXhPZkxhc3RJbnRlcmFjdGVkQWN0aXZpdHkgPSBhY3Rpdml0aWVzLmluZGV4T2YobGFzdEludGVyYWN0ZWRBY3Rpdml0eSk7XG5cbiAgLy8gQ3JlYXRlIGEgbmV3IElEIGZvciBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQgZXZlcnkgdGltZSB0aGUgYWN0aXZlIGRlc2NlbmRhbnQgY2hhbmdlLlxuICAvLyBJbiBvdXIgZGVzaWduLCB0aGUgdHJhbnNjcmlwdCB3aWxsIG9ubHkgaGF2ZSAxIGZvY3VzZWQgYWN0aXZpdHkgYW5kIGl0IGhhcyBhbiBJRC4gT3RoZXIgYmx1cnJlZCBhY3Rpdml0aWVzIHdpbGwgbm90IGhhdmUgSUQgYXNzaWduZWQuXG4gIC8vIFRoaXMgaGVscCB3aXRoIHBlcmZvcm1hbmNlLlxuICAvLyBCdXQgYnJvd3NlciB1c3VhbGx5IGRvIG5vb3AgaWYgdGhlIHZhbHVlIG9mIGFyaWEtYWN0aXZlZGVzY2VuZGFudCBkb2Vzbid0IGNoYW5nZS5cbiAgLy8gVGhhdCBtZWFucywgaWYgd2UgYXNzaWduIHRoZSBzYW1lIElEIHRvIGFub3RoZXIgZWxlbWVudCwgYnJvd3NlciB3aWxsIGRvIG5vb3AuXG4gIC8vIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBuZXcgSUQgc28gdGhlIGJyb3dzZXIgc2VlIHRoZXJlIGlzIGEgY2hhbmdlIGluIGFyaWEtYWN0aXZlZGVzY2VuZGFudCB2YWx1ZSBhbmQgcGVyZm9ybSBhY2NvcmRpbmdseS5cbiAgY29uc3QgYWN0aXZlRGVzY2VuZGFudEVsZW1lbnRJZCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gZm9jdXNlZEFjdGl2aXR5S2V5ICYmIGB3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19hY3RpdmUtZGVzY2VuZGFudC0ke3JhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgNSl9YCxcbiAgICBbZm9jdXNlZEFjdGl2aXR5S2V5XVxuICApO1xuXG4gIGNvbnN0IHNjcm9sbEFjdGl2ZURlc2NlbmRhbnRJbnRvVmlldyA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBhY3RpdmVEZXNjZW5kYW50ID0gYWN0aXZlRGVzY2VuZGFudEVsZW1lbnRJZCAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhY3RpdmVEZXNjZW5kYW50RWxlbWVudElkKTtcblxuICAgIC8vIERvbid0IHNjcm9sbCBhY3RpdmUgZGVzY2VuZGFudCBpbnRvIHZpZXcgaWYgdGhlIGZvY3VzIGlzIGFscmVhZHkgaW5zaWRlIGl0LlxuICAgIC8vIE90aGVyd2lzZSwgZ2l2ZW4gdGhlIGZvY3VzIGlzIG9uIHRoZSBzZW5kIGJveCwgY2xpY2tpbmcgb24gYW55IDxpbnB1dD4gaW5zaWRlIHRoZSBBZGFwdGl2ZSBDYXJkcyBtYXkgY2F1c2UgdGhlIHZpZXcgdG8gbW92ZS5cbiAgICAvLyBUaGlzIFVYIGlzIG5vdCBkZXNpcmFibGUgYmVjYXVzZSBjbGljayBzaG91bGQgbm90IGNhdXNlIHNjcm9sbC5cbiAgICBpZiAoYWN0aXZlRGVzY2VuZGFudCAmJiAhYWN0aXZlRGVzY2VuZGFudC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgLy8gQ2hlY2tzIGlmIHNjcm9sbEludG9WaWV3IHN1cHBvcnQgb3B0aW9ucyBvciBub3QuXG4gICAgICAvLyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb2Rlcm5penIvTW9kZXJuaXpyL2lzc3Vlcy8xNTY4I2lzc3VlY29tbWVudC00MTk0NTc5NzJcbiAgICAgIC8vIC0gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDY5MTk2MjcvaXMtaXQtcG9zc2libGUtdG8tdGVzdC1mb3Itc2Nyb2xsaW50b3ZpZXctYnJvd3Nlci1jb21wYXRpYmlsaXR5XG4gICAgICBpZiAoJ3Njcm9sbEJlaGF2aW9yJyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUpIHtcbiAgICAgICAgYWN0aXZlRGVzY2VuZGFudC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGlzIGlzIGZvciBicm93c2VyIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBvcHRpb25zIHBhc3NlZCB0byBzY3JvbGxJbnRvVmlldygpLCBwb3NzaWJseSBJRTExLlxuICAgICAgICBjb25zdCBzY3JvbGxhYmxlRWxlbWVudCA9IHJvb3RFbGVtZW50UmVmLmN1cnJlbnQucXVlcnlTZWxlY3RvcignLndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX3Njcm9sbGFibGUnKTtcbiAgICAgICAgY29uc3Qgc2Nyb2xsVG9wQXRUb3BTaWRlID0gYWN0aXZlRGVzY2VuZGFudC5vZmZzZXRUb3A7XG4gICAgICAgIGNvbnN0IHNjcm9sbFRvcEF0Qm90dG9tU2lkZSA9IGFjdGl2ZURlc2NlbmRhbnQub2Zmc2V0VG9wICsgYWN0aXZlRGVzY2VuZGFudC5vZmZzZXRIZWlnaHQ7XG5cbiAgICAgICAgaWYgKHNjcm9sbFRvcEF0VG9wU2lkZSA8IHNjcm9sbGFibGVFbGVtZW50LnNjcm9sbFRvcCkge1xuICAgICAgICAgIHNjcm9sbGFibGVFbGVtZW50LnNjcm9sbFRvcCA9IHNjcm9sbFRvcEF0VG9wU2lkZTtcbiAgICAgICAgfSBlbHNlIGlmIChzY3JvbGxUb3BBdEJvdHRvbVNpZGUgPiBzY3JvbGxhYmxlRWxlbWVudC5zY3JvbGxUb3AgKyBzY3JvbGxhYmxlRWxlbWVudC5vZmZzZXRIZWlnaHQpIHtcbiAgICAgICAgICBzY3JvbGxhYmxlRWxlbWVudC5zY3JvbGxUb3AgPSBzY3JvbGxUb3BBdEJvdHRvbVNpZGUgLSBzY3JvbGxhYmxlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIFthY3RpdmVEZXNjZW5kYW50RWxlbWVudElkLCByb290RWxlbWVudFJlZl0pO1xuXG4gIGNvbnN0IGhhbmRsZVRyYW5zY3JpcHRGb2N1cyA9IHVzZUNhbGxiYWNrKFxuICAgIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHsgY3VycmVudFRhcmdldCwgdGFyZ2V0IH0gPSBldmVudDtcblxuICAgICAgLy8gV2hlbiBmb2N1cyBpcyBwbGFjZWQgb24gdGhlIHRyYW5zY3JpcHQsIHNjcm9sbCBhY3RpdmUgZGVzY2VuZGFudCBpbnRvIHRoZSB2aWV3LlxuICAgICAgY3VycmVudFRhcmdldCA9PT0gdGFyZ2V0ICYmIHNjcm9sbEFjdGl2ZURlc2NlbmRhbnRJbnRvVmlldygpO1xuICAgIH0sXG4gICAgW3Njcm9sbEFjdGl2ZURlc2NlbmRhbnRJbnRvVmlld11cbiAgKTtcblxuICAvLyBBZnRlciBuZXcgYXJpYS1hY3RpdmVkZXNjZW5kYW50IGlzIGFzc2lnbmVkLCB3ZSB3aWxsIG5lZWQgdG8gc2Nyb2xsIGl0IGludG8gdmlldy5cbiAgLy8gVXNlciBhZ2VudCB3aWxsIHNjcm9sbCBhdXRvbWF0aWNhbGx5IGZvciBmb2N1c2luZyBlbGVtZW50LCBidXQgbm90IGZvciBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQuXG4gIC8vIFdlIG5lZWQgdG8gZG8gdGhlIHNjcm9sbGluZyBtYW51YWxseS5cbiAgdXNlRWZmZWN0KCgpID0+IHNjcm9sbEFjdGl2ZURlc2NlbmRhbnRJbnRvVmlldygpLCBbc2Nyb2xsQWN0aXZlRGVzY2VuZGFudEludG9WaWV3XSk7XG5cbiAgLy8gSWYgYW55IGFjdGl2aXRpZXMgaGFzIGNoYW5nZWQsIHJlc2V0IHRoZSBhY3RpdmUgZGVzY2VuZGFudC5cbiAgdXNlRWZmZWN0KCgpID0+IHNldEZvY3VzZWRBY3Rpdml0eUtleSh1bmRlZmluZWQpLCBbYWN0aXZpdGllcywgc2V0Rm9jdXNlZEFjdGl2aXR5S2V5XSk7XG5cbiAgY29uc3QgZm9jdXNSZWxhdGl2ZUFjdGl2aXR5ID0gdXNlQ2FsbGJhY2soXG4gICAgZGVsdGEgPT4ge1xuICAgICAgaWYgKGlzTmFOKGRlbHRhKSB8fCAhcmVuZGVyaW5nRWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzZXRGb2N1c2VkQWN0aXZpdHlLZXkodW5kZWZpbmVkKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW5kZXggPSByZW5kZXJpbmdFbGVtZW50cy5maW5kSW5kZXgoKHsga2V5IH0pID0+IGtleSA9PT0gZm9jdXNlZEFjdGl2aXR5S2V5KTtcbiAgICAgIGNvbnN0IG5leHRJbmRleCA9IH5pbmRleFxuICAgICAgICA/IE1hdGgubWF4KDAsIE1hdGgubWluKHJlbmRlcmluZ0VsZW1lbnRzLmxlbmd0aCAtIDEsIGluZGV4ICsgZGVsdGEpKVxuICAgICAgICA6IHJlbmRlcmluZ0VsZW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgICBjb25zdCBuZXh0Rm9jdXNlZEFjdGl2aXR5ID0gcmVuZGVyaW5nRWxlbWVudHNbbmV4dEluZGV4XTtcblxuICAgICAgc2V0Rm9jdXNlZEFjdGl2aXR5S2V5KG5leHRGb2N1c2VkQWN0aXZpdHkua2V5KTtcbiAgICAgIHJvb3RFbGVtZW50UmVmLmN1cnJlbnQgJiYgcm9vdEVsZW1lbnRSZWYuY3VycmVudC5mb2N1cygpO1xuICAgIH0sXG4gICAgW2ZvY3VzZWRBY3Rpdml0eUtleSwgcmVuZGVyaW5nRWxlbWVudHMsIHJvb3RFbGVtZW50UmVmLCBzZXRGb2N1c2VkQWN0aXZpdHlLZXldXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlVHJhbnNjcmlwdEtleURvd24gPSB1c2VDYWxsYmFjayhcbiAgICBldmVudCA9PiB7XG4gICAgICBjb25zdCB7IHRhcmdldCB9ID0gZXZlbnQ7XG5cbiAgICAgIGNvbnN0IGZyb21FbmRPZlRyYW5zY3JpcHRJbmRpY2F0b3IgPSB0YXJnZXQgPT09IHRlcm1pbmF0b3JSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IGZyb21UcmFuc2NyaXB0ID0gdGFyZ2V0ID09PSBldmVudC5jdXJyZW50VGFyZ2V0O1xuXG4gICAgICBpZiAoIWZyb21FbmRPZlRyYW5zY3JpcHRJbmRpY2F0b3IgJiYgIWZyb21UcmFuc2NyaXB0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGhhbmRsZWQgPSB0cnVlO1xuXG4gICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICAgIGZvY3VzUmVsYXRpdmVBY3Rpdml0eShmcm9tRW5kT2ZUcmFuc2NyaXB0SW5kaWNhdG9yID8gMCA6IDEpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgIGZvY3VzUmVsYXRpdmVBY3Rpdml0eShmcm9tRW5kT2ZUcmFuc2NyaXB0SW5kaWNhdG9yID8gMCA6IC0xKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdFbmQnOlxuICAgICAgICAgIGZvY3VzUmVsYXRpdmVBY3Rpdml0eShJbmZpbml0eSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICAgIGlmICghZnJvbUVuZE9mVHJhbnNjcmlwdEluZGljYXRvcikge1xuICAgICAgICAgICAgY29uc3QgZm9jdXNlZEFjdGl2aXR5RW50cnkgPSByZW5kZXJpbmdFbGVtZW50cy5maW5kKCh7IGtleSB9KSA9PiBrZXkgPT09IGZvY3VzZWRBY3Rpdml0eUtleSk7XG5cbiAgICAgICAgICAgIGlmIChmb2N1c2VkQWN0aXZpdHlFbnRyeSkge1xuICAgICAgICAgICAgICBjb25zdCB7IGVsZW1lbnQ6IGZvY3VzZWRBY3Rpdml0eUVsZW1lbnQgfSA9XG4gICAgICAgICAgICAgICAgYWN0aXZpdHlFbGVtZW50c1JlZi5jdXJyZW50LmZpbmQoKHsgYWN0aXZpdHkgfSkgPT4gYWN0aXZpdHkgPT09IGZvY3VzZWRBY3Rpdml0eUVudHJ5LmFjdGl2aXR5KSB8fCB7fTtcblxuICAgICAgICAgICAgICBpZiAoZm9jdXNlZEFjdGl2aXR5RWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtmaXJzdFRhYmJhYmxlRWxlbWVudF0gPSB0YWJiYWJsZUVsZW1lbnRzKGZvY3VzZWRBY3Rpdml0eUVsZW1lbnQpLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICh7IGNsYXNzTmFtZSB9KSA9PiBjbGFzc05hbWUgIT09ICd3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19hY3Rpdml0eS1zZW50aW5lbCdcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgZmlyc3RUYWJiYWJsZUVsZW1lbnQgJiYgZmlyc3RUYWJiYWJsZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgICAgZm9jdXMoJ3NlbmRCb3hXaXRob3V0S2V5Ym9hcmQnKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdIb21lJzpcbiAgICAgICAgICBmb2N1c1JlbGF0aXZlQWN0aXZpdHkoLUluZmluaXR5KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGhhbmRsZWQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKGhhbmRsZWQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAvLyBJZiBhIGN1c3RvbSBIVE1MIGNvbnRyb2wgd2FudHMgdG8gaGFuZGxlIHVwL2Rvd24gYXJyb3csIHdlIHdpbGwgcHJldmVudCB0aGVtIGZyb20gbGlzdGVuaW5nIHRvIHRoaXMgZXZlbnQgdG8gcHJldmVudCBidWdzIGR1ZSB0byBoYW5kbGluZyBhcnJvdyBrZXlzIHR3aWNlLlxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtmb2N1c2VkQWN0aXZpdHlLZXksIGFjdGl2aXR5RWxlbWVudHNSZWYsIGZvY3VzUmVsYXRpdmVBY3Rpdml0eSwgZm9jdXMsIHRlcm1pbmF0b3JSZWYsIHJlbmRlcmluZ0VsZW1lbnRzXVxuICApO1xuXG4gIGNvbnN0IGxhYmVsSWQgPSB1c2VVbmlxdWVJZCgnd2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fbGFiZWwnKTtcblxuICAvLyBJZiBTSElGVC1UQUIgZnJvbSBcIkVuZCBvZiB0cmFuc2NyaXB0XCIgaW5kaWNhdG9yLCBpZiBmb2N1c2VkQWN0aXZpdHlLZXkgaXMgbm90IHNldCAob3Igbm8gbG9uZ2VyIGV4aXN0cyksIHNldCBpdCB0aGUgdGhlIGJvdHRvbW1vc3QgYWN0aXZpdHkuXG4gIGNvbnN0IHNldEJvdHRvbW1vc3RGb2N1c2VkQWN0aXZpdHlLZXlJZk5lZWRlZCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoIX5yZW5kZXJpbmdFbGVtZW50cy5maW5kSW5kZXgoKHsga2V5IH0pID0+IGtleSA9PT0gZm9jdXNlZEFjdGl2aXR5S2V5KSkge1xuICAgICAgY29uc3QgeyBrZXk6IGxhc3RBY3Rpdml0eUtleSB9ID0gcmVuZGVyaW5nRWxlbWVudHNbcmVuZGVyaW5nRWxlbWVudHMubGVuZ3RoIC0gMV0gfHwge307XG5cbiAgICAgIHNldEZvY3VzZWRBY3Rpdml0eUtleShsYXN0QWN0aXZpdHlLZXkpO1xuICAgIH1cbiAgfSwgW2ZvY3VzZWRBY3Rpdml0eUtleSwgcmVuZGVyaW5nRWxlbWVudHMsIHNldEZvY3VzZWRBY3Rpdml0eUtleV0pO1xuXG4gIGNvbnN0IGhhbmRsZVRyYW5zY3JpcHRLZXlEb3duQ2FwdHVyZSA9IHVzZUNhbGxiYWNrKFxuICAgIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHsgYWx0S2V5LCBjdHJsS2V5LCBrZXksIG1ldGFLZXksIHRhcmdldCB9ID0gZXZlbnQ7XG5cbiAgICAgIGlmIChhbHRLZXkgfHwgKGN0cmxLZXkgJiYga2V5ICE9PSAndicpIHx8IG1ldGFLZXkgfHwgKCFpbnB1dHRhYmxlS2V5KGtleSkgJiYga2V5ICE9PSAnQmFja3NwYWNlJykpIHtcbiAgICAgICAgLy8gSWdub3JlIGlmIG9uZSBvZiB0aGUgdXRpbGl0eSBrZXkgKGV4Y2VwdCBTSElGVCkgaXMgcHJlc3NlZFxuICAgICAgICAvLyBFLmcuIENUUkwtQyBvbiBhIGxpbmsgaW4gb25lIG9mIHRoZSBtZXNzYWdlIHNob3VsZCBub3QganVtcCB0byBjaGF0IGJveFxuICAgICAgICAvLyBFLmcuIFwiQVwiIG9yIFwiQmFja3NwYWNlXCIgc2hvdWxkIGp1bXAgdG8gY2hhdCBib3hcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTZW5kIGtleXN0cm9rZXMgdG8gc2VuZCBib3ggaWYgd2UgYXJlIGZvY3VzaW5nIG9uIHRoZSB0cmFuc2NyaXB0IG9yIHRlcm1pbmF0b3IuXG4gICAgICBpZiAodGFyZ2V0ID09PSBldmVudC5jdXJyZW50VGFyZ2V0IHx8IHRhcmdldCA9PT0gdGVybWluYXRvclJlZi5jdXJyZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGZvY3VzKCdzZW5kQm94Jyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbZm9jdXNdXG4gICk7XG5cbiAgY29uc3QgZm9jdXNUcmFuc2NyaXB0Q2FsbGJhY2sgPSB1c2VDYWxsYmFjaygoKSA9PiByb290RWxlbWVudFJlZi5jdXJyZW50ICYmIHJvb3RFbGVtZW50UmVmLmN1cnJlbnQuZm9jdXMoKSwgW1xuICAgIHJvb3RFbGVtZW50UmVmXG4gIF0pO1xuXG4gIHVzZVJlZ2lzdGVyRm9jdXNUcmFuc2NyaXB0KGZvY3VzVHJhbnNjcmlwdENhbGxiYWNrKTtcblxuICBjb25zdCBoYW5kbGVGb2N1c0FjdGl2aXR5ID0gdXNlQ2FsbGJhY2soXG4gICAga2V5ID0+IHtcbiAgICAgIHNldEZvY3VzZWRBY3Rpdml0eUtleShrZXkpO1xuICAgICAgcm9vdEVsZW1lbnRSZWYuY3VycmVudCAmJiByb290RWxlbWVudFJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgfSxcbiAgICBbc2V0Rm9jdXNlZEFjdGl2aXR5S2V5XVxuICApO1xuXG4gIC8vIFdoZW4gdGhlIGZvY3VzaW5nIGFjdGl2aXR5IGhhcyBjaGFuZ2VkLCBkaXNwYXRjaCBhbiBldmVudCB0byBvYnNlcnZlcnMgb2YgXCJ1c2VPYnNlcnZlVHJhbnNjcmlwdEZvY3VzXCIuXG4gIGNvbnN0IGRpc3BhdGNoVHJhbnNjcmlwdEZvY3VzID0gdXNlRGlzcGF0Y2hUcmFuc2NyaXB0Rm9jdXMoKTtcbiAgY29uc3QgZm9jdXNlZEFjdGl2aXR5ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgeyBhY3Rpdml0eSB9ID0gcmVuZGVyaW5nRWxlbWVudHMuZmluZCgoeyBrZXkgfSkgPT4ga2V5ID09PSBmb2N1c2VkQWN0aXZpdHlLZXkpIHx8IHt9O1xuXG4gICAgcmV0dXJuIGFjdGl2aXR5O1xuICB9LCBbZm9jdXNlZEFjdGl2aXR5S2V5LCByZW5kZXJpbmdFbGVtZW50c10pO1xuXG4gIHVzZU1lbW8oKCkgPT4gZGlzcGF0Y2hUcmFuc2NyaXB0Rm9jdXMgJiYgZGlzcGF0Y2hUcmFuc2NyaXB0Rm9jdXMoeyBhY3Rpdml0eTogZm9jdXNlZEFjdGl2aXR5IH0pLCBbXG4gICAgZGlzcGF0Y2hUcmFuc2NyaXB0Rm9jdXMsXG4gICAgZm9jdXNlZEFjdGl2aXR5XG4gIF0pO1xuXG4gIC8vIFRoaXMgaXMgcmVxdWlyZWQgYnkgSUUxMS5cbiAgLy8gV2hlbiB0aGUgdXNlciBjbGlja3Mgb24gYW5kIGVtcHR5IHNwYWNlIChhLmsuYS4gZmlsbGVyKSBpbiBhbiBlbXB0eSB0cmFuc2NyaXB0LCBJRTExIHNheXMgdGhlIGZvY3VzIGlzIG9uIHRoZSA8ZGl2IGNsYXNzTmFtZT1cImZpbGxlclwiPixcbiAgLy8gZGVzcGl0ZSB0aGUgZmFjdCB0aGVyZSBhcmUgbm8gXCJ0YWJJbmRleFwiIGF0dHJpYnV0ZXMgc2V0IG9uIHRoZSBmaWxsZXIuXG4gIC8vIFdlIG5lZWQgdG8gYXJ0aWZpY2lhbGx5IHNlbmQgdGhlIGZvY3VzIGJhY2sgdG8gdGhlIHRyYW5zY3JpcHQuXG4gIGNvbnN0IGhhbmRsZUZvY3VzRmlsbGVyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IHsgY3VycmVudCB9ID0gcm9vdEVsZW1lbnRSZWY7XG5cbiAgICBjdXJyZW50ICYmIGN1cnJlbnQuZm9jdXMoKTtcbiAgfSwgW3Jvb3RFbGVtZW50UmVmXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQ9e2ZvY3VzZWRBY3Rpdml0eUtleSA/IGFjdGl2ZURlc2NlbmRhbnRFbGVtZW50SWQgOiB1bmRlZmluZWR9XG4gICAgICBhcmlhLWxhYmVsbGVkYnk9e2xhYmVsSWR9XG4gICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoXG4gICAgICAgICd3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0JyxcbiAgICAgICAgYmFzaWNUcmFuc2NyaXB0U3R5bGVTZXQgKyAnJyxcbiAgICAgICAgcm9vdENsYXNzTmFtZSxcbiAgICAgICAgKGNsYXNzTmFtZSB8fCAnJykgKyAnJ1xuICAgICAgKX1cbiAgICAgIGRpcj17ZGlyZWN0aW9ufVxuICAgICAgb25Gb2N1cz17aGFuZGxlVHJhbnNjcmlwdEZvY3VzfVxuICAgICAgb25LZXlEb3duPXtoYW5kbGVUcmFuc2NyaXB0S2V5RG93bn1cbiAgICAgIG9uS2V5RG93bkNhcHR1cmU9e2hhbmRsZVRyYW5zY3JpcHRLZXlEb3duQ2FwdHVyZX1cbiAgICAgIHJlZj17cm9vdEVsZW1lbnRSZWZ9XG4gICAgICAvLyBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiIHdpbGwgb25seSB3b3JrcyB3aXRoIGEgbnVtYmVyIG9mIHJvbGVzIGFuZCBpdCBtdXN0IGJlIGV4cGxpY2l0bHkgc2V0LlxuICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLyNhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcbiAgICAgIHJvbGU9XCJncm91cFwiXG4gICAgICAvLyBGb3IgdXAvZG93biBhcnJvdyBrZXkgbmF2aWdhdGlvbiBhY3Jvc3MgYWN0aXZpdGllcywgdGhpcyBjb21wb25lbnQgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgdGFiIHNlcXVlbmNlLlxuICAgICAgLy8gT3RoZXJ3aXNlLCBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiIHdpbGwgbm90IGJlIG5hcnJhdGVkIHdoZW4gdGhlIHVzZXIgcHJlc3MgdXAvZG93biBhcnJvdyBrZXlzLlxuICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLXByYWN0aWNlcy0xLjEvI2tiZF9mb2N1c19hY3RpdmVkZXNjZW5kYW50XG4gICAgICB0YWJJbmRleD17MH1cbiAgICA+XG4gICAgICA8U2NyZWVuUmVhZGVyVGV4dCBpZD17bGFiZWxJZH0gdGV4dD17dHJhbnNjcmlwdEFyaWFMYWJlbH0gLz5cbiAgICAgIHsvKiBUaGlzIDxzZWN0aW9uPiBpcyBmb3IgbGl2ZSByZWdpb24gb25seS4gQ29udGVudCBpcyBtYWRlIGludmlzaWJsZSB0aHJvdWdoIENTUy4gKi99XG4gICAgICA8c2VjdGlvblxuICAgICAgICBhcmlhLWF0b21pYz17ZmFsc2V9XG4gICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgIGFyaWEtcmVsZXZhbnQ9XCJhZGRpdGlvbnNcIlxuICAgICAgICBhcmlhLXJvbGVkZXNjcmlwdGlvbj17dHJhbnNjcmlwdFJvbGVEZXNjcmlwdGlvbn1cbiAgICAgICAgcm9sZT1cImxvZ1wiXG4gICAgICA+XG4gICAgICAgIHtyZW5kZXJpbmdFbGVtZW50cy5tYXAoKHsgYWN0aXZpdHksIGxpdmVSZWdpb25LZXkgfSkgPT4gKFxuICAgICAgICAgIDxGYWRlIGZhZGVBZnRlcj17aW50ZXJuYWxMaXZlUmVnaW9uRmFkZUFmdGVyfSBrZXk9e2xpdmVSZWdpb25LZXl9PlxuICAgICAgICAgICAgeygpID0+IDxTY3JlZW5SZWFkZXJBY3Rpdml0eSBhY3Rpdml0eT17YWN0aXZpdHl9IC8+fVxuICAgICAgICAgIDwvRmFkZT5cbiAgICAgICAgKSl9XG4gICAgICA8L3NlY3Rpb24+XG4gICAgICB7LyogVE9ETzogW1AyXSBGaXggRVNMaW50IGVycm9yIGBuby11c2UtYmVmb3JlLWRlZmluZWAgKi99XG4gICAgICB7LyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2UtYmVmb3JlLWRlZmluZSAqL31cbiAgICAgIDxJbnRlcm5hbFRyYW5zY3JpcHRTY3JvbGxhYmxlXG4gICAgICAgIGFjdGl2aXRpZXM9e3JlbmRlcmluZ0FjdGl2aXRpZXN9XG4gICAgICAgIG9uRm9jdXNBY3Rpdml0eT17aGFuZGxlRm9jdXNBY3Rpdml0eX1cbiAgICAgICAgb25Gb2N1c0ZpbGxlcj17aGFuZGxlRm9jdXNGaWxsZXJ9XG4gICAgICAgIHRlcm1pbmF0b3JSZWY9e3Rlcm1pbmF0b3JSZWZ9XG4gICAgICA+XG4gICAgICAgIHtyZW5kZXJpbmdFbGVtZW50cy5tYXAoXG4gICAgICAgICAgKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhY3Rpdml0eSxcbiAgICAgICAgICAgICAgY2FsbGJhY2tSZWYsXG4gICAgICAgICAgICAgIGZvY3VzQWN0aXZpdHksXG4gICAgICAgICAgICAgIGhhbmRsZUZvY3VzLFxuICAgICAgICAgICAgICBoYW5kbGVLZXlEb3duLFxuICAgICAgICAgICAgICBoYW5kbGVNb3VzZURvd25DYXB0dXJlLFxuICAgICAgICAgICAgICBoaWRlVGltZXN0YW1wLFxuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIHJlbmRlckFjdGl2aXR5LFxuICAgICAgICAgICAgICByZW5kZXJBY3Rpdml0eVN0YXR1cyxcbiAgICAgICAgICAgICAgcmVuZGVyQXZhdGFyLFxuICAgICAgICAgICAgICByb2xlLFxuICAgICAgICAgICAgICBzaG91bGRTcGVhayxcbiAgICAgICAgICAgICAgc2hvd0NhbGxvdXRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbmRleFxuICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBhcmlhTGFiZWxJRCwgZWxlbWVudCB9ID1cbiAgICAgICAgICAgICAgYWN0aXZpdHlFbGVtZW50c1JlZi5jdXJyZW50LmZpbmQoZW50cnkgPT4gZW50cnkuYWN0aXZpdHkgPT09IGFjdGl2aXR5KSB8fCB7fTtcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZURlc2NlbmRhbnQgPSBmb2N1c2VkQWN0aXZpdHlLZXkgPT09IGtleTtcbiAgICAgICAgICAgIGNvbnN0IGlzQ29udGVudEludGVyYWN0aXZlID0gISEoZWxlbWVudFxuICAgICAgICAgICAgICA/IHRhYmJhYmxlRWxlbWVudHMoZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcud2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHktYm94JykpLmxlbmd0aFxuICAgICAgICAgICAgICA6IDApO1xuXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsbGVkYnk9e2FyaWFMYWJlbElEfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcygnd2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHknLCB7XG4gICAgICAgICAgICAgICAgICAnd2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHktLWFja25vd2xlZGdlZCc6IGluZGV4IDw9IGluZGV4T2ZMYXN0SW50ZXJhY3RlZEFjdGl2aXR5LFxuICAgICAgICAgICAgICAgICAgJ3dlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2FjdGl2aXR5LS1mcm9tLWJvdCc6IHJvbGUgIT09ICd1c2VyJyxcbiAgICAgICAgICAgICAgICAgICd3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19hY3Rpdml0eS0tZnJvbS11c2VyJzogcm9sZSA9PT0gJ3VzZXInXG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgLy8gU2V0IFwiaWRcIiBmb3IgdmFsaWQgZm9yIGFjY2Vzc2liaWxpdHkuXG4gICAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L2ZvcmJpZC1kb20tcHJvcHMgKi9cbiAgICAgICAgICAgICAgICBpZD17YWN0aXZlRGVzY2VuZGFudCA/IGFjdGl2ZURlc2NlbmRhbnRFbGVtZW50SWQgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAga2V5PXtrZXl9XG4gICAgICAgICAgICAgICAgb25Gb2N1cz17aGFuZGxlRm9jdXN9XG4gICAgICAgICAgICAgICAgb25LZXlEb3duPXtoYW5kbGVLZXlEb3dufVxuICAgICAgICAgICAgICAgIG9uTW91c2VEb3duQ2FwdHVyZT17aGFuZGxlTW91c2VEb3duQ2FwdHVyZX1cbiAgICAgICAgICAgICAgICByZWY9e2NhbGxiYWNrUmVmfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPFNjcmVlblJlYWRlckFjdGl2aXR5IGFjdGl2aXR5PXthY3Rpdml0eX0gaWQ9e2FyaWFMYWJlbElEfSByZW5kZXJBdHRhY2htZW50cz17ZmFsc2V9PlxuICAgICAgICAgICAgICAgICAgeyEhaXNDb250ZW50SW50ZXJhY3RpdmUgJiYgPHA+e2FjdGl2aXR5SW50ZXJhY3RpdmVBbHR9PC9wPn1cbiAgICAgICAgICAgICAgICA8L1NjcmVlblJlYWRlckFjdGl2aXR5PlxuICAgICAgICAgICAgICAgIDxGb2N1c1JlZGlyZWN0b3JcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2FjdGl2aXR5LXNlbnRpbmVsXCJcbiAgICAgICAgICAgICAgICAgIG9uRm9jdXM9e2ZvY3VzQWN0aXZpdHl9XG4gICAgICAgICAgICAgICAgICByZWRpcmVjdFJlZj17cm9vdEVsZW1lbnRSZWZ9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2FjdGl2aXR5LWJveFwiPlxuICAgICAgICAgICAgICAgICAge3JlbmRlckFjdGl2aXR5KHtcbiAgICAgICAgICAgICAgICAgICAgaGlkZVRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyQWN0aXZpdHlTdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlckF2YXRhcixcbiAgICAgICAgICAgICAgICAgICAgc2hvd0NhbGxvdXRcbiAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIHtzaG91bGRTcGVhayAmJiA8U3BlYWtBY3Rpdml0eSBhY3Rpdml0eT17YWN0aXZpdHl9IC8+fVxuICAgICAgICAgICAgICAgIDxGb2N1c1JlZGlyZWN0b3JcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2FjdGl2aXR5LXNlbnRpbmVsXCJcbiAgICAgICAgICAgICAgICAgIG9uRm9jdXM9e2ZvY3VzQWN0aXZpdHl9XG4gICAgICAgICAgICAgICAgICByZWRpcmVjdFJlZj17cm9vdEVsZW1lbnRSZWZ9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoJ3dlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2FjdGl2aXR5LWluZGljYXRvcicsIHtcbiAgICAgICAgICAgICAgICAgICAgJ3dlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2FjdGl2aXR5LWluZGljYXRvci0tZmlyc3QnOiAhaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICd3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19hY3Rpdml0eS1pbmRpY2F0b3ItLWZvY3VzJzogYWN0aXZlRGVzY2VuZGFudFxuICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICApfVxuICAgICAgPC9JbnRlcm5hbFRyYW5zY3JpcHRTY3JvbGxhYmxlPlxuICAgICAgeyEhcmVuZGVyaW5nRWxlbWVudHMubGVuZ3RoICYmIChcbiAgICAgICAgPFJlYWN0LkZyYWdtZW50PlxuICAgICAgICAgIDxGb2N1c1JlZGlyZWN0b3JcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cIndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX3NlbnRpbmVsXCJcbiAgICAgICAgICAgIG9uRm9jdXM9e3NldEJvdHRvbW1vc3RGb2N1c2VkQWN0aXZpdHlLZXlJZk5lZWRlZH1cbiAgICAgICAgICAgIHJlZGlyZWN0UmVmPXtyb290RWxlbWVudFJlZn1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fdGVybWluYXRvclwiIHJlZj17dGVybWluYXRvclJlZn0gdGFiSW5kZXg9ezB9PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X190ZXJtaW5hdG9yLWJvZHlcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X190ZXJtaW5hdG9yLXRleHRcIj57dGVybWluYXRvclRleHR9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICl9XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2ZvY3VzLWluZGljYXRvclwiIC8+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5JbnRlcm5hbFRyYW5zY3JpcHQuZGVmYXVsdFByb3BzID0ge1xuICBjbGFzc05hbWU6ICcnXG59O1xuXG5JbnRlcm5hbFRyYW5zY3JpcHQucHJvcFR5cGVzID0ge1xuICBhY3Rpdml0eUVsZW1lbnRzUmVmOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGN1cnJlbnQ6IFByb3BUeXBlcy5hcnJheS5pc1JlcXVpcmVkXG4gIH0pLmlzUmVxdWlyZWQsXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZ1xufTtcblxuY29uc3QgSW50ZXJuYWxTY3JlZW5SZWFkZXJUcmFuc2NyaXB0ID0gKHsgcmVuZGVyaW5nRWxlbWVudHMgfSkgPT4ge1xuICBjb25zdCBsb2NhbGl6ZSA9IHVzZUxvY2FsaXplcigpO1xuICBjb25zdCBbaW50ZXJuYWxMaXZlUmVnaW9uRmFkZUFmdGVyXSA9IHVzZVN0eWxlT3B0aW9ucygpO1xuXG4gIGNvbnN0IHRyYW5zY3JpcHRSb2xlRGVzY3JpcHRpb24gPSBsb2NhbGl6ZSgnVFJBTlNDUklQVF9BUklBX1JPTEVfQUxUJyk7XG5cbiAgcmV0dXJuIChcbiAgICA8c2VjdGlvblxuICAgICAgYXJpYS1hdG9taWM9e2ZhbHNlfVxuICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgIGFyaWEtcmVsZXZhbnQ9XCJhZGRpdGlvbnNcIlxuICAgICAgYXJpYS1yb2xlZGVzY3JpcHRpb249e3RyYW5zY3JpcHRSb2xlRGVzY3JpcHRpb259XG4gICAgICByb2xlPVwibG9nXCJcbiAgICA+XG4gICAgICB7cmVuZGVyaW5nRWxlbWVudHMubWFwKCh7IGFjdGl2aXR5LCBsaXZlUmVnaW9uS2V5IH0pID0+IChcbiAgICAgICAgPEZhZGUgZmFkZUFmdGVyPXtpbnRlcm5hbExpdmVSZWdpb25GYWRlQWZ0ZXJ9IGtleT17bGl2ZVJlZ2lvbktleX0+XG4gICAgICAgICAgeygpID0+IDxTY3JlZW5SZWFkZXJBY3Rpdml0eSBhY3Rpdml0eT17YWN0aXZpdHl9IC8+fVxuICAgICAgICA8L0ZhZGU+XG4gICAgICApKX1cbiAgICA8L3NlY3Rpb24+XG4gICk7XG59O1xuXG5JbnRlcm5hbFNjcmVlblJlYWRlclRyYW5zY3JpcHQucHJvcFR5cGVzID0ge1xuICByZW5kZXJpbmdFbGVtZW50czogUHJvcFR5cGVzLmFycmF5T2YoXG4gICAgUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIGFjdGl2aXR5OiBQcm9wVHlwZXMuYW55LFxuICAgICAgbGl2ZVJlZ2lvbktleTogUHJvcFR5cGVzLnN0cmluZ1xuICAgIH0pXG4gICkuaXNSZXF1aXJlZFxufTtcblxuLy8gU2VwYXJhdGluZyBoaWdoLWZyZXF1ZW5jeSBob29rcyB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLlxuY29uc3QgSW50ZXJuYWxUcmFuc2NyaXB0U2Nyb2xsYWJsZSA9ICh7IGFjdGl2aXRpZXMsIGNoaWxkcmVuLCBvbkZvY3VzQWN0aXZpdHksIG9uRm9jdXNGaWxsZXIsIHRlcm1pbmF0b3JSZWYgfSkgPT4ge1xuICBjb25zdCBbeyBhY3Rpdml0aWVzOiBhY3Rpdml0aWVzU3R5bGVTZXQgfV0gPSB1c2VTdHlsZVNldCgpO1xuICBjb25zdCBbeyBoaWRlU2Nyb2xsVG9FbmRCdXR0b24gfV0gPSB1c2VTdHlsZU9wdGlvbnMoKTtcbiAgY29uc3QgW2FuaW1hdGluZ1RvRW5kXSA9IHVzZUFuaW1hdGluZ1RvRW5kKCk7XG4gIGNvbnN0IFtzdGlja3ldID0gdXNlU3RpY2t5KCk7XG4gIGNvbnN0IGxhc3RWaXNpYmxlQWN0aXZpdHlJZCA9IGdldEFjdGl2aXR5VW5pcXVlSWQoYWN0aXZpdGllc1thY3Rpdml0aWVzLmxlbmd0aCAtIDFdIHx8IHt9KTsgLy8gQWN0aXZpdHkgSUQgb2YgdGhlIGxhc3QgdmlzaWJsZSBhY3Rpdml0eSBpbiB0aGUgbGlzdC5cbiAgY29uc3QgbG9jYWxpemUgPSB1c2VMb2NhbGl6ZXIoKTtcbiAgY29uc3Qgc2Nyb2xsVG9FbmRCdXR0b25SZWYgPSB1c2VSZWYoKTtcblxuICBjb25zdCBsYXN0UmVhZEFjdGl2aXR5SWRSZWYgPSB1c2VSZWYobGFzdFZpc2libGVBY3Rpdml0eUlkKTtcbiAgY29uc3QgdHJhbnNjcmlwdFJvbGVEZXNjcmlwdGlvbiA9IGxvY2FsaXplKCdUUkFOU0NSSVBUX0FSSUFfUk9MRV9BTFQnKTtcblxuICBjb25zdCBhbGxBY3Rpdml0aWVzUmVhZCA9IGxhc3RWaXNpYmxlQWN0aXZpdHlJZCA9PT0gbGFzdFJlYWRBY3Rpdml0eUlkUmVmLmN1cnJlbnQ7XG5cbiAgY29uc3QgaGFuZGxlU2Nyb2xsVG9FbmRCdXR0b25DbGljayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAvLyBBZnRlciB0aGUgXCJOZXcgbWVzc2FnZVwiIGJ1dHRvbiBpcyBjbGlja2VkLCBmb2N1cyBvbiB0aGUgZmlyc3QgdW5yZWFkIGFjdGl2aXR5LlxuICAgIGNvbnN0IGluZGV4ID0gYWN0aXZpdGllcy5maW5kSW5kZXgoKHsgaWQgfSkgPT4gaWQgPT09IGxhc3RSZWFkQWN0aXZpdHlJZFJlZi5jdXJyZW50KTtcblxuICAgIGlmICh+aW5kZXgpIHtcbiAgICAgIGNvbnN0IGZpcnN0VW5yZWFkQWN0aXZpdHkgPSBhY3Rpdml0aWVzW2luZGV4ICsgMV07XG5cbiAgICAgIGlmIChmaXJzdFVucmVhZEFjdGl2aXR5KSB7XG4gICAgICAgIHJldHVybiBvbkZvY3VzQWN0aXZpdHkoZ2V0QWN0aXZpdHlVbmlxdWVJZChmaXJzdFVucmVhZEFjdGl2aXR5KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeyBjdXJyZW50IH0gPSB0ZXJtaW5hdG9yUmVmO1xuXG4gICAgY3VycmVudCAmJiBjdXJyZW50LmZvY3VzKCk7XG4gIH0sIFthY3Rpdml0aWVzLCBsYXN0UmVhZEFjdGl2aXR5SWRSZWYsIG9uRm9jdXNBY3Rpdml0eSwgdGVybWluYXRvclJlZl0pO1xuXG4gIGlmIChzdGlja3kpIHtcbiAgICAvLyBJZiBpdCBpcyBzdGlja3ksIHRoZSB1c2VyIGlzIGF0IHRoZSBib3R0b20gb2YgdGhlIHRyYW5zY3JpcHQsIGV2ZXJ5dGhpbmcgaXMgcmVhZC5cbiAgICAvLyBTbyBtYXJrIHRoZSBhY3Rpdml0eSBJRCBhcyByZWFkLlxuICAgIGxhc3RSZWFkQWN0aXZpdHlJZFJlZi5jdXJyZW50ID0gbGFzdFZpc2libGVBY3Rpdml0eUlkO1xuICB9XG5cbiAgLy8gRmluZHMgd2hlcmUgd2Ugc2hvdWxkIHJlbmRlciB0aGUgXCJOZXcgbWVzc2FnZXNcIiBidXR0b24sIGluIGluZGV4LiBSZXR1cm5zIC0xIHRvIGhpZGUgdGhlIGJ1dHRvbi5cbiAgY29uc3QgcmVuZGVyU2VwYXJhdG9yQWZ0ZXJJbmRleCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIC8vIERvbid0IHNob3cgdGhlIGJ1dHRvbiBpZjpcbiAgICAvLyAtIEFsbCBhY3Rpdml0aWVzIGhhdmUgYmVlbiByZWFkXG4gICAgLy8gLSBDdXJyZW50bHkgYW5pbWF0aW5nIHRvd2FyZHMgYm90dG9tXG4gICAgLy8gICAtIFwiTmV3IG1lc3NhZ2VzXCIgYnV0dG9uIG11c3Qgbm90IGZsYXNoIHdoZW46IDEuIFR5cGUgXCJoZWxwXCIsIDIuIFNjcm9sbCB0byB0b3AsIDMuIFR5cGUgXCJoZWxwXCIgYWdhaW4sIDQuIEV4cGVjdCB0aGUgXCJOZXcgbWVzc2FnZXNcIiBidXR0b24gbm90IGZsYXNoeVxuICAgIC8vIC0gSGlkZGVuIGJ5IHN0eWxlIG9wdGlvbnNcbiAgICAvLyAtIEl0IGlzIGFscmVhZHkgYXQgdGhlIGJvdHRvbSAoc3RpY2t5KVxuXG4gICAgLy8gQW55IGNoYW5nZXMgdG8gdGhpcyBsb2dpYywgdmVyaWZ5OlxuICAgIC8vIC0gXCJOZXcgbWVzc2FnZXNcIiBidXR0b24gc2hvdWxkIHBlcnNpc3Qgd2hpbGUgcHJvZ3JhbW1hdGljYWxseSBzY3JvbGxpbmcgdG8gbWlkLXBvaW50IG9mIHRoZSB0cmFuc2NyaXB0OlxuICAgIC8vICAgMS4gVHlwZSBcImhlbHBcIlxuICAgIC8vICAgMi4gVHlwZSBcInByb2FjdGl2ZVwiLCB0aGVuIGltbWVkaWF0ZWx5IHNjcm9sbCB0byB0b3BcbiAgICAvLyAgICAgIEV4cGVjdDogdGhlIFwiTmV3IG1lc3NhZ2VzXCIgYnV0dG9uIHNob3VsZCBhcHBlYXJcbiAgICAvLyAgIDMuIFJ1biBob29rIFwidXNlU2Nyb2xsVG8oeyBzY3JvbGxUb3A6IDUwMCB9KVwiXG4gICAgLy8gICAgICBFeHBlY3Q6IHdoZW4gdGhlIHNjcm9sbCBpcyBhbmltYXRpbmcgdG8gNTAwcHgsIHRoZSBcIk5ldyBtZXNzYWdlc1wiIGJ1dHRvbiBzaG91bGQga2VwdCBvbiB0aGUgc2NyZWVuXG4gICAgLy8gLSBcIk5ldyBtZXNzYWdlc1wiIGJ1dHRvbiBtdXN0IG5vdCBmbGFzaHk6XG4gICAgLy8gICAxLiBUeXBlIFwiaGVscFwiXG4gICAgLy8gICAyLiBTY3JvbGwgdG8gdG9wXG4gICAgLy8gICAgICBFeHBlY3Q6IG5vIFwiTmV3IG1lc3NhZ2VzXCIgYnV0dG9uIGlzIHNob3duXG4gICAgLy8gICAzLiBUeXBlIFwiaGVscFwiIGFnYWluXG4gICAgLy8gICAgICBFeHBlY3Q6IFwiTmV3IG1lc3NhZ2VzXCIgYnV0dG9uIG11c3Qgbm90IGZsYXNoLWFwcGVhclxuXG4gICAgaWYgKGFsbEFjdGl2aXRpZXNSZWFkIHx8IGFuaW1hdGluZ1RvRW5kIHx8IGhpZGVTY3JvbGxUb0VuZEJ1dHRvbiB8fCBzdGlja3kpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aXZpdGllcy5maW5kSW5kZXgoYWN0aXZpdHkgPT4gZ2V0QWN0aXZpdHlVbmlxdWVJZChhY3Rpdml0eSkgPT09IGxhc3RSZWFkQWN0aXZpdHlJZFJlZi5jdXJyZW50KTtcbiAgfSwgW2FjdGl2aXRpZXMsIGFsbEFjdGl2aXRpZXNSZWFkLCBhbmltYXRpbmdUb0VuZCwgaGlkZVNjcm9sbFRvRW5kQnV0dG9uLCBsYXN0UmVhZEFjdGl2aXR5SWRSZWYsIHN0aWNreV0pO1xuXG4gIHJldHVybiAoXG4gICAgPFJlYWN0LkZyYWdtZW50PlxuICAgICAge3JlbmRlclNlcGFyYXRvckFmdGVySW5kZXggIT09IC0xICYmIChcbiAgICAgICAgPFNjcm9sbFRvRW5kQnV0dG9uIG9uQ2xpY2s9e2hhbmRsZVNjcm9sbFRvRW5kQnV0dG9uQ2xpY2t9IHJlZj17c2Nyb2xsVG9FbmRCdXR0b25SZWZ9IC8+XG4gICAgICApfVxuICAgICAgeyEhUmVhY3QuQ2hpbGRyZW4uY291bnQoY2hpbGRyZW4pICYmIChcbiAgICAgICAgPEZvY3VzUmVkaXJlY3RvciBjbGFzc05hbWU9XCJ3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19zZW50aW5lbFwiIHJlZGlyZWN0UmVmPXt0ZXJtaW5hdG9yUmVmfSAvPlxuICAgICAgKX1cbiAgICAgIDxSZWFjdFNjcm9sbFRvQm90dG9tUGFuZWwgY2xhc3NOYW1lPVwid2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fc2Nyb2xsYWJsZVwiPlxuICAgICAgICA8ZGl2IGFyaWEtaGlkZGVuPXt0cnVlfSBjbGFzc05hbWU9XCJ3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19maWxsZXJcIiBvbkZvY3VzPXtvbkZvY3VzRmlsbGVyfSAvPlxuICAgICAgICA8dWxcbiAgICAgICAgICBhcmlhLXJvbGVkZXNjcmlwdGlvbj17dHJhbnNjcmlwdFJvbGVEZXNjcmlwdGlvbn1cbiAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoYWN0aXZpdGllc1N0eWxlU2V0ICsgJycsICd3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X190cmFuc2NyaXB0Jyl9XG4gICAgICAgICAgcm9sZT1cImxpc3RcIlxuICAgICAgICA+XG4gICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8L3VsPlxuICAgICAgICA8QmFzaWNUeXBpbmdJbmRpY2F0b3IgLz5cbiAgICAgIDwvUmVhY3RTY3JvbGxUb0JvdHRvbVBhbmVsPlxuICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICk7XG59O1xuXG5JbnRlcm5hbFRyYW5zY3JpcHRTY3JvbGxhYmxlLnByb3BUeXBlcyA9IHtcbiAgYWN0aXZpdGllczogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMuYW55LmlzUmVxdWlyZWQsXG4gIG9uRm9jdXNBY3Rpdml0eTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgb25Gb2N1c0ZpbGxlcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgdGVybWluYXRvclJlZjogUHJvcFR5cGVzLmFueS5pc1JlcXVpcmVkXG59O1xuXG5jb25zdCBTZXRTY3JvbGxlciA9ICh7IGFjdGl2aXR5RWxlbWVudHNSZWYsIHNjcm9sbGVyUmVmIH0pID0+IHtcbiAgY29uc3QgW1xuICAgIHsgYXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5LCBhdXRvU2Nyb2xsU25hcE9uQWN0aXZpdHlPZmZzZXQsIGF1dG9TY3JvbGxTbmFwT25QYWdlLCBhdXRvU2Nyb2xsU25hcE9uUGFnZU9mZnNldCB9XG4gIF0gPSB1c2VTdHlsZU9wdGlvbnMoKTtcbiAgY29uc3QgW2xhc3RBY2tub3dsZWRnZWRBY3Rpdml0eV0gPSB1c2VBY2tub3dsZWRnZWRBY3Rpdml0eSgpO1xuXG4gIGNvbnN0IGxhc3RBY2tub3dsZWRnZWRBY3Rpdml0eVJlZiA9IHVzZVJlZihsYXN0QWNrbm93bGVkZ2VkQWN0aXZpdHkpO1xuXG4gIGxhc3RBY2tub3dsZWRnZWRBY3Rpdml0eVJlZi5jdXJyZW50ID0gbGFzdEFja25vd2xlZGdlZEFjdGl2aXR5O1xuXG4gIHNjcm9sbGVyUmVmLmN1cnJlbnQgPSB1c2VDYWxsYmFjayhcbiAgICAoeyBvZmZzZXRIZWlnaHQsIHNjcm9sbFRvcCB9KSA9PiB7XG4gICAgICBjb25zdCBwYXRjaGVkQXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5ID1cbiAgICAgICAgdHlwZW9mIGF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eSA9PT0gJ251bWJlcidcbiAgICAgICAgICA/IE1hdGgubWF4KDAsIGF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eSlcbiAgICAgICAgICA6IGF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eVxuICAgICAgICAgID8gMVxuICAgICAgICAgIDogMDtcbiAgICAgIGNvbnN0IHBhdGNoZWRBdXRvU2Nyb2xsU25hcE9uUGFnZSA9XG4gICAgICAgIHR5cGVvZiBhdXRvU2Nyb2xsU25hcE9uUGFnZSA9PT0gJ251bWJlcidcbiAgICAgICAgICA/IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGF1dG9TY3JvbGxTbmFwT25QYWdlKSlcbiAgICAgICAgICA6IGF1dG9TY3JvbGxTbmFwT25QYWdlXG4gICAgICAgICAgPyAxXG4gICAgICAgICAgOiAwO1xuICAgICAgY29uc3QgcGF0Y2hlZEF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eU9mZnNldCA9XG4gICAgICAgIHR5cGVvZiBhdXRvU2Nyb2xsU25hcE9uQWN0aXZpdHlPZmZzZXQgPT09ICdudW1iZXInID8gYXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5T2Zmc2V0IDogMDtcbiAgICAgIGNvbnN0IHBhdGNoZWRBdXRvU2Nyb2xsU25hcE9uUGFnZU9mZnNldCA9XG4gICAgICAgIHR5cGVvZiBhdXRvU2Nyb2xsU25hcE9uUGFnZU9mZnNldCA9PT0gJ251bWJlcicgPyBhdXRvU2Nyb2xsU25hcE9uUGFnZU9mZnNldCA6IDA7XG5cbiAgICAgIGlmIChwYXRjaGVkQXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5IHx8IHBhdGNoZWRBdXRvU2Nyb2xsU25hcE9uUGFnZSkge1xuICAgICAgICBjb25zdCB7IGN1cnJlbnQ6IGxhc3RBY2tub3dsZWRnZWRBY3Rpdml0eSB9ID0gbGFzdEFja25vd2xlZGdlZEFjdGl2aXR5UmVmO1xuXG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuXG4gICAgICAgIGlmIChwYXRjaGVkQXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5KSB7XG4gICAgICAgICAgY29uc3QgeyBlbGVtZW50OiBudGhVbmFja25vd2xlZGdlZEFjdGl2aXR5RWxlbWVudCB9ID1cbiAgICAgICAgICAgIGFjdGl2aXR5RWxlbWVudHNSZWYuY3VycmVudFtcbiAgICAgICAgICAgICAgYWN0aXZpdHlFbGVtZW50c1JlZi5jdXJyZW50LmZpbmRJbmRleCgoeyBhY3Rpdml0eSB9KSA9PiBhY3Rpdml0eSA9PT0gbGFzdEFja25vd2xlZGdlZEFjdGl2aXR5KSArXG4gICAgICAgICAgICAgICAgcGF0Y2hlZEF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eVxuICAgICAgICAgICAgXSB8fCB7fTtcblxuICAgICAgICAgIGlmIChudGhVbmFja25vd2xlZGdlZEFjdGl2aXR5RWxlbWVudCkge1xuICAgICAgICAgICAgdmFsdWVzLnB1c2goXG4gICAgICAgICAgICAgIG50aFVuYWNrbm93bGVkZ2VkQWN0aXZpdHlFbGVtZW50Lm9mZnNldFRvcCArXG4gICAgICAgICAgICAgICAgbnRoVW5hY2tub3dsZWRnZWRBY3Rpdml0eUVsZW1lbnQub2Zmc2V0SGVpZ2h0IC1cbiAgICAgICAgICAgICAgICBvZmZzZXRIZWlnaHQgLVxuICAgICAgICAgICAgICAgIHNjcm9sbFRvcCArXG4gICAgICAgICAgICAgICAgcGF0Y2hlZEF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eU9mZnNldFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF0Y2hlZEF1dG9TY3JvbGxTbmFwT25QYWdlKSB7XG4gICAgICAgICAgY29uc3QgeyBlbGVtZW50OiBmaXJzdFVuYWNrbm93bGVkZ2VkQWN0aXZpdHlFbGVtZW50IH0gPVxuICAgICAgICAgICAgYWN0aXZpdHlFbGVtZW50c1JlZi5jdXJyZW50W1xuICAgICAgICAgICAgICBhY3Rpdml0eUVsZW1lbnRzUmVmLmN1cnJlbnQuZmluZEluZGV4KCh7IGFjdGl2aXR5IH0pID0+IGFjdGl2aXR5ID09PSBsYXN0QWNrbm93bGVkZ2VkQWN0aXZpdHkpICsgMVxuICAgICAgICAgICAgXSB8fCB7fTtcblxuICAgICAgICAgIGlmIChmaXJzdFVuYWNrbm93bGVkZ2VkQWN0aXZpdHlFbGVtZW50KSB7XG4gICAgICAgICAgICB2YWx1ZXMucHVzaChcbiAgICAgICAgICAgICAgZmlyc3RVbmFja25vd2xlZGdlZEFjdGl2aXR5RWxlbWVudC5vZmZzZXRUb3AgLVxuICAgICAgICAgICAgICAgIHNjcm9sbFRvcCAtXG4gICAgICAgICAgICAgICAgb2Zmc2V0SGVpZ2h0ICogKDEgLSBwYXRjaGVkQXV0b1Njcm9sbFNuYXBPblBhZ2UpICtcbiAgICAgICAgICAgICAgICBwYXRjaGVkQXV0b1Njcm9sbFNuYXBPblBhZ2VPZmZzZXRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlcy5yZWR1Y2UoKG1pblZhbHVlLCB2YWx1ZSkgPT4gTWF0aC5taW4obWluVmFsdWUsIHZhbHVlKSwgSW5maW5pdHkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gSW5maW5pdHk7XG4gICAgfSxcbiAgICBbXG4gICAgICBhY3Rpdml0eUVsZW1lbnRzUmVmLFxuICAgICAgYXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5LFxuICAgICAgYXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5T2Zmc2V0LFxuICAgICAgYXV0b1Njcm9sbFNuYXBPblBhZ2UsXG4gICAgICBhdXRvU2Nyb2xsU25hcE9uUGFnZU9mZnNldCxcbiAgICAgIGxhc3RBY2tub3dsZWRnZWRBY3Rpdml0eVJlZlxuICAgIF1cbiAgKTtcblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBCYXNpY1RyYW5zY3JpcHQgPSAoeyBjbGFzc05hbWUgfSkgPT4ge1xuICBjb25zdCBhY3Rpdml0eUVsZW1lbnRzUmVmID0gdXNlUmVmKFtdKTtcbiAgY29uc3Qgc2Nyb2xsZXJSZWYgPSB1c2VSZWYoKCkgPT4gSW5maW5pdHkpO1xuXG4gIGNvbnN0IHNjcm9sbGVyID0gdXNlQ2FsbGJhY2soKC4uLmFyZ3MpID0+IHNjcm9sbGVyUmVmLmN1cnJlbnQoLi4uYXJncyksIFtzY3JvbGxlclJlZl0pO1xuXG4gIHJldHVybiAoXG4gICAgPFJlYWN0U2Nyb2xsVG9Cb3R0b21Db21wb3NlciBzY3JvbGxlcj17c2Nyb2xsZXJ9PlxuICAgICAgPFNldFNjcm9sbGVyIGFjdGl2aXR5RWxlbWVudHNSZWY9e2FjdGl2aXR5RWxlbWVudHNSZWZ9IHNjcm9sbGVyUmVmPXtzY3JvbGxlclJlZn0gLz5cbiAgICAgIDxJbnRlcm5hbFRyYW5zY3JpcHQgYWN0aXZpdHlFbGVtZW50c1JlZj17YWN0aXZpdHlFbGVtZW50c1JlZn0gY2xhc3NOYW1lPXtjbGFzc05hbWV9IC8+XG4gICAgPC9SZWFjdFNjcm9sbFRvQm90dG9tQ29tcG9zZXI+XG4gICk7XG59O1xuXG5CYXNpY1RyYW5zY3JpcHQuZGVmYXVsdFByb3BzID0ge1xuICBjbGFzc05hbWU6ICcnXG59O1xuXG5CYXNpY1RyYW5zY3JpcHQucHJvcFR5cGVzID0ge1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmdcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJhc2ljVHJhbnNjcmlwdDtcbiJdfQ==
1196
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9CYXNpY1RyYW5zY3JpcHQuanMiXSwibmFtZXMiOlsidXNlQWN0aXZpdGllcyIsImhvb2tzIiwidXNlQ3JlYXRlQWN0aXZpdHlSZW5kZXJlciIsInVzZUNyZWF0ZUFjdGl2aXR5U3RhdHVzUmVuZGVyZXIiLCJ1c2VDcmVhdGVBdmF0YXJSZW5kZXJlciIsInVzZUNyZWF0ZVNjcm9sbFRvRW5kQnV0dG9uUmVuZGVyZXIiLCJ1c2VEaXJlY3Rpb24iLCJ1c2VHcm91cEFjdGl2aXRpZXMiLCJ1c2VMb2NhbGl6ZXIiLCJ1c2VTdHlsZU9wdGlvbnMiLCJST09UX1NUWUxFIiwiZGlzcGxheSIsImZsZXhEaXJlY3Rpb24iLCJvdmVyZmxvdyIsInBvc2l0aW9uIiwiZmxleCIsIm92ZXJmbG93WCIsIldlYmtpdE92ZXJmbG93U2Nyb2xsaW5nIiwibGlzdFN0eWxlVHlwZSIsInZhbGlkYXRlQWxsQWN0aXZpdGllc1RhZ2dlZCIsImFjdGl2aXRpZXMiLCJiaW5zIiwiZXZlcnkiLCJhY3Rpdml0eSIsInNvbWUiLCJiaW4iLCJpbmNsdWRlcyIsIkludGVybmFsVHJhbnNjcmlwdCIsImFjdGl2aXR5RWxlbWVudHNSZWYiLCJjbGFzc05hbWUiLCJiYXNpY1RyYW5zY3JpcHRTdHlsZVNldCIsImJhc2ljVHJhbnNjcmlwdCIsImJ1YmJsZUZyb21Vc2VyTnViT2Zmc2V0IiwiYnViYmxlTnViT2Zmc2V0IiwiZ3JvdXBUaW1lc3RhbXAiLCJpbnRlcm5hbExpdmVSZWdpb25GYWRlQWZ0ZXIiLCJzaG93QXZhdGFySW5Hcm91cCIsImZvY3VzZWRBY3Rpdml0eUtleSIsInNldEZvY3VzZWRBY3Rpdml0eUtleSIsImRpcmVjdGlvbiIsImNyZWF0ZUFjdGl2aXR5UmVuZGVyZXIiLCJjcmVhdGVBY3Rpdml0eVN0YXR1c1JlbmRlcmVyIiwiY3JlYXRlQXZhdGFyUmVuZGVyZXIiLCJmb2N1cyIsImdyb3VwQWN0aXZpdGllcyIsImxvY2FsaXplIiwicm9vdENsYXNzTmFtZSIsInJvb3RFbGVtZW50UmVmIiwidGVybWluYXRvclJlZiIsImFjdGl2aXR5SW50ZXJhY3RpdmVBbHQiLCJ0ZXJtaW5hdG9yVGV4dCIsInRyYW5zY3JpcHRBcmlhTGFiZWwiLCJ0cmFuc2NyaXB0Um9sZURlc2NyaXB0aW9uIiwiaGlkZUFsbFRpbWVzdGFtcHMiLCJjcmVhdGVBY3Rpdml0eVJlbmRlcmVyV2l0aExpdGVyYWxBcmdzIiwibmV4dFZpc2libGVBY3Rpdml0eSIsImFjdGl2aXRpZXNXaXRoUmVuZGVyZXIiLCJjcmVhdGVBY3Rpdml0eVJlbmRlcmVyV2l0aExpdGVyYWxBcmdzTWVtb2l6ZWQiLCJpbmRleCIsImxlbmd0aCIsInJlbmRlckFjdGl2aXR5Iiwic3BsaWNlIiwidmlzaWJsZUFjdGl2aXRpZXMiLCJtYXAiLCJhY3Rpdml0aWVzR3JvdXBCeVNlbmRlciIsInNlbmRlciIsImFjdGl2aXRpZXNHcm91cEJ5U3RhdHVzIiwic3RhdHVzIiwiY29uc29sZSIsIndhcm4iLCJhY3Rpdml0eVRyZWUiLCJ2aXNpYmxlQWN0aXZpdGllc1BlbmRpbmdHcm91cGluZyIsInNlbmRlclRyZWUiLCJhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXIiLCJmaW5kIiwicHVzaCIsImZvckVhY2giLCJhY3Rpdml0aWVzV2l0aFNhbWVTdGF0dXMiLCJhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXJBbmRTdGF0dXMiLCJyZW1vdmVJbmxpbmUiLCJyZW5kZXJpbmdFbGVtZW50cyIsInRvcFNpZGVCb3ROdWIiLCJ0b3BTaWRlVXNlck51YiIsImZpcnN0QWN0aXZpdHkiLCJyZW5kZXJBdmF0YXIiLCJpbmRleFdpdGhpblNlbmRlckdyb3VwIiwiZmlyc3RJblNlbmRlckdyb3VwIiwibGFzdEluU2VuZGVyR3JvdXAiLCJpbmRleFdpdGhpblNlbmRlckFuZFN0YXR1c0dyb3VwIiwicmVuZGVyQWN0aXZpdHlTdGF0dXMiLCJmaXJzdEluU2VuZGVyQW5kU3RhdHVzR3JvdXAiLCJsYXN0SW5TZW5kZXJBbmRTdGF0dXNHcm91cCIsImVudHJ5Iiwia2V5IiwiYmFzZUFsdFRleHQiLCJjaGFubmVsRGF0YSIsIm1lc3NhZ2VCYWNrIiwiZGlzcGxheVRleHQiLCJ0ZXh0Iiwic3VwcG9ydFNjcmVlblJlYWRlciIsInJvbGUiLCJmcm9tIiwidG9wU2lkZU51YiIsInNob3dDYWxsb3V0IiwiZm9jdXNBY3Rpdml0eSIsInJvb3RFbGVtZW50IiwiY3VycmVudCIsImNhbGxiYWNrUmVmIiwiYWN0aXZpdHlFbGVtZW50IiwiYWN0aXZpdHlJRCIsImlkIiwiZWxlbWVudCIsImhhbmRsZUZvY3VzIiwiaGFuZGxlS2V5RG93biIsImV2ZW50IiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJoYW5kbGVNb3VzZURvd25DYXB0dXJlIiwidGFyZ2V0IiwidGFiSW5kZXgiLCJnZXRBdHRyaWJ1dGUiLCJoaWRlVGltZXN0YW1wIiwibGl2ZVJlZ2lvbktleSIsInNob3VsZFNwZWFrIiwic3BlYWsiLCJhY3Rpdml0eUVsZW1lbnRzIiwiZWxlbWVudElkIiwiZXhpc3RpbmdFbnRyeSIsImFyaWFMYWJlbElEIiwidG9TdHJpbmciLCJzdWJzdHIiLCJmb2N1c2VkIiwibGFzdEVsZW1lbnQiLCJyZW5kZXJpbmdBY3Rpdml0aWVzIiwic2Nyb2xsVG9Cb3R0b21TY3JvbGxUbyIsInNjcm9sbFRvQm90dG9tU2Nyb2xsVG9FbmQiLCJzY3JvbGxUbyIsImJlaGF2aW9yIiwiRXJyb3IiLCJzY3JvbGxUb3AiLCJzY3JvbGxhYmxlRWxlbWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJnZXRDbGllbnRSZWN0cyIsImFjdGl2aXR5RWxlbWVudEhlaWdodCIsImhlaWdodCIsImFjdGl2aXR5RWxlbWVudFkiLCJ5Iiwic2Nyb2xsYWJsZUhlaWdodCIsImFjdGl2aXR5RWxlbWVudE9mZnNldFRvcCIsIk1hdGgiLCJtaW4iLCJzY3JvbGxUb0VuZCIsInNjcm9sbFJlbGF0aXZlIiwiZGlzcGxhY2VtZW50Iiwic2Nyb2xsYWJsZSIsIm5leHRTY3JvbGxUb3AiLCJvZmZzZXRIZWlnaHQiLCJtYXgiLCJzY3JvbGxIZWlnaHQiLCJkaXNwYXRjaFNjcm9sbFBvc2l0aW9uIiwicGF0Y2hlZERpc3BhdGNoU2Nyb2xsUG9zaXRpb24iLCJyZXZlcnNlIiwibGFzdEludGVyYWN0ZWRBY3Rpdml0eSIsImluZGV4T2ZMYXN0SW50ZXJhY3RlZEFjdGl2aXR5IiwiaW5kZXhPZiIsImFjdGl2ZURlc2NlbmRhbnRFbGVtZW50SWQiLCJzY3JvbGxBY3RpdmVEZXNjZW5kYW50SW50b1ZpZXciLCJhY3RpdmVEZXNjZW5kYW50IiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImNvbnRhaW5zIiwiYWN0aXZlRWxlbWVudCIsImRvY3VtZW50RWxlbWVudCIsInN0eWxlIiwic2Nyb2xsSW50b1ZpZXciLCJibG9jayIsInNjcm9sbFRvcEF0VG9wU2lkZSIsIm9mZnNldFRvcCIsInNjcm9sbFRvcEF0Qm90dG9tU2lkZSIsImhhbmRsZVRyYW5zY3JpcHRGb2N1cyIsImN1cnJlbnRUYXJnZXQiLCJ1bmRlZmluZWQiLCJmb2N1c1JlbGF0aXZlQWN0aXZpdHkiLCJkZWx0YSIsImlzTmFOIiwiZmluZEluZGV4IiwibmV4dEluZGV4IiwibmV4dEZvY3VzZWRBY3Rpdml0eSIsImhhbmRsZVRyYW5zY3JpcHRLZXlEb3duIiwiZnJvbUVuZE9mVHJhbnNjcmlwdEluZGljYXRvciIsImZyb21UcmFuc2NyaXB0IiwiaGFuZGxlZCIsIkluZmluaXR5IiwiZm9jdXNlZEFjdGl2aXR5RW50cnkiLCJmb2N1c2VkQWN0aXZpdHlFbGVtZW50IiwiZmlsdGVyIiwiZmlyc3RUYWJiYWJsZUVsZW1lbnQiLCJsYWJlbElkIiwic2V0Qm90dG9tbW9zdEZvY3VzZWRBY3Rpdml0eUtleUlmTmVlZGVkIiwibGFzdEFjdGl2aXR5S2V5IiwiaGFuZGxlVHJhbnNjcmlwdEtleURvd25DYXB0dXJlIiwiYWx0S2V5IiwiY3RybEtleSIsIm1ldGFLZXkiLCJmb2N1c1RyYW5zY3JpcHRDYWxsYmFjayIsImhhbmRsZUZvY3VzQWN0aXZpdHkiLCJkaXNwYXRjaFRyYW5zY3JpcHRGb2N1cyIsImZvY3VzZWRBY3Rpdml0eSIsImhhbmRsZUZvY3VzRmlsbGVyIiwiaXNDb250ZW50SW50ZXJhY3RpdmUiLCJkZWZhdWx0UHJvcHMiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJzaGFwZSIsImFycmF5IiwiaXNSZXF1aXJlZCIsInN0cmluZyIsIkludGVybmFsU2NyZWVuUmVhZGVyVHJhbnNjcmlwdCIsImFycmF5T2YiLCJhbnkiLCJJbnRlcm5hbFRyYW5zY3JpcHRTY3JvbGxhYmxlIiwiY2hpbGRyZW4iLCJvbkZvY3VzQWN0aXZpdHkiLCJvbkZvY3VzRmlsbGVyIiwiYWN0aXZpdGllc1N0eWxlU2V0IiwiYW5pbWF0aW5nVG9FbmQiLCJhdEVuZCIsInN0aWNreSIsInN0eWxlT3B0aW9ucyIsImxhc3RWaXNpYmxlQWN0aXZpdHlJZCIsImxhc3RSZWFkQWN0aXZpdHlJZFJlZiIsImhhbmRsZVNjcm9sbFRvRW5kQnV0dG9uQ2xpY2siLCJmaXJzdFVucmVhZEFjdGl2aXR5IiwiU2Nyb2xsVG9FbmRCdXR0b24iLCJ1bnJlYWQiLCJSZWFjdCIsIkNoaWxkcmVuIiwiY291bnQiLCJmdW5jIiwiU2V0U2Nyb2xsZXIiLCJzY3JvbGxlclJlZiIsImF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eSIsImF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eU9mZnNldCIsImF1dG9TY3JvbGxTbmFwT25QYWdlIiwiYXV0b1Njcm9sbFNuYXBPblBhZ2VPZmZzZXQiLCJsYXN0QWNrbm93bGVkZ2VkQWN0aXZpdHkiLCJhY3Rpdml0aWVzUmVmIiwibGFzdEFja25vd2xlZGdlZEFjdGl2aXR5UmVmIiwicGF0Y2hlZEF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eSIsInBhdGNoZWRBdXRvU2Nyb2xsU25hcE9uUGFnZSIsInBhdGNoZWRBdXRvU2Nyb2xsU25hcE9uQWN0aXZpdHlPZmZzZXQiLCJwYXRjaGVkQXV0b1Njcm9sbFNuYXBPblBhZ2VPZmZzZXQiLCJ2YWx1ZXMiLCJsYXN0QWNrbm93bGVkZ2VkQWN0aXZpdHlJbmRleCIsImZpcnN0VW5hY2tub3dsZWRnZWRBY3Rpdml0eUVsZW1lbnRJbmRleCIsImFjdGl2aXR5RWxlbWVudEluZGV4IiwibnRoVW5hY2tub3dsZWRnZWRBY3Rpdml0eUVsZW1lbnQiLCJmaXJzdFVuYWNrbm93bGVkZ2VkQWN0aXZpdHlFbGVtZW50IiwicmVkdWNlIiwibWluVmFsdWUiLCJ2YWx1ZSIsIkJhc2ljVHJhbnNjcmlwdCIsInNjcm9sbGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFVQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLElBQ0VBLGFBREYsR0FVSUMsNkJBVkosQ0FDRUQsYUFERjtBQUFBLElBRUVFLHlCQUZGLEdBVUlELDZCQVZKLENBRUVDLHlCQUZGO0FBQUEsSUFHRUMsK0JBSEYsR0FVSUYsNkJBVkosQ0FHRUUsK0JBSEY7QUFBQSxJQUlFQyx1QkFKRixHQVVJSCw2QkFWSixDQUlFRyx1QkFKRjtBQUFBLElBS0VDLGtDQUxGLEdBVUlKLDZCQVZKLENBS0VJLGtDQUxGO0FBQUEsSUFNRUMsWUFORixHQVVJTCw2QkFWSixDQU1FSyxZQU5GO0FBQUEsSUFPRUMsa0JBUEYsR0FVSU4sNkJBVkosQ0FPRU0sa0JBUEY7QUFBQSxJQVFFQyxZQVJGLEdBVUlQLDZCQVZKLENBUUVPLFlBUkY7QUFBQSxJQVNFQyxlQVRGLEdBVUlSLDZCQVZKLENBU0VRLGVBVEY7QUFZQSxJQUFNQyxVQUFVLEdBQUc7QUFDakIsaUNBQStCO0FBQzdCQyxJQUFBQSxPQUFPLEVBQUUsTUFEb0I7QUFFN0JDLElBQUFBLGFBQWEsRUFBRSxRQUZjO0FBRzdCQyxJQUFB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R0EsSUFBTWMsZUFBZSxHQUFHLFNBQWxCQSxlQUFrQixTQUFtQjtBQUFBLE1BQWhCeE8sU0FBZ0IsVUFBaEJBLFNBQWdCO0FBQ3pDLE1BQU1ELG1CQUFtQixHQUFHLG1CQUFPLEVBQVAsQ0FBNUI7QUFDQSxNQUFNb04sV0FBVyxHQUFHLG1CQUFPO0FBQUEsV0FBTWhELFFBQU47QUFBQSxHQUFQLENBQXBCO0FBRUEsTUFBTXNFLFFBQVEsR0FBRyx3QkFBWTtBQUFBLFdBQWF0QixXQUFXLENBQUN0SSxPQUFaLE9BQUFzSSxXQUFXLFlBQXhCO0FBQUEsR0FBWixFQUF1RCxDQUFDQSxXQUFELENBQXZELENBQWpCO0FBRUEsc0JBQ0UsNkJBQUMsNkJBQUQ7QUFBNkIsSUFBQSxRQUFRLEVBQUVzQjtBQUF2QyxrQkFDRSw2QkFBQyxXQUFEO0FBQWEsSUFBQSxtQkFBbUIsRUFBRTFPLG1CQUFsQztBQUF1RCxJQUFBLFdBQVcsRUFBRW9OO0FBQXBFLElBREYsZUFFRSw2QkFBQyxrQkFBRDtBQUFvQixJQUFBLG1CQUFtQixFQUFFcE4sbUJBQXpDO0FBQThELElBQUEsU0FBUyxFQUFFQztBQUF6RSxJQUZGLENBREY7QUFNRCxDQVpEOztBQWNBd08sZUFBZSxDQUFDbkQsWUFBaEIsR0FBK0I7QUFDN0JyTCxFQUFBQSxTQUFTLEVBQUU7QUFEa0IsQ0FBL0I7QUFJQXdPLGVBQWUsQ0FBQ2xELFNBQWhCLEdBQTRCO0FBQzFCdEwsRUFBQUEsU0FBUyxFQUFFdUwsbUJBQVVJO0FBREssQ0FBNUI7ZUFJZTZDLGUiLCJzb3VyY2VSb290IjoiY29tcG9uZW50Oi8vLyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludCBuby1tYWdpYy1udW1iZXJzOiBbXCJlcnJvclwiLCB7IFwiaWdub3JlXCI6IFstMSwgMCwgMSwgMiwgNSwgMzZdIH1dICovXG5cbmltcG9ydCB7IGhvb2tzIH0gZnJvbSAnYm90ZnJhbWV3b3JrLXdlYmNoYXQtYXBpJztcbmltcG9ydCB7XG4gIENvbXBvc2VyIGFzIFJlYWN0U2Nyb2xsVG9Cb3R0b21Db21wb3NlcixcbiAgUGFuZWwgYXMgUmVhY3RTY3JvbGxUb0JvdHRvbVBhbmVsLFxuICB1c2VBbmltYXRpbmdUb0VuZCxcbiAgdXNlQXRFbmQsXG4gIHVzZU9ic2VydmVTY3JvbGxQb3NpdGlvbixcbiAgdXNlU2Nyb2xsVG8sXG4gIHVzZVNjcm9sbFRvRW5kLFxuICB1c2VTdGlja3lcbn0gZnJvbSAncmVhY3Qtc2Nyb2xsLXRvLWJvdHRvbSc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgcmFuZG9tIGZyb20gJ21hdGgtcmFuZG9tJztcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgQmFzaWNUeXBpbmdJbmRpY2F0b3IgZnJvbSAnLi9CYXNpY1R5cGluZ0luZGljYXRvcic7XG5pbXBvcnQgRmFkZSBmcm9tICcuL1V0aWxzL0ZhZGUnO1xuaW1wb3J0IEZvY3VzUmVkaXJlY3RvciBmcm9tICcuL1V0aWxzL0ZvY3VzUmVkaXJlY3Rvcic7XG5pbXBvcnQgZ2V0QWN0aXZpdHlVbmlxdWVJZCBmcm9tICcuL1V0aWxzL2dldEFjdGl2aXR5VW5pcXVlSWQnO1xuaW1wb3J0IGdldFRhYkluZGV4IGZyb20gJy4vVXRpbHMvVHlwZUZvY3VzU2luay9nZXRUYWJJbmRleCc7XG5pbXBvcnQgaW5wdXR0YWJsZUtleSBmcm9tICcuL1V0aWxzL1R5cGVGb2N1c1NpbmsvaW5wdXR0YWJsZUtleSc7XG5pbXBvcnQgaW50ZXJzZWN0aW9uT2YgZnJvbSAnLi9VdGlscy9pbnRlcnNlY3Rpb25PZic7XG5pbXBvcnQgaXNaZXJvT3JQb3NpdGl2ZSBmcm9tICcuL1V0aWxzL2lzWmVyb09yUG9zaXRpdmUnO1xuaW1wb3J0IHJlbW92ZUlubGluZSBmcm9tICcuL1V0aWxzL3JlbW92ZUlubGluZSc7XG5pbXBvcnQgU2NyZWVuUmVhZGVyQWN0aXZpdHkgZnJvbSAnLi9TY3JlZW5SZWFkZXJBY3Rpdml0eSc7XG5pbXBvcnQgU2NyZWVuUmVhZGVyVGV4dCBmcm9tICcuL1NjcmVlblJlYWRlclRleHQnO1xuaW1wb3J0IFNwZWFrQWN0aXZpdHkgZnJvbSAnLi9BY3Rpdml0eS9TcGVhayc7XG5pbXBvcnQgdGFiYmFibGVFbGVtZW50cyBmcm9tICcuL1V0aWxzL3RhYmJhYmxlRWxlbWVudHMnO1xuaW1wb3J0IHVzZUFja25vd2xlZGdlZEFjdGl2aXR5IGZyb20gJy4vaG9va3MvaW50ZXJuYWwvdXNlQWNrbm93bGVkZ2VkQWN0aXZpdHknO1xuaW1wb3J0IHVzZURpc3BhdGNoU2Nyb2xsUG9zaXRpb24gZnJvbSAnLi9ob29rcy9pbnRlcm5hbC91c2VEaXNwYXRjaFNjcm9sbFBvc2l0aW9uJztcbmltcG9ydCB1c2VEaXNwYXRjaFRyYW5zY3JpcHRGb2N1cyBmcm9tICcuL2hvb2tzL2ludGVybmFsL3VzZURpc3BhdGNoVHJhbnNjcmlwdEZvY3VzJztcbmltcG9ydCB1c2VGb2N1cyBmcm9tICcuL2hvb2tzL3VzZUZvY3VzJztcbmltcG9ydCB1c2VNZW1vaXplIGZyb20gJy4vaG9va3MvaW50ZXJuYWwvdXNlTWVtb2l6ZSc7XG5pbXBvcnQgdXNlUmVnaXN0ZXJGb2N1c1RyYW5zY3JpcHQgZnJvbSAnLi9ob29rcy9pbnRlcm5hbC91c2VSZWdpc3RlckZvY3VzVHJhbnNjcmlwdCc7XG5pbXBvcnQgdXNlUmVnaXN0ZXJTY3JvbGxSZWxhdGl2ZSBmcm9tICcuL2hvb2tzL2ludGVybmFsL3VzZVJlZ2lzdGVyU2Nyb2xsUmVsYXRpdmUnO1xuaW1wb3J0IHVzZVJlZ2lzdGVyU2Nyb2xsVG8gZnJvbSAnLi9ob29rcy9pbnRlcm5hbC91c2VSZWdpc3RlclNjcm9sbFRvJztcbmltcG9ydCB1c2VSZWdpc3RlclNjcm9sbFRvRW5kIGZyb20gJy4vaG9va3MvaW50ZXJuYWwvdXNlUmVnaXN0ZXJTY3JvbGxUb0VuZCc7XG5pbXBvcnQgdXNlU3R5bGVTZXQgZnJvbSAnLi9ob29rcy91c2VTdHlsZVNldCc7XG5pbXBvcnQgdXNlU3R5bGVUb0Vtb3Rpb25PYmplY3QgZnJvbSAnLi9ob29rcy9pbnRlcm5hbC91c2VTdHlsZVRvRW1vdGlvbk9iamVjdCc7XG5pbXBvcnQgdXNlVW5pcXVlSWQgZnJvbSAnLi9ob29rcy9pbnRlcm5hbC91c2VVbmlxdWVJZCc7XG5cbmNvbnN0IHtcbiAgdXNlQWN0aXZpdGllcyxcbiAgdXNlQ3JlYXRlQWN0aXZpdHlSZW5kZXJlcixcbiAgdXNlQ3JlYXRlQWN0aXZpdHlTdGF0dXNSZW5kZXJlcixcbiAgdXNlQ3JlYXRlQXZhdGFyUmVuZGVyZXIsXG4gIHVzZUNyZWF0ZVNjcm9sbFRvRW5kQnV0dG9uUmVuZGVyZXIsXG4gIHVzZURpcmVjdGlvbixcbiAgdXNlR3JvdXBBY3Rpdml0aWVzLFxuICB1c2VMb2NhbGl6ZXIsXG4gIHVzZVN0eWxlT3B0aW9uc1xufSA9IGhvb2tzO1xuXG5jb25zdCBST09UX1NUWUxFID0ge1xuICAnJi53ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0Jzoge1xuICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgLy8gTWFrZSBzdXJlIHRvIHNldCBcInBvc2l0aW9uOiByZWxhdGl2ZVwiIGhlcmUgdG8gZm9ybSBhbm90aGVyIHN0YWNraW5nIGNvbnRleHQgZm9yIHRoZSBzY3JvbGwtdG8tZW5kIGJ1dHRvbi5cbiAgICAvLyBTdGFja2luZyBjb250ZXh0IGhlbHAgaXNvbGF0aW5nIGVsZW1lbnRzIHRoYXQgdXNlIFwiei1pbmRleFwiIGZyb20gZ2xvYmFsIHBvbGx1dGlvbi5cbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1Bvc2l0aW9uaW5nL1VuZGVyc3RhbmRpbmdfel9pbmRleC9UaGVfc3RhY2tpbmdfY29udGV4dFxuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuXG4gICAgJyYgLndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2ZpbGxlcic6IHtcbiAgICAgIGZsZXg6IDFcbiAgICB9LFxuXG4gICAgJyYgLndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX3Njcm9sbGFibGUnOiB7XG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICAgIG92ZXJmbG93WDogJ2hpZGRlbicsXG4gICAgICBXZWJraXRPdmVyZmxvd1Njcm9sbGluZzogJ3RvdWNoJ1xuICAgIH0sXG5cbiAgICAnJiAud2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fdHJhbnNjcmlwdCc6IHtcbiAgICAgIGxpc3RTdHlsZVR5cGU6ICdub25lJ1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gdmFsaWRhdGVBbGxBY3Rpdml0aWVzVGFnZ2VkKGFjdGl2aXRpZXMsIGJpbnMpIHtcbiAgcmV0dXJuIGFjdGl2aXRpZXMuZXZlcnkoYWN0aXZpdHkgPT4gYmlucy5zb21lKGJpbiA9PiBiaW4uaW5jbHVkZXMoYWN0aXZpdHkpKSk7XG59XG5cbmNvbnN0IEludGVybmFsVHJhbnNjcmlwdCA9ICh7IGFjdGl2aXR5RWxlbWVudHNSZWYsIGNsYXNzTmFtZSB9KSA9PiB7XG4gIGNvbnN0IFt7IGJhc2ljVHJhbnNjcmlwdDogYmFzaWNUcmFuc2NyaXB0U3R5bGVTZXQgfV0gPSB1c2VTdHlsZVNldCgpO1xuICBjb25zdCBbeyBidWJibGVGcm9tVXNlck51Yk9mZnNldCwgYnViYmxlTnViT2Zmc2V0LCBncm91cFRpbWVzdGFtcCwgaW50ZXJuYWxMaXZlUmVnaW9uRmFkZUFmdGVyLCBzaG93QXZhdGFySW5Hcm91cCB9XSA9XG4gICAgdXNlU3R5bGVPcHRpb25zKCk7XG4gIGNvbnN0IFtmb2N1c2VkQWN0aXZpdHlLZXksIHNldEZvY3VzZWRBY3Rpdml0eUtleV0gPSB1c2VTdGF0ZSgpO1xuICBjb25zdCBbYWN0aXZpdGllc10gPSB1c2VBY3Rpdml0aWVzKCk7XG4gIGNvbnN0IFtkaXJlY3Rpb25dID0gdXNlRGlyZWN0aW9uKCk7XG4gIGNvbnN0IGNyZWF0ZUFjdGl2aXR5UmVuZGVyZXIgPSB1c2VDcmVhdGVBY3Rpdml0eVJlbmRlcmVyKCk7XG4gIGNvbnN0IGNyZWF0ZUFjdGl2aXR5U3RhdHVzUmVuZGVyZXIgPSB1c2VDcmVhdGVBY3Rpdml0eVN0YXR1c1JlbmRlcmVyKCk7XG4gIGNvbnN0IGNyZWF0ZUF2YXRhclJlbmRlcmVyID0gdXNlQ3JlYXRlQXZhdGFyUmVuZGVyZXIoKTtcbiAgY29uc3QgZm9jdXMgPSB1c2VGb2N1cygpO1xuICBjb25zdCBncm91cEFjdGl2aXRpZXMgPSB1c2VHcm91cEFjdGl2aXRpZXMoKTtcbiAgY29uc3QgbG9jYWxpemUgPSB1c2VMb2NhbGl6ZXIoKTtcbiAgY29uc3Qgcm9vdENsYXNzTmFtZSA9IHVzZVN0eWxlVG9FbW90aW9uT2JqZWN0KCkoUk9PVF9TVFlMRSkgKyAnJztcbiAgY29uc3Qgcm9vdEVsZW1lbnRSZWYgPSB1c2VSZWYoKTtcbiAgY29uc3QgdGVybWluYXRvclJlZiA9IHVzZVJlZigpO1xuXG4gIGNvbnN0IGFjdGl2aXR5SW50ZXJhY3RpdmVBbHQgPSBsb2NhbGl6ZSgnQUNUSVZJVFlfSU5URVJBQ1RJVkVfTEFCRUxfQUxUJyk7XG4gIGNvbnN0IHRlcm1pbmF0b3JUZXh0ID0gbG9jYWxpemUoJ1RSQU5TQ1JJUFRfVEVSTUlOQVRPUl9URVhUJyk7XG4gIGNvbnN0IHRyYW5zY3JpcHRBcmlhTGFiZWwgPSBsb2NhbGl6ZSgnVFJBTlNDUklQVF9BUklBX0xBQkVMX0FMVCcpO1xuICBjb25zdCB0cmFuc2NyaXB0Um9sZURlc2NyaXB0aW9uID0gbG9jYWxpemUoJ1RSQU5TQ1JJUFRfQVJJQV9ST0xFX0FMVCcpO1xuXG4gIGNvbnN0IGhpZGVBbGxUaW1lc3RhbXBzID0gZ3JvdXBUaW1lc3RhbXAgPT09IGZhbHNlO1xuXG4gIC8vIEdldHMgcmVuZGVyZXIgZm9yIGV2ZXJ5IGFjdGl2aXR5LlxuICAvLyBBY3Rpdml0aWVzIHRoYXQgYXJlIG5vdCB2aXNpYmxlIHdpbGwgcmV0dXJuIGEgZmFsc3kgcmVuZGVyZXIuXG5cbiAgLy8gQ29udmVydGVkIGZyb20gY3JlYXRlQWN0aXZpdHlSZW5kZXJlcih7IGFjdGl2aXR5LCBuZXh0VmlzaWJsZUFjdGl2aXR5IH0pIHRvIGNyZWF0ZUFjdGl2aXR5UmVuZGVyZXIoYWN0aXZpdHksIG5leHRWaXNpYmxlQWN0aXZpdHkpLlxuICAvLyBUaGlzIGlzIGZvciB0aGUgbWVtb2l6YXRpb24gZnVuY3Rpb24gdG8gY2FjaGUgdGhlIGFyZ3VtZW50cy4gTWVtb2l6ZXIgY2FuIG9ubHkgY2FjaGUgbGl0ZXJhbCBhcmd1bWVudHMuXG4gIGNvbnN0IGNyZWF0ZUFjdGl2aXR5UmVuZGVyZXJXaXRoTGl0ZXJhbEFyZ3MgPSB1c2VDYWxsYmFjayhcbiAgICAoYWN0aXZpdHksIG5leHRWaXNpYmxlQWN0aXZpdHkpID0+IGNyZWF0ZUFjdGl2aXR5UmVuZGVyZXIoeyBhY3Rpdml0eSwgbmV4dFZpc2libGVBY3Rpdml0eSB9KSxcbiAgICBbY3JlYXRlQWN0aXZpdHlSZW5kZXJlcl1cbiAgKTtcblxuICAvLyBDcmVhdGUgYSBtZW1vaXplZCBjb250ZXh0IG9mIHRoZSBjcmVhdGVBY3Rpdml0eVJlbmRlcmVyIGZ1bmN0aW9uLlxuICBjb25zdCBhY3Rpdml0aWVzV2l0aFJlbmRlcmVyID0gdXNlTWVtb2l6ZShcbiAgICBjcmVhdGVBY3Rpdml0eVJlbmRlcmVyV2l0aExpdGVyYWxBcmdzLFxuICAgIGNyZWF0ZUFjdGl2aXR5UmVuZGVyZXJXaXRoTGl0ZXJhbEFyZ3NNZW1vaXplZCA9PiB7XG4gICAgICAvLyBBbGwgY2FsbHMgdG8gY3JlYXRlQWN0aXZpdHlSZW5kZXJlcldpdGhMaXRlcmFsQXJnc01lbW9pemVkKCkgaW4gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIG1lbW9pemVkIChMUlUgPSAxKS5cbiAgICAgIC8vIEluIHRoZSBuZXh0IHJlbmRlciBjeWNsZSwgY2FsbHMgdG8gY3JlYXRlQWN0aXZpdHlSZW5kZXJlcldpdGhMaXRlcmFsQXJnc01lbW9pemVkKCkgbWlnaHQgcmV0dXJuIHRoZSBtZW1vaXplZCByZXN1bHQgaW5zdGVhZC5cbiAgICAgIC8vIFRoaXMgaXMgYW4gaW1wcm92ZW1lbnQgdG8gUmVhY3QgdXNlTWVtbygpLCBiZWNhdXNlIGl0IG9ubHkgYWxsb3dzIDEgbWVtb2l6YXRpb24uXG4gICAgICAvLyB1c2VNZW1vaXplKCkgYWxsb3dzIGFueSBudW1iZXIgb2YgbWVtb2l6YXRpb24uXG5cbiAgICAgIGNvbnN0IGFjdGl2aXRpZXNXaXRoUmVuZGVyZXIgPSBbXTtcbiAgICAgIGxldCBuZXh0VmlzaWJsZUFjdGl2aXR5O1xuXG4gICAgICBmb3IgKGxldCBpbmRleCA9IGFjdGl2aXRpZXMubGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgaW5kZXgtLSkge1xuICAgICAgICBjb25zdCBhY3Rpdml0eSA9IGFjdGl2aXRpZXNbaW5kZXhdO1xuICAgICAgICBjb25zdCByZW5kZXJBY3Rpdml0eSA9IGNyZWF0ZUFjdGl2aXR5UmVuZGVyZXJXaXRoTGl0ZXJhbEFyZ3NNZW1vaXplZChhY3Rpdml0eSwgbmV4dFZpc2libGVBY3Rpdml0eSk7XG5cbiAgICAgICAgaWYgKHJlbmRlckFjdGl2aXR5KSB7XG4gICAgICAgICAgYWN0aXZpdGllc1dpdGhSZW5kZXJlci5zcGxpY2UoMCwgMCwge1xuICAgICAgICAgICAgYWN0aXZpdHksXG4gICAgICAgICAgICByZW5kZXJBY3Rpdml0eVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbmV4dFZpc2libGVBY3Rpdml0eSA9IGFjdGl2aXR5O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY3Rpdml0aWVzV2l0aFJlbmRlcmVyO1xuICAgIH0sXG4gICAgW2FjdGl2aXRpZXNdXG4gICk7XG5cbiAgY29uc3QgdmlzaWJsZUFjdGl2aXRpZXMgPSB1c2VNZW1vKFxuICAgICgpID0+IGFjdGl2aXRpZXNXaXRoUmVuZGVyZXIubWFwKCh7IGFjdGl2aXR5IH0pID0+IGFjdGl2aXR5KSxcbiAgICBbYWN0aXZpdGllc1dpdGhSZW5kZXJlcl1cbiAgKTtcblxuICAvLyBUYWcgYWN0aXZpdGllcyBiYXNlZCBvbiB0eXBlcy5cbiAgLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdGFnIGludG8gMiB0eXBlczogc2VuZGVyIGFuZCBzdGF0dXMuXG5cbiAgY29uc3QgeyBhY3Rpdml0aWVzR3JvdXBCeVNlbmRlciwgYWN0aXZpdGllc0dyb3VwQnlTdGF0dXMgfSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHsgc2VuZGVyOiBhY3Rpdml0aWVzR3JvdXBCeVNlbmRlciwgc3RhdHVzOiBhY3Rpdml0aWVzR3JvdXBCeVN0YXR1cyB9ID0gZ3JvdXBBY3Rpdml0aWVzKHtcbiAgICAgIGFjdGl2aXRpZXM6IHZpc2libGVBY3Rpdml0aWVzXG4gICAgfSk7XG5cbiAgICBpZiAoIXZhbGlkYXRlQWxsQWN0aXZpdGllc1RhZ2dlZCh2aXNpYmxlQWN0aXZpdGllcywgYWN0aXZpdGllc0dyb3VwQnlTZW5kZXIpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdib3RmcmFtZXdvcmstd2ViY2hhdDogTm90IGV2ZXJ5IGFjdGl2aXRpZXMgYXJlIGdyb3VwZWQgaW4gdGhlIFwic2VuZGVyXCIgcHJvcGVydHkuIFBsZWFzZSBmaXggXCJncm91cEFjdGl2aXRpZXNNaWRkbGV3YXJlXCIgYW5kIGdyb3VwIGV2ZXJ5IGFjdGl2aXRpZXMuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXZhbGlkYXRlQWxsQWN0aXZpdGllc1RhZ2dlZCh2aXNpYmxlQWN0aXZpdGllcywgYWN0aXZpdGllc0dyb3VwQnlTdGF0dXMpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdib3RmcmFtZXdvcmstd2ViY2hhdDogTm90IGV2ZXJ5IGFjdGl2aXRpZXMgYXJlIGdyb3VwZWQgaW4gdGhlIFwic3RhdHVzXCIgcHJvcGVydHkuIFBsZWFzZSBmaXggXCJncm91cEFjdGl2aXRpZXNNaWRkbGV3YXJlXCIgYW5kIGdyb3VwIGV2ZXJ5IGFjdGl2aXRpZXMuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWN0aXZpdGllc0dyb3VwQnlTZW5kZXIsXG4gICAgICBhY3Rpdml0aWVzR3JvdXBCeVN0YXR1c1xuICAgIH07XG4gIH0sIFtncm91cEFjdGl2aXRpZXMsIHZpc2libGVBY3Rpdml0aWVzXSk7XG5cbiAgLy8gQ3JlYXRlIGEgdHJlZSBvZiBhY3Rpdml0aWVzIHdpdGggMiBkaW1lbnNpb25zOiBzZW5kZXIsIGZvbGxvd2VkIGJ5IHN0YXR1cy5cblxuICBjb25zdCBhY3Rpdml0eVRyZWUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCB2aXNpYmxlQWN0aXZpdGllc1BlbmRpbmdHcm91cGluZyA9IFsuLi52aXNpYmxlQWN0aXZpdGllc107XG4gICAgY29uc3QgYWN0aXZpdHlUcmVlID0gW107XG5cbiAgICB3aGlsZSAodmlzaWJsZUFjdGl2aXRpZXNQZW5kaW5nR3JvdXBpbmcubGVuZ3RoKSB7XG4gICAgICBjb25zdCBbYWN0aXZpdHldID0gdmlzaWJsZUFjdGl2aXRpZXNQZW5kaW5nR3JvdXBpbmc7XG4gICAgICBjb25zdCBzZW5kZXJUcmVlID0gW107XG4gICAgICBjb25zdCBhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXIgPSBhY3Rpdml0aWVzR3JvdXBCeVNlbmRlci5maW5kKGFjdGl2aXRpZXMgPT4gYWN0aXZpdGllcy5pbmNsdWRlcyhhY3Rpdml0eSkpO1xuXG4gICAgICBhY3Rpdml0eVRyZWUucHVzaChzZW5kZXJUcmVlKTtcblxuICAgICAgYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyLmZvckVhY2goYWN0aXZpdHkgPT4ge1xuICAgICAgICBjb25zdCBhY3Rpdml0aWVzV2l0aFNhbWVTdGF0dXMgPSBhY3Rpdml0aWVzR3JvdXBCeVN0YXR1cy5maW5kKGFjdGl2aXRpZXMgPT4gYWN0aXZpdGllcy5pbmNsdWRlcyhhY3Rpdml0eSkpO1xuXG4gICAgICAgIGNvbnN0IGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlckFuZFN0YXR1cyA9IGludGVyc2VjdGlvbk9mKFxuICAgICAgICAgIHZpc2libGVBY3Rpdml0aWVzUGVuZGluZ0dyb3VwaW5nLFxuICAgICAgICAgIGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlcixcbiAgICAgICAgICBhY3Rpdml0aWVzV2l0aFNhbWVTdGF0dXNcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyQW5kU3RhdHVzLmxlbmd0aCkge1xuICAgICAgICAgIHNlbmRlclRyZWUucHVzaChhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXJBbmRTdGF0dXMpO1xuICAgICAgICAgIHJlbW92ZUlubGluZSh2aXNpYmxlQWN0aXZpdGllc1BlbmRpbmdHcm91cGluZywgLi4uYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyQW5kU3RhdHVzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQXNzZXJ0aW9uOiBBbGwgYWN0aXZpdGllcyBpbiB2aXNpYmxlQWN0aXZpdGllcywgbXVzdCBiZSBhc3NpZ25lZCB0byB0aGUgYWN0aXZpdHlUcmVlXG4gICAgaWYgKFxuICAgICAgIXZpc2libGVBY3Rpdml0aWVzLmV2ZXJ5KGFjdGl2aXR5ID0+XG4gICAgICAgIGFjdGl2aXR5VHJlZS5zb21lKGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlciA9PlxuICAgICAgICAgIGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlci5zb21lKGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlckFuZFN0YXR1cyA9PlxuICAgICAgICAgICAgYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyQW5kU3RhdHVzLmluY2x1ZGVzKGFjdGl2aXR5KVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICkge1xuICAgICAgY29uc29sZS53YXJuKCdib3RmcmFtZXdvcmstd2ViY2hhdCBpbnRlcm5hbDogTm90IGFsbCB2aXNpYmxlIGFjdGl2aXRpZXMgYXJlIGdyb3VwZWQgaW4gdGhlIGFjdGl2aXR5VHJlZS4nLCB7XG4gICAgICAgIHZpc2libGVBY3Rpdml0aWVzLFxuICAgICAgICBhY3Rpdml0eVRyZWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhY3Rpdml0eVRyZWU7XG4gIH0sIFthY3Rpdml0aWVzR3JvdXBCeVNlbmRlciwgYWN0aXZpdGllc0dyb3VwQnlTdGF0dXMsIHZpc2libGVBY3Rpdml0aWVzXSk7XG5cbiAgLy8gRmxhdHRlbiB0aGUgdHJlZSBiYWNrIGludG8gYW4gYXJyYXkgd2l0aCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHJlbmRlcmluZy5cblxuICBjb25zdCByZW5kZXJpbmdFbGVtZW50cyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHJlbmRlcmluZ0VsZW1lbnRzID0gW107XG4gICAgY29uc3QgdG9wU2lkZUJvdE51YiA9IGlzWmVyb09yUG9zaXRpdmUoYnViYmxlTnViT2Zmc2V0KTtcbiAgICBjb25zdCB0b3BTaWRlVXNlck51YiA9IGlzWmVyb09yUG9zaXRpdmUoYnViYmxlRnJvbVVzZXJOdWJPZmZzZXQpO1xuXG4gICAgYWN0aXZpdHlUcmVlLmZvckVhY2goYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyID0+IHtcbiAgICAgIGNvbnN0IFtbZmlyc3RBY3Rpdml0eV1dID0gYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyO1xuICAgICAgY29uc3QgcmVuZGVyQXZhdGFyID0gY3JlYXRlQXZhdGFyUmVuZGVyZXIoeyBhY3Rpdml0eTogZmlyc3RBY3Rpdml0eSB9KTtcblxuICAgICAgYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyLmZvckVhY2goKGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlckFuZFN0YXR1cywgaW5kZXhXaXRoaW5TZW5kZXJHcm91cCkgPT4ge1xuICAgICAgICBjb25zdCBmaXJzdEluU2VuZGVyR3JvdXAgPSAhaW5kZXhXaXRoaW5TZW5kZXJHcm91cDtcbiAgICAgICAgY29uc3QgbGFzdEluU2VuZGVyR3JvdXAgPSBpbmRleFdpdGhpblNlbmRlckdyb3VwID09PSBhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXIubGVuZ3RoIC0gMTtcblxuICAgICAgICBhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXJBbmRTdGF0dXMuZm9yRWFjaCgoYWN0aXZpdHksIGluZGV4V2l0aGluU2VuZGVyQW5kU3RhdHVzR3JvdXApID0+IHtcbiAgICAgICAgICAvLyBXZSBvbmx5IHNob3cgdGhlIHRpbWVzdGFtcCBhdCB0aGUgZW5kIG9mIHRoZSBzZW5kZXIgZ3JvdXAuIEJ1dCB3ZSBhbHdheXMgc2hvdyB0aGUgXCJTZW5kIGZhaWxlZCwgcmV0cnlcIiBwcm9tcHQuXG4gICAgICAgICAgY29uc3QgcmVuZGVyQWN0aXZpdHlTdGF0dXMgPSBjcmVhdGVBY3Rpdml0eVN0YXR1c1JlbmRlcmVyKHtcbiAgICAgICAgICAgIGFjdGl2aXR5XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCBmaXJzdEluU2VuZGVyQW5kU3RhdHVzR3JvdXAgPSAhaW5kZXhXaXRoaW5TZW5kZXJBbmRTdGF0dXNHcm91cDtcbiAgICAgICAgICBjb25zdCBsYXN0SW5TZW5kZXJBbmRTdGF0dXNHcm91cCA9XG4gICAgICAgICAgICBpbmRleFdpdGhpblNlbmRlckFuZFN0YXR1c0dyb3VwID09PSBhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXJBbmRTdGF0dXMubGVuZ3RoIC0gMTtcblxuICAgICAgICAgIGNvbnN0IHsgcmVuZGVyQWN0aXZpdHkgfSA9IGFjdGl2aXRpZXNXaXRoUmVuZGVyZXIuZmluZChlbnRyeSA9PiBlbnRyeS5hY3Rpdml0eSA9PT0gYWN0aXZpdHkpO1xuICAgICAgICAgIGNvbnN0IGtleSA9IGdldEFjdGl2aXR5VW5pcXVlSWQoYWN0aXZpdHkpIHx8IHJlbmRlcmluZ0VsZW1lbnRzLmxlbmd0aDtcbiAgICAgICAgICBjb25zdCBiYXNlQWx0VGV4dCA9XG4gICAgICAgICAgICB0eXBlb2YgYWN0aXZpdHk/LmNoYW5uZWxEYXRhPy5bJ3dlYmNoYXQ6ZmFsbGJhY2stdGV4dCddID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICA/IGFjdGl2aXR5Py5jaGFubmVsRGF0YT8uWyd3ZWJjaGF0OmZhbGxiYWNrLXRleHQnXVxuICAgICAgICAgICAgICA6IGFjdGl2aXR5Py5jaGFubmVsRGF0YT8ubWVzc2FnZUJhY2s/LmRpc3BsYXlUZXh0IHx8IGFjdGl2aXR5LnRleHQ7XG5cbiAgICAgICAgICAvLyBJZiBcIndlYmNoYXQ6ZmFsbGJhY2stdGV4dFwiIGZpZWxkIGlzIHNldCB0byBlbXB0eSBzdHJpbmcsIHRoZSBhY3Rpdml0eSBtdXN0IG5vdCBiZSBuYXJyYXRlZC5cbiAgICAgICAgICBjb25zdCBzdXBwb3J0U2NyZWVuUmVhZGVyID0gYWN0aXZpdHk/LmNoYW5uZWxEYXRhPy5bJ3dlYmNoYXQ6ZmFsbGJhY2stdGV4dCddICE9PSAnJztcblxuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGZyb206IHsgcm9sZSB9XG4gICAgICAgICAgfSA9IGFjdGl2aXR5O1xuXG4gICAgICAgICAgY29uc3QgdG9wU2lkZU51YiA9IHJvbGUgPT09ICd1c2VyJyA/IHRvcFNpZGVVc2VyTnViIDogdG9wU2lkZUJvdE51YjtcblxuICAgICAgICAgIGxldCBzaG93Q2FsbG91dDtcblxuICAgICAgICAgIC8vIERlcGVuZGluZyBvbiB0aGUgXCJzaG93QXZhdGFySW5Hcm91cFwiIHNldHRpbmcsIHRoZSBhdmF0YXIgd2lsbCByZW5kZXIgaW4gZGlmZmVyZW50IHBvc2l0aW9ucy5cbiAgICAgICAgICBpZiAoc2hvd0F2YXRhckluR3JvdXAgPT09ICdzZW5kZXInKSB7XG4gICAgICAgICAgICBpZiAodG9wU2lkZU51Yikge1xuICAgICAgICAgICAgICBzaG93Q2FsbG91dCA9IGZpcnN0SW5TZW5kZXJHcm91cCAmJiBmaXJzdEluU2VuZGVyQW5kU3RhdHVzR3JvdXA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzaG93Q2FsbG91dCA9IGxhc3RJblNlbmRlckdyb3VwICYmIGxhc3RJblNlbmRlckFuZFN0YXR1c0dyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoc2hvd0F2YXRhckluR3JvdXAgPT09ICdzdGF0dXMnKSB7XG4gICAgICAgICAgICBpZiAodG9wU2lkZU51Yikge1xuICAgICAgICAgICAgICBzaG93Q2FsbG91dCA9IGZpcnN0SW5TZW5kZXJBbmRTdGF0dXNHcm91cDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNob3dDYWxsb3V0ID0gbGFzdEluU2VuZGVyQW5kU3RhdHVzR3JvdXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNob3dDYWxsb3V0ID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBmb2N1c0FjdGl2aXR5ID0gKCkgPT4ge1xuICAgICAgICAgICAgc2V0Rm9jdXNlZEFjdGl2aXR5S2V5KGdldEFjdGl2aXR5VW5pcXVlSWQoYWN0aXZpdHkpKTtcblxuICAgICAgICAgICAgLy8gSUUxMSBuZWVkIHRvIG1hbnVhbGx5IGZvY3VzIG9uIHRoZSB0cmFuc2NyaXB0LlxuICAgICAgICAgICAgY29uc3QgeyBjdXJyZW50OiByb290RWxlbWVudCB9ID0gcm9vdEVsZW1lbnRSZWY7XG5cbiAgICAgICAgICAgIHJvb3RFbGVtZW50ICYmIHJvb3RFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHJlbmRlcmluZ0VsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgYWN0aXZpdHksXG5cbiAgICAgICAgICAgIC8vIEFmdGVyIHRoZSBlbGVtZW50IGlzIG1vdW50ZWQsIHNldCBpdCB0byBhY3Rpdml0eUVsZW1lbnRzUmVmLlxuICAgICAgICAgICAgY2FsbGJhY2tSZWY6IGFjdGl2aXR5RWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gYWN0aXZpdHlFbGVtZW50c1JlZi5jdXJyZW50LmZpbmQoKHsgYWN0aXZpdHlJRCB9KSA9PiBhY3Rpdml0eUlEID09PSBhY3Rpdml0eS5pZCk7XG5cbiAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgZW50cnkuZWxlbWVudCA9IGFjdGl2aXR5RWxlbWVudDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgcHV0IHRoZSBmb2N1cyBvbiB0aGUgdHJhbnNjcmlwdCBhbmQgdGhlIGFjdGl2aXR5LlxuICAgICAgICAgICAgZm9jdXNBY3Rpdml0eSxcblxuICAgICAgICAgICAgLy8gV2hlbiBhIGNoaWxkIG9mIHRoZSBhY3Rpdml0eSByZWNlaXZlcyBmb2N1cywgbm90aWZ5IHRoZSB0cmFuc2NyaXB0IHRvIHNldCB0aGUgYXJpYS1hY3RpdmVkZXNjZW5kYW50IHRvIHRoaXMgYWN0aXZpdHkuXG4gICAgICAgICAgICBoYW5kbGVGb2N1czogKCkgPT4ge1xuICAgICAgICAgICAgICBzZXRGb2N1c2VkQWN0aXZpdHlLZXkoZ2V0QWN0aXZpdHlVbmlxdWVJZChhY3Rpdml0eSkpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgaGFuZGxlS2V5RG93bjogZXZlbnQgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICBzZXRGb2N1c2VkQWN0aXZpdHlLZXkoZ2V0QWN0aXZpdHlVbmlxdWVJZChhY3Rpdml0eSkpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgeyBjdXJyZW50IH0gPSByb290RWxlbWVudFJlZjtcblxuICAgICAgICAgICAgICAgIGN1cnJlbnQgJiYgY3VycmVudC5mb2N1cygpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBGb3IgYWNjZXNzaWJpbGl0eTogd2hlbiB0aGUgdXNlciBwcmVzcyB1cC9kb3duIGFycm93IGtleXMsIHdlIHB1dCBhIHZpc3VhbCBmb2N1cyBpbmRpY2F0b3IgYXJvdW5kIHRoZSBmb2N1c2VkIGFjdGl2aXR5LlxuICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGRvIHRoZSBzYW1lIGZvciBtb3VzZSwgdGhhdCBpcyB3aHkgd2UgaGF2ZSB0aGUgY2xpY2sgaGFuZGxlciBoZXJlLlxuICAgICAgICAgICAgLy8gV2UgYXJlIGRvaW5nIGl0IGluIGV2ZW50IGNhcHR1cmUgcGhhc2UgdG8gcHJldmVudCBvdGhlciBjb21wb25lbnRzIGZyb20gc3RvcHBpbmcgZXZlbnQgcHJvcGFnYXRpb24gdG8gdXMuXG4gICAgICAgICAgICBoYW5kbGVNb3VzZURvd25DYXB0dXJlOiAoeyB0YXJnZXQgfSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0YWJJbmRleCA9IGdldFRhYkluZGV4KHRhcmdldCk7XG5cbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0YWJJbmRleCAhPT0gJ251bWJlcicgfHwgdGFiSW5kZXggPCAwIHx8IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNBY3Rpdml0eSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBcImhpZGVUaW1lc3RhbXBcIiBpcyBhIHJlbmRlci10aW1lIHBhcmFtZXRlciBmb3IgcmVuZGVyQWN0aXZpdHlTdGF0dXMoKS5cbiAgICAgICAgICAgIC8vIElmIHRydWUsIGl0IHdpbGwgaGlkZSB0aGUgdGltZXN0YW1wLCBidXQgaXQgd2lsbCBjb250aW51ZSB0byBzaG93IHRoZVxuICAgICAgICAgICAgLy8gcmV0cnkgcHJvbXB0LiBBbmQgc2hvdyB0aGUgc2NyZWVuIHJlYWRlciB2ZXJzaW9uIG9mIHRoZSB0aW1lc3RhbXAuXG4gICAgICAgICAgICBoaWRlVGltZXN0YW1wOlxuICAgICAgICAgICAgICBoaWRlQWxsVGltZXN0YW1wcyB8fCBpbmRleFdpdGhpblNlbmRlckFuZFN0YXR1c0dyb3VwICE9PSBhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXJBbmRTdGF0dXMubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgIGtleSxcblxuICAgICAgICAgICAgLy8gV2hlbiBcImxpdmVSZWdpb25LZXlcIiBjaGFuZ2VzIG9yIGNvbnRlbnRzIHRoYXQgbWFkZSB1cCB0aGUgYWx0IHRleHQgY2hhbmdlZCwgaXQgd2lsbCBzaG93IHVwIGluIHRoZSBsaXZlIHJlZ2lvbiBtb21lbnRhcmlseS5cbiAgICAgICAgICAgIGxpdmVSZWdpb25LZXk6IGtleSArICd8JyArIGJhc2VBbHRUZXh0LFxuICAgICAgICAgICAgcmVuZGVyQWN0aXZpdHksXG4gICAgICAgICAgICByZW5kZXJBY3Rpdml0eVN0YXR1cyxcbiAgICAgICAgICAgIHJlbmRlckF2YXRhcixcbiAgICAgICAgICAgIHJvbGUsXG5cbiAgICAgICAgICAgIC8vIFRPRE86IFtQMl0gIzI4NTggV2Ugc2hvdWxkIHVzZSBjb3JlL2RlZmluaXRpb25zL3NwZWFraW5nQWN0aXZpdHkgZm9yIHRoaXMgcHJlZGljYXRlIGluc3RlYWRcbiAgICAgICAgICAgIHNob3VsZFNwZWFrOiBhY3Rpdml0eS5jaGFubmVsRGF0YSAmJiBhY3Rpdml0eS5jaGFubmVsRGF0YS5zcGVhayxcbiAgICAgICAgICAgIHNob3dDYWxsb3V0LFxuICAgICAgICAgICAgc3VwcG9ydFNjcmVlblJlYWRlclxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgeyBjdXJyZW50OiBhY3Rpdml0eUVsZW1lbnRzIH0gPSBhY3Rpdml0eUVsZW1lbnRzUmVmO1xuXG4gICAgLy8gVXBkYXRlIGFjdGl2aXR5RWxlbWVudFJlZiB3aXRoIG5ldyBzZXRzIG9mIGFjdGl2aXR5LCB3aGlsZSByZXRhaW5pbmcgdGhlIGV4aXN0aW5nIHJlZmVyZW5jaW5nIGVsZW1lbnQgaWYgZXhpc3RzLlxuICAgIGFjdGl2aXR5RWxlbWVudHNSZWYuY3VycmVudCA9IHJlbmRlcmluZ0VsZW1lbnRzLm1hcCgoeyBhY3Rpdml0eSwgYWN0aXZpdHk6IHsgaWQgfSwgZWxlbWVudElkLCBrZXkgfSkgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmdFbnRyeSA9IGFjdGl2aXR5RWxlbWVudHMuZmluZChlbnRyeSA9PiBlbnRyeS5rZXkgPT09IGtleSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFjdGl2aXR5LFxuICAgICAgICBhY3Rpdml0eUlEOiBpZCxcbiAgICAgICAgYXJpYUxhYmVsSUQ6IGV4aXN0aW5nRW50cnlcbiAgICAgICAgICA/IGV4aXN0aW5nRW50cnkuYXJpYUxhYmVsSURcbiAgICAgICAgICA6IGB3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19hY3Rpdml0eS1sYWJlbC0ke3JhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgNSl9YCxcbiAgICAgICAgZWxlbWVudDogZXhpc3RpbmdFbnRyeSAmJiBleGlzdGluZ0VudHJ5LmVsZW1lbnQsXG4gICAgICAgIGVsZW1lbnRJZCxcbiAgICAgICAga2V5XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gVGhlcmUgbXVzdCBiZSBvbmUgZm9jdXNlZCAoYS5rLmEuIGFyaWEtYWN0aXZlZGVzY2VuZGFudCkgZGVzaWduYXRlZC4gV2UgZGVmYXVsdCBpdCB0byB0aGUgbGFzdCBvbmUuXG4gICAgaWYgKCFyZW5kZXJpbmdFbGVtZW50cy5maW5kKCh7IGZvY3VzZWQgfSkgPT4gZm9jdXNlZCkpIHtcbiAgICAgIGNvbnN0IGxhc3RFbGVtZW50ID0gcmVuZGVyaW5nRWxlbWVudHNbcmVuZGVyaW5nRWxlbWVudHMubGVuZ3RoIC0gMV07XG5cbiAgICAgIGlmIChsYXN0RWxlbWVudCkge1xuICAgICAgICBsYXN0RWxlbWVudC5mb2N1c2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVuZGVyaW5nRWxlbWVudHM7XG4gIH0sIFtcbiAgICBhY3Rpdml0aWVzV2l0aFJlbmRlcmVyLFxuICAgIGFjdGl2aXR5RWxlbWVudHNSZWYsXG4gICAgYWN0aXZpdHlUcmVlLFxuICAgIGJ1YmJsZUZyb21Vc2VyTnViT2Zmc2V0LFxuICAgIGJ1YmJsZU51Yk9mZnNldCxcbiAgICBjcmVhdGVBY3Rpdml0eVN0YXR1c1JlbmRlcmVyLFxuICAgIGNyZWF0ZUF2YXRhclJlbmRlcmVyLFxuICAgIGhpZGVBbGxUaW1lc3RhbXBzLFxuICAgIHJvb3RFbGVtZW50UmVmLFxuICAgIHNob3dBdmF0YXJJbkdyb3VwXG4gIF0pO1xuXG4gIGNvbnN0IHJlbmRlcmluZ0FjdGl2aXRpZXMgPSB1c2VNZW1vKCgpID0+IHJlbmRlcmluZ0VsZW1lbnRzLm1hcCgoeyBhY3Rpdml0eSB9KSA9PiBhY3Rpdml0eSksIFtyZW5kZXJpbmdFbGVtZW50c10pO1xuXG4gIGNvbnN0IHNjcm9sbFRvQm90dG9tU2Nyb2xsVG8gPSB1c2VTY3JvbGxUbygpO1xuICBjb25zdCBzY3JvbGxUb0JvdHRvbVNjcm9sbFRvRW5kID0gdXNlU2Nyb2xsVG9FbmQoKTtcblxuICBjb25zdCBzY3JvbGxUbyA9IHVzZUNhbGxiYWNrKFxuICAgIChwb3NpdGlvbiwgeyBiZWhhdmlvciA9ICdhdXRvJyB9ID0ge30pID0+IHtcbiAgICAgIGlmICghcG9zaXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdib3RmcmFtZXdvcmstd2ViY2hhdDogRmlyc3QgYXJndW1lbnQgcGFzc2VkIHRvIFwidXNlU2Nyb2xsVG9cIiBtdXN0IGJlIGEgU2Nyb2xsUG9zaXRpb24gb2JqZWN0LidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBhY3Rpdml0eUlELCBzY3JvbGxUb3AgfSA9IHBvc2l0aW9uO1xuXG4gICAgICBpZiAodHlwZW9mIHNjcm9sbFRvcCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc2Nyb2xsVG9Cb3R0b21TY3JvbGxUbyhzY3JvbGxUb3AsIHsgYmVoYXZpb3IgfSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhY3Rpdml0eUlEICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb25zdCB7IGN1cnJlbnQ6IHJvb3RFbGVtZW50IH0gPSByb290RWxlbWVudFJlZjtcbiAgICAgICAgY29uc3QgeyBlbGVtZW50OiBhY3Rpdml0eUVsZW1lbnQgfSA9XG4gICAgICAgICAgYWN0aXZpdHlFbGVtZW50c1JlZi5jdXJyZW50LmZpbmQoZW50cnkgPT4gZW50cnkuYWN0aXZpdHlJRCA9PT0gYWN0aXZpdHlJRCkgfHwge307XG5cbiAgICAgICAgY29uc3Qgc2Nyb2xsYWJsZUVsZW1lbnQgPSByb290RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcud2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fc2Nyb2xsYWJsZScpO1xuXG4gICAgICAgIGlmIChzY3JvbGxhYmxlRWxlbWVudCAmJiBhY3Rpdml0eUVsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCBbeyBoZWlnaHQ6IGFjdGl2aXR5RWxlbWVudEhlaWdodCwgeTogYWN0aXZpdHlFbGVtZW50WSB9XSA9IGFjdGl2aXR5RWxlbWVudC5nZXRDbGllbnRSZWN0cygpO1xuICAgICAgICAgIGNvbnN0IFt7IGhlaWdodDogc2Nyb2xsYWJsZUhlaWdodCB9XSA9IHNjcm9sbGFibGVFbGVtZW50LmdldENsaWVudFJlY3RzKCk7XG5cbiAgICAgICAgICBjb25zdCBhY3Rpdml0eUVsZW1lbnRPZmZzZXRUb3AgPSBhY3Rpdml0eUVsZW1lbnRZICsgc2Nyb2xsYWJsZUVsZW1lbnQuc2Nyb2xsVG9wO1xuXG4gICAgICAgICAgY29uc3Qgc2Nyb2xsVG9wID0gTWF0aC5taW4oXG4gICAgICAgICAgICBhY3Rpdml0eUVsZW1lbnRPZmZzZXRUb3AsXG4gICAgICAgICAgICBhY3Rpdml0eUVsZW1lbnRPZmZzZXRUb3AgLSBzY3JvbGxhYmxlSGVpZ2h0ICsgYWN0aXZpdHlFbGVtZW50SGVpZ2h0XG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHNjcm9sbFRvQm90dG9tU2Nyb2xsVG8oc2Nyb2xsVG9wLCB7IGJlaGF2aW9yIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbYWN0aXZpdHlFbGVtZW50c1JlZiwgcm9vdEVsZW1lbnRSZWYsIHNjcm9sbFRvQm90dG9tU2Nyb2xsVG9dXG4gICk7XG5cbiAgY29uc3Qgc2Nyb2xsVG9FbmQgPSB1c2VDYWxsYmFjaygoKSA9PiBzY3JvbGxUb0JvdHRvbVNjcm9sbFRvRW5kKHsgYmVoYXZpb3I6ICdzbW9vdGgnIH0pLCBbc2Nyb2xsVG9Cb3R0b21TY3JvbGxUb0VuZF0pO1xuXG4gIGNvbnN0IHNjcm9sbFJlbGF0aXZlID0gdXNlQ2FsbGJhY2soXG4gICAgKGRpcmVjdGlvbiwgeyBkaXNwbGFjZW1lbnQgfSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB7IGN1cnJlbnQ6IHJvb3RFbGVtZW50IH0gPSByb290RWxlbWVudFJlZjtcblxuICAgICAgaWYgKCFyb290RWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNjcm9sbGFibGUgPSByb290RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcud2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fc2Nyb2xsYWJsZScpO1xuICAgICAgbGV0IG5leHRTY3JvbGxUb3A7XG5cbiAgICAgIGlmICh0eXBlb2YgZGlzcGxhY2VtZW50ID09PSAnbnVtYmVyJykge1xuICAgICAgICBuZXh0U2Nyb2xsVG9wID0gc2Nyb2xsYWJsZS5zY3JvbGxUb3AgKyAoZGlyZWN0aW9uID09PSAnZG93bicgPyAxIDogLTEpICogZGlzcGxhY2VtZW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dFNjcm9sbFRvcCA9IHNjcm9sbGFibGUuc2Nyb2xsVG9wICsgKGRpcmVjdGlvbiA9PT0gJ2Rvd24nID8gMSA6IC0xKSAqIHNjcm9sbGFibGUub2Zmc2V0SGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICBzY3JvbGxUbyhcbiAgICAgICAge1xuICAgICAgICAgIHNjcm9sbFRvcDogTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Nyb2xsYWJsZS5zY3JvbGxIZWlnaHQgLSBzY3JvbGxhYmxlLm9mZnNldEhlaWdodCwgbmV4dFNjcm9sbFRvcCkpXG4gICAgICAgIH0sXG4gICAgICAgIHsgYmVoYXZpb3I6ICdzbW9vdGgnIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICBbcm9vdEVsZW1lbnRSZWYsIHNjcm9sbFRvXVxuICApO1xuXG4gIC8vIFNpbmNlIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGluc3RhbmNlcyBvZiA8QmFzaWNUcmFuc2NyaXB0PiBpbnNpZGUgdGhlIDxDb21wb3Nlcj4sIHdoZW4gdGhlIGRldmVsb3BlciBjYWxscyBgc2Nyb2xsWFhYYCwgd2UgbmVlZCB0byBjYWxsIGl0IG9uIGFsbCBpbnN0YW5jZXMuXG4gIC8vIFdlIGNhbGwgYHVzZVJlZ2lzdGVyU2Nyb2xsWFhYYCB0byByZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uLCB0aGUgYHVzZVNjcm9sbFhYWGAgd2lsbCBtdWx0aXBsZXggdGhlIGNhbGwgaW50byBlYWNoIGluc3RhbmNlIG9mIDxCYXNpY1RyYW5zY3JpcHQ+LlxuICB1c2VSZWdpc3RlclNjcm9sbFRvKHNjcm9sbFRvKTtcbiAgdXNlUmVnaXN0ZXJTY3JvbGxUb0VuZChzY3JvbGxUb0VuZCk7XG4gIHVzZVJlZ2lzdGVyU2Nyb2xsUmVsYXRpdmUoc2Nyb2xsUmVsYXRpdmUpO1xuXG4gIGNvbnN0IGRpc3BhdGNoU2Nyb2xsUG9zaXRpb24gPSB1c2VEaXNwYXRjaFNjcm9sbFBvc2l0aW9uKCk7XG4gIGNvbnN0IHBhdGNoZWREaXNwYXRjaFNjcm9sbFBvc2l0aW9uID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFkaXNwYXRjaFNjcm9sbFBvc2l0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuICh7IHNjcm9sbFRvcCB9KSA9PiB7XG4gICAgICBjb25zdCB7IGN1cnJlbnQ6IHJvb3RFbGVtZW50IH0gPSByb290RWxlbWVudFJlZjtcblxuICAgICAgaWYgKCFyb290RWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNjcm9sbGFibGVFbGVtZW50ID0gcm9vdEVsZW1lbnQucXVlcnlTZWxlY3RvcignLndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX3Njcm9sbGFibGUnKTtcblxuICAgICAgY29uc3QgW3sgaGVpZ2h0OiBvZmZzZXRIZWlnaHQgfSA9IHt9XSA9IHNjcm9sbGFibGVFbGVtZW50LmdldENsaWVudFJlY3RzKCk7XG5cbiAgICAgIC8vIEZpbmQgdGhlIGFjdGl2aXR5IGp1c3QgYWJvdmUgc2Nyb2xsIHZpZXcgYm90dG9tLlxuICAgICAgLy8gSWYgdGhlIHNjcm9sbCB2aWV3IGlzIGFscmVhZHkgb24gdG9wLCBnZXQgdGhlIGZpcnN0IGFjdGl2aXR5LlxuICAgICAgY29uc3QgZW50cnkgPSBzY3JvbGxhYmxlRWxlbWVudC5zY3JvbGxUb3BcbiAgICAgICAgPyBbLi4uYWN0aXZpdHlFbGVtZW50c1JlZi5jdXJyZW50XS5yZXZlcnNlKCkuZmluZCgoeyBlbGVtZW50IH0pID0+IHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IFt7IHkgfSA9IHt9XSA9IGVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKTtcblxuICAgICAgICAgICAgcmV0dXJuIHkgPCBvZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgfSlcbiAgICAgICAgOiBhY3Rpdml0eUVsZW1lbnRzUmVmLmN1cnJlbnRbMF07XG5cbiAgICAgIGNvbnN0IHsgYWN0aXZpdHlJRCB9ID0gZW50cnkgfHwge307XG5cbiAgICAgIGRpc3BhdGNoU2Nyb2xsUG9zaXRpb24oeyAuLi4oYWN0aXZpdHlJRCA/IHsgYWN0aXZpdHlJRCB9IDoge30pLCBzY3JvbGxUb3AgfSk7XG4gICAgfTtcbiAgfSwgW2FjdGl2aXR5RWxlbWVudHNSZWYsIGRpc3BhdGNoU2Nyb2xsUG9zaXRpb24sIHJvb3RFbGVtZW50UmVmXSk7XG5cbiAgdXNlT2JzZXJ2ZVNjcm9sbFBvc2l0aW9uKHBhdGNoZWREaXNwYXRjaFNjcm9sbFBvc2l0aW9uKTtcblxuICBjb25zdCBbbGFzdEludGVyYWN0ZWRBY3Rpdml0eV0gPSB1c2VBY2tub3dsZWRnZWRBY3Rpdml0eSgpO1xuXG4gIGNvbnN0IGluZGV4T2ZMYXN0SW50ZXJhY3RlZEFjdGl2aXR5ID0gYWN0aXZpdGllcy5pbmRleE9mKGxhc3RJbnRlcmFjdGVkQWN0aXZpdHkpO1xuXG4gIC8vIENyZWF0ZSBhIG5ldyBJRCBmb3IgYXJpYS1hY3RpdmVkZXNjZW5kYW50IGV2ZXJ5IHRpbWUgdGhlIGFjdGl2ZSBkZXNjZW5kYW50IGNoYW5nZS5cbiAgLy8gSW4gb3VyIGRlc2lnbiwgdGhlIHRyYW5zY3JpcHQgd2lsbCBvbmx5IGhhdmUgMSBmb2N1c2VkIGFjdGl2aXR5IGFuZCBpdCBoYXMgYW4gSUQuIE90aGVyIGJsdXJyZWQgYWN0aXZpdGllcyB3aWxsIG5vdCBoYXZlIElEIGFzc2lnbmVkLlxuICAvLyBUaGlzIGhlbHAgd2l0aCBwZXJmb3JtYW5jZS5cbiAgLy8gQnV0IGJyb3dzZXIgdXN1YWxseSBkbyBub29wIGlmIHRoZSB2YWx1ZSBvZiBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQgZG9lc24ndCBjaGFuZ2UuXG4gIC8vIFRoYXQgbWVhbnMsIGlmIHdlIGFzc2lnbiB0aGUgc2FtZSBJRCB0byBhbm90aGVyIGVsZW1lbnQsIGJyb3dzZXIgd2lsbCBkbyBub29wLlxuICAvLyBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgbmV3IElEIHNvIHRoZSBicm93c2VyIHNlZSB0aGVyZSBpcyBhIGNoYW5nZSBpbiBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQgdmFsdWUgYW5kIHBlcmZvcm0gYWNjb3JkaW5nbHkuXG4gIGNvbnN0IGFjdGl2ZURlc2NlbmRhbnRFbGVtZW50SWQgPSB1c2VNZW1vKFxuICAgICgpID0+IGZvY3VzZWRBY3Rpdml0eUtleSAmJiBgd2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZlLWRlc2NlbmRhbnQtJHtyYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDUpfWAsXG4gICAgW2ZvY3VzZWRBY3Rpdml0eUtleV1cbiAgKTtcblxuICBjb25zdCBzY3JvbGxBY3RpdmVEZXNjZW5kYW50SW50b1ZpZXcgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgYWN0aXZlRGVzY2VuZGFudCA9IGFjdGl2ZURlc2NlbmRhbnRFbGVtZW50SWQgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYWN0aXZlRGVzY2VuZGFudEVsZW1lbnRJZCk7XG5cbiAgICAvLyBEb24ndCBzY3JvbGwgYWN0aXZlIGRlc2NlbmRhbnQgaW50byB2aWV3IGlmIHRoZSBmb2N1cyBpcyBhbHJlYWR5IGluc2lkZSBpdC5cbiAgICAvLyBPdGhlcndpc2UsIGdpdmVuIHRoZSBmb2N1cyBpcyBvbiB0aGUgc2VuZCBib3gsIGNsaWNraW5nIG9uIGFueSA8aW5wdXQ+IGluc2lkZSB0aGUgQWRhcHRpdmUgQ2FyZHMgbWF5IGNhdXNlIHRoZSB2aWV3IHRvIG1vdmUuXG4gICAgLy8gVGhpcyBVWCBpcyBub3QgZGVzaXJhYmxlIGJlY2F1c2UgY2xpY2sgc2hvdWxkIG5vdCBjYXVzZSBzY3JvbGwuXG4gICAgaWYgKGFjdGl2ZURlc2NlbmRhbnQgJiYgIWFjdGl2ZURlc2NlbmRhbnQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgIC8vIENoZWNrcyBpZiBzY3JvbGxJbnRvVmlldyBzdXBwb3J0IG9wdGlvbnMgb3Igbm90LlxuICAgICAgLy8gLSBodHRwczovL2dpdGh1Yi5jb20vTW9kZXJuaXpyL01vZGVybml6ci9pc3N1ZXMvMTU2OCNpc3N1ZWNvbW1lbnQtNDE5NDU3OTcyXG4gICAgICAvLyAtIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ2OTE5NjI3L2lzLWl0LXBvc3NpYmxlLXRvLXRlc3QtZm9yLXNjcm9sbGludG92aWV3LWJyb3dzZXItY29tcGF0aWJpbGl0eVxuICAgICAgaWYgKCdzY3JvbGxCZWhhdmlvcicgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlKSB7XG4gICAgICAgIGFjdGl2ZURlc2NlbmRhbnQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBpcyBmb3IgYnJvd3NlciB0aGF0IGRvZXMgbm90IHN1cHBvcnQgb3B0aW9ucyBwYXNzZWQgdG8gc2Nyb2xsSW50b1ZpZXcoKSwgcG9zc2libHkgSUUxMS5cbiAgICAgICAgY29uc3Qgc2Nyb2xsYWJsZUVsZW1lbnQgPSByb290RWxlbWVudFJlZi5jdXJyZW50LnF1ZXJ5U2VsZWN0b3IoJy53ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19zY3JvbGxhYmxlJyk7XG4gICAgICAgIGNvbnN0IHNjcm9sbFRvcEF0VG9wU2lkZSA9IGFjdGl2ZURlc2NlbmRhbnQub2Zmc2V0VG9wO1xuICAgICAgICBjb25zdCBzY3JvbGxUb3BBdEJvdHRvbVNpZGUgPSBhY3RpdmVEZXNjZW5kYW50Lm9mZnNldFRvcCArIGFjdGl2ZURlc2NlbmRhbnQub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICAgIGlmIChzY3JvbGxUb3BBdFRvcFNpZGUgPCBzY3JvbGxhYmxlRWxlbWVudC5zY3JvbGxUb3ApIHtcbiAgICAgICAgICBzY3JvbGxhYmxlRWxlbWVudC5zY3JvbGxUb3AgPSBzY3JvbGxUb3BBdFRvcFNpZGU7XG4gICAgICAgIH0gZWxzZSBpZiAoc2Nyb2xsVG9wQXRCb3R0b21TaWRlID4gc2Nyb2xsYWJsZUVsZW1lbnQuc2Nyb2xsVG9wICsgc2Nyb2xsYWJsZUVsZW1lbnQub2Zmc2V0SGVpZ2h0KSB7XG4gICAgICAgICAgc2Nyb2xsYWJsZUVsZW1lbnQuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wQXRCb3R0b21TaWRlIC0gc2Nyb2xsYWJsZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCBbYWN0aXZlRGVzY2VuZGFudEVsZW1lbnRJZCwgcm9vdEVsZW1lbnRSZWZdKTtcblxuICBjb25zdCBoYW5kbGVUcmFuc2NyaXB0Rm9jdXMgPSB1c2VDYWxsYmFjayhcbiAgICBldmVudCA9PiB7XG4gICAgICBjb25zdCB7IGN1cnJlbnRUYXJnZXQsIHRhcmdldCB9ID0gZXZlbnQ7XG5cbiAgICAgIC8vIFdoZW4gZm9jdXMgaXMgcGxhY2VkIG9uIHRoZSB0cmFuc2NyaXB0LCBzY3JvbGwgYWN0aXZlIGRlc2NlbmRhbnQgaW50byB0aGUgdmlldy5cbiAgICAgIGN1cnJlbnRUYXJnZXQgPT09IHRhcmdldCAmJiBzY3JvbGxBY3RpdmVEZXNjZW5kYW50SW50b1ZpZXcoKTtcbiAgICB9LFxuICAgIFtzY3JvbGxBY3RpdmVEZXNjZW5kYW50SW50b1ZpZXddXG4gICk7XG5cbiAgLy8gQWZ0ZXIgbmV3IGFyaWEtYWN0aXZlZGVzY2VuZGFudCBpcyBhc3NpZ25lZCwgd2Ugd2lsbCBuZWVkIHRvIHNjcm9sbCBpdCBpbnRvIHZpZXcuXG4gIC8vIFVzZXIgYWdlbnQgd2lsbCBzY3JvbGwgYXV0b21hdGljYWxseSBmb3IgZm9jdXNpbmcgZWxlbWVudCwgYnV0IG5vdCBmb3IgYXJpYS1hY3RpdmVkZXNjZW5kYW50LlxuICAvLyBXZSBuZWVkIHRvIGRvIHRoZSBzY3JvbGxpbmcgbWFudWFsbHkuXG4gIHVzZUVmZmVjdCgoKSA9PiBzY3JvbGxBY3RpdmVEZXNjZW5kYW50SW50b1ZpZXcoKSwgW3Njcm9sbEFjdGl2ZURlc2NlbmRhbnRJbnRvVmlld10pO1xuXG4gIC8vIElmIGFueSBhY3Rpdml0aWVzIGhhcyBjaGFuZ2VkLCByZXNldCB0aGUgYWN0aXZlIGRlc2NlbmRhbnQuXG4gIHVzZUVmZmVjdCgoKSA9PiBzZXRGb2N1c2VkQWN0aXZpdHlLZXkodW5kZWZpbmVkKSwgW2FjdGl2aXRpZXMsIHNldEZvY3VzZWRBY3Rpdml0eUtleV0pO1xuXG4gIGNvbnN0IGZvY3VzUmVsYXRpdmVBY3Rpdml0eSA9IHVzZUNhbGxiYWNrKFxuICAgIGRlbHRhID0+IHtcbiAgICAgIGlmIChpc05hTihkZWx0YSkgfHwgIXJlbmRlcmluZ0VsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc2V0Rm9jdXNlZEFjdGl2aXR5S2V5KHVuZGVmaW5lZCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluZGV4ID0gcmVuZGVyaW5nRWxlbWVudHMuZmluZEluZGV4KCh7IGtleSB9KSA9PiBrZXkgPT09IGZvY3VzZWRBY3Rpdml0eUtleSk7XG4gICAgICBjb25zdCBuZXh0SW5kZXggPSB+aW5kZXhcbiAgICAgICAgPyBNYXRoLm1heCgwLCBNYXRoLm1pbihyZW5kZXJpbmdFbGVtZW50cy5sZW5ndGggLSAxLCBpbmRleCArIGRlbHRhKSlcbiAgICAgICAgOiByZW5kZXJpbmdFbGVtZW50cy5sZW5ndGggLSAxO1xuICAgICAgY29uc3QgbmV4dEZvY3VzZWRBY3Rpdml0eSA9IHJlbmRlcmluZ0VsZW1lbnRzW25leHRJbmRleF07XG5cbiAgICAgIHNldEZvY3VzZWRBY3Rpdml0eUtleShuZXh0Rm9jdXNlZEFjdGl2aXR5LmtleSk7XG4gICAgICByb290RWxlbWVudFJlZi5jdXJyZW50ICYmIHJvb3RFbGVtZW50UmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICB9LFxuICAgIFtmb2N1c2VkQWN0aXZpdHlLZXksIHJlbmRlcmluZ0VsZW1lbnRzLCByb290RWxlbWVudFJlZiwgc2V0Rm9jdXNlZEFjdGl2aXR5S2V5XVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZVRyYW5zY3JpcHRLZXlEb3duID0gdXNlQ2FsbGJhY2soXG4gICAgZXZlbnQgPT4ge1xuICAgICAgY29uc3QgeyB0YXJnZXQgfSA9IGV2ZW50O1xuXG4gICAgICBjb25zdCBmcm9tRW5kT2ZUcmFuc2NyaXB0SW5kaWNhdG9yID0gdGFyZ2V0ID09PSB0ZXJtaW5hdG9yUmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCBmcm9tVHJhbnNjcmlwdCA9IHRhcmdldCA9PT0gZXZlbnQuY3VycmVudFRhcmdldDtcblxuICAgICAgaWYgKCFmcm9tRW5kT2ZUcmFuc2NyaXB0SW5kaWNhdG9yICYmICFmcm9tVHJhbnNjcmlwdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBoYW5kbGVkID0gdHJ1ZTtcblxuICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICBmb2N1c1JlbGF0aXZlQWN0aXZpdHkoZnJvbUVuZE9mVHJhbnNjcmlwdEluZGljYXRvciA/IDAgOiAxKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgICBmb2N1c1JlbGF0aXZlQWN0aXZpdHkoZnJvbUVuZE9mVHJhbnNjcmlwdEluZGljYXRvciA/IDAgOiAtMSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnRW5kJzpcbiAgICAgICAgICBmb2N1c1JlbGF0aXZlQWN0aXZpdHkoSW5maW5pdHkpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgICBpZiAoIWZyb21FbmRPZlRyYW5zY3JpcHRJbmRpY2F0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzZWRBY3Rpdml0eUVudHJ5ID0gcmVuZGVyaW5nRWxlbWVudHMuZmluZCgoeyBrZXkgfSkgPT4ga2V5ID09PSBmb2N1c2VkQWN0aXZpdHlLZXkpO1xuXG4gICAgICAgICAgICBpZiAoZm9jdXNlZEFjdGl2aXR5RW50cnkpIHtcbiAgICAgICAgICAgICAgY29uc3QgeyBlbGVtZW50OiBmb2N1c2VkQWN0aXZpdHlFbGVtZW50IH0gPVxuICAgICAgICAgICAgICAgIGFjdGl2aXR5RWxlbWVudHNSZWYuY3VycmVudC5maW5kKCh7IGFjdGl2aXR5IH0pID0+IGFjdGl2aXR5ID09PSBmb2N1c2VkQWN0aXZpdHlFbnRyeS5hY3Rpdml0eSkgfHwge307XG5cbiAgICAgICAgICAgICAgaWYgKGZvY3VzZWRBY3Rpdml0eUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbZmlyc3RUYWJiYWJsZUVsZW1lbnRdID0gdGFiYmFibGVFbGVtZW50cyhmb2N1c2VkQWN0aXZpdHlFbGVtZW50KS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAoeyBjbGFzc05hbWUgfSkgPT4gY2xhc3NOYW1lICE9PSAnd2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHktc2VudGluZWwnXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGZpcnN0VGFiYmFibGVFbGVtZW50ICYmIGZpcnN0VGFiYmFibGVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICAgIGZvY3VzKCdzZW5kQm94V2l0aG91dEtleWJvYXJkJyk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnSG9tZSc6XG4gICAgICAgICAgZm9jdXNSZWxhdGl2ZUFjdGl2aXR5KC1JbmZpbml0eSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBoYW5kbGVkID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChoYW5kbGVkKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgLy8gSWYgYSBjdXN0b20gSFRNTCBjb250cm9sIHdhbnRzIHRvIGhhbmRsZSB1cC9kb3duIGFycm93LCB3ZSB3aWxsIHByZXZlbnQgdGhlbSBmcm9tIGxpc3RlbmluZyB0byB0aGlzIGV2ZW50IHRvIHByZXZlbnQgYnVncyBkdWUgdG8gaGFuZGxpbmcgYXJyb3cga2V5cyB0d2ljZS5cbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbZm9jdXNlZEFjdGl2aXR5S2V5LCBhY3Rpdml0eUVsZW1lbnRzUmVmLCBmb2N1c1JlbGF0aXZlQWN0aXZpdHksIGZvY3VzLCB0ZXJtaW5hdG9yUmVmLCByZW5kZXJpbmdFbGVtZW50c11cbiAgKTtcblxuICBjb25zdCBsYWJlbElkID0gdXNlVW5pcXVlSWQoJ3dlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2xhYmVsJyk7XG5cbiAgLy8gSWYgU0hJRlQtVEFCIGZyb20gXCJFbmQgb2YgdHJhbnNjcmlwdFwiIGluZGljYXRvciwgaWYgZm9jdXNlZEFjdGl2aXR5S2V5IGlzIG5vdCBzZXQgKG9yIG5vIGxvbmdlciBleGlzdHMpLCBzZXQgaXQgdGhlIHRoZSBib3R0b21tb3N0IGFjdGl2aXR5LlxuICBjb25zdCBzZXRCb3R0b21tb3N0Rm9jdXNlZEFjdGl2aXR5S2V5SWZOZWVkZWQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKCF+cmVuZGVyaW5nRWxlbWVudHMuZmluZEluZGV4KCh7IGtleSB9KSA9PiBrZXkgPT09IGZvY3VzZWRBY3Rpdml0eUtleSkpIHtcbiAgICAgIGNvbnN0IHsga2V5OiBsYXN0QWN0aXZpdHlLZXkgfSA9IHJlbmRlcmluZ0VsZW1lbnRzW3JlbmRlcmluZ0VsZW1lbnRzLmxlbmd0aCAtIDFdIHx8IHt9O1xuXG4gICAgICBzZXRGb2N1c2VkQWN0aXZpdHlLZXkobGFzdEFjdGl2aXR5S2V5KTtcbiAgICB9XG4gIH0sIFtmb2N1c2VkQWN0aXZpdHlLZXksIHJlbmRlcmluZ0VsZW1lbnRzLCBzZXRGb2N1c2VkQWN0aXZpdHlLZXldKTtcblxuICBjb25zdCBoYW5kbGVUcmFuc2NyaXB0S2V5RG93bkNhcHR1cmUgPSB1c2VDYWxsYmFjayhcbiAgICBldmVudCA9PiB7XG4gICAgICBjb25zdCB7IGFsdEtleSwgY3RybEtleSwga2V5LCBtZXRhS2V5LCB0YXJnZXQgfSA9IGV2ZW50O1xuXG4gICAgICBpZiAoYWx0S2V5IHx8IChjdHJsS2V5ICYmIGtleSAhPT0gJ3YnKSB8fCBtZXRhS2V5IHx8ICghaW5wdXR0YWJsZUtleShrZXkpICYmIGtleSAhPT0gJ0JhY2tzcGFjZScpKSB7XG4gICAgICAgIC8vIElnbm9yZSBpZiBvbmUgb2YgdGhlIHV0aWxpdHkga2V5IChleGNlcHQgU0hJRlQpIGlzIHByZXNzZWRcbiAgICAgICAgLy8gRS5nLiBDVFJMLUMgb24gYSBsaW5rIGluIG9uZSBvZiB0aGUgbWVzc2FnZSBzaG91bGQgbm90IGp1bXAgdG8gY2hhdCBib3hcbiAgICAgICAgLy8gRS5nLiBcIkFcIiBvciBcIkJhY2tzcGFjZVwiIHNob3VsZCBqdW1wIHRvIGNoYXQgYm94XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gU2VuZCBrZXlzdHJva2VzIHRvIHNlbmQgYm94IGlmIHdlIGFyZSBmb2N1c2luZyBvbiB0aGUgdHJhbnNjcmlwdCBvciB0ZXJtaW5hdG9yLlxuICAgICAgaWYgKHRhcmdldCA9PT0gZXZlbnQuY3VycmVudFRhcmdldCB8fCB0YXJnZXQgPT09IHRlcm1pbmF0b3JSZWYuY3VycmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBmb2N1cygnc2VuZEJveCcpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2ZvY3VzXVxuICApO1xuXG4gIGNvbnN0IGZvY3VzVHJhbnNjcmlwdENhbGxiYWNrID0gdXNlQ2FsbGJhY2soXG4gICAgKCkgPT4gcm9vdEVsZW1lbnRSZWYuY3VycmVudCAmJiByb290RWxlbWVudFJlZi5jdXJyZW50LmZvY3VzKCksXG4gICAgW3Jvb3RFbGVtZW50UmVmXVxuICApO1xuXG4gIHVzZVJlZ2lzdGVyRm9jdXNUcmFuc2NyaXB0KGZvY3VzVHJhbnNjcmlwdENhbGxiYWNrKTtcblxuICBjb25zdCBoYW5kbGVGb2N1c0FjdGl2aXR5ID0gdXNlQ2FsbGJhY2soXG4gICAga2V5ID0+IHtcbiAgICAgIHNldEZvY3VzZWRBY3Rpdml0eUtleShrZXkpO1xuICAgICAgcm9vdEVsZW1lbnRSZWYuY3VycmVudCAmJiByb290RWxlbWVudFJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgfSxcbiAgICBbc2V0Rm9jdXNlZEFjdGl2aXR5S2V5XVxuICApO1xuXG4gIC8vIFdoZW4gdGhlIGZvY3VzaW5nIGFjdGl2aXR5IGhhcyBjaGFuZ2VkLCBkaXNwYXRjaCBhbiBldmVudCB0byBvYnNlcnZlcnMgb2YgXCJ1c2VPYnNlcnZlVHJhbnNjcmlwdEZvY3VzXCIuXG4gIGNvbnN0IGRpc3BhdGNoVHJhbnNjcmlwdEZvY3VzID0gdXNlRGlzcGF0Y2hUcmFuc2NyaXB0Rm9jdXMoKTtcbiAgY29uc3QgZm9jdXNlZEFjdGl2aXR5ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgeyBhY3Rpdml0eSB9ID0gcmVuZGVyaW5nRWxlbWVudHMuZmluZCgoeyBrZXkgfSkgPT4ga2V5ID09PSBmb2N1c2VkQWN0aXZpdHlLZXkpIHx8IHt9O1xuXG4gICAgcmV0dXJuIGFjdGl2aXR5O1xuICB9LCBbZm9jdXNlZEFjdGl2aXR5S2V5LCByZW5kZXJpbmdFbGVtZW50c10pO1xuXG4gIHVzZU1lbW8oXG4gICAgKCkgPT4gZGlzcGF0Y2hUcmFuc2NyaXB0Rm9jdXMgJiYgZGlzcGF0Y2hUcmFuc2NyaXB0Rm9jdXMoeyBhY3Rpdml0eTogZm9jdXNlZEFjdGl2aXR5IH0pLFxuICAgIFtkaXNwYXRjaFRyYW5zY3JpcHRGb2N1cywgZm9jdXNlZEFjdGl2aXR5XVxuICApO1xuXG4gIC8vIFRoaXMgaXMgcmVxdWlyZWQgYnkgSUUxMS5cbiAgLy8gV2hlbiB0aGUgdXNlciBjbGlja3Mgb24gYW5kIGVtcHR5IHNwYWNlIChhLmsuYS4gZmlsbGVyKSBpbiBhbiBlbXB0eSB0cmFuc2NyaXB0LCBJRTExIHNheXMgdGhlIGZvY3VzIGlzIG9uIHRoZSA8ZGl2IGNsYXNzTmFtZT1cImZpbGxlclwiPixcbiAgLy8gZGVzcGl0ZSB0aGUgZmFjdCB0aGVyZSBhcmUgbm8gXCJ0YWJJbmRleFwiIGF0dHJpYnV0ZXMgc2V0IG9uIHRoZSBmaWxsZXIuXG4gIC8vIFdlIG5lZWQgdG8gYXJ0aWZpY2lhbGx5IHNlbmQgdGhlIGZvY3VzIGJhY2sgdG8gdGhlIHRyYW5zY3JpcHQuXG4gIGNvbnN0IGhhbmRsZUZvY3VzRmlsbGVyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IHsgY3VycmVudCB9ID0gcm9vdEVsZW1lbnRSZWY7XG5cbiAgICBjdXJyZW50ICYmIGN1cnJlbnQuZm9jdXMoKTtcbiAgfSwgW3Jvb3RFbGVtZW50UmVmXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQ9e2ZvY3VzZWRBY3Rpdml0eUtleSA/IGFjdGl2ZURlc2NlbmRhbnRFbGVtZW50SWQgOiB1bmRlZmluZWR9XG4gICAgICBhcmlhLWxhYmVsbGVkYnk9e2xhYmVsSWR9XG4gICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoXG4gICAgICAgICd3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0JyxcbiAgICAgICAgYmFzaWNUcmFuc2NyaXB0U3R5bGVTZXQgKyAnJyxcbiAgICAgICAgcm9vdENsYXNzTmFtZSxcbiAgICAgICAgKGNsYXNzTmFtZSB8fCAnJykgKyAnJ1xuICAgICAgKX1cbiAgICAgIGRpcj17ZGlyZWN0aW9ufVxuICAgICAgb25Gb2N1cz17aGFuZGxlVHJhbnNjcmlwdEZvY3VzfVxuICAgICAgb25LZXlEb3duPXtoYW5kbGVUcmFuc2NyaXB0S2V5RG93bn1cbiAgICAgIG9uS2V5RG93bkNhcHR1cmU9e2hhbmRsZVRyYW5zY3JpcHRLZXlEb3duQ2FwdHVyZX1cbiAgICAgIHJlZj17cm9vdEVsZW1lbnRSZWZ9XG4gICAgICAvLyBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiIHdpbGwgb25seSB3b3JrcyB3aXRoIGEgbnVtYmVyIG9mIHJvbGVzIGFuZCBpdCBtdXN0IGJlIGV4cGxpY2l0bHkgc2V0LlxuICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLyNhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcbiAgICAgIHJvbGU9XCJncm91cFwiXG4gICAgICAvLyBGb3IgdXAvZG93biBhcnJvdyBrZXkgbmF2aWdhdGlvbiBhY3Jvc3MgYWN0aXZpdGllcywgdGhpcyBjb21wb25lbnQgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgdGFiIHNlcXVlbmNlLlxuICAgICAgLy8gT3RoZXJ3aXNlLCBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiIHdpbGwgbm90IGJlIG5hcnJhdGVkIHdoZW4gdGhlIHVzZXIgcHJlc3MgdXAvZG93biBhcnJvdyBrZXlzLlxuICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLXByYWN0aWNlcy0xLjEvI2tiZF9mb2N1c19hY3RpdmVkZXNjZW5kYW50XG4gICAgICB0YWJJbmRleD17MH1cbiAgICA+XG4gICAgICA8U2NyZWVuUmVhZGVyVGV4dCBpZD17bGFiZWxJZH0gdGV4dD17dHJhbnNjcmlwdEFyaWFMYWJlbH0gLz5cbiAgICAgIHsvKiBUaGlzIDxzZWN0aW9uPiBpcyBmb3IgbGl2ZSByZWdpb24gb25seS4gQ29udGVudCBpcyBtYWRlIGludmlzaWJsZSB0aHJvdWdoIENTUy4gKi99XG4gICAgICA8c2VjdGlvblxuICAgICAgICBhcmlhLWF0b21pYz17ZmFsc2V9XG4gICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgIGFyaWEtcmVsZXZhbnQ9XCJhZGRpdGlvbnNcIlxuICAgICAgICBhcmlhLXJvbGVkZXNjcmlwdGlvbj17dHJhbnNjcmlwdFJvbGVEZXNjcmlwdGlvbn1cbiAgICAgICAgcm9sZT1cImxvZ1wiXG4gICAgICA+XG4gICAgICAgIHtyZW5kZXJpbmdFbGVtZW50c1xuICAgICAgICAgIC5maWx0ZXIoKHsgc3VwcG9ydFNjcmVlblJlYWRlciB9KSA9PiBzdXBwb3J0U2NyZWVuUmVhZGVyKVxuICAgICAgICAgIC5tYXAoKHsgYWN0aXZpdHksIGxpdmVSZWdpb25LZXkgfSkgPT4gKFxuICAgICAgICAgICAgPEZhZGUgZmFkZUFmdGVyPXtpbnRlcm5hbExpdmVSZWdpb25GYWRlQWZ0ZXJ9IGtleT17bGl2ZVJlZ2lvbktleX0+XG4gICAgICAgICAgICAgIHsoKSA9PiA8U2NyZWVuUmVhZGVyQWN0aXZpdHkgYWN0aXZpdHk9e2FjdGl2aXR5fSAvPn1cbiAgICAgICAgICAgIDwvRmFkZT5cbiAgICAgICAgICApKX1cbiAgICAgIDwvc2VjdGlvbj5cbiAgICAgIHsvKiBUT0RPOiBbUDJdIEZpeCBFU0xpbnQgZXJyb3IgYG5vLXVzZS1iZWZvcmUtZGVmaW5lYCAqL31cbiAgICAgIHsvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZS1iZWZvcmUtZGVmaW5lICovfVxuICAgICAgPEludGVybmFsVHJhbnNjcmlwdFNjcm9sbGFibGVcbiAgICAgICAgYWN0aXZpdGllcz17cmVuZGVyaW5nQWN0aXZpdGllc31cbiAgICAgICAgb25Gb2N1c0FjdGl2aXR5PXtoYW5kbGVGb2N1c0FjdGl2aXR5fVxuICAgICAgICBvbkZvY3VzRmlsbGVyPXtoYW5kbGVGb2N1c0ZpbGxlcn1cbiAgICAgICAgdGVybWluYXRvclJlZj17dGVybWluYXRvclJlZn1cbiAgICAgID5cbiAgICAgICAge3JlbmRlcmluZ0VsZW1lbnRzLm1hcChcbiAgICAgICAgICAoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFjdGl2aXR5LFxuICAgICAgICAgICAgICBjYWxsYmFja1JlZixcbiAgICAgICAgICAgICAgZm9jdXNBY3Rpdml0eSxcbiAgICAgICAgICAgICAgaGFuZGxlRm9jdXMsXG4gICAgICAgICAgICAgIGhhbmRsZUtleURvd24sXG4gICAgICAgICAgICAgIGhhbmRsZU1vdXNlRG93bkNhcHR1cmUsXG4gICAgICAgICAgICAgIGhpZGVUaW1lc3RhbXAsXG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgcmVuZGVyQWN0aXZpdHksXG4gICAgICAgICAgICAgIHJlbmRlckFjdGl2aXR5U3RhdHVzLFxuICAgICAgICAgICAgICByZW5kZXJBdmF0YXIsXG4gICAgICAgICAgICAgIHJvbGUsXG4gICAgICAgICAgICAgIHNob3VsZFNwZWFrLFxuICAgICAgICAgICAgICBzaG93Q2FsbG91dCxcbiAgICAgICAgICAgICAgc3VwcG9ydFNjcmVlblJlYWRlclxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGFyaWFMYWJlbElELCBlbGVtZW50IH0gPVxuICAgICAgICAgICAgICBhY3Rpdml0eUVsZW1lbnRzUmVmLmN1cnJlbnQuZmluZChlbnRyeSA9PiBlbnRyeS5hY3Rpdml0eSA9PT0gYWN0aXZpdHkpIHx8IHt9O1xuICAgICAgICAgICAgY29uc3QgYWN0aXZlRGVzY2VuZGFudCA9IGZvY3VzZWRBY3Rpdml0eUtleSA9PT0ga2V5O1xuICAgICAgICAgICAgY29uc3QgaXNDb250ZW50SW50ZXJhY3RpdmUgPSAhIShlbGVtZW50XG4gICAgICAgICAgICAgID8gdGFiYmFibGVFbGVtZW50cyhlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy53ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19hY3Rpdml0eS1ib3gnKSkubGVuZ3RoXG4gICAgICAgICAgICAgIDogMCk7XG5cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWxsZWRieT17YXJpYUxhYmVsSUR9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKCd3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19hY3Rpdml0eScsIHtcbiAgICAgICAgICAgICAgICAgICd3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19hY3Rpdml0eS0tYWNrbm93bGVkZ2VkJzogaW5kZXggPD0gaW5kZXhPZkxhc3RJbnRlcmFjdGVkQWN0aXZpdHksXG4gICAgICAgICAgICAgICAgICAnd2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHktLWZyb20tYm90Jzogcm9sZSAhPT0gJ3VzZXInLFxuICAgICAgICAgICAgICAgICAgJ3dlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2FjdGl2aXR5LS1mcm9tLXVzZXInOiByb2xlID09PSAndXNlcidcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAvLyBTZXQgXCJpZFwiIGZvciB2YWxpZCBmb3IgYWNjZXNzaWJpbGl0eS5cbiAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QvZm9yYmlkLWRvbS1wcm9wcyAqL1xuICAgICAgICAgICAgICAgIGlkPXthY3RpdmVEZXNjZW5kYW50ID8gYWN0aXZlRGVzY2VuZGFudEVsZW1lbnRJZCA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICBrZXk9e2tleX1cbiAgICAgICAgICAgICAgICBvbkZvY3VzPXtoYW5kbGVGb2N1c31cbiAgICAgICAgICAgICAgICBvbktleURvd249e2hhbmRsZUtleURvd259XG4gICAgICAgICAgICAgICAgb25Nb3VzZURvd25DYXB0dXJlPXtoYW5kbGVNb3VzZURvd25DYXB0dXJlfVxuICAgICAgICAgICAgICAgIHJlZj17Y2FsbGJhY2tSZWZ9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7c3VwcG9ydFNjcmVlblJlYWRlciAmJiAoXG4gICAgICAgICAgICAgICAgICA8U2NyZWVuUmVhZGVyQWN0aXZpdHkgYWN0aXZpdHk9e2FjdGl2aXR5fSBpZD17YXJpYUxhYmVsSUR9IHJlbmRlckF0dGFjaG1lbnRzPXtmYWxzZX0+XG4gICAgICAgICAgICAgICAgICAgIHshIWlzQ29udGVudEludGVyYWN0aXZlICYmIDxwPnthY3Rpdml0eUludGVyYWN0aXZlQWx0fTwvcD59XG4gICAgICAgICAgICAgICAgICA8L1NjcmVlblJlYWRlckFjdGl2aXR5PlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPEZvY3VzUmVkaXJlY3RvclxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwid2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHktc2VudGluZWxcIlxuICAgICAgICAgICAgICAgICAgb25Gb2N1cz17Zm9jdXNBY3Rpdml0eX1cbiAgICAgICAgICAgICAgICAgIHJlZGlyZWN0UmVmPXtyb290RWxlbWVudFJlZn1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHktYm94XCI+XG4gICAgICAgICAgICAgICAgICB7cmVuZGVyQWN0aXZpdHkoe1xuICAgICAgICAgICAgICAgICAgICBoaWRlVGltZXN0YW1wLFxuICAgICAgICAgICAgICAgICAgICByZW5kZXJBY3Rpdml0eVN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyQXZhdGFyLFxuICAgICAgICAgICAgICAgICAgICBzaG93Q2FsbG91dFxuICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAge3Nob3VsZFNwZWFrICYmIDxTcGVha0FjdGl2aXR5IGFjdGl2aXR5PXthY3Rpdml0eX0gLz59XG4gICAgICAgICAgICAgICAgPEZvY3VzUmVkaXJlY3RvclxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwid2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHktc2VudGluZWxcIlxuICAgICAgICAgICAgICAgICAgb25Gb2N1cz17Zm9jdXNBY3Rpdml0eX1cbiAgICAgICAgICAgICAgICAgIHJlZGlyZWN0UmVmPXtyb290RWxlbWVudFJlZn1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcygnd2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHktaW5kaWNhdG9yJywge1xuICAgICAgICAgICAgICAgICAgICAnd2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHktaW5kaWNhdG9yLS1maXJzdCc6ICFpbmRleCxcbiAgICAgICAgICAgICAgICAgICAgJ3dlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2FjdGl2aXR5LWluZGljYXRvci0tZm9jdXMnOiBhY3RpdmVEZXNjZW5kYW50XG4gICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICl9XG4gICAgICA8L0ludGVybmFsVHJhbnNjcmlwdFNjcm9sbGFibGU+XG4gICAgICB7ISFyZW5kZXJpbmdFbGVtZW50cy5sZW5ndGggJiYgKFxuICAgICAgICA8UmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAgPEZvY3VzUmVkaXJlY3RvclxuICAgICAgICAgICAgY2xhc3NOYW1lPVwid2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fc2VudGluZWxcIlxuICAgICAgICAgICAgb25Gb2N1cz17c2V0Qm90dG9tbW9zdEZvY3VzZWRBY3Rpdml0eUtleUlmTmVlZGVkfVxuICAgICAgICAgICAgcmVkaXJlY3RSZWY9e3Jvb3RFbGVtZW50UmVmfVxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X190ZXJtaW5hdG9yXCIgcmVmPXt0ZXJtaW5hdG9yUmVmfSB0YWJJbmRleD17MH0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX3Rlcm1pbmF0b3ItYm9keVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX3Rlcm1pbmF0b3ItdGV4dFwiPnt0ZXJtaW5hdG9yVGV4dH08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxuICAgICAgKX1cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fZm9jdXMtaW5kaWNhdG9yXCIgLz5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbkludGVybmFsVHJhbnNjcmlwdC5kZWZhdWx0UHJvcHMgPSB7XG4gIGNsYXNzTmFtZTogJydcbn07XG5cbkludGVybmFsVHJhbnNjcmlwdC5wcm9wVHlwZXMgPSB7XG4gIGFjdGl2aXR5RWxlbWVudHNSZWY6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgY3VycmVudDogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWRcbiAgfSkuaXNSZXF1aXJlZCxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuXG5jb25zdCBJbnRlcm5hbFNjcmVlblJlYWRlclRyYW5zY3JpcHQgPSAoeyByZW5kZXJpbmdFbGVtZW50cyB9KSA9PiB7XG4gIGNvbnN0IGxvY2FsaXplID0gdXNlTG9jYWxpemVyKCk7XG4gIGNvbnN0IFtpbnRlcm5hbExpdmVSZWdpb25GYWRlQWZ0ZXJdID0gdXNlU3R5bGVPcHRpb25zKCk7XG5cbiAgY29uc3QgdHJhbnNjcmlwdFJvbGVEZXNjcmlwdGlvbiA9IGxvY2FsaXplKCdUUkFOU0NSSVBUX0FSSUFfUk9MRV9BTFQnKTtcblxuICByZXR1cm4gKFxuICAgIDxzZWN0aW9uXG4gICAgICBhcmlhLWF0b21pYz17ZmFsc2V9XG4gICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgYXJpYS1yZWxldmFudD1cImFkZGl0aW9uc1wiXG4gICAgICBhcmlhLXJvbGVkZXNjcmlwdGlvbj17dHJhbnNjcmlwdFJvbGVEZXNjcmlwdGlvbn1cbiAgICAgIHJvbGU9XCJsb2dcIlxuICAgID5cbiAgICAgIHtyZW5kZXJpbmdFbGVtZW50cy5tYXAoKHsgYWN0aXZpdHksIGxpdmVSZWdpb25LZXkgfSkgPT4gKFxuICAgICAgICA8RmFkZSBmYWRlQWZ0ZXI9e2ludGVybmFsTGl2ZVJlZ2lvbkZhZGVBZnRlcn0ga2V5PXtsaXZlUmVnaW9uS2V5fT5cbiAgICAgICAgICB7KCkgPT4gPFNjcmVlblJlYWRlckFjdGl2aXR5IGFjdGl2aXR5PXthY3Rpdml0eX0gLz59XG4gICAgICAgIDwvRmFkZT5cbiAgICAgICkpfVxuICAgIDwvc2VjdGlvbj5cbiAgKTtcbn07XG5cbkludGVybmFsU2NyZWVuUmVhZGVyVHJhbnNjcmlwdC5wcm9wVHlwZXMgPSB7XG4gIHJlbmRlcmluZ0VsZW1lbnRzOiBQcm9wVHlwZXMuYXJyYXlPZihcbiAgICBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgYWN0aXZpdHk6IFByb3BUeXBlcy5hbnksXG4gICAgICBsaXZlUmVnaW9uS2V5OiBQcm9wVHlwZXMuc3RyaW5nXG4gICAgfSlcbiAgKS5pc1JlcXVpcmVkXG59O1xuXG4vLyBTZXBhcmF0aW5nIGhpZ2gtZnJlcXVlbmN5IGhvb2tzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuXG5jb25zdCBJbnRlcm5hbFRyYW5zY3JpcHRTY3JvbGxhYmxlID0gKHsgYWN0aXZpdGllcywgY2hpbGRyZW4sIG9uRm9jdXNBY3Rpdml0eSwgb25Gb2N1c0ZpbGxlciwgdGVybWluYXRvclJlZiB9KSA9PiB7XG4gIGNvbnN0IFt7IGFjdGl2aXRpZXM6IGFjdGl2aXRpZXNTdHlsZVNldCB9XSA9IHVzZVN0eWxlU2V0KCk7XG4gIGNvbnN0IFthbmltYXRpbmdUb0VuZF0gPSB1c2VBbmltYXRpbmdUb0VuZCgpO1xuICBjb25zdCBbYXRFbmRdID0gdXNlQXRFbmQoKTtcbiAgY29uc3QgW3N0aWNreV0gPSB1c2VTdGlja3koKTtcbiAgY29uc3QgW3N0eWxlT3B0aW9uc10gPSB1c2VTdHlsZU9wdGlvbnMoKTtcbiAgY29uc3QgbGFzdFZpc2libGVBY3Rpdml0eUlkID0gZ2V0QWN0aXZpdHlVbmlxdWVJZChhY3Rpdml0aWVzW2FjdGl2aXRpZXMubGVuZ3RoIC0gMV0gfHwge30pOyAvLyBBY3Rpdml0eSBJRCBvZiB0aGUgbGFzdCB2aXNpYmxlIGFjdGl2aXR5IGluIHRoZSBsaXN0LlxuICBjb25zdCBsb2NhbGl6ZSA9IHVzZUxvY2FsaXplcigpO1xuICBjb25zdCBzY3JvbGxUb0VuZCA9IHVzZVNjcm9sbFRvRW5kKCk7XG5cbiAgY29uc3QgbGFzdFJlYWRBY3Rpdml0eUlkUmVmID0gdXNlUmVmKGxhc3RWaXNpYmxlQWN0aXZpdHlJZCk7XG4gIGNvbnN0IHRyYW5zY3JpcHRSb2xlRGVzY3JpcHRpb24gPSBsb2NhbGl6ZSgnVFJBTlNDUklQVF9BUklBX1JPTEVfQUxUJyk7XG5cbiAgY29uc3QgaGFuZGxlU2Nyb2xsVG9FbmRCdXR0b25DbGljayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzY3JvbGxUb0VuZCh7IGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcblxuICAgIC8vIEFmdGVyIHRoZSBcIk5ldyBtZXNzYWdlXCIgYnV0dG9uIGlzIGNsaWNrZWQsIGZvY3VzIG9uIHRoZSBmaXJzdCB1bnJlYWQgYWN0aXZpdHkuXG4gICAgY29uc3QgaW5kZXggPSBhY3Rpdml0aWVzLmZpbmRJbmRleCgoeyBpZCB9KSA9PiBpZCA9PT0gbGFzdFJlYWRBY3Rpdml0eUlkUmVmLmN1cnJlbnQpO1xuXG4gICAgaWYgKH5pbmRleCkge1xuICAgICAgY29uc3QgZmlyc3RVbnJlYWRBY3Rpdml0eSA9IGFjdGl2aXRpZXNbaW5kZXggKyAxXTtcblxuICAgICAgaWYgKGZpcnN0VW5yZWFkQWN0aXZpdHkpIHtcbiAgICAgICAgcmV0dXJuIG9uRm9jdXNBY3Rpdml0eShnZXRBY3Rpdml0eVVuaXF1ZUlkKGZpcnN0VW5yZWFkQWN0aXZpdHkpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB7IGN1cnJlbnQgfSA9IHRlcm1pbmF0b3JSZWY7XG5cbiAgICBjdXJyZW50ICYmIGN1cnJlbnQuZm9jdXMoKTtcbiAgfSwgW2FjdGl2aXRpZXMsIGxhc3RSZWFkQWN0aXZpdHlJZFJlZiwgb25Gb2N1c0FjdGl2aXR5LCBzY3JvbGxUb0VuZCwgdGVybWluYXRvclJlZl0pO1xuXG4gIGlmIChhdEVuZCB8fCBzdGlja3kpIHtcbiAgICAvLyBJZiBpdCBpcyBzdGlja3kgb3IgYXQgdGhlIGVuZCwgdGhlIHVzZXIgaXMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgdHJhbnNjcmlwdCwgZXZlcnl0aGluZyBpcyByZWFkLlxuICAgIC8vIFNvIG1hcmsgdGhlIGFjdGl2aXR5IElEIGFzIHJlYWQuXG4gICAgbGFzdFJlYWRBY3Rpdml0eUlkUmVmLmN1cnJlbnQgPSBsYXN0VmlzaWJsZUFjdGl2aXR5SWQ7XG4gIH1cblxuICBjb25zdCBTY3JvbGxUb0VuZEJ1dHRvbiA9IHVzZUNyZWF0ZVNjcm9sbFRvRW5kQnV0dG9uUmVuZGVyZXIoKSh7XG4gICAgYXRFbmQ6IGFuaW1hdGluZ1RvRW5kIHx8IGF0RW5kIHx8IHN0aWNreSxcbiAgICBzdHlsZU9wdGlvbnMsXG5cbiAgICAvLyBVbnJlYWQgbWVhbnM6XG4gICAgLy8gMS4gTGFzdCByZWFkIGlzIG5vdCB0aGUgbGFzdCBvbmUgaW4gdGhlIHRyYW5zY3JpcHQsIGFuZDtcbiAgICAvLyAyLiBMYXN0IHJlYWQgaXMgc3RpbGwgaW4gdGhlIHRyYW5zY3JpcHQuXG4gICAgdW5yZWFkOlxuICAgICAgbGFzdFZpc2libGVBY3Rpdml0eUlkICE9PSBsYXN0UmVhZEFjdGl2aXR5SWRSZWYuY3VycmVudCAmJlxuICAgICAgISF+YWN0aXZpdGllcy5maW5kSW5kZXgoYWN0aXZpdHkgPT4gZ2V0QWN0aXZpdHlVbmlxdWVJZChhY3Rpdml0eSkgPT09IGxhc3RSZWFkQWN0aXZpdHlJZFJlZi5jdXJyZW50KVxuICB9KTtcblxuICByZXR1cm4gKFxuICAgIDxSZWFjdC5GcmFnbWVudD5cbiAgICAgIHtTY3JvbGxUb0VuZEJ1dHRvbiAmJiA8U2Nyb2xsVG9FbmRCdXR0b24gb25DbGljaz17aGFuZGxlU2Nyb2xsVG9FbmRCdXR0b25DbGlja30gLz59XG4gICAgICB7ISFSZWFjdC5DaGlsZHJlbi5jb3VudChjaGlsZHJlbikgJiYgKFxuICAgICAgICA8Rm9jdXNSZWRpcmVjdG9yIGNsYXNzTmFtZT1cIndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX3NlbnRpbmVsXCIgcmVkaXJlY3RSZWY9e3Rlcm1pbmF0b3JSZWZ9IC8+XG4gICAgICApfVxuICAgICAgPFJlYWN0U2Nyb2xsVG9Cb3R0b21QYW5lbCBjbGFzc05hbWU9XCJ3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19zY3JvbGxhYmxlXCI+XG4gICAgICAgIDxkaXYgYXJpYS1oaWRkZW49e3RydWV9IGNsYXNzTmFtZT1cIndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2ZpbGxlclwiIG9uRm9jdXM9e29uRm9jdXNGaWxsZXJ9IC8+XG4gICAgICAgIDx1bFxuICAgICAgICAgIGFyaWEtcm9sZWRlc2NyaXB0aW9uPXt0cmFuc2NyaXB0Um9sZURlc2NyaXB0aW9ufVxuICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhhY3Rpdml0aWVzU3R5bGVTZXQgKyAnJywgJ3dlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX3RyYW5zY3JpcHQnKX1cbiAgICAgICAgICByb2xlPVwibGlzdFwiXG4gICAgICAgID5cbiAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDwvdWw+XG4gICAgICAgIDxCYXNpY1R5cGluZ0luZGljYXRvciAvPlxuICAgICAgPC9SZWFjdFNjcm9sbFRvQm90dG9tUGFuZWw+XG4gICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgKTtcbn07XG5cbkludGVybmFsVHJhbnNjcmlwdFNjcm9sbGFibGUucHJvcFR5cGVzID0ge1xuICBhY3Rpdml0aWVzOiBQcm9wVHlwZXMuYXJyYXkuaXNSZXF1aXJlZCxcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5hbnkuaXNSZXF1aXJlZCxcbiAgb25Gb2N1c0FjdGl2aXR5OiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBvbkZvY3VzRmlsbGVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICB0ZXJtaW5hdG9yUmVmOiBQcm9wVHlwZXMuYW55LmlzUmVxdWlyZWRcbn07XG5cbmNvbnN0IFNldFNjcm9sbGVyID0gKHsgYWN0aXZpdHlFbGVtZW50c1JlZiwgc2Nyb2xsZXJSZWYgfSkgPT4ge1xuICBjb25zdCBbXG4gICAgeyBhdXRvU2Nyb2xsU25hcE9uQWN0aXZpdHksIGF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eU9mZnNldCwgYXV0b1Njcm9sbFNuYXBPblBhZ2UsIGF1dG9TY3JvbGxTbmFwT25QYWdlT2Zmc2V0IH1cbiAgXSA9IHVzZVN0eWxlT3B0aW9ucygpO1xuICBjb25zdCBbYWN0aXZpdGllc10gPSB1c2VBY3Rpdml0aWVzKCk7XG4gIGNvbnN0IFtsYXN0QWNrbm93bGVkZ2VkQWN0aXZpdHldID0gdXNlQWNrbm93bGVkZ2VkQWN0aXZpdHkoKTtcblxuICBjb25zdCBhY3Rpdml0aWVzUmVmID0gdXNlUmVmKGFjdGl2aXRpZXMpO1xuICBjb25zdCBsYXN0QWNrbm93bGVkZ2VkQWN0aXZpdHlSZWYgPSB1c2VSZWYobGFzdEFja25vd2xlZGdlZEFjdGl2aXR5KTtcblxuICBhY3Rpdml0aWVzUmVmLmN1cnJlbnQgPSBhY3Rpdml0aWVzO1xuICBsYXN0QWNrbm93bGVkZ2VkQWN0aXZpdHlSZWYuY3VycmVudCA9IGxhc3RBY2tub3dsZWRnZWRBY3Rpdml0eTtcblxuICBzY3JvbGxlclJlZi5jdXJyZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgKHsgb2Zmc2V0SGVpZ2h0LCBzY3JvbGxUb3AgfSkgPT4ge1xuICAgICAgY29uc3QgcGF0Y2hlZEF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eSA9XG4gICAgICAgIHR5cGVvZiBhdXRvU2Nyb2xsU25hcE9uQWN0aXZpdHkgPT09ICdudW1iZXInXG4gICAgICAgICAgPyBNYXRoLm1heCgwLCBhdXRvU2Nyb2xsU25hcE9uQWN0aXZpdHkpXG4gICAgICAgICAgOiBhdXRvU2Nyb2xsU25hcE9uQWN0aXZpdHlcbiAgICAgICAgICA/IDFcbiAgICAgICAgICA6IDA7XG4gICAgICBjb25zdCBwYXRjaGVkQXV0b1Njcm9sbFNuYXBPblBhZ2UgPVxuICAgICAgICB0eXBlb2YgYXV0b1Njcm9sbFNuYXBPblBhZ2UgPT09ICdudW1iZXInXG4gICAgICAgICAgPyBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBhdXRvU2Nyb2xsU25hcE9uUGFnZSkpXG4gICAgICAgICAgOiBhdXRvU2Nyb2xsU25hcE9uUGFnZVxuICAgICAgICAgID8gMVxuICAgICAgICAgIDogMDtcbiAgICAgIGNvbnN0IHBhdGNoZWRBdXRvU2Nyb2xsU25hcE9uQWN0aXZpdHlPZmZzZXQgPVxuICAgICAgICB0eXBlb2YgYXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5T2Zmc2V0ID09PSAnbnVtYmVyJyA/IGF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eU9mZnNldCA6IDA7XG4gICAgICBjb25zdCBwYXRjaGVkQXV0b1Njcm9sbFNuYXBPblBhZ2VPZmZzZXQgPVxuICAgICAgICB0eXBlb2YgYXV0b1Njcm9sbFNuYXBPblBhZ2VPZmZzZXQgPT09ICdudW1iZXInID8gYXV0b1Njcm9sbFNuYXBPblBhZ2VPZmZzZXQgOiAwO1xuXG4gICAgICBpZiAocGF0Y2hlZEF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eSB8fCBwYXRjaGVkQXV0b1Njcm9sbFNuYXBPblBhZ2UpIHtcbiAgICAgICAgY29uc3QgeyBjdXJyZW50OiBhY3Rpdml0aWVzIH0gPSBhY3Rpdml0aWVzUmVmO1xuICAgICAgICBjb25zdCB7IGN1cnJlbnQ6IGFjdGl2aXR5RWxlbWVudHMgfSA9IGFjdGl2aXR5RWxlbWVudHNSZWY7XG4gICAgICAgIGNvbnN0IHsgY3VycmVudDogbGFzdEFja25vd2xlZGdlZEFjdGl2aXR5IH0gPSBsYXN0QWNrbm93bGVkZ2VkQWN0aXZpdHlSZWY7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGxhc3RBY2tub3dsZWRnZWRBY3Rpdml0eUluZGV4ID0gYWN0aXZpdGllcy5pbmRleE9mKGxhc3RBY2tub3dsZWRnZWRBY3Rpdml0eSk7XG5cbiAgICAgICAgaWYgKH5sYXN0QWNrbm93bGVkZ2VkQWN0aXZpdHlJbmRleCkge1xuICAgICAgICAgIC8vIFRoZSBhY3Rpdml0eSB0aGF0IHdlIGFja25vd2xlZGdlZCBjb3VsZCBiZSBub3QgcmVuZGVyZWQsIHN1Y2ggYXMgcG9zdCBiYWNrIGFjdGl2aXR5LlxuICAgICAgICAgIC8vIFdoZW4gY2FsY3VsYXRpbmcgc2Nyb2xsIHNuYXAsIHdlIGNhbiBvbmx5IGJhc2Ugb24gdGhlIGZpcnN0IHVuYWNrbm93bGVkZ2VkLWFuZC1yZW5kZXJpbmcgYWN0aXZpdHkuXG4gICAgICAgICAgbGV0IGZpcnN0VW5hY2tub3dsZWRnZWRBY3Rpdml0eUVsZW1lbnRJbmRleCA9IC0xO1xuXG4gICAgICAgICAgZm9yIChsZXQgaW5kZXggPSBsYXN0QWNrbm93bGVkZ2VkQWN0aXZpdHlJbmRleCArIDEsIHsgbGVuZ3RoIH0gPSBhY3Rpdml0aWVzOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgYWN0aXZpdHkgPSBhY3Rpdml0aWVzW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2aXR5RWxlbWVudEluZGV4ID0gYWN0aXZpdHlFbGVtZW50cy5maW5kSW5kZXgoZW50cnkgPT4gZW50cnkuYWN0aXZpdHkgPT09IGFjdGl2aXR5KTtcblxuICAgICAgICAgICAgaWYgKH5hY3Rpdml0eUVsZW1lbnRJbmRleCkge1xuICAgICAgICAgICAgICBmaXJzdFVuYWNrbm93bGVkZ2VkQWN0aXZpdHlFbGVtZW50SW5kZXggPSBhY3Rpdml0eUVsZW1lbnRJbmRleDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKH5maXJzdFVuYWNrbm93bGVkZ2VkQWN0aXZpdHlFbGVtZW50SW5kZXgpIHtcbiAgICAgICAgICAgIGlmIChwYXRjaGVkQXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5KSB7XG4gICAgICAgICAgICAgIC8vIEdldHMgdGhlIGFjdGl2aXR5IGVsZW1lbnQgd2hpY2ggd2Ugc2hvdWxkIHNuYXAgdG8uXG4gICAgICAgICAgICAgIGNvbnN0IHsgZWxlbWVudDogbnRoVW5hY2tub3dsZWRnZWRBY3Rpdml0eUVsZW1lbnQgfSA9XG4gICAgICAgICAgICAgICAgYWN0aXZpdHlFbGVtZW50c1tmaXJzdFVuYWNrbm93bGVkZ2VkQWN0aXZpdHlFbGVtZW50SW5kZXggKyBwYXRjaGVkQXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5IC0gMV07XG5cbiAgICAgICAgICAgICAgaWYgKG50aFVuYWNrbm93bGVkZ2VkQWN0aXZpdHlFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdmFsdWVzLnB1c2goXG4gICAgICAgICAgICAgICAgICBudGhVbmFja25vd2xlZGdlZEFjdGl2aXR5RWxlbWVudC5vZmZzZXRUb3AgK1xuICAgICAgICAgICAgICAgICAgICBudGhVbmFja25vd2xlZGdlZEFjdGl2aXR5RWxlbWVudC5vZmZzZXRIZWlnaHQgLVxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRIZWlnaHQgLVxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3AgK1xuICAgICAgICAgICAgICAgICAgICBwYXRjaGVkQXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5T2Zmc2V0XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGF0Y2hlZEF1dG9TY3JvbGxTbmFwT25QYWdlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgZWxlbWVudDogZmlyc3RVbmFja25vd2xlZGdlZEFjdGl2aXR5RWxlbWVudCB9ID1cbiAgICAgICAgICAgICAgICBhY3Rpdml0eUVsZW1lbnRzW2ZpcnN0VW5hY2tub3dsZWRnZWRBY3Rpdml0eUVsZW1lbnRJbmRleF07XG5cbiAgICAgICAgICAgICAgdmFsdWVzLnB1c2goXG4gICAgICAgICAgICAgICAgZmlyc3RVbmFja25vd2xlZGdlZEFjdGl2aXR5RWxlbWVudC5vZmZzZXRUb3AgLVxuICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wIC1cbiAgICAgICAgICAgICAgICAgIG9mZnNldEhlaWdodCAqICgxIC0gcGF0Y2hlZEF1dG9TY3JvbGxTbmFwT25QYWdlKSArXG4gICAgICAgICAgICAgICAgICBwYXRjaGVkQXV0b1Njcm9sbFNuYXBPblBhZ2VPZmZzZXRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWVzLnJlZHVjZSgobWluVmFsdWUsIHZhbHVlKSA9PiBNYXRoLm1pbihtaW5WYWx1ZSwgdmFsdWUpLCBJbmZpbml0eSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICB9LFxuICAgIFtcbiAgICAgIGFjdGl2aXRpZXNSZWYsXG4gICAgICBhY3Rpdml0eUVsZW1lbnRzUmVmLFxuICAgICAgYXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5LFxuICAgICAgYXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5T2Zmc2V0LFxuICAgICAgYXV0b1Njcm9sbFNuYXBPblBhZ2UsXG4gICAgICBhdXRvU2Nyb2xsU25hcE9uUGFnZU9mZnNldCxcbiAgICAgIGxhc3RBY2tub3dsZWRnZWRBY3Rpdml0eVJlZlxuICAgIF1cbiAgKTtcblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBCYXNpY1RyYW5zY3JpcHQgPSAoeyBjbGFzc05hbWUgfSkgPT4ge1xuICBjb25zdCBhY3Rpdml0eUVsZW1lbnRzUmVmID0gdXNlUmVmKFtdKTtcbiAgY29uc3Qgc2Nyb2xsZXJSZWYgPSB1c2VSZWYoKCkgPT4gSW5maW5pdHkpO1xuXG4gIGNvbnN0IHNjcm9sbGVyID0gdXNlQ2FsbGJhY2soKC4uLmFyZ3MpID0+IHNjcm9sbGVyUmVmLmN1cnJlbnQoLi4uYXJncyksIFtzY3JvbGxlclJlZl0pO1xuXG4gIHJldHVybiAoXG4gICAgPFJlYWN0U2Nyb2xsVG9Cb3R0b21Db21wb3NlciBzY3JvbGxlcj17c2Nyb2xsZXJ9PlxuICAgICAgPFNldFNjcm9sbGVyIGFjdGl2aXR5RWxlbWVudHNSZWY9e2FjdGl2aXR5RWxlbWVudHNSZWZ9IHNjcm9sbGVyUmVmPXtzY3JvbGxlclJlZn0gLz5cbiAgICAgIDxJbnRlcm5hbFRyYW5zY3JpcHQgYWN0aXZpdHlFbGVtZW50c1JlZj17YWN0aXZpdHlFbGVtZW50c1JlZn0gY2xhc3NOYW1lPXtjbGFzc05hbWV9IC8+XG4gICAgPC9SZWFjdFNjcm9sbFRvQm90dG9tQ29tcG9zZXI+XG4gICk7XG59O1xuXG5CYXNpY1RyYW5zY3JpcHQuZGVmYXVsdFByb3BzID0ge1xuICBjbGFzc05hbWU6ICcnXG59O1xuXG5CYXNpY1RyYW5zY3JpcHQucHJvcFR5cGVzID0ge1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmdcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJhc2ljVHJhbnNjcmlwdDtcbiJdfQ==