oxygen-cli 1.40.2-beta.1 → 1.41.0

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 (442) hide show
  1. package/CHANGELOG.md +1755 -1742
  2. package/LICENSE +672 -672
  3. package/README.md +37 -37
  4. package/build/core/OxygenCore.js +1 -1
  5. package/build/core/OxygenEvents.js +1 -1
  6. package/build/core/OxygenModule.js +1 -1
  7. package/build/core/OxygenService.js +1 -1
  8. package/build/core/OxygenSubModule.js +1 -1
  9. package/build/core/WebDriverModule.js +1 -1
  10. package/build/core/utils.js +1 -1
  11. package/build/errors/HookError.js +1 -1
  12. package/build/errors/ModuleError.js +1 -1
  13. package/build/errors/ModuleUnavailableError.js +1 -1
  14. package/build/errors/OxygenError.js +1 -1
  15. package/build/errors/ScriptNotFound.js +1 -1
  16. package/build/errors/helper.js +1 -1
  17. package/build/index.js +1 -1
  18. package/build/lib/cli-util.js +1 -1
  19. package/build/lib/cli.js +1 -1
  20. package/build/lib/debugger.js +1 -1
  21. package/build/lib/img-merge.js +1 -1
  22. package/build/lib/launcher.js +1 -1
  23. package/build/lib/logger.js +43 -43
  24. package/build/lib/moduleRequire.js +1 -1
  25. package/build/lib/parallel-launcher.js +1 -1
  26. package/build/lib/param-manager.js +1 -1
  27. package/build/lib/param-reader-csv.js +1 -1
  28. package/build/lib/param-reader-excel.js +1 -1
  29. package/build/lib/param-reader-json.js +1 -1
  30. package/build/lib/text-to-image.js +1 -1
  31. package/build/lib/util.js +1 -1
  32. package/build/model/case-result.js +1 -1
  33. package/build/model/failure.js +1 -1
  34. package/build/model/status.js +1 -1
  35. package/build/model/step-result.js +1 -1
  36. package/build/model/suite-result.js +1 -1
  37. package/build/model/test-result.js +1 -1
  38. package/build/model/testcase.js +1 -1
  39. package/build/model/testsuite.js +1 -1
  40. package/build/ox_modules/index.js +1 -1
  41. package/build/ox_modules/module-assert.js +37 -37
  42. package/build/ox_modules/module-date.js +24 -24
  43. package/build/ox_modules/module-db.js +52 -52
  44. package/build/ox_modules/module-email.js +59 -59
  45. package/build/ox_modules/module-eyes.js +34 -34
  46. package/build/ox_modules/module-http/ntlm-util.js +10 -10
  47. package/build/ox_modules/module-http/ntlm.js +15 -15
  48. package/build/ox_modules/module-http.js +132 -132
  49. package/build/ox_modules/module-log.js +27 -27
  50. package/build/ox_modules/module-mailinator.js +87 -87
  51. package/build/ox_modules/module-mob/commands/alertAccept.js +17 -17
  52. package/build/ox_modules/module-mob/commands/alertDismiss.js +17 -17
  53. package/build/ox_modules/module-mob/commands/assertAlert.js +20 -20
  54. package/build/ox_modules/module-mob/commands/assertText.js +21 -21
  55. package/build/ox_modules/module-mob/commands/assertTitle.js +19 -19
  56. package/build/ox_modules/module-mob/commands/assertValue.js +18 -18
  57. package/build/ox_modules/module-mob/commands/back.js +16 -16
  58. package/build/ox_modules/module-mob/commands/clear.js +19 -19
  59. package/build/ox_modules/module-mob/commands/click.js +17 -17
  60. package/build/ox_modules/module-mob/commands/clickHidden.js +17 -17
  61. package/build/ox_modules/module-mob/commands/clickLong.js +18 -18
  62. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +18 -18
  63. package/build/ox_modules/module-mob/commands/closeApp.js +16 -16
  64. package/build/ox_modules/module-mob/commands/debug.js +16 -16
  65. package/build/ox_modules/module-mob/commands/dragAndDrop.js +19 -19
  66. package/build/ox_modules/module-mob/commands/enableNetwork.js +27 -27
  67. package/build/ox_modules/module-mob/commands/execute.js +21 -21
  68. package/build/ox_modules/module-mob/commands/findElement.js +20 -20
  69. package/build/ox_modules/module-mob/commands/findElements.js +23 -23
  70. package/build/ox_modules/module-mob/commands/getAlertText.js +17 -17
  71. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +16 -16
  72. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +16 -16
  73. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +15 -15
  74. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +15 -15
  75. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +16 -16
  76. package/build/ox_modules/module-mob/commands/getDeviceTime.js +16 -16
  77. package/build/ox_modules/module-mob/commands/getLocation.js +20 -20
  78. package/build/ox_modules/module-mob/commands/getSource.js +16 -16
  79. package/build/ox_modules/module-mob/commands/getText.js +18 -18
  80. package/build/ox_modules/module-mob/commands/getTitle.js +13 -13
  81. package/build/ox_modules/module-mob/commands/getUrl.js +17 -17
  82. package/build/ox_modules/module-mob/commands/getValue.js +18 -18
  83. package/build/ox_modules/module-mob/commands/getWindowHandles.js +17 -17
  84. package/build/ox_modules/module-mob/commands/hideKeyboard.js +21 -21
  85. package/build/ox_modules/module-mob/commands/index.js +1 -1
  86. package/build/ox_modules/module-mob/commands/installApp.js +16 -16
  87. package/build/ox_modules/module-mob/commands/isAppInstalled.js +16 -16
  88. package/build/ox_modules/module-mob/commands/isCheckable.js +18 -18
  89. package/build/ox_modules/module-mob/commands/isChecked.js +18 -18
  90. package/build/ox_modules/module-mob/commands/isClickable.js +18 -18
  91. package/build/ox_modules/module-mob/commands/isExist.js +19 -19
  92. package/build/ox_modules/module-mob/commands/isSelected.js +23 -23
  93. package/build/ox_modules/module-mob/commands/isVisible.js +19 -19
  94. package/build/ox_modules/module-mob/commands/isWebViewContext.js +16 -16
  95. package/build/ox_modules/module-mob/commands/launchApp.js +15 -15
  96. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +18 -18
  97. package/build/ox_modules/module-mob/commands/open.js +17 -17
  98. package/build/ox_modules/module-mob/commands/pause.js +16 -16
  99. package/build/ox_modules/module-mob/commands/removeApp.js +16 -16
  100. package/build/ox_modules/module-mob/commands/resetApp.js +15 -15
  101. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +22 -22
  102. package/build/ox_modules/module-mob/commands/scrollIntoView.js +27 -27
  103. package/build/ox_modules/module-mob/commands/select.js +24 -24
  104. package/build/ox_modules/module-mob/commands/selectFrame.js +23 -23
  105. package/build/ox_modules/module-mob/commands/selectWindow.js +28 -28
  106. package/build/ox_modules/module-mob/commands/sendKeys.js +29 -29
  107. package/build/ox_modules/module-mob/commands/setContext.js +16 -16
  108. package/build/ox_modules/module-mob/commands/setNativeContext.js +15 -15
  109. package/build/ox_modules/module-mob/commands/setTimeout.js +21 -21
  110. package/build/ox_modules/module-mob/commands/setWebViewContext.js +16 -16
  111. package/build/ox_modules/module-mob/commands/shake.js +16 -16
  112. package/build/ox_modules/module-mob/commands/smsClickLink.js +19 -19
  113. package/build/ox_modules/module-mob/commands/smsGetText.js +20 -20
  114. package/build/ox_modules/module-mob/commands/swipe.js +20 -20
  115. package/build/ox_modules/module-mob/commands/swipeElement.js +20 -20
  116. package/build/ox_modules/module-mob/commands/swipeScreen.js +20 -20
  117. package/build/ox_modules/module-mob/commands/takeScreenshot.js +17 -17
  118. package/build/ox_modules/module-mob/commands/tap.js +17 -17
  119. package/build/ox_modules/module-mob/commands/type.js +20 -20
  120. package/build/ox_modules/module-mob/commands/unlockPattern.js +22 -22
  121. package/build/ox_modules/module-mob/commands/waitForExist.js +18 -18
  122. package/build/ox_modules/module-mob/commands/waitForInteractable.js +17 -17
  123. package/build/ox_modules/module-mob/commands/waitForVisible.js +17 -17
  124. package/build/ox_modules/module-mob.js +74 -74
  125. package/build/ox_modules/module-mongo.js +82 -82
  126. package/build/ox_modules/module-pdf.js +35 -35
  127. package/build/ox_modules/module-proxy.js +77 -77
  128. package/build/ox_modules/module-serial.js +55 -55
  129. package/build/ox_modules/module-shell.js +52 -33
  130. package/build/ox_modules/module-soap.js +72 -72
  131. package/build/ox_modules/module-twilio.js +41 -41
  132. package/build/ox_modules/module-utils.js +91 -91
  133. package/build/ox_modules/module-web/commands/alertAccept.js +17 -17
  134. package/build/ox_modules/module-web/commands/alertDismiss.js +17 -17
  135. package/build/ox_modules/module-web/commands/assertAlert.js +20 -20
  136. package/build/ox_modules/module-web/commands/assertExist.js +17 -17
  137. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +21 -21
  138. package/build/ox_modules/module-web/commands/assertSelectedValue.js +21 -21
  139. package/build/ox_modules/module-web/commands/assertText.js +21 -21
  140. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +18 -18
  141. package/build/ox_modules/module-web/commands/assertTextPresent.js +18 -18
  142. package/build/ox_modules/module-web/commands/assertTitle.js +19 -19
  143. package/build/ox_modules/module-web/commands/assertValue.js +20 -20
  144. package/build/ox_modules/module-web/commands/back.js +16 -16
  145. package/build/ox_modules/module-web/commands/clear.js +18 -18
  146. package/build/ox_modules/module-web/commands/click.js +25 -25
  147. package/build/ox_modules/module-web/commands/clickHidden.js +23 -23
  148. package/build/ox_modules/module-web/commands/closeWindow.js +15 -15
  149. package/build/ox_modules/module-web/commands/debug.js +15 -15
  150. package/build/ox_modules/module-web/commands/deleteCookies.js +12 -12
  151. package/build/ox_modules/module-web/commands/deselect.js +22 -22
  152. package/build/ox_modules/module-web/commands/doubleClick.js +17 -17
  153. package/build/ox_modules/module-web/commands/dragAndDrop.js +20 -20
  154. package/build/ox_modules/module-web/commands/execute.js +24 -24
  155. package/build/ox_modules/module-web/commands/fileBrowse.js +18 -18
  156. package/build/ox_modules/module-web/commands/findElement.js +19 -19
  157. package/build/ox_modules/module-web/commands/findElements.js +22 -22
  158. package/build/ox_modules/module-web/commands/fullscreenWindow.js +14 -14
  159. package/build/ox_modules/module-web/commands/getAlertText.js +16 -16
  160. package/build/ox_modules/module-web/commands/getAttribute.js +19 -19
  161. package/build/ox_modules/module-web/commands/getBrowserLogs.js +17 -17
  162. package/build/ox_modules/module-web/commands/getCookies.js +13 -13
  163. package/build/ox_modules/module-web/commands/getCssValue.js +19 -19
  164. package/build/ox_modules/module-web/commands/getElementCount.js +17 -17
  165. package/build/ox_modules/module-web/commands/getHTML.js +17 -17
  166. package/build/ox_modules/module-web/commands/getSource.js +16 -16
  167. package/build/ox_modules/module-web/commands/getText.js +18 -18
  168. package/build/ox_modules/module-web/commands/getTitle.js +12 -12
  169. package/build/ox_modules/module-web/commands/getUrl.js +16 -16
  170. package/build/ox_modules/module-web/commands/getValue.js +18 -18
  171. package/build/ox_modules/module-web/commands/getWindowHandles.js +16 -16
  172. package/build/ox_modules/module-web/commands/getWindowSize.js +16 -16
  173. package/build/ox_modules/module-web/commands/getXMLPageSource.js +16 -16
  174. package/build/ox_modules/module-web/commands/index.js +1 -1
  175. package/build/ox_modules/module-web/commands/isAlertPresent.js +16 -16
  176. package/build/ox_modules/module-web/commands/isChecked.js +18 -18
  177. package/build/ox_modules/module-web/commands/isExist.js +19 -19
  178. package/build/ox_modules/module-web/commands/isInteractable.js +22 -22
  179. package/build/ox_modules/module-web/commands/isSelected.js +23 -23
  180. package/build/ox_modules/module-web/commands/isVisible.js +19 -19
  181. package/build/ox_modules/module-web/commands/makeVisible.js +25 -25
  182. package/build/ox_modules/module-web/commands/maximizeWindow.js +14 -14
  183. package/build/ox_modules/module-web/commands/minimizeWindow.js +14 -14
  184. package/build/ox_modules/module-web/commands/mock.js +20 -20
  185. package/build/ox_modules/module-web/commands/mockClearAll.js +12 -12
  186. package/build/ox_modules/module-web/commands/mockRestoreAll.js +12 -12
  187. package/build/ox_modules/module-web/commands/newWindow.js +16 -16
  188. package/build/ox_modules/module-web/commands/open.js +16 -16
  189. package/build/ox_modules/module-web/commands/pause.js +15 -15
  190. package/build/ox_modules/module-web/commands/point.js +21 -21
  191. package/build/ox_modules/module-web/commands/pointJS.js +15 -15
  192. package/build/ox_modules/module-web/commands/refresh.js +15 -15
  193. package/build/ox_modules/module-web/commands/rightClick.js +17 -17
  194. package/build/ox_modules/module-web/commands/rightClickActions.js +19 -19
  195. package/build/ox_modules/module-web/commands/scrollToElement.js +21 -21
  196. package/build/ox_modules/module-web/commands/select.js +23 -23
  197. package/build/ox_modules/module-web/commands/selectFrame.js +24 -24
  198. package/build/ox_modules/module-web/commands/selectWindow.js +27 -27
  199. package/build/ox_modules/module-web/commands/sendKeys.js +22 -22
  200. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +20 -20
  201. package/build/ox_modules/module-web/commands/setTimeout.js +21 -21
  202. package/build/ox_modules/module-web/commands/setWindowSize.js +17 -17
  203. package/build/ox_modules/module-web/commands/takeScreenshot.js +17 -17
  204. package/build/ox_modules/module-web/commands/type.js +20 -20
  205. package/build/ox_modules/module-web/commands/verifyAlert.js +20 -20
  206. package/build/ox_modules/module-web/commands/verifyExist.js +17 -17
  207. package/build/ox_modules/module-web/commands/verifySelectedLabel.js +21 -21
  208. package/build/ox_modules/module-web/commands/verifySelectedValue.js +21 -21
  209. package/build/ox_modules/module-web/commands/verifyText.js +21 -21
  210. package/build/ox_modules/module-web/commands/verifyTextNotPresent.js +18 -18
  211. package/build/ox_modules/module-web/commands/verifyTextPresent.js +18 -18
  212. package/build/ox_modules/module-web/commands/verifyTitle.js +19 -19
  213. package/build/ox_modules/module-web/commands/verifyValue.js +20 -20
  214. package/build/ox_modules/module-web/commands/waitForAngular.js +19 -19
  215. package/build/ox_modules/module-web/commands/waitForExist.js +17 -17
  216. package/build/ox_modules/module-web/commands/waitForInteractable.js +17 -17
  217. package/build/ox_modules/module-web/commands/waitForNotExist.js +17 -17
  218. package/build/ox_modules/module-web/commands/waitForNotText.js +20 -20
  219. package/build/ox_modules/module-web/commands/waitForNotValue.js +20 -20
  220. package/build/ox_modules/module-web/commands/waitForText.js +20 -20
  221. package/build/ox_modules/module-web/commands/waitForValue.js +20 -20
  222. package/build/ox_modules/module-web/commands/waitForVisible.js +17 -17
  223. package/build/ox_modules/module-web/commands/waitForWindow.js +22 -22
  224. package/build/ox_modules/module-web.js +94 -94
  225. package/build/ox_modules/module-win/commands/assertText.js +17 -17
  226. package/build/ox_modules/module-win/commands/assertTitle.js +15 -15
  227. package/build/ox_modules/module-win/commands/assertValue.js +14 -14
  228. package/build/ox_modules/module-win/commands/back.js +11 -11
  229. package/build/ox_modules/module-win/commands/clear.js +13 -13
  230. package/build/ox_modules/module-win/commands/click.js +13 -13
  231. package/build/ox_modules/module-win/commands/clickLong.js +14 -14
  232. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +14 -14
  233. package/build/ox_modules/module-win/commands/findElement.js +15 -15
  234. package/build/ox_modules/module-win/commands/findElements.js +15 -15
  235. package/build/ox_modules/module-win/commands/getAppiumLogs.js +12 -12
  236. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +15 -15
  237. package/build/ox_modules/module-win/commands/getLocation.js +14 -14
  238. package/build/ox_modules/module-win/commands/getSource.js +12 -12
  239. package/build/ox_modules/module-win/commands/getText.js +14 -14
  240. package/build/ox_modules/module-win/commands/getValue.js +14 -14
  241. package/build/ox_modules/module-win/commands/getWindowHandles.js +15 -15
  242. package/build/ox_modules/module-win/commands/index.js +1 -1
  243. package/build/ox_modules/module-win/commands/isCheckable.js +14 -14
  244. package/build/ox_modules/module-win/commands/isChecked.js +14 -14
  245. package/build/ox_modules/module-win/commands/isClickable.js +14 -14
  246. package/build/ox_modules/module-win/commands/isExist.js +15 -15
  247. package/build/ox_modules/module-win/commands/isSelected.js +14 -14
  248. package/build/ox_modules/module-win/commands/isVisible.js +15 -15
  249. package/build/ox_modules/module-win/commands/open.js +13 -13
  250. package/build/ox_modules/module-win/commands/pause.js +12 -12
  251. package/build/ox_modules/module-win/commands/rightClick.js +13 -13
  252. package/build/ox_modules/module-win/commands/selectWindow.js +23 -23
  253. package/build/ox_modules/module-win/commands/sendKeys.js +22 -22
  254. package/build/ox_modules/module-win/commands/setTimeout.js +17 -17
  255. package/build/ox_modules/module-win/commands/takeScreenshot.js +16 -16
  256. package/build/ox_modules/module-win/commands/tap.js +13 -13
  257. package/build/ox_modules/module-win/commands/type.js +16 -16
  258. package/build/ox_modules/module-win/commands/waitForExist.js +14 -14
  259. package/build/ox_modules/module-win/commands/waitForInteractable.js +16 -16
  260. package/build/ox_modules/module-win/commands/waitForVisible.js +13 -13
  261. package/build/ox_modules/module-win.js +47 -47
  262. package/build/ox_modules/utils.js +8 -8
  263. package/build/ox_reporters/excel/template.json +48 -48
  264. package/build/ox_reporters/html/index.ejs +163 -163
  265. package/build/ox_reporters/html/summary.ejs +77 -77
  266. package/build/ox_reporters/html/tests-details.ejs +134 -134
  267. package/build/ox_reporters/html/tests-devices-browsers.ejs +83 -83
  268. package/build/ox_reporters/reporter-excel.js +1 -1
  269. package/build/ox_reporters/reporter-html.js +1 -1
  270. package/build/ox_reporters/reporter-json.js +1 -1
  271. package/build/ox_reporters/reporter-junit.js +1 -1
  272. package/build/ox_reporters/reporter-pdf.js +1 -1
  273. package/build/ox_reporters/reporter-rp.js +73 -42
  274. package/build/ox_reporters/reporter-xml.js +1 -1
  275. package/build/ox_services/service-devtools/submodule-network.js +1 -1
  276. package/build/ox_services/service-devtools.js +1 -1
  277. package/build/reporter/FileReporterBase.js +1 -1
  278. package/build/reporter/ReportAggregator.js +1 -1
  279. package/build/reporter/ReporterBase.js +1 -1
  280. package/build/reporter/WebSocketReporter.js +1 -1
  281. package/build/runners/WorkerProcess.js +1 -1
  282. package/build/runners/cucumber/CucumberEventListener.js +1 -1
  283. package/build/runners/cucumber/CucumberReporter.js +1 -1
  284. package/build/runners/cucumber/CucumberWorker.js +1 -1
  285. package/build/runners/cucumber/index.js +1 -1
  286. package/build/runners/cucumber/worker.js +1 -1
  287. package/build/runners/index.js +1 -1
  288. package/build/runners/oxygen/OxygenWorker.js +1 -1
  289. package/build/runners/oxygen/index.js +1 -1
  290. package/build/runners/oxygen/worker.js +1 -1
  291. package/config/default.json +6 -6
  292. package/package.json +139 -139
  293. package/types/index.d.ts +70 -70
  294. package/types/module-eyes.d.ts +39 -39
  295. package/types/module-http.d.ts +163 -163
  296. package/types/module-log.d.ts +34 -34
  297. package/types/module-mob.d.ts +966 -966
  298. package/types/module-pdf.d.ts +40 -40
  299. package/types/module-proxy.d.ts +100 -100
  300. package/types/module-shell.d.ts +24 -24
  301. package/types/module-utils.d.ts +99 -99
  302. package/types/module-web.d.ts +1053 -1053
  303. package/types/module-win.d.ts +352 -352
  304. package/types/oxygen.d.ts +53 -53
  305. package/log.txt +0 -1614
  306. package/reports/2025-06-08_231627/report.html +0 -440
  307. package/reports/2025-06-09_223615/report.html +0 -440
  308. package/transpiled/mongodb/etc/prepare.js +0 -18
  309. package/transpiled/mongodb/lib/admin.js +0 -182
  310. package/transpiled/mongodb/lib/beta.js +0 -26
  311. package/transpiled/mongodb/lib/bson.js +0 -220
  312. package/transpiled/mongodb/lib/bulk/common.js +0 -1041
  313. package/transpiled/mongodb/lib/bulk/ordered.js +0 -76
  314. package/transpiled/mongodb/lib/bulk/unordered.js +0 -102
  315. package/transpiled/mongodb/lib/change_stream.js +0 -517
  316. package/transpiled/mongodb/lib/client-side-encryption/auto_encrypter.js +0 -329
  317. package/transpiled/mongodb/lib/client-side-encryption/client_encryption.js +0 -779
  318. package/transpiled/mongodb/lib/client-side-encryption/crypto_callbacks.js +0 -95
  319. package/transpiled/mongodb/lib/client-side-encryption/errors.js +0 -171
  320. package/transpiled/mongodb/lib/client-side-encryption/mongocryptd_manager.js +0 -98
  321. package/transpiled/mongodb/lib/client-side-encryption/providers/aws.js +0 -34
  322. package/transpiled/mongodb/lib/client-side-encryption/providers/azure.js +0 -186
  323. package/transpiled/mongodb/lib/client-side-encryption/providers/gcp.js +0 -29
  324. package/transpiled/mongodb/lib/client-side-encryption/providers/index.js +0 -58
  325. package/transpiled/mongodb/lib/client-side-encryption/state_machine.js +0 -505
  326. package/transpiled/mongodb/lib/cmap/auth/auth_provider.js +0 -63
  327. package/transpiled/mongodb/lib/cmap/auth/aws_temporary_credentials.js +0 -167
  328. package/transpiled/mongodb/lib/cmap/auth/gssapi.js +0 -207
  329. package/transpiled/mongodb/lib/cmap/auth/mongo_credentials.js +0 -193
  330. package/transpiled/mongodb/lib/cmap/auth/mongodb_aws.js +0 -181
  331. package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/automated_callback_workflow.js +0 -101
  332. package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/azure_machine_workflow.js +0 -81
  333. package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/callback_workflow.js +0 -174
  334. package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/command_builders.js +0 -59
  335. package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/gcp_machine_workflow.js +0 -58
  336. package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/human_callback_workflow.js +0 -138
  337. package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/k8s_machine_workflow.js +0 -42
  338. package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/token_cache.js +0 -71
  339. package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/token_machine_workflow.js +0 -34
  340. package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc.js +0 -111
  341. package/transpiled/mongodb/lib/cmap/auth/plain.js +0 -43
  342. package/transpiled/mongodb/lib/cmap/auth/providers.js +0 -22
  343. package/transpiled/mongodb/lib/cmap/auth/scram.js +0 -318
  344. package/transpiled/mongodb/lib/cmap/auth/x509.js +0 -61
  345. package/transpiled/mongodb/lib/cmap/command_monitoring_events.js +0 -266
  346. package/transpiled/mongodb/lib/cmap/commands.js +0 -605
  347. package/transpiled/mongodb/lib/cmap/connect.js +0 -418
  348. package/transpiled/mongodb/lib/cmap/connection.js +0 -673
  349. package/transpiled/mongodb/lib/cmap/connection_pool.js +0 -688
  350. package/transpiled/mongodb/lib/cmap/connection_pool_events.js +0 -254
  351. package/transpiled/mongodb/lib/cmap/errors.js +0 -128
  352. package/transpiled/mongodb/lib/cmap/handshake/client_metadata.js +0 -278
  353. package/transpiled/mongodb/lib/cmap/metrics.js +0 -67
  354. package/transpiled/mongodb/lib/cmap/stream_description.js +0 -74
  355. package/transpiled/mongodb/lib/cmap/wire_protocol/compression.js +0 -196
  356. package/transpiled/mongodb/lib/cmap/wire_protocol/constants.js +0 -19
  357. package/transpiled/mongodb/lib/cmap/wire_protocol/on_data.js +0 -144
  358. package/transpiled/mongodb/lib/cmap/wire_protocol/on_demand/document.js +0 -278
  359. package/transpiled/mongodb/lib/cmap/wire_protocol/responses.js +0 -376
  360. package/transpiled/mongodb/lib/cmap/wire_protocol/shared.js +0 -49
  361. package/transpiled/mongodb/lib/collection.js +0 -852
  362. package/transpiled/mongodb/lib/connection_string.js +0 -1452
  363. package/transpiled/mongodb/lib/constants.js +0 -162
  364. package/transpiled/mongodb/lib/cursor/abstract_cursor.js +0 -1082
  365. package/transpiled/mongodb/lib/cursor/aggregation_cursor.js +0 -227
  366. package/transpiled/mongodb/lib/cursor/change_stream_cursor.js +0 -136
  367. package/transpiled/mongodb/lib/cursor/client_bulk_write_cursor.js +0 -69
  368. package/transpiled/mongodb/lib/cursor/find_cursor.js +0 -476
  369. package/transpiled/mongodb/lib/cursor/list_collections_cursor.js +0 -48
  370. package/transpiled/mongodb/lib/cursor/list_indexes_cursor.js +0 -46
  371. package/transpiled/mongodb/lib/cursor/list_search_indexes_cursor.js +0 -30
  372. package/transpiled/mongodb/lib/cursor/run_command_cursor.js +0 -125
  373. package/transpiled/mongodb/lib/db.js +0 -467
  374. package/transpiled/mongodb/lib/deps.js +0 -174
  375. package/transpiled/mongodb/lib/encrypter.js +0 -129
  376. package/transpiled/mongodb/lib/error.js +0 -1550
  377. package/transpiled/mongodb/lib/explain.js +0 -122
  378. package/transpiled/mongodb/lib/gridfs/download.js +0 -369
  379. package/transpiled/mongodb/lib/gridfs/index.js +0 -240
  380. package/transpiled/mongodb/lib/gridfs/upload.js +0 -446
  381. package/transpiled/mongodb/lib/index.js +0 -975
  382. package/transpiled/mongodb/lib/mongo_client.js +0 -626
  383. package/transpiled/mongodb/lib/mongo_client_auth_providers.js +0 -98
  384. package/transpiled/mongodb/lib/mongo_logger.js +0 -812
  385. package/transpiled/mongodb/lib/mongo_types.js +0 -71
  386. package/transpiled/mongodb/lib/operations/aggregate.js +0 -129
  387. package/transpiled/mongodb/lib/operations/bulk_write.js +0 -48
  388. package/transpiled/mongodb/lib/operations/client_bulk_write/client_bulk_write.js +0 -96
  389. package/transpiled/mongodb/lib/operations/client_bulk_write/command_builder.js +0 -409
  390. package/transpiled/mongodb/lib/operations/client_bulk_write/common.js +0 -5
  391. package/transpiled/mongodb/lib/operations/client_bulk_write/executor.js +0 -144
  392. package/transpiled/mongodb/lib/operations/client_bulk_write/results_merger.js +0 -228
  393. package/transpiled/mongodb/lib/operations/collections.js +0 -49
  394. package/transpiled/mongodb/lib/operations/command.js +0 -102
  395. package/transpiled/mongodb/lib/operations/count.js +0 -60
  396. package/transpiled/mongodb/lib/operations/create_collection.js +0 -109
  397. package/transpiled/mongodb/lib/operations/delete.js +0 -134
  398. package/transpiled/mongodb/lib/operations/distinct.js +0 -77
  399. package/transpiled/mongodb/lib/operations/drop.js +0 -102
  400. package/transpiled/mongodb/lib/operations/estimated_document_count.js +0 -47
  401. package/transpiled/mongodb/lib/operations/execute_operation.js +0 -251
  402. package/transpiled/mongodb/lib/operations/find.js +0 -197
  403. package/transpiled/mongodb/lib/operations/find_and_modify.js +0 -191
  404. package/transpiled/mongodb/lib/operations/get_more.js +0 -84
  405. package/transpiled/mongodb/lib/operations/indexes.js +0 -197
  406. package/transpiled/mongodb/lib/operations/insert.js +0 -138
  407. package/transpiled/mongodb/lib/operations/is_capped.js +0 -44
  408. package/transpiled/mongodb/lib/operations/kill_cursors.js +0 -58
  409. package/transpiled/mongodb/lib/operations/list_collections.js +0 -66
  410. package/transpiled/mongodb/lib/operations/list_databases.js +0 -56
  411. package/transpiled/mongodb/lib/operations/operation.js +0 -88
  412. package/transpiled/mongodb/lib/operations/options_operation.js +0 -44
  413. package/transpiled/mongodb/lib/operations/profiling_level.js +0 -42
  414. package/transpiled/mongodb/lib/operations/remove_user.js +0 -35
  415. package/transpiled/mongodb/lib/operations/rename.js +0 -48
  416. package/transpiled/mongodb/lib/operations/run_command.js +0 -64
  417. package/transpiled/mongodb/lib/operations/search_indexes/create.js +0 -41
  418. package/transpiled/mongodb/lib/operations/search_indexes/drop.js +0 -51
  419. package/transpiled/mongodb/lib/operations/search_indexes/update.js +0 -40
  420. package/transpiled/mongodb/lib/operations/set_profiling_level.js +0 -70
  421. package/transpiled/mongodb/lib/operations/stats.js +0 -39
  422. package/transpiled/mongodb/lib/operations/update.js +0 -218
  423. package/transpiled/mongodb/lib/operations/validate_collection.js +0 -49
  424. package/transpiled/mongodb/lib/read_concern.js +0 -92
  425. package/transpiled/mongodb/lib/read_preference.js +0 -215
  426. package/transpiled/mongodb/lib/resource_management.js +0 -74
  427. package/transpiled/mongodb/lib/sdam/common.js +0 -53
  428. package/transpiled/mongodb/lib/sdam/events.js +0 -177
  429. package/transpiled/mongodb/lib/sdam/monitor.js +0 -656
  430. package/transpiled/mongodb/lib/sdam/server.js +0 -463
  431. package/transpiled/mongodb/lib/sdam/server_description.js +0 -196
  432. package/transpiled/mongodb/lib/sdam/server_selection.js +0 -283
  433. package/transpiled/mongodb/lib/sdam/server_selection_events.js +0 -112
  434. package/transpiled/mongodb/lib/sdam/srv_polling.js +0 -139
  435. package/transpiled/mongodb/lib/sdam/topology.js +0 -833
  436. package/transpiled/mongodb/lib/sdam/topology_description.js +0 -447
  437. package/transpiled/mongodb/lib/sessions.js +0 -988
  438. package/transpiled/mongodb/lib/sort.js +0 -123
  439. package/transpiled/mongodb/lib/timeout.js +0 -349
  440. package/transpiled/mongodb/lib/transactions.js +0 -149
  441. package/transpiled/mongodb/lib/utils.js +0 -1502
  442. package/transpiled/mongodb/lib/write_concern.js +0 -115
