oxygen-cli 1.40.1 → 1.40.2-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (441) hide show
  1. package/CHANGELOG.md +1742 -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 +2 -1
  17. package/build/index.js +1 -1
  18. package/build/lib/cli-util.js +5 -1
  19. package/build/lib/debugger.js +1 -1
  20. package/build/lib/img-merge.js +1 -1
  21. package/build/lib/launcher.js +1 -1
  22. package/build/lib/logger.js +43 -43
  23. package/build/lib/moduleRequire.js +1 -1
  24. package/build/lib/parallel-launcher.js +1 -1
  25. package/build/lib/param-manager.js +1 -1
  26. package/build/lib/param-reader-csv.js +1 -1
  27. package/build/lib/param-reader-excel.js +1 -1
  28. package/build/lib/param-reader-json.js +1 -1
  29. package/build/lib/text-to-image.js +1 -1
  30. package/build/lib/util.js +1 -1
  31. package/build/model/case-result.js +1 -1
  32. package/build/model/failure.js +1 -1
  33. package/build/model/status.js +1 -1
  34. package/build/model/step-result.js +1 -1
  35. package/build/model/suite-result.js +1 -1
  36. package/build/model/test-result.js +1 -1
  37. package/build/model/testcase.js +1 -1
  38. package/build/model/testsuite.js +1 -1
  39. package/build/ox_modules/index.js +9 -1
  40. package/build/ox_modules/module-assert.js +37 -37
  41. package/build/ox_modules/module-date.js +24 -24
  42. package/build/ox_modules/module-db.js +52 -52
  43. package/build/ox_modules/module-email.js +59 -59
  44. package/build/ox_modules/module-eyes.js +34 -34
  45. package/build/ox_modules/module-http/ntlm-util.js +10 -10
  46. package/build/ox_modules/module-http/ntlm.js +15 -15
  47. package/build/ox_modules/module-http.js +132 -132
  48. package/build/ox_modules/module-log.js +27 -27
  49. package/build/ox_modules/module-mailinator.js +87 -87
  50. package/build/ox_modules/module-mob/commands/alertAccept.js +17 -17
  51. package/build/ox_modules/module-mob/commands/alertDismiss.js +17 -17
  52. package/build/ox_modules/module-mob/commands/assertAlert.js +20 -20
  53. package/build/ox_modules/module-mob/commands/assertText.js +21 -21
  54. package/build/ox_modules/module-mob/commands/assertTitle.js +19 -19
  55. package/build/ox_modules/module-mob/commands/assertValue.js +18 -18
  56. package/build/ox_modules/module-mob/commands/back.js +16 -16
  57. package/build/ox_modules/module-mob/commands/clear.js +19 -19
  58. package/build/ox_modules/module-mob/commands/click.js +17 -17
  59. package/build/ox_modules/module-mob/commands/clickHidden.js +17 -17
  60. package/build/ox_modules/module-mob/commands/clickLong.js +18 -18
  61. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +18 -18
  62. package/build/ox_modules/module-mob/commands/closeApp.js +16 -16
  63. package/build/ox_modules/module-mob/commands/debug.js +16 -16
  64. package/build/ox_modules/module-mob/commands/dragAndDrop.js +19 -19
  65. package/build/ox_modules/module-mob/commands/enableNetwork.js +27 -27
  66. package/build/ox_modules/module-mob/commands/execute.js +21 -21
  67. package/build/ox_modules/module-mob/commands/findElement.js +20 -20
  68. package/build/ox_modules/module-mob/commands/findElements.js +23 -23
  69. package/build/ox_modules/module-mob/commands/getAlertText.js +17 -17
  70. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +16 -16
  71. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +16 -16
  72. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +15 -15
  73. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +15 -15
  74. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +16 -16
  75. package/build/ox_modules/module-mob/commands/getDeviceTime.js +16 -16
  76. package/build/ox_modules/module-mob/commands/getLocation.js +20 -20
  77. package/build/ox_modules/module-mob/commands/getSource.js +16 -16
  78. package/build/ox_modules/module-mob/commands/getText.js +18 -18
  79. package/build/ox_modules/module-mob/commands/getTitle.js +13 -13
  80. package/build/ox_modules/module-mob/commands/getUrl.js +17 -17
  81. package/build/ox_modules/module-mob/commands/getValue.js +18 -18
  82. package/build/ox_modules/module-mob/commands/getWindowHandles.js +17 -17
  83. package/build/ox_modules/module-mob/commands/hideKeyboard.js +21 -21
  84. package/build/ox_modules/module-mob/commands/index.js +1 -1
  85. package/build/ox_modules/module-mob/commands/installApp.js +16 -16
  86. package/build/ox_modules/module-mob/commands/isAppInstalled.js +16 -16
  87. package/build/ox_modules/module-mob/commands/isCheckable.js +18 -18
  88. package/build/ox_modules/module-mob/commands/isChecked.js +18 -18
  89. package/build/ox_modules/module-mob/commands/isClickable.js +18 -18
  90. package/build/ox_modules/module-mob/commands/isExist.js +19 -19
  91. package/build/ox_modules/module-mob/commands/isSelected.js +23 -23
  92. package/build/ox_modules/module-mob/commands/isVisible.js +19 -19
  93. package/build/ox_modules/module-mob/commands/isWebViewContext.js +16 -16
  94. package/build/ox_modules/module-mob/commands/launchApp.js +15 -15
  95. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +18 -18
  96. package/build/ox_modules/module-mob/commands/open.js +17 -17
  97. package/build/ox_modules/module-mob/commands/pause.js +16 -16
  98. package/build/ox_modules/module-mob/commands/removeApp.js +16 -16
  99. package/build/ox_modules/module-mob/commands/resetApp.js +15 -15
  100. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +22 -22
  101. package/build/ox_modules/module-mob/commands/scrollIntoView.js +27 -27
  102. package/build/ox_modules/module-mob/commands/select.js +24 -24
  103. package/build/ox_modules/module-mob/commands/selectFrame.js +23 -23
  104. package/build/ox_modules/module-mob/commands/selectWindow.js +28 -28
  105. package/build/ox_modules/module-mob/commands/sendKeys.js +29 -29
  106. package/build/ox_modules/module-mob/commands/setContext.js +16 -16
  107. package/build/ox_modules/module-mob/commands/setNativeContext.js +15 -15
  108. package/build/ox_modules/module-mob/commands/setTimeout.js +21 -21
  109. package/build/ox_modules/module-mob/commands/setWebViewContext.js +16 -16
  110. package/build/ox_modules/module-mob/commands/shake.js +16 -16
  111. package/build/ox_modules/module-mob/commands/smsClickLink.js +19 -19
  112. package/build/ox_modules/module-mob/commands/smsGetText.js +20 -20
  113. package/build/ox_modules/module-mob/commands/swipe.js +20 -20
  114. package/build/ox_modules/module-mob/commands/swipeElement.js +20 -20
  115. package/build/ox_modules/module-mob/commands/swipeScreen.js +20 -20
  116. package/build/ox_modules/module-mob/commands/takeScreenshot.js +17 -17
  117. package/build/ox_modules/module-mob/commands/tap.js +17 -17
  118. package/build/ox_modules/module-mob/commands/type.js +20 -20
  119. package/build/ox_modules/module-mob/commands/unlockPattern.js +22 -22
  120. package/build/ox_modules/module-mob/commands/waitForExist.js +18 -18
  121. package/build/ox_modules/module-mob/commands/waitForInteractable.js +17 -17
  122. package/build/ox_modules/module-mob/commands/waitForVisible.js +17 -17
  123. package/build/ox_modules/module-mob.js +74 -74
  124. package/build/ox_modules/module-mongo.js +302 -0
  125. package/build/ox_modules/module-pdf.js +35 -35
  126. package/build/ox_modules/module-proxy.js +77 -77
  127. package/build/ox_modules/module-serial.js +55 -55
  128. package/build/ox_modules/module-shell.js +25 -25
  129. package/build/ox_modules/module-soap.js +72 -72
  130. package/build/ox_modules/module-twilio.js +41 -41
  131. package/build/ox_modules/module-utils.js +91 -91
  132. package/build/ox_modules/module-web/commands/alertAccept.js +17 -17
  133. package/build/ox_modules/module-web/commands/alertDismiss.js +17 -17
  134. package/build/ox_modules/module-web/commands/assertAlert.js +20 -20
  135. package/build/ox_modules/module-web/commands/assertExist.js +17 -17
  136. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +21 -21
  137. package/build/ox_modules/module-web/commands/assertSelectedValue.js +21 -21
  138. package/build/ox_modules/module-web/commands/assertText.js +21 -21
  139. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +18 -18
  140. package/build/ox_modules/module-web/commands/assertTextPresent.js +18 -18
  141. package/build/ox_modules/module-web/commands/assertTitle.js +19 -19
  142. package/build/ox_modules/module-web/commands/assertValue.js +20 -20
  143. package/build/ox_modules/module-web/commands/back.js +16 -16
  144. package/build/ox_modules/module-web/commands/clear.js +18 -18
  145. package/build/ox_modules/module-web/commands/click.js +25 -25
  146. package/build/ox_modules/module-web/commands/clickHidden.js +23 -23
  147. package/build/ox_modules/module-web/commands/closeWindow.js +15 -15
  148. package/build/ox_modules/module-web/commands/debug.js +15 -15
  149. package/build/ox_modules/module-web/commands/deleteCookies.js +12 -12
  150. package/build/ox_modules/module-web/commands/deselect.js +22 -22
  151. package/build/ox_modules/module-web/commands/doubleClick.js +17 -17
  152. package/build/ox_modules/module-web/commands/dragAndDrop.js +20 -20
  153. package/build/ox_modules/module-web/commands/execute.js +24 -24
  154. package/build/ox_modules/module-web/commands/fileBrowse.js +18 -18
  155. package/build/ox_modules/module-web/commands/findElement.js +19 -19
  156. package/build/ox_modules/module-web/commands/findElements.js +22 -22
  157. package/build/ox_modules/module-web/commands/fullscreenWindow.js +14 -14
  158. package/build/ox_modules/module-web/commands/getAlertText.js +16 -16
  159. package/build/ox_modules/module-web/commands/getAttribute.js +19 -19
  160. package/build/ox_modules/module-web/commands/getBrowserLogs.js +17 -17
  161. package/build/ox_modules/module-web/commands/getCookies.js +13 -13
  162. package/build/ox_modules/module-web/commands/getCssValue.js +19 -19
  163. package/build/ox_modules/module-web/commands/getElementCount.js +17 -17
  164. package/build/ox_modules/module-web/commands/getHTML.js +17 -17
  165. package/build/ox_modules/module-web/commands/getSource.js +16 -16
  166. package/build/ox_modules/module-web/commands/getText.js +18 -18
  167. package/build/ox_modules/module-web/commands/getTitle.js +12 -12
  168. package/build/ox_modules/module-web/commands/getUrl.js +16 -16
  169. package/build/ox_modules/module-web/commands/getValue.js +18 -18
  170. package/build/ox_modules/module-web/commands/getWindowHandles.js +16 -16
  171. package/build/ox_modules/module-web/commands/getWindowSize.js +16 -16
  172. package/build/ox_modules/module-web/commands/getXMLPageSource.js +16 -16
  173. package/build/ox_modules/module-web/commands/index.js +1 -1
  174. package/build/ox_modules/module-web/commands/isAlertPresent.js +16 -16
  175. package/build/ox_modules/module-web/commands/isChecked.js +18 -18
  176. package/build/ox_modules/module-web/commands/isExist.js +19 -19
  177. package/build/ox_modules/module-web/commands/isInteractable.js +22 -22
  178. package/build/ox_modules/module-web/commands/isSelected.js +23 -23
  179. package/build/ox_modules/module-web/commands/isVisible.js +19 -19
  180. package/build/ox_modules/module-web/commands/makeVisible.js +25 -25
  181. package/build/ox_modules/module-web/commands/maximizeWindow.js +14 -14
  182. package/build/ox_modules/module-web/commands/minimizeWindow.js +14 -14
  183. package/build/ox_modules/module-web/commands/mock.js +20 -20
  184. package/build/ox_modules/module-web/commands/mockClearAll.js +12 -12
  185. package/build/ox_modules/module-web/commands/mockRestoreAll.js +12 -12
  186. package/build/ox_modules/module-web/commands/newWindow.js +16 -16
  187. package/build/ox_modules/module-web/commands/open.js +16 -16
  188. package/build/ox_modules/module-web/commands/pause.js +15 -15
  189. package/build/ox_modules/module-web/commands/point.js +21 -21
  190. package/build/ox_modules/module-web/commands/pointJS.js +15 -15
  191. package/build/ox_modules/module-web/commands/refresh.js +15 -15
  192. package/build/ox_modules/module-web/commands/rightClick.js +17 -17
  193. package/build/ox_modules/module-web/commands/rightClickActions.js +19 -19
  194. package/build/ox_modules/module-web/commands/scrollToElement.js +21 -21
  195. package/build/ox_modules/module-web/commands/select.js +23 -23
  196. package/build/ox_modules/module-web/commands/selectFrame.js +24 -24
  197. package/build/ox_modules/module-web/commands/selectWindow.js +27 -27
  198. package/build/ox_modules/module-web/commands/sendKeys.js +22 -22
  199. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +20 -20
  200. package/build/ox_modules/module-web/commands/setTimeout.js +21 -21
  201. package/build/ox_modules/module-web/commands/setWindowSize.js +17 -17
  202. package/build/ox_modules/module-web/commands/takeScreenshot.js +17 -17
  203. package/build/ox_modules/module-web/commands/type.js +20 -20
  204. package/build/ox_modules/module-web/commands/verifyAlert.js +20 -20
  205. package/build/ox_modules/module-web/commands/verifyExist.js +17 -17
  206. package/build/ox_modules/module-web/commands/verifySelectedLabel.js +21 -21
  207. package/build/ox_modules/module-web/commands/verifySelectedValue.js +21 -21
  208. package/build/ox_modules/module-web/commands/verifyText.js +21 -21
  209. package/build/ox_modules/module-web/commands/verifyTextNotPresent.js +18 -18
  210. package/build/ox_modules/module-web/commands/verifyTextPresent.js +18 -18
  211. package/build/ox_modules/module-web/commands/verifyTitle.js +19 -19
  212. package/build/ox_modules/module-web/commands/verifyValue.js +20 -20
  213. package/build/ox_modules/module-web/commands/waitForAngular.js +19 -19
  214. package/build/ox_modules/module-web/commands/waitForExist.js +17 -17
  215. package/build/ox_modules/module-web/commands/waitForInteractable.js +17 -17
  216. package/build/ox_modules/module-web/commands/waitForNotExist.js +17 -17
  217. package/build/ox_modules/module-web/commands/waitForNotText.js +20 -20
  218. package/build/ox_modules/module-web/commands/waitForNotValue.js +20 -20
  219. package/build/ox_modules/module-web/commands/waitForText.js +20 -20
  220. package/build/ox_modules/module-web/commands/waitForValue.js +20 -20
  221. package/build/ox_modules/module-web/commands/waitForVisible.js +17 -17
  222. package/build/ox_modules/module-web/commands/waitForWindow.js +22 -22
  223. package/build/ox_modules/module-web.js +94 -94
  224. package/build/ox_modules/module-win/commands/assertText.js +17 -17
  225. package/build/ox_modules/module-win/commands/assertTitle.js +15 -15
  226. package/build/ox_modules/module-win/commands/assertValue.js +14 -14
  227. package/build/ox_modules/module-win/commands/back.js +11 -11
  228. package/build/ox_modules/module-win/commands/clear.js +13 -13
  229. package/build/ox_modules/module-win/commands/click.js +13 -13
  230. package/build/ox_modules/module-win/commands/clickLong.js +14 -14
  231. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +14 -14
  232. package/build/ox_modules/module-win/commands/findElement.js +15 -15
  233. package/build/ox_modules/module-win/commands/findElements.js +15 -15
  234. package/build/ox_modules/module-win/commands/getAppiumLogs.js +12 -12
  235. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +15 -15
  236. package/build/ox_modules/module-win/commands/getLocation.js +14 -14
  237. package/build/ox_modules/module-win/commands/getSource.js +12 -12
  238. package/build/ox_modules/module-win/commands/getText.js +14 -14
  239. package/build/ox_modules/module-win/commands/getValue.js +14 -14
  240. package/build/ox_modules/module-win/commands/getWindowHandles.js +15 -15
  241. package/build/ox_modules/module-win/commands/index.js +1 -1
  242. package/build/ox_modules/module-win/commands/isCheckable.js +14 -14
  243. package/build/ox_modules/module-win/commands/isChecked.js +14 -14
  244. package/build/ox_modules/module-win/commands/isClickable.js +14 -14
  245. package/build/ox_modules/module-win/commands/isExist.js +15 -15
  246. package/build/ox_modules/module-win/commands/isSelected.js +14 -14
  247. package/build/ox_modules/module-win/commands/isVisible.js +15 -15
  248. package/build/ox_modules/module-win/commands/open.js +13 -13
  249. package/build/ox_modules/module-win/commands/pause.js +12 -12
  250. package/build/ox_modules/module-win/commands/rightClick.js +13 -13
  251. package/build/ox_modules/module-win/commands/selectWindow.js +23 -23
  252. package/build/ox_modules/module-win/commands/sendKeys.js +22 -22
  253. package/build/ox_modules/module-win/commands/setTimeout.js +17 -17
  254. package/build/ox_modules/module-win/commands/takeScreenshot.js +16 -16
  255. package/build/ox_modules/module-win/commands/tap.js +13 -13
  256. package/build/ox_modules/module-win/commands/type.js +16 -16
  257. package/build/ox_modules/module-win/commands/waitForExist.js +14 -14
  258. package/build/ox_modules/module-win/commands/waitForInteractable.js +16 -16
  259. package/build/ox_modules/module-win/commands/waitForVisible.js +13 -13
  260. package/build/ox_modules/module-win.js +47 -47
  261. package/build/ox_modules/utils.js +8 -8
  262. package/build/ox_reporters/excel/template.json +48 -48
  263. package/build/ox_reporters/html/index.ejs +163 -163
  264. package/build/ox_reporters/html/summary.ejs +77 -77
  265. package/build/ox_reporters/html/tests-details.ejs +134 -134
  266. package/build/ox_reporters/html/tests-devices-browsers.ejs +83 -83
  267. package/build/ox_reporters/reporter-excel.js +1 -1
  268. package/build/ox_reporters/reporter-html.js +1 -1
  269. package/build/ox_reporters/reporter-json.js +1 -1
  270. package/build/ox_reporters/reporter-junit.js +1 -1
  271. package/build/ox_reporters/reporter-pdf.js +1 -1
  272. package/build/ox_reporters/reporter-rp.js +1 -1
  273. package/build/ox_reporters/reporter-xml.js +1 -1
  274. package/build/ox_services/service-devtools/submodule-network.js +1 -1
  275. package/build/ox_services/service-devtools.js +1 -1
  276. package/build/reporter/FileReporterBase.js +1 -1
  277. package/build/reporter/ReportAggregator.js +13 -5
  278. package/build/reporter/ReporterBase.js +1 -1
  279. package/build/reporter/WebSocketReporter.js +1 -1
  280. package/build/runners/WorkerProcess.js +1 -1
  281. package/build/runners/cucumber/CucumberEventListener.js +1 -1
  282. package/build/runners/cucumber/CucumberReporter.js +1 -1
  283. package/build/runners/cucumber/CucumberWorker.js +1 -1
  284. package/build/runners/cucumber/index.js +1 -1
  285. package/build/runners/cucumber/worker.js +1 -1
  286. package/build/runners/index.js +1 -1
  287. package/build/runners/oxygen/OxygenWorker.js +1 -1
  288. package/build/runners/oxygen/index.js +1 -1
  289. package/build/runners/oxygen/worker.js +1 -1
  290. package/config/default.json +6 -6
  291. package/log.txt +1614 -0
  292. package/package.json +139 -137
  293. package/reports/2025-06-08_231627/report.html +440 -0
  294. package/reports/2025-06-09_223615/report.html +440 -0
  295. package/transpiled/mongodb/etc/prepare.js +18 -0
  296. package/transpiled/mongodb/lib/admin.js +182 -0
  297. package/transpiled/mongodb/lib/beta.js +26 -0
  298. package/transpiled/mongodb/lib/bson.js +220 -0
  299. package/transpiled/mongodb/lib/bulk/common.js +1041 -0
  300. package/transpiled/mongodb/lib/bulk/ordered.js +76 -0
  301. package/transpiled/mongodb/lib/bulk/unordered.js +102 -0
  302. package/transpiled/mongodb/lib/change_stream.js +517 -0
  303. package/transpiled/mongodb/lib/client-side-encryption/auto_encrypter.js +329 -0
  304. package/transpiled/mongodb/lib/client-side-encryption/client_encryption.js +779 -0
  305. package/transpiled/mongodb/lib/client-side-encryption/crypto_callbacks.js +95 -0
  306. package/transpiled/mongodb/lib/client-side-encryption/errors.js +171 -0
  307. package/transpiled/mongodb/lib/client-side-encryption/mongocryptd_manager.js +98 -0
  308. package/transpiled/mongodb/lib/client-side-encryption/providers/aws.js +34 -0
  309. package/transpiled/mongodb/lib/client-side-encryption/providers/azure.js +186 -0
  310. package/transpiled/mongodb/lib/client-side-encryption/providers/gcp.js +29 -0
  311. package/transpiled/mongodb/lib/client-side-encryption/providers/index.js +58 -0
  312. package/transpiled/mongodb/lib/client-side-encryption/state_machine.js +505 -0
  313. package/transpiled/mongodb/lib/cmap/auth/auth_provider.js +63 -0
  314. package/transpiled/mongodb/lib/cmap/auth/aws_temporary_credentials.js +167 -0
  315. package/transpiled/mongodb/lib/cmap/auth/gssapi.js +207 -0
  316. package/transpiled/mongodb/lib/cmap/auth/mongo_credentials.js +193 -0
  317. package/transpiled/mongodb/lib/cmap/auth/mongodb_aws.js +181 -0
  318. package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/automated_callback_workflow.js +101 -0
  319. package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/azure_machine_workflow.js +81 -0
  320. package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/callback_workflow.js +174 -0
  321. package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/command_builders.js +59 -0
  322. package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/gcp_machine_workflow.js +58 -0
  323. package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/human_callback_workflow.js +138 -0
  324. package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/k8s_machine_workflow.js +42 -0
  325. package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/token_cache.js +71 -0
  326. package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/token_machine_workflow.js +34 -0
  327. package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc.js +111 -0
  328. package/transpiled/mongodb/lib/cmap/auth/plain.js +43 -0
  329. package/transpiled/mongodb/lib/cmap/auth/providers.js +22 -0
  330. package/transpiled/mongodb/lib/cmap/auth/scram.js +318 -0
  331. package/transpiled/mongodb/lib/cmap/auth/x509.js +61 -0
  332. package/transpiled/mongodb/lib/cmap/command_monitoring_events.js +266 -0
  333. package/transpiled/mongodb/lib/cmap/commands.js +605 -0
  334. package/transpiled/mongodb/lib/cmap/connect.js +418 -0
  335. package/transpiled/mongodb/lib/cmap/connection.js +673 -0
  336. package/transpiled/mongodb/lib/cmap/connection_pool.js +688 -0
  337. package/transpiled/mongodb/lib/cmap/connection_pool_events.js +254 -0
  338. package/transpiled/mongodb/lib/cmap/errors.js +128 -0
  339. package/transpiled/mongodb/lib/cmap/handshake/client_metadata.js +278 -0
  340. package/transpiled/mongodb/lib/cmap/metrics.js +67 -0
  341. package/transpiled/mongodb/lib/cmap/stream_description.js +74 -0
  342. package/transpiled/mongodb/lib/cmap/wire_protocol/compression.js +196 -0
  343. package/transpiled/mongodb/lib/cmap/wire_protocol/constants.js +19 -0
  344. package/transpiled/mongodb/lib/cmap/wire_protocol/on_data.js +144 -0
  345. package/transpiled/mongodb/lib/cmap/wire_protocol/on_demand/document.js +278 -0
  346. package/transpiled/mongodb/lib/cmap/wire_protocol/responses.js +376 -0
  347. package/transpiled/mongodb/lib/cmap/wire_protocol/shared.js +49 -0
  348. package/transpiled/mongodb/lib/collection.js +852 -0
  349. package/transpiled/mongodb/lib/connection_string.js +1452 -0
  350. package/transpiled/mongodb/lib/constants.js +162 -0
  351. package/transpiled/mongodb/lib/cursor/abstract_cursor.js +1082 -0
  352. package/transpiled/mongodb/lib/cursor/aggregation_cursor.js +227 -0
  353. package/transpiled/mongodb/lib/cursor/change_stream_cursor.js +136 -0
  354. package/transpiled/mongodb/lib/cursor/client_bulk_write_cursor.js +69 -0
  355. package/transpiled/mongodb/lib/cursor/find_cursor.js +476 -0
  356. package/transpiled/mongodb/lib/cursor/list_collections_cursor.js +48 -0
  357. package/transpiled/mongodb/lib/cursor/list_indexes_cursor.js +46 -0
  358. package/transpiled/mongodb/lib/cursor/list_search_indexes_cursor.js +30 -0
  359. package/transpiled/mongodb/lib/cursor/run_command_cursor.js +125 -0
  360. package/transpiled/mongodb/lib/db.js +467 -0
  361. package/transpiled/mongodb/lib/deps.js +174 -0
  362. package/transpiled/mongodb/lib/encrypter.js +129 -0
  363. package/transpiled/mongodb/lib/error.js +1550 -0
  364. package/transpiled/mongodb/lib/explain.js +122 -0
  365. package/transpiled/mongodb/lib/gridfs/download.js +369 -0
  366. package/transpiled/mongodb/lib/gridfs/index.js +240 -0
  367. package/transpiled/mongodb/lib/gridfs/upload.js +446 -0
  368. package/transpiled/mongodb/lib/index.js +975 -0
  369. package/transpiled/mongodb/lib/mongo_client.js +626 -0
  370. package/transpiled/mongodb/lib/mongo_client_auth_providers.js +98 -0
  371. package/transpiled/mongodb/lib/mongo_logger.js +812 -0
  372. package/transpiled/mongodb/lib/mongo_types.js +71 -0
  373. package/transpiled/mongodb/lib/operations/aggregate.js +129 -0
  374. package/transpiled/mongodb/lib/operations/bulk_write.js +48 -0
  375. package/transpiled/mongodb/lib/operations/client_bulk_write/client_bulk_write.js +96 -0
  376. package/transpiled/mongodb/lib/operations/client_bulk_write/command_builder.js +409 -0
  377. package/transpiled/mongodb/lib/operations/client_bulk_write/common.js +5 -0
  378. package/transpiled/mongodb/lib/operations/client_bulk_write/executor.js +144 -0
  379. package/transpiled/mongodb/lib/operations/client_bulk_write/results_merger.js +228 -0
  380. package/transpiled/mongodb/lib/operations/collections.js +49 -0
  381. package/transpiled/mongodb/lib/operations/command.js +102 -0
  382. package/transpiled/mongodb/lib/operations/count.js +60 -0
  383. package/transpiled/mongodb/lib/operations/create_collection.js +109 -0
  384. package/transpiled/mongodb/lib/operations/delete.js +134 -0
  385. package/transpiled/mongodb/lib/operations/distinct.js +77 -0
  386. package/transpiled/mongodb/lib/operations/drop.js +102 -0
  387. package/transpiled/mongodb/lib/operations/estimated_document_count.js +47 -0
  388. package/transpiled/mongodb/lib/operations/execute_operation.js +251 -0
  389. package/transpiled/mongodb/lib/operations/find.js +197 -0
  390. package/transpiled/mongodb/lib/operations/find_and_modify.js +191 -0
  391. package/transpiled/mongodb/lib/operations/get_more.js +84 -0
  392. package/transpiled/mongodb/lib/operations/indexes.js +197 -0
  393. package/transpiled/mongodb/lib/operations/insert.js +138 -0
  394. package/transpiled/mongodb/lib/operations/is_capped.js +44 -0
  395. package/transpiled/mongodb/lib/operations/kill_cursors.js +58 -0
  396. package/transpiled/mongodb/lib/operations/list_collections.js +66 -0
  397. package/transpiled/mongodb/lib/operations/list_databases.js +56 -0
  398. package/transpiled/mongodb/lib/operations/operation.js +88 -0
  399. package/transpiled/mongodb/lib/operations/options_operation.js +44 -0
  400. package/transpiled/mongodb/lib/operations/profiling_level.js +42 -0
  401. package/transpiled/mongodb/lib/operations/remove_user.js +35 -0
  402. package/transpiled/mongodb/lib/operations/rename.js +48 -0
  403. package/transpiled/mongodb/lib/operations/run_command.js +64 -0
  404. package/transpiled/mongodb/lib/operations/search_indexes/create.js +41 -0
  405. package/transpiled/mongodb/lib/operations/search_indexes/drop.js +51 -0
  406. package/transpiled/mongodb/lib/operations/search_indexes/update.js +40 -0
  407. package/transpiled/mongodb/lib/operations/set_profiling_level.js +70 -0
  408. package/transpiled/mongodb/lib/operations/stats.js +39 -0
  409. package/transpiled/mongodb/lib/operations/update.js +218 -0
  410. package/transpiled/mongodb/lib/operations/validate_collection.js +49 -0
  411. package/transpiled/mongodb/lib/read_concern.js +92 -0
  412. package/transpiled/mongodb/lib/read_preference.js +215 -0
  413. package/transpiled/mongodb/lib/resource_management.js +74 -0
  414. package/transpiled/mongodb/lib/sdam/common.js +53 -0
  415. package/transpiled/mongodb/lib/sdam/events.js +177 -0
  416. package/transpiled/mongodb/lib/sdam/monitor.js +656 -0
  417. package/transpiled/mongodb/lib/sdam/server.js +463 -0
  418. package/transpiled/mongodb/lib/sdam/server_description.js +196 -0
  419. package/transpiled/mongodb/lib/sdam/server_selection.js +283 -0
  420. package/transpiled/mongodb/lib/sdam/server_selection_events.js +112 -0
  421. package/transpiled/mongodb/lib/sdam/srv_polling.js +139 -0
  422. package/transpiled/mongodb/lib/sdam/topology.js +833 -0
  423. package/transpiled/mongodb/lib/sdam/topology_description.js +447 -0
  424. package/transpiled/mongodb/lib/sessions.js +988 -0
  425. package/transpiled/mongodb/lib/sort.js +123 -0
  426. package/transpiled/mongodb/lib/timeout.js +349 -0
  427. package/transpiled/mongodb/lib/transactions.js +149 -0
  428. package/transpiled/mongodb/lib/utils.js +1502 -0
  429. package/transpiled/mongodb/lib/write_concern.js +115 -0
  430. package/types/index.d.ts +70 -70
  431. package/types/module-eyes.d.ts +39 -39
  432. package/types/module-http.d.ts +163 -163
  433. package/types/module-log.d.ts +34 -34
  434. package/types/module-mob.d.ts +966 -966
  435. package/types/module-pdf.d.ts +40 -40
  436. package/types/module-proxy.d.ts +100 -100
  437. package/types/module-shell.d.ts +24 -24
  438. package/types/module-utils.d.ts +99 -99
  439. package/types/module-web.d.ts +1053 -1053
  440. package/types/module-win.d.ts +352 -352
  441. package/types/oxygen.d.ts +53 -53
