oxygen-cli 1.25.0-beta.2 → 1.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (265) hide show
  1. package/.husky/pre-commit +4 -0
  2. package/CHANGELOG.md +65 -0
  3. package/build/core/OxygenCore.js +36 -257
  4. package/build/core/OxygenEvents.js +1 -11
  5. package/build/core/OxygenModule.js +1 -14
  6. package/build/core/OxygenService.js +1 -12
  7. package/build/core/OxygenSubModule.js +1 -10
  8. package/build/core/WebDriverModule.js +1 -30
  9. package/build/core/utils.js +1 -17
  10. package/build/errors/HookError.js +1 -7
  11. package/build/errors/ModuleError.js +1 -7
  12. package/build/errors/ModuleUnavailableError.js +1 -3
  13. package/build/errors/OxygenError.js +1 -33
  14. package/build/errors/ScriptNotFound.js +1 -7
  15. package/build/errors/helper.js +46 -77
  16. package/build/index.js +6 -18
  17. package/build/lib/cli-util.js +28 -90
  18. package/build/lib/cli.js +1 -23
  19. package/build/lib/debugger.js +1 -144
  20. package/build/lib/img-merge.js +1 -15
  21. package/build/lib/launcher.js +1 -28
  22. package/build/lib/moduleRequire.js +1 -4
  23. package/build/lib/param-manager.js +1 -28
  24. package/build/lib/param-reader-csv.js +1 -15
  25. package/build/lib/param-reader-excel.js +1 -14
  26. package/build/lib/param-reader-json.js +1 -10
  27. package/build/lib/util.js +3 -58
  28. package/build/model/case-result.js +1 -2
  29. package/build/model/failure.js +1 -2
  30. package/build/model/status.js +1 -2
  31. package/build/model/step-result.js +1 -2
  32. package/build/model/suite-result.js +1 -2
  33. package/build/model/test-result.js +1 -2
  34. package/build/model/testcase.js +1 -2
  35. package/build/model/testsuite.js +1 -2
  36. package/build/ox_modules/index.js +13 -33
  37. package/build/ox_modules/module-assert.js +8 -24
  38. package/build/ox_modules/module-date.js +3 -8
  39. package/build/ox_modules/module-db.js +7 -28
  40. package/build/ox_modules/module-email.js +10 -36
  41. package/build/ox_modules/module-eyes.js +5 -46
  42. package/build/ox_modules/module-http.js +42 -104
  43. package/build/ox_modules/module-log.js +5 -22
  44. package/build/ox_modules/module-mailinator.js +10 -32
  45. package/build/ox_modules/module-mob/commands/alertAccept.js +1 -2
  46. package/build/ox_modules/module-mob/commands/alertDismiss.js +1 -2
  47. package/build/ox_modules/module-mob/commands/assertAlert.js +1 -6
  48. package/build/ox_modules/module-mob/commands/assertText.js +1 -3
  49. package/build/ox_modules/module-mob/commands/assertTitle.js +1 -4
  50. package/build/ox_modules/module-mob/commands/assertValue.js +9 -15
  51. package/build/ox_modules/module-mob/commands/back.js +1 -2
  52. package/build/ox_modules/module-mob/commands/clear.js +1 -4
  53. package/build/ox_modules/module-mob/commands/click.js +3 -4
  54. package/build/ox_modules/module-mob/commands/clickHidden.js +3 -9
  55. package/build/ox_modules/module-mob/commands/clickLong.js +1 -2
  56. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +1 -4
  57. package/build/ox_modules/module-mob/commands/closeApp.js +1 -2
  58. package/build/ox_modules/module-mob/commands/debug.js +2 -2
  59. package/build/ox_modules/module-mob/commands/dragAndDrop.js +1 -2
  60. package/build/ox_modules/module-mob/commands/enableNetwork.js +4 -12
  61. package/build/ox_modules/module-mob/commands/execute.js +1 -2
  62. package/build/ox_modules/module-mob/commands/findElement.js +1 -3
  63. package/build/ox_modules/module-mob/commands/findElements.js +1 -4
  64. package/build/ox_modules/module-mob/commands/getAlertText.js +1 -2
  65. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +1 -2
  66. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +1 -10
  67. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +1 -2
  68. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +1 -2
  69. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +1 -9
  70. package/build/ox_modules/module-mob/commands/getDeviceTime.js +1 -2
  71. package/build/ox_modules/module-mob/commands/getLocation.js +1 -2
  72. package/build/ox_modules/module-mob/commands/getSource.js +1 -2
  73. package/build/ox_modules/module-mob/commands/getText.js +1 -4
  74. package/build/ox_modules/module-mob/commands/getTitle.js +1 -2
  75. package/build/ox_modules/module-mob/commands/getUrl.js +1 -2
  76. package/build/ox_modules/module-mob/commands/getValue.js +5 -9
  77. package/build/ox_modules/module-mob/commands/getWindowHandles.js +1 -2
  78. package/build/ox_modules/module-mob/commands/hideKeyboard.js +1 -2
  79. package/build/ox_modules/module-mob/commands/index.js +19 -94
  80. package/build/ox_modules/module-mob/commands/installApp.js +1 -2
  81. package/build/ox_modules/module-mob/commands/isAppInstalled.js +1 -2
  82. package/build/ox_modules/module-mob/commands/isCheckable.js +1 -2
  83. package/build/ox_modules/module-mob/commands/isChecked.js +1 -2
  84. package/build/ox_modules/module-mob/commands/isClickable.js +1 -2
  85. package/build/ox_modules/module-mob/commands/isExist.js +1 -3
  86. package/build/ox_modules/module-mob/commands/isSelected.js +1 -2
  87. package/build/ox_modules/module-mob/commands/isVisible.js +1 -3
  88. package/build/ox_modules/module-mob/commands/isWebViewContext.js +1 -2
  89. package/build/ox_modules/module-mob/commands/launchApp.js +1 -2
  90. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +1 -2
  91. package/build/ox_modules/module-mob/commands/open.js +1 -3
  92. package/build/ox_modules/module-mob/commands/pause.js +1 -2
  93. package/build/ox_modules/module-mob/commands/removeApp.js +1 -2
  94. package/build/ox_modules/module-mob/commands/resetApp.js +1 -2
  95. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +1 -6
  96. package/build/ox_modules/module-mob/commands/scrollIntoView.js +1 -2
  97. package/build/ox_modules/module-mob/commands/select.js +1 -4
  98. package/build/ox_modules/module-mob/commands/selectFrame.js +1 -4
  99. package/build/ox_modules/module-mob/commands/selectWindow.js +5 -26
  100. package/build/ox_modules/module-mob/commands/sendKeys.js +6 -9
  101. package/build/ox_modules/module-mob/commands/setContext.js +1 -2
  102. package/build/ox_modules/module-mob/commands/setNativeContext.js +1 -2
  103. package/build/ox_modules/module-mob/commands/setTimeout.js +1 -2
  104. package/build/ox_modules/module-mob/commands/setWebViewContext.js +3 -6
  105. package/build/ox_modules/module-mob/commands/shake.js +1 -2
  106. package/build/ox_modules/module-mob/commands/smsClickLink.js +1 -2
  107. package/build/ox_modules/module-mob/commands/smsGetText.js +3 -6
  108. package/build/ox_modules/module-mob/commands/swipe.js +1 -2
  109. package/build/ox_modules/module-mob/commands/swipeElement.js +1 -2
  110. package/build/ox_modules/module-mob/commands/swipeScreen.js +1 -2
  111. package/build/ox_modules/module-mob/commands/takeScreenshot.js +1 -2
  112. package/build/ox_modules/module-mob/commands/tap.js +1 -2
  113. package/build/ox_modules/module-mob/commands/type.js +3 -7
  114. package/build/ox_modules/module-mob/commands/unlockPattern.js +9 -10
  115. package/build/ox_modules/module-mob/commands/waitForExist.js +1 -2
  116. package/build/ox_modules/module-mob/commands/waitForInteractable.js +1 -3
  117. package/build/ox_modules/module-mob/commands/waitForVisible.js +1 -2
  118. package/build/ox_modules/module-mob.js +72 -142
  119. package/build/ox_modules/module-pdf.js +23 -62
  120. package/build/ox_modules/module-proxy.js +8 -68
  121. package/build/ox_modules/module-serial.js +7 -32
  122. package/build/ox_modules/module-shell.js +8 -27
  123. package/build/ox_modules/module-soap.js +14 -47
  124. package/build/ox_modules/module-twilio.js +10 -53
  125. package/build/ox_modules/module-utils.js +16 -51
  126. package/build/ox_modules/module-web/commands/alertAccept.js +1 -2
  127. package/build/ox_modules/module-web/commands/alertDismiss.js +1 -2
  128. package/build/ox_modules/module-web/commands/assertAlert.js +1 -6
  129. package/build/ox_modules/module-web/commands/assertExist.js +1 -2
  130. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +1 -4
  131. package/build/ox_modules/module-web/commands/assertSelectedValue.js +1 -3
  132. package/build/ox_modules/module-web/commands/assertText.js +1 -3
  133. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +1 -6
  134. package/build/ox_modules/module-web/commands/assertTextPresent.js +1 -6
  135. package/build/ox_modules/module-web/commands/assertTitle.js +1 -3
  136. package/build/ox_modules/module-web/commands/assertValue.js +1 -3
  137. package/build/ox_modules/module-web/commands/back.js +1 -2
  138. package/build/ox_modules/module-web/commands/clear.js +1 -5
  139. package/build/ox_modules/module-web/commands/click.js +4 -13
  140. package/build/ox_modules/module-web/commands/clickHidden.js +2 -7
  141. package/build/ox_modules/module-web/commands/closeWindow.js +1 -2
  142. package/build/ox_modules/module-web/commands/debug.js +2 -2
  143. package/build/ox_modules/module-web/commands/deleteCookies.js +1 -2
  144. package/build/ox_modules/module-web/commands/deselect.js +1 -2
  145. package/build/ox_modules/module-web/commands/doubleClick.js +3 -9
  146. package/build/ox_modules/module-web/commands/dragAndDrop.js +1 -2
  147. package/build/ox_modules/module-web/commands/execute.js +1 -2
  148. package/build/ox_modules/module-web/commands/fileBrowse.js +4 -10
  149. package/build/ox_modules/module-web/commands/findElement.js +1 -3
  150. package/build/ox_modules/module-web/commands/findElements.js +1 -4
  151. package/build/ox_modules/module-web/commands/fullscreenWindow.js +1 -2
  152. package/build/ox_modules/module-web/commands/getAlertText.js +1 -2
  153. package/build/ox_modules/module-web/commands/getAttribute.js +1 -4
  154. package/build/ox_modules/module-web/commands/getBrowserLogs.js +1 -3
  155. package/build/ox_modules/module-web/commands/getCookies.js +1 -2
  156. package/build/ox_modules/module-web/commands/getCssValue.js +1 -4
  157. package/build/ox_modules/module-web/commands/getElementCount.js +1 -2
  158. package/build/ox_modules/module-web/commands/getHTML.js +1 -2
  159. package/build/ox_modules/module-web/commands/getSource.js +1 -2
  160. package/build/ox_modules/module-web/commands/getText.js +1 -4
  161. package/build/ox_modules/module-web/commands/getTitle.js +1 -2
  162. package/build/ox_modules/module-web/commands/getUrl.js +1 -2
  163. package/build/ox_modules/module-web/commands/getValue.js +1 -5
  164. package/build/ox_modules/module-web/commands/getWindowHandles.js +1 -2
  165. package/build/ox_modules/module-web/commands/getWindowSize.js +1 -2
  166. package/build/ox_modules/module-web/commands/getXMLPageSource.js +1 -5
  167. package/build/ox_modules/module-web/commands/index.js +26 -99
  168. package/build/ox_modules/module-web/commands/isAlertPresent.js +1 -2
  169. package/build/ox_modules/module-web/commands/isChecked.js +1 -2
  170. package/build/ox_modules/module-web/commands/isExist.js +1 -3
  171. package/build/ox_modules/module-web/commands/isInteractable.js +33 -0
  172. package/build/ox_modules/module-web/commands/isSelected.js +1 -2
  173. package/build/ox_modules/module-web/commands/isVisible.js +1 -3
  174. package/build/ox_modules/module-web/commands/makeVisible.js +2 -10
  175. package/build/ox_modules/module-web/commands/maximizeWindow.js +1 -2
  176. package/build/ox_modules/module-web/commands/minimizeWindow.js +1 -2
  177. package/build/ox_modules/module-web/commands/newWindow.js +1 -2
  178. package/build/ox_modules/module-web/commands/open.js +1 -4
  179. package/build/ox_modules/module-web/commands/pause.js +1 -2
  180. package/build/ox_modules/module-web/commands/point.js +1 -2
  181. package/build/ox_modules/module-web/commands/pointJS.js +2 -8
  182. package/build/ox_modules/module-web/commands/refresh.js +1 -2
  183. package/build/ox_modules/module-web/commands/rightClick.js +3 -8
  184. package/build/ox_modules/module-web/commands/rightClickActions.js +1 -2
  185. package/build/ox_modules/module-web/commands/scrollToElement.js +1 -2
  186. package/build/ox_modules/module-web/commands/select.js +1 -5
  187. package/build/ox_modules/module-web/commands/selectFrame.js +1 -3
  188. package/build/ox_modules/module-web/commands/selectWindow.js +5 -26
  189. package/build/ox_modules/module-web/commands/sendKeys.js +3 -6
  190. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +2 -2
  191. package/build/ox_modules/module-web/commands/setTimeout.js +1 -2
  192. package/build/ox_modules/module-web/commands/setWindowSize.js +1 -2
  193. package/build/ox_modules/module-web/commands/takeScreenshot.js +3 -5
  194. package/build/ox_modules/module-web/commands/type.js +1 -5
  195. package/build/ox_modules/module-web/commands/waitForAngular.js +6 -11
  196. package/build/ox_modules/module-web/commands/waitForExist.js +1 -2
  197. package/build/ox_modules/module-web/commands/waitForInteractable.js +1 -2
  198. package/build/ox_modules/module-web/commands/waitForNotExist.js +1 -8
  199. package/build/ox_modules/module-web/commands/waitForNotText.js +3 -5
  200. package/build/ox_modules/module-web/commands/waitForNotValue.js +3 -5
  201. package/build/ox_modules/module-web/commands/waitForText.js +3 -5
  202. package/build/ox_modules/module-web/commands/waitForValue.js +3 -5
  203. package/build/ox_modules/module-web/commands/waitForVisible.js +1 -2
  204. package/build/ox_modules/module-web/commands/waitForWindow.js +4 -21
  205. package/build/ox_modules/module-web.js +86 -192
  206. package/build/ox_modules/module-win/commands/assertText.js +1 -3
  207. package/build/ox_modules/module-win/commands/assertTitle.js +1 -4
  208. package/build/ox_modules/module-win/commands/assertValue.js +9 -15
  209. package/build/ox_modules/module-win/commands/back.js +1 -2
  210. package/build/ox_modules/module-win/commands/clear.js +1 -4
  211. package/build/ox_modules/module-win/commands/click.js +1 -2
  212. package/build/ox_modules/module-win/commands/clickLong.js +1 -2
  213. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +1 -4
  214. package/build/ox_modules/module-win/commands/findElement.js +1 -3
  215. package/build/ox_modules/module-win/commands/findElements.js +1 -4
  216. package/build/ox_modules/module-win/commands/getAppiumLogs.js +1 -2
  217. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +1 -2
  218. package/build/ox_modules/module-win/commands/getLocation.js +1 -2
  219. package/build/ox_modules/module-win/commands/getSource.js +1 -2
  220. package/build/ox_modules/module-win/commands/getText.js +1 -4
  221. package/build/ox_modules/module-win/commands/getValue.js +5 -9
  222. package/build/ox_modules/module-win/commands/getWindowHandles.js +1 -2
  223. package/build/ox_modules/module-win/commands/index.js +5 -43
  224. package/build/ox_modules/module-win/commands/isCheckable.js +1 -2
  225. package/build/ox_modules/module-win/commands/isChecked.js +1 -2
  226. package/build/ox_modules/module-win/commands/isClickable.js +1 -2
  227. package/build/ox_modules/module-win/commands/isExist.js +1 -3
  228. package/build/ox_modules/module-win/commands/isSelected.js +1 -2
  229. package/build/ox_modules/module-win/commands/isVisible.js +1 -3
  230. package/build/ox_modules/module-win/commands/open.js +1 -2
  231. package/build/ox_modules/module-win/commands/pause.js +1 -2
  232. package/build/ox_modules/module-win/commands/rightClick.js +1 -2
  233. package/build/ox_modules/module-win/commands/selectWindow.js +1 -15
  234. package/build/ox_modules/module-win/commands/sendKeys.js +1 -4
  235. package/build/ox_modules/module-win/commands/setTimeout.js +1 -2
  236. package/build/ox_modules/module-win/commands/takeScreenshot.js +1 -2
  237. package/build/ox_modules/module-win/commands/tap.js +1 -2
  238. package/build/ox_modules/module-win/commands/type.js +1 -4
  239. package/build/ox_modules/module-win/commands/waitForExist.js +1 -2
  240. package/build/ox_modules/module-win/commands/waitForInteractable.js +1 -4
  241. package/build/ox_modules/module-win/commands/waitForVisible.js +1 -2
  242. package/build/ox_modules/module-win.js +48 -87
  243. package/build/ox_modules/utils.js +22 -76
  244. package/build/ox_reporters/reporter-excel.js +1 -58
  245. package/build/ox_reporters/reporter-html.js +1 -28
  246. package/build/ox_reporters/reporter-json.js +1 -14
  247. package/build/ox_reporters/reporter-junit.js +1 -24
  248. package/build/ox_reporters/reporter-pdf.js +1 -19
  249. package/build/ox_reporters/reporter-xml.js +1 -17
  250. package/build/ox_services/service-devtools/submodule-network.js +3 -84
  251. package/build/ox_services/service-devtools.js +1 -23
  252. package/build/reporter/FileReporterBase.js +5 -44
  253. package/build/reporter/ReportAggregator.js +1 -65
  254. package/build/reporter/ReporterBase.js +1 -6
  255. package/build/runners/WorkerProcess.js +1 -99
  256. package/build/runners/cucumber/CucumberEventListener.js +4 -29
  257. package/build/runners/cucumber/CucumberReporter.js +1 -56
  258. package/build/runners/cucumber/CucumberWorker.js +1 -66
  259. package/build/runners/cucumber/index.js +1 -30
  260. package/build/runners/cucumber/worker.js +1 -18
  261. package/build/runners/index.js +1 -6
  262. package/build/runners/oxygen/OxygenWorker.js +20 -54
  263. package/build/runners/oxygen/index.js +17 -177
  264. package/build/runners/oxygen/worker.js +2 -25
  265. package/package.json +28 -29