@@ -36,8 +36,9 @@ class ReportPortalReporter extends _ReporterBase.default {
36
36
  this.cbCaseToRpIdHash = {};
37
37
  this.cbStepToRpIdHash = {};
38
38
  this.cbSuiteResultListByRefId = {};
39
- this.currentTransactionStepId = undefined;
40
- this.currentSubStepId = undefined;
39
+ this.cbCaseToCurrentTransactionId = {};
40
+ this.cbCaseToCurrentSubStepId = {};
41
+ this.promises = [];
41
42
 
42
43
  if (!this.reporterOpts || !this.reporterOpts.apiKey || !this.reporterOpts.endpoint || !this.reporterOpts.project) {
43
44
  throw new Error('ReportPortal options are missing in oxygen.conf file.');
@@ -72,7 +73,7 @@ class ReportPortalReporter extends _ReporterBase.default {
72
73
  debug: false
73
74
  });
74
75
  this.tempLaunchId = tempId;
75
- await this.promiseWithTimeout(promise);
76
+ this.handlePromise(promise);
76
77
  } catch (e) {
77
78
  console.dir(`RP - Failed to start launch: ${e}`);
78
79
  }
@@ -85,12 +86,13 @@ class ReportPortalReporter extends _ReporterBase.default {
85
86
  const hasFailed = results.some(x => x.status === _status.default.FAILED);
86
87
 
87
88
  try {
89
+ await Promise.all(this.promises);
88
90
  const {
89
91
  promise
90
92
  } = await this.rpClient.finishLaunch(this.tempLaunchId, {
91
93
  status: hasFailed ? 'FAILED' : 'PASSED'
92
94
  });
93
- await this.promiseWithTimeout(promise);
95
+ await promise;
94
96
  } catch (e) {
95
97
  console.dir(`RP - Failed to end launch: ${e}`);
96
98
  }
@@ -131,7 +133,7 @@ class ReportPortalReporter extends _ReporterBase.default {
131
133
  promise
132
134
  } = this.rpClient.startTestItem(startTestItemReq, this.tempLaunchId);
133
135
  this.cbSuiteToRpIdHash[suiteRefId] = tempId;
134
- await this.promiseWithTimeout(promise);
136
+ this.handlePromise(promise);
135
137
  } catch (e) {
136
138
  console.dir(`RP - Failed to start suite item: ${e}`);
137
139
  }
@@ -170,9 +172,9 @@ class ReportPortalReporter extends _ReporterBase.default {
170
172
  promise
171
173
  } = this.rpClient.startTestItem(startTestItemReq, this.tempLaunchId, rpSuiteId);
172
174
  this.cbCaseToRpIdHash[caseId] = tempId;
173
- await this.promiseWithTimeout(promise);
175
+ this.handlePromise(promise);
174
176
  } catch (e) {
175
- console.dir(`RP - Failed to start test item: ${e}`);
177
+ console.dir(`RP - Failed to start case item: ${e}`);
176
178
  }
177
179
  }
178
180
 
@@ -210,13 +212,33 @@ class ReportPortalReporter extends _ReporterBase.default {
210
212
  const {
211
213
  promise
212
214
  } = this.rpClient.sendLog(rpTestId, logReq, rpFile);
213
- await this.promiseWithTimeout(promise);
215
+ this.handlePromise(promise);
214
216
  } catch (e) {
215
- console.dir(`RP - Failed to send log for finished test item: ${e}`);
217
+ console.dir(`RP - Failed to send log for finished case item: ${e}`);
216
218
  }
217
219
  }
218
220
  }
219
221
 
222
+ const transId = this.cbCaseToCurrentTransactionId[caseId];
223
+
224
+ if (transId) {
225
+ const finishTransactionReq = {
226
+ status: 'passed'
227
+ };
228
+
229
+ try {
230
+ const transRpId = this.cbStepToRpIdHash[transId];
231
+ const {
232
+ promise
233
+ } = this.rpClient.finishTestItem(transRpId, finishTransactionReq);
234
+ this.handlePromise(promise);
235
+ } catch (e) {
236
+ console.dir(`RP - Failed to finish transaction item on case end: ${e}`);
237
+ }
238
+
239
+ delete this.cbCaseToCurrentTransactionId[caseId];
240
+ }
241
+
220
242
  const finishTestItemReq = {
221
243
  status: result.status.toLowerCase()
222
244
  };
@@ -225,12 +247,10 @@ class ReportPortalReporter extends _ReporterBase.default {
225
247
  const {
226
248
  promise
227
249
  } = this.rpClient.finishTestItem(rpTestId, finishTestItemReq);
228
- await this.promiseWithTimeout(promise);
250
+ this.handlePromise(promise);
229
251
  } catch (e) {
230
- console.dir(`RP - Failed to finish test item: ${e}`);
252
+ console.dir(`RP - Failed to finish case item: ${e}`);
231
253
  }
232
-
233
- this.currentTransactionStepId = undefined;
234
254
  }
235
255
 