@@ -0,0 +1,302 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ require("source-map-support/register");
9
+
10
+ var _OxygenModule = _interopRequireDefault(require("../core/OxygenModule"));
11
+
12
+ var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
13
+
14
+ var _helper = _interopRequireDefault(require("../errors/helper"));
15
+
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
+
18
+ /*
19
+ * Copyright (C) 2015-current CloudBeat Limited
20
+ *
21
+ * This program is free software: you can redistribute it and/or modify
22
+ * it under the terms of the GNU General Public License as published by
23
+ * the Free Software Foundation, either version 3 of the License, or
24
+ * (at your option) any later version.
25
+ */
26
+ const {
27
+ MongoClient
28
+ } = require('mongodb');
29
+
30
+ const MODULE_NAME = 'mongo';
31
+ /**
32
+ * @name shell
33
+ * @description Provides methods for working with operating system shell.
34
+ */
35
+
36
+ class MongoDbModule extends _OxygenModule.default {
37
+ constructor(options, context, rs, logger, modules, services) {
38
+ super(options, context, rs, logger, modules, services);
39
+ this._alwaysInitialized = false;
40
+ this._isInitialized = false;
41
+ this.client;
42
+ this.db;
43
+ this.collection;
44
+ }
45
+ /**
46
+ * @summary Initializes MongoDB session.
47
+ * @function init
48
+ * @param {string} hostOrUrl - Host name or full URL of the target MongoDB server.
49
+ * @param {string} dbName - Database name. You can change it later using "setDatabase" method.
50
+ * @param {string} [username] - Optional username for authentication.
51
+ * @param {string} [password] - Optional password for authentication.
52
+ * @param {string} [authSource=admin] - Optional authentication source. Default value is "admin".
53
+ * @param {number} [port=27017] - Optional MongoDB server port. Default value is 27017.
54
+ */
55
+
56
+
57
+ async init(hostOrUrl, dbName, username, password, authSource = 'admin', port = 27017) {
58
+ if (!hostOrUrl || typeof hostOrUrl !== 'string') {
59
+ throw new Error('MongoDB host name or full URL is not specified!');
60
+ } else if (!dbName) {
61
+ throw new Error('MongoDB database name is not specified!');
62
+ }
63
+
64
+ const isFullUrl = /^mongodb(\+srv)?:\/\//i.test(hostOrUrl);
65
+ const uri = isFullUrl ? hostOrUrl : (() => {
66
+ if (username) {
67
+ const encUsername = encodeURIComponent(username);
68
+ const encPassword = password ? encodeURIComponent(password) : undefined;
69
+ return `mongodb://${encUsername}:${encPassword || ''}@${hostOrUrl}:${port}/${dbName}?authSource=${authSource}`;
70
+ }
71
+
72
+ return `mongodb://${hostOrUrl}:${port}/${dbName}?authSource=${authSource}`;
73
+ })();
74
+ this.client = new MongoClient(uri, {
75
+ useNewUrlParser: true,
76
+ useUnifiedTopology: true
77
+ });
78
+
79
+ try {
80
+ await this.client.connect();
81
+ this.db = this.client.db(dbName);
82
+ this._isInitialized = true;
83
+ } catch (e) {
84
+ throw new _OxygenError.default(_helper.default.errorCode.MONGODB_ERROR, e.message, null, true, e);
85
+ }
86
+ }
87
+ /**
88
+ * @summary Sets the current database to perform further actions.
89
+ * @function setDatabase
90
+ * @param {string} dbName - Database name.
91
+ */
92
+
93
+
94
+ setDatabase(dbName) {
95
+ this.db = this.client.db(dbName);
96
+ }
97
+ /**
98
+ * @summary Sets the current collection to perform further actions.
99
+ * @function setCollection
100
+ * @param {string} collectionName - Collection name.
101
+ */
102
+
103
+
104
+ setCollection(collectionName) {
105
+ if (!this.db) {
106
+ return false;
107
+ }
108
+
109
+ this.collection = this.db.collection(collectionName);
110
+ return true;
111
+ }
112
+ /**
113
+ * @summary Finds documents in the current collection.
114
+ * @function find
115
+ * @param {object} filter - The filter predicate.
116
+ * @param {object} options - Optional settings for the command.
117
+ * @return {object} A list of documents.
118
+ */
119
+
120
+
121
+ async find(filter, options) {
122
+ if (!this.collection) {
123
+ return undefined;
124
+ }
125
+
126
+ try {
127
+ return await this.collection.find(filter, options).toArray();
128
+ } catch (e) {
129
+ throw new _OxygenError.default(_helper.default.errorCode.MONGODB_ERROR, e.message, null, true, e);
130
+ }
131
+ }
132
+ /**
133
+ * @summary Gets the number of documents matching the filter.
134
+ * @function countDocuments
135
+ * @param {object} filter - The filter for the count.
136
+ * @param {object} options - Optional settings for the command.
137
+ * @return {number} Number of documents matching the filter.
138
+ */
139
+
140
+
141
+ async countDocuments(filter, options) {
142
+ if (!this.collection) {
143
+ return undefined;
144
+ }
145
+
146
+ try {
147
+ return await this.collection.countDocuments(filter, options);
148
+ } catch (e) {
149
+ throw new _OxygenError.default(_helper.default.errorCode.MONGODB_ERROR, e.message, null, true, e);
150
+ }
151
+ }
152
+ /**
153
+ * @summary Inserts a single document into a collection.
154
+ * @function insertOne
155
+ * @param {object} doc - The document to insert.
156
+ * @param {object} options - Optional settings for the command.
157
+ */
158
+
159
+
160
+ async insertOne(doc, options) {
161
+ if (!this.collection) {
162
+ return undefined;
163
+ }
164
+
165
+ try {
166
+ return await this.collection.insertOne(doc, options);
167
+ } catch (e) {
168
+ throw new _OxygenError.default(_helper.default.errorCode.MONGODB_ERROR, e.message, null, true, e);
169
+ }
170
+ }
171
+ /**
172
+ * @summary Inserts an array of documents into a collection.
173
+ * @function insertMany
174
+ * @param {object} docs - The documents to insert.
175
+ * @param {object} options - Optional settings for the command.
176
+ */
177
+
178
+
179
+ async insertMany(docs, options) {
180
+ if (!this.collection) {
181
+ return undefined;
182
+ }
183
+
184
+ try {
185
+ return await this.collection.insertMany(docs, options);
186
+ } catch (e) {
187
+ throw new _OxygenError.default(_helper.default.errorCode.MONGODB_ERROR, e.message, null, true, e);
188
+ }
189
+ }
190
+ /**
191
+ * @summary Update a single document in a collection.
192
+ * @function updateOne
193
+ * @param {object} filter - The filter used to select the document to replace.
194
+ * @param {UpdateFilter<TSchema>|Document[]} update - The modifications to apply.
195
+ * @param {object} options - Optional settings for the command.
196
+ */
197
+
198
+
199
+ async updateOne(filter, update) {
200
+ if (!this.collection) {
201
+ return undefined;
202
+ }
203
+
204
+ try {
205
+ return await this.collection.updateOne(filter, update);
206
+ } catch (e) {
207
+ throw new _OxygenError.default(_helper.default.errorCode.MONGODB_ERROR, e.message, null, true, e);
208
+ }
209
+ }
210
+ /**
211
+ * @summary Update multiple documents in a collection.
212
+ * @function updateMany
213
+ * @param {object} filter - The filter used to select the document to update.
214
+ * @param {UpdateFilter<TSchema>|Document[]} update - The modifications to apply.
215
+ * @param {object} options - Optional settings for the command.
216
+ */
217
+
218
+
219
+ async updateMany(filter, update, options) {
220
+ if (!this.collection) {
221
+ return undefined;
222
+ }
223
+
224
+ try {
225
+ return await this.collection.updateMany(filter, update, options);
226
+ } catch (e) {
227
+ throw new _OxygenError.default(_helper.default.errorCode.MONGODB_ERROR, e.message, null, true, e);
228
+ }
229
+ }
230
+ /**
231
+ * @summary Replace a document in a collection with another document.
232
+ * @function replaceOne
233
+ * @param {object} filter - The filter used to select the document to replace.
234
+ * @param {object} doc - The Document that replaces the matching document.
235
+ * @param {object} options - Optional settings for the command.
236
+ */
237
+
238
+
239
+ async replaceOne(filter, doc) {
240
+ if (!this.collection) {
241
+ return undefined;
242
+ }
243
+
244
+ try {
245
+ return await this.collection.replaceOne(filter, doc);
246
+ } catch (e) {
247
+ throw new _OxygenError.default(_helper.default.errorCode.MONGODB_ERROR, e.message, null, true, e);
248
+ }
249
+ }
250
+ /**
251
+ * @summary Delete a document from a collection.
252
+ * @function deleteOne
253
+ * @param {object} filter - The filter used to select the document to remove.
254
+ * @param {object} options - Optional settings for the command.
255
+ */
256
+
257
+
258
+ async deleteOne(filter) {
259
+ if (!this.collection) {
260
+ return undefined;
261
+ }
262
+
263
+ try {
264
+ return await this.collection.deleteOne(filter);
265
+ } catch (e) {
266
+ throw new _OxygenError.default(_helper.default.errorCode.MONGODB_ERROR, e.message, null, true, e);
267
+ }
268
+ }
269
+ /**
270
+ * @summary Delete multiple documents from a collection.
271
+ * @function deleteMany
272
+ * @param {object} filter - The filter used to select the documents to remove.
273
+ * @param {object} options - Optional settings for the command.
274
+ */
275
+
276
+
277
+ async deleteMany(filter) {
278
+ if (!this.collection) {
279
+ return undefined;
280
+ }
281
+
282
+ try {
283
+ return await this.collection.deleteMany(filter);
284
+ } catch (e) {
285
+ throw new _OxygenError.default(_helper.default.errorCode.MONGODB_ERROR, e.message, null, true, e);
286
+ }
287
+ }
288
+ /**
289
+ * @summary Gets module name
290
+ * @function name
291
+ * @return {String} Constant value "shell".
292
+ */
293
+
294
+
295
+ get name() {
296
+ return MODULE_NAME;
297
+ }
298
+
299
+ }
300
+
301
+ exports.default = MongoDbModule;
302
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1tb25nby5qcyJdLCJuYW1lcyI6WyJNb25nb0NsaWVudCIsInJlcXVpcmUiLCJNT0RVTEVfTkFNRSIsIk1vbmdvRGJNb2R1bGUiLCJPeHlnZW5Nb2R1bGUiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJjb250ZXh0IiwicnMiLCJsb2dnZXIiLCJtb2R1bGVzIiwic2VydmljZXMiLCJfYWx3YXlzSW5pdGlhbGl6ZWQiLCJfaXNJbml0aWFsaXplZCIsImNsaWVudCIsImRiIiwiY29sbGVjdGlvbiIsImluaXQiLCJob3N0T3JVcmwiLCJkYk5hbWUiLCJ1c2VybmFtZSIsInBhc3N3b3JkIiwiYXV0aFNvdXJjZSIsInBvcnQiLCJFcnJvciIsImlzRnVsbFVybCIsInRlc3QiLCJ1cmkiLCJlbmNVc2VybmFtZSIsImVuY29kZVVSSUNvbXBvbmVudCIsImVuY1Bhc3N3b3JkIiwidW5kZWZpbmVkIiwidXNlTmV3VXJsUGFyc2VyIiwidXNlVW5pZmllZFRvcG9sb2d5IiwiY29ubmVjdCIsImUiLCJPeEVycm9yIiwiZXJySGVscGVyIiwiZXJyb3JDb2RlIiwiTU9OR09EQl9FUlJPUiIsIm1lc3NhZ2UiLCJzZXREYXRhYmFzZSIsInNldENvbGxlY3Rpb24iLCJjb2xsZWN0aW9uTmFtZSIsImZpbmQiLCJmaWx0ZXIiLCJ0b0FycmF5IiwiY291bnREb2N1bWVudHMiLCJpbnNlcnRPbmUiLCJkb2MiLCJpbnNlcnRNYW55IiwiZG9jcyIsInVwZGF0ZU9uZSIsInVwZGF0ZSIsInVwZGF0ZU1hbnkiLCJyZXBsYWNlT25lIiwiZGVsZXRlT25lIiwiZGVsZXRlTWFueSIsIm5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVNBOztBQUNBOztBQUNBOzs7O0FBWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFBRUEsRUFBQUE7QUFBRixJQUFrQkMsT0FBTyxDQUFDLFNBQUQsQ0FBL0I7O0FB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Q2xvdWRCZWF0IExpbWl0ZWRcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICovXG5jb25zdCB7IE1vbmdvQ2xpZW50IH0gPSByZXF1aXJlKCdtb25nb2RiJyk7XG5pbXBvcnQgT3h5Z2VuTW9kdWxlIGZyb20gJy4uL2NvcmUvT3h5Z2VuTW9kdWxlJztcbmltcG9ydCBPeEVycm9yIGZyb20gJy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XG5pbXBvcnQgZXJySGVscGVyIGZyb20gJy4uL2Vycm9ycy9oZWxwZXInO1xuXG5jb25zdCBNT0RVTEVfTkFNRSA9ICdtb25nbyc7XG5cbi8qKlxuICogQG5hbWUgc2hlbGxcbiAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggb3BlcmF0aW5nIHN5c3RlbSBzaGVsbC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9uZ29EYk1vZHVsZSBleHRlbmRzIE94eWdlbk1vZHVsZSB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpO1xuICAgICAgICB0aGlzLl9hbHdheXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2xpZW50O1xuICAgICAgICB0aGlzLmRiO1xuICAgICAgICB0aGlzLmNvbGxlY3Rpb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIE1vbmdvREIgc2Vzc2lvbi5cbiAgICAgKiBAZnVuY3Rpb24gaW5pdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBob3N0T3JVcmwgLSBIb3N0IG5hbWUgb3IgZnVsbCBVUkwgb2YgdGhlIHRhcmdldCBNb25nb0RCIHNlcnZlci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGJOYW1lIC0gRGF0YWJhc2UgbmFtZS4gWW91IGNhbiBjaGFuZ2UgaXQgbGF0ZXIgdXNpbmcgXCJzZXREYXRhYmFzZVwiIG1ldGhvZC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3VzZXJuYW1lXSAtIE9wdGlvbmFsIHVzZXJuYW1lIGZvciBhdXRoZW50aWNhdGlvbi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3Bhc3N3b3JkXSAtIE9wdGlvbmFsIHBhc3N3b3JkIGZvciBhdXRoZW50aWNhdGlvbi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2F1dGhTb3VyY2U9YWRtaW5dIC0gT3B0aW9uYWwgYXV0aGVudGljYXRpb24gc291cmNlLiBEZWZhdWx0IHZhbHVlIGlzIFwiYWRtaW5cIi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3BvcnQ9MjcwMTddIC0gT3B0aW9uYWwgTW9uZ29EQiBzZXJ2ZXIgcG9ydC4gRGVmYXVsdCB2YWx1ZSBpcyAyNzAxNy5cbiAgICAgKi9cbiAgICBhc3luYyBpbml0KFxuICAgICAgICBob3N0T3JVcmwsXG4gICAgICAgIGRiTmFtZSxcbiAgICAgICAgdXNlcm5hbWUsXG4gICAgICAgIHBhc3N3b3JkLFxuICAgICAgICBhdXRoU291cmNlID0gJ2FkbWluJyxcbiAgICAgICAgcG9ydCA9IDI3MDE3LFxuICAgICkge1xuICAgICAgICBpZiAoIWhvc3RPclVybCB8fCB0eXBlb2YgaG9zdE9yVXJsICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNb25nb0RCIGhvc3QgbmFtZSBvciBmdWxsIFVSTCBpcyBub3Qgc3BlY2lmaWVkIScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFkYk5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTW9uZ29EQiBkYXRhYmFzZSBuYW1lIGlzIG5vdCBzcGVjaWZpZWQhJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNGdWxsVXJsID0gL15tb25nb2RiKFxcK3Nydik/OlxcL1xcLy9pLnRlc3QoaG9zdE9yVXJsKTtcbiAgICAgICAgY29uc3QgdXJpID0gaXNGdWxsVXJsXG4gICAgICAgICAgICA/IGhvc3RPclVybFxuICAgICAgICAgICAgOiAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh1c2VybmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNVc2VybmFtZSA9IGVuY29kZVVSSUNvbXBvbmVudCh1c2VybmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY1Bhc3N3b3JkID0gcGFzc3dvcmQgPyBlbmNvZGVVUklDb21wb25lbnQocGFzc3dvcmQpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYG1vbmdvZGI6Ly8ke2VuY1VzZXJuYW1lfToke2VuY1Bhc3N3b3JkIHx8ICcnfUAke2hvc3RPclVybH06JHtwb3J0fS8ke2RiTmFtZX0/YXV0aFNvdXJjZT0ke2F1dGhTb3VyY2V9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBtb25nb2RiOi8vJHtob3N0T3JVcmx9OiR7cG9ydH0vJHtkYk5hbWV9P2F1dGhTb3VyY2U9JHthdXRoU291cmNlfWA7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICB0aGlzLmNsaWVudCA9IG5ldyBNb25nb0NsaWVudCh1cmksIHsgdXNlTmV3VXJsUGFyc2VyOiB0cnVlLCB1c2VVbmlmaWVkVG9wb2xvZ3k6IHRydWUgfSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsaWVudC5jb25uZWN0KCk7XG4gICAgICAgICAgICB0aGlzLmRiID0gdGhpcy5jbGllbnQuZGIoZGJOYW1lKTtcbiAgICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PTkdPREJfRVJST1IsIGUubWVzc2FnZSwgbnVsbCwgdHJ1ZSwgZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBTZXRzIHRoZSBjdXJyZW50IGRhdGFiYXNlIHRvIHBlcmZvcm0gZnVydGhlciBhY3Rpb25zLlxuICAgICAqIEBmdW5jdGlvbiBzZXREYXRhYmFzZSBcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGJOYW1lIC0gRGF0YWJhc2UgbmFtZS5cbiAgICAgKi9cbiAgICBzZXREYXRhYmFzZShkYk5hbWUpIHtcbiAgICAgICAgdGhpcy5kYiA9IHRoaXMuY2xpZW50LmRiKGRiTmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgU2V0cyB0aGUgY3VycmVudCBjb2xsZWN0aW9uIHRvIHBlcmZvcm0gZnVydGhlciBhY3Rpb25zLlxuICAgICAqIEBmdW5jdGlvbiBzZXRDb2xsZWN0aW9uIFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xsZWN0aW9uTmFtZSAtIENvbGxlY3Rpb24gbmFtZS5cbiAgICAgKi9cbiAgICBzZXRDb2xsZWN0aW9uKGNvbGxlY3Rpb25OYW1lKSB7XG4gICAgICAgIGlmICghdGhpcy5kYikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29sbGVjdGlvbiA9IHRoaXMuZGIuY29sbGVjdGlvbihjb2xsZWN0aW9uTmFtZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IEZpbmRzIGRvY3VtZW50cyBpbiB0aGUgY3VycmVudCBjb2xsZWN0aW9uLlxuICAgICAqIEBmdW5jdGlvbiBmaW5kIFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBmaWx0ZXIgLSBUaGUgZmlsdGVyIHByZWRpY2F0ZS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIE9wdGlvbmFsIHNldHRpbmdzIGZvciB0aGUgY29tbWFuZC5cbiAgICAgKiBAcmV0dXJuIHtvYmplY3R9IEEgbGlzdCBvZiBkb2N1bWVudHMuXG4gICAgICovXG4gICAgYXN5bmMgZmluZChmaWx0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbGxlY3Rpb24uZmluZChmaWx0ZXIsIG9wdGlvbnMpLnRvQXJyYXkoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT05HT0RCX0VSUk9SLCBlLm1lc3NhZ2UsIG51bGwsIHRydWUsIGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgR2V0cyB0aGUgbnVtYmVyIG9mIGRvY3VtZW50cyBtYXRjaGluZyB0aGUgZmlsdGVyLlxuICAgICAqIEBmdW5jdGlvbiBjb3VudERvY3VtZW50cyBcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZmlsdGVyIC0gVGhlIGZpbHRlciBmb3IgdGhlIGNvdW50LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gT3B0aW9uYWwgc2V0dGluZ3MgZm9yIHRoZSBjb21tYW5kLlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gTnVtYmVyIG9mIGRvY3VtZW50cyBtYXRjaGluZyB0aGUgZmlsdGVyLlxuICAgICAqL1xuICAgIGFzeW5jIGNvdW50RG9jdW1lbnRzKGZpbHRlciwgb3B0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMuY29sbGVjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29sbGVjdGlvbi5jb3VudERvY3VtZW50cyhmaWx0ZXIsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PTkdPREJfRVJST1IsIGUubWVzc2FnZSwgbnVsbCwgdHJ1ZSwgZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBJbnNlcnRzIGEgc2luZ2xlIGRvY3VtZW50IGludG8gYSBjb2xsZWN0aW9uLlxuICAgICAqIEBmdW5jdGlvbiBpbnNlcnRPbmUgXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRvYyAtIFRoZSBkb2N1bWVudCB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBPcHRpb25hbCBzZXR0aW5ncyBmb3IgdGhlIGNvbW1hbmQuXG4gICAgICovXG4gICAgYXN5bmMgaW5zZXJ0T25lKGRvYywgb3B0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMuY29sbGVjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29sbGVjdGlvbi5pbnNlcnRPbmUoZG9jLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT05HT0RCX0VSUk9SLCBlLm1lc3NhZ2UsIG51bGwsIHRydWUsIGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgSW5zZXJ0cyBhbiBhcnJheSBvZiBkb2N1bWVudHMgaW50byBhIGNvbGxlY3Rpb24uXG4gICAgICogQGZ1bmN0aW9uIGluc2VydE1hbnkgXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRvY3MgLSBUaGUgZG9jdW1lbnRzIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIE9wdGlvbmFsIHNldHRpbmdzIGZvciB0aGUgY29tbWFuZC5cbiAgICAgKi9cbiAgICBhc3luYyBpbnNlcnRNYW55KGRvY3MsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbGxlY3Rpb24uaW5zZXJ0TWFueShkb2NzLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT05HT0RCX0VSUk9SLCBlLm1lc3NhZ2UsIG51bGwsIHRydWUsIGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIGEgc2luZ2xlIGRvY3VtZW50IGluIGEgY29sbGVjdGlvbi5cbiAgICAgKiBAZnVuY3Rpb24gdXBkYXRlT25lIFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBmaWx0ZXIgLSBUaGUgZmlsdGVyIHVzZWQgdG8gc2VsZWN0IHRoZSBkb2N1bWVudCB0byByZXBsYWNlLlxuICAgICAqIEBwYXJhbSB7VXBkYXRlRmlsdGVyPFRTY2hlbWE+fERvY3VtZW50W119IHVwZGF0ZSAtIFRoZSBtb2RpZmljYXRpb25zIHRvIGFwcGx5LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gT3B0aW9uYWwgc2V0dGluZ3MgZm9yIHRoZSBjb21tYW5kLlxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZU9uZShmaWx0ZXIsIHVwZGF0ZSkge1xuICAgICAgICBpZiAoIXRoaXMuY29sbGVjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29sbGVjdGlvbi51cGRhdGVPbmUoZmlsdGVyLCB1cGRhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PTkdPREJfRVJST1IsIGUubWVzc2FnZSwgbnVsbCwgdHJ1ZSwgZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgbXVsdGlwbGUgZG9jdW1lbnRzIGluIGEgY29sbGVjdGlvbi5cbiAgICAgKiBAZnVuY3Rpb24gdXBkYXRlTWFueSBcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZmlsdGVyIC0gVGhlIGZpbHRlciB1c2VkIHRvIHNlbGVjdCB0aGUgZG9jdW1lbnQgdG8gdXBkYXRlLlxuICAgICAqIEBwYXJhbSB7VXBkYXRlRmlsdGVyPFRTY2hlbWE+fERvY3VtZW50W119IHVwZGF0ZSAtIFRoZSBtb2RpZmljYXRpb25zIHRvIGFwcGx5LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gT3B0aW9uYWwgc2V0dGluZ3MgZm9yIHRoZSBjb21tYW5kLlxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZU1hbnkoZmlsdGVyLCB1cGRhdGUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbGxlY3Rpb24udXBkYXRlTWFueShmaWx0ZXIsIHVwZGF0ZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9OR09EQl9FUlJPUiwgZS5tZXNzYWdlLCBudWxsLCB0cnVlLCBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IFJlcGxhY2UgYSBkb2N1bWVudCBpbiBhIGNvbGxlY3Rpb24gd2l0aCBhbm90aGVyIGRvY3VtZW50LlxuICAgICAqIEBmdW5jdGlvbiByZXBsYWNlT25lIFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBmaWx0ZXIgLSBUaGUgZmlsdGVyIHVzZWQgdG8gc2VsZWN0IHRoZSBkb2N1bWVudCB0byByZXBsYWNlLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkb2MgLSBUaGUgRG9jdW1lbnQgdGhhdCByZXBsYWNlcyB0aGUgbWF0Y2hpbmcgZG9jdW1lbnQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBPcHRpb25hbCBzZXR0aW5ncyBmb3IgdGhlIGNvbW1hbmQuXG4gICAgICovXG4gICAgYXN5bmMgcmVwbGFjZU9uZShmaWx0ZXIsIGRvYykge1xuICAgICAgICBpZiAoIXRoaXMuY29sbGVjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29sbGVjdGlvbi5yZXBsYWNlT25lKGZpbHRlciwgZG9jKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT05HT0RCX0VSUk9SLCBlLm1lc3NhZ2UsIG51bGwsIHRydWUsIGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgRGVsZXRlIGEgZG9jdW1lbnQgZnJvbSBhIGNvbGxlY3Rpb24uXG4gICAgICogQGZ1bmN0aW9uIGRlbGV0ZU9uZSBcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZmlsdGVyIC0gVGhlIGZpbHRlciB1c2VkIHRvIHNlbGVjdCB0aGUgZG9jdW1lbnQgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gT3B0aW9uYWwgc2V0dGluZ3MgZm9yIHRoZSBjb21tYW5kLlxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZU9uZShmaWx0ZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbGxlY3Rpb24uZGVsZXRlT25lKGZpbHRlcik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9OR09EQl9FUlJPUiwgZS5tZXNzYWdlLCBudWxsLCB0cnVlLCBlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBEZWxldGUgbXVsdGlwbGUgZG9jdW1lbnRzIGZyb20gYSBjb2xsZWN0aW9uLlxuICAgICAqIEBmdW5jdGlvbiBkZWxldGVNYW55IFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBmaWx0ZXIgLSBUaGUgZmlsdGVyIHVzZWQgdG8gc2VsZWN0IHRoZSBkb2N1bWVudHMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gT3B0aW9uYWwgc2V0dGluZ3MgZm9yIHRoZSBjb21tYW5kLlxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZU1hbnkoZmlsdGVyKSB7XG4gICAgICAgIGlmICghdGhpcy5jb2xsZWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb2xsZWN0aW9uLmRlbGV0ZU1hbnkoZmlsdGVyKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT05HT0RCX0VSUk9SLCBlLm1lc3NhZ2UsIG51bGwsIHRydWUsIGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgR2V0cyBtb2R1bGUgbmFtZVxuICAgICAqIEBmdW5jdGlvbiBuYW1lXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBDb25zdGFudCB2YWx1ZSBcInNoZWxsXCIuXG4gICAgICovXG4gICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiBNT0RVTEVfTkFNRTtcbiAgICB9XG59Il19
@@ -6,18 +6,18 @@ var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
6
6
 