@@ -4,19 +4,14 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  require("source-map-support/register");
9
-
10
8
  class ReporterBase {
11
9
  constructor(options) {
12
10
  this.options = options;
13
11
  }
14
-
15
12
  generate(results) {
16
13
  throw new Error('Abstract class, method not implemented');
17
14
  }
18
-
19
15
  }
20
-
21
16
  exports.default = ReporterBase;
22
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBvcnRlci9SZXBvcnRlckJhc2UuanMiXSwibmFtZXMiOlsiUmVwb3J0ZXJCYXNlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwiZ2VuZXJhdGUiLCJyZXN1bHRzIiwiRXJyb3IiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVllLE1BQU1BLFlBQU4sQ0FBbUI7QUFDOUJDLEVBQUFBLFdBQVcsQ0FBQ0MsT0FBRCxFQUFVO0FBQ2pCLFNBQUtBLE9BQUwsR0FBZUEsT0FBZjtBQUNIOztBQUNEQyxFQUFBQSxRQUFRLENBQUNDLE9BQUQsRUFBVTtBQUNkLFVBQU0sSUFBSUMsS0FBSixDQUFVLHdDQUFWLENBQU47QUFDSDs7QUFONkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qXHJcbiAqIE94eWdlbiBSZXBvcnRlciBhYnN0cmFjdCBjbGFzc1xyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVwb3J0ZXJCYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgfVxyXG4gICAgZ2VuZXJhdGUocmVzdWx0cykge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQWJzdHJhY3QgY2xhc3MsIG1ldGhvZCBub3QgaW1wbGVtZW50ZWQnKTtcclxuICAgIH1cclxufVxyXG4iXX0=
17
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZXBvcnRlckJhc2UiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJnZW5lcmF0ZSIsInJlc3VsdHMiLCJFcnJvciJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBvcnRlci9SZXBvcnRlckJhc2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKlxyXG4gKiBPeHlnZW4gUmVwb3J0ZXIgYWJzdHJhY3QgY2xhc3NcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcG9ydGVyQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgIH1cclxuICAgIGdlbmVyYXRlKHJlc3VsdHMpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Fic3RyYWN0IGNsYXNzLCBtZXRob2Qgbm90IGltcGxlbWVudGVkJyk7XHJcbiAgICB9XHJcbn1cclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBWWUsTUFBTUEsWUFBWSxDQUFDO0VBQzlCQyxXQUFXLENBQUNDLE9BQU8sRUFBRTtJQUNqQixJQUFJLENBQUNBLE9BQU8sR0FBR0EsT0FBTztFQUMxQjtFQUNBQyxRQUFRLENBQUNDLE9BQU8sRUFBRTtJQUNkLE1BQU0sSUFBSUMsS0FBSyxDQUFDLHdDQUF3QyxDQUFDO0VBQzdEO0FBQ0o7QUFBQyJ9
@@ -4,27 +4,16 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  require("source-map-support/register");
9
-
10
8
  var _child_process = require("child_process");
11
-
12
9
  var _events = require("events");
13
-
14
10
  var _when = require("when");
15
-
16
11
  var _logger = _interopRequireDefault(require("../lib/logger"));
17
-
18
12
  var _debugger = _interopRequireDefault(require("../lib/debugger"));
19
-
20
13
  var _util = _interopRequireDefault(require("../lib/util"));
21
-
22
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
-
24
15
  const log = (0, _logger.default)('WorkerProcess');