236
256
  async onStepStart({
@@ -249,14 +269,31 @@ class ReportPortalReporter extends _ReporterBase.default {
249
269
 
250
270
  const rpCaseId = this.cbCaseToRpIdHash[caseId];
251
271
  let rpParentId;
272
+ const transId = this.cbCaseToCurrentTransactionId[caseId];
252
273
 
253
274
  if (step.name === 'transaction') {
254
- this.currentTransactionStepId = step.id;
255
- this.currentSubStepId = undefined;
275
+ if (transId) {
276
+ const finishTransactionReq = {
277
+ status: 'passed'
278
+ };
279
+
280
+ try {
281
+ const transRpId = this.cbStepToRpIdHash[transId];
282
+ const {
283
+ promise
284
+ } = this.rpClient.finishTestItem(transRpId, finishTransactionReq);
285
+ this.handlePromise(promise);
286
+ } catch (e) {
287
+ console.dir(`RP - Failed to finish transaction item on case end: ${e}`);
288
+ }
289
+ }
290
+
291
+ this.cbCaseToCurrentTransactionId[caseId] = step.id;
292
+ delete this.cbCaseToCurrentSubStepId[caseId];
256
293
  rpParentId = rpCaseId;
257
294
  } else {
258
- this.currentSubStepId = step.id;
259
- rpParentId = this.currentTransactionStepId ? this.cbStepToRpIdHash[this.currentTransactionStepId] : rpCaseId;
295
+ this.cbCaseToCurrentSubStepId[caseId] = step.id;
296
+ rpParentId = transId ? this.cbStepToRpIdHash[transId] : rpCaseId;
260
297
  }
261
298
 
262
299
  if (!rpParentId || !rpCaseId) {
@@ -279,7 +316,7 @@ class ReportPortalReporter extends _ReporterBase.default {
279
316
  promise
280
317
  } = this.rpClient.startTestItem(startTestItemReq, this.tempLaunchId, rpParentId);
281
318
  this.cbStepToRpIdHash[step.id] = tempId;
282
- await this.promiseWithTimeout(promise);
319
+ this.handlePromise(promise);
283
320
  } catch (e) {
284
321
  console.dir(`RP - Failed to start step item: ${e}`);
285
322
  }
@@ -287,13 +324,14 @@ class ReportPortalReporter extends _ReporterBase.default {
287
324
 
288
325
  async onStepEnd({
289
326
  rid,
327
+ caseId,
290
328
  step: result
291
329
  }) {
292
330
  if (!this.reportSteps) {
293
331
  return;
294
332
  }
295
333
 
296
- if (result.name && result.name.startsWith('log.')) {
334
+ if (result.name && (result.name.startsWith('log.') || result.name.startsWith('web.transaction') || result.name.startsWith('mob.transaction'))) {
297
335
  return;
298
336
  }
299
337
 
@@ -303,10 +341,7 @@ class ReportPortalReporter extends _ReporterBase.default {
303
341
  return;
304
342
  }
305
343
 
306
- if (result.name !== 'transaction') {
307
- this.currentSubStepId = undefined;
308
- }
309
-
344
+ delete this.cbCaseToCurrentSubStepId[caseId];
310
345
  const status = result.status.toLowerCase();
311
346
 
312
347
  if (status === 'failed' && result.failure) {
@@ -329,9 +364,9 @@ class ReportPortalReporter extends _ReporterBase.default {
329
364
  const {
330
365
  promise
331
366
  } = this.rpClient.sendLog(rpStepId, logReq, rpFile);
332
- await this.promiseWithTimeout(promise);
367
+ this.handlePromise(promise);
333
368
  } catch (e) {
334
- console.dir(`RP - Failed to send log for finished test item: ${e}`);
369
+ console.dir(`RP - Failed to send log for finished step item: ${e}`);
335
370
  }
336
371
  }
337
372
  }
@@ -344,7 +379,7 @@ class ReportPortalReporter extends _ReporterBase.default {
344
379
  const {
345
380
  promise
346
381
  } = this.rpClient.finishTestItem(rpStepId, finishTestItemReq);
347
- await this.promiseWithTimeout(promise);
382
+ this.handlePromise(promise);
348
383
  } catch (e) {
349
384
  console.dir(`RP - Failed to finish step item: ${e}`);
350
385
  }
@@ -384,7 +419,7 @@ class ReportPortalReporter extends _ReporterBase.default {
384
419
  const {
385
420
  promise
386
421
  } = this.rpClient.sendLog(rpParentId || this.tempLaunchId, logReq);
387
- await this.promiseWithTimeout(promise);
422
+ this.handlePromise(promise);
388
423
  } catch (e) {
389
424
  console.dir(`RP - Failed to create log item: ${e}`);
390
425
  }
@@ -401,10 +436,10 @@ class ReportPortalReporter extends _ReporterBase.default {
401
436
  const time = step.time;
402
437
  let stepId = undefined;
403
438
 
404
- if (this.currentSubStepId) {
405
- stepId = this.currentSubStepId;
406
- } else if (this.currentTransactionStepId) {
407
- stepId = this.currentTransactionStepId;
439
+ if (this.cbCaseToCurrentSubStepId[caseId]) {
440
+ stepId = this.cbCaseToCurrentSubStepId[caseId];
441
+ } else if (this.cbCaseToCurrentTransactionId[caseId]) {
442
+ stepId = this.cbCaseToCurrentTransactionId[caseId];
408
443
  }
409
444
 
410
445
  await this.sendRpLog({
@@ -446,7 +481,7 @@ class ReportPortalReporter extends _ReporterBase.default {
446
481
  const {
447
482
  promise
448
483
  } = this.rpClient.sendLog(rpParentId || this.tempLaunchId, logReq);
449
- await this.promiseWithTimeout(promise);
484
+ this.handlePromise(promise);
450
485
  } catch (e) {
451
486
  console.dir(`RP - Failed to create log item: ${e}`);
452
487
  }
@@ -467,7 +502,7 @@ class ReportPortalReporter extends _ReporterBase.default {
467
502
  const {
468
503
  promise
469
504
  } = this.rpClient.finishTestItem(rpSuiteId, finishTestItemReq);
470
- await this.promiseWithTimeout(promise);
505
+ this.handlePromise(promise);
471
506
  } catch (e) {
472
507
  console.dir(`RP - Failed to finish suite item: ${e}`);
473
508
  }
@@ -518,18 +553,14 @@ class ReportPortalReporter extends _ReporterBase.default {
518
553
  }
519
554
  }
520
555
 
521
- promiseWithTimeout(promise, timeout = 30 * 1000) {
522
- return new Promise((resolve, reject) => {
523
- if (!promise || !promise.then) {
524
- reject(new Error(`Promise await timeout of ${timeout} ms`));
525
- }
526
-
527
- promise.then(resolve, reject);
528
- setTimeout(reject, timeout);
556
+ handlePromise(promise) {
557
+ promise.catch(err => {
558
+ console.log('RP error: ', err);
529
559
  });
560
+ this.promises.push(promise);
530
561
  }
531
562
 
532
563
  }
533
564
 
534
565
  exports.default = ReportPortalReporter;
535
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9yZXBvcnRlcnMvcmVwb3J0ZXItcnAuanMiXSwibmFtZXMiOlsiUlBDbGllbnQiLCJyZXF1aXJlIiwiTEFVTkNIX01PREVTIiwiREVGQVVMVCIsIkRFQlVHIiwiVEVTVF9JVEVNX1RZUEVTIiwiU1VJVEUiLCJURVNUIiwiU1RFUCIsIk1BWF9OQU1FX0xFTkdUSCIsIlJlcG9ydFBvcnRhbFJlcG9ydGVyIiwiUmVwb3J0ZXJCYXNlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwicmVwb3J0ZXJPcHRzIiwiYWdncmVnYXRvciIsInJwIiwicmVwb3J0U3RlcHMiLCJyZXBvcnRMb2dzIiwiY2JTdWl0ZVRvUnBJZEhhc2giLCJjYkNhc2VUb1JwSWRIYXNoIiwiY2JTdGVwVG9ScElkSGFzaCIsImNiU3VpdGVSZXN1bHRMaXN0QnlSZWZJZCIsImN1cnJlbnRUcmFuc2FjdGlvblN0ZXBJZCIsInVuZGVmaW5lZCIsImN1cnJlbnRTdWJTdGVwSWQiLCJhcGlLZXkiLCJlbmRwb2ludCIsInByb2plY3QiLCJFcnJvciIsInJwQ2xpZW50IiwibGF1bmNoIiwibmFtZSIsImluaXQiLCJjaGVja0Nvbm5lY3QiLCJlIiwibWVzc2FnZSIsImdlbmVyYXRlIiwicmVzdWx0cyIsIm9uTGF1bmNoU3RhcnQiLCJ0ZW1wSWQiLCJwcm9taXNlIiwic3RhcnRMYXVuY2giLCJtb2RlIiwiZGVidWciLCJ0ZW1wTGF1bmNoSWQiLCJwcm9taXNlV2l0aFRpbWVvdXQiLCJjb25zb2xlIiwiZGlyIiwib25MYXVuY2hFbmQiLCJfcmVwb3J0RW5kT2ZTdGFydGVkU3VpdGVzIiwiaGFzRmFpbGVkIiwic29tZSIsIngiLCJzdGF0dXMiLCJTdGF0dXMiLCJGQUlMRUQiLCJmaW5pc2hMYXVuY2giLCJvblJ1bm5lclN0YXJ0IiwicmlkIiwib3B0cyIsImNhcHMiLCJvblJ1bm5lckVuZCIsInJlc3VsdCIsIm9uU3VpdGVTdGFydCIsInN1aXRlSWQiLCJzdWl0ZSIsInN1aXRlRGVmIiwic3VpdGVSZWZJZCIsInJlZklkIiwic3RhcnRUZXN0SXRlbVJlcSIsInR5cGUiLCJzdGFydFRlc3RJdGVtIiwib25TdWl0ZUVuZCIsInB1c2giLCJvbkNhc2VTdGFydCIsImNhc2VJZCIsImNhc2VEZWYiLCJjb2RlUmVmIiwicGF0aCIsInJwU3VpdGVJZCIsIm9uQ2FzZUVuZCIsInJwVGVzdElkIiwidG9Mb3dlckNhc2UiLCJmYWlsdXJlIiwicnBGaWxlIiwic2NyZWVuc2hvdCIsImNvbnRlbnQiLCJsb2dNc2ciLCJfc3RyaW5naWZ5IiwibG9nUmVxIiwibGV2ZWwiLCJzZW5kTG9nIiwiZmluaXNoVGVzdEl0ZW1SZXEiLCJmaW5pc2hUZXN0SXRlbSIsIm9uU3RlcFN0YXJ0Iiwic3RlcCIsIm1vZHVsZSIsInJlcG9ydExvZ1N0ZXAiLCJycENhc2VJZCIsInJwUGFyZW50SWQiLCJpZCIsInN0ZXBOYW1lIiwiX2dldFN0ZXBOYW1lIiwibG9jYXRpb24iLCJ0ZXN0Q2FzZUlkIiwiaGFzU3RhdHMiLCJvblN0ZXBFbmQiLCJzdGFydHNXaXRoIiwicnBTdGVwSWQiLCJmaWxlIiwib25Mb2ciLCJzdGVwSWQiLCJtc2ciLCJ0aW1lIiwic3JjIiwicnBMZXZlbCIsIl9nZXRScExldmVsIiwiYXJncyIsImxlbmd0aCIsInNlbmRScExvZyIsIk9iamVjdCIsImtleXMiLCJoYXNGYWlsZWRTdWl0ZSIsIm94TGV2ZWwiLCJzaWduYXR1cmUiLCJzdWJzdHJpbmciLCJTdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwiZXJyb3IiLCJ0aW1lb3V0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJ0aGVuIiwic2V0VGltZW91dCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBWUE7O0FBQ0E7Ozs7QUFDQSxNQUFNQSxRQUFRLEdBQUdDLE9BQU8sQ0FBQyxnQ0FBRCxDQUF4Qjs7QUFDQSxNQUFNQyxZQUFZLEdBQUc7QUFDakJDLEVBQUFBLE9BQU8sRUFBRSxTQURRO0FBRWpCQyxFQUFBQSxLQUFLLEVBQUU7QUFGVSxDQUFy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QWUsQ0FBZixFQUFrQnJILGVBQWUsR0FBQyxDQUFsQyxJQUF1QyxLQUE5QztBQUNIOztBQUNELFdBQU91QixJQUFQO0FBQ0g7O0FBR0R5RCxFQUFBQSxVQUFVLENBQUN3QixHQUFELEVBQU07QUFFWixRQUFJLE9BQU9BLEdBQVAsS0FBZSxXQUFmLElBQThCQSxHQUFHLEtBQUssSUFBMUMsRUFBZ0Q7QUFDNUMsYUFBTyxJQUFQO0FBQ0g7O0FBRUQsUUFBSSxPQUFPQSxHQUFQLEtBQWUsUUFBZixJQUEyQkEsR0FBRyxZQUFZYyxNQUE5QyxFQUFzRDtBQUNsRCxhQUFPZCxHQUFQO0FBQ0g7O0FBRUQsUUFBSTtBQUNBLGFBQU9lLElBQUksQ0FBQ0MsU0FBTCxDQUFlaEIsR0FBZixDQUFQO0FBQ0gsS0FGRCxDQUVFLE9BQU85RSxDQUFQLEVBQVU7QUFDUlksTUFBQUEsT0FBTyxDQUFDbUYsS0FBUixDQUFjLHlEQUFkO0FBQ0g7QUFDSjs7QUFFRHBGLEVBQUFBLGtCQUFrQixDQUFDTCxPQUFELEVBQVUwRixPQUFPLEdBQUcsS0FBSyxJQUF6QixFQUErQjtBQUM3QyxXQUFPLElBQUlDLE9BQUosQ0FBWSxDQUFDQyxPQUFELEVBQVVDLE1BQVYsS0FBcUI7QUFDcEMsVUFBSSxDQUFDN0YsT0FBRCxJQUFZLENBQUNBLE9BQU8sQ0FBQzhGLElBQXpCLEVBQStCO0FBQzNCRCxRQUFBQSxNQUFNLENBQUMsSUFBSXpHLEtBQUosQ0FBVyw0QkFBMkJzRyxPQUFRLEtBQTlDLENBQUQsQ0FBTjtBQUNIOztBQUNEMUYsTUFBQUEsT0FBTyxDQUFDOEYsSUFBUixDQUFhRixPQUFiLEVBQXNCQyxNQUF0QjtBQUNBRSxNQUFBQSxVQUFVLENBQUNGLE1BQUQsRUFBU0gsT0FBVCxDQUFWO0FBQ0gsS0FOTSxDQUFQO0FBT0g7O0FBNWEwRCIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKi9cblxuLypcbiAqIE94eWdlbiBSZXBvcnRlciBmb3IgUmVwb3J0UG9ydGFsXG4gKi9cbmltcG9ydCBSZXBvcnRlckJhc2UgZnJvbSAnLi4vcmVwb3J0ZXIvUmVwb3J0ZXJCYXNlJztcbmltcG9ydCBTdGF0dXMgZnJvbSAnLi4vbW9kZWwvc3RhdHVzJztcbmNvbnN0IFJQQ2xpZW50ID0gcmVxdWlyZSgnQG94eWdlbmhxL3JwLWNsaWVudC1qYXZhc2NyaXB0Jyk7XG5jb25zdCBMQVVOQ0hfTU9ERVMgPSB7XG4gICAgREVGQVVMVDogJ0RFRkFVTFQnLFxuICAgIERFQlVHOiAnREVCVUcnLFxufTtcbmNvbnN0IFRFU1RfSVRFTV9UWVBFUyA9IHtcbiAgICBTVUlURTogJ1NVSVRFJyxcbiAgICBURVNUOiAnVEVTVCcsXG4gICAgU1RFUDogJ1NURVAnLFxufTtcbmNvbnN0IE1BWF9OQU1FX0xFTkdUSCA9IDEyODtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVwb3J0UG9ydGFsUmVwb3J0ZXIgZXh0ZW5kcyBSZXBvcnRlckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIHJlcG9ydGVyT3B0cywgYWdncmVnYXRvcikge1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgICAgdGhpcy5yZXBvcnRlck9wdHMgPSByZXBvcnRlck9wdHMgfHwgb3B0aW9ucy5ycDtcbiAgICAgICAgdGhpcy5yZXBvcnRTdGVwcyA9IHJlcG9ydGVyT3B0cy5yZXBvcnRTdGVwcyB8fCB0cnVlO1xuICAgICAgICB0aGlzLnJlcG9ydExvZ3MgPSByZXBvcnRlck9wdHMucmVwb3J0TG9ncyB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5jYlN1aXRlVG9ScElkSGFzaCA9IHt9O1xuICAgICAgICB0aGlzLmNiQ2FzZVRvUnBJZEhhc2ggPSB7fTtcbiAgICAgICAgdGhpcy5jYlN0ZXBUb1JwSWRIYXNoID0ge307XG4gICAgICAgIHRoaXMuY2JTdWl0ZVJlc3VsdExpc3RCeVJlZklkID0ge307XG4gICAgICAgIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uU3RlcElkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmN1cnJlbnRTdWJTdGVwSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICF0aGlzLnJlcG9ydGVyT3B0c1xuICAgICAgICAgICAgfHwgIXRoaXMucmVwb3J0ZXJPcHRzLmFwaUtleVxuICAgICAgICAgICAgfHwgIXRoaXMucmVwb3J0ZXJPcHRzLmVuZHBvaW50XG4gICAgICAgICAgICB8fCAhdGhpcy5yZXBvcnRlck9wdHMucHJvamVjdFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVwb3J0UG9ydGFsIG9wdGlvbnMgYXJlIG1pc3NpbmcgaW4gb3h5Z2VuLmNvbmYgZmlsZS4nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFnZ3JlZ2F0b3IgPSBhZ2dyZWdhdG9yO1xuICAgICAgICB0aGlzLnJwQ2xpZW50ID0gbmV3IFJQQ2xpZW50KHtcbiAgICAgICAgICAgIGxhdW5jaDogdGhpcy5yZXBvcnRlck9wdHMubGF1bmNoIHx8IHRoaXMub3B0aW9ucy5uYW1lLFxuICAgICAgICAgICAgLi4udGhpcy5yZXBvcnRlck9wdHNcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnBDbGllbnQuY2hlY2tDb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUlAgLSBFcnJvciBjb25uZWN0aW5nIHRvIHRoZSBzZXJ2ZXI6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGdlbmVyYXRlKHJlc3VsdHMpIHtcbiAgICB9XG4gICAgLy8gRXZlbnRzXG4gICAgYXN5bmMgb25MYXVuY2hTdGFydCh7IG9wdGlvbnMgfSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgeyB0ZW1wSWQsIHByb21pc2UgfSA9IHRoaXMucnBDbGllbnQuc3RhcnRMYXVuY2goe1xuICAgICAgICAgICAgICAgIG1vZGU6IHRoaXMucmVwb3J0ZXJPcHRzLm1vZGUgfHwgTEFVTkNIX01PREVTLkRFRkFVTFQsXG4gICAgICAgICAgICAgICAgZGVidWc6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnRlbXBMYXVuY2hJZCA9IHRlbXBJZDtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvbWlzZVdpdGhUaW1lb3V0KHByb21pc2UpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gc3RhcnQgbGF1bmNoOiAke2V9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgb25MYXVuY2hFbmQoeyByZXN1bHRzIH0pIHtcbiAgICAgICAgLy8gcmVwb3J0IHRoZSBlbmQgb2YgYWxsIHN0YXJ0ZWQgc3VpdGVzXG4gICAgICAgIGF3YWl0IHRoaXMuX3JlcG9ydEVuZE9mU3RhcnRlZFN1aXRlcygpO1xuICAgICAgICAvLyBDYWxjdWxhdGUgbGF1bmNoIHN0YXR1c1xuICAgICAgICBjb25zdCBoYXNGYWlsZWQgPSByZXN1bHRzLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gYXdhaXQgdGhpcy5ycENsaWVudC5maW5pc2hMYXVuY2godGhpcy50ZW1wTGF1bmNoSWQsIHtcbiAgICAgICAgICAgICAgICBzdGF0dXM6IGhhc0ZhaWxlZCA/ICdGQUlMRUQnIDogJ1BBU1NFRCdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9taXNlV2l0aFRpbWVvdXQocHJvbWlzZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBlbmQgbGF1bmNoOiAke2V9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgb25SdW5uZXJTdGFydCh7IHJpZCwgb3B0cywgY2FwcyB9KSB7XG4gICAgfVxuICAgIGFzeW5jIG9uUnVubmVyRW5kKHsgcmlkLCByZXN1bHQgfSkge1xuICAgIH1cbiAgICBhc3luYyBvblN1aXRlU3RhcnQoeyByaWQsIHN1aXRlSWQsIHN1aXRlOiBzdWl0ZURlZiB9KSB7XG4gICAgICAgIC8vIGluIHBhcmFsbGVsIHRlc3QgZXhlY3V0aW9uLCBvblN1aXRlU3RhcnQgd2lsbCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIHRoZSBzYW1lIHN1aXRlIFxuICAgICAgICAvLyBtYWtlIHN1cmUgd2UgY2FsbCBcInN0YXJ0VGVzdEl0ZW1cIiB0aGUgc2FtZSBzdWl0ZSBvbmx5IG9uY2VcbiAgICAgICAgY29uc3Qgc3VpdGVSZWZJZCA9IHN1aXRlRGVmLnJlZklkO1xuICAgICAgICBpZiAodGhpcy5jYlN1aXRlVG9ScElkSGFzaFtzdWl0ZVJlZklkXSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFzc2lnbiBlbXB0eSBvYmplY3QgYXMgYSBmb3JtIG9mIG11bHRpLXRocmVhZCBsb2NrLFxuICAgICAgICAvLyBzbyB0aGUgcGFyYWxsZWwgY2FsbCB0byBvblN1aXRlU3RhcnQgZnJvbSB0aGUgbmV4dCB0aHJlYWRcbiAgICAgICAgLy8gd2lsbCBub3QgdHJ5IHRvIHByb2NlZWQgd2l0aCB0aGUgY29kZSBiZWxvd1xuICAgICAgICB0aGlzLmNiU3VpdGVUb1JwSWRIYXNoW3N1aXRlUmVmSWRdID0ge307XG4gICAgICAgIHRoaXMuY2JTdWl0ZVJlc3VsdExpc3RCeVJlZklkW3N1aXRlUmVmSWRdID0gW107XG4gICAgICAgIGNvbnN0IHN0YXJ0VGVzdEl0ZW1SZXEgPSB7XG4gICAgICAgICAgICBuYW1lOiBzdWl0ZURlZi5uYW1lIHx8IHRoaXMub3B0aW9ucy5uYW1lLFxuICAgICAgICAgICAgdHlwZTogVEVTVF9JVEVNX1RZUEVTLlNVSVRFLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IHRlbXBJZCwgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zdGFydFRlc3RJdGVtKHN0YXJ0VGVzdEl0ZW1SZXEsIHRoaXMudGVtcExhdW5jaElkKTtcbiAgICAgICAgICAgIHRoaXMuY2JTdWl0ZVRvUnBJZEhhc2hbc3VpdGVSZWZJZF0gPSB0ZW1wSWQ7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnByb21pc2VXaXRoVGltZW91dChwcm9taXNlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIHN0YXJ0IHN1aXRlIGl0ZW06ICR7ZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBvblN1aXRlRW5kKHsgcmlkLCBzdWl0ZUlkLCByZXN1bHQgfSkge1xuICAgICAgICBjb25zdCBzdWl0ZVJlZklkID0gcmVzdWx0LnJlZklkO1xuICAgICAgICB0aGlzLmNiU3VpdGVSZXN1bHRMaXN0QnlSZWZJZFtzdWl0ZVJlZklkXSAmJiB0aGlzLmNiU3VpdGVSZXN1bHRMaXN0QnlSZWZJZFtzdWl0ZVJlZklkXS5wdXNoKHJlc3VsdCk7XG4gICAgfVxuICAgIGFzeW5jIG9uQ2FzZVN0YXJ0KHsgcmlkLCBzdWl0ZUlkLCBzdWl0ZVJlZklkLCBjYXNlSWQsICdjYXNlJzogY2FzZURlZiB9KSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGVzdEl0ZW1SZXEgPSB7XG4gICAgICAgICAgICBuYW1lOiBjYXNlRGVmLm5hbWUsXG4gICAgICAgICAgICB0eXBlOiBURVNUX0lURU1fVFlQRVMuVEVTVCxcbiAgICAgICAgICAgIGNvZGVSZWY6IGNhc2VEZWYucGF0aCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcnBTdWl0ZUlkID0gdGhpcy5jYlN1aXRlVG9ScElkSGFzaFtzdWl0ZVJlZklkXTtcbiAgICAgICAgaWYgKCFycFN1aXRlSWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IHRlbXBJZCwgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zdGFydFRlc3RJdGVtKHN0YXJ0VGVzdEl0ZW1SZXEsIHRoaXMudGVtcExhdW5jaElkLCBycFN1aXRlSWQpO1xuICAgICAgICAgICAgdGhpcy5jYkNhc2VUb1JwSWRIYXNoW2Nhc2VJZF0gPSB0ZW1wSWQ7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnByb21pc2VXaXRoVGltZW91dChwcm9taXNlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIHN0YXJ0IHRlc3QgaXRlbTogJHtlfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIG9uQ2FzZUVuZCh7IHJpZCwgc3VpdGVJZCwgc3VpdGVSZWZJZCwgY2FzZUlkLCByZXN1bHQgfSkge1xuICAgICAgICBjb25zdCBycFRlc3RJZCA9IHRoaXMuY2JDYXNlVG9ScElkSGFzaFtjYXNlSWRdO1xuICAgICAgICBpZiAoIXJwVGVzdElkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzdWx0LnN0YXR1cy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoc3RhdHVzID09PSAnZmFpbGVkJyAmJiByZXN1bHQuZmFpbHVyZSkge1xuICAgICAgICAgICAgY29uc3QgcnBGaWxlID0gcmVzdWx0LnNjcmVlbnNob3QgP1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdzY3JlZW5zaG90JyxcbiAgICAgICAgICAgICAgICB0eXBlOiAnaW1hZ2UvcG5nJyxcbiAgICAgICAgICAgICAgICBjb250ZW50OiByZXN1bHQuc2NyZWVuc2hvdCxcbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIGNvbnN0IGxvZ01zZyA9IHRoaXMuX3N0cmluZ2lmeShyZXN1bHQuZmFpbHVyZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIGlmIChsb2dNc2cpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2dSZXEgPSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGxvZ01zZyxcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcidcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LnNlbmRMb2cocnBUZXN0SWQsIGxvZ1JlcSwgcnBGaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9taXNlV2l0aFRpbWVvdXQocHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gc2VuZCBsb2cgZm9yIGZpbmlzaGVkIHRlc3QgaXRlbTogJHtlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaW5pc2hUZXN0SXRlbVJlcSA9IHtcbiAgICAgICAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cy50b0xvd2VyQ2FzZSgpLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IHByb21pc2UgfSA9IHRoaXMucnBDbGllbnQuZmluaXNoVGVzdEl0ZW0ocnBUZXN0SWQsIGZpbmlzaFRlc3RJdGVtUmVxKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvbWlzZVdpdGhUaW1lb3V0KHByb21pc2UpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gZmluaXNoIHRlc3QgaXRlbTogJHtlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb25TdGVwSWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGFzeW5jIG9uU3RlcFN0YXJ0KHsgcmlkLCBjYXNlSWQsIHN0ZXAgfSkge1xuICAgICAgICBpZiAoIXRoaXMucmVwb3J0U3RlcHMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RlcC5tb2R1bGUgJiYgc3RlcC5tb2R1bGUgPT09ICdsb2cnKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlcG9ydExvZ1N0ZXAoY2FzZUlkLCBzdGVwKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBycENhc2VJZCA9IHRoaXMuY2JDYXNlVG9ScElkSGFzaFtjYXNlSWRdO1xuICAgICAgICBsZXQgcnBQYXJlbnRJZDtcblxuICAgICAgICBpZiAoc3RlcC5uYW1lID09PSAndHJhbnNhY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvblN0ZXBJZCA9IHN0ZXAuaWQ7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdWJTdGVwSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBycFBhcmVudElkID0gcnBDYXNlSWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdWJTdGVwSWQgPSBzdGVwLmlkO1xuICAgICAgICAgICAgcnBQYXJlbnRJZCA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uU3RlcElkID8gdGhpcy5jYlN0ZXBUb1JwSWRIYXNoW3RoaXMuY3VycmVudFRyYW5zYWN0aW9uU3RlcElkXSA6IHJwQ2FzZUlkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFycFBhcmVudElkIHx8ICFycENhc2VJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0ZXBOYW1lID0gdGhpcy5fZ2V0U3RlcE5hbWUoc3RlcCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGVzdEl0ZW1SZXEgPSB7XG4gICAgICAgICAgICBuYW1lOiBzdGVwTmFtZSxcbiAgICAgICAgICAgIHR5cGU6IFRFU1RfSVRFTV9UWVBFUy5TVEVQLFxuICAgICAgICAgICAgLy8gXCJjb2RlUmVmXCIgKyBcInBhcmFtZXRlcnNcIiB1c2VkIGJ5IFJQIGxpYiB0byBnZW5lcmF0ZSB0ZXN0Q2FzZUlkIGlmIHRlc3RDYXNlSWQgaXMgbm90IGRlZmluZWRcbiAgICAgICAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVwb3J0cG9ydGFsL2NsaWVudC1qYXZhc2NyaXB0L2Jsb2IvNDg2ZWY3MGM2MzhhOWEyMzI2NzI5MGM2MmRmMWZhZjkwMGY3ZGY2YS9saWIvcmVwb3J0LXBvcnRhbC1jbGllbnQuanMjTDQ5N1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBkaXNhYmxlZCBmb3Igbm93LiBub3Qgc3VyZSBpZiBhY3R1YWxseSBuZWVkZWQuLi5cbiAgICAgICAgICAgIC8vcGFyYW1ldGVyczogdGhpcy5fZ2V0UnBBcmdzKHN0ZXAuYXJncyksXG4gICAgICAgICAgICBjb2RlUmVmOiBzdGVwLmxvY2F0aW9uLFxuICAgICAgICAgICAgdGVzdENhc2VJZDogcnBDYXNlSWQsXG4gICAgICAgICAgICBoYXNTdGF0czogZmFsc2UsXG4gICAgICAgIH07XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGVtcElkLCBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LnN0YXJ0VGVzdEl0ZW0oc3RhcnRUZXN0SXRlbVJlcSwgdGhpcy50ZW1wTGF1bmNoSWQsIHJwUGFyZW50SWQpO1xuICAgICAgICAgICAgdGhpcy5jYlN0ZXBUb1JwSWRIYXNoW3N0ZXAuaWRdID0gdGVtcElkO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9taXNlV2l0aFRpbWVvdXQocHJvbWlzZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBzdGFydCBzdGVwIGl0ZW06ICR7ZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBvblN0ZXBFbmQoeyByaWQsIHN0ZXA6IHJlc3VsdCB9KSB7XG4gICAgICAgIGlmICghdGhpcy5yZXBvcnRTdGVwcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQubmFtZSAmJiByZXN1bHQubmFtZS5zdGFydHNXaXRoKCdsb2cuJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBycFN0ZXBJZCA9IHRoaXMuY2JTdGVwVG9ScElkSGFzaFtyZXN1bHQuaWRdO1xuICAgICAgICBpZiAoIXJwU3RlcElkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5uYW1lICE9PSAndHJhbnNhY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdWJTdGVwSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzdWx0LnN0YXR1cy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoc3RhdHVzID09PSAnZmFpbGVkJyAmJiByZXN1bHQuZmFpbHVyZSkge1xuICAgICAgICAgICAgY29uc3QgcnBGaWxlID0gcmVzdWx0LnNjcmVlbnNob3QgP1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdzY3JlZW5zaG90JyxcbiAgICAgICAgICAgICAgICB0eXBlOiAnaW1hZ2UvcG5nJyxcbiAgICAgICAgICAgICAgICBjb250ZW50OiByZXN1bHQuc2NyZWVuc2hvdCxcbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIGNvbnN0IGxvZ01zZyA9IHRoaXMuX3N0cmluZ2lmeShyZXN1bHQuZmFpbHVyZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIGlmIChsb2dNc2cpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2dSZXEgPSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGxvZ01zZyxcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGZpbGU6IHJwRmlsZSxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LnNlbmRMb2cocnBTdGVwSWQsIGxvZ1JlcSwgcnBGaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9taXNlV2l0aFRpbWVvdXQocHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gc2VuZCBsb2cgZm9yIGZpbmlzaGVkIHRlc3QgaXRlbTogJHtlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaW5pc2hUZXN0SXRlbVJlcSA9IHtcbiAgICAgICAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cy50b0xvd2VyQ2FzZSgpLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IHByb21pc2UgfSA9IHRoaXMucnBDbGllbnQuZmluaXNoVGVzdEl0ZW0ocnBTdGVwSWQsIGZpbmlzaFRlc3RJdGVtUmVxKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvbWlzZVdpdGhUaW1lb3V0KHByb21pc2UpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gZmluaXNoIHN0ZXAgaXRlbTogJHtlfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIG9uTG9nKHsgc3VpdGVJZCwgY2FzZUlkLCBzdGVwSWQsIGxldmVsLCBtc2csIHRpbWUsIHNyYyB9KSB7XG4gICAgICAgIGlmICghdGhpcy5yZXBvcnRMb2dzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3h5Z2VuIG1pZ2h0IHN0YXJ0IGdlbmVyYXRpbmcgbG9ncyBiZWZvcmUgb25SdW5uZXJTdGFydCBldmVudCwgaWdub3JlIHRoZW1cbiAgICAgICAgaWYgKCF0aGlzLnRlbXBMYXVuY2hJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJwUGFyZW50SWQgPSBzdGVwSWQgP1xuICAgICAgICAgICAgdGhpcy5jYlN0ZXBUb1JwSWRIYXNoW3N0ZXBJZF1cbiAgICAgICAgICAgIDogY2FzZUlkID8gdGhpcy5jYkNhc2VUb1JwSWRIYXNoW2Nhc2VJZF1cbiAgICAgICAgICAgIDogc3VpdGVJZCA/IHRoaXMuY2JTdWl0ZVRvUnBJZEhhc2hbc3VpdGVJZF1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBycExldmVsID0gdGhpcy5fZ2V0UnBMZXZlbChsZXZlbCk7XG5cbiAgICAgICAgY29uc3QgbG9nTXNnID0gdGhpcy5fc3RyaW5naWZ5KG1zZyk7XG4gICAgICAgIGlmIChsb2dNc2cpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvZ1JlcSA9IHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBsb2dNc2csXG4gICAgICAgICAgICAgICAgbGV2ZWw6IHJwTGV2ZWwsXG4gICAgICAgICAgICAgICAgdGltZTogdGltZSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LnNlbmRMb2cocnBQYXJlbnRJZCB8fCB0aGlzLnRlbXBMYXVuY2hJZCwgbG9nUmVxKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb21pc2VXaXRoVGltZW91dChwcm9taXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIGNyZWF0ZSBsb2cgaXRlbTogJHtlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHJlcG9ydExvZ1N0ZXAoY2FzZUlkLCBzdGVwKSB7XG4gICAgICAgIGlmICghc3RlcC5hcmdzIHx8ICFzdGVwLmFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGV2ZWwgPSBzdGVwLm5hbWU7XG4gICAgICAgIGNvbnN0IG1zZyA9IHN0ZXAuYXJnc1swXTtcbiAgICAgICAgY29uc3QgdGltZSA9IHN0ZXAudGltZTtcbiAgICAgICAgbGV0IHN0ZXBJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFN1YlN0ZXBJZCkge1xuICAgICAgICAgICAgc3RlcElkID0gdGhpcy5jdXJyZW50U3ViU3RlcElkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uU3RlcElkKSB7XG4gICAgICAgICAgICBzdGVwSWQgPSB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvblN0ZXBJZDtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnNlbmRScExvZyh7IHN1aXRlSWQ6IHVuZGVmaW5lZCwgY2FzZUlkLCBzdGVwSWQsIGxldmVsLCBtc2csIHRpbWUgfSk7XG4gICAgfVxuICAgIGFzeW5jIHNlbmRScExvZyh7IHN1aXRlSWQsIGNhc2VJZCwgc3RlcElkLCBsZXZlbCwgbXNnLCB0aW1lIH0pIHtcbiAgICAgICAgLy8gT3h5Z2VuIG1pZ2h0IHN0YXJ0IGdlbmVyYXRpbmcgbG9ncyBiZWZvcmUgb25SdW5uZXJTdGFydCBldmVudCwgaWdub3JlIHRoZW1cbiAgICAgICAgaWYgKCF0aGlzLnRlbXBMYXVuY2hJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJwUGFyZW50SWQgPSBzdGVwSWQgP1xuICAgICAgICAgICAgdGhpcy5jYlN0ZXBUb1JwSWRIYXNoW3N0ZXBJZF1cbiAgICAgICAgICAgIDogY2FzZUlkID8gdGhpcy5jYkNhc2VUb1JwSWRIYXNoW2Nhc2VJZF1cbiAgICAgICAgICAgIDogc3VpdGVJZCA/IHRoaXMuY2JTdWl0ZVRvUnBJZEhhc2hbc3VpdGVJZF1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBycExldmVsID0gdGhpcy5fZ2V0UnBMZXZlbChsZXZlbCk7XG5cbiAgICAgICAgY29uc3QgbG9nTXNnID0gdGhpcy5fc3RyaW5naWZ5KG1zZyk7XG4gICAgICAgIGlmIChsb2dNc2cpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvZ1JlcSA9IHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBsb2dNc2csXG4gICAgICAgICAgICAgICAgbGV2ZWw6IHJwTGV2ZWwsXG4gICAgICAgICAgICAgICAgdGltZTogdGltZSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LnNlbmRMb2cocnBQYXJlbnRJZCB8fCB0aGlzLnRlbXBMYXVuY2hJZCwgbG9nUmVxKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb21pc2VXaXRoVGltZW91dChwcm9taXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIGNyZWF0ZSBsb2cgaXRlbTogJHtlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIF9yZXBvcnRFbmRPZlN0YXJ0ZWRTdWl0ZXMoKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc3VpdGVSZWZJZCBvZiBPYmplY3Qua2V5cyh0aGlzLmNiU3VpdGVUb1JwSWRIYXNoKSkge1xuICAgICAgICAgICAgY29uc3QgcnBTdWl0ZUlkID0gdGhpcy5jYlN1aXRlVG9ScElkSGFzaFtzdWl0ZVJlZklkXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSB0aGlzLmNiU3VpdGVSZXN1bHRMaXN0QnlSZWZJZFtzdWl0ZVJlZklkXTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNiU3VpdGVUb1JwSWRIYXNoW3N1aXRlUmVmSWRdO1xuICAgICAgICAgICAgY29uc3QgaGFzRmFpbGVkU3VpdGUgPSByZXN1bHRzLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XG4gICAgICAgICAgICBjb25zdCBmaW5pc2hUZXN0SXRlbVJlcSA9IHtcbiAgICAgICAgICAgICAgICBzdGF0dXM6IGhhc0ZhaWxlZFN1aXRlID8gJ2ZhaWxlZCcgOiAncGFzc2VkJyxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LmZpbmlzaFRlc3RJdGVtKHJwU3VpdGVJZCwgZmluaXNoVGVzdEl0ZW1SZXEpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvbWlzZVdpdGhUaW1lb3V0KHByb21pc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gZmluaXNoIHN1aXRlIGl0ZW06ICR7ZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBfZ2V0UnBMZXZlbChveExldmVsKSB7XG4gICAgICAgIGlmIChveExldmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gb3hMZXZlbC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnaW5mbyc7XG4gICAgfVxuICAgIC8qX2dldFJwQXJncyhjYkFyZ3MpIHtcbiAgICAgICAgaWYgKCFjYkFyZ3MgfHwgIWNiQXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnBBcmdzID0gW107XG4gICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGNiQXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYXJnID0gY2JBcmdzW2ldO1xuICAgICAgICAgICAgbGV0IGFyZ1N0ciA9IHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8IGFyZyBpbnN0YW5jZW9mIFN0cmluZyA/IGFyZyA6IEpTT04uc3RyaW5naWZ5KGFyZyk7XG4gICAgICAgICAgICBycEFyZ3MucHVzaCh7XG4gICAgICAgICAgICAgICAga2V5OiBgYXJnJHtpfWAsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGFyZ1N0clxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJwQXJncztcbiAgICB9Ki9cbiAgICBfZ2V0U3RlcE5hbWUoc3RlcCkge1xuICAgICAgICBsZXQgbmFtZTtcblxuICAgICAgICBpZiAoc3RlcC5uYW1lID09PSAndHJhbnNhY3Rpb24nICYmIHN0ZXAuYXJncy5sZW5ndGggPiAwKSB7ICAvLyBGSVhNRTogc3RlcHMgbmVlZCB0byBiZSBuZXN0ZWQgdW5kZXIgdHJhbnNhY3Rpb25zXG4gICAgICAgICAgICBuYW1lID0gc3RlcC5hcmdzWzBdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0ZXAuc2lnbmF0dXJlKSB7XG4gICAgICAgICAgICBuYW1lID0gc3RlcC5zaWduYXR1cmU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RlcC5tb2R1bGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IGlzIHRoaXMgZXZlciByZWFjaGVkPyBcInN0ZXAuc2lnbmF0dXJlXCIgc2VlbXMgdG8gYWx3YXlzIGV4aXN0XG4gICAgICAgICAgICBuYW1lID0gYCR7c3RlcC5tb2R1bGV9LiR7c3RlcC5uYW1lfWA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBuYW1lID0gc3RlcC5uYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWF4aW11bSBhbGxvd2VkIG5hbWUgbGVuZ3RoIGluIFJQIGlzIDEwMjQgYnl0ZXNcbiAgICAgICAgLy8gd2UgdHJ1bmNhdGUgaXQgZXZlbiBsb3dlciBzbyBpdCB3aWxsIGRpc3BsYXkgbmljZWx5XG4gICAgICAgIGlmIChuYW1lLmxlbmd0aCA+IE1BWF9OQU1FX0xFTkdUSCkge1xuICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIE1BWF9OQU1FX0xFTkdUSC0zKSArICcuLi4nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuYW1lO1xuICAgIH1cblxuICAgIC8vIHJldHVybnMgbnVsbCBpZiBtc2cgY2Fubm90IGJlIHN0cmluZ2lmaWVkLCBvciBzdHJpZ2lmaWVzIGl0IGlmIGl0J3Mgbm90IGEgc3RyaW5nIGFscmVhZHlcbiAgICBfc3RyaW5naWZ5KG1zZykge1xuICAgICAgICAvLyB3ZSB0ZXN0IGZvciB1bmRlZmluZWQgYW5kIG51bGwgZXhwbGljaXRseSBvbiBwdXJwb3NlIGJlY2F1c2Ugb3RoZXIgZmFsc3kgdmFsdWVzIChlLmcuIDApIGFyZSBva1xuICAgICAgICBpZiAodHlwZW9mIG1zZyA9PT0gJ3VuZGVmaW5lZCcgfHwgbXNnID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgbXNnID09PSAnc3RyaW5nJyB8fCBtc2cgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBtc2c7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG1zZyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JQIC0gZXJyb3Igc2VuZGluZyBsb2c6IG1zZyBvYmplY3QgY2Fubm90IGJlIHNlcmlhbGl6ZWQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb21pc2VXaXRoVGltZW91dChwcm9taXNlLCB0aW1lb3V0ID0gMzAgKiAxMDAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXByb21pc2UgfHwgIXByb21pc2UudGhlbikge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFByb21pc2UgYXdhaXQgdGltZW91dCBvZiAke3RpbWVvdXR9IG1zYCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJvbWlzZS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJlamVjdCwgdGltZW91dCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuIl19
566
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9yZXBvcnRlcnMvcmVwb3J0ZXItcnAuanMiXSwibmFtZXMiOlsiUlBDbGllbnQiLCJyZXF1aXJlIiwiTEFVTkNIX01PREVTIiwiREVGQVVMVCIsIkRFQlVHIiwiVEVTVF9JVEVNX1RZUEVTIiwiU1VJVEUiLCJURVNUIiwiU1RFUCIsIk1BWF9OQU1FX0xFTkdUSCIsIlJlcG9ydFBvcnRhbFJlcG9ydGVyIiwiUmVwb3J0ZXJCYXNlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwicmVwb3J0ZXJPcHRzIiwiYWdncmVnYXRvciIsInJwIiwicmVwb3J0U3RlcHMiLCJyZXBvcnRMb2dzIiwiY2JTdWl0ZVRvUnBJZEhhc2giLCJjYkNhc2VUb1JwSWRIYXNoIiwiY2JTdGVwVG9ScElkSGFzaCIsImNiU3VpdGVSZXN1bHRMaXN0QnlSZWZJZCIsImNiQ2FzZVRvQ3VycmVudFRyYW5zYWN0aW9uSWQiLCJjYkNhc2VUb0N1cnJlbnRTdWJTdGVwSWQiLCJwcm9taXNlcyIsImFwaUtleSIsImVuZHBvaW50IiwicHJvamVjdCIsIkVycm9yIiwicnBDbGllbnQiLCJsYXVuY2giLCJuYW1lIiwiaW5pdCIsImNoZWNrQ29ubmVjdCIsImUiLCJtZXNzYWdlIiwiZ2VuZXJhdGUiLCJyZXN1bHRzIiwib25MYXVuY2hTdGFydCIsInRlbXBJZCIsInByb21pc2UiLCJzdGFydExhdW5jaCIsIm1vZGUiLCJkZWJ1ZyIsInRlbXBMYXVuY2hJZCIsImhhbmRsZVByb21pc2UiLCJjb25zb2xlIiwiZGlyIiwib25MYXVuY2hFbmQiLCJfcmVwb3J0RW5kT2ZTdGFydGVkU3VpdGVzIiwiaGFzRmFpbGVkIiwic29tZSIsIngiLCJzdGF0dXMiLCJTdGF0dXMiLCJGQUlMRUQiLCJQcm9taXNlIiwiYWxsIiwiZmluaXNoTGF1bmNoIiwib25SdW5uZXJTdGFydCIsInJpZCIsIm9wdHMiLCJjYXBzIiwib25SdW5uZXJFbmQiLCJyZXN1bHQiLCJvblN1aXRlU3RhcnQiLCJzdWl0ZUlkIiwic3VpdGUiLCJzdWl0ZURlZiIsInN1aXRlUmVmSWQiLCJyZWZJZCIsInN0YXJ0VGVzdEl0ZW1SZXEiLCJ0eXBlIiwic3RhcnRUZXN0SXRlbSIsIm9uU3VpdGVFbmQiLCJwdXNoIiwib25DYXNlU3RhcnQiLCJjYXNlSWQiLCJjYXNlRGVmIiwiY29kZVJlZiIsInBhdGgiLCJycFN1aXRlSWQiLCJvbkNhc2VFbmQiLCJycFRlc3RJZCIsInRvTG93ZXJDYXNlIiwiZmFpbHVyZSIsInJwRmlsZSIsInNjcmVlbnNob3QiLCJjb250ZW50IiwidW5kZWZpbmVkIiwibG9nTXNnIiwiX3N0cmluZ2lmeSIsImxvZ1JlcSIsImxldmVsIiwic2VuZExvZyIsInRyYW5zSWQiLCJmaW5pc2hUcmFuc2FjdGlvblJlcSIsInRyYW5zUnBJZCIsImZpbmlzaFRlc3RJdGVtIiwiZmluaXNoVGVzdEl0ZW1SZXEiLCJvblN0ZXBTdGFydCIsInN0ZXAiLCJtb2R1bGUiLCJyZXBvcnRMb2dTdGVwIiwicnBDYXNlSWQiLCJycFBhcmVudElkIiwiaWQiLCJzdGVwTmFtZSIsIl9nZXRTdGVwTmFtZSIsImxvY2F0aW9uIiwidGVzdENhc2VJZCIsImhhc1N0YXRzIiwib25TdGVwRW5kIiwic3RhcnRzV2l0aCIsInJwU3RlcElkIiwiZmlsZSIsIm9uTG9nIiwic3RlcElkIiwibXNnIiwidGltZSIsInNyYyIsInJwTGV2ZWwiLCJfZ2V0UnBMZXZlbCIsImFyZ3MiLCJsZW5ndGgiLCJzZW5kUnBMb2ciLCJPYmplY3QiLCJrZXlzIiwiaGFzRmFpbGVkU3VpdGUiLCJveExldmVsIiwic2lnbmF0dXJlIiwic3Vic3RyaW5nIiwiU3RyaW5nIiwiSlNPTiIsInN0cmluZ2lmeSIsImVycm9yIiwiY2F0Y2giLCJlcnIiLCJsb2ciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVlBOztBQUNBOzs7O0FBQ0EsTUFBTUEsUUFBUSxHQUFHQyxPQUFPLENBQUMsZ0NBQUQsQ0FBeEI7O0FBQ0EsTUFBTUMsWUFBWSxHQUFHO0FBQ2pCQyxFQUFBQSxPQUFPLEVB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LElBQVo7QUFDSDs7QUFJRCxRQUFJQSxJQUFJLENBQUM2RixNQUFMLEdBQWNwSCxlQUFsQixFQUFtQztBQUMvQnVCLE1BQUFBLElBQUksR0FBR0EsSUFBSSxDQUFDb0csU0FBTCxDQUFlLENBQWYsRUFBa0IzSCxlQUFlLEdBQUMsQ0FBbEMsSUFBdUMsS0FBOUM7QUFDSDs7QUFDRCxXQUFPdUIsSUFBUDtBQUNIOztBQUdENEQsRUFBQUEsVUFBVSxDQUFDMkIsR0FBRCxFQUFNO0FBRVosUUFBSSxPQUFPQSxHQUFQLEtBQWUsV0FBZixJQUE4QkEsR0FBRyxLQUFLLElBQTFDLEVBQWdEO0FBQzVDLGFBQU8sSUFBUDtBQUNIOztBQUVELFFBQUksT0FBT0EsR0FBUCxLQUFlLFFBQWYsSUFBMkJBLEdBQUcsWUFBWWMsTUFBOUMsRUFBc0Q7QUFDbEQsYUFBT2QsR0FBUDtBQUNIOztBQUVELFFBQUk7QUFDQSxhQUFPZSxJQUFJLENBQUNDLFNBQUwsQ0FBZWhCLEdBQWYsQ0FBUDtBQUNILEtBRkQsQ0FFRSxPQUFPcEYsQ0FBUCxFQUFVO0FBQ1JZLE1BQUFBLE9BQU8sQ0FBQ3lGLEtBQVIsQ0FBYyx5REFBZDtBQUNIO0FBQ0o7O0FBRUQxRixFQUFBQSxhQUFhLENBQUNMLE9BQUQsRUFBVTtBQUNuQkEsSUFBQUEsT0FBTyxDQUFDZ0csS0FBUixDQUFlQyxHQUFELElBQVM7QUFDbkIzRixNQUFBQSxPQUFPLENBQUM0RixHQUFSLENBQVksWUFBWixFQUEwQkQsR0FBMUI7QUFDSCxLQUZEO0FBR0EsU0FBS2pILFFBQUwsQ0FBY21ELElBQWQsQ0FBbUJuQyxPQUFuQjtBQUNIOztBQXRkMEQiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qXHJcbiAqIE94eWdlbiBSZXBvcnRlciBmb3IgUmVwb3J0UG9ydGFsXHJcbiAqL1xyXG5pbXBvcnQgUmVwb3J0ZXJCYXNlIGZyb20gJy4uL3JlcG9ydGVyL1JlcG9ydGVyQmFzZSc7XHJcbmltcG9ydCBTdGF0dXMgZnJvbSAnLi4vbW9kZWwvc3RhdHVzJztcclxuY29uc3QgUlBDbGllbnQgPSByZXF1aXJlKCdAb3h5Z2VuaHEvcnAtY2xpZW50LWphdmFzY3JpcHQnKTtcclxuY29uc3QgTEFVTkNIX01PREVTID0ge1xyXG4gICAgREVGQVVMVDogJ0RFRkFVTFQnLFxyXG4gICAgREVCVUc6ICdERUJVRycsXHJcbn07XHJcbmNvbnN0IFRFU1RfSVRFTV9UWVBFUyA9IHtcclxuICAgIFNVSVRFOiAnU1VJVEUnLFxyXG4gICAgVEVTVDogJ1RFU1QnLFxyXG4gICAgU1RFUDogJ1NURVAnLFxyXG59O1xyXG5jb25zdCBNQVhfTkFNRV9MRU5HVEggPSAxMjg7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXBvcnRQb3J0YWxSZXBvcnRlciBleHRlbmRzIFJlcG9ydGVyQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCByZXBvcnRlck9wdHMsIGFnZ3JlZ2F0b3IpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zKTtcclxuICAgICAgICB0aGlzLnJlcG9ydGVyT3B0cyA9IHJlcG9ydGVyT3B0cyB8fCBvcHRpb25zLnJwO1xyXG4gICAgICAgIHRoaXMucmVwb3J0U3RlcHMgPSByZXBvcnRlck9wdHMucmVwb3J0U3RlcHMgfHwgdHJ1ZTtcclxuICAgICAgICB0aGlzLnJlcG9ydExvZ3MgPSByZXBvcnRlck9wdHMucmVwb3J0TG9ncyB8fCBmYWxzZTtcclxuICAgICAgICB0aGlzLmNiU3VpdGVUb1JwSWRIYXNoID0ge307XHJcbiAgICAgICAgdGhpcy5jYkNhc2VUb1JwSWRIYXNoID0ge307XHJcbiAgICAgICAgdGhpcy5jYlN0ZXBUb1JwSWRIYXNoID0ge307XHJcbiAgICAgICAgdGhpcy5jYlN1aXRlUmVzdWx0TGlzdEJ5UmVmSWQgPSB7fTtcclxuICAgICAgICB0aGlzLmNiQ2FzZVRvQ3VycmVudFRyYW5zYWN0aW9uSWQgPSB7fTtcclxuICAgICAgICB0aGlzLmNiQ2FzZVRvQ3VycmVudFN1YlN0ZXBJZCA9IHt9O1xyXG4gICAgICAgIHRoaXMucHJvbWlzZXMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAhdGhpcy5yZXBvcnRlck9wdHNcclxuICAgICAgICAgICAgfHwgIXRoaXMucmVwb3J0ZXJPcHRzLmFwaUtleVxyXG4gICAgICAgICAgICB8fCAhdGhpcy5yZXBvcnRlck9wdHMuZW5kcG9pbnRcclxuICAgICAgICAgICAgfHwgIXRoaXMucmVwb3J0ZXJPcHRzLnByb2plY3RcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXBvcnRQb3J0YWwgb3B0aW9ucyBhcmUgbWlzc2luZyBpbiBveHlnZW4uY29uZiBmaWxlLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFnZ3JlZ2F0b3IgPSBhZ2dyZWdhdG9yO1xyXG4gICAgICAgIHRoaXMucnBDbGllbnQgPSBuZXcgUlBDbGllbnQoe1xyXG4gICAgICAgICAgICBsYXVuY2g6IHRoaXMucmVwb3J0ZXJPcHRzLmxhdW5jaCB8fCB0aGlzLm9wdGlvbnMubmFtZSxcclxuICAgICAgICAgICAgLi4udGhpcy5yZXBvcnRlck9wdHNcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0KCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnBDbGllbnQuY2hlY2tDb25uZWN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUlAgLSBFcnJvciBjb25uZWN0aW5nIHRvIHRoZSBzZXJ2ZXI6ICR7ZS5tZXNzYWdlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIGdlbmVyYXRlKHJlc3VsdHMpIHtcclxuICAgIH1cclxuICAgIC8vIEV2ZW50c1xyXG4gICAgYXN5bmMgb25MYXVuY2hTdGFydCh7IG9wdGlvbnMgfSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgdGVtcElkLCBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LnN0YXJ0TGF1bmNoKHtcclxuICAgICAgICAgICAgICAgIG1vZGU6IHRoaXMucmVwb3J0ZXJPcHRzLm1vZGUgfHwgTEFVTkNIX01PREVTLkRFRkFVTFQsXHJcbiAgICAgICAgICAgICAgICBkZWJ1ZzogZmFsc2UsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLnRlbXBMYXVuY2hJZCA9IHRlbXBJZDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUHJvbWlzZShwcm9taXNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIHN0YXJ0IGxhdW5jaDogJHtlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIG9uTGF1bmNoRW5kKHsgcmVzdWx0cyB9KSB7XHJcbiAgICAgICAgLy8gcmVwb3J0IHRoZSBlbmQgb2YgYWxsIHN0YXJ0ZWQgc3VpdGVzXHJcbiAgICAgICAgYXdhaXQgdGhpcy5fcmVwb3J0RW5kT2ZTdGFydGVkU3VpdGVzKCk7XHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlIGxhdW5jaCBzdGF0dXNcclxuICAgICAgICBjb25zdCBoYXNGYWlsZWQgPSByZXN1bHRzLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMucHJvbWlzZXMpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSBhd2FpdCB0aGlzLnJwQ2xpZW50LmZpbmlzaExhdW5jaCh0aGlzLnRlbXBMYXVuY2hJZCwge1xyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBoYXNGYWlsZWQgPyAnRkFJTEVEJyA6ICdQQVNTRUQnXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBhd2FpdCBwcm9taXNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gZW5kIGxhdW5jaDogJHtlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIG9uUnVubmVyU3RhcnQoeyByaWQsIG9wdHMsIGNhcHMgfSkge1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25SdW5uZXJFbmQoeyByaWQsIHJlc3VsdCB9KSB7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvblN1aXRlU3RhcnQoeyByaWQsIHN1aXRlSWQsIHN1aXRlOiBzdWl0ZURlZiB9KSB7XHJcbiAgICAgICAgLy8gaW4gcGFyYWxsZWwgdGVzdCBleGVjdXRpb24sIG9uU3VpdGVTdGFydCB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgdGhlIHNhbWUgc3VpdGUgXHJcbiAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGNhbGwgXCJzdGFydFRlc3RJdGVtXCIgdGhlIHNhbWUgc3VpdGUgb25seSBvbmNlXHJcbiAgICAgICAgY29uc3Qgc3VpdGVSZWZJZCA9IHN1aXRlRGVmLnJlZklkO1xyXG4gICAgICAgIGlmICh0aGlzLmNiU3VpdGVUb1JwSWRIYXNoW3N1aXRlUmVmSWRdKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gYXNzaWduIGVtcHR5IG9iamVjdCBhcyBhIGZvcm0gb2YgbXVsdGktdGhyZWFkIGxvY2ssXHJcbiAgICAgICAgLy8gc28gdGhlIHBhcmFsbGVsIGNhbGwgdG8gb25TdWl0ZVN0YXJ0IGZyb20gdGhlIG5leHQgdGhyZWFkXHJcbiAgICAgICAgLy8gd2lsbCBub3QgdHJ5IHRvIHByb2NlZWQgd2l0aCB0aGUgY29kZSBiZWxvd1xyXG4gICAgICAgIHRoaXMuY2JTdWl0ZVRvUnBJZEhhc2hbc3VpdGVSZWZJZF0gPSB7fTtcclxuICAgICAgICB0aGlzLmNiU3VpdGVSZXN1bHRMaXN0QnlSZWZJZFtzdWl0ZVJlZklkXSA9IFtdO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0VGVzdEl0ZW1SZXEgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IHN1aXRlRGVmLm5hbWUgfHwgdGhpcy5vcHRpb25zLm5hbWUsXHJcbiAgICAgICAgICAgIHR5cGU6IFRFU1RfSVRFTV9UWVBFUy5TVUlURSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCB7IHRlbXBJZCwgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zdGFydFRlc3RJdGVtKHN0YXJ0VGVzdEl0ZW1SZXEsIHRoaXMudGVtcExhdW5jaElkKTtcclxuICAgICAgICAgICAgdGhpcy5jYlN1aXRlVG9ScElkSGFzaFtzdWl0ZVJlZklkXSA9IHRlbXBJZDtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVQcm9taXNlKHByb21pc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gc3RhcnQgc3VpdGUgaXRlbTogJHtlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIG9uU3VpdGVFbmQoeyByaWQsIHN1aXRlSWQsIHJlc3VsdCB9KSB7XHJcbiAgICAgICAgY29uc3Qgc3VpdGVSZWZJZCA9IHJlc3VsdC5yZWZJZDtcclxuICAgICAgICB0aGlzLmNiU3VpdGVSZXN1bHRMaXN0QnlSZWZJZFtzdWl0ZVJlZklkXSAmJiB0aGlzLmNiU3VpdGVSZXN1bHRMaXN0QnlSZWZJZFtzdWl0ZVJlZklkXS5wdXNoKHJlc3VsdCk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkNhc2VTdGFydCh7IHJpZCwgc3VpdGVJZCwgc3VpdGVSZWZJZCwgY2FzZUlkLCAnY2FzZSc6IGNhc2VEZWYgfSkge1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0VGVzdEl0ZW1SZXEgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IGNhc2VEZWYubmFtZSxcclxuICAgICAgICAgICAgdHlwZTogVEVTVF9JVEVNX1RZUEVTLlRFU1QsXHJcbiAgICAgICAgICAgIGNvZGVSZWY6IGNhc2VEZWYucGF0aCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHJwU3VpdGVJZCA9IHRoaXMuY2JTdWl0ZVRvUnBJZEhhc2hbc3VpdGVSZWZJZF07XHJcbiAgICAgICAgaWYgKCFycFN1aXRlSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgeyB0ZW1wSWQsIHByb21pc2UgfSA9IHRoaXMucnBDbGllbnQuc3RhcnRUZXN0SXRlbShzdGFydFRlc3RJdGVtUmVxLCB0aGlzLnRlbXBMYXVuY2hJZCwgcnBTdWl0ZUlkKTtcclxuICAgICAgICAgICAgdGhpcy5jYkNhc2VUb1JwSWRIYXNoW2Nhc2VJZF0gPSB0ZW1wSWQ7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUHJvbWlzZShwcm9taXNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIHN0YXJ0IGNhc2UgaXRlbTogJHtlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIG9uQ2FzZUVuZCh7IHJpZCwgc3VpdGVJZCwgc3VpdGVSZWZJZCwgY2FzZUlkLCByZXN1bHQgfSkge1xyXG4gICAgICAgIGNvbnN0IHJwVGVzdElkID0gdGhpcy5jYkNhc2VUb1JwSWRIYXNoW2Nhc2VJZF07XHJcbiAgICAgICAgaWYgKCFycFRlc3RJZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3VsdC5zdGF0dXMudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAoc3RhdHVzID09PSAnZmFpbGVkJyAmJiByZXN1bHQuZmFpbHVyZSkge1xyXG4gICAgICAgICAgICBjb25zdCBycEZpbGUgPSByZXN1bHQuc2NyZWVuc2hvdCA/XHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdzY3JlZW5zaG90JyxcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdpbWFnZS9wbmcnLFxyXG4gICAgICAgICAgICAgICAgY29udGVudDogcmVzdWx0LnNjcmVlbnNob3QsXHJcbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBsb2dNc2cgPSB0aGlzLl9zdHJpbmdpZnkocmVzdWx0LmZhaWx1cmUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIGlmIChsb2dNc2cpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ1JlcSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBsb2dNc2csXHJcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcidcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHByb21pc2UgfSA9IHRoaXMucnBDbGllbnQuc2VuZExvZyhycFRlc3RJZCwgbG9nUmVxLCBycEZpbGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUHJvbWlzZShwcm9taXNlKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gc2VuZCBsb2cgZm9yIGZpbmlzaGVkIGNhc2UgaXRlbTogJHtlfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB0cmFuc0lkID0gdGhpcy5jYkNhc2VUb0N1cnJlbnRUcmFuc2FjdGlvbklkW2Nhc2VJZF07XHJcblxyXG4gICAgICAgIGlmICh0cmFuc0lkKSB7XHJcbiAgICAgICAgICAgIC8vIEZJWE1FOiBzaG91bGQgY2FsY3VsYXRlIHByb3BlciBzdGF0dXNcclxuICAgICAgICAgICAgY29uc3QgZmluaXNoVHJhbnNhY3Rpb25SZXEgPSB7XHJcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdwYXNzZWQnIC8vcmVzdWx0LnN0YXR1cy50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zUnBJZCA9IHRoaXMuY2JTdGVwVG9ScElkSGFzaFt0cmFuc0lkXTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHByb21pc2UgfSA9IHRoaXMucnBDbGllbnQuZmluaXNoVGVzdEl0ZW0odHJhbnNScElkLCBmaW5pc2hUcmFuc2FjdGlvblJlcSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVByb21pc2UocHJvbWlzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBmaW5pc2ggdHJhbnNhY3Rpb24gaXRlbSBvbiBjYXNlIGVuZDogJHtlfWApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jYkNhc2VUb0N1cnJlbnRUcmFuc2FjdGlvbklkW2Nhc2VJZF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBmaW5pc2hUZXN0SXRlbVJlcSA9IHtcclxuICAgICAgICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LmZpbmlzaFRlc3RJdGVtKHJwVGVzdElkLCBmaW5pc2hUZXN0SXRlbVJlcSk7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUHJvbWlzZShwcm9taXNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIGZpbmlzaCBjYXNlIGl0ZW06ICR7ZX1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdGVwU3RhcnQoeyByaWQsIGNhc2VJZCwgc3RlcCB9KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJlcG9ydFN0ZXBzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHN0ZXAubW9kdWxlICYmIHN0ZXAubW9kdWxlID09PSAnbG9nJykge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlcG9ydExvZ1N0ZXAoY2FzZUlkLCBzdGVwKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBycENhc2VJZCA9IHRoaXMuY2JDYXNlVG9ScElkSGFzaFtjYXNlSWRdO1xyXG4gICAgICAgIGxldCBycFBhcmVudElkO1xyXG5cclxuICAgICAgICBjb25zdCB0cmFuc0lkID0gdGhpcy5jYkNhc2VUb0N1cnJlbnRUcmFuc2FjdGlvbklkW2Nhc2VJZF07XHJcblxyXG4gICAgICAgIGlmIChzdGVwLm5hbWUgPT09ICd0cmFuc2FjdGlvbicpIHtcclxuICAgICAgICAgICAgaWYgKHRyYW5zSWQpIHtcclxuICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBzaG91bGQgY2FsY3VsYXRlIHByb3BlciBzdGF0dXNcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbmlzaFRyYW5zYWN0aW9uUmVxID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ3Bhc3NlZCcgLy9yZXN1bHQuc3RhdHVzLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNScElkID0gdGhpcy5jYlN0ZXBUb1JwSWRIYXNoW3RyYW5zSWRdO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5maW5pc2hUZXN0SXRlbSh0cmFuc1JwSWQsIGZpbmlzaFRyYW5zYWN0aW9uUmVxKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVByb21pc2UocHJvbWlzZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBmaW5pc2ggdHJhbnNhY3Rpb24gaXRlbSBvbiBjYXNlIGVuZDogJHtlfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNiQ2FzZVRvQ3VycmVudFRyYW5zYWN0aW9uSWRbY2FzZUlkXSA9IHN0ZXAuaWQ7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNiQ2FzZVRvQ3VycmVudFN1YlN0ZXBJZFtjYXNlSWRdO1xyXG4gICAgICAgICAgICBycFBhcmVudElkID0gcnBDYXNlSWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmNiQ2FzZVRvQ3VycmVudFN1YlN0ZXBJZFtjYXNlSWRdID0gc3RlcC5pZDtcclxuICAgICAgICAgICAgcnBQYXJlbnRJZCA9IHRyYW5zSWQgPyB0aGlzLmNiU3RlcFRvUnBJZEhhc2hbdHJhbnNJZF0gOiBycENhc2VJZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghcnBQYXJlbnRJZCB8fCAhcnBDYXNlSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzdGVwTmFtZSA9IHRoaXMuX2dldFN0ZXBOYW1lKHN0ZXApO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0VGVzdEl0ZW1SZXEgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IHN0ZXBOYW1lLFxyXG4gICAgICAgICAgICB0eXBlOiBURVNUX0lURU1fVFlQRVMuU1RFUCxcclxuICAgICAgICAgICAgLy8gXCJjb2RlUmVmXCIgKyBcInBhcmFtZXRlcnNcIiB1c2VkIGJ5IFJQIGxpYiB0byBnZW5lcmF0ZSB0ZXN0Q2FzZUlkIGlmIHRlc3RDYXNlSWQgaXMgbm90IGRlZmluZWRcclxuICAgICAgICAgICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXBvcnRwb3J0YWwvY2xpZW50LWphdmFzY3JpcHQvYmxvYi80ODZlZjcwYzYzOGE5YTIzMjY3MjkwYzYyZGYxZmFmOTAwZjdkZjZhL2xpYi9yZXBvcnQtcG9ydGFsLWNsaWVudC5qcyNMNDk3XHJcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgZGlzYWJsZWQgZm9yIG5vdy4gbm90IHN1cmUgaWYgYWN0dWFsbHkgbmVlZGVkLi4uXHJcbiAgICAgICAgICAgIC8vcGFyYW1ldGVyczogdGhpcy5fZ2V0UnBBcmdzKHN0ZXAuYXJncyksXHJcbiAgICAgICAgICAgIGNvZGVSZWY6IHN0ZXAubG9jYXRpb24sXHJcbiAgICAgICAgICAgIHRlc3RDYXNlSWQ6IHJwQ2FzZUlkLFxyXG4gICAgICAgICAgICBoYXNTdGF0czogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgeyB0ZW1wSWQsIHByb21pc2UgfSA9IHRoaXMucnBDbGllbnQuc3RhcnRUZXN0SXRlbShzdGFydFRlc3RJdGVtUmVxLCB0aGlzLnRlbXBMYXVuY2hJZCwgcnBQYXJlbnRJZCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2JTdGVwVG9ScElkSGFzaFtzdGVwLmlkXSA9IHRlbXBJZDtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVQcm9taXNlKHByb21pc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gc3RhcnQgc3RlcCBpdGVtOiAke2V9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgb25TdGVwRW5kKHsgcmlkLCBjYXNlSWQsIHN0ZXA6IHJlc3VsdCB9KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJlcG9ydFN0ZXBzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc3VsdC5uYW1lICYmIChyZXN1bHQubmFtZS5zdGFydHNXaXRoKCdsb2cuJykgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5uYW1lLnN0YXJ0c1dpdGgoJ3dlYi50cmFuc2FjdGlvbicpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQubmFtZS5zdGFydHNXaXRoKCdtb2IudHJhbnNhY3Rpb24nKSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBycFN0ZXBJZCA9IHRoaXMuY2JTdGVwVG9ScElkSGFzaFtyZXN1bHQuaWRdO1xyXG4gICAgICAgIGlmICghcnBTdGVwSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGVsZXRlIHRoaXMuY2JDYXNlVG9DdXJyZW50U3ViU3RlcElkW2Nhc2VJZF07XHJcblxyXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3VsdC5zdGF0dXMudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAoc3RhdHVzID09PSAnZmFpbGVkJyAmJiByZXN1bHQuZmFpbHVyZSkge1xyXG4gICAgICAgICAgICBjb25zdCBycEZpbGUgPSByZXN1bHQuc2NyZWVuc2hvdCA/XHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdzY3JlZW5zaG90JyxcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdpbWFnZS9wbmcnLFxyXG4gICAgICAgICAgICAgICAgY29udGVudDogcmVzdWx0LnNjcmVlbnNob3QsXHJcbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBsb2dNc2cgPSB0aGlzLl9zdHJpbmdpZnkocmVzdWx0LmZhaWx1cmUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIGlmIChsb2dNc2cpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ1JlcSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBsb2dNc2csXHJcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZTogcnBGaWxlLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zZW5kTG9nKHJwU3RlcElkLCBsb2dSZXEsIHJwRmlsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVQcm9taXNlKHByb21pc2UpO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBzZW5kIGxvZyBmb3IgZmluaXNoZWQgc3RlcCBpdGVtOiAke2V9YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZmluaXNoVGVzdEl0ZW1SZXEgPSB7XHJcbiAgICAgICAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cy50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5maW5pc2hUZXN0SXRlbShycFN0ZXBJZCwgZmluaXNoVGVzdEl0ZW1SZXEpO1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVByb21pc2UocHJvbWlzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBmaW5pc2ggc3RlcCBpdGVtOiAke2V9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgb25Mb2coeyBzdWl0ZUlkLCBjYXNlSWQsIHN0ZXBJZCwgbGV2ZWwsIG1zZywgdGltZSwgc3JjIH0pIHtcclxuICAgICAgICBpZiAoIXRoaXMucmVwb3J0TG9ncykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE94eWdlbiBtaWdodCBzdGFydCBnZW5lcmF0aW5nIGxvZ3MgYmVmb3JlIG9uUnVubmVyU3RhcnQgZXZlbnQsIGlnbm9yZSB0aGVtXHJcbiAgICAgICAgaWYgKCF0aGlzLnRlbXBMYXVuY2hJZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJwUGFyZW50SWQgPSBzdGVwSWQgP1xyXG4gICAgICAgICAgICB0aGlzLmNiU3RlcFRvUnBJZEhhc2hbc3RlcElkXVxyXG4gICAgICAgICAgICA6IGNhc2VJZCA/IHRoaXMuY2JDYXNlVG9ScElkSGFzaFtjYXNlSWRdXHJcbiAgICAgICAgICAgIDogc3VpdGVJZCA/IHRoaXMuY2JTdWl0ZVRvUnBJZEhhc2hbc3VpdGVJZF1cclxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgY29uc3QgcnBMZXZlbCA9IHRoaXMuX2dldFJwTGV2ZWwobGV2ZWwpO1xyXG5cclxuICAgICAgICBjb25zdCBsb2dNc2cgPSB0aGlzLl9zdHJpbmdpZnkobXNnKTtcclxuICAgICAgICBpZiAobG9nTXNnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxvZ1JlcSA9IHtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGxvZ01zZyxcclxuICAgICAgICAgICAgICAgIGxldmVsOiBycExldmVsLFxyXG4gICAgICAgICAgICAgICAgdGltZTogdGltZSxcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHByb21pc2UgfSA9IHRoaXMucnBDbGllbnQuc2VuZExvZyhycFBhcmVudElkIHx8IHRoaXMudGVtcExhdW5jaElkLCBsb2dSZXEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVQcm9taXNlKHByb21pc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gY3JlYXRlIGxvZyBpdGVtOiAke2V9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyByZXBvcnRMb2dTdGVwKGNhc2VJZCwgc3RlcCkge1xyXG4gICAgICAgIGlmICghc3RlcC5hcmdzIHx8ICFzdGVwLmFyZ3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbGV2ZWwgPSBzdGVwLm5hbWU7XHJcbiAgICAgICAgY29uc3QgbXNnID0gc3RlcC5hcmdzWzBdO1xyXG4gICAgICAgIGNvbnN0IHRpbWUgPSBzdGVwLnRpbWU7XHJcbiAgICAgICAgbGV0IHN0ZXBJZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAodGhpcy5jYkNhc2VUb0N1cnJlbnRTdWJTdGVwSWRbY2FzZUlkXSkge1xyXG4gICAgICAgICAgICBzdGVwSWQgPSB0aGlzLmNiQ2FzZVRvQ3VycmVudFN1YlN0ZXBJZFtjYXNlSWRdO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jYkNhc2VUb0N1cnJlbnRUcmFuc2FjdGlvbklkW2Nhc2VJZF0pIHtcclxuICAgICAgICAgICAgc3RlcElkID0gdGhpcy5jYkNhc2VUb0N1cnJlbnRUcmFuc2FjdGlvbklkW2Nhc2VJZF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZFJwTG9nKHsgc3VpdGVJZDogdW5kZWZpbmVkLCBjYXNlSWQsIHN0ZXBJZCwgbGV2ZWwsIG1zZywgdGltZSB9KTtcclxuICAgIH1cclxuICAgIGFzeW5jIHNlbmRScExvZyh7IHN1aXRlSWQsIGNhc2VJZCwgc3RlcElkLCBsZXZlbCwgbXNnLCB0aW1lIH0pIHtcclxuICAgICAgICAvLyBPeHlnZW4gbWlnaHQgc3RhcnQgZ2VuZXJhdGluZyBsb2dzIGJlZm9yZSBvblJ1bm5lclN0YXJ0IGV2ZW50LCBpZ25vcmUgdGhlbVxyXG4gICAgICAgIGlmICghdGhpcy50ZW1wTGF1bmNoSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBycFBhcmVudElkID0gc3RlcElkID9cclxuICAgICAgICAgICAgdGhpcy5jYlN0ZXBUb1JwSWRIYXNoW3N0ZXBJZF1cclxuICAgICAgICAgICAgOiBjYXNlSWQgPyB0aGlzLmNiQ2FzZVRvUnBJZEhhc2hbY2FzZUlkXVxyXG4gICAgICAgICAgICA6IHN1aXRlSWQgPyB0aGlzLmNiU3VpdGVUb1JwSWRIYXNoW3N1aXRlSWRdXHJcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIGNvbnN0IHJwTGV2ZWwgPSB0aGlzLl9nZXRScExldmVsKGxldmVsKTtcclxuXHJcbiAgICAgICAgY29uc3QgbG9nTXNnID0gdGhpcy5fc3RyaW5naWZ5KG1zZyk7XHJcbiAgICAgICAgaWYgKGxvZ01zZykge1xyXG4gICAgICAgICAgICBjb25zdCBsb2dSZXEgPSB7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBsb2dNc2csXHJcbiAgICAgICAgICAgICAgICBsZXZlbDogcnBMZXZlbCxcclxuICAgICAgICAgICAgICAgIHRpbWU6IHRpbWUsXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LnNlbmRMb2cocnBQYXJlbnRJZCB8fCB0aGlzLnRlbXBMYXVuY2hJZCwgbG9nUmVxKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUHJvbWlzZShwcm9taXNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIGNyZWF0ZSBsb2cgaXRlbTogJHtlfWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgX3JlcG9ydEVuZE9mU3RhcnRlZFN1aXRlcygpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IHN1aXRlUmVmSWQgb2YgT2JqZWN0LmtleXModGhpcy5jYlN1aXRlVG9ScElkSGFzaCkpIHtcclxuICAgICAgICAgICAgY29uc3QgcnBTdWl0ZUlkID0gdGhpcy5jYlN1aXRlVG9ScElkSGFzaFtzdWl0ZVJlZklkXTtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuY2JTdWl0ZVJlc3VsdExpc3RCeVJlZklkW3N1aXRlUmVmSWRdO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jYlN1aXRlVG9ScElkSGFzaFtzdWl0ZVJlZklkXTtcclxuICAgICAgICAgICAgY29uc3QgaGFzRmFpbGVkU3VpdGUgPSByZXN1bHRzLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmlzaFRlc3RJdGVtUmVxID0ge1xyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBoYXNGYWlsZWRTdWl0ZSA/ICdmYWlsZWQnIDogJ3Bhc3NlZCcsXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LmZpbmlzaFRlc3RJdGVtKHJwU3VpdGVJZCwgZmluaXNoVGVzdEl0ZW1SZXEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVQcm9taXNlKHByb21pc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gZmluaXNoIHN1aXRlIGl0ZW06ICR7ZX1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIF9nZXRScExldmVsKG94TGV2ZWwpIHtcclxuICAgICAgICBpZiAob3hMZXZlbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gb3hMZXZlbC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gJ2luZm8nO1xyXG4gICAgfVxyXG4gICAgLypfZ2V0UnBBcmdzKGNiQXJncykge1xyXG4gICAgICAgIGlmICghY2JBcmdzIHx8ICFjYkFyZ3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJwQXJncyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGNiQXJncy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBhcmcgPSBjYkFyZ3NbaV07XHJcbiAgICAgICAgICAgIGxldCBhcmdTdHIgPSB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fCBhcmcgaW5zdGFuY2VvZiBTdHJpbmcgPyBhcmcgOiBKU09OLnN0cmluZ2lmeShhcmcpO1xyXG4gICAgICAgICAgICBycEFyZ3MucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBrZXk6IGBhcmcke2l9YCxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBhcmdTdHJcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBycEFyZ3M7XHJcbiAgICB9Ki9cclxuICAgIF9nZXRTdGVwTmFtZShzdGVwKSB7XHJcbiAgICAgICAgbGV0IG5hbWU7XHJcblxyXG4gICAgICAgIGlmIChzdGVwLm5hbWUgPT09ICd0cmFuc2FjdGlvbicgJiYgc3RlcC5hcmdzLmxlbmd0aCA+IDApIHsgIC8vIEZJWE1FOiBzdGVwcyBuZWVkIHRvIGJlIG5lc3RlZCB1bmRlciB0cmFuc2FjdGlvbnNcclxuICAgICAgICAgICAgbmFtZSA9IHN0ZXAuYXJnc1swXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc3RlcC5zaWduYXR1cmUpIHtcclxuICAgICAgICAgICAgbmFtZSA9IHN0ZXAuc2lnbmF0dXJlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzdGVwLm1vZHVsZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogaXMgdGhpcyBldmVyIHJlYWNoZWQ/IFwic3RlcC5zaWduYXR1cmVcIiBzZWVtcyB0byBhbHdheXMgZXhpc3RcclxuICAgICAgICAgICAgbmFtZSA9IGAke3N0ZXAubW9kdWxlfS4ke3N0ZXAubmFtZX1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbmFtZSA9IHN0ZXAubmFtZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIG1heGltdW0gYWxsb3dlZCBuYW1lIGxlbmd0aCBpbiBSUCBpcyAxMDI0IGJ5dGVzXHJcbiAgICAgICAgLy8gd2UgdHJ1bmNhdGUgaXQgZXZlbiBsb3dlciBzbyBpdCB3aWxsIGRpc3BsYXkgbmljZWx5XHJcbiAgICAgICAgaWYgKG5hbWUubGVuZ3RoID4gTUFYX05BTUVfTEVOR1RIKSB7XHJcbiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBNQVhfTkFNRV9MRU5HVEgtMykgKyAnLi4uJztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcmV0dXJucyBudWxsIGlmIG1zZyBjYW5ub3QgYmUgc3RyaW5naWZpZWQsIG9yIHN0cmlnaWZpZXMgaXQgaWYgaXQncyBub3QgYSBzdHJpbmcgYWxyZWFkeVxyXG4gICAgX3N0cmluZ2lmeShtc2cpIHtcclxuICAgICAgICAvLyB3ZSB0ZXN0IGZvciB1bmRlZmluZWQgYW5kIG51bGwgZXhwbGljaXRseSBvbiBwdXJwb3NlIGJlY2F1c2Ugb3RoZXIgZmFsc3kgdmFsdWVzIChlLmcuIDApIGFyZSBva1xyXG4gICAgICAgIGlmICh0eXBlb2YgbXNnID09PSAndW5kZWZpbmVkJyB8fCBtc2cgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodHlwZW9mIG1zZyA9PT0gJ3N0cmluZycgfHwgbXNnIGluc3RhbmNlb2YgU3RyaW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtc2c7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobXNnKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JQIC0gZXJyb3Igc2VuZGluZyBsb2c6IG1zZyBvYmplY3QgY2Fubm90IGJlIHNlcmlhbGl6ZWQnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlUHJvbWlzZShwcm9taXNlKSB7XHJcbiAgICAgICAgcHJvbWlzZS5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSUCBlcnJvcjogJywgZXJyKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnByb21pc2VzLnB1c2gocHJvbWlzZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbiJdfQ==
@@ -93,4 +93,4 @@ class XmlReporter extends _FileReporterBase.default {
93
93
  }
94
94
 
95
95
  exports.default = XmlReporter;
96
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9yZXBvcnRlcnMvcmVwb3J0ZXIteG1sLmpzIl0sIm5hbWVzIjpbIkVhc3lYbWwiLCJyZXF1aXJlIiwiWG1sUmVwb3J0ZXIiLCJGaWxlUmVwb3J0ZXJCYXNlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwiZ2VuZXJhdGUiLCJyZXN1bHRzIiwicmVzdWx0RmlsZVBhdGgiLCJjcmVhdGVGb2xkZXJTdHJ1Y3R1cmVBbmRGaWxlUGF0aCIsInJlc3VsdEZvbGRlclBhdGgiLCJwYXRoIiwiZGlybmFtZSIsInNlcmlhbGl6ZXIiLCJzaW5ndWxhcml6ZSIsInJvb3RFbGVtZW50Iiwicm9vdEFycmF5IiwiZGF0ZUZvcm1hdCIsIm1hbmlmZXN0IiwidW53cmFwQXJyYXlzIiwiZmlsdGVyTnVsbHMiLCJyZXBsYWNlU2NyZWVuc2hvdHNXaXRoRmlsZXMiLCJmb3JYbWxSZW5kZXIiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJtYXAiLCJyZXN1bHQiLCJwdXNoIiwibmFtZSIsInN0YXR1cyIsInN0YXJ0VGltZSIsImVuZFRpbWUiLCJkdXJhdGlvbiIsImZhaWx1cmUiLCJlbnZpcm9ubWVudCIsImNhcGFiaWxpdGllcyIsImN3ZCIsInRhcmdldCIsImJyb3dzZXJOYW1lIiwic2VsZW5pdW1VcmwiLCJhcHBpdW1VcmwiLCJyZW9wZW5TZXNzaW9uIiwicmVSdW5PbkZhaWxlZCIsIml0ZXJhdGlvbnMiLCJkZWJ1Z1BvcnQiLCJkZWxheSIsImNvbGxlY3REZXZpY2VMb2dzIiwiY29sbGVjdEFwcGl1bUxvZ3MiLCJjb2xsZWN0QnJvd3NlckxvZ3MiLCJyZXBvcnRpbmciLCJwYXJhbWV0ZXJzIiwicGFyYWxsZWwiLCJzZXJ2aWNlcyIsIm1vZHVsZXMiLCJmcmFtZXdvcmsiLCJhcHBsaXRvb2xzT3B0cyIsImVudnMiLCJlbnYiLCJwbyIsInNjcmlwdENvbnRlbnRMaW5lT2Zmc2V0Iiwic3VpdGVzIiwieG1sIiwicmVuZGVyIiwiZnMiLCJ3cml0ZUZpbGVTeW5jIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFhQTs7QUFDQTs7QUFDQTs7OztBQUNBLElBQUlBLE9BQU8sR0FBR0MsT0FBTyxDQUFDLFNBQUQsQ0FBckI7O0FBRWUsTUFBTUMsV0FBTixTQUEwQkMseUJBQTFCLENBQTJDO0FBQ3REQyxFQUFBQSxXQUFXLENBQUNDLE9BQUQsRUFBVTtBQUNqQixVQUFNQSxPQUFOO0FBQ0g7O0FBRURDLEVBQUFBLFFBQVEsQ0FBQ0MsT0FBRCxFQUFVO0FBQ2QsUUFBSUMsY0FBYyxHQUFHLEtBQUtDLGdDQUFMLENBQXNDLE1BQXRDLENBQXJCOztBQUNBLFFBQUlDLGdCQUFnQixHQUFHQyxjQUFLQyxPQUFMLENBQWFKLGNBQWIsQ0FBdkI7O0FBRUEsUUFBSUssVUFBVSxHQUFHLElBQUliLE9BQUosQ0FBWTtBQUN6QmMsTUFBQUEsV0FBVyxFQUFFLElBRFk7QUFFekJDLE1BQUFBLFdBQVcsRUFBRSxjQUZZO0FBR3pCQyxNQUFBQSxTQUFTLEVBQUUsY0FIYztBQUl6QkMsTUFBQUEsVUFBVSxFQUFFLEtBSmE7QUFLekJDLE1BQUFBLFFBQVEsRUFBRSxJQUxlO0FBTXpCQyxNQUFBQSxZQUFZLEVBQUUsS0FOVztBQU96QkMsTUFBQUEsV0FBVyxFQUFFO0FBUFksS0FBWixDQUFqQjtBQVVBLFNBQUtDLDJCQUFMLENBQWlDZCxPQUFqQyxFQUEwQ0csZ0JBQTFDO0FBQ0EsVUFBTVksWUFBWSxHQUFHLEVBQXJCOztBQUVBLFFBQUlmLE9BQU8sSUFBSWdCLEtBQUssQ0FBQ0MsT0FBTixDQUFjakIsT0FBZCxDQUFYLElBQXFDQSxPQUFPLENBQUNrQixNQUFSLEdBQWlCLENBQTFELEVBQTZEO0FBQ3pEbEIsTUFBQUEsT0FBTyxDQUFDbUIsR0FBUixDQUFhQyxNQUFELElBQVk7QUFDcEJMLFFBQUFBLFlBQVksQ0FBQ00sSUFBYixDQUFrQjtBQUNkQyxVQUFBQSxJQUFJLEVBQUVGLE1BQU0sQ0FBQ0UsSUFEQztBQUVkQyxVQUFBQSxNQUFNLEVBQUVILE1BQU0sQ0FBQ0csTUFGRDtBQUdkQyxVQUFBQSxTQUFTLEVBQUVKLE1BQU0sQ0FBQ0ksU0FISjtBQUlkQyxVQUFBQSxPQUFPLEVBQUVMLE1BQU0sQ0FBQ0ssT0FKRjtBQUtkQyxVQUFBQSxRQUFRLEVBQUVOLE1BQU0sQ0FBQ00sUUFMSDtBQU1kQyxVQUFBQSxPQUFPLEVBQUVQLE1BQU0sQ0FBQ08sT0FORjtBQU9kQyxVQUFBQSxXQUFXLEVBQUVSLE1BQU0sQ0FBQ1EsV0FQTjtBQVFkQyxVQUFBQSxZQUFZLEVBQUVULE1BQU0sQ0FBQ1MsWUFSUDtBQVNkL0IsVUFBQUEsT0FBTyxFQUFFO0FBQ0xnQyxZQUFBQSxHQUFHLEVBQUVWLE1BQU0sQ0FBQ3RCLE9BQVAsQ0FBZWdDLEdBRGY7QUFFTEMsWUFBQUEsTUFBTSxFQUFHWCxNQUFNLENBQUN0QixPQUFQLENBQWVpQyxNQUZuQjtBQUdMQyxZQUFBQSxXQUFXLEVBQUVaLE1BQU0sQ0FBQ3RCLE9BQVAsQ0FBZWtDLFdBSHZCO0FBSUxDLFlBQUFBLFdBQVcsRUFBRWIsTUFBTSxDQUFDdEIsT0FBUCxDQUFlbUMsV0FKdkI7QUFLTEMsWUFBQUEsU0FBUyxFQUFFZCxNQUFNLENBQUN0QixPQUFQLENBQWVvQyxTQUxyQjtBQU1MQyxZQUFBQSxhQUFhLEVBQUVmLE1BQU0sQ0FBQ3RCLE9BQVAsQ0FBZXFDLGFBTnpCO0FBT0xDLFlBQUFBLGFBQWEsRUFBRWhCLE1BQU0sQ0FBQ3RCLE9BQVAsQ0FBZXNDLGFBUHpCO0FBUUxDLFlBQUFBLFVBQVUsRUFBRWpCLE1BQU0sQ0FBQ3RCLE9BQVAsQ0FBZXVDLFVBUnRCO0FBU0xDLFlBQUFBLFNBQVMsRUFBRWxCLE1BQU0sQ0FBQ3RCLE9BQVAsQ0FBZXdDLFNBVHJCO0FBVUxDLFlBQUFBLEtBQUssRUFBRW5CLE1BQU0sQ0FBQ3RCLE9BQVAsQ0FBZXlDLEtBVmpCO0FBV0xDLFlBQUFBLGlCQUFpQixFQUFFcEIsTUFBTSxDQUFDdEIsT0FBUCxDQUFlMEMsaUJBWDdCO0FBWUxDLFlBQUFBLGlCQUFpQixFQUFFckIsTUFBTSxDQUFDdEIsT0FBUCxDQUFlMkMsaUJBWjdCO0FBYUxDLFlBQUFBLGtCQUFrQixFQUFFdEIsTUFBTSxDQUFDdEIsT0FBUCxDQUFlNEMsa0JBYjlCO0FBY0xDLFlBQUFBLFNBQVMsRUFBRXZCLE1BQU0sQ0FBQ3RCLE9BQVAsQ0FBZTZDLFNBZHJCO0FBZUxDLFlBQUFBLFVBQVUsRUFBRXhCLE1BQU0sQ0FBQ3RCLE9BQVAsQ0FBZThDLFVBZnRCO0FBaUJMQyxZQUFBQSxRQUFRLEVBQUV6QixNQUFNLENBQUN0QixPQUFQLENBQWUrQyxRQWpCcEI7QUFrQkxoQixZQUFBQSxZQUFZLEVBQUVULE1BQU0sQ0FBQ3RCLE9BQVAsQ0FBZStCLFlBbEJ4QjtBQW1CTGlCLFlBQUFBLFFBQVEsRUFBRTFCLE1BQU0sQ0FBQ3RCLE9BQVAsQ0FBZWdELFFBbkJwQjtBQW9CTEMsWUFBQUEsT0FBTyxFQUFFM0IsTUFBTSxDQUFDdEIsT0FBUCxDQUFlaUQsT0FwQm5CO0FBcUJMQyxZQUFBQSxTQUFTLEVBQUU1QixNQUFNLENBQUN0QixPQUFQLENBQWVrRCxTQXJCckI7QUFzQkxDLFlBQUFBLGNBQWMsRUFBRTdCLE1BQU0sQ0FBQ3RCLE9BQVAsQ0FBZW1ELGNBdEIxQjtBQXdCTEMsWUFBQUEsSUFBSSxFQUFFOUIsTUFBTSxDQUFDdEIsT0FBUCxDQUFlb0QsSUF4QmhCO0FBeUJMNUIsWUFBQUEsSUFBSSxFQUFFRixNQUFNLENBQUN0QixPQUFQLENBQWV3QixJQXpCaEI7QUEwQkw2QixZQUFBQSxHQUFHLEVBQUUvQixNQUFNLENBQUN0QixPQUFQLENBQWVxRCxHQTFCZjtBQTJCTEMsWUFBQUEsRUFBRSxFQUFFaEMsTUFBTSxDQUFDdEIsT0FBUCxDQUFlc0QsRUEzQmQ7QUE0QkxDLFlBQUFBLHVCQUF1QixFQUFFakMsTUFBTSxDQUFDdEIsT0FBUCxDQUFldUQ7QUE1Qm5DLFdBVEs7QUF1Q2RDLFVBQUFBLE1BQU0sRUFBRWxDLE1BQU0sQ0FBQ2tDO0FBdkNELFNBQWxCO0FBeUNILE9BMUNEO0FBMkNIOztBQUdELFFBQUlDLEdBQUcsR0FBR2pELFVBQVUsQ0FBQ2tELE1BQVgsQ0FBa0J6QyxZQUFsQixDQUFWOztBQUNBMEMsZ0JBQUdDLGFBQUgsQ0FBaUJ6RCxjQUFqQixFQUFpQ3NELEdBQWpDOztBQUVBLFdBQU90RCxjQUFQO0FBQ0g7O0FBekVxRCIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKi9cblxuLypcbiAqIE94eWdlbiBYTUwgUmVwb3J0ZXJcbiAqL1xuXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgRmlsZVJlcG9ydGVyQmFzZSBmcm9tICcuLi9yZXBvcnRlci9GaWxlUmVwb3J0ZXJCYXNlJztcbnZhciBFYXN5WG1sID0gcmVxdWlyZSgnZWFzeXhtbCcpO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBYbWxSZXBvcnRlciBleHRlbmRzIEZpbGVSZXBvcnRlckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgZ2VuZXJhdGUocmVzdWx0cykge1xuICAgICAgICB2YXIgcmVzdWx0RmlsZVBhdGggPSB0aGlzLmNyZWF0ZUZvbGRlclN0cnVjdHVyZUFuZEZpbGVQYXRoKCcueG1sJyk7XG4gICAgICAgIHZhciByZXN1bHRGb2xkZXJQYXRoID0gcGF0aC5kaXJuYW1lKHJlc3VsdEZpbGVQYXRoKTtcblxuICAgICAgICB2YXIgc2VyaWFsaXplciA9IG5ldyBFYXN5WG1sKHtcbiAgICAgICAgICAgIHNpbmd1bGFyaXplOiB0cnVlLFxuICAgICAgICAgICAgcm9vdEVsZW1lbnQ6ICd0ZXN0LXJlc3VsdHMnLFxuICAgICAgICAgICAgcm9vdEFycmF5OiAndGVzdC1yZXN1bHRzJyxcbiAgICAgICAgICAgIGRhdGVGb3JtYXQ6ICdJU08nLFxuICAgICAgICAgICAgbWFuaWZlc3Q6IHRydWUsXG4gICAgICAgICAgICB1bndyYXBBcnJheXM6IGZhbHNlLFxuICAgICAgICAgICAgZmlsdGVyTnVsbHM6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZXBsYWNlU2NyZWVuc2hvdHNXaXRoRmlsZXMocmVzdWx0cywgcmVzdWx0Rm9sZGVyUGF0aCk7XG4gICAgICAgIGNvbnN0IGZvclhtbFJlbmRlciA9IFtdO1xuXG4gICAgICAgIGlmIChyZXN1bHRzICYmIEFycmF5LmlzQXJyYXkocmVzdWx0cykgJiYgcmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXN1bHRzLm1hcCgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgZm9yWG1sUmVuZGVyLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiByZXN1bHQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWU6IHJlc3VsdC5zdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICAgIGVuZFRpbWU6IHJlc3VsdC5lbmRUaW1lLFxuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogcmVzdWx0LmR1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICBmYWlsdXJlOiByZXN1bHQuZmFpbHVyZSxcbiAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQ6IHJlc3VsdC5lbnZpcm9ubWVudCxcbiAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzOiByZXN1bHQuY2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjd2Q6IHJlc3VsdC5vcHRpb25zLmN3ZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogIHJlc3VsdC5vcHRpb25zLnRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXJOYW1lOiByZXN1bHQub3B0aW9ucy5icm93c2VyTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVuaXVtVXJsOiByZXN1bHQub3B0aW9ucy5zZWxlbml1bVVybCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGl1bVVybDogcmVzdWx0Lm9wdGlvbnMuYXBwaXVtVXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVvcGVuU2Vzc2lvbjogcmVzdWx0Lm9wdGlvbnMucmVvcGVuU2Vzc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlUnVuT25GYWlsZWQ6IHJlc3VsdC5vcHRpb25zLnJlUnVuT25GYWlsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRpb25zOiByZXN1bHQub3B0aW9ucy5pdGVyYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdQb3J0OiByZXN1bHQub3B0aW9ucy5kZWJ1Z1BvcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxheTogcmVzdWx0Lm9wdGlvbnMuZGVsYXksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0RGV2aWNlTG9nczogcmVzdWx0Lm9wdGlvbnMuY29sbGVjdERldmljZUxvZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0QXBwaXVtTG9nczogcmVzdWx0Lm9wdGlvbnMuY29sbGVjdEFwcGl1bUxvZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0QnJvd3NlckxvZ3M6IHJlc3VsdC5vcHRpb25zLmNvbGxlY3RCcm93c2VyTG9ncyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGluZzogcmVzdWx0Lm9wdGlvbnMucmVwb3J0aW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczogcmVzdWx0Lm9wdGlvbnMucGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1aXRlczogcmVzdWx0Lm9wdGlvbnMuc3VpdGVzLCAvLyBpZ25vcmUsIGZ1bmN0aW9uIGluc2lkZVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYWxsZWw6IHJlc3VsdC5vcHRpb25zLnBhcmFsbGVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzOiByZXN1bHQub3B0aW9ucy5jYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlczogcmVzdWx0Lm9wdGlvbnMuc2VydmljZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzOiByZXN1bHQub3B0aW9ucy5tb2R1bGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWV3b3JrOiByZXN1bHQub3B0aW9ucy5mcmFtZXdvcmssXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBsaXRvb2xzT3B0czogcmVzdWx0Lm9wdGlvbnMuYXBwbGl0b29sc09wdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBob29rczogcmVzdWx0Lm9wdGlvbnMuaG9va3MsIC8vIGlnbm9yZSwgZnVuY3Rpb24gaW5zaWRlXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZzOiByZXN1bHQub3B0aW9ucy5lbnZzLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcmVzdWx0Lm9wdGlvbnMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudjogcmVzdWx0Lm9wdGlvbnMuZW52LFxuICAgICAgICAgICAgICAgICAgICAgICAgcG86IHJlc3VsdC5vcHRpb25zLnBvLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0Q29udGVudExpbmVPZmZzZXQ6IHJlc3VsdC5vcHRpb25zLnNjcmlwdENvbnRlbnRMaW5lT2Zmc2V0XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHN1aXRlczogcmVzdWx0LnN1aXRlc1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZXJpYWxpemUgdGVzdCByZXN1bHRzIHRvIFhNTCBhbmQgc2F2ZSB0byBmaWxlXG4gICAgICAgIHZhciB4bWwgPSBzZXJpYWxpemVyLnJlbmRlcihmb3JYbWxSZW5kZXIpO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHJlc3VsdEZpbGVQYXRoLCB4bWwpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHRGaWxlUGF0aDtcbiAgICB9XG59Il19
96
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9yZXBvcnRlcnMvcmVwb3J0ZXIteG1sLmpzIl0sIm5hbWVzIjpbIkVhc3lYbWwiLCJyZXF1aXJlIiwiWG1sUmVwb3J0ZXIiLCJGaWxlUmVwb3J0ZXJCYXNlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwiZ2VuZXJhdGUiLCJyZXN1bHRzIiwicmVzdWx0RmlsZVBhdGgiLCJjcmVhdGVGb2xkZXJTdHJ1Y3R1cmVBbmRGaWxlUGF0aCIsInJlc3VsdEZvbGRlclBhdGgiLCJwYXRoIiwiZGlybmFtZSIsInNlcmlhbGl6ZXIiLCJzaW5ndWxhcml6ZSIsInJvb3RFbGVtZW50Iiwicm9vdEFycmF5IiwiZGF0ZUZvcm1hdCIsIm1hbmlmZXN0IiwidW53cmFwQXJyYXlzIiwiZmlsdGVyTnVsbHMiLCJyZXBsYWNlU2NyZWVuc2hvdHNXaXRoRmlsZXMiLCJmb3JYbWxSZW5kZXIiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJtYXAiLCJyZXN1bHQiLCJwdXNoIiwibmFtZSIsInN0YXR1cyIsInN0YXJ0VGltZSIsImVuZFRpbWUiLCJkdXJhdGlvbiIsImZhaWx1cmUiLCJlbnZpcm9ubWVudCIsImNhcGFiaWxpdGllcyIsImN3ZCIsInRhcmdldCIsImJyb3dzZXJOYW1lIiwic2VsZW5pdW1VcmwiLCJhcHBpdW1VcmwiLCJyZW9wZW5TZXNzaW9uIiwicmVSdW5PbkZhaWxlZCIsIml0ZXJhdGlvbnMiLCJkZWJ1Z1BvcnQiLCJkZWxheSIsImNvbGxlY3REZXZpY2VMb2dzIiwiY29sbGVjdEFwcGl1bUxvZ3MiLCJjb2xsZWN0QnJvd3NlckxvZ3MiLCJyZXBvcnRpbmciLCJwYXJhbWV0ZXJzIiwicGFyYWxsZWwiLCJzZXJ2aWNlcyIsIm1vZHVsZXMiLCJmcmFtZXdvcmsiLCJhcHBsaXRvb2xzT3B0cyIsImVudnMiLCJlbnYiLCJwbyIsInNjcmlwdENvbnRlbnRMaW5lT2Zmc2V0Iiwic3VpdGVzIiwieG1sIiwicmVuZGVyIiwiZnMiLCJ3cml0ZUZpbGVTeW5jIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFhQTs7QUFDQTs7QUFDQTs7OztBQUNBLElBQUlBLE9BQU8sR0FBR0MsT0FBTyxDQUFDLFNBQUQsQ0FBckI7O0FBRWUsTUFBTUMsV0FBTixTQUEwQkMseUJBQTFCLENBQTJDO0FBQ3REQyxFQUFBQSxXQUFXLENBQUNDLE9BQUQsRUFBVTtBQUNqQixVQUFNQSxPQUFOO0FBQ0g7O0FBRURDLEVBQUFBLFFBQVEsQ0FBQ0MsT0FBRCxFQUFVO0FBQ2QsUUFBSUMsY0FBYyxHQUFHLEtBQUtDLGdDQUFMLENBQXNDLE1BQXRDLENBQXJCOztBQUNBLFFBQUlDLGdCQUFnQixHQUFHQyxjQUFLQyxPQUFMLENBQWFKLGNBQWIsQ0FBdkI7O0FBRUEsUUFBSUssVUFBVSxHQUFHLElBQUliLE9BQUosQ0FBWTtBQUN6QmMsTUFBQUEsV0FBVyxFQUFFLElBRFk7QUFFekJDLE1BQUFBLFdBQVcsRUFBRSxjQUZZO0FBR3pCQyxNQUFBQSxTQUFTLEVBQUUsY0FIYztBQUl6QkMsTUFBQUEsVUFBVSxFQUFFLEtBSmE7QUFLekJDLE1BQUFBLFFBQVEsRUFBRSxJQUxlO0FBTXpCQyxNQUFBQSxZQUFZLEVBQUUsS0FOVztBQU96QkMsTUFBQUEsV0FBVyxFQUFFO0FBUFksS0FBWixDQUFqQjtBQVVBLFNBQUtDLDJCQUFMLENBQWlDZCxPQUFqQyxFQUEwQ0csZ0JBQTFDO0FBQ0EsVUFBTVksWUFBWSxHQUFHLEVBQXJCOztBQUVBLFFBQUlmLE9BQU8sSUFBSWdCLEtBQUssQ0FBQ0MsT0FBTixDQUFjakIsT0FBZCxDQUFYLElBQXFDQSxPQUFPLENBQUNrQixNQUFSLEdBQWlCLENBQTFELEVBQTZEO0FBQ3pEbEIsTUFBQUEsT0FBTyxDQUFDbUIsR0FBUixDQUFhQyxNQUFELElBQVk7QUFDcEJMLFFBQUFBLFlBQVksQ0FBQ00sSUFBYixDQUFrQjtBQUNkQyxVQUFBQSxJQUFJLEVBQUVGLE1BQU0sQ0FBQ0UsSUFEQztBQUVkQyxVQUFBQSxNQUFNLEVBQUVILE1BQU0sQ0FBQ0csTUFGRDtBQUdkQyxVQUFBQSxTQUFTLEVBQUVKLE1BQU0sQ0FBQ0ksU0FISjtBQUlkQyxVQUFBQSxPQUFPLEVBQUVMLE1BQU0sQ0FBQ0ssT0FKRjtBQUtkQyxVQUFBQSxRQUFRLEVBQUVOLE1BQU0sQ0FBQ00sUUFMSDtBQU1kQyxVQUFBQSxPQUFPLEVBQUVQLE1BQU0sQ0FBQ08sT0FORjtBQU9kQyxVQUFBQSxXQUFXLEVBQUVSLE1BQU0sQ0FBQ1EsV0FQTjtBQVFkQyxVQUFBQSxZQUFZLEVBQUVULE1BQU0sQ0FBQ1MsWUFSUDtBQVNkL0IsVUFBQUEsT0FBTyxFQUFFO0FBQ0xnQyxZQUFBQSxHQUFHLEVBQUVWLE1BQU0sQ0FBQ3RCLE9BQVAsQ0FBZWdDLEdBRGY7QUFFTEMsWUFBQUEsTUFBTSxFQUFHWCxNQUFNLENBQUN0QixPQUFQLENBQWVpQyxNQUZuQjtBQUdMQyxZQUFBQSxXQUFXLEVBQUVaLE1BQU0sQ0FBQ3RCLE9BQVAsQ0FBZWtDLFdBSHZCO0FBSUxDLFlBQUFBLFdBQVcsRUFBRWIsTUFBTSxDQUFDdEIsT0FBUCxDQUFlbUMsV0FKdkI7QUFLTEMsWUFBQUEsU0FBUyxFQUFFZCxNQUFNLENBQUN0QixPQUFQLENBQWVvQyxTQUxyQjtBQU1MQyxZQUFBQSxhQUFhLEVBQUVmLE1BQU0sQ0FBQ3RCLE9BQVAsQ0FBZXFDLGFBTnpCO0FBT0xDLFlBQUFBLGFBQWEsRUFBRWhCLE1BQU0sQ0FBQ3RCLE9BQVAsQ0FBZXNDLGFBUHpCO0FBUUxDLFlBQUFBLFVBQVUsRUFBRWpCLE1BQU0sQ0FBQ3RCLE9BQVAsQ0FBZXVDLFVBUnRCO0FBU0xDLFlBQUFBLFNBQVMsRUFBRWxCLE1BQU0sQ0FBQ3RCLE9BQVAsQ0FBZXdDLFNBVHJCO0FBVUxDLFlBQUFBLEtBQUssRUFBRW5CLE1BQU0sQ0FBQ3RCLE9BQVAsQ0FBZXlDLEtBVmpCO0FBV0xDLFlBQUFBLGlCQUFpQixFQUFFcEIsTUFBTSxDQUFDdEIsT0FBUCxDQUFlMEMsaUJBWDdCO0FBWUxDLFlBQUFBLGlCQUFpQixFQUFFckIsTUFBTSxDQUFDdEIsT0FBUCxDQUFlMkMsaUJBWjdCO0FBYUxDLFlBQUFBLGtCQUFrQixFQUFFdEIsTUFBTSxDQUFDdEIsT0FBUCxDQUFlNEMsa0JBYjlCO0FBY0xDLFlBQUFBLFNBQVMsRUFBRXZCLE1BQU0sQ0FBQ3RCLE9BQVAsQ0FBZTZDLFNBZHJCO0FBZUxDLFlBQUFBLFVBQVUsRUFBRXhCLE1BQU0sQ0FBQ3RCLE9BQVAsQ0FBZThDLFVBZnRCO0FBaUJMQyxZQUFBQSxRQUFRLEVBQUV6QixNQUFNLENBQUN0QixPQUFQLENBQWUrQyxRQWpCcEI7QUFrQkxoQixZQUFBQSxZQUFZLEVBQUVULE1BQU0sQ0FBQ3RCLE9BQVAsQ0FBZStCLFlBbEJ4QjtBQW1CTGlCLFlBQUFBLFFBQVEsRUFBRTFCLE1BQU0sQ0FBQ3RCLE9BQVAsQ0FBZWdELFFBbkJwQjtBQW9CTEMsWUFBQUEsT0FBTyxFQUFFM0IsTUFBTSxDQUFDdEIsT0FBUCxDQUFlaUQsT0FwQm5CO0FBcUJMQyxZQUFBQSxTQUFTLEVBQUU1QixNQUFNLENBQUN0QixPQUFQLENBQWVrRCxTQXJCckI7QUFzQkxDLFlBQUFBLGNBQWMsRUFBRTdCLE1BQU0sQ0FBQ3RCLE9BQVAsQ0FBZW1ELGNBdEIxQjtBQXdCTEMsWUFBQUEsSUFBSSxFQUFFOUIsTUFBTSxDQUFDdEIsT0FBUCxDQUFlb0QsSUF4QmhCO0FBeUJMNUIsWUFBQUEsSUFBSSxFQUFFRixNQUFNLENBQUN0QixPQUFQLENBQWV3QixJQXpCaEI7QUEwQkw2QixZQUFBQSxHQUFHLEVBQUUvQixNQUFNLENBQUN0QixPQUFQLENBQWVxRCxHQTFCZjtBQTJCTEMsWUFBQUEsRUFBRSxFQUFFaEMsTUFBTSxDQUFDdEIsT0FBUCxDQUFlc0QsRUEzQmQ7QUE0QkxDLFlBQUFBLHVCQUF1QixFQUFFakMsTUFBTSxDQUFDdEIsT0FBUCxDQUFldUQ7QUE1Qm5DLFdBVEs7QUF1Q2RDLFVBQUFBLE1BQU0sRUFBRWxDLE1BQU0sQ0FBQ2tDO0FBdkNELFNBQWxCO0FBeUNILE9BMUNEO0FBMkNIOztBQUdELFFBQUlDLEdBQUcsR0FBR2pELFVBQVUsQ0FBQ2tELE1BQVgsQ0FBa0J6QyxZQUFsQixDQUFWOztBQUNBMEMsZ0JBQUdDLGFBQUgsQ0FBaUJ6RCxjQUFqQixFQUFpQ3NELEdBQWpDOztBQUVBLFdBQU90RCxjQUFQO0FBQ0g7O0FBekVxRCIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuLypcclxuICogT3h5Z2VuIFhNTCBSZXBvcnRlclxyXG4gKi9cclxuXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xyXG5pbXBvcnQgRmlsZVJlcG9ydGVyQmFzZSBmcm9tICcuLi9yZXBvcnRlci9GaWxlUmVwb3J0ZXJCYXNlJztcclxudmFyIEVhc3lYbWwgPSByZXF1aXJlKCdlYXN5eG1sJyk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBYbWxSZXBvcnRlciBleHRlbmRzIEZpbGVSZXBvcnRlckJhc2Uge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdlbmVyYXRlKHJlc3VsdHMpIHtcclxuICAgICAgICB2YXIgcmVzdWx0RmlsZVBhdGggPSB0aGlzLmNyZWF0ZUZvbGRlclN0cnVjdHVyZUFuZEZpbGVQYXRoKCcueG1sJyk7XHJcbiAgICAgICAgdmFyIHJlc3VsdEZvbGRlclBhdGggPSBwYXRoLmRpcm5hbWUocmVzdWx0RmlsZVBhdGgpO1xyXG5cclxuICAgICAgICB2YXIgc2VyaWFsaXplciA9IG5ldyBFYXN5WG1sKHtcclxuICAgICAgICAgICAgc2luZ3VsYXJpemU6IHRydWUsXHJcbiAgICAgICAgICAgIHJvb3RFbGVtZW50OiAndGVzdC1yZXN1bHRzJyxcclxuICAgICAgICAgICAgcm9vdEFycmF5OiAndGVzdC1yZXN1bHRzJyxcclxuICAgICAgICAgICAgZGF0ZUZvcm1hdDogJ0lTTycsXHJcbiAgICAgICAgICAgIG1hbmlmZXN0OiB0cnVlLFxyXG4gICAgICAgICAgICB1bndyYXBBcnJheXM6IGZhbHNlLFxyXG4gICAgICAgICAgICBmaWx0ZXJOdWxsczogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnJlcGxhY2VTY3JlZW5zaG90c1dpdGhGaWxlcyhyZXN1bHRzLCByZXN1bHRGb2xkZXJQYXRoKTtcclxuICAgICAgICBjb25zdCBmb3JYbWxSZW5kZXIgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdHMgJiYgQXJyYXkuaXNBcnJheShyZXN1bHRzKSAmJiByZXN1bHRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZm9yWG1sUmVuZGVyLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHJlc3VsdC5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcclxuICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWU6IHJlc3VsdC5zdGFydFRpbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kVGltZTogcmVzdWx0LmVuZFRpbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IHJlc3VsdC5kdXJhdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBmYWlsdXJlOiByZXN1bHQuZmFpbHVyZSxcclxuICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudDogcmVzdWx0LmVudmlyb25tZW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllczogcmVzdWx0LmNhcGFiaWxpdGllcyxcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN3ZDogcmVzdWx0Lm9wdGlvbnMuY3dkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICByZXN1bHQub3B0aW9ucy50YXJnZXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXJOYW1lOiByZXN1bHQub3B0aW9ucy5icm93c2VyTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZW5pdW1Vcmw6IHJlc3VsdC5vcHRpb25zLnNlbGVuaXVtVXJsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBpdW1Vcmw6IHJlc3VsdC5vcHRpb25zLmFwcGl1bVVybCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVvcGVuU2Vzc2lvbjogcmVzdWx0Lm9wdGlvbnMucmVvcGVuU2Vzc2lvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVSdW5PbkZhaWxlZDogcmVzdWx0Lm9wdGlvbnMucmVSdW5PbkZhaWxlZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0aW9uczogcmVzdWx0Lm9wdGlvbnMuaXRlcmF0aW9ucyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdQb3J0OiByZXN1bHQub3B0aW9ucy5kZWJ1Z1BvcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5OiByZXN1bHQub3B0aW9ucy5kZWxheSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdERldmljZUxvZ3M6IHJlc3VsdC5vcHRpb25zLmNvbGxlY3REZXZpY2VMb2dzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0QXBwaXVtTG9nczogcmVzdWx0Lm9wdGlvbnMuY29sbGVjdEFwcGl1bUxvZ3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3RCcm93c2VyTG9nczogcmVzdWx0Lm9wdGlvbnMuY29sbGVjdEJyb3dzZXJMb2dzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRpbmc6IHJlc3VsdC5vcHRpb25zLnJlcG9ydGluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczogcmVzdWx0Lm9wdGlvbnMucGFyYW1ldGVycyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VpdGVzOiByZXN1bHQub3B0aW9ucy5zdWl0ZXMsIC8vIGlnbm9yZSwgZnVuY3Rpb24gaW5zaWRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFsbGVsOiByZXN1bHQub3B0aW9ucy5wYXJhbGxlbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzOiByZXN1bHQub3B0aW9ucy5jYXBhYmlsaXRpZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzOiByZXN1bHQub3B0aW9ucy5zZXJ2aWNlcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlczogcmVzdWx0Lm9wdGlvbnMubW9kdWxlcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWV3b3JrOiByZXN1bHQub3B0aW9ucy5mcmFtZXdvcmssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpdG9vbHNPcHRzOiByZXN1bHQub3B0aW9ucy5hcHBsaXRvb2xzT3B0cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG9va3M6IHJlc3VsdC5vcHRpb25zLmhvb2tzLCAvLyBpZ25vcmUsIGZ1bmN0aW9uIGluc2lkZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZzOiByZXN1bHQub3B0aW9ucy5lbnZzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiByZXN1bHQub3B0aW9ucy5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnY6IHJlc3VsdC5vcHRpb25zLmVudixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG86IHJlc3VsdC5vcHRpb25zLnBvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRDb250ZW50TGluZU9mZnNldDogcmVzdWx0Lm9wdGlvbnMuc2NyaXB0Q29udGVudExpbmVPZmZzZXRcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHN1aXRlczogcmVzdWx0LnN1aXRlc1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc2VyaWFsaXplIHRlc3QgcmVzdWx0cyB0byBYTUwgYW5kIHNhdmUgdG8gZmlsZVxyXG4gICAgICAgIHZhciB4bWwgPSBzZXJpYWxpemVyLnJlbmRlcihmb3JYbWxSZW5kZXIpO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMocmVzdWx0RmlsZVBhdGgsIHhtbCk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHRGaWxlUGF0aDtcclxuICAgIH1cclxufSJdfQ==