7
7
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
8
 
9
- /*
10
- * Copyright (C) 2019-present CloudBeat Limited
11
- *
12
- * This program is free software: you can redistribute it and/or modify
13
- * it under the terms of the GNU General Public License as published by
14
- * the Free Software Foundation, either version 3 of the License, or
15
- * (at your option) any later version.
9
+ /*
10
+ * Copyright (C) 2019-present CloudBeat Limited
11
+ *
12
+ * This program is free software: you can redistribute it and/or modify
13
+ * it under the terms of the GNU General Public License as published by
14
+ * the Free Software Foundation, either version 3 of the License, or
15
+ * (at your option) any later version.
16
16
  */
17
17
 
18
- /**
19
- * @name pdf
20
- * @description Provides generic methods for working with PDF files.
18
+ /**
19
+ * @name pdf
20
+ * @description Provides generic methods for working with PDF files.
21
21
  */
22
22
  const errHelper = require('../errors/helper');
23
23
 
@@ -220,14 +220,14 @@ module.exports = function (options, context, rs, logger, modules, services) {
220
220
  module.isInitialized = function () {
221
221
  return true;
222
222
  };
223
- /**
224
- * @summary Asserts that text is present in a PDF file
225
- * @function assert
226
- * @param {String} pdfFilePath - Relative or absolute path to the PDF file.
227
- * @param {String} text - Text to assert.
228
- * @param {Number=} pageNum - Page number.
229
- * @param {String=} message - Message to throw if assertion fails.
230
- * @param {Boolean=} reverse - Check also reverse variant of string.
223
+ /**
224
+ * @summary Asserts that text is present in a PDF file
225
+ * @function assert
226
+ * @param {String} pdfFilePath - Relative or absolute path to the PDF file.
227
+ * @param {String} text - Text to assert.
228
+ * @param {Number=} pageNum - Page number.
229
+ * @param {String=} message - Message to throw if assertion fails.
230
+ * @param {Boolean=} reverse - Check also reverse variant of string.
231
231
  */
232
232
 
233
233
 
@@ -259,14 +259,14 @@ module.exports = function (options, context, rs, logger, modules, services) {
259
259
  throw error;
260
260
  }
261
261
  };