25
-
26
16
  const snooze = ms => new Promise(resolve => setTimeout(resolve, ms));
27
-
28
17
  class WorkerProcess extends _events.EventEmitter {
29
18
  constructor(pid, workerPath, debugMode, debugPort, name = null, npmGRootExecution = true) {
30
19
  super();
@@ -42,7 +31,6 @@ class WorkerProcess extends _events.EventEmitter {
42
31
  this._calls = {};
43
32
  this._eventHandlers = {};
44
33
  }
45
-
46
34
  async start() {
47
35
  const env = Object.assign(process.env, {
48
36
  OX_WORKER: true,
@@ -56,17 +44,13 @@ class WorkerProcess extends _events.EventEmitter {
56
44
  execArgv: [],
57
45
  detached: false
58
46
  };
59
-
60
47
  if (this._debugPort) {
61
48
  forkOpts.execArgv = Object.assign(forkOpts.execArgv, ['--inspect-brk=' + this._debugPort]);
62
49
  }
63
-
64
50
  forkOpts.execArgv.push('--trace-warnings');
65
-
66
51
  if (this._npmGRootExecution) {
67
52
  try {
68
53
  let globalNpmModulesPath;
69
-
70
54
  if (process.platform === 'darwin') {
71
55
  await (() => {
72
56
  return new Promise((resolve, reject) => {
@@ -78,7 +62,6 @@ class WorkerProcess extends _events.EventEmitter {
78
62
  console.log('darwin npm root error:', err);
79
63
  resolve();
80
64
  }
81
-
82
65
  if (stdout && stdout.toString) {
83
66
  globalNpmModulesPath = stdout.toString().trim();
84
67
  resolve();
@@ -91,12 +74,10 @@ class WorkerProcess extends _events.EventEmitter {
91
74
  })();
92
75
  } else {
93
76
  const execResult = (0, _child_process.execSync)('npm root -g');
94
-
95
77
  if (execResult && execResult.toString) {
96
78
  globalNpmModulesPath = execResult.toString().trim();
97
79
  }
98
80
  }
99
-
100
81
  if (globalNpmModulesPath && forkOpts && forkOpts.env) {
101
82
  forkOpts.env.NODE_PATH = globalNpmModulesPath;
102
83
  }
@@ -104,21 +85,16 @@ class WorkerProcess extends _events.EventEmitter {
104
85
  console.log('npm root error:', e);
105
86
  }
106
87
  }
107
-
108
88
  this._childProc = (0, _child_process.fork)(this._workerPath, forkOpts);
109
-
110
89
  this._hookChildProcEvents();
111
-
112
90
  this._isRunning = true;
113
91
  return this._childProc;
114
92
  }
115
-
116
93
  async startDebugger() {
117
94
  if (this._debugMode) {
118
95
  await this._initializeDebugger();
119
96
  }
120
97
  }
121
-
122
98
  async stop(status = null) {
123
99
  if (this._isInitialized && this._childProc) {
124
100
  if (this._debugger && this._debugger._paused) {
@@ -128,33 +104,26 @@ class WorkerProcess extends _events.EventEmitter {
128
104
  await this._debugger.resumeTerminate();
129
105
  }
130
106
  }
131
-
132
107
  await this.invoke('dispose', status);
133
108
  await snooze(100);
134
109
  } else if (this._childProc) {
135
110
  await snooze(100);
136
111
  }
137
-
138
112
  if (this._debugger) {
139
113
  await this._debugger.close();
140
114
  }
141
-
142
115
  this._send({
143
116
  type: 'exit',
144
117
  status: status
145
118
  });
146
-
147
119
  this.kill();
148
-
149
120
  this._reset();
150
121
  }
151
-
152
122
  kill() {
153
123
  if (this._childProc) {
154
124
  this._childProc.kill('SIGINT');
155
125
  }
156
126
  }
157
-
158
127
  async init(rid, options, caps) {
159
128
  if (!this._isInitialized) {
160
129
  const beforeTime = new Date().getTime();
@@ -163,125 +132,97 @@ class WorkerProcess extends _events.EventEmitter {
163
132
  const duration = afterTime - beforeTime;
164
133
  this._isInitialized = true;
165
134
  let start = '';
166
-
167
135
  if (this._name) {
168
136
  start = this._name + ' ';
169
137
  }
170
-
171
138
  log.info(start + 'Worker initialized in ' + duration + ' ms');
172
139
  }
173
140
  }
174
-
175
141
  async dispose(status = null) {
176
142
  if (this._debugger) {
177
143
  await this._debugger.close();
178
144
  }
179
-
180
145
  if (this._isInitialized && this._childProc) {
181
146
  this._isInitialized = false;
182
147
  await this.invoke('dispose', status);
183
-
184
148
  this._send({
185
149
  type: 'exit',
186
150
  status: status
187
151
  });
188
-
189
152
  this.kill();
190
153
  } else if (this._childProc) {
191
154
  this._isInitialized = false;
192
-
193
155
  this._send({
194
156
  type: 'exit',
195
157
  status: status
196
158
  });
197
-
198
159
  this.kill();
199
160
  }
200
161
  }
201
-
202
162
  async disposeModules(status = null) {
203
163
  if (this._debugger) {
204
164
  await this._debugger.close();
205
165
  }
206
-
207
166
  if (this._childProc) {
208
167
  await this.invoke('disposeModules', status);
209
168
  }
210
169
  }
211
-
212
170
  get debugger() {
213
171
  return this._debugger;
214
172
  }
215
-
216
173
  get isRunning() {
217
174
  return this._isRunning;
218
175
  }
219
-
220
176
  get isInitialized() {
221
177
  return this._isInitialized;
222
178
  }
223
-
224
179
  async run(runOpts) {
225
180
  return await this.invoke('run', runOpts);
226
181
  }
227
-
228
182
  subscribe(eventName, handler) {
229
183
  if (!this._eventHandlers[eventName] && typeof handler === 'function') {
230
184
  this._eventHandlers[eventName] = handler;
231
-
232
185
  this._send({
233
186
  type: 'subscribe',
234
187
  event: eventName
235
188
  });
236
189
  }
237
190
  }
238
-
239
191
  async invoke(method) {
240
192
  let args = Array.prototype.slice.call(arguments);
241
-
242
193
  if (args.length > 0) {
243
194
  args.shift();
244
195
  }
245
-
246
196
  if (this._childProc) {
247
197
  const callId = _util.default.generateUniqueId();
248
-
249
198
  this._send({
250
199
  type: 'invoke',
251
200
  method: method,
252
201
  callId: callId,
253
202
  args: args
254
203
  });
255
-
256
204
  this._calls[callId] = (0, _when.defer)();
257
205
  return this._calls[callId].promise;
258
206
  }
259
207
  }
260
-
261
208
  async invokeTestHook(hookName, hookArgs) {
262
209
  const callId = _util.default.generateUniqueId();
263
-
264
210
  this._send({
265
211
  type: 'invoke:hook',
266
212
  method: hookName,
267
213
  callId: callId,
268
214
  args: hookArgs
269
215
  });
270
-
271
216
  this._calls[callId] = (0, _when.defer)();
272
217
  return this._calls[callId].promise;
273
218
  }
274
-
275
219
  _send(message) {
276
220
  if (!this._childProc) {
277
221
  return false;
278
222
  }
279
-
280
223
  this._childProc.send(message);
281
-
282
224
  return true;
283
225
  }
284
-
285
226
  _reset() {
286
227
  this._childProc = null;
287
228
  this._debugger = null;
@@ -293,43 +234,31 @@ class WorkerProcess extends _events.EventEmitter {
293
234
  this._whenModulesDisposed = null;
294
235
  this._isInitialized = false;
295
236
  }
296
-
297
237
  _hookChildProcEvents() {
298
238
  if (!this._childProc) {
299
239
  return;
300
240
  }
301
-
302
241
  this._childProc.on('message', this._handleChildMessage.bind(this));
303
-
304
242
  this._childProc.on('error', this._handleChildError.bind(this));
305
-
306
243
  this._childProc.on('exit', this._handleChildExit.bind(this));
307
-
308
244
  this._childProc.on('disconnect', this._handleChildDisconnect.bind(this));
309
-
310
245
  this._childProc.on('uncaughtException', this._handleChildUncaughtException.bind(this));
311
-
312
246
  this._childProc.on('SIGINT', this._handleChildSigInt.bind(this));
313
247
  }
314
-
315
248
  _handleChildMessage(msg) {
316
249
  if (msg.event) {
317
250
  switch (msg.event) {
318
251
  case 'invoke:result':
319
252
  if (msg.callId && Object.prototype.hasOwnProperty.call(this._calls, msg.callId)) {
320
253
  const promise = this._calls[msg.callId];
321
-
322
254
  if (msg.error) {
323
255
  promise.reject(msg.error);
324
256
  } else {
325
257
  promise.resolve(msg.retval);
326
258
  }
327
-
328
259
  delete this._calls[msg.callId];
329
260
  }
330
-
331
261
  break;
332
-
333
262
  case 'reporter':
334
263
  if (msg.method) {
335
264
  this.emit('reporter', {
@@ -338,21 +267,16 @@ class WorkerProcess extends _events.EventEmitter {
338
267
  args: msg.args
339
268
  });
340
269
  }
341
-
342
270
  break;
343
-
344
271
  case 'event':
345
272
  this._handleWorkerEvent(msg.name, msg.args);
346
-
347
273
  break;
348
274
  }
349
275
  }
350
-
351
276
  this.emit('message', Object.assign(msg, {
352
277
  pid: this._pid
353
278
  }));
354
279
  }
355
-
356
280
  async _handleWorkerEvent(name, args) {
357
281
  if (name && this._eventHandlers && this._eventHandlers[name]) {
358
282
  try {
@@ -362,7 +286,6 @@ class WorkerProcess extends _events.EventEmitter {
362
286
  }
363
287
  }
364
288
  }
365
-
366
289
  _handleChildError(error) {
367
290
  log.debug(`Worker ${this._pid} thrown an error: ${error}.`);
368
291
  this.emit('error', Object.assign({
@@ -371,28 +294,21 @@ class WorkerProcess extends _events.EventEmitter {
371
294
  pid: this._pid
372
295
  }));
373
296
  }
374
-
375
297
  _handleChildExit(exitCode, signal) {
376
298
  log.debug(`Worker ${this._pid} finished with exit code ${exitCode} and signal ${signal}.`);
377
-
378
299
  this._reset();
379
-
380
300
  this.emit('exit', {
381
301
  pid: this._pid,
382
302
  exitCode,
383
303
  signal
384
304
  });
385
305
  }
386
-
387
306
  _handleChildDisconnect() {
388
307
  log.debug(`Worker ${this._pid} disconnected.`);
389
308
  }
390
-
391
309
  _handleChildUncaughtException(error) {
392
310
  log.debug(`Worker ${this._pid} thrown an uncaught error: ${error}.`);
393
-
394
311
  this._reset();
395
-
396
312
  this.emit('error', Object.assign({
397
313
  error: error
398
314
  }, {
@@ -403,50 +319,39 @@ class WorkerProcess extends _events.EventEmitter {
403
319
  exitCode: 1
404
320
  });
405
321
  }
406
-
407
322
  _handleChildSigInt() {
408
323
  log.debug(`Worker ${this._pid} received SIGINT signal.`);
409
324
  }
410
-
411
325
  async _initializeDebugger() {
412
326
  this._debugger = new _debugger.default(this._pid);
413
327
  let whenDebuggerReady = (0, _when.defer)();
414
-
415
328
  const _this = this;
416
-
417
329
  this._debugger.on('ready', function (err) {
418
330
  if (_this._debugger && _this._debugger.continue) {
419
331
  _this._debugger.continue();
420
332
  }
421
-
422
333
  whenDebuggerReady.resolve();
423
334
  });
424
-
425
335
  this._debugger.on('error', function (err) {
426
336
  log.error('debugger on error :', err);
427
337
  this.emit('debugger:error', Object.assign(err, {
428
338
  pid: this._pid
429
339
  }));
430
-
431
340
  if (!whenDebuggerReady.isResolved) {
432
341
  whenDebuggerReady.reject(err.message);
433
342
  }
434
343
  });
435
-
436
344
  this._debugger.on('break', function (breakpointData) {
437
345
  this.emit('debugger:break', breakpointData);
438
346
  });
439
-
440
347
  this._debugger.on('breakError', async function (breakError) {
441
348
  if (breakError && breakError.message) {
442
349
  if (_this._breakpointErrors.includes(breakError.message)) {} else {
443
350
  _this._breakpointErrors.push(breakError.message);
444
-
445
351
  this.emit('debugger:breakError', breakError);
446
352
  }
447
353
  }
448
354
  });
449
-
450
355
  try {
451
356
  log.info(`Connecting to debugger on port ${this._debugPort}...`);
452
357
  await this._debugger.connect(this._debugPort, '127.0.0.1');
@@ -455,11 +360,8 @@ class WorkerProcess extends _events.EventEmitter {
455
360
  const message = 'Cannot connect to the debugger: ' + e.message;
456
361
  whenDebuggerReady.reject(message);
457
362
  }
458
-
459
363
  return whenDebuggerReady.promise;
460
364
  }
461
-
462
365
  }
463
-
464
366
  exports.default = WorkerProcess;
465
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW5uZXJzL1dvcmtlclByb2Nlc3MuanMiXSwibmFtZXMiOlsibG9nIiwic25vb3plIiwibXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNldFRpbWVvdXQiLCJXb3JrZXJQcm9jZXNzIiwiRXZlbnRFbWl0dGVyIiwiY29uc3RydWN0b3IiLCJwaWQiLCJ3b3JrZXJQYXRoIiwiZGVidWdNb2RlIiwiZGVidWdQb3J0IiwibmFtZSIsIm5wbUdSb290RXhlY3V0aW9uIiwiX25hbWUiLCJfaXNSdW5uaW5nIiwiX2lzSW5pdGlhbGl6ZWQiLCJfc3RvcHBlZEJ5VXNlciIsIl9waWQiLCJfY2hpbGRQcm9jIiwiX2RlYnVnTW9kZSIsIl9kZWJ1Z1BvcnQiLCJfd29ya2VyUGF0aCIsIl9ucG1HUm9vdEV4ZWN1dGlvbiIsIl9icmVha3BvaW50RXJyb3JzIiwiX2NhbGxzIiwiX2V2ZW50SGFuZGxlcnMiLCJzdGFydCIsImVudiIsIk9iamVjdCIsImFzc2lnbiIsInByb2Nlc3MiLCJPWF9XT1JLRVIiLCJERUJVRyIsImlzTmFOIiwiTk9fVVBEQVRFX05PVElGSUVSIiwiaW5mbyIsImZvcmtPcHRzIiwiY3dkIiwiZXhlY0FyZ3YiLCJkZXRhY2hlZCIsInB1c2giLCJnbG9iYWxOcG1Nb2R1bGVzUGF0aCIsInBsYXRmb3JtIiwicmVqZWN0IiwiZXJyIiwic3Rkb3V0IiwiY29uc29sZSIsInRvU3RyaW5nIiwidHJpbSIsImUiLCJleGVjUmVzdWx0IiwiTk9ERV9QQVRIIiwiX2hvb2tDaGlsZFByb2NFdmVudHMiLCJzdGFydERlYnVnZ2VyIiwiX2luaXRpYWxpemVEZWJ1Z2dlciIsInN0b3AiLCJzdGF0dXMiLCJfZGVidWdnZXIiLCJfcGF1c2VkIiwiZGlzYWJsZSIsInJlc3VtZVRlcm1pbmF0ZSIsImludm9rZSIsImNsb3NlIiwiX3NlbmQiLCJ0eXBlIiwia2lsbCIsIl9yZXNldCIsImluaXQiLCJyaWQiLCJvcHRpb25zIiwiY2FwcyIsImJlZm9yZVRpbWUiLCJEYXRlIiwiZ2V0VGltZSIsImFmdGVyVGltZSIsImR1cmF0aW9uIiwiZGlzcG9zZSIsImRpc3Bvc2VNb2R1bGVzIiwiZGVidWdnZXIiLCJpc1J1bm5pbmciLCJpc0luaXRpYWxpemVkIiwicnVuIiwicnVuT3B0cyIsInN1YnNjcmliZSIsImV2ZW50TmFtZSIsImhhbmRsZXIiLCJldmVudCIsIm1ldGhvZCIsImFyZ3MiLCJBcnJheSIsInByb3RvdHlwZSIsInNsaWNlIiwiY2FsbCIsImFyZ3VtZW50cyIsImxlbmd0aCIsInNoaWZ0IiwiY2FsbElkIiwib3h1dGlsIiwiZ2VuZXJhdGVVbmlxdWVJZCIsInByb21pc2UiLCJpbnZva2VUZXN0SG9vayIsImhvb2tOYW1lIiwiaG9va0FyZ3MiLCJtZXNzYWdlIiwic2VuZCIsIl93aGVuT3h5Z2VuRGlzcG9zZWQiLCJfd2hlbk94eWdlbkluaXRpYWxpemVkIiwiX3doZW5Nb2R1bGVzRGlzcG9zZWQiLCJvbiIsIl9oYW5kbGVDaGlsZE1lc3NhZ2UiLCJiaW5kIiwiX2hhbmRsZUNoaWxkRXJyb3IiLCJfaGFuZGxlQ2hpbGRFeGl0IiwiX2hhbmRsZUNoaWxkRGlzY29ubmVjdCIsIl9oYW5kbGVDaGlsZFVuY2F1Z2h0RXhjZXB0aW9uIiwiX2hhbmRsZUNoaWxkU2lnSW50IiwibXNnIiwiaGFzT3duUHJvcGVydHkiLCJlcnJvciIsInJldHZhbCIsImVtaXQiLCJfaGFuZGxlV29ya2VyRXZlbnQiLCJhcHBseSIsInVuZGVmaW5lZCIsImRlYnVnIiwiZXhpdENvZGUiLCJzaWduYWwiLCJEZWJ1Z2dlciIsIndoZW5EZWJ1Z2dlclJlYWR5IiwiX3RoaXMiLCJjb250aW51ZSIsImlzUmVzb2x2ZWQiLCJicmVha3BvaW50RGF0YSIsImJyZWFrRXJyb3IiLCJpbmNsdWRlcyIsImNvbm5lY3QiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUdBOztBQUdBOztBQUNBOzs7O0FBSEEsTUFBTUEsR0FBRyxHQUFHLHFCQUFPLGVBQVAsQ0FBWjs7QUFNQSxN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QUFBQSxpQkFBaUIsQ0FBQ3JGLE1BQWxCLENBQXlCNEQsT0FBekI7QUFDSDs7QUFFRCxXQUFPeUIsaUJBQWlCLENBQUM3QixPQUF6QjtBQUNIOztBQTlYbUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JrLCBleGVjU3luYywgZXhlYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xyXG5pbXBvcnQgeyBkZWZlciB9IGZyb20gJ3doZW4nO1xyXG5cclxuLy8gc2V0dXAgbG9nZ2VyXHJcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi4vbGliL2xvZ2dlcic7XHJcbmNvbnN0IGxvZyA9IGxvZ2dlcignV29ya2VyUHJvY2VzcycpO1xyXG5cclxuaW1wb3J0IERlYnVnZ2VyIGZyb20gJy4uL2xpYi9kZWJ1Z2dlcic7XHJcbmltcG9ydCBveHV0aWwgZnJvbSAnLi4vbGliL3V0aWwnO1xyXG5cclxuLy8gc25vb3plIGZ1bmN0aW9uIC0gYXN5bmMgd3JhcHBlciBhcm91bmQgc2V0VGltZW91dCBmdW5jdGlvblxyXG5jb25zdCBzbm9vemUgPSBtcyA9PiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcclxuXHJcbi8qKlxyXG4gKiBXb3JrZXJQcm9jZXNzIHJlc3BvbnNpYmxlIGZvciBzcGF3bmluZyBhIHdvcmtlciBwcm9jZXNzIHRoZSB0ZXN0IGluc3RhbmNlLlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV29ya2VyUHJvY2VzcyBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihwaWQsIHdvcmtlclBhdGgsIGRlYnVnTW9kZSwgZGVidWdQb3J0LCBuYW1lID0gbnVsbCwgbnBtR1Jvb3RFeGVjdXRpb24gPSB0cnVlKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTtcclxuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fc3RvcHBlZEJ5VXNlciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fcGlkID0gcGlkO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkUHJvYyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZGVidWdNb2RlID0gZGVidWdNb2RlO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnUG9ydCA9IGRlYnVnUG9ydDtcclxuICAgICAgICB0aGlzLl93b3JrZXJQYXRoID0gd29ya2VyUGF0aDtcclxuICAgICAgICB0aGlzLl9ucG1HUm9vdEV4ZWN1dGlvbiA9IG5wbUdSb290RXhlY3V0aW9uO1xyXG4gICAgICAgIHRoaXMuX2JyZWFrcG9pbnRFcnJvcnMgPSBbXTtcclxuICAgICAgICAvLyBob2xkIHRoZSByZW1vdGUgaW52b2NhdGlvbiBwcm9taXNlXHJcbiAgICAgICAgdGhpcy5fY2FsbHMgPSB7fTtcclxuICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXJzID0ge307XHJcbiAgICB9XHJcbiAgICBhc3luYyBzdGFydCgpIHtcclxuICAgICAgICBjb25zdCBlbnYgPSBPYmplY3QuYXNzaWduKHByb2Nlc3MuZW52LCB7XHJcbiAgICAgICAgICAgIE9YX1dPUktFUjogdHJ1ZSxcclxuICAgICAgICAgICAgREVCVUc6ICFpc05hTih0aGlzLl9kZWJ1Z1BvcnQpLFxyXG4gICAgICAgICAgICBOT19VUERBVEVfTk9USUZJRVI6IHRydWVcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbG9nLmluZm8oYFN0YXJ0aW5nIHdvcmtlciBwcm9jZXNzICR7dGhpcy5fcGlkfS5gKTtcclxuICAgICAgICBsZXQgZm9ya09wdHMgPSB7XHJcbiAgICAgICAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcclxuICAgICAgICAgICAgZW52LFxyXG4gICAgICAgICAgICBleGVjQXJndjogW10sXHJcbiAgICAgICAgICAgIGRldGFjaGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgLy9zaWxlbnQ6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAodGhpcy5fZGVidWdQb3J0KSB7XHJcbiAgICAgICAgICAgIC8vIGFkZCAtLWluc3BlY3QtYnJrIGFyZ3VtZW50IGlmIGRlYnVnIHBvcnQgaXMgc3BlY2lmaWVkXHJcbiAgICAgICAgICAgIGZvcmtPcHRzLmV4ZWNBcmd2ID0gT2JqZWN0LmFzc2lnbihmb3JrT3B0cy5leGVjQXJndiwgWyctLWluc3BlY3QtYnJrPScgKyB0aGlzLl9kZWJ1Z1BvcnRdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHByaW50IG1vcmUgaW5mb3JtYXRpb24gZm9yIG5vZGVqcyBlcnJvcnNcclxuICAgICAgICBmb3JrT3B0cy5leGVjQXJndi5wdXNoKCctLXRyYWNlLXdhcm5pbmdzJyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9ucG1HUm9vdEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGdsb2JhbE5wbU1vZHVsZXNQYXRoO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0ICgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWMoJ25wbSByb290IC1nJywge2N3ZDogcHJvY2Vzcy5jd2QoKX0sIGZ1bmN0aW9uIChlcnIsIHN0ZG91dCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZGFyd2luIG5wbSByb290IGVycm9yOicsIGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZG91dCAmJiBzdGRvdXQudG9TdHJpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbE5wbU1vZHVsZXNQYXRoID0gc3Rkb3V0LnRvU3RyaW5nKCkudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KSgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGVjUmVzdWx0ID0gZXhlY1N5bmMoJ25wbSByb290IC1nJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChleGVjUmVzdWx0ICYmIGV4ZWNSZXN1bHQudG9TdHJpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsTnBtTW9kdWxlc1BhdGggPSBleGVjUmVzdWx0LnRvU3RyaW5nKCkudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsTnBtTW9kdWxlc1BhdGggJiZcclxuICAgICAgICAgICAgICAgICAgICBmb3JrT3B0cyAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGZvcmtPcHRzLmVudlxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9ya09wdHMuZW52Lk5PREVfUEFUSCA9IGdsb2JhbE5wbU1vZHVsZXNQYXRoO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbnBtIHJvb3QgZXJyb3I6JywgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGZvcmsgd29ya2VyXHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jID0gZm9yayh0aGlzLl93b3JrZXJQYXRoLCBmb3JrT3B0cyk7XHJcblxyXG4gICAgICAgIHRoaXMuX2hvb2tDaGlsZFByb2NFdmVudHMoKTtcclxuICAgICAgICAvLyBpZiB3ZSBhcmUgaW4gZGVidWcgbW9kZSwgaW5pdGlhbGl6ZSBkZWJ1Z2dlciBhbmQgb25seSB0aGVuIHN0YXJ0IG1vZHVsZXMgJ2luaXQnXHJcblxyXG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoaWxkUHJvYztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzdGFydERlYnVnZ2VyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1Z01vZGUpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5faW5pdGlhbGl6ZURlYnVnZ2VyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHN0b3Aoc3RhdHVzID0gbnVsbCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0luaXRpYWxpemVkICYmIHRoaXMuX2NoaWxkUHJvYykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZGVidWdnZXIgJiYgdGhpcy5fZGVidWdnZXIuX3BhdXNlZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCdDQU5DRUxFRCcgPT09IHN0YXR1cykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RlYnVnZ2VyLmRpc2FibGUoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fZGVidWdnZXIucmVzdW1lVGVybWluYXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbnZva2UoJ2Rpc3Bvc2UnLCBzdGF0dXMpO1xyXG4gICAgICAgICAgICBhd2FpdCBzbm9vemUoMTAwKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2NoaWxkUHJvYykge1xyXG4gICAgICAgICAgICBhd2FpdCBzbm9vemUoMTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnZ2VyKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RlYnVnZ2VyLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9zZW5kKHtcclxuICAgICAgICAgICAgdHlwZTogJ2V4aXQnLFxyXG4gICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmtpbGwoKTtcclxuICAgICAgICB0aGlzLl9yZXNldCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGtpbGwoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NoaWxkUHJvYykge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGlsZFByb2Mua2lsbCgnU0lHSU5UJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXQocmlkLCBvcHRpb25zLCBjYXBzKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJlZm9yZVRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbnZva2UoJ2luaXQnLCByaWQsIG9wdGlvbnMsIGNhcHMpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgYWZ0ZXJUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uID0gYWZ0ZXJUaW1lIC0gYmVmb3JlVGltZTtcclxuICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGxldCBzdGFydCA9ICcnO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fbmFtZSkge1xyXG4gICAgICAgICAgICAgICAgc3RhcnQgPSB0aGlzLl9uYW1lKycgJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsb2cuaW5mbyhzdGFydCsnV29ya2VyIGluaXRpYWxpemVkIGluICcgKyBkdXJhdGlvbiArICcgbXMnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGlzcG9zZShzdGF0dXMgPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnZ2VyKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RlYnVnZ2VyLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9pc0luaXRpYWxpemVkICYmIHRoaXMuX2NoaWxkUHJvYykge1xyXG4gICAgICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmludm9rZSgnZGlzcG9zZScsIHN0YXR1cyk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbmQoe1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2V4aXQnLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmtpbGwoKTtcclxuXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLl9zZW5kKHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdleGl0JyxcclxuICAgICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5raWxsKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRpc3Bvc2VNb2R1bGVzKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICBpZiAodGhpcy5fZGVidWdnZXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZGVidWdnZXIuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2NoaWxkUHJvYykge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmludm9rZSgnZGlzcG9zZU1vZHVsZXMnLCBzdGF0dXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGVidWdnZXIgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWJ1Z2dlcjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXNSdW5uaW5nICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNSdW5uaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc0luaXRpYWxpemVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0luaXRpYWxpemVkO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJ1bihydW5PcHRzKSB7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaW52b2tlKCdydW4nLCBydW5PcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICBzdWJzY3JpYmUoZXZlbnROYW1lLCBoYW5kbGVyKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9ldmVudEhhbmRsZXJzW2V2ZW50TmFtZV0gJiYgdHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVyc1tldmVudE5hbWVdID0gaGFuZGxlcjtcclxuICAgICAgICAgICAgdGhpcy5fc2VuZCh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnc3Vic2NyaWJlJyxcclxuICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudE5hbWUsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbnZva2UobWV0aG9kKSB7XHJcbiAgICAgICAgbGV0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xyXG4gICAgICAgIC8vIGlnbm9yZSBmaXJzdCBhcmd1bWVudCAtIGUuZy4gbWV0aG9kXHJcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBhcmdzLnNoaWZ0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgY29uc3QgY2FsbElkID0gb3h1dGlsLmdlbmVyYXRlVW5pcXVlSWQoKTtcclxuICAgICAgICAgICAgdGhpcy5fc2VuZCh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnaW52b2tlJyxcclxuICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxyXG4gICAgICAgICAgICAgICAgY2FsbElkOiBjYWxsSWQsXHJcbiAgICAgICAgICAgICAgICBhcmdzOiBhcmdzXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLl9jYWxsc1tjYWxsSWRdID0gZGVmZXIoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGxzW2NhbGxJZF0ucHJvbWlzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW52b2tlVGVzdEhvb2soaG9va05hbWUsIGhvb2tBcmdzKSB7XHJcbiAgICAgICAgY29uc3QgY2FsbElkID0gb3h1dGlsLmdlbmVyYXRlVW5pcXVlSWQoKTtcclxuICAgICAgICB0aGlzLl9zZW5kKHtcclxuICAgICAgICAgICAgdHlwZTogJ2ludm9rZTpob29rJyxcclxuICAgICAgICAgICAgbWV0aG9kOiBob29rTmFtZSxcclxuICAgICAgICAgICAgY2FsbElkOiBjYWxsSWQsXHJcbiAgICAgICAgICAgIGFyZ3M6IGhvb2tBcmdzXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fY2FsbHNbY2FsbElkXSA9IGRlZmVyKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGxzW2NhbGxJZF0ucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBfc2VuZChtZXNzYWdlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jaGlsZFByb2Muc2VuZChtZXNzYWdlKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBfcmVzZXQoKSB7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9kZWJ1Z2dlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fZGVidWdNb2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9kZWJ1Z1BvcnQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3doZW5PeHlnZW5EaXNwb3NlZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fd2hlbk94eWdlbkluaXRpYWxpemVkID0gbnVsbDtcclxuICAgICAgICB0aGlzLl93aGVuTW9kdWxlc0Rpc3Bvc2VkID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgX2hvb2tDaGlsZFByb2NFdmVudHMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jaGlsZFByb2Mub24oJ21lc3NhZ2UnLCB0aGlzLl9oYW5kbGVDaGlsZE1lc3NhZ2UuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jLm9uKCdlcnJvcicsIHRoaXMuX2hhbmRsZUNoaWxkRXJyb3IuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jLm9uKCdleGl0JywgdGhpcy5faGFuZGxlQ2hpbGRFeGl0LmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkUHJvYy5vbignZGlzY29ubmVjdCcsIHRoaXMuX2hhbmRsZUNoaWxkRGlzY29ubmVjdC5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLl9jaGlsZFByb2Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgdGhpcy5faGFuZGxlQ2hpbGRVbmNhdWdodEV4Y2VwdGlvbi5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLl9jaGlsZFByb2Mub24oJ1NJR0lOVCcsIHRoaXMuX2hhbmRsZUNoaWxkU2lnSW50LmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDaGlsZE1lc3NhZ2UobXNnKSB7XHJcbiAgICAgICAgaWYgKG1zZy5ldmVudCkge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG1zZy5ldmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnaW52b2tlOnJlc3VsdCc6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5jYWxsSWQgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX2NhbGxzLCBtc2cuY2FsbElkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5fY2FsbHNbbXNnLmNhbGxJZF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UucmVqZWN0KG1zZy5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLnJlc29sdmUobXNnLnJldHZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2NhbGxzW21zZy5jYWxsSWRdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3JlcG9ydGVyJzpcclxuICAgICAgICAgICAgICAgICAgICBpZiAobXNnLm1ldGhvZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3JlcG9ydGVyJywgeyBwaWQ6IHRoaXMuX3BpZCwgbWV0aG9kOiBtc2cubWV0aG9kLCBhcmdzOiBtc2cuYXJncyB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdldmVudCc6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlV29ya2VyRXZlbnQobXNnLm5hbWUsIG1zZy5hcmdzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVtaXQoJ21lc3NhZ2UnLCBPYmplY3QuYXNzaWduKG1zZywgeyBwaWQ6IHRoaXMuX3BpZCB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2hhbmRsZVdvcmtlckV2ZW50KG5hbWUsIGFyZ3MpIHtcclxuICAgICAgICBpZiAobmFtZSAmJiB0aGlzLl9ldmVudEhhbmRsZXJzICYmIHRoaXMuX2V2ZW50SGFuZGxlcnNbbmFtZV0pIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2V2ZW50SGFuZGxlcnNbbmFtZV0uYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKCdFcnJvciB0aHJvd24gYnkgd29ya2VyIGV2ZW50IGhhbmRsZXIgXCIke25hbWV9OicsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDaGlsZEVycm9yKGVycm9yKSB7XHJcbiAgICAgICAgbG9nLmRlYnVnKGBXb3JrZXIgJHt0aGlzLl9waWR9IHRocm93biBhbiBlcnJvcjogJHtlcnJvcn0uYCk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIE9iamVjdC5hc3NpZ24oeyBlcnJvciA6IGVycm9yIH0sIHsgcGlkOiB0aGlzLl9waWQgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDaGlsZEV4aXQoZXhpdENvZGUsIHNpZ25hbCkge1xyXG4gICAgICAgIGxvZy5kZWJ1ZyhgV29ya2VyICR7dGhpcy5fcGlkfSBmaW5pc2hlZCB3aXRoIGV4aXQgY29kZSAke2V4aXRDb2RlfSBhbmQgc2lnbmFsICR7c2lnbmFsfS5gKTtcclxuICAgICAgICB0aGlzLl9yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnZXhpdCcsIHsgcGlkOiB0aGlzLl9waWQsIGV4aXRDb2RlLCBzaWduYWwgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZUNoaWxkRGlzY29ubmVjdCgpIHtcclxuICAgICAgICBsb2cuZGVidWcoYFdvcmtlciAke3RoaXMuX3BpZH0gZGlzY29ubmVjdGVkLmApO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDaGlsZFVuY2F1Z2h0RXhjZXB0aW9uKGVycm9yKSB7XHJcbiAgICAgICAgbG9nLmRlYnVnKGBXb3JrZXIgJHt0aGlzLl9waWR9IHRocm93biBhbiB1bmNhdWdodCBlcnJvcjogJHtlcnJvcn0uYCk7XHJcbiAgICAgICAgdGhpcy5fcmVzZXQoKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgT2JqZWN0LmFzc2lnbih7IGVycm9yIDogZXJyb3IgfSwgeyBwaWQ6IHRoaXMuX3BpZCB9KSk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdleGl0JywgeyBwaWQ6IHRoaXMuX3BpZCwgZXhpdENvZGU6IDEgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZUNoaWxkU2lnSW50KCkge1xyXG4gICAgICAgIGxvZy5kZWJ1ZyhgV29ya2VyICR7dGhpcy5fcGlkfSByZWNlaXZlZCBTSUdJTlQgc2lnbmFsLmApO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9pbml0aWFsaXplRGVidWdnZXIoKSB7XHJcbiAgICAgICAgdGhpcy5fZGVidWdnZXIgPSBuZXcgRGVidWdnZXIodGhpcy5fcGlkKTtcclxuICAgICAgICBsZXQgd2hlbkRlYnVnZ2VyUmVhZHkgPSBkZWZlcigpO1xyXG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcclxuICAgICAgICAvLyBoYW5kbGUgZGVidWdnZXIgZXZlbnRzXHJcbiAgICAgICAgdGhpcy5fZGVidWdnZXIub24oJ3JlYWR5JywgZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgICAgIC8vIHJlc3VtZSB0aGUgZmlyc3QgYnJlYWtwb2ludCB3aGljaCBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGJ5IHRoZSBkZWJ1Z2dlclxyXG4gICAgICAgICAgICBpZiAoX3RoaXMuX2RlYnVnZ2VyICYmIF90aGlzLl9kZWJ1Z2dlci5jb250aW51ZSkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuX2RlYnVnZ2VyLmNvbnRpbnVlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgd2hlbkRlYnVnZ2VyUmVhZHkucmVzb2x2ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnZ2VyLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikge1xyXG5cclxuICAgICAgICAgICAgbG9nLmVycm9yKCdkZWJ1Z2dlciBvbiBlcnJvciA6JywgZXJyKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZGVidWdnZXI6ZXJyb3InLCBPYmplY3QuYXNzaWduKGVyciwgeyBwaWQ6IHRoaXMuX3BpZCB9KSk7XHJcbiAgICAgICAgICAgIC8vIHJlamVjdCB0aGUgcHJvbWlzZSBvbmx5IGlmIHdlIGdvdCBhbiBlcnJvciByaWdodCBhZnRlciBfZGVidWdnZXIuY29ubmVjdCgpIGNhbGwgYmVsb3cgLSB3ZSBuZWVkIHRoaXMgdG8gaW5kaWNhdGUgZGVidWdnZXIgaW5pdGlhbGl6YXRpb24gZXJyb3JcclxuICAgICAgICAgICAgaWYgKCF3aGVuRGVidWdnZXJSZWFkeS5pc1Jlc29sdmVkKSB7XHJcbiAgICAgICAgICAgICAgICB3aGVuRGVidWdnZXJSZWFkeS5yZWplY3QoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fZGVidWdnZXIub24oJ2JyZWFrJywgZnVuY3Rpb24oYnJlYWtwb2ludERhdGEpIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdkZWJ1Z2dlcjpicmVhaycsIGJyZWFrcG9pbnREYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9kZWJ1Z2dlci5vbignYnJlYWtFcnJvcicsIGFzeW5jIGZ1bmN0aW9uKGJyZWFrRXJyb3IpIHtcclxuXHJcbiAgICAgICAgICAgIGlmIChicmVha0Vycm9yICYmIGJyZWFrRXJyb3IubWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLl9icmVha3BvaW50RXJyb3JzLmluY2x1ZGVzKGJyZWFrRXJyb3IubWVzc2FnZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2JyZWFrcG9pbnRFcnJvcnMucHVzaChicmVha0Vycm9yLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZGVidWdnZXI6YnJlYWtFcnJvcicsIGJyZWFrRXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxvZy5pbmZvKGBDb25uZWN0aW5nIHRvIGRlYnVnZ2VyIG9uIHBvcnQgJHt0aGlzLl9kZWJ1Z1BvcnR9Li4uYCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RlYnVnZ2VyLmNvbm5lY3QodGhpcy5fZGVidWdQb3J0LCAnMTI3LjAuMC4xJyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ0Nhbm5vdCBjb25uZWN0IHRvIHRoZSBkZWJ1Z2dlcjogJywgZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnQ2Fubm90IGNvbm5lY3QgdG8gdGhlIGRlYnVnZ2VyOiAnICsgZS5tZXNzYWdlO1xyXG4gICAgICAgICAgICB3aGVuRGVidWdnZXJSZWFkeS5yZWplY3QobWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gd2hlbkRlYnVnZ2VyUmVhZHkucHJvbWlzZTtcclxuICAgIH1cclxufSJdfQ==
367
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2ciLCJsb2dnZXIiLCJzbm9vemUiLCJtcyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2V0VGltZW91dCIsIldvcmtlclByb2Nlc3MiLCJFdmVudEVtaXR0ZXIiLCJjb25zdHJ1Y3RvciIsInBpZCIsIndvcmtlclBhdGgiLCJkZWJ1Z01vZGUiLCJkZWJ1Z1BvcnQiLCJuYW1lIiwibnBtR1Jvb3RFeGVjdXRpb24iLCJfbmFtZSIsIl9pc1J1bm5pbmciLCJfaXNJbml0aWFsaXplZCIsIl9zdG9wcGVkQnlVc2VyIiwiX3BpZCIsIl9jaGlsZFByb2MiLCJfZGVidWdNb2RlIiwiX2RlYnVnUG9ydCIsIl93b3JrZXJQYXRoIiwiX25wbUdSb290RXhlY3V0aW9uIiwiX2JyZWFrcG9pbnRFcnJvcnMiLCJfY2FsbHMiLCJfZXZlbnRIYW5kbGVycyIsInN0YXJ0IiwiZW52IiwiT2JqZWN0IiwiYXNzaWduIiwicHJvY2VzcyIsIk9YX1dPUktFUiIsIkRFQlVHIiwiaXNOYU4iLCJOT19VUERBVEVfTk9USUZJRVIiLCJpbmZvIiwiZm9ya09wdHMiLCJjd2QiLCJleGVjQXJndiIsImRldGFjaGVkIiwicHVzaCIsImdsb2JhbE5wbU1vZHVsZXNQYXRoIiwicGxhdGZvcm0iLCJyZWplY3QiLCJleGVjIiwiZXJyIiwic3Rkb3V0IiwiY29uc29sZSIsInRvU3RyaW5nIiwidHJpbSIsImUiLCJleGVjUmVzdWx0IiwiZXhlY1N5bmMiLCJOT0RFX1BBVEgiLCJmb3JrIiwiX2hvb2tDaGlsZFByb2NFdmVudHMiLCJzdGFydERlYnVnZ2VyIiwiX2luaXRpYWxpemVEZWJ1Z2dlciIsInN0b3AiLCJzdGF0dXMiLCJfZGVidWdnZXIiLCJfcGF1c2VkIiwiZGlzYWJsZSIsInJlc3VtZVRlcm1pbmF0ZSIsImludm9rZSIsImNsb3NlIiwiX3NlbmQiLCJ0eXBlIiwia2lsbCIsIl9yZXNldCIsImluaXQiLCJyaWQiLCJvcHRpb25zIiwiY2FwcyIsImJlZm9yZVRpbWUiLCJEYXRlIiwiZ2V0VGltZSIsImFmdGVyVGltZSIsImR1cmF0aW9uIiwiZGlzcG9zZSIsImRpc3Bvc2VNb2R1bGVzIiwiZGVidWdnZXIiLCJpc1J1bm5pbmciLCJpc0luaXRpYWxpemVkIiwicnVuIiwicnVuT3B0cyIsInN1YnNjcmliZSIsImV2ZW50TmFtZSIsImhhbmRsZXIiLCJldmVudCIsIm1ldGhvZCIsImFyZ3MiLCJBcnJheSIsInByb3RvdHlwZSIsInNsaWNlIiwiY2FsbCIsImFyZ3VtZW50cyIsImxlbmd0aCIsInNoaWZ0IiwiY2FsbElkIiwib3h1dGlsIiwiZ2VuZXJhdGVVbmlxdWVJZCIsImRlZmVyIiwicHJvbWlzZSIsImludm9rZVRlc3RIb29rIiwiaG9va05hbWUiLCJob29rQXJncyIsIm1lc3NhZ2UiLCJzZW5kIiwiX3doZW5PeHlnZW5EaXNwb3NlZCIsIl93aGVuT3h5Z2VuSW5pdGlhbGl6ZWQiLCJfd2hlbk1vZHVsZXNEaXNwb3NlZCIsIm9uIiwiX2hhbmRsZUNoaWxkTWVzc2FnZSIsImJpbmQiLCJfaGFuZGxlQ2hpbGRFcnJvciIsIl9oYW5kbGVDaGlsZEV4aXQiLCJfaGFuZGxlQ2hpbGREaXNjb25uZWN0IiwiX2hhbmRsZUNoaWxkVW5jYXVnaHRFeGNlcHRpb24iLCJfaGFuZGxlQ2hpbGRTaWdJbnQiLCJtc2ciLCJoYXNPd25Qcm9wZXJ0eSIsImVycm9yIiwicmV0dmFsIiwiZW1pdCIsIl9oYW5kbGVXb3JrZXJFdmVudCIsImFwcGx5IiwidW5kZWZpbmVkIiwiZGVidWciLCJleGl0Q29kZSIsInNpZ25hbCIsIkRlYnVnZ2VyIiwid2hlbkRlYnVnZ2VyUmVhZHkiLCJfdGhpcyIsImNvbnRpbnVlIiwiaXNSZXNvbHZlZCIsImJyZWFrcG9pbnREYXRhIiwiYnJlYWtFcnJvciIsImluY2x1ZGVzIiwiY29ubmVjdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW5uZXJzL1dvcmtlclByb2Nlc3MuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZm9yaywgZXhlY1N5bmMsIGV4ZWMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcclxuaW1wb3J0IHsgZGVmZXIgfSBmcm9tICd3aGVuJztcclxuXHJcbi8vIHNldHVwIGxvZ2dlclxyXG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uL2xpYi9sb2dnZXInO1xyXG5jb25zdCBsb2cgPSBsb2dnZXIoJ1dvcmtlclByb2Nlc3MnKTtcclxuXHJcbmltcG9ydCBEZWJ1Z2dlciBmcm9tICcuLi9saWIvZGVidWdnZXInO1xyXG5pbXBvcnQgb3h1dGlsIGZyb20gJy4uL2xpYi91dGlsJztcclxuXHJcbi8vIHNub296ZSBmdW5jdGlvbiAtIGFzeW5jIHdyYXBwZXIgYXJvdW5kIHNldFRpbWVvdXQgZnVuY3Rpb25cclxuY29uc3Qgc25vb3plID0gbXMgPT4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XHJcblxyXG4vKipcclxuICogV29ya2VyUHJvY2VzcyByZXNwb25zaWJsZSBmb3Igc3Bhd25pbmcgYSB3b3JrZXIgcHJvY2VzcyB0aGUgdGVzdCBpbnN0YW5jZS5cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdvcmtlclByb2Nlc3MgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgY29uc3RydWN0b3IocGlkLCB3b3JrZXJQYXRoLCBkZWJ1Z01vZGUsIGRlYnVnUG9ydCwgbmFtZSA9IG51bGwsIG5wbUdSb290RXhlY3V0aW9uID0gdHJ1ZSkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7XHJcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3N0b3BwZWRCeVVzZXIgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX3BpZCA9IHBpZDtcclxuICAgICAgICB0aGlzLl9jaGlsZFByb2MgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnTW9kZSA9IGRlYnVnTW9kZTtcclxuICAgICAgICB0aGlzLl9kZWJ1Z1BvcnQgPSBkZWJ1Z1BvcnQ7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyUGF0aCA9IHdvcmtlclBhdGg7XHJcbiAgICAgICAgdGhpcy5fbnBtR1Jvb3RFeGVjdXRpb24gPSBucG1HUm9vdEV4ZWN1dGlvbjtcclxuICAgICAgICB0aGlzLl9icmVha3BvaW50RXJyb3JzID0gW107XHJcbiAgICAgICAgLy8gaG9sZCB0aGUgcmVtb3RlIGludm9jYXRpb24gcHJvbWlzZVxyXG4gICAgICAgIHRoaXMuX2NhbGxzID0ge307XHJcbiAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVycyA9IHt9O1xyXG4gICAgfVxyXG4gICAgYXN5bmMgc3RhcnQoKSB7XHJcbiAgICAgICAgY29uc3QgZW52ID0gT2JqZWN0LmFzc2lnbihwcm9jZXNzLmVudiwge1xyXG4gICAgICAgICAgICBPWF9XT1JLRVI6IHRydWUsXHJcbiAgICAgICAgICAgIERFQlVHOiAhaXNOYU4odGhpcy5fZGVidWdQb3J0KSxcclxuICAgICAgICAgICAgTk9fVVBEQVRFX05PVElGSUVSOiB0cnVlXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGxvZy5pbmZvKGBTdGFydGluZyB3b3JrZXIgcHJvY2VzcyAke3RoaXMuX3BpZH0uYCk7XHJcbiAgICAgICAgbGV0IGZvcmtPcHRzID0ge1xyXG4gICAgICAgICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXHJcbiAgICAgICAgICAgIGVudixcclxuICAgICAgICAgICAgZXhlY0FyZ3Y6IFtdLFxyXG4gICAgICAgICAgICBkZXRhY2hlZDogZmFsc2UsXHJcbiAgICAgICAgICAgIC8vc2lsZW50OiBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnUG9ydCkge1xyXG4gICAgICAgICAgICAvLyBhZGQgLS1pbnNwZWN0LWJyayBhcmd1bWVudCBpZiBkZWJ1ZyBwb3J0IGlzIHNwZWNpZmllZFxyXG4gICAgICAgICAgICBmb3JrT3B0cy5leGVjQXJndiA9IE9iamVjdC5hc3NpZ24oZm9ya09wdHMuZXhlY0FyZ3YsIFsnLS1pbnNwZWN0LWJyaz0nICsgdGhpcy5fZGVidWdQb3J0XSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBwcmludCBtb3JlIGluZm9ybWF0aW9uIGZvciBub2RlanMgZXJyb3JzXHJcbiAgICAgICAgZm9ya09wdHMuZXhlY0FyZ3YucHVzaCgnLS10cmFjZS13YXJuaW5ncycpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fbnBtR1Jvb3RFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGxldCBnbG9iYWxOcG1Nb2R1bGVzUGF0aDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjKCducG0gcm9vdCAtZycsIHtjd2Q6IHByb2Nlc3MuY3dkKCl9LCBmdW5jdGlvbiAoZXJyLCBzdGRvdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2RhcndpbiBucG0gcm9vdCBlcnJvcjonLCBlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGRvdXQgJiYgc3Rkb3V0LnRvU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxOcG1Nb2R1bGVzUGF0aCA9IHN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSkoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhlY1Jlc3VsdCA9IGV4ZWNTeW5jKCducG0gcm9vdCAtZycpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY1Jlc3VsdCAmJiBleGVjUmVzdWx0LnRvU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbE5wbU1vZHVsZXNQYXRoID0gZXhlY1Jlc3VsdC50b1N0cmluZygpLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbE5wbU1vZHVsZXNQYXRoICYmXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ya09wdHMgJiZcclxuICAgICAgICAgICAgICAgICAgICBmb3JrT3B0cy5lbnZcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvcmtPcHRzLmVudi5OT0RFX1BBVEggPSBnbG9iYWxOcG1Nb2R1bGVzUGF0aDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ25wbSByb290IGVycm9yOicsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBmb3JrIHdvcmtlclxyXG4gICAgICAgIHRoaXMuX2NoaWxkUHJvYyA9IGZvcmsodGhpcy5fd29ya2VyUGF0aCwgZm9ya09wdHMpO1xyXG5cclxuICAgICAgICB0aGlzLl9ob29rQ2hpbGRQcm9jRXZlbnRzKCk7XHJcbiAgICAgICAgLy8gaWYgd2UgYXJlIGluIGRlYnVnIG1vZGUsIGluaXRpYWxpemUgZGVidWdnZXIgYW5kIG9ubHkgdGhlbiBzdGFydCBtb2R1bGVzICdpbml0J1xyXG5cclxuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jaGlsZFByb2M7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc3RhcnREZWJ1Z2dlcigpIHtcclxuICAgICAgICBpZiAodGhpcy5fZGVidWdNb2RlKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2luaXRpYWxpemVEZWJ1Z2dlcigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzdG9wKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICBpZiAodGhpcy5faXNJbml0aWFsaXplZCAmJiB0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RlYnVnZ2VyICYmIHRoaXMuX2RlYnVnZ2VyLl9wYXVzZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmICgnQ0FOQ0VMRUQnID09PSBzdGF0dXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kZWJ1Z2dlci5kaXNhYmxlKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RlYnVnZ2VyLnJlc3VtZVRlcm1pbmF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaW52b2tlKCdkaXNwb3NlJywgc3RhdHVzKTtcclxuICAgICAgICAgICAgYXdhaXQgc25vb3plKDEwMCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgYXdhaXQgc25vb3plKDEwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1Z2dlcikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kZWJ1Z2dlci5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fc2VuZCh7XHJcbiAgICAgICAgICAgIHR5cGU6ICdleGl0JyxcclxuICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5raWxsKCk7XHJcbiAgICAgICAgdGhpcy5fcmVzZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBraWxsKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgdGhpcy5fY2hpbGRQcm9jLmtpbGwoJ1NJR0lOVCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0KHJpZCwgb3B0aW9ucywgY2Fwcykge1xyXG4gICAgICAgIGlmICghdGhpcy5faXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICBjb25zdCBiZWZvcmVUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaW52b2tlKCdpbml0JywgcmlkLCBvcHRpb25zLCBjYXBzKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGFmdGVyVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IGFmdGVyVGltZSAtIGJlZm9yZVRpbWU7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBsZXQgc3RhcnQgPSAnJztcclxuICAgICAgICAgICAgaWYgKHRoaXMuX25hbWUpIHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0ID0gdGhpcy5fbmFtZSsnICc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbG9nLmluZm8oc3RhcnQrJ1dvcmtlciBpbml0aWFsaXplZCBpbiAnICsgZHVyYXRpb24gKyAnIG1zJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRpc3Bvc2Uoc3RhdHVzID0gbnVsbCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1Z2dlcikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kZWJ1Z2dlci5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5faXNJbml0aWFsaXplZCAmJiB0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbnZva2UoJ2Rpc3Bvc2UnLCBzdGF0dXMpO1xyXG4gICAgICAgICAgICB0aGlzLl9zZW5kKHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdleGl0JyxcclxuICAgICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5raWxsKCk7XHJcblxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5fc2VuZCh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnZXhpdCcsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMua2lsbCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNwb3NlTW9kdWxlcyhzdGF0dXMgPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnZ2VyKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RlYnVnZ2VyLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbnZva2UoJ2Rpc3Bvc2VNb2R1bGVzJywgc3RhdHVzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRlYnVnZ2VyICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVidWdnZXI7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzUnVubmluZyAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzUnVubmluZztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXNJbml0aWFsaXplZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNJbml0aWFsaXplZDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBydW4ocnVuT3B0cykge1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmludm9rZSgncnVuJywgcnVuT3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgc3Vic2NyaWJlKGV2ZW50TmFtZSwgaGFuZGxlcikge1xyXG4gICAgICAgIGlmICghdGhpcy5fZXZlbnRIYW5kbGVyc1tldmVudE5hbWVdICYmIHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlcnNbZXZlbnROYW1lXSA9IGhhbmRsZXI7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbmQoe1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ3N1YnNjcmliZScsXHJcbiAgICAgICAgICAgICAgICBldmVudDogZXZlbnROYW1lLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW52b2tlKG1ldGhvZCkge1xyXG4gICAgICAgIGxldCBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcclxuICAgICAgICAvLyBpZ25vcmUgZmlyc3QgYXJndW1lbnQgLSBlLmcuIG1ldGhvZFxyXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgYXJncy5zaGlmdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbGxJZCA9IG94dXRpbC5nZW5lcmF0ZVVuaXF1ZUlkKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbmQoe1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2ludm9rZScsXHJcbiAgICAgICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcclxuICAgICAgICAgICAgICAgIGNhbGxJZDogY2FsbElkLFxyXG4gICAgICAgICAgICAgICAgYXJnczogYXJnc1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5fY2FsbHNbY2FsbElkXSA9IGRlZmVyKCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWxsc1tjYWxsSWRdLnByb21pc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGludm9rZVRlc3RIb29rKGhvb2tOYW1lLCBob29rQXJncykge1xyXG4gICAgICAgIGNvbnN0IGNhbGxJZCA9IG94dXRpbC5nZW5lcmF0ZVVuaXF1ZUlkKCk7XHJcbiAgICAgICAgdGhpcy5fc2VuZCh7XHJcbiAgICAgICAgICAgIHR5cGU6ICdpbnZva2U6aG9vaycsXHJcbiAgICAgICAgICAgIG1ldGhvZDogaG9va05hbWUsXHJcbiAgICAgICAgICAgIGNhbGxJZDogY2FsbElkLFxyXG4gICAgICAgICAgICBhcmdzOiBob29rQXJnc1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2NhbGxzW2NhbGxJZF0gPSBkZWZlcigpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxsc1tjYWxsSWRdLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgX3NlbmQobWVzc2FnZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jLnNlbmQobWVzc2FnZSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgX3Jlc2V0KCkge1xyXG4gICAgICAgIHRoaXMuX2NoaWxkUHJvYyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZGVidWdnZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnTW9kZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZGVidWdQb3J0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl93aGVuT3h5Z2VuRGlzcG9zZWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3doZW5PeHlnZW5Jbml0aWFsaXplZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fd2hlbk1vZHVsZXNEaXNwb3NlZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIF9ob29rQ2hpbGRQcm9jRXZlbnRzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jLm9uKCdtZXNzYWdlJywgdGhpcy5faGFuZGxlQ2hpbGRNZXNzYWdlLmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkUHJvYy5vbignZXJyb3InLCB0aGlzLl9oYW5kbGVDaGlsZEVycm9yLmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkUHJvYy5vbignZXhpdCcsIHRoaXMuX2hhbmRsZUNoaWxkRXhpdC5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLl9jaGlsZFByb2Mub24oJ2Rpc2Nvbm5lY3QnLCB0aGlzLl9oYW5kbGVDaGlsZERpc2Nvbm5lY3QuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIHRoaXMuX2hhbmRsZUNoaWxkVW5jYXVnaHRFeGNlcHRpb24uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jLm9uKCdTSUdJTlQnLCB0aGlzLl9oYW5kbGVDaGlsZFNpZ0ludC5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlQ2hpbGRNZXNzYWdlKG1zZykge1xyXG4gICAgICAgIGlmIChtc2cuZXZlbnQpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChtc2cuZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2ludm9rZTpyZXN1bHQnOlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtc2cuY2FsbElkICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl9jYWxscywgbXNnLmNhbGxJZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuX2NhbGxzW21zZy5jYWxsSWRdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobXNnLmVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLnJlamVjdChtc2cuZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5yZXNvbHZlKG1zZy5yZXR2YWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jYWxsc1ttc2cuY2FsbElkXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdyZXBvcnRlcic6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5tZXRob2QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdyZXBvcnRlcicsIHsgcGlkOiB0aGlzLl9waWQsIG1ldGhvZDogbXNnLm1ldGhvZCwgYXJnczogbXNnLmFyZ3MgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnZXZlbnQnOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZVdvcmtlckV2ZW50KG1zZy5uYW1lLCBtc2cuYXJncyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5lbWl0KCdtZXNzYWdlJywgT2JqZWN0LmFzc2lnbihtc2csIHsgcGlkOiB0aGlzLl9waWQgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9oYW5kbGVXb3JrZXJFdmVudChuYW1lLCBhcmdzKSB7XHJcbiAgICAgICAgaWYgKG5hbWUgJiYgdGhpcy5fZXZlbnRIYW5kbGVycyAmJiB0aGlzLl9ldmVudEhhbmRsZXJzW25hbWVdKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9ldmVudEhhbmRsZXJzW25hbWVdLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGxvZy5lcnJvcignRXJyb3IgdGhyb3duIGJ5IHdvcmtlciBldmVudCBoYW5kbGVyIFwiJHtuYW1lfTonLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlQ2hpbGRFcnJvcihlcnJvcikge1xyXG4gICAgICAgIGxvZy5kZWJ1ZyhgV29ya2VyICR7dGhpcy5fcGlkfSB0aHJvd24gYW4gZXJyb3I6ICR7ZXJyb3J9LmApO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBPYmplY3QuYXNzaWduKHsgZXJyb3IgOiBlcnJvciB9LCB7IHBpZDogdGhpcy5fcGlkIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlQ2hpbGRFeGl0KGV4aXRDb2RlLCBzaWduYWwpIHtcclxuICAgICAgICBsb2cuZGVidWcoYFdvcmtlciAke3RoaXMuX3BpZH0gZmluaXNoZWQgd2l0aCBleGl0IGNvZGUgJHtleGl0Q29kZX0gYW5kIHNpZ25hbCAke3NpZ25hbH0uYCk7XHJcbiAgICAgICAgdGhpcy5fcmVzZXQoKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2V4aXQnLCB7IHBpZDogdGhpcy5fcGlkLCBleGl0Q29kZSwgc2lnbmFsIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDaGlsZERpc2Nvbm5lY3QoKSB7XHJcbiAgICAgICAgbG9nLmRlYnVnKGBXb3JrZXIgJHt0aGlzLl9waWR9IGRpc2Nvbm5lY3RlZC5gKTtcclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlQ2hpbGRVbmNhdWdodEV4Y2VwdGlvbihlcnJvcikge1xyXG4gICAgICAgIGxvZy5kZWJ1ZyhgV29ya2VyICR7dGhpcy5fcGlkfSB0aHJvd24gYW4gdW5jYXVnaHQgZXJyb3I6ICR7ZXJyb3J9LmApO1xyXG4gICAgICAgIHRoaXMuX3Jlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIE9iamVjdC5hc3NpZ24oeyBlcnJvciA6IGVycm9yIH0sIHsgcGlkOiB0aGlzLl9waWQgfSkpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnZXhpdCcsIHsgcGlkOiB0aGlzLl9waWQsIGV4aXRDb2RlOiAxIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDaGlsZFNpZ0ludCgpIHtcclxuICAgICAgICBsb2cuZGVidWcoYFdvcmtlciAke3RoaXMuX3BpZH0gcmVjZWl2ZWQgU0lHSU5UIHNpZ25hbC5gKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfaW5pdGlhbGl6ZURlYnVnZ2VyKCkge1xyXG4gICAgICAgIHRoaXMuX2RlYnVnZ2VyID0gbmV3IERlYnVnZ2VyKHRoaXMuX3BpZCk7XHJcbiAgICAgICAgbGV0IHdoZW5EZWJ1Z2dlclJlYWR5ID0gZGVmZXIoKTtcclxuICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgLy8gaGFuZGxlIGRlYnVnZ2VyIGV2ZW50c1xyXG4gICAgICAgIHRoaXMuX2RlYnVnZ2VyLm9uKCdyZWFkeScsIGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgICAgICAvLyByZXN1bWUgdGhlIGZpcnN0IGJyZWFrcG9pbnQgd2hpY2ggaXMgYXV0b21hdGljYWxseSBhZGRlZCBieSB0aGUgZGVidWdnZXJcclxuICAgICAgICAgICAgaWYgKF90aGlzLl9kZWJ1Z2dlciAmJiBfdGhpcy5fZGVidWdnZXIuY29udGludWUpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9kZWJ1Z2dlci5jb250aW51ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHdoZW5EZWJ1Z2dlclJlYWR5LnJlc29sdmUoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9kZWJ1Z2dlci5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHtcclxuXHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignZGVidWdnZXIgb24gZXJyb3IgOicsIGVycik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2RlYnVnZ2VyOmVycm9yJywgT2JqZWN0LmFzc2lnbihlcnIsIHsgcGlkOiB0aGlzLl9waWQgfSkpO1xyXG4gICAgICAgICAgICAvLyByZWplY3QgdGhlIHByb21pc2Ugb25seSBpZiB3ZSBnb3QgYW4gZXJyb3IgcmlnaHQgYWZ0ZXIgX2RlYnVnZ2VyLmNvbm5lY3QoKSBjYWxsIGJlbG93IC0gd2UgbmVlZCB0aGlzIHRvIGluZGljYXRlIGRlYnVnZ2VyIGluaXRpYWxpemF0aW9uIGVycm9yXHJcbiAgICAgICAgICAgIGlmICghd2hlbkRlYnVnZ2VyUmVhZHkuaXNSZXNvbHZlZCkge1xyXG4gICAgICAgICAgICAgICAgd2hlbkRlYnVnZ2VyUmVhZHkucmVqZWN0KGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnZ2VyLm9uKCdicmVhaycsIGZ1bmN0aW9uKGJyZWFrcG9pbnREYXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZGVidWdnZXI6YnJlYWsnLCBicmVha3BvaW50RGF0YSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fZGVidWdnZXIub24oJ2JyZWFrRXJyb3InLCBhc3luYyBmdW5jdGlvbihicmVha0Vycm9yKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoYnJlYWtFcnJvciAmJiBicmVha0Vycm9yLm1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5fYnJlYWtwb2ludEVycm9ycy5pbmNsdWRlcyhicmVha0Vycm9yLm1lc3NhZ2UpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9icmVha3BvaW50RXJyb3JzLnB1c2goYnJlYWtFcnJvci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2RlYnVnZ2VyOmJyZWFrRXJyb3InLCBicmVha0Vycm9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsb2cuaW5mbyhgQ29ubmVjdGluZyB0byBkZWJ1Z2dlciBvbiBwb3J0ICR7dGhpcy5fZGVidWdQb3J0fS4uLmApO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kZWJ1Z2dlci5jb25uZWN0KHRoaXMuX2RlYnVnUG9ydCwgJzEyNy4wLjAuMScpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdDYW5ub3QgY29ubmVjdCB0byB0aGUgZGVidWdnZXI6ICcsIGUpO1xyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gJ0Nhbm5vdCBjb25uZWN0IHRvIHRoZSBkZWJ1Z2dlcjogJyArIGUubWVzc2FnZTtcclxuICAgICAgICAgICAgd2hlbkRlYnVnZ2VyUmVhZHkucmVqZWN0KG1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHdoZW5EZWJ1Z2dlclJlYWR5LnByb21pc2U7XHJcbiAgICB9XHJcbn0iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUdBO0FBQ0E7QUFBaUM7QUFIakMsTUFBTUEsR0FBRyxHQUFHLElBQUFDLGVBQU0sRUFBQyxlQUFlLENBQUM7QUFNbkMsTUFBTUMsTUFBTSxHQUFHQyxFQUFFLElBQUksSUFBSUMsT0FBTyxDQUFDQyxPQUFPLElBQUlDLFVBQVUs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