262
- /**
263
- * @summary Asserts that text is not present in a PDF file
264
- * @function assertNot
265
- * @param {String} pdfFilePath - Relative or absolute path to the pdf file.
266
- * @param {String} text - Text to assert.
267
- * @param {Number=} pageNum - Page number.
268
- * @param {String=} message - Message to throw if assertion fails.
269
- * @param {Boolean=} reverse - Check also reverse variant of string.
262
+ /**
263
+ * @summary Asserts that text is not present in a PDF file
264
+ * @function assertNot
265
+ * @param {String} pdfFilePath - Relative or absolute path to the pdf file.
266
+ * @param {String} text - Text to assert.
267
+ * @param {Number=} pageNum - Page number.
268
+ * @param {String=} message - Message to throw if assertion fails.
269
+ * @param {Boolean=} reverse - Check also reverse variant of string.
270
270
  */
271
271
 
272
272
 
@@ -298,14 +298,14 @@ module.exports = function (options, context, rs, logger, modules, services) {
298
298
  throw error;
299
299
  }
300
300
  };
301
- /**
302
- * @summary Count the number of times specified text is present in a PDF file.
303
- * @function count
304
- * @param {String} pdfFilePath - Relative or absolute path to the pdf file.
305
- * @param {String} text - Text to count.
306
- * @param {Number=} pageNum - Page number.
307
- * @param {Boolean=} reverse - Check also reverse variant of string.
308
- * @return {Number} Number of times the specified text was found.
301
+ /**
302
+ * @summary Count the number of times specified text is present in a PDF file.
303
+ * @function count
304
+ * @param {String} pdfFilePath - Relative or absolute path to the pdf file.
305
+ * @param {String} text - Text to count.
306
+ * @param {Number=} pageNum - Page number.
307
+ * @param {Boolean=} reverse - Check also reverse variant of string.
308
+ * @return {Number} Number of times the specified text was found.
309
309
  */
310
310
 
311
311
 
@@ -325,4 +325,4 @@ module.exports = function (options, context, rs, logger, modules, services) {
325
325
 
326
326
  return module;
327
327
  };
328
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1wZGYuanMiXSwibmFtZXMiOlsiZXJySGVscGVyIiwicmVxdWlyZSIsInBhdGgiLCJQREZQYXJzZXIiLCJjb3VudFJvd3MiLCJzZWFyY2hTdHIiLCJyb3dzIiwicmV2ZXJzZSIsInJlc3VsdCIsInN0clJlZ2V4IiwiUmVnRXhwIiwicmV2ZXJzZVN0clJlZ2V4Iiwic3BsaXQiLCJqb2luIiwiT2JqZWN0Iiwia2V5cyIsInNvcnQiLCJ5MSIsInkyIiwicGFyc2VGbG9hdCIsInNvbWUiLCJ5IiwibGluZSIsInJlcGxhY2UiLCJjb3VudCIsIm1hdGNoIiwibGVuZ3RoIiwiY2hlY2tSb3dzIiwiaW5sdWRlcyIsInJldmVyc2VTZWFyY2hTdHIiLCJpbmNsdWRlcyIsImFzc2VydGlvbiIsInBkZkZpbGVQYXRoIiwidGV4dCIsInBhZ2VOdW0iLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInBkZlBhcnNlciIsIm9uIiwiZXJyIiwiZXJyb3JNZXNzYWdlIiwicGFyc2VyRXJyb3IiLCJPeEVycm9yIiwiZXJyb3JDb2RlIiwiQVNTRVJUX0VSUk9SIiwicGRmRGF0YSIsInRvdGFsUGFnZXMiLCJmb3JtSW1hZ2UiLCJQYWdlcyIsIlNDUklQVF9FUlJPUiIsInByb2Nlc3NUZXh0IiwiVGV4dHMiLCJpc0ZvdW5kIiwicCIsImxvYWRQREYiLCJ0ZXh0cyIsInQiLCJpdGVtIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiUiIsIlQiLCJwdXNoIiwidG90YWxDb3VudCIsInZhbGlkYXRlU3RyaW5nIiwiYXJnIiwibmFtZSIsInRyaW0iLCJ2YWxpZGF0ZVBhZ2VOdW0iLCJ2YWxpZGF0ZU1lc3NhZ2UiLCJ2YWxpZGF0ZVJldmVyc2UiLCJyZXNvbHZlUGF0aCIsIm9wdGlvbnMiLCJtYXAiLCJpZHgiLCJjaGFyQ29kZUF0IiwicHJvY2VzcyIsImVudiIsIkhPTUUiLCJzbGljZSIsImN3ZCIsInJvb3RQYXRoIiwibW9kdWxlIiwiZXhwb3J0cyIsImNvbnRleHQiLCJycyIsImxvZ2dlciIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsImlzSW5pdGlhbGl6ZWQiLCJhc3NlcnQiLCJtZXNzYWdlIiwiZXJyb3IiLCJyZXQiLCJtc2ciLCJlIiwiYXNzZXJ0Tm90IiwiUERGX0VSUk9SIl0sIm1hcHBpbmdzIjoiOzs7O0FBY0E7Ozs7QUFkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0EsTUFBTUEsU0FBUyxHQUFHQyxPQUFPLENBQUMsa0JBQUQsQ0FBekI7O0FBQ0EsTUFBTUMsSUFBSSxHQUFHRCxPQUFPLENBQUMsTUFBRCxDQUFwQjs7QUFDQSxJQUFJRSxTQUFTLEdBQUdGLE9BQU8sQ0FBQyxvQkFBRCxDQUF2Qjs7QUFFQSxTQUFTRyxTQUFULENBQW1CQyxTQUFuQixFQUE4QkMsSUFBOUIsRUFBb0NDLE9BQXBDLEVBQTZDO0FBQ3pDLE1BQUlDLE1BQU0sR0FBRyxDQUFiO0FBQ0EsTUFBSUMsUUFBUSxHQUFHLElBQUlDLE1BQUosQ0FBV0wsU0FBWCxFQUFzQixHQUF0QixDQUFmO0FBQ0EsTUFBSU0sZUFBZSxHQUFHSixPQUFPLEdBQUcsSUFBSUcsTUFBSixDQUFXTCxTQUFTLENBQUNPLEtBQVYsQ0FBZ0IsRUFBaEIsRUFBb0JMLE9BQXBCLEdBQThCTSxJQUE5QixDQUFtQyxFQUFuQyxDQUFYLEVBQW1ELEdBQW5ELENBQUgsR0FBNkQsSUFBMUY7QUFFQUMsRUFBQUEsTUFBTSxDQUFDQyxJQUFQLENBQVlULElBQVosRUFBa0I7QUFBbEIsR0FDS1UsSUFETCxDQUNVLENBQUNDLEVBQUQsRUFBS0MsRUFBTCxLQUFZQyxVQUFVLENBQUNGLEVBQUQsQ0FBVixHQUFpQkUsVUFBVSxDQUFDRCxFQUFELENBRGpELEVBQ3VEO0FBRHZELEdBRUtFLElBRkwsQ0FFVUMsQ0FBQyxJQUFJO0FBQ1AsUUFBSUMsSUFBSSxHQUFHLENBQUNoQixJQUFJLENBQUNlLENBQUQsQ0FBSixJQUFXLEVBQVosRUFBZ0JS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QUEsTUFBTSxDQUFDMUQsS0FBUCxHQUFlLGdCQUFlUSxXQUFmLEVBQTRCQyxJQUE1QixFQUFrQ0MsT0FBTyxHQUFHLElBQTVDLEVBQWtEM0IsT0FBTyxHQUFHLEtBQTVELEVBQW1FO0FBQzlFeUQsSUFBQUEsY0FBYyxDQUFDaEMsV0FBRCxFQUFjLGFBQWQsQ0FBZDtBQUNBZ0MsSUFBQUEsY0FBYyxDQUFDL0IsSUFBRCxFQUFPLE1BQVAsQ0FBZDtBQUNBbUMsSUFBQUEsZUFBZSxDQUFDbEMsT0FBRCxFQUFVLFNBQVYsQ0FBZjtBQUNBb0MsSUFBQUEsZUFBZSxDQUFDL0QsT0FBRCxFQUFVLFNBQVYsQ0FBZjtBQUVBeUIsSUFBQUEsV0FBVyxHQUFHdUMsV0FBVyxDQUFDdkMsV0FBRCxFQUFjd0MsT0FBZCxDQUF6Qjs7QUFFQSxRQUFJO0FBQ0EsYUFBTyxNQUFNaEQsS0FBSyxDQUFDUSxXQUFELEVBQWNDLElBQWQsRUFBb0JDLE9BQXBCLEVBQTZCM0IsT0FBN0IsQ0FBbEI7QUFDSCxLQUZELENBR0EsT0FBT3dGLENBQVAsRUFBVTtBQUNOLFlBQU0sSUFBSXBELG9CQUFKLENBQVkzQyxTQUFTLENBQUM0QyxTQUFWLENBQW9CcUQsU0FBaEMsRUFBMkNGLENBQUMsQ0FBQ0osT0FBRixJQUFhSSxDQUF4RCxDQUFOO0FBQ0g7QUFDSixHQWREOztBQWdCQSxTQUFPYixNQUFQO0FBQ0gsQ0FqSEQiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZSBwZGZcclxuICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIGdlbmVyaWMgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIFBERiBmaWxlcy5cclxuICovXHJcblxyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5jb25zdCBlcnJIZWxwZXIgPSByZXF1aXJlKCcuLi9lcnJvcnMvaGVscGVyJyk7XHJcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XHJcbnZhciBQREZQYXJzZXIgPSByZXF1aXJlKCdwZGYyanNvbi9wZGZwYXJzZXInKTtcclxuXHJcbmZ1bmN0aW9uIGNvdW50Um93cyhzZWFyY2hTdHIsIHJvd3MsIHJldmVyc2UpIHtcclxuICAgIGxldCByZXN1bHQgPSAwO1xyXG4gICAgdmFyIHN0clJlZ2V4ID0gbmV3IFJlZ0V4cChzZWFyY2hTdHIsICdnJyk7XHJcbiAgICB2YXIgcmV2ZXJzZVN0clJlZ2V4ID0gcmV2ZXJzZSA/IG5ldyBSZWdFeHAoc2VhcmNoU3RyLnNwbGl0KCcnKS5yZXZlcnNlKCkuam9pbignJyksICdnJykgOiBudWxsO1xyXG5cclxuICAgIE9iamVjdC5rZXlzKHJvd3MpIC8vID0+IGFycmF5IG9mIHktcG9zaXRpb25zICh0eXBlOiBmbG9hdClcclxuICAgICAgICAuc29ydCgoeTEsIHkyKSA9PiBwYXJzZUZsb2F0KHkxKSAtIHBhcnNlRmxvYXQoeTIpKSAvLyBzb3J0IGZsb2F0IHBvc2l0aW9uc1xyXG4gICAgICAgIC5zb21lKHkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgbGluZSA9IChyb3dzW3ldIHx8IFtdKS5qb2luKCcnKS5yZXBsYWNlKC9cXHMvZywgJycpO1xyXG5cclxuICAgICAgICAgICAgdmFyIGNvdW50ID0gKGxpbmUubWF0Y2goc3RyUmVnZXgpIHx8IFtdKS5sZW5ndGg7XHJcbiAgICAgICAgICAgIGlmIChjb3VudCA9PT0gMCAmJiByZXZlcnNlU3RyUmVnZXgpIHtcclxuICAgICAgICAgICAgICAgIGNvdW50ID0gKGxpbmUubWF0Y2gocmV2ZXJzZVN0clJlZ2V4KSB8fCBbXSkubGVuZ3RoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc3VsdCArPSBjb3VudDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBjaGVja1Jvd3Moc2VhcmNoU3RyLCByb3dzLCByZXZlcnNlKSB7XHJcbiAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XHJcblxyXG4gICAgT2JqZWN0LmtleXMocm93cykgLy8gPT4gYXJyYXkgb2YgeS1wb3NpdGlvbnMgKHR5cGU6IGZsb2F0KVxyXG4gICAgICAgIC5zb3J0KCh5MSwgeTIpID0+IHBhcnNlRmxvYXQoeTEpIC0gcGFyc2VGbG9hdCh5MikpIC8vIHNvcnQgZmxvYXQgcG9zaXRpb25zXHJcbiAgICAgICAgLnNvbWUoeSA9PiB7XHJcblxyXG4gICAgICAgICAgICB2YXIgbGluZSA9IChyb3dzW3ldIHx8IFtdKS5qb2luKCcnKS5yZXBsYWNlKC9cXHMvZywgJycpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGlubHVkZXM7XHJcblxyXG4gICAgICAgICAgICBpZiAocmV2ZXJzZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmV2ZXJzZVNlYXJjaFN0ciA9IHNlYXJjaFN0ci5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpO1xyXG4gICAgICAgICAgICAgICAgaW5sdWRlcyA9IGxpbmUuaW5jbHVkZXMoc2VhcmNoU3RyKSB8fCBsaW5lLmluY2x1ZGVzKHJldmVyc2VTZWFyY2hTdHIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaW5sdWRlcyA9IGxpbmUuaW5jbHVkZXMoc2VhcmNoU3RyKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGlubHVkZXMpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFzc2VydGlvbihwZGZGaWxlUGF0aCwgdGV4dCwgcGFnZU51bSA9IDAsIHJldmVyc2UgPSBmYWxzZSkge1xyXG4gICAgbGV0IHJvd3MgPSB7fTsgLy8gaW5kZXhlZCBieSB5LXBvc2l0aW9uXHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGNvbnN0IHNlYXJjaFN0ciA9IHRleHQucmVwbGFjZSgvXFxzL2csICcnKTtcclxuXHJcbiAgICAgICAgbGV0IHBkZlBhcnNlciA9IG5ldyBQREZQYXJzZXIoKTtcclxuICAgICAgICBwZGZQYXJzZXIub24oJ3BkZlBhcnNlcl9kYXRhRXJyb3InLCBmdW5jdGlvbihlcnIpIHtcclxuICAgICAgICAgICAgbGV0IGVycm9yTWVzc2FnZSA9IGVyci5wYXJzZXJFcnJvciA/IGVyci5wYXJzZXJFcnJvciA6ICdFcnJvciBwYXJzaW5nIHRoZSBQREYuJztcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGVycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHBkZlBhcnNlci5vbigncGRmUGFyc2VyX2RhdGFSZWFkeScsIGZ1bmN0aW9uIChwZGZEYXRhKSB7XHJcbiAgICAgICAgICAgIHZhciB0b3RhbFBhZ2VzID0gcGRmRGF0YS5mb3JtSW1hZ2UuUGFnZXMubGVuZ3RoO1xyXG4gICAgICAgICAgICBpZiAocGFnZU51bSAmJiB0b3RhbFBhZ2VzIDwgcGFnZU51bSAtIDEpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBgSW52YWxpZCBhcmd1bWVudCAtICdwYWdlTnVtJyBpcyAke3BhZ2VOdW19LCBidXQgUERGIGNvbnRhaW5zIG9ubHkgJHt0b3RhbFBhZ2VzfSBwYWdlc2ApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBsb2NhdGUgb24gYSBzcGVjaWZpYyBwYWdlXHJcbiAgICAgICAgICAgIGlmIChwYWdlTnVtKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzVGV4dChyb3dzLCBwZGZEYXRhLmZvcm1JbWFnZS5QYWdlc1twYWdlTnVtLTFdLlRleHRzKTtcclxuICAgICAgICAgICAgICAgIGxldCBpc0ZvdW5kID0gY2hlY2tSb3dzKHNlYXJjaFN0ciwgcm93cywgcmV2ZXJzZSk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCEhaXNGb3VuZCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGxvY2F0ZSBvbiBhbnkgcGFnZVxyXG4gICAgICAgICAgICBmb3IgKGxldCBwIGluIHBkZkRhdGEuZm9ybUltYWdlLlBhZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzVGV4dChyb3dzLCBwZGZEYXRhLmZvcm1JbWFnZS5QYWdlc1twXS5UZXh0cyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXNGb3VuZCA9IGNoZWNrUm93cyhzZWFyY2hTdHIsIHJvd3MsIHJldmVyc2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzRm91bmQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcm93cyA9IHt9OyAvLyBjbGVhciByb3dzIGZvciBuZXh0IHBhZ2VcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcGRmUGFyc2VyLmxvYWRQREYocGRmRmlsZVBhdGgsIDApO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHByb2Nlc3NUZXh0KHJvd3MsIHRleHRzKSB7XHJcbiAgICBmb3IgKHZhciB0IGluIHRleHRzKSB7XHJcbiAgICAgICAgdmFyIGl0ZW0gPSB0ZXh0c1t0XTtcclxuICAgICAgICB2YXIgdGV4dCA9IGRlY29kZVVSSUNvbXBvbmVudChpdGVtLlJbMF0uVCk7XHJcbiAgICAgICAgLy8gYWNjdW11bGF0ZSB0ZXh0IGl0ZW1zIGludG8gcm93cyBvYmplY3QsIHBlciBsaW5lXHJcbiAgICAgICAgKHJvd3NbaXRlbS55XSA9IHJvd3NbaXRlbS55XSB8fCBbXSkucHVzaCh0ZXh0KTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gY291bnQocGRmRmlsZVBhdGgsIHRleHQsIHBhZ2VOdW0gPSAwLCByZXZlcnNlID0gZmFsc2UpIHtcclxuICAgIGxldCByb3dzID0ge307IC8vIGluZGV4ZWQgYnkgeS1wb3NpdGlvblxyXG4gICAgbGV0IHRvdGFsQ291bnQgPSAwO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBjb25zdCBzZWFyY2hTdHIgPSB0ZXh0LnJlcGxhY2UoL1xccy9nLCAnJyk7XHJcblxyXG4gICAgICAgIGxldCBwZGZQYXJzZXIgPSBuZXcgUERGUGFyc2VyKCk7XHJcbiAgICAgICAgcGRmUGFyc2VyLm9uKCdwZGZQYXJzZXJfZGF0YUVycm9yJywgZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBlcnIucGFyc2VyRXJyb3IgPyBlcnIucGFyc2VyRXJyb3IgOiAnRXJyb3IgcGFyc2luZyB0aGUgUERGLic7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBlcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBwZGZQYXJzZXIub24oJ3BkZlBhcnNlcl9kYXRhUmVhZHknLCBmdW5jdGlvbiAocGRmRGF0YSkge1xyXG4gICAgICAgICAgICBsZXQgdG90YWxQYWdlcyA9IHBkZkRhdGEuZm9ybUltYWdlLlBhZ2VzLmxlbmd0aDtcclxuICAgICAgICAgICAgaWYgKHBhZ2VOdW0gJiYgdG90YWxQYWdlcyA8IHBhZ2VOdW0gLSAxKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgYEludmFsaWQgYXJndW1lbnQgLSAncGFnZU51bScgaXMgJHtwYWdlTnVtfSwgYnV0IFBERiBjb250YWlucyBvbmx5ICR7dG90YWxQYWdlc30gcGFnZXNgKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gY291bnQgb24gYSBzcGVjaWZpYyBwYWdlXHJcbiAgICAgICAgICAgIGlmIChwYWdlTnVtKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzVGV4dChyb3dzLCBwZGZEYXRhLmZvcm1JbWFnZS5QYWdlc1twYWdlTnVtLTFdLlRleHRzKTtcclxuICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IGNvdW50Um93cyhzZWFyY2hTdHIsIHJvd3MsIHJldmVyc2UpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShjb3VudCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGNvdW50IG9uIGFsbCBwYWdlc1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHBkZkRhdGEuZm9ybUltYWdlLlBhZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzVGV4dChyb3dzLCBwZGZEYXRhLmZvcm1JbWFnZS5QYWdlc1twXS5UZXh0cyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgY291bnQgPSBjb3VudFJvd3Moc2VhcmNoU3RyLCByb3dzLCByZXZlcnNlKTtcclxuICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbENvdW50ICs9IGNvdW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcm93cyA9IHt9OyAvLyBjbGVhciByb3dzIGZvciBuZXh0IHBhZ2VcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmVzb2x2ZSh0b3RhbENvdW50KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBwZGZQYXJzZXIubG9hZFBERihwZGZGaWxlUGF0aCwgMCk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmcoYXJnLCBuYW1lKSB7XHJcbiAgICBpZiAoYXJnICYmIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnICYmIGFyZy50cmltKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIC8vIHRleHQgaXMgY29ycmVjdFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBub24tZW1wdHkgc3RyaW5nLlwiKTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdmFsaWRhdGVQYWdlTnVtKGFyZywgbmFtZSkge1xyXG4gICAgaWYgKGFyZyA9PT0gbnVsbCB8fCAoYXJnICYmIHR5cGVvZiBhcmcgPT09ICdudW1iZXInICYmIGFyZyA+IDApKSB7XHJcbiAgICAgICAgLy8gcGFnZU51bSBpcyBjb3JyZWN0XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBcIkludmFsaWQgYXJndW1lbnQgLSAnXCIgKyBuYW1lICsgXCInIHNob3VsZCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuXCIpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB2YWxpZGF0ZU1lc3NhZ2UoYXJnLCBuYW1lKSB7XHJcbiAgICBpZiAoYXJnID09PSBudWxsIHx8IChhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgJiYgYXJnLnRyaW0oKS5sZW5ndGggPiAwKSkge1xyXG4gICAgICAgIC8vIHBhZ2VOdW0gaXMgY29ycmVjdFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBub24tZW1wdHkgc3RyaW5nLlwiKTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdmFsaWRhdGVSZXZlcnNlKGFyZywgbmFtZSkge1xyXG4gICAgaWYgKGFyZyA9PT0gbnVsbCB8fCAodHlwZW9mIGFyZyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nKSkge1xyXG4gICAgICAgIC8vIHBhZ2VOdW0gaXMgY29ycmVjdFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBib29sZWFuXCIpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiByZXNvbHZlUGF0aChwZGZGaWxlUGF0aCwgb3B0aW9ucykge1xyXG5cclxuICAgIHBkZkZpbGVQYXRoID0gcGRmRmlsZVBhdGgudHJpbSgpLnNwbGl0KCcnKS5tYXAoKGl0ZW0sIGlkeCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAhWzgyMDYsIDgyOTZdLmluY2x1ZGVzKHBkZkZpbGVQYXRoLmNoYXJDb2RlQXQoaWR4KSkgPyBpdGVtIDogbnVsbDtcclxuICAgIH0pLmpvaW4oJycpO1xyXG5cclxuICAgIGlmIChwZGZGaWxlUGF0aFswXSA9PT0gJ34nKSB7XHJcbiAgICAgICAgLy8gcmVzb2x2ZSBwYXRoIHJlbGF0aXZlIHRvIGhvbWUgZGlyZWN0b3J5XHJcbiAgICAgICAgcmV0dXJuIHBhdGguam9pbihwcm9jZXNzLmVudi5IT01FLCBwZGZGaWxlUGF0aC5zbGljZSgxKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xyXG5cclxuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmN3ZCkge1xyXG4gICAgICAgICAgICBjd2QgPSBvcHRpb25zLmN3ZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMucm9vdFBhdGgpIHtcclxuICAgICAgICAgICAgY3dkID0gb3B0aW9ucy5yb290UGF0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGN3ZCA9IGN3ZC50cmltKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBwYXRoLnJlc29sdmUoY3dkLCBwZGZGaWxlUGF0aCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpIHtcclxuXHJcbiAgICBtb2R1bGUuaXNJbml0aWFsaXplZCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydHMgdGhhdCB0ZXh0IGlzIHByZXNlbnQgaW4gYSBQREYgZmlsZVxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBkZkZpbGVQYXRoIC0gUmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aCB0byB0aGUgUERGIGZpbGUuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCAtIFRleHQgdG8gYXNzZXJ0LlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSBwYWdlTnVtIC0gUGFnZSBudW1iZXIuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IG1lc3NhZ2UgLSBNZXNzYWdlIHRvIHRocm93IGlmIGFzc2VydGlvbiBmYWlscy5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbj19IHJldmVyc2UgLSBDaGVjayBhbHNvIHJldmVyc2UgdmFyaWFudCBvZiBzdHJpbmcuXHJcbiAgICAgKi9cclxuICAgIG1vZHVsZS5hc3NlcnQgPSBhc3luYyBmdW5jdGlvbihwZGZGaWxlUGF0aCwgdGV4dCwgcGFnZU51bSA9IG51bGwsIG1lc3NhZ2UgPSBudWxsLCByZXZlcnNlID0gZmFsc2UpIHtcclxuICAgICAgICB2YWxpZGF0ZVN0cmluZyhwZGZGaWxlUGF0aCwgJ3BkZkZpbGVQYXRoJyk7XHJcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcodGV4dCwgJ3RleHQnKTtcclxuICAgICAgICB2YWxpZGF0ZVBhZ2VOdW0ocGFnZU51bSwgJ3BhZ2VOdW0nKTtcclxuICAgICAgICB2YWxpZGF0ZU1lc3NhZ2UobWVzc2FnZSwgJ21lc3NhZ2UnKTtcclxuICAgICAgICB2YWxpZGF0ZVJldmVyc2UocmV2ZXJzZSwgJ3JldmVyc2UnKTtcclxuXHJcbiAgICAgICAgcGRmRmlsZVBhdGggPSByZXNvbHZlUGF0aChwZGZGaWxlUGF0aCwgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIGxldCBlcnJvcjtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXQgPSBhd2FpdCBhc3NlcnRpb24ocGRmRmlsZVBhdGgsIHRleHQsIHBhZ2VOdW0sIHJldmVyc2UpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFyZXQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBtc2cgPSBgXCIke3RleHR9XCIgaXMgbm90IGZvdW5kIGluIHRoZSBQREYgJHtwYWdlTnVtID8gJ29uIHBhZ2UgJyArIHBhZ2VOdW0gOiAnJ31gO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIG1zZyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBlcnJvciA9IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0cyB0aGF0IHRleHQgaXMgbm90IHByZXNlbnQgaW4gYSBQREYgZmlsZVxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydE5vdFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBkZkZpbGVQYXRoIC0gUmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aCB0byB0aGUgcGRmIGZpbGUuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCAtIFRleHQgdG8gYXNzZXJ0LlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSBwYWdlTnVtIC0gUGFnZSBudW1iZXIuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IG1lc3NhZ2UgLSBNZXNzYWdlIHRvIHRocm93IGlmIGFzc2VydGlvbiBmYWlscy5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbj19IHJldmVyc2UgLSBDaGVjayBhbHNvIHJldmVyc2UgdmFyaWFudCBvZiBzdHJpbmcuXHJcbiAgICAgKi9cclxuICAgIG1vZHVsZS5hc3NlcnROb3QgPSBhc3luYyBmdW5jdGlvbihwZGZGaWxlUGF0aCwgdGV4dCwgcGFnZU51bSA9IG51bGwsIG1lc3NhZ2UgPSBudWxsLCByZXZlcnNlID0gZmFsc2UpIHtcclxuICAgICAgICB2YWxpZGF0ZVN0cmluZyhwZGZGaWxlUGF0aCwgJ3BkZkZpbGVQYXRoJyk7XHJcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcodGV4dCwgJ3RleHQnKTtcclxuICAgICAgICB2YWxpZGF0ZVBhZ2VOdW0ocGFnZU51bSwgJ3BhZ2VOdW0nKTtcclxuICAgICAgICB2YWxpZGF0ZU1lc3NhZ2UobWVzc2FnZSwgJ21lc3NhZ2UnKTtcclxuICAgICAgICB2YWxpZGF0ZVJldmVyc2UocmV2ZXJzZSwgJ3JldmVyc2UnKTtcclxuXHJcbiAgICAgICAgcGRmRmlsZVBhdGggPSByZXNvbHZlUGF0aChwZGZGaWxlUGF0aCwgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIGxldCBlcnJvcjtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXQgPSBhd2FpdCBhc3NlcnRpb24ocGRmRmlsZVBhdGgsIHRleHQsIHBhZ2VOdW0sIHJldmVyc2UpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJldCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgbWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IG1zZyA9IGBcIiR7dGV4dH1cIiBpcyBmb3VuZCBpbiB0aGUgUERGICR7cGFnZU51bSA/ICdvbiBwYWdlICcgKyBwYWdlTnVtIDogJyd9YDtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBtc2cpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBDb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIHNwZWNpZmllZCB0ZXh0IGlzIHByZXNlbnQgaW4gYSBQREYgZmlsZS5cclxuICAgICAqIEBmdW5jdGlvbiBjb3VudFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBkZkZpbGVQYXRoIC0gUmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aCB0byB0aGUgcGRmIGZpbGUuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCAtIFRleHQgdG8gY291bnQuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHBhZ2VOdW0gLSBQYWdlIG51bWJlci5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbj19IHJldmVyc2UgLSBDaGVjayBhbHNvIHJldmVyc2UgdmFyaWFudCBvZiBzdHJpbmcuXHJcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IE51bWJlciBvZiB0aW1lcyB0aGUgc3BlY2lmaWVkIHRleHQgd2FzIGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBtb2R1bGUuY291bnQgPSBhc3luYyBmdW5jdGlvbihwZGZGaWxlUGF0aCwgdGV4dCwgcGFnZU51bSA9IG51bGwsIHJldmVyc2UgPSBmYWxzZSkge1xyXG4gICAgICAgIHZhbGlkYXRlU3RyaW5nKHBkZkZpbGVQYXRoLCAncGRmRmlsZVBhdGgnKTtcclxuICAgICAgICB2YWxpZGF0ZVN0cmluZyh0ZXh0LCAndGV4dCcpO1xyXG4gICAgICAgIHZhbGlkYXRlUGFnZU51bShwYWdlTnVtLCAncGFnZU51bScpO1xyXG4gICAgICAgIHZhbGlkYXRlUmV2ZXJzZShyZXZlcnNlLCAncmV2ZXJzZScpO1xyXG5cclxuICAgICAgICBwZGZGaWxlUGF0aCA9IHJlc29sdmVQYXRoKHBkZkZpbGVQYXRoLCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNvdW50KHBkZkZpbGVQYXRoLCB0ZXh0LCBwYWdlTnVtLCByZXZlcnNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5QREZfRVJST1IsIGUubWVzc2FnZSB8fCBlKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBtb2R1bGU7XHJcbn07XHJcbiJdfQ==
328
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1wZGYuanMiXSwibmFtZXMiOlsiZXJySGVscGVyIiwicmVxdWlyZSIsInBhdGgiLCJQREZQYXJzZXIiLCJjb3VudFJvd3MiLCJzZWFyY2hTdHIiLCJyb3dzIiwicmV2ZXJzZSIsInJlc3VsdCIsInN0clJlZ2V4IiwiUmVnRXhwIiwicmV2ZXJzZVN0clJlZ2V4Iiwic3BsaXQiLCJqb2luIiwiT2JqZWN0Iiwia2V5cyIsInNvcnQiLCJ5MSIsInkyIiwicGFyc2VGbG9hdCIsInNvbWUiLCJ5IiwibGluZSIsInJlcGxhY2UiLCJjb3VudCIsIm1hdGNoIiwibGVuZ3RoIiwiY2hlY2tSb3dzIiwiaW5sdWRlcyIsInJldmVyc2VTZWFyY2hTdHIiLCJpbmNsdWRlcyIsImFzc2VydGlvbiIsInBkZkZpbGVQYXRoIiwidGV4dCIsInBhZ2VOdW0iLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInBkZlBhcnNlciIsIm9uIiwiZXJyIiwiZXJyb3JNZXNzYWdlIiwicGFyc2VyRXJyb3IiLCJPeEVycm9yIiwiZXJyb3JDb2RlIiwiQVNTRVJUX0VSUk9SIiwicGRmRGF0YSIsInRvdGFsUGFnZXMiLCJmb3JtSW1hZ2UiLCJQYWdlcyIsIlNDUklQVF9FUlJPUiIsInByb2Nlc3NUZXh0IiwiVGV4dHMiLCJpc0ZvdW5kIiwicCIsImxvYWRQREYiLCJ0ZXh0cyIsInQiLCJpdGVtIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiUiIsIlQiLCJwdXNoIiwidG90YWxDb3VudCIsInZhbGlkYXRlU3RyaW5nIiwiYXJnIiwibmFtZSIsInRyaW0iLCJ2YWxpZGF0ZVBhZ2VOdW0iLCJ2YWxpZGF0ZU1lc3NhZ2UiLCJ2YWxpZGF0ZVJldmVyc2UiLCJyZXNvbHZlUGF0aCIsIm9wdGlvbnMiLCJtYXAiLCJpZHgiLCJjaGFyQ29kZUF0IiwicHJvY2VzcyIsImVudiIsIkhPTUUiLCJzbGljZSIsImN3ZCIsInJvb3RQYXRoIiwibW9kdWxlIiwiZXhwb3J0cyIsImNvbnRleHQiLCJycyIsImxvZ2dlciIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsImlzSW5pdGlhbGl6ZWQiLCJhc3NlcnQiLCJtZXNzYWdlIiwiZXJyb3IiLCJyZXQiLCJtc2ciLCJlIiwiYXNzZXJ0Tm90IiwiUERGX0VSUk9SIl0sIm1hcHBpbmdzIjoiOzs7O0FBY0E7Ozs7QUFkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0EsTUFBTUEsU0FBUyxHQUFHQyxPQUFPLENBQUMsa0JBQUQsQ0FBekI7O0FBQ0EsTUFBTUMsSUFBSSxHQUFHRCxPQUFPLENBQUMsTUFBRCxDQUFwQjs7QUFDQSxJQUFJRSxTQUFTLEdBQUdGLE9BQU8sQ0FBQyxvQkFBRCxDQUF2Qjs7QUFFQSxTQUFTRyxTQUFULENBQW1CQyxTQUFuQixFQUE4QkMsSUFBOUIsRUFBb0NDLE9BQXBDLEVBQTZDO0FBQ3pDLE1BQUlDLE1BQU0sR0FBRyxDQUFiO0FBQ0EsTUFBSUMsUUFBUSxHQUFHLElBQUlDLE1BQUosQ0FBV0wsU0FBWCxFQUFzQixHQUF0QixDQUFmO0FBQ0EsTUFBSU0sZUFBZSxHQUFHSixPQUFPLEdBQUcsSUFBSUcsTUFBSixDQUFXTCxTQUFTLENBQUNPLEtBQVYsQ0FBZ0IsRUFBaEIsRUFBb0JMLE9BQXBCLEdBQThCTSxJQUE5QixDQUFtQyxFQUFuQyxDQUFYLEVBQW1ELEdBQW5ELENBQUgsR0FBNkQsSUFBMUY7QUFFQUMsRUFBQUEsTUFBTSxDQUFDQyxJQUFQLENBQVlULElBQVosRUFBa0I7QUFBbEIsR0FDS1UsSUFETCxDQUNVLENBQUNDLEVBQUQsRUFBS0MsRUFBTCxLQUFZQyxVQUFVLENBQUNGLEVBQUQsQ0FBVixHQUFpQkUsVUFBVSxDQUFDRCxFQUFELENBRGpELEVBQ3VEO0FBRHZELEdBRUtFLElBRkwsQ0FFVUMsQ0FBQyxJQUFJO0FBQ1AsUUFBSUMsSUFBSSxHQUFHLENBQUNoQixJQUFJLENBQUNlLENBQUQsQ0FBSixJQUFXLEVBQVosRUFBZ0JS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QUEsTUFBTSxDQUFDMUQsS0FBUCxHQUFlLGdCQUFlUSxXQUFmLEVBQTRCQyxJQUE1QixFQUFrQ0MsT0FBTyxHQUFHLElBQTVDLEVBQWtEM0IsT0FBTyxHQUFHLEtBQTVELEVBQW1FO0FBQzlFeUQsSUFBQUEsY0FBYyxDQUFDaEMsV0FBRCxFQUFjLGFBQWQsQ0FBZDtBQUNBZ0MsSUFBQUEsY0FBYyxDQUFDL0IsSUFBRCxFQUFPLE1BQVAsQ0FBZDtBQUNBbUMsSUFBQUEsZUFBZSxDQUFDbEMsT0FBRCxFQUFVLFNBQVYsQ0FBZjtBQUNBb0MsSUFBQUEsZUFBZSxDQUFDL0QsT0FBRCxFQUFVLFNBQVYsQ0FBZjtBQUVBeUIsSUFBQUEsV0FBVyxHQUFHdUMsV0FBVyxDQUFDdkMsV0FBRCxFQUFjd0MsT0FBZCxDQUF6Qjs7QUFFQSxRQUFJO0FBQ0EsYUFBTyxNQUFNaEQsS0FBSyxDQUFDUSxXQUFELEVBQWNDLElBQWQsRUFBb0JDLE9BQXBCLEVBQTZCM0IsT0FBN0IsQ0FBbEI7QUFDSCxLQUZELENBR0EsT0FBT3dGLENBQVAsRUFBVTtBQUNOLFlBQU0sSUFBSXBELG9CQUFKLENBQVkzQyxTQUFTLENBQUM0QyxTQUFWLENBQW9CcUQsU0FBaEMsRUFBMkNGLENBQUMsQ0FBQ0osT0FBRixJQUFhSSxDQUF4RCxDQUFOO0FBQ0g7QUFDSixHQWREOztBQWdCQSxTQUFPYixNQUFQO0FBQ0gsQ0FqSEQiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICovXG5cbi8qKlxuICogQG5hbWUgcGRmXG4gKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgZ2VuZXJpYyBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggUERGIGZpbGVzLlxuICovXG5cbmltcG9ydCBPeEVycm9yIGZyb20gJy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XG5jb25zdCBlcnJIZWxwZXIgPSByZXF1aXJlKCcuLi9lcnJvcnMvaGVscGVyJyk7XG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIFBERlBhcnNlciA9IHJlcXVpcmUoJ3BkZjJqc29uL3BkZnBhcnNlcicpO1xuXG5mdW5jdGlvbiBjb3VudFJvd3Moc2VhcmNoU3RyLCByb3dzLCByZXZlcnNlKSB7XG4gICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgdmFyIHN0clJlZ2V4ID0gbmV3IFJlZ0V4cChzZWFyY2hTdHIsICdnJyk7XG4gICAgdmFyIHJldmVyc2VTdHJSZWdleCA9IHJldmVyc2UgPyBuZXcgUmVnRXhwKHNlYXJjaFN0ci5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpLCAnZycpIDogbnVsbDtcblxuICAgIE9iamVjdC5rZXlzKHJvd3MpIC8vID0+IGFycmF5IG9mIHktcG9zaXRpb25zICh0eXBlOiBmbG9hdClcbiAgICAgICAgLnNvcnQoKHkxLCB5MikgPT4gcGFyc2VGbG9hdCh5MSkgLSBwYXJzZUZsb2F0KHkyKSkgLy8gc29ydCBmbG9hdCBwb3NpdGlvbnNcbiAgICAgICAgLnNvbWUoeSA9PiB7XG4gICAgICAgICAgICB2YXIgbGluZSA9IChyb3dzW3ldIHx8IFtdKS5qb2luKCcnKS5yZXBsYWNlKC9cXHMvZywgJycpO1xuXG4gICAgICAgICAgICB2YXIgY291bnQgPSAobGluZS5tYXRjaChzdHJSZWdleCkgfHwgW10pLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChjb3VudCA9PT0gMCAmJiByZXZlcnNlU3RyUmVnZXgpIHtcbiAgICAgICAgICAgICAgICBjb3VudCA9IChsaW5lLm1hdGNoKHJldmVyc2VTdHJSZWdleCkgfHwgW10pLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCArPSBjb3VudDtcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjaGVja1Jvd3Moc2VhcmNoU3RyLCByb3dzLCByZXZlcnNlKSB7XG4gICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuXG4gICAgT2JqZWN0LmtleXMocm93cykgLy8gPT4gYXJyYXkgb2YgeS1wb3NpdGlvbnMgKHR5cGU6IGZsb2F0KVxuICAgICAgICAuc29ydCgoeTEsIHkyKSA9PiBwYXJzZUZsb2F0KHkxKSAtIHBhcnNlRmxvYXQoeTIpKSAvLyBzb3J0IGZsb2F0IHBvc2l0aW9uc1xuICAgICAgICAuc29tZSh5ID0+IHtcblxuICAgICAgICAgICAgdmFyIGxpbmUgPSAocm93c1t5XSB8fCBbXSkuam9pbignJykucmVwbGFjZSgvXFxzL2csICcnKTtcblxuICAgICAgICAgICAgbGV0IGlubHVkZXM7XG5cbiAgICAgICAgICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV2ZXJzZVNlYXJjaFN0ciA9IHNlYXJjaFN0ci5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpO1xuICAgICAgICAgICAgICAgIGlubHVkZXMgPSBsaW5lLmluY2x1ZGVzKHNlYXJjaFN0cikgfHwgbGluZS5pbmNsdWRlcyhyZXZlcnNlU2VhcmNoU3RyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5sdWRlcyA9IGxpbmUuaW5jbHVkZXMoc2VhcmNoU3RyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlubHVkZXMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGFzc2VydGlvbihwZGZGaWxlUGF0aCwgdGV4dCwgcGFnZU51bSA9IDAsIHJldmVyc2UgPSBmYWxzZSkge1xuICAgIGxldCByb3dzID0ge307IC8vIGluZGV4ZWQgYnkgeS1wb3NpdGlvblxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBjb25zdCBzZWFyY2hTdHIgPSB0ZXh0LnJlcGxhY2UoL1xccy9nLCAnJyk7XG5cbiAgICAgICAgbGV0IHBkZlBhcnNlciA9IG5ldyBQREZQYXJzZXIoKTtcbiAgICAgICAgcGRmUGFyc2VyLm9uKCdwZGZQYXJzZXJfZGF0YUVycm9yJywgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gZXJyLnBhcnNlckVycm9yID8gZXJyLnBhcnNlckVycm9yIDogJ0Vycm9yIHBhcnNpbmcgdGhlIFBERi4nO1xuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGVycm9yTWVzc2FnZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHBkZlBhcnNlci5vbigncGRmUGFyc2VyX2RhdGFSZWFkeScsIGZ1bmN0aW9uIChwZGZEYXRhKSB7XG4gICAgICAgICAgICB2YXIgdG90YWxQYWdlcyA9IHBkZkRhdGEuZm9ybUltYWdlLlBhZ2VzLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChwYWdlTnVtICYmIHRvdGFsUGFnZXMgPCBwYWdlTnVtIC0gMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBgSW52YWxpZCBhcmd1bWVudCAtICdwYWdlTnVtJyBpcyAke3BhZ2VOdW19LCBidXQgUERGIGNvbnRhaW5zIG9ubHkgJHt0b3RhbFBhZ2VzfSBwYWdlc2ApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBsb2NhdGUgb24gYSBzcGVjaWZpYyBwYWdlXG4gICAgICAgICAgICBpZiAocGFnZU51bSkge1xuICAgICAgICAgICAgICAgIHByb2Nlc3NUZXh0KHJvd3MsIHBkZkRhdGEuZm9ybUltYWdlLlBhZ2VzW3BhZ2VOdW0tMV0uVGV4dHMpO1xuICAgICAgICAgICAgICAgIGxldCBpc0ZvdW5kID0gY2hlY2tSb3dzKHNlYXJjaFN0ciwgcm93cywgcmV2ZXJzZSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSghIWlzRm91bmQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbG9jYXRlIG9uIGFueSBwYWdlXG4gICAgICAgICAgICBmb3IgKGxldCBwIGluIHBkZkRhdGEuZm9ybUltYWdlLlBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc1RleHQocm93cywgcGRmRGF0YS5mb3JtSW1hZ2UuUGFnZXNbcF0uVGV4dHMpO1xuICAgICAgICAgICAgICAgIGxldCBpc0ZvdW5kID0gY2hlY2tSb3dzKHNlYXJjaFN0ciwgcm93cywgcmV2ZXJzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzRm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJvd3MgPSB7fTsgLy8gY2xlYXIgcm93cyBmb3IgbmV4dCBwYWdlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgcGRmUGFyc2VyLmxvYWRQREYocGRmRmlsZVBhdGgsIDApO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzVGV4dChyb3dzLCB0ZXh0cykge1xuICAgIGZvciAodmFyIHQgaW4gdGV4dHMpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSB0ZXh0c1t0XTtcbiAgICAgICAgdmFyIHRleHQgPSBkZWNvZGVVUklDb21wb25lbnQoaXRlbS5SWzBdLlQpO1xuICAgICAgICAvLyBhY2N1bXVsYXRlIHRleHQgaXRlbXMgaW50byByb3dzIG9iamVjdCwgcGVyIGxpbmVcbiAgICAgICAgKHJvd3NbaXRlbS55XSA9IHJvd3NbaXRlbS55XSB8fCBbXSkucHVzaCh0ZXh0KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvdW50KHBkZkZpbGVQYXRoLCB0ZXh0LCBwYWdlTnVtID0gMCwgcmV2ZXJzZSA9IGZhbHNlKSB7XG4gICAgbGV0IHJvd3MgPSB7fTsgLy8gaW5kZXhlZCBieSB5LXBvc2l0aW9uXG4gICAgbGV0IHRvdGFsQ291bnQgPSAwO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBjb25zdCBzZWFyY2hTdHIgPSB0ZXh0LnJlcGxhY2UoL1xccy9nLCAnJyk7XG5cbiAgICAgICAgbGV0IHBkZlBhcnNlciA9IG5ldyBQREZQYXJzZXIoKTtcbiAgICAgICAgcGRmUGFyc2VyLm9uKCdwZGZQYXJzZXJfZGF0YUVycm9yJywgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gZXJyLnBhcnNlckVycm9yID8gZXJyLnBhcnNlckVycm9yIDogJ0Vycm9yIHBhcnNpbmcgdGhlIFBERi4nO1xuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGVycm9yTWVzc2FnZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHBkZlBhcnNlci5vbigncGRmUGFyc2VyX2RhdGFSZWFkeScsIGZ1bmN0aW9uIChwZGZEYXRhKSB7XG4gICAgICAgICAgICBsZXQgdG90YWxQYWdlcyA9IHBkZkRhdGEuZm9ybUltYWdlLlBhZ2VzLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChwYWdlTnVtICYmIHRvdGFsUGFnZXMgPCBwYWdlTnVtIC0gMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBgSW52YWxpZCBhcmd1bWVudCAtICdwYWdlTnVtJyBpcyAke3BhZ2VOdW19LCBidXQgUERGIGNvbnRhaW5zIG9ubHkgJHt0b3RhbFBhZ2VzfSBwYWdlc2ApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjb3VudCBvbiBhIHNwZWNpZmljIHBhZ2VcbiAgICAgICAgICAgIGlmIChwYWdlTnVtKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc1RleHQocm93cywgcGRmRGF0YS5mb3JtSW1hZ2UuUGFnZXNbcGFnZU51bS0xXS5UZXh0cyk7XG4gICAgICAgICAgICAgICAgbGV0IGNvdW50ID0gY291bnRSb3dzKHNlYXJjaFN0ciwgcm93cywgcmV2ZXJzZSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShjb3VudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjb3VudCBvbiBhbGwgcGFnZXNcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcGRmRGF0YS5mb3JtSW1hZ2UuUGFnZXMpIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzVGV4dChyb3dzLCBwZGZEYXRhLmZvcm1JbWFnZS5QYWdlc1twXS5UZXh0cyk7XG4gICAgICAgICAgICAgICAgbGV0IGNvdW50ID0gY291bnRSb3dzKHNlYXJjaFN0ciwgcm93cywgcmV2ZXJzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0b3RhbENvdW50ICs9IGNvdW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByb3dzID0ge307IC8vIGNsZWFyIHJvd3MgZm9yIG5leHQgcGFnZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKHRvdGFsQ291bnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgcGRmUGFyc2VyLmxvYWRQREYocGRmRmlsZVBhdGgsIDApO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN0cmluZyhhcmcsIG5hbWUpIHtcbiAgICBpZiAoYXJnICYmIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnICYmIGFyZy50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyB0ZXh0IGlzIGNvcnJlY3RcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBub24tZW1wdHkgc3RyaW5nLlwiKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUGFnZU51bShhcmcsIG5hbWUpIHtcbiAgICBpZiAoYXJnID09PSBudWxsIHx8IChhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgJiYgYXJnID4gMCkpIHtcbiAgICAgICAgLy8gcGFnZU51bSBpcyBjb3JyZWN0XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIFwiSW52YWxpZCBhcmd1bWVudCAtICdcIiArIG5hbWUgKyBcIicgc2hvdWxkIGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci5cIik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU1lc3NhZ2UoYXJnLCBuYW1lKSB7XG4gICAgaWYgKGFyZyA9PT0gbnVsbCB8fCAoYXJnICYmIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnICYmIGFyZy50cmltKCkubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgLy8gcGFnZU51bSBpcyBjb3JyZWN0XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIFwiSW52YWxpZCBhcmd1bWVudCAtICdcIiArIG5hbWUgKyBcIicgc2hvdWxkIGJlIGEgbm9uLWVtcHR5IHN0cmluZy5cIik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVJldmVyc2UoYXJnLCBuYW1lKSB7XG4gICAgaWYgKGFyZyA9PT0gbnVsbCB8fCAodHlwZW9mIGFyZyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nKSkge1xuICAgICAgICAvLyBwYWdlTnVtIGlzIGNvcnJlY3RcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBib29sZWFuXCIpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhdGgocGRmRmlsZVBhdGgsIG9wdGlvbnMpIHtcblxuICAgIHBkZkZpbGVQYXRoID0gcGRmRmlsZVBhdGgudHJpbSgpLnNwbGl0KCcnKS5tYXAoKGl0ZW0sIGlkeCkgPT4ge1xuICAgICAgICByZXR1cm4gIVs4MjA2LCA4Mjk2XS5pbmNsdWRlcyhwZGZGaWxlUGF0aC5jaGFyQ29kZUF0KGlkeCkpID8gaXRlbSA6IG51bGw7XG4gICAgfSkuam9pbignJyk7XG5cbiAgICBpZiAocGRmRmlsZVBhdGhbMF0gPT09ICd+Jykge1xuICAgICAgICAvLyByZXNvbHZlIHBhdGggcmVsYXRpdmUgdG8gaG9tZSBkaXJlY3RvcnlcbiAgICAgICAgcmV0dXJuIHBhdGguam9pbihwcm9jZXNzLmVudi5IT01FLCBwZGZGaWxlUGF0aC5zbGljZSgxKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGN3ZCA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5jd2QpIHtcbiAgICAgICAgICAgIGN3ZCA9IG9wdGlvbnMuY3dkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yb290UGF0aCkge1xuICAgICAgICAgICAgY3dkID0gb3B0aW9ucy5yb290UGF0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGN3ZCA9IGN3ZC50cmltKCk7XG5cbiAgICAgICAgcmV0dXJuIHBhdGgucmVzb2x2ZShjd2QsIHBkZkZpbGVQYXRoKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpIHtcblxuICAgIG1vZHVsZS5pc0luaXRpYWxpemVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnRzIHRoYXQgdGV4dCBpcyBwcmVzZW50IGluIGEgUERGIGZpbGVcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBkZkZpbGVQYXRoIC0gUmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aCB0byB0aGUgUERGIGZpbGUuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgLSBUZXh0IHRvIGFzc2VydC5cbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHBhZ2VOdW0gLSBQYWdlIG51bWJlci5cbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IG1lc3NhZ2UgLSBNZXNzYWdlIHRvIHRocm93IGlmIGFzc2VydGlvbiBmYWlscy5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW49fSByZXZlcnNlIC0gQ2hlY2sgYWxzbyByZXZlcnNlIHZhcmlhbnQgb2Ygc3RyaW5nLlxuICAgICAqL1xuICAgIG1vZHVsZS5hc3NlcnQgPSBhc3luYyBmdW5jdGlvbihwZGZGaWxlUGF0aCwgdGV4dCwgcGFnZU51bSA9IG51bGwsIG1lc3NhZ2UgPSBudWxsLCByZXZlcnNlID0gZmFsc2UpIHtcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcocGRmRmlsZVBhdGgsICdwZGZGaWxlUGF0aCcpO1xuICAgICAgICB2YWxpZGF0ZVN0cmluZyh0ZXh0LCAndGV4dCcpO1xuICAgICAgICB2YWxpZGF0ZVBhZ2VOdW0ocGFnZU51bSwgJ3BhZ2VOdW0nKTtcbiAgICAgICAgdmFsaWRhdGVNZXNzYWdlKG1lc3NhZ2UsICdtZXNzYWdlJyk7XG4gICAgICAgIHZhbGlkYXRlUmV2ZXJzZShyZXZlcnNlLCAncmV2ZXJzZScpO1xuXG4gICAgICAgIHBkZkZpbGVQYXRoID0gcmVzb2x2ZVBhdGgocGRmRmlsZVBhdGgsIG9wdGlvbnMpO1xuXG4gICAgICAgIGxldCBlcnJvcjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJldCA9IGF3YWl0IGFzc2VydGlvbihwZGZGaWxlUGF0aCwgdGV4dCwgcGFnZU51bSwgcmV2ZXJzZSk7XG5cbiAgICAgICAgICAgIGlmICghcmV0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBtc2cgPSBgXCIke3RleHR9XCIgaXMgbm90IGZvdW5kIGluIHRoZSBQREYgJHtwYWdlTnVtID8gJ29uIHBhZ2UgJyArIHBhZ2VOdW0gOiAnJ31gO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBtc2cpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGVycm9yID0gbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGUubWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0cyB0aGF0IHRleHQgaXMgbm90IHByZXNlbnQgaW4gYSBQREYgZmlsZVxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnROb3RcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGRmRmlsZVBhdGggLSBSZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBwZGYgZmlsZS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCAtIFRleHQgdG8gYXNzZXJ0LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gcGFnZU51bSAtIFBhZ2UgbnVtYmVyLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gbWVzc2FnZSAtIE1lc3NhZ2UgdG8gdGhyb3cgaWYgYXNzZXJ0aW9uIGZhaWxzLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbj19IHJldmVyc2UgLSBDaGVjayBhbHNvIHJldmVyc2UgdmFyaWFudCBvZiBzdHJpbmcuXG4gICAgICovXG4gICAgbW9kdWxlLmFzc2VydE5vdCA9IGFzeW5jIGZ1bmN0aW9uKHBkZkZpbGVQYXRoLCB0ZXh0LCBwYWdlTnVtID0gbnVsbCwgbWVzc2FnZSA9IG51bGwsIHJldmVyc2UgPSBmYWxzZSkge1xuICAgICAgICB2YWxpZGF0ZVN0cmluZyhwZGZGaWxlUGF0aCwgJ3BkZkZpbGVQYXRoJyk7XG4gICAgICAgIHZhbGlkYXRlU3RyaW5nKHRleHQsICd0ZXh0Jyk7XG4gICAgICAgIHZhbGlkYXRlUGFnZU51bShwYWdlTnVtLCAncGFnZU51bScpO1xuICAgICAgICB2YWxpZGF0ZU1lc3NhZ2UobWVzc2FnZSwgJ21lc3NhZ2UnKTtcbiAgICAgICAgdmFsaWRhdGVSZXZlcnNlKHJldmVyc2UsICdyZXZlcnNlJyk7XG5cbiAgICAgICAgcGRmRmlsZVBhdGggPSByZXNvbHZlUGF0aChwZGZGaWxlUGF0aCwgb3B0aW9ucyk7XG5cbiAgICAgICAgbGV0IGVycm9yO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmV0ID0gYXdhaXQgYXNzZXJ0aW9uKHBkZkZpbGVQYXRoLCB0ZXh0LCBwYWdlTnVtLCByZXZlcnNlKTtcblxuICAgICAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgbXNnID0gYFwiJHt0ZXh0fVwiIGlzIGZvdW5kIGluIHRoZSBQREYgJHtwYWdlTnVtID8gJ29uIHBhZ2UgJyArIHBhZ2VOdW0gOiAnJ31gO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgZS5tZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgQ291bnQgdGhlIG51bWJlciBvZiB0aW1lcyBzcGVjaWZpZWQgdGV4dCBpcyBwcmVzZW50IGluIGEgUERGIGZpbGUuXG4gICAgICogQGZ1bmN0aW9uIGNvdW50XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBkZkZpbGVQYXRoIC0gUmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aCB0byB0aGUgcGRmIGZpbGUuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgLSBUZXh0IHRvIGNvdW50LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gcGFnZU51bSAtIFBhZ2UgbnVtYmVyLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbj19IHJldmVyc2UgLSBDaGVjayBhbHNvIHJldmVyc2UgdmFyaWFudCBvZiBzdHJpbmcuXG4gICAgICogQHJldHVybiB7TnVtYmVyfSBOdW1iZXIgb2YgdGltZXMgdGhlIHNwZWNpZmllZCB0ZXh0IHdhcyBmb3VuZC5cbiAgICAgKi9cbiAgICBtb2R1bGUuY291bnQgPSBhc3luYyBmdW5jdGlvbihwZGZGaWxlUGF0aCwgdGV4dCwgcGFnZU51bSA9IG51bGwsIHJldmVyc2UgPSBmYWxzZSkge1xuICAgICAgICB2YWxpZGF0ZVN0cmluZyhwZGZGaWxlUGF0aCwgJ3BkZkZpbGVQYXRoJyk7XG4gICAgICAgIHZhbGlkYXRlU3RyaW5nKHRleHQsICd0ZXh0Jyk7XG4gICAgICAgIHZhbGlkYXRlUGFnZU51bShwYWdlTnVtLCAncGFnZU51bScpO1xuICAgICAgICB2YWxpZGF0ZVJldmVyc2UocmV2ZXJzZSwgJ3JldmVyc2UnKTtcblxuICAgICAgICBwZGZGaWxlUGF0aCA9IHJlc29sdmVQYXRoKHBkZkZpbGVQYXRoLCBvcHRpb25zKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNvdW50KHBkZkZpbGVQYXRoLCB0ZXh0LCBwYWdlTnVtLCByZXZlcnNlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5QREZfRVJST1IsIGUubWVzc2FnZSB8fCBlKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gbW9kdWxlO1xufTtcbiJdfQ==