@appium/base-driver 8.3.0 → 8.4.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 (202) hide show
  1. package/build/lib/basedriver/capabilities.d.ts +80 -0
  2. package/build/lib/basedriver/capabilities.d.ts.map +1 -0
  3. package/build/lib/basedriver/capabilities.js +12 -13
  4. package/build/lib/basedriver/commands/event.d.ts +9 -0
  5. package/build/lib/basedriver/commands/event.d.ts.map +1 -0
  6. package/build/lib/basedriver/commands/event.js +21 -23
  7. package/build/lib/basedriver/commands/find.d.ts +11 -0
  8. package/build/lib/basedriver/commands/find.d.ts.map +1 -0
  9. package/build/lib/basedriver/commands/find.js +42 -37
  10. package/build/lib/basedriver/commands/index.d.ts +8 -0
  11. package/build/lib/basedriver/commands/index.d.ts.map +1 -0
  12. package/build/lib/basedriver/commands/index.js +17 -16
  13. package/build/lib/basedriver/commands/log.d.ts +12 -0
  14. package/build/lib/basedriver/commands/log.d.ts.map +1 -0
  15. package/build/lib/basedriver/commands/log.js +23 -27
  16. package/build/lib/basedriver/commands/session.d.ts +11 -0
  17. package/build/lib/basedriver/commands/session.d.ts.map +1 -0
  18. package/build/lib/basedriver/commands/session.js +21 -149
  19. package/build/lib/basedriver/commands/settings.d.ts +10 -0
  20. package/build/lib/basedriver/commands/settings.d.ts.map +1 -0
  21. package/build/lib/basedriver/commands/settings.js +19 -19
  22. package/build/lib/basedriver/commands/timeout.d.ts +8 -0
  23. package/build/lib/basedriver/commands/timeout.d.ts.map +1 -0
  24. package/build/lib/basedriver/commands/timeout.js +118 -139
  25. package/build/lib/basedriver/core.d.ts +235 -0
  26. package/build/lib/basedriver/core.d.ts.map +1 -0
  27. package/build/lib/basedriver/core.js +283 -0
  28. package/build/lib/basedriver/desired-caps.d.ts +5 -0
  29. package/build/lib/basedriver/desired-caps.d.ts.map +1 -0
  30. package/build/lib/basedriver/desired-caps.js +2 -4
  31. package/build/lib/basedriver/device-settings.d.ts +32 -0
  32. package/build/lib/basedriver/device-settings.d.ts.map +1 -0
  33. package/build/lib/basedriver/device-settings.js +20 -14
  34. package/build/lib/basedriver/driver.d.ts +83 -0
  35. package/build/lib/basedriver/driver.d.ts.map +1 -0
  36. package/build/lib/basedriver/driver.js +101 -256
  37. package/build/lib/basedriver/helpers.d.ts +132 -0
  38. package/build/lib/basedriver/helpers.d.ts.map +1 -0
  39. package/build/lib/basedriver/helpers.js +16 -2
  40. package/build/lib/basedriver/logger.d.ts +3 -0
  41. package/build/lib/basedriver/logger.d.ts.map +1 -0
  42. package/build/lib/basedriver/logger.js +2 -4
  43. package/build/lib/constants.d.ts +9 -0
  44. package/build/lib/constants.d.ts.map +1 -0
  45. package/build/lib/constants.js +2 -4
  46. package/build/lib/express/crash.d.ts +3 -0
  47. package/build/lib/express/crash.d.ts.map +1 -0
  48. package/build/lib/express/crash.js +2 -4
  49. package/build/lib/express/express-logging.d.ts +3 -0
  50. package/build/lib/express/express-logging.d.ts.map +1 -0
  51. package/build/lib/express/express-logging.js +2 -4
  52. package/build/lib/express/idempotency.d.ts +2 -0
  53. package/build/lib/express/idempotency.d.ts.map +1 -0
  54. package/build/lib/express/idempotency.js +2 -4
  55. package/build/lib/express/logger.d.ts +3 -0
  56. package/build/lib/express/logger.d.ts.map +1 -0
  57. package/build/lib/express/logger.js +2 -4
  58. package/build/lib/express/middleware.d.ts +9 -0
  59. package/build/lib/express/middleware.d.ts.map +1 -0
  60. package/build/lib/express/middleware.js +2 -4
  61. package/build/lib/express/server.d.ts +10 -0
  62. package/build/lib/express/server.d.ts.map +1 -0
  63. package/build/lib/express/server.js +2 -4
  64. package/build/lib/express/static.d.ts +6 -0
  65. package/build/lib/express/static.d.ts.map +1 -0
  66. package/build/lib/express/static.js +2 -4
  67. package/build/lib/express/websocket.d.ts +64 -0
  68. package/build/lib/express/websocket.d.ts.map +1 -0
  69. package/build/lib/express/websocket.js +40 -41
  70. package/build/lib/helpers/capabilities.d.ts +13 -0
  71. package/build/lib/helpers/capabilities.d.ts.map +1 -0
  72. package/build/lib/helpers/capabilities.js +40 -2
  73. package/build/lib/index.d.ts +183 -0
  74. package/build/lib/index.d.ts.map +1 -0
  75. package/build/lib/index.js +41 -23
  76. package/build/lib/jsonwp-proxy/protocol-converter.d.ts +48 -0
  77. package/build/lib/jsonwp-proxy/protocol-converter.d.ts.map +1 -0
  78. package/build/lib/jsonwp-proxy/protocol-converter.js +2 -4
  79. package/build/lib/jsonwp-proxy/proxy.d.ts +41 -0
  80. package/build/lib/jsonwp-proxy/proxy.d.ts.map +1 -0
  81. package/build/lib/jsonwp-proxy/proxy.js +25 -9
  82. package/build/lib/jsonwp-status/status.d.ts +159 -0
  83. package/build/lib/jsonwp-status/status.d.ts.map +1 -0
  84. package/build/lib/jsonwp-status/status.js +2 -4
  85. package/build/lib/protocol/errors.d.ts +310 -0
  86. package/build/lib/protocol/errors.d.ts.map +1 -0
  87. package/build/lib/protocol/errors.js +82 -5
  88. package/build/lib/protocol/helpers.d.ts +22 -0
  89. package/build/lib/protocol/helpers.d.ts.map +1 -0
  90. package/build/lib/protocol/helpers.js +2 -4
  91. package/build/lib/protocol/index.d.ts +16 -0
  92. package/build/lib/protocol/index.d.ts.map +1 -0
  93. package/build/lib/protocol/index.js +8 -10
  94. package/build/lib/protocol/protocol.d.ts +11 -0
  95. package/build/lib/protocol/protocol.d.ts.map +1 -0
  96. package/build/lib/protocol/protocol.js +3 -9
  97. package/build/lib/protocol/routes.d.ts +6 -0
  98. package/build/lib/protocol/routes.d.ts.map +1 -0
  99. package/build/lib/protocol/routes.js +18 -4
  100. package/build/lib/protocol/validators.d.ts +8 -0
  101. package/build/lib/protocol/validators.d.ts.map +1 -0
  102. package/build/lib/protocol/validators.js +2 -4
  103. package/build/test/basedriver/README.md +5 -0
  104. package/build/test/basedriver/driver-e2e-tests.js +2 -4
  105. package/build/test/basedriver/driver-tests.js +31 -6
  106. package/build/test/basedriver/index.js +2 -4
  107. package/build/test/e2e/basedriver/driver.e2e.spec.js +15 -0
  108. package/build/test/e2e/basedriver/helpers.e2e.spec.js +192 -0
  109. package/build/test/e2e/basedriver/websockets.e2e.spec.js +87 -0
  110. package/build/test/e2e/express/server.e2e.spec.js +159 -0
  111. package/build/test/e2e/jsonwp-proxy/proxy.e2e.spec.js +59 -0
  112. package/build/test/e2e/protocol/fake-driver.js +163 -0
  113. package/build/test/e2e/protocol/helpers.js +25 -0
  114. package/build/test/e2e/protocol/protocol.e2e.spec.js +1186 -0
  115. package/build/test/helpers.js +2 -4
  116. package/build/test/unit/basedriver/capabilities.spec.js +672 -0
  117. package/build/test/unit/basedriver/capability.spec.js +353 -0
  118. package/build/test/unit/basedriver/commands/event.spec.js +110 -0
  119. package/build/test/unit/basedriver/commands/log.spec.js +92 -0
  120. package/build/test/unit/basedriver/driver.spec.js +15 -0
  121. package/build/test/unit/basedriver/helpers.spec.js +151 -0
  122. package/build/test/unit/basedriver/timeout.spec.js +135 -0
  123. package/build/test/unit/express/server.spec.js +155 -0
  124. package/build/test/unit/express/static.spec.js +26 -0
  125. package/build/test/unit/jsonwp-proxy/mock-request.js +91 -0
  126. package/build/test/unit/jsonwp-proxy/protocol-converter.spec.js +171 -0
  127. package/build/test/unit/jsonwp-proxy/proxy.spec.js +292 -0
  128. package/build/test/unit/jsonwp-proxy/url.spec.js +165 -0
  129. package/build/test/unit/jsonwp-status/status.spec.js +34 -0
  130. package/build/test/unit/protocol/errors.spec.js +390 -0
  131. package/build/test/unit/protocol/routes.spec.js +80 -0
  132. package/build/test/unit/protocol/validator.spec.js +149 -0
  133. package/build/tsconfig.tsbuildinfo +1 -0
  134. package/lib/basedriver/capabilities.js +49 -10
  135. package/lib/basedriver/commands/event.js +49 -31
  136. package/lib/basedriver/commands/find.js +108 -43
  137. package/lib/basedriver/commands/index.js +25 -19
  138. package/lib/basedriver/commands/log.js +60 -33
  139. package/lib/basedriver/commands/session.js +39 -141
  140. package/lib/basedriver/commands/settings.js +33 -13
  141. package/lib/basedriver/commands/timeout.js +153 -153
  142. package/lib/basedriver/core.js +497 -0
  143. package/lib/basedriver/desired-caps.js +1 -1
  144. package/lib/basedriver/device-settings.js +47 -12
  145. package/lib/basedriver/driver.js +272 -383
  146. package/lib/basedriver/helpers.js +18 -2
  147. package/lib/express/websocket.js +35 -32
  148. package/lib/helpers/capabilities.js +60 -1
  149. package/lib/index.js +16 -12
  150. package/lib/jsonwp-proxy/proxy.js +26 -6
  151. package/lib/protocol/errors.js +42 -42
  152. package/lib/protocol/index.js +4 -4
  153. package/lib/protocol/protocol.js +1 -3
  154. package/lib/protocol/routes.js +9 -0
  155. package/package.json +22 -14
  156. package/test/basedriver/README.md +5 -0
  157. package/test/basedriver/driver-e2e-tests.js +1 -1
  158. package/test/basedriver/driver-tests.js +31 -2
  159. package/build/test/basedriver/capabilities-specs.js +0 -674
  160. package/build/test/basedriver/capability-specs.js +0 -355
  161. package/build/test/basedriver/commands/event-specs.js +0 -112
  162. package/build/test/basedriver/commands/log-specs.js +0 -87
  163. package/build/test/basedriver/driver-e2e-specs.js +0 -17
  164. package/build/test/basedriver/driver-specs.js +0 -17
  165. package/build/test/basedriver/helpers-e2e-specs.js +0 -194
  166. package/build/test/basedriver/helpers-specs.js +0 -153
  167. package/build/test/basedriver/timeout-specs.js +0 -137
  168. package/build/test/basedriver/websockets-e2e-specs.js +0 -84
  169. package/build/test/express/server-e2e-specs.js +0 -161
  170. package/build/test/express/server-specs.js +0 -157
  171. package/build/test/express/static-specs.js +0 -28
  172. package/build/test/jsonwp-proxy/mock-request.js +0 -93
  173. package/build/test/jsonwp-proxy/protocol-converter-specs.js +0 -173
  174. package/build/test/jsonwp-proxy/proxy-e2e-specs.js +0 -61
  175. package/build/test/jsonwp-proxy/proxy-specs.js +0 -294
  176. package/build/test/jsonwp-proxy/url-specs.js +0 -167
  177. package/build/test/jsonwp-status/status-specs.js +0 -36
  178. package/build/test/protocol/errors-specs.js +0 -388
  179. package/build/test/protocol/fake-driver.js +0 -165
  180. package/build/test/protocol/helpers.js +0 -27
  181. package/build/test/protocol/protocol-e2e-specs.js +0 -1188
  182. package/build/test/protocol/routes-specs.js +0 -82
  183. package/build/test/protocol/validator-specs.js +0 -151
  184. package/index.d.ts +0 -386
  185. package/test/basedriver/capabilities-specs.js +0 -537
  186. package/test/basedriver/capability-specs.js +0 -383
  187. package/test/basedriver/commands/event-specs.js +0 -74
  188. package/test/basedriver/commands/log-specs.js +0 -79
  189. package/test/basedriver/driver-e2e-specs.js +0 -8
  190. package/test/basedriver/driver-specs.js +0 -8
  191. package/test/basedriver/fixtures/BadZippedApp.zip +0 -1
  192. package/test/basedriver/fixtures/FakeAndroidApp.apk +0 -1
  193. package/test/basedriver/fixtures/FakeAndroidApp.asd +0 -0
  194. package/test/basedriver/fixtures/FakeIOSApp.app +0 -1
  195. package/test/basedriver/fixtures/FakeIOSApp.app.zip +0 -0
  196. package/test/basedriver/fixtures/FakeIOSApp.ipa +0 -0
  197. package/test/basedriver/fixtures/custom-element-finder-bad.js +0 -5
  198. package/test/basedriver/fixtures/custom-element-finder.js +0 -29
  199. package/test/basedriver/helpers-e2e-specs.js +0 -187
  200. package/test/basedriver/helpers-specs.js +0 -137
  201. package/test/basedriver/timeout-specs.js +0 -128
  202. package/test/basedriver/websockets-e2e-specs.js +0 -75
@@ -1,388 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- require("source-map-support/register");
6
-
7
- var _lib = require("../../lib");
8
-
9
- var _errors = require("../../lib/protocol/errors");
10
-
11
- var _lodash = _interopRequireDefault(require("lodash"));
12
-
13
- var _httpStatusCodes = require("http-status-codes");
14
-
15
- let errorsList = [{
16
- errorName: 'NoSuchDriverError',
17
- errorMsg: 'A session is either terminated or not started',
18
- error: 'invalid session id',
19
- errorCode: 6
20
- }, {
21
- errorName: 'ElementClickInterceptedError',
22
- errorMsg: 'The Element Click command could not be completed because the element receiving the events is obscuring the element that was requested clicked',
23
- error: 'element click intercepted'
24
- }, {
25
- errorName: 'ElementNotInteractableError',
26
- errorMsg: 'A command could not be completed because the element is not pointer- or keyboard interactable',
27
- error: 'element not interactable'
28
- }, {
29
- errorName: 'InsecureCertificateError',
30
- errorMsg: 'Navigation caused the user agent to hit a certificate warning, which is usually the result of an expired or invalid TLS certificate',
31
- error: 'insecure certificate'
32
- }, {
33
- errorName: 'InvalidArgumentError',
34
- errorMsg: 'The arguments passed to the command are either invalid or malformed',
35
- error: 'invalid argument'
36
- }, {
37
- errorName: 'NoSuchElementError',
38
- errorMsg: 'An element could not be located on the page using the ' + 'given search parameters.',
39
- error: 'no such element',
40
- errorCode: 7
41
- }, {
42
- errorName: 'NoSuchFrameError',
43
- errorMsg: 'A request to switch to a frame could not be satisfied ' + 'because the frame could not be found.',
44
- error: 'no such frame',
45
- errorCode: 8
46
- }, {
47
- errorName: 'UnknownCommandError',
48
- errorMsg: 'The requested resource could not be found, or a request ' + 'was received using an HTTP method that is not supported by ' + 'the mapped resource.',
49
- error: 'unknown command',
50
- errorCode: 9
51
- }, {
52
- errorName: 'StaleElementReferenceError',
53
- errorMsg: 'An element command failed because the referenced element is ' + 'no longer attached to the DOM.',
54
- error: 'stale element reference',
55
- errorCode: 10
56
- }, {
57
- errorName: 'ElementNotVisibleError',
58
- errorMsg: 'An element command could not be completed because the ' + 'element is not visible on the page.',
59
- errorCode: 11
60
- }, {
61
- errorName: 'InvalidElementStateError',
62
- errorMsg: 'An element command could not be completed because the element ' + 'is in an invalid state (e.g. attempting to click a disabled ' + 'element).',
63
- error: 'invalid element state',
64
- errorCode: 12
65
- }, {
66
- errorName: 'UnknownError',
67
- errorMsg: 'An unknown server-side error occurred while processing the ' + 'command.',
68
- error: 'unknown error',
69
- errorCode: 13
70
- }, {
71
- errorName: 'ElementIsNotSelectableError',
72
- errorMsg: 'An attempt was made to select an element that cannot ' + 'be selected.',
73
- error: 'element not selectable',
74
- errorCode: 15
75
- }, {
76
- errorName: 'JavaScriptError',
77
- errorMsg: 'An error occurred while executing user supplied JavaScript.',
78
- error: 'javascript error',
79
- errorCode: 17
80
- }, {
81
- errorName: 'XPathLookupError',
82
- errorMsg: 'An error occurred while searching for an element by XPath.',
83
- errorCode: 19
84
- }, {
85
- errorName: 'TimeoutError',
86
- errorMsg: 'An operation did not complete before its timeout expired.',
87
- error: 'timeout',
88
- errorCode: 21
89
- }, {
90
- errorName: 'NoSuchWindowError',
91
- errorMsg: 'A request to switch to a different window could not be ' + 'satisfied because the window could not be found.',
92
- error: 'no such window',
93
- errorCode: 23
94
- }, {
95
- errorName: 'InvalidCookieDomainError',
96
- errorMsg: 'An illegal attempt was made to set a cookie under a different ' + 'domain than the current page.',
97
- error: 'invalid cookie domain',
98
- errorCode: 24
99
- }, {
100
- errorName: 'InvalidCoordinatesError',
101
- errorMsg: 'The coordinates provided to an interactions operation are invalid.',
102
- error: 'invalid coordinates'
103
- }, {
104
- errorName: 'UnableToSetCookieError',
105
- errorMsg: `A request to set a cookie's value could not be satisfied.`,
106
- error: 'unable to set cookie',
107
- errorCode: 25
108
- }, {
109
- errorName: 'UnexpectedAlertOpenError',
110
- errorMsg: 'A modal dialog was open, blocking this operation',
111
- error: 'unexpected alert open',
112
- errorCode: 26
113
- }, {
114
- errorName: 'NoAlertOpenError',
115
- errorMsg: 'An attempt was made to operate on a modal dialog when one was ' + 'not open.',
116
- errorCode: 27
117
- }, {
118
- errorName: 'ScriptTimeoutError',
119
- errorMsg: 'A script did not complete before its timeout expired.',
120
- error: 'script timeout',
121
- errorCode: 28
122
- }, {
123
- errorName: 'InvalidElementCoordinatesError',
124
- errorMsg: 'The coordinates provided to an interactions operation are ' + 'invalid.',
125
- errorCode: 29
126
- }, {
127
- errorName: 'IMENotAvailableError',
128
- errorMsg: 'IME was not available.',
129
- errorCode: 30
130
- }, {
131
- errorName: 'IMEEngineActivationFailedError',
132
- errorMsg: 'An IME engine could not be started.',
133
- errorCode: 31
134
- }, {
135
- errorName: 'InvalidSelectorError',
136
- errorMsg: 'Argument was an invalid selector (e.g. XPath/CSS).',
137
- error: 'invalid selector',
138
- errorCode: 32
139
- }, {
140
- errorName: 'SessionNotCreatedError',
141
- errorMsg: 'A new session could not be created.',
142
- error: 'session not created',
143
- errorCode: 33
144
- }, {
145
- errorName: 'MoveTargetOutOfBoundsError',
146
- errorMsg: 'Target provided for a move action is out of bounds.',
147
- error: 'move target out of bounds',
148
- errorCode: 34
149
- }, {
150
- errorName: 'NoSuchAlertError',
151
- errorMsg: 'An attempt was made to operate on a modal dialog when one was not open.',
152
- error: 'no such alert'
153
- }, {
154
- errorName: 'NoSuchCookieError',
155
- errorMsg: 'No cookie matching the given path name was found amongst the associated cookies of the current browsing context’s active document',
156
- error: 'no such cookie'
157
- }, {
158
- errorName: 'NotYetImplementedError',
159
- errorMsg: 'Method has not yet been implemented',
160
- error: 'unknown method',
161
- errorCode: 405
162
- }, {
163
- errorName: 'UnknownCommandError',
164
- errorMsg: 'The requested resource could not be found, or a request was received using an HTTP method that is not supported by the mapped resource.',
165
- error: 'unknown command'
166
- }, {
167
- errorName: 'UnknownMethodError',
168
- errorMsg: 'The requested command matched a known URL but did not match an method for that URL',
169
- error: 'unknown method'
170
- }, {
171
- errorName: 'UnsupportedOperationError',
172
- errorMsg: 'A server-side error occurred. Command cannot be supported.',
173
- error: 'unsupported operation'
174
- }];
175
- describe('errors', function () {
176
- for (let error of errorsList) {
177
- it(error.errorName + ' should have a JSONWP code or W3C code and message', function () {
178
- if (error.errorCode) {
179
- new _lib.errors[error.errorName]().should.have.property('jsonwpCode', error.errorCode);
180
- } else {
181
- new _lib.errors[error.errorName]().should.have.property('error', error.error);
182
- }
183
-
184
- new _lib.errors[error.errorName]().should.have.property('message', error.errorMsg);
185
- });
186
- }
187
-
188
- it('BadParametersError should not have code and should have messg', function () {
189
- new _lib.errors.BadParametersError().should.not.have.property('jsonwpCode');
190
- new _lib.errors.BadParametersError().should.have.property('message');
191
- });
192
- it('ProxyRequestError should have message and jsonwp', function () {
193
- new _lib.errors.ProxyRequestError().should.have.property('jsonwp');
194
- new _lib.errors.ProxyRequestError().should.have.property('message');
195
- });
196
- });
197
- describe('errorFromMJSONWPStatusCode', function () {
198
- for (let error of errorsList) {
199
- if (error.errorName !== 'NotYetImplementedError') {
200
- it(error.errorCode + ' should return correct error', function () {
201
- if (error.errorCode) {
202
- (0, _lib.errorFromMJSONWPStatusCode)(error.errorCode).should.have.property('jsonwpCode', error.errorCode);
203
- (0, _lib.errorFromMJSONWPStatusCode)(error.errorCode).should.have.property('message', error.errorMsg);
204
-
205
- if (!_lodash.default.includes([13, 33], error.errorCode)) {
206
- (0, _lib.errorFromMJSONWPStatusCode)(error.errorCode, 'abcd').should.have.property('jsonwpCode', error.errorCode);
207
- (0, _lib.errorFromMJSONWPStatusCode)(error.errorCode, 'abcd').should.have.property('message', 'abcd');
208
- }
209
- } else {
210
- (0, _lib.isErrorType)((0, _lib.errorFromMJSONWPStatusCode)(error.errorCode), _lib.errors.UnknownError).should.be.true;
211
- }
212
- });
213
- }
214
- }
215
-
216
- it('should throw unknown error for unknown code', function () {
217
- (0, _lib.errorFromMJSONWPStatusCode)(99).should.have.property('jsonwpCode', 13);
218
- (0, _lib.errorFromMJSONWPStatusCode)(99).should.have.property('message', 'An unknown server-side error occurred ' + 'while processing the command.');
219
- });
220
- });
221
- describe('errorFromW3CJsonCode', function () {
222
- for (let error of errorsList) {
223
- if (error.errorName !== 'NotYetImplementedError') {
224
- it(error.errorName + ' should return correct error', function () {
225
- const {
226
- error: w3cError
227
- } = error;
228
-
229
- if (w3cError) {
230
- (0, _lib.errorFromW3CJsonCode)(w3cError).error.should.equal(error.error);
231
- (0, _lib.errorFromW3CJsonCode)(w3cError).should.have.property('message', error.errorMsg);
232
- } else {
233
- (0, _lib.isErrorType)((0, _lib.errorFromW3CJsonCode)(w3cError), _lib.errors.UnknownError).should.be.true;
234
- }
235
- });
236
- }
237
- }
238
-
239
- it('should parse unknown errors', function () {
240
- (0, _lib.isErrorType)((0, _lib.errorFromW3CJsonCode)('not a real error code'), _lib.errors.UnknownError).should.be.true;
241
- (0, _lib.errorFromW3CJsonCode)('not a real error code').message.should.match(/An unknown server-side error occurred/);
242
- (0, _lib.errorFromW3CJsonCode)('not a real error code').error.should.equal('unknown error');
243
- });
244
- });
245
- describe('w3c Status Codes', function () {
246
- it('should match the correct error codes', function () {
247
- let non400Errors = [['NoSuchDriverError', 404], ['NoSuchFrameError', 404], ['NoAlertOpenError', 404], ['NoSuchWindowError', 404], ['StaleElementReferenceError', 404], ['JavaScriptError', 500], ['MoveTargetOutOfBoundsError', 500], ['NoSuchCookieError', 404], ['NoSuchElementError', 404], ['ScriptTimeoutError', 408], ['SessionNotCreatedError', 500], ['TimeoutError', 408], ['UnableToSetCookieError', 500], ['UnableToCaptureScreen', 500], ['UnexpectedAlertOpenError', 500], ['UnknownCommandError', 404], ['UnknownError', 500], ['UnknownMethodError', 405], ['UnsupportedOperationError', 500]];
248
-
249
- for (let [errorName, expectedErrorCode] of non400Errors) {
250
- _lib.errors[errorName].should.exist;
251
- new _lib.errors[errorName]().should.have.property('w3cStatus', expectedErrorCode);
252
- }
253
-
254
- new _lib.errors.ElementClickInterceptedError().should.have.property('w3cStatus', 400);
255
- });
256
- });
257
- describe('.getResponseForW3CError', function () {
258
- it('should return an error, message and stacktrace for just a generic exception', function () {
259
- try {
260
- throw new Error('Some random error');
261
- } catch (e) {
262
- const [httpStatus, httpResponseBody] = (0, _errors.getResponseForW3CError)(e);
263
- httpStatus.should.equal(500);
264
- const {
265
- error,
266
- message,
267
- stacktrace
268
- } = httpResponseBody.value;
269
- message.should.match(/Some random error/);
270
- error.should.equal('unknown error');
271
- stacktrace.should.match(/at getResponseForW3CError/);
272
- stacktrace.should.match(/Some random error/);
273
- stacktrace.should.match(/errors-specs.js/);
274
- }
275
- });
276
- it('should return an error, message and stacktrace for a NoSuchElementError', function () {
277
- const noSuchElementError = new _lib.errors.NoSuchElementError('specific error message');
278
- const [httpStatus, httpResponseBody] = (0, _errors.getResponseForW3CError)(noSuchElementError);
279
- httpStatus.should.equal(404);
280
- const {
281
- error,
282
- message,
283
- stacktrace
284
- } = httpResponseBody.value;
285
- error.should.equal('no such element');
286
- message.should.match(/specific error message/);
287
- stacktrace.should.match(/errors-specs.js/);
288
- });
289
- it('should handle BadParametersError', function () {
290
- const badParamsError = new _lib.errors.BadParametersError('__FOO__', '__BAR__', '__HELLO_WORLD__');
291
- const [httpStatus, httpResponseBody] = (0, _errors.getResponseForW3CError)(badParamsError);
292
- httpStatus.should.equal(400);
293
- const {
294
- error,
295
- message,
296
- stacktrace
297
- } = httpResponseBody.value;
298
- error.should.equal('invalid argument');
299
- message.should.match(/__BAR__/);
300
- message.should.match(/__HELLO_WORLD__/);
301
- stacktrace.should.match(/errors-specs.js/);
302
- });
303
- it('should translate JSONWP errors', function () {
304
- const [httpStatus, httpResponseBody] = (0, _errors.getResponseForW3CError)({
305
- status: 7,
306
- value: 'My custom message',
307
- sessionId: 'Fake Session Id'
308
- });
309
- httpStatus.should.equal(404);
310
- const {
311
- error,
312
- message,
313
- stacktrace
314
- } = httpResponseBody.value;
315
- message.should.equal('My custom message');
316
- error.should.equal('no such element');
317
- stacktrace.should.exist;
318
- });
319
- });
320
- describe('.getActualError', function () {
321
- describe('MJSONWP', function () {
322
- it('should map a status code 7 no such element error as a NoSuchElementError', function () {
323
- const actualError = new _lib.errors.ProxyRequestError('Error message does not matter', {
324
- value: 'does not matter',
325
- status: 7
326
- }).getActualError();
327
- (0, _lib.isErrorType)(actualError, _lib.errors.NoSuchElementError).should.be.true;
328
- });
329
- it('should map a status code 10, StaleElementReferenceError', function () {
330
- const actualError = new _lib.errors.ProxyRequestError('Error message does not matter', {
331
- value: 'Does not matter',
332
- status: 10
333
- }).getActualError();
334
- (0, _lib.isErrorType)(actualError, _lib.errors.StaleElementReferenceError).should.be.true;
335
- });
336
- it('should map an unknown error to UnknownError', function () {
337
- const actualError = new _lib.errors.ProxyRequestError('Error message does not matter', {
338
- value: 'Does not matter',
339
- status: -100
340
- }).getActualError();
341
- (0, _lib.isErrorType)(actualError, _lib.errors.UnknownError).should.be.true;
342
- });
343
- it('should parse a JSON string', function () {
344
- const actualError = new _lib.errors.ProxyRequestError('Error message does not matter', JSON.stringify({
345
- value: 'Does not matter',
346
- status: -100
347
- })).getActualError();
348
- (0, _lib.isErrorType)(actualError, _lib.errors.UnknownError).should.be.true;
349
- });
350
- });
351
- describe('W3C', function () {
352
- it('should map a 404 no such element error as a NoSuchElementError', function () {
353
- const actualError = new _lib.errors.ProxyRequestError('Error message does not matter', {
354
- value: {
355
- error: _lib.errors.NoSuchElementError.error()
356
- }
357
- }, _httpStatusCodes.StatusCodes.NOT_FOUND).getActualError();
358
- (0, _lib.isErrorType)(actualError, _lib.errors.NoSuchElementError).should.be.true;
359
- });
360
- it('should map a 400 StaleElementReferenceError', function () {
361
- const actualError = new _lib.errors.ProxyRequestError('Error message does not matter', {
362
- value: {
363
- error: _lib.errors.StaleElementReferenceError.error()
364
- }
365
- }, _httpStatusCodes.StatusCodes.BAD_REQUEST).getActualError();
366
- (0, _lib.isErrorType)(actualError, _lib.errors.StaleElementReferenceError).should.be.true;
367
- });
368
- it('should map an unknown error to UnknownError', function () {
369
- const actualError = new _lib.errors.ProxyRequestError('Error message does not matter', null, {
370
- value: {
371
- error: 'Not a valid w3c JSON code'
372
- }
373
- }, 456).getActualError();
374
- (0, _lib.isErrorType)(actualError, _lib.errors.UnknownError).should.be.true;
375
- });
376
- it('should parse a JSON string', function () {
377
- const actualError = new _lib.errors.ProxyRequestError('Error message does not matter', JSON.stringify({
378
- value: {
379
- error: _lib.errors.StaleElementReferenceError.error()
380
- }
381
- }), _httpStatusCodes.StatusCodes.BAD_REQUEST).getActualError();
382
- (0, _lib.isErrorType)(actualError, _lib.errors.StaleElementReferenceError).should.be.true;
383
- });
384
- });
385
- });require('source-map-support').install();
386
-
387
-
388
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvcHJvdG9jb2wvZXJyb3JzLXNwZWNzLmpzIl0sIm5hbWVzIjpbImVycm9yc0xpc3QiLCJlcnJvck5hbWUiLCJlcnJvck1zZyIsImVycm9yIiwiZXJyb3JDb2RlIiwiZGVzY3JpYmUiLCJpdCIsImVycm9ycyIsInNob3VsZCIsImhhdmUiLCJwcm9wZXJ0eSIsIkJhZFBhcmFtZXRlcnNFcnJvciIsIm5vdCIsIlByb3h5UmVxdWVzdEVycm9yIiwiXyIsImluY2x1ZGVzIiwiVW5rbm93bkVycm9yIiwiYmUiLCJ0cnVlIiwidzNjRXJyb3IiLCJlcXVhbCIsIm1lc3NhZ2UiLCJtYXRjaCIsIm5vbjQwMEVycm9ycyIsImV4cGVjdGVkRXJyb3JDb2RlIiwiZXhpc3QiLCJFbGVtZW50Q2xpY2tJbnRlcmNlcHRlZEVycm9yIiwiRXJyb3IiLCJlIiwiaHR0cFN0YXR1cyIsImh0dHBSZXNwb25zZUJvZHkiLCJzdGFja3RyYWNlIiwidmFsdWUiLCJub1N1Y2hFbGVtZW50RXJyb3IiLCJOb1N1Y2hFbGVtZW50RXJyb3IiLCJiYWRQYXJhbXNFcnJvciIsInN0YXR1cyIsInNlc3Npb25JZCIsImFjdHVhbEVycm9yIiwiZ2V0QWN0dWFsRXJyb3IiLCJTdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJIVFRQU3RhdHVzQ29kZXMiLCJOT1RfRk9VTkQiLCJCQURfUkVRVUVTVCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBS0EsSUFBSUEsVUFBVSxHQUFHLENBQ2Y7QUFDRUMsRUFBQUEsU0FBUyxFQUFFLG1CQURiO0FBRUVDLEVBQUFBLFFBQVEsRUFBRSwrQ0FGWjtBQUdFQyxFQUFBQSxLQUFLLEVBQUUsb0JBSFQ7QUFJRUMsRUFBQUEsU0FBUyxFQUFFO0FBSmIsQ0FEZSxFQU9mO0FBQ0VILEVBQUFBLFNBQVMsRUFBRSw4QkFEYjtBQUVFQyxFQUFBQSxRQUFRLEVBQUUsK0lBRlo7QUFHRUMsRUFBQUEs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LCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBlcnJvcnMsIGVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlLCBlcnJvckZyb21XM0NKc29uQ29kZSwgaXNFcnJvclR5cGVcbn0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCB7IGdldFJlc3BvbnNlRm9yVzNDRXJyb3IgfSBmcm9tICcuLi8uLi9saWIvcHJvdG9jb2wvZXJyb3JzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBTdGF0dXNDb2RlcyBhcyBIVFRQU3RhdHVzQ29kZXMgfSBmcm9tICdodHRwLXN0YXR1cy1jb2Rlcyc7XG5cblxuLy8gRXJyb3IgY29kZXMgYW5kIG1lc3NhZ2VzIGhhdmUgYmVlbiBhZGRlZCBhY2NvcmRpbmcgdG8gSnNvbldpcmVQcm90b2NvbCBzZWVcbi8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3Avc2VsZW5pdW0vd2lraS9Kc29uV2lyZVByb3RvY29sI1Jlc3BvbnNlX1N0YXR1c19Db2Rlc1xubGV0IGVycm9yc0xpc3QgPSBbXG4gIHtcbiAgICBlcnJvck5hbWU6ICdOb1N1Y2hEcml2ZXJFcnJvcicsXG4gICAgZXJyb3JNc2c6ICdBIHNlc3Npb24gaXMgZWl0aGVyIHRlcm1pbmF0ZWQgb3Igbm90IHN0YXJ0ZWQnLFxuICAgIGVycm9yOiAnaW52YWxpZCBzZXNzaW9uIGlkJyxcbiAgICBlcnJvckNvZGU6IDZcbiAgfSxcbiAge1xuICAgIGVycm9yTmFtZTogJ0VsZW1lbnRDbGlja0ludGVyY2VwdGVkRXJyb3InLFxuICAgIGVycm9yTXNnOiAnVGhlIEVsZW1lbnQgQ2xpY2sgY29tbWFuZCBjb3VsZCBub3QgYmUgY29tcGxldGVkIGJlY2F1c2UgdGhlIGVsZW1lbnQgcmVjZWl2aW5nIHRoZSBldmVudHMgaXMgb2JzY3VyaW5nIHRoZSBlbGVtZW50IHRoYXQgd2FzIHJlcXVlc3RlZCBjbGlja2VkJyxcbiAgICBlcnJvcjogJ2VsZW1lbnQgY2xpY2sgaW50ZXJjZXB0ZWQnLFxuICB9LFxuICB7XG4gICAgZXJyb3JOYW1lOiAnRWxlbWVudE5vdEludGVyYWN0YWJsZUVycm9yJyxcbiAgICBlcnJvck1zZzogJ0EgY29tbWFuZCBjb3VsZCBub3QgYmUgY29tcGxldGVkIGJlY2F1c2UgdGhlIGVsZW1lbnQgaXMgbm90IHBvaW50ZXItIG9yIGtleWJvYXJkIGludGVyYWN0YWJsZScsXG4gICAgZXJyb3I6ICdlbGVtZW50IG5vdCBpbnRlcmFjdGFibGUnLFxuICB9LFxuICB7XG4gICAgZXJyb3JOYW1lOiAnSW5zZWN1cmVDZXJ0aWZpY2F0ZUVycm9yJyxcbiAgICBlcnJvck1zZzogJ05hdmlnYXRpb24gY2F1c2VkIHRoZSB1c2VyIGFnZW50IHRvIGhpdCBhIGNlcnRpZmljYXRlIHdhcm5pbmcsIHdoaWNoIGlzIHVzdWFsbHkgdGhlIHJlc3VsdCBvZiBhbiBleHBpcmVkIG9yIGludmFsaWQgVExTIGNlcnRpZmljYXRlJyxcbiAgICBlcnJvcjogJ2luc2VjdXJlIGNlcnRpZmljYXRlJyxcbiAgfSxcbiAge1xuICAgIGVycm9yTmFtZTogJ0ludmFsaWRBcmd1bWVudEVycm9yJyxcbiAgICBlcnJvck1zZzogJ1RoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBjb21tYW5kIGFyZSBlaXRoZXIgaW52YWxpZCBvciBtYWxmb3JtZWQnLFxuICAgIGVycm9yOiAnaW52YWxpZCBhcmd1bWVudCcsXG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdOb1N1Y2hFbGVtZW50RXJyb3InLFxuICAgIGVycm9yTXNnOiAnQW4gZWxlbWVudCBjb3VsZCBub3QgYmUgbG9jYXRlZCBvbiB0aGUgcGFnZSB1c2luZyB0aGUgJyArXG4gICAgICAgICdnaXZlbiBzZWFyY2ggcGFyYW1ldGVycy4nLFxuICAgIGVycm9yOiAnbm8gc3VjaCBlbGVtZW50JyxcbiAgICBlcnJvckNvZGU6IDdcbiAgfSxcbiAge1xuICAgIGVycm9yTmFtZTogJ05vU3VjaEZyYW1lRXJyb3InLFxuICAgIGVycm9yTXNnOiAnQSByZXF1ZXN0IHRvIHN3aXRjaCB0byBhIGZyYW1lIGNvdWxkIG5vdCBiZSBzYXRpc2ZpZWQgJyArXG4gICAgICAgICdiZWNhdXNlIHRoZSBmcmFtZSBjb3VsZCBub3QgYmUgZm91bmQuJyxcbiAgICBlcnJvcjogJ25vIHN1Y2ggZnJhbWUnLFxuICAgIGVycm9yQ29kZTogOFxuICB9LFxuICB7XG4gICAgZXJyb3JOYW1lOiAnVW5rbm93bkNvbW1hbmRFcnJvcicsXG4gICAgZXJyb3JNc2c6ICdUaGUgcmVxdWVzdGVkIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZCwgb3IgYSByZXF1ZXN0ICcgK1xuICAgICAgICAnd2FzIHJlY2VpdmVkIHVzaW5nIGFuIEhUVFAgbWV0aG9kIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSAnICtcbiAgICAgICAgJ3RoZSBtYXBwZWQgcmVzb3VyY2UuJyxcbiAgICBlcnJvcjogJ3Vua25vd24gY29tbWFuZCcsXG4gICAgZXJyb3JDb2RlOiA5XG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdTdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvcicsXG4gICAgZXJyb3JNc2c6ICdBbiBlbGVtZW50IGNvbW1hbmQgZmFpbGVkIGJlY2F1c2UgdGhlIHJlZmVyZW5jZWQgZWxlbWVudCBpcyAnICtcbiAgICAgICAgJ25vIGxvbmdlciBhdHRhY2hlZCB0byB0aGUgRE9NLicsXG4gICAgZXJyb3I6ICdzdGFsZSBlbGVtZW50IHJlZmVyZW5jZScsXG4gICAgZXJyb3JDb2RlOiAxMFxuICB9LFxuICB7XG4gICAgZXJyb3JOYW1lOiAnRWxlbWVudE5vdFZpc2libGVFcnJvcicsXG4gICAgZXJyb3JNc2c6ICdBbiBlbGVtZW50IGNvbW1hbmQgY291bGQgbm90IGJlIGNvbXBsZXRlZCBiZWNhdXNlIHRoZSAnICtcbiAgICAgICAgJ2VsZW1lbnQgaXMgbm90IHZpc2libGUgb24gdGhlIHBhZ2UuJyxcbiAgICBlcnJvckNvZGU6IDExXG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdJbnZhbGlkRWxlbWVudFN0YXRlRXJyb3InLFxuICAgIGVycm9yTXNnOiAnQW4gZWxlbWVudCBjb21tYW5kIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgYmVjYXVzZSB0aGUgZWxlbWVudCAnICtcbiAgICAgICAgJ2lzIGluIGFuIGludmFsaWQgc3RhdGUgKGUuZy4gYXR0ZW1wdGluZyB0byBjbGljayBhIGRpc2FibGVkICcgK1xuICAgICAgICAnZWxlbWVudCkuJyxcbiAgICBlcnJvcjogJ2ludmFsaWQgZWxlbWVudCBzdGF0ZScsXG4gICAgZXJyb3JDb2RlOiAxMlxuICB9LFxuICB7XG4gICAgZXJyb3JOYW1lOiAnVW5rbm93bkVycm9yJyxcbiAgICBlcnJvck1zZzogJ0FuIHVua25vd24gc2VydmVyLXNpZGUgZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgJyArXG4gICAgICAgICdjb21tYW5kLicsXG4gICAgZXJyb3I6ICd1bmtub3duIGVycm9yJyxcbiAgICBlcnJvckNvZGU6IDEzXG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdFbGVtZW50SXNOb3RTZWxlY3RhYmxlRXJyb3InLFxuICAgIGVycm9yTXNnOiAnQW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBzZWxlY3QgYW4gZWxlbWVudCB0aGF0IGNhbm5vdCAnICtcbiAgICAgICAgJ2JlIHNlbGVjdGVkLicsXG4gICAgZXJyb3I6ICdlbGVtZW50IG5vdCBzZWxlY3RhYmxlJyxcbiAgICBlcnJvckNvZGU6IDE1XG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdKYXZhU2NyaXB0RXJyb3InLFxuICAgIGVycm9yTXNnOiAnQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgZXhlY3V0aW5nIHVzZXIgc3VwcGxpZWQgSmF2YVNjcmlwdC4nLFxuICAgIGVycm9yOiAnamF2YXNjcmlwdCBlcnJvcicsXG4gICAgZXJyb3JDb2RlOiAxN1xuICB9LFxuICB7XG4gICAgZXJyb3JOYW1lOiAnWFBhdGhMb29rdXBFcnJvcicsXG4gICAgZXJyb3JNc2c6ICdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBzZWFyY2hpbmcgZm9yIGFuIGVsZW1lbnQgYnkgWFBhdGguJyxcbiAgICBlcnJvckNvZGU6IDE5XG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdUaW1lb3V0RXJyb3InLFxuICAgIGVycm9yTXNnOiAnQW4gb3BlcmF0aW9uIGRpZCBub3QgY29tcGxldGUgYmVmb3JlIGl0cyB0aW1lb3V0IGV4cGlyZWQuJyxcbiAgICBlcnJvcjogJ3RpbWVvdXQnLFxuICAgIGVycm9yQ29kZTogMjFcbiAgfSxcbiAge1xuICAgIGVycm9yTmFtZTogJ05vU3VjaFdpbmRvd0Vycm9yJyxcbiAgICBlcnJvck1zZzogJ0EgcmVxdWVzdCB0byBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgd2luZG93IGNvdWxkIG5vdCBiZSAnICtcbiAgICAgICAgJ3NhdGlzZmllZCBiZWNhdXNlIHRoZSB3aW5kb3cgY291bGQgbm90IGJlIGZvdW5kLicsXG4gICAgZXJyb3I6ICdubyBzdWNoIHdpbmRvdycsXG4gICAgZXJyb3JDb2RlOiAyM1xuICB9LFxuICB7XG4gICAgZXJyb3JOYW1lOiAnSW52YWxpZENvb2tpZURvbWFpbkVycm9yJyxcbiAgICBlcnJvck1zZzogJ0FuIGlsbGVnYWwgYXR0ZW1wdCB3YXMgbWFkZSB0byBzZXQgYSBjb29raWUgdW5kZXIgYSBkaWZmZXJlbnQgJyArXG4gICAgICAgICdkb21haW4gdGhhbiB0aGUgY3VycmVudCBwYWdlLicsXG4gICAgZXJyb3I6ICdpbnZhbGlkIGNvb2tpZSBkb21haW4nLFxuICAgIGVycm9yQ29kZTogMjRcbiAgfSxcbiAge1xuICAgIGVycm9yTmFtZTogJ0ludmFsaWRDb29yZGluYXRlc0Vycm9yJyxcbiAgICBlcnJvck1zZzogJ1RoZSBjb29yZGluYXRlcyBwcm92aWRlZCB0byBhbiBpbnRlcmFjdGlvbnMgb3BlcmF0aW9uIGFyZSBpbnZhbGlkLicsXG4gICAgZXJyb3I6ICdpbnZhbGlkIGNvb3JkaW5hdGVzJyxcbiAgfSxcbiAge1xuICAgIGVycm9yTmFtZTogJ1VuYWJsZVRvU2V0Q29va2llRXJyb3InLFxuICAgIGVycm9yTXNnOiBgQSByZXF1ZXN0IHRvIHNldCBhIGNvb2tpZSdzIHZhbHVlIGNvdWxkIG5vdCBiZSBzYXRpc2ZpZWQuYCxcbiAgICBlcnJvcjogJ3VuYWJsZSB0byBzZXQgY29va2llJyxcbiAgICBlcnJvckNvZGU6IDI1XG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdVbmV4cGVjdGVkQWxlcnRPcGVuRXJyb3InLFxuICAgIGVycm9yTXNnOiAnQSBtb2RhbCBkaWFsb2cgd2FzIG9wZW4sIGJsb2NraW5nIHRoaXMgb3BlcmF0aW9uJyxcbiAgICBlcnJvcjogJ3VuZXhwZWN0ZWQgYWxlcnQgb3BlbicsXG4gICAgZXJyb3JDb2RlOiAyNlxuICB9LFxuICB7XG4gICAgZXJyb3JOYW1lOiAnTm9BbGVydE9wZW5FcnJvcicsXG4gICAgZXJyb3JNc2c6ICdBbiBhdHRlbXB0IHdhcyBtYWRlIHRvIG9wZXJhdGUgb24gYSBtb2RhbCBkaWFsb2cgd2hlbiBvbmUgd2FzICcgK1xuICAgICAgICAnbm90IG9wZW4uJyxcbiAgICBlcnJvckNvZGU6IDI3XG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdTY3JpcHRUaW1lb3V0RXJyb3InLFxuICAgIGVycm9yTXNnOiAnQSBzY3JpcHQgZGlkIG5vdCBjb21wbGV0ZSBiZWZvcmUgaXRzIHRpbWVvdXQgZXhwaXJlZC4nLFxuICAgIGVycm9yOiAnc2NyaXB0IHRpbWVvdXQnLFxuICAgIGVycm9yQ29kZTogMjhcbiAgfSxcbiAge1xuICAgIGVycm9yTmFtZTogJ0ludmFsaWRFbGVtZW50Q29vcmRpbmF0ZXNFcnJvcicsXG4gICAgZXJyb3JNc2c6ICdUaGUgY29vcmRpbmF0ZXMgcHJvdmlkZWQgdG8gYW4gaW50ZXJhY3Rpb25zIG9wZXJhdGlvbiBhcmUgJyArXG4gICAgICAgICdpbnZhbGlkLicsXG4gICAgZXJyb3JDb2RlOiAyOVxuICB9LFxuICB7XG4gICAgZXJyb3JOYW1lOiAnSU1FTm90QXZhaWxhYmxlRXJyb3InLFxuICAgIGVycm9yTXNnOiAnSU1FIHdhcyBub3QgYXZhaWxhYmxlLicsXG4gICAgZXJyb3JDb2RlOiAzMFxuICB9LFxuICB7XG4gICAgZXJyb3JOYW1lOiAnSU1FRW5naW5lQWN0aXZhdGlvbkZhaWxlZEVycm9yJyxcbiAgICBlcnJvck1zZzogJ0FuIElNRSBlbmdpbmUgY291bGQgbm90IGJlIHN0YXJ0ZWQuJyxcbiAgICBlcnJvckNvZGU6IDMxXG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdJbnZhbGlkU2VsZWN0b3JFcnJvcicsXG4gICAgZXJyb3JNc2c6ICdBcmd1bWVudCB3YXMgYW4gaW52YWxpZCBzZWxlY3RvciAoZS5nLiBYUGF0aC9DU1MpLicsXG4gICAgZXJyb3I6ICdpbnZhbGlkIHNlbGVjdG9yJyxcbiAgICBlcnJvckNvZGU6IDMyXG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdTZXNzaW9uTm90Q3JlYXRlZEVycm9yJyxcbiAgICBlcnJvck1zZzogJ0EgbmV3IHNlc3Npb24gY291bGQgbm90IGJlIGNyZWF0ZWQuJyxcbiAgICBlcnJvcjogJ3Nlc3Npb24gbm90IGNyZWF0ZWQnLFxuICAgIGVycm9yQ29kZTogMzNcbiAgfSxcbiAge1xuICAgIGVycm9yTmFtZTogJ01vdmVUYXJnZXRPdXRPZkJvdW5kc0Vycm9yJyxcbiAgICBlcnJvck1zZzogJ1RhcmdldCBwcm92aWRlZCBmb3IgYSBtb3ZlIGFjdGlvbiBpcyBvdXQgb2YgYm91bmRzLicsXG4gICAgZXJyb3I6ICdtb3ZlIHRhcmdldCBvdXQgb2YgYm91bmRzJyxcbiAgICBlcnJvckNvZGU6IDM0XG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdOb1N1Y2hBbGVydEVycm9yJyxcbiAgICBlcnJvck1zZzogJ0FuIGF0dGVtcHQgd2FzIG1hZGUgdG8gb3BlcmF0ZSBvbiBhIG1vZGFsIGRpYWxvZyB3aGVuIG9uZSB3YXMgbm90IG9wZW4uJyxcbiAgICBlcnJvcjogJ25vIHN1Y2ggYWxlcnQnLFxuICB9LFxuICB7XG4gICAgZXJyb3JOYW1lOiAnTm9TdWNoQ29va2llRXJyb3InLFxuICAgIGVycm9yTXNnOiAnTm8gY29va2llIG1hdGNoaW5nIHRoZSBnaXZlbiBwYXRoIG5hbWUgd2FzIGZvdW5kIGFtb25nc3QgdGhlIGFzc29jaWF0ZWQgY29va2llcyBvZiB0aGUgY3VycmVudCBicm93c2luZyBjb250ZXh04oCZcyBhY3RpdmUgZG9jdW1lbnQnLFxuICAgIGVycm9yOiAnbm8gc3VjaCBjb29raWUnLFxuICB9LFxuICB7XG4gICAgZXJyb3JOYW1lOiAnTm90WWV0SW1wbGVtZW50ZWRFcnJvcicsXG4gICAgZXJyb3JNc2c6ICdNZXRob2QgaGFzIG5vdCB5ZXQgYmVlbiBpbXBsZW1lbnRlZCcsXG4gICAgZXJyb3I6ICd1bmtub3duIG1ldGhvZCcsXG4gICAgZXJyb3JDb2RlOiA0MDVcbiAgfSxcbiAge1xuICAgIGVycm9yTmFtZTogJ1Vua25vd25Db21tYW5kRXJyb3InLFxuICAgIGVycm9yTXNnOiAnVGhlIHJlcXVlc3RlZCByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQsIG9yIGEgcmVxdWVzdCB3YXMgcmVjZWl2ZWQgdXNpbmcgYW4gSFRUUCBtZXRob2QgdGhhdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBtYXBwZWQgcmVzb3VyY2UuJyxcbiAgICBlcnJvcjogJ3Vua25vd24gY29tbWFuZCcsXG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdVbmtub3duTWV0aG9kRXJyb3InLFxuICAgIGVycm9yTXNnOiAnVGhlIHJlcXVlc3RlZCBjb21tYW5kIG1hdGNoZWQgYSBrbm93biBVUkwgYnV0IGRpZCBub3QgbWF0Y2ggYW4gbWV0aG9kIGZvciB0aGF0IFVSTCcsXG4gICAgZXJyb3I6ICd1bmtub3duIG1ldGhvZCcsXG4gIH0sXG4gIHtcbiAgICBlcnJvck5hbWU6ICdVbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yJyxcbiAgICBlcnJvck1zZzogJ0Egc2VydmVyLXNpZGUgZXJyb3Igb2NjdXJyZWQuIENvbW1hbmQgY2Fubm90IGJlIHN1cHBvcnRlZC4nLFxuICAgIGVycm9yOiAndW5zdXBwb3J0ZWQgb3BlcmF0aW9uJyxcbiAgfSxcbl07XG5cbmRlc2NyaWJlKCdlcnJvcnMnLCBmdW5jdGlvbiAoKSB7XG4gIGZvciAobGV0IGVycm9yIG9mIGVycm9yc0xpc3QpIHtcbiAgICBpdChlcnJvci5lcnJvck5hbWUgKyAnIHNob3VsZCBoYXZlIGEgSlNPTldQIGNvZGUgb3IgVzNDIGNvZGUgYW5kIG1lc3NhZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZXJyb3IuZXJyb3JDb2RlKSB7XG4gICAgICAgIG5ldyBlcnJvcnNbZXJyb3IuZXJyb3JOYW1lXSgpXG4gICAgICAgICAgLnNob3VsZC5oYXZlLnByb3BlcnR5KCdqc29ud3BDb2RlJywgZXJyb3IuZXJyb3JDb2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ldyBlcnJvcnNbZXJyb3IuZXJyb3JOYW1lXSgpXG4gICAgICAgICAgLnNob3VsZC5oYXZlLnByb3BlcnR5KCdlcnJvcicsIGVycm9yLmVycm9yKTtcbiAgICAgIH1cbiAgICAgIG5ldyBlcnJvcnNbZXJyb3IuZXJyb3JOYW1lXSgpXG4gICAgICAgIC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnbWVzc2FnZScsIGVycm9yLmVycm9yTXNnKTtcbiAgICB9KTtcbiAgfVxuICBpdCgnQmFkUGFyYW1ldGVyc0Vycm9yIHNob3VsZCBub3QgaGF2ZSBjb2RlIGFuZCBzaG91bGQgaGF2ZSBtZXNzZycsIGZ1bmN0aW9uICgpIHtcbiAgICBuZXcgZXJyb3JzLkJhZFBhcmFtZXRlcnNFcnJvcigpXG4gICAgICAuc2hvdWxkLm5vdC5oYXZlLnByb3BlcnR5KCdqc29ud3BDb2RlJyk7XG4gICAgbmV3IGVycm9ycy5CYWRQYXJhbWV0ZXJzRXJyb3IoKVxuICAgICAgLnNob3VsZC5oYXZlLnByb3BlcnR5KCdtZXNzYWdlJyk7XG4gIH0pO1xuICBpdCgnUHJveHlSZXF1ZXN0RXJyb3Igc2hvdWxkIGhhdmUgbWVzc2FnZSBhbmQganNvbndwJywgZnVuY3Rpb24gKCkge1xuICAgIG5ldyBlcnJvcnMuUHJveHlSZXF1ZXN0RXJyb3IoKVxuICAgICAgICAuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2pzb253cCcpO1xuICAgIG5ldyBlcnJvcnMuUHJveHlSZXF1ZXN0RXJyb3IoKVxuICAgICAgICAuc2hvdWxkLmhhdmUucHJvcGVydHkoJ21lc3NhZ2UnKTtcbiAgfSk7XG59KTtcbmRlc2NyaWJlKCdlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZScsIGZ1bmN0aW9uICgpIHtcbiAgZm9yIChsZXQgZXJyb3Igb2YgZXJyb3JzTGlzdCkge1xuICAgIGlmIChlcnJvci5lcnJvck5hbWUgIT09ICdOb3RZZXRJbXBsZW1lbnRlZEVycm9yJykge1xuICAgICAgaXQoZXJyb3IuZXJyb3JDb2RlICsgJyBzaG91bGQgcmV0dXJuIGNvcnJlY3QgZXJyb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChlcnJvci5lcnJvckNvZGUpIHtcbiAgICAgICAgICBlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZShlcnJvci5lcnJvckNvZGUpXG4gICAgICAgICAgICAuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2pzb253cENvZGUnLCBlcnJvci5lcnJvckNvZGUpO1xuICAgICAgICAgIGVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlKGVycm9yLmVycm9yQ29kZSlcbiAgICAgICAgICAgIC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnbWVzc2FnZScsIGVycm9yLmVycm9yTXNnKTtcbiAgICAgICAgICBpZiAoIV8uaW5jbHVkZXMoWzEzLCAzM10sIGVycm9yLmVycm9yQ29kZSkpIHtcbiAgICAgICAgICAgIGVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlKGVycm9yLmVycm9yQ29kZSwgJ2FiY2QnKVxuICAgICAgICAgICAgICAuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2pzb253cENvZGUnLCBlcnJvci5lcnJvckNvZGUpO1xuICAgICAgICAgICAgZXJyb3JGcm9tTUpTT05XUFN0YXR1c0NvZGUoZXJyb3IuZXJyb3JDb2RlLCAnYWJjZCcpXG4gICAgICAgICAgICAgIC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnbWVzc2FnZScsICdhYmNkJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlzRXJyb3JUeXBlKGVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlKGVycm9yLmVycm9yQ29kZSksIGVycm9ycy5Vbmtub3duRXJyb3IpLnNob3VsZC5iZS50cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgaXQoJ3Nob3VsZCB0aHJvdyB1bmtub3duIGVycm9yIGZvciB1bmtub3duIGNvZGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgZXJyb3JGcm9tTUpTT05XUFN0YXR1c0NvZGUoOTkpXG4gICAgICAuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2pzb253cENvZGUnLCAxMyk7XG4gICAgZXJyb3JGcm9tTUpTT05XUFN0YXR1c0NvZGUoOTkpXG4gICAgICAuc2hvdWxkLmhhdmUucHJvcGVydHkoJ21lc3NhZ2UnLCAnQW4gdW5rbm93biBzZXJ2ZXItc2lkZSBlcnJvciBvY2N1cnJlZCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aGlsZSBwcm9jZXNzaW5nIHRoZSBjb21tYW5kLicpO1xuICB9KTtcbn0pO1xuZGVzY3JpYmUoJ2Vycm9yRnJvbVczQ0pzb25Db2RlJywgZnVuY3Rpb24gKCkge1xuICBmb3IgKGxldCBlcnJvciBvZiBlcnJvcnNMaXN0KSB7XG4gICAgaWYgKGVycm9yLmVycm9yTmFtZSAhPT0gJ05vdFlldEltcGxlbWVudGVkRXJyb3InKSB7XG4gICAgICBpdChlcnJvci5lcnJvck5hbWUgKyAnIHNob3VsZCByZXR1cm4gY29ycmVjdCBlcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qge2Vycm9yOiB3M2NFcnJvcn0gPSBlcnJvcjtcbiAgICAgICAgaWYgKHczY0Vycm9yKSB7XG4gICAgICAgICAgZXJyb3JGcm9tVzNDSnNvbkNvZGUodzNjRXJyb3IpLmVycm9yLnNob3VsZC5lcXVhbChlcnJvci5lcnJvcik7XG4gICAgICAgICAgZXJyb3JGcm9tVzNDSnNvbkNvZGUodzNjRXJyb3IpLnNob3VsZC5oYXZlLnByb3BlcnR5KCdtZXNzYWdlJywgZXJyb3IuZXJyb3JNc2cpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlzRXJyb3JUeXBlKGVycm9yRnJvbVczQ0pzb25Db2RlKHczY0Vycm9yKSwgZXJyb3JzLlVua25vd25FcnJvcikuc2hvdWxkLmJlLnRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBpdCgnc2hvdWxkIHBhcnNlIHVua25vd24gZXJyb3JzJywgZnVuY3Rpb24gKCkge1xuICAgIGlzRXJyb3JUeXBlKGVycm9yRnJvbVczQ0pzb25Db2RlKCdub3QgYSByZWFsIGVycm9yIGNvZGUnKSwgZXJyb3JzLlVua25vd25FcnJvcikuc2hvdWxkLmJlLnRydWU7XG4gICAgZXJyb3JGcm9tVzNDSnNvbkNvZGUoJ25vdCBhIHJlYWwgZXJyb3IgY29kZScpLm1lc3NhZ2Uuc2hvdWxkLm1hdGNoKC9BbiB1bmtub3duIHNlcnZlci1zaWRlIGVycm9yIG9jY3VycmVkLyk7XG4gICAgZXJyb3JGcm9tVzNDSnNvbkNvZGUoJ25vdCBhIHJlYWwgZXJyb3IgY29kZScpLmVycm9yLnNob3VsZC5lcXVhbCgndW5rbm93biBlcnJvcicpO1xuICB9KTtcbn0pO1xuZGVzY3JpYmUoJ3czYyBTdGF0dXMgQ29kZXMnLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdzaG91bGQgbWF0Y2ggdGhlIGNvcnJlY3QgZXJyb3IgY29kZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IG5vbjQwMEVycm9ycyA9IFtcbiAgICAgIFsnTm9TdWNoRHJpdmVyRXJyb3InLCA0MDRdLFxuICAgICAgWydOb1N1Y2hGcmFtZUVycm9yJywgNDA0XSxcbiAgICAgIFsnTm9BbGVydE9wZW5FcnJvcicsIDQwNF0sXG4gICAgICBbJ05vU3VjaFdpbmRvd0Vycm9yJywgNDA0XSxcbiAgICAgIFsnU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3InLCA0MDRdLFxuICAgICAgWydKYXZhU2NyaXB0RXJyb3InLCA1MDBdLFxuICAgICAgWydNb3ZlVGFyZ2V0T3V0T2ZCb3VuZHNFcnJvcicsIDUwMF0sXG4gICAgICBbJ05vU3VjaENvb2tpZUVycm9yJywgNDA0XSxcbiAgICAgIFsnTm9TdWNoRWxlbWVudEVycm9yJywgNDA0XSxcbiAgICAgIFsnU2NyaXB0VGltZW91dEVycm9yJywgNDA4XSxcbiAgICAgIFsnU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcicsIDUwMF0sXG4gICAgICBbJ1RpbWVvdXRFcnJvcicsIDQwOF0sXG4gICAgICBbJ1VuYWJsZVRvU2V0Q29va2llRXJyb3InLCA1MDBdLFxuICAgICAgWydVbmFibGVUb0NhcHR1cmVTY3JlZW4nLCA1MDBdLFxuICAgICAgWydVbmV4cGVjdGVkQWxlcnRPcGVuRXJyb3InLCA1MDBdLFxuICAgICAgWydVbmtub3duQ29tbWFuZEVycm9yJywgNDA0XSxcbiAgICAgIFsnVW5rbm93bkVycm9yJywgNTAwXSxcbiAgICAgIFsnVW5rbm93bk1ldGhvZEVycm9yJywgNDA1XSxcbiAgICAgIFsnVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvcicsIDUwMF0sXG4gICAgXTtcblxuICAgIC8vIFRlc3QgdGhlIGVycm9ycyB0aGF0IHdlIGRvbid0IGV4cGVjdCB0byByZXR1cm4gNDAwIGNvZGVcbiAgICBmb3IgKGxldCBbZXJyb3JOYW1lLCBleHBlY3RlZEVycm9yQ29kZV0gb2Ygbm9uNDAwRXJyb3JzKSB7XG4gICAgICBlcnJvcnNbZXJyb3JOYW1lXS5zaG91bGQuZXhpc3Q7XG4gICAgICAobmV3IGVycm9yc1tlcnJvck5hbWVdKCkpLnNob3VsZC5oYXZlLnByb3BlcnR5KCd3M2NTdGF0dXMnLCBleHBlY3RlZEVycm9yQ29kZSk7XG4gICAgfVxuXG4gICAgLy8gVGVzdCBhbiBlcnJvciB0aGF0IHdlIGV4cGVjdCB0byByZXR1cm4gNDAwIGNvZGVcbiAgICAobmV3IGVycm9ycy5FbGVtZW50Q2xpY2tJbnRlcmNlcHRlZEVycm9yKCkpLnNob3VsZC5oYXZlLnByb3BlcnR5KCd3M2NTdGF0dXMnLCA0MDApO1xuICB9KTtcbn0pO1xuZGVzY3JpYmUoJy5nZXRSZXNwb25zZUZvclczQ0Vycm9yJywgZnVuY3Rpb24gKCkge1xuICBpdCgnc2hvdWxkIHJldHVybiBhbiBlcnJvciwgbWVzc2FnZSBhbmQgc3RhY2t0cmFjZSBmb3IganVzdCBhIGdlbmVyaWMgZXhjZXB0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvbWUgcmFuZG9tIGVycm9yJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgW2h0dHBTdGF0dXMsIGh0dHBSZXNwb25zZUJvZHldID0gZ2V0UmVzcG9uc2VGb3JXM0NFcnJvcihlKTtcbiAgICAgIGh0dHBTdGF0dXMuc2hvdWxkLmVxdWFsKDUwMCk7XG4gICAgICBjb25zdCB7ZXJyb3IsIG1lc3NhZ2UsIHN0YWNrdHJhY2V9ID0gaHR0cFJlc3BvbnNlQm9keS52YWx1ZTtcbiAgICAgIG1lc3NhZ2Uuc2hvdWxkLm1hdGNoKC9Tb21lIHJhbmRvbSBlcnJvci8pO1xuICAgICAgZXJyb3Iuc2hvdWxkLmVxdWFsKCd1bmtub3duIGVycm9yJyk7XG4gICAgICBzdGFja3RyYWNlLnNob3VsZC5tYXRjaCgvYXQgZ2V0UmVzcG9uc2VGb3JXM0NFcnJvci8pO1xuICAgICAgc3RhY2t0cmFjZS5zaG91bGQubWF0Y2goL1NvbWUgcmFuZG9tIGVycm9yLyk7XG4gICAgICBzdGFja3RyYWNlLnNob3VsZC5tYXRjaCgvZXJyb3JzLXNwZWNzLmpzLyk7XG4gICAgfVxuICB9KTtcbiAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gZXJyb3IsIG1lc3NhZ2UgYW5kIHN0YWNrdHJhY2UgZm9yIGEgTm9TdWNoRWxlbWVudEVycm9yJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG5vU3VjaEVsZW1lbnRFcnJvciA9IG5ldyBlcnJvcnMuTm9TdWNoRWxlbWVudEVycm9yKCdzcGVjaWZpYyBlcnJvciBtZXNzYWdlJyk7XG4gICAgY29uc3QgW2h0dHBTdGF0dXMsIGh0dHBSZXNwb25zZUJvZHldID0gZ2V0UmVzcG9uc2VGb3JXM0NFcnJvcihub1N1Y2hFbGVtZW50RXJyb3IpO1xuICAgIGh0dHBTdGF0dXMuc2hvdWxkLmVxdWFsKDQwNCk7XG4gICAgY29uc3Qge2Vycm9yLCBtZXNzYWdlLCBzdGFja3RyYWNlfSA9IGh0dHBSZXNwb25zZUJvZHkudmFsdWU7XG4gICAgZXJyb3Iuc2hvdWxkLmVxdWFsKCdubyBzdWNoIGVsZW1lbnQnKTtcbiAgICBtZXNzYWdlLnNob3VsZC5tYXRjaCgvc3BlY2lmaWMgZXJyb3IgbWVzc2FnZS8pO1xuICAgIHN0YWNrdHJhY2Uuc2hvdWxkLm1hdGNoKC9lcnJvcnMtc3BlY3MuanMvKTtcbiAgfSk7XG4gIGl0KCdzaG91bGQgaGFuZGxlIEJhZFBhcmFtZXRlcnNFcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBiYWRQYXJhbXNFcnJvciA9IG5ldyBlcnJvcnMuQmFkUGFyYW1ldGVyc0Vycm9yKCdfX0ZPT19fJywgJ19fQkFSX18nLCAnX19IRUxMT19XT1JMRF9fJyk7XG4gICAgY29uc3QgW2h0dHBTdGF0dXMsIGh0dHBSZXNwb25zZUJvZHldID0gZ2V0UmVzcG9uc2VGb3JXM0NFcnJvcihiYWRQYXJhbXNFcnJvcik7XG4gICAgaHR0cFN0YXR1cy5zaG91bGQuZXF1YWwoNDAwKTtcbiAgICBjb25zdCB7ZXJyb3IsIG1lc3NhZ2UsIHN0YWNrdHJhY2V9ID0gaHR0cFJlc3BvbnNlQm9keS52YWx1ZTtcbiAgICBlcnJvci5zaG91bGQuZXF1YWwoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgICBtZXNzYWdlLnNob3VsZC5tYXRjaCgvX19CQVJfXy8pO1xuICAgIG1lc3NhZ2Uuc2hvdWxkLm1hdGNoKC9fX0hFTExPX1dPUkxEX18vKTtcbiAgICBzdGFja3RyYWNlLnNob3VsZC5tYXRjaCgvZXJyb3JzLXNwZWNzLmpzLyk7XG4gIH0pO1xuICBpdCgnc2hvdWxkIHRyYW5zbGF0ZSBKU09OV1AgZXJyb3JzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IFtodHRwU3RhdHVzLCBodHRwUmVzcG9uc2VCb2R5XSA9IGdldFJlc3BvbnNlRm9yVzNDRXJyb3Ioe1xuICAgICAgc3RhdHVzOiA3LFxuICAgICAgdmFsdWU6ICdNeSBjdXN0b20gbWVzc2FnZScsXG4gICAgICBzZXNzaW9uSWQ6ICdGYWtlIFNlc3Npb24gSWQnLFxuICAgIH0pO1xuICAgIGh0dHBTdGF0dXMuc2hvdWxkLmVxdWFsKDQwNCk7XG4gICAgY29uc3Qge2Vycm9yLCBtZXNzYWdlLCBzdGFja3RyYWNlfSA9IGh0dHBSZXNwb25zZUJvZHkudmFsdWU7XG4gICAgbWVzc2FnZS5zaG91bGQuZXF1YWwoJ015IGN1c3RvbSBtZXNzYWdlJyk7XG4gICAgZXJyb3Iuc2hvdWxkLmVxdWFsKCdubyBzdWNoIGVsZW1lbnQnKTtcbiAgICBzdGFja3RyYWNlLnNob3VsZC5leGlzdDtcbiAgfSk7XG59KTtcbmRlc2NyaWJlKCcuZ2V0QWN0dWFsRXJyb3InLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdNSlNPTldQJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgbWFwIGEgc3RhdHVzIGNvZGUgNyBubyBzdWNoIGVsZW1lbnQgZXJyb3IgYXMgYSBOb1N1Y2hFbGVtZW50RXJyb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhY3R1YWxFcnJvciA9IG5ldyBlcnJvcnMuUHJveHlSZXF1ZXN0RXJyb3IoJ0Vycm9yIG1lc3NhZ2UgZG9lcyBub3QgbWF0dGVyJywge1xuICAgICAgICB2YWx1ZTogJ2RvZXMgbm90IG1hdHRlcicsXG4gICAgICAgIHN0YXR1czogNyxcbiAgICAgIH0pLmdldEFjdHVhbEVycm9yKCk7XG4gICAgICBpc0Vycm9yVHlwZShhY3R1YWxFcnJvciwgZXJyb3JzLk5vU3VjaEVsZW1lbnRFcnJvcikuc2hvdWxkLmJlLnRydWU7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBtYXAgYSBzdGF0dXMgY29kZSAxMCwgU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhY3R1YWxFcnJvciA9IG5ldyBlcnJvcnMuUHJveHlSZXF1ZXN0RXJyb3IoJ0Vycm9yIG1lc3NhZ2UgZG9lcyBub3QgbWF0dGVyJywge1xuICAgICAgICB2YWx1ZTogJ0RvZXMgbm90IG1hdHRlcicsXG4gICAgICAgIHN0YXR1czogMTAsXG4gICAgICB9KS5nZXRBY3R1YWxFcnJvcigpO1xuICAgICAgaXNFcnJvclR5cGUoYWN0dWFsRXJyb3IsIGVycm9ycy5TdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvcikuc2hvdWxkLmJlLnRydWU7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBtYXAgYW4gdW5rbm93biBlcnJvciB0byBVbmtub3duRXJyb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhY3R1YWxFcnJvciA9IG5ldyBlcnJvcnMuUHJveHlSZXF1ZXN0RXJyb3IoJ0Vycm9yIG1lc3NhZ2UgZG9lcyBub3QgbWF0dGVyJywge1xuICAgICAgICB2YWx1ZTogJ0RvZXMgbm90IG1hdHRlcicsXG4gICAgICAgIHN0YXR1czogLTEwMFxuICAgICAgfSkuZ2V0QWN0dWFsRXJyb3IoKTtcbiAgICAgIGlzRXJyb3JUeXBlKGFjdHVhbEVycm9yLCBlcnJvcnMuVW5rbm93bkVycm9yKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHBhcnNlIGEgSlNPTiBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhY3R1YWxFcnJvciA9IG5ldyBlcnJvcnMuUHJveHlSZXF1ZXN0RXJyb3IoJ0Vycm9yIG1lc3NhZ2UgZG9lcyBub3QgbWF0dGVyJywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB2YWx1ZTogJ0RvZXMgbm90IG1hdHRlcicsXG4gICAgICAgIHN0YXR1czogLTEwMFxuICAgICAgfSkpLmdldEFjdHVhbEVycm9yKCk7XG4gICAgICBpc0Vycm9yVHlwZShhY3R1YWxFcnJvciwgZXJyb3JzLlVua25vd25FcnJvcikuc2hvdWxkLmJlLnRydWU7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdXM0MnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBtYXAgYSA0MDQgbm8gc3VjaCBlbGVtZW50IGVycm9yIGFzIGEgTm9TdWNoRWxlbWVudEVycm9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWN0dWFsRXJyb3IgPSBuZXcgZXJyb3JzLlByb3h5UmVxdWVzdEVycm9yKCdFcnJvciBtZXNzYWdlIGRvZXMgbm90IG1hdHRlcicsIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBlcnJvcjogZXJyb3JzLk5vU3VjaEVsZW1lbnRFcnJvci5lcnJvcigpLFxuICAgICAgICB9LFxuICAgICAgfSwgSFRUUFN0YXR1c0NvZGVzLk5PVF9GT1VORCkuZ2V0QWN0dWFsRXJyb3IoKTtcbiAgICAgIGlzRXJyb3JUeXBlKGFjdHVhbEVycm9yLCBlcnJvcnMuTm9TdWNoRWxlbWVudEVycm9yKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIG1hcCBhIDQwMCBTdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFjdHVhbEVycm9yID0gbmV3IGVycm9ycy5Qcm94eVJlcXVlc3RFcnJvcignRXJyb3IgbWVzc2FnZSBkb2VzIG5vdCBtYXR0ZXInLCB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgZXJyb3I6IGVycm9ycy5TdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvci5lcnJvcigpLFxuXG4gICAgICAgIH0sXG4gICAgICB9LCBIVFRQU3RhdHVzQ29kZXMuQkFEX1JFUVVFU1QpLmdldEFjdHVhbEVycm9yKCk7XG4gICAgICBpc0Vycm9yVHlwZShhY3R1YWxFcnJvciwgZXJyb3JzLlN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIG1hcCBhbiB1bmtub3duIGVycm9yIHRvIFVua25vd25FcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFjdHVhbEVycm9yID0gbmV3IGVycm9ycy5Qcm94eVJlcXVlc3RFcnJvcignRXJyb3IgbWVzc2FnZSBkb2VzIG5vdCBtYXR0ZXInLCBudWxsLCB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgZXJyb3I6ICdOb3QgYSB2YWxpZCB3M2MgSlNPTiBjb2RlJ1xuXG4gICAgICAgIH0sXG4gICAgICB9LCA0NTYpLmdldEFjdHVhbEVycm9yKCk7XG4gICAgICBpc0Vycm9yVHlwZShhY3R1YWxFcnJvciwgZXJyb3JzLlVua25vd25FcnJvcikuc2hvdWxkLmJlLnRydWU7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBhIEpTT04gc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWN0dWFsRXJyb3IgPSBuZXcgZXJyb3JzLlByb3h5UmVxdWVzdEVycm9yKCdFcnJvciBtZXNzYWdlIGRvZXMgbm90IG1hdHRlcicsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBlcnJvcjogZXJyb3JzLlN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yLmVycm9yKCksXG5cbiAgICAgICAgfSxcbiAgICAgIH0pLCBIVFRQU3RhdHVzQ29kZXMuQkFEX1JFUVVFU1QpLmdldEFjdHVhbEVycm9yKCk7XG4gICAgICBpc0Vycm9yVHlwZShhY3R1YWxFcnJvciwgZXJyb3JzLlN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJmaWxlIjoidGVzdC9wcm90b2NvbC9lcnJvcnMtc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
@@ -1,165 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.FakeDriver = void 0;
7
-
8
- require("source-map-support/register");
9
-
10
- var _lib = require("../../lib");
11
-
12
- var _constants = require("../../lib/constants");
13
-
14
- var _support = require("@appium/support");
15
-
16
- class FakeDriver extends _lib.BaseDriver {
17
- static newMethodMap = {
18
- '/session/:sessionId/noproxy': {
19
- GET: {
20
- command: 'notProxiedCommand',
21
- neverProxy: true
22
- }
23
- }
24
- };
25
-
26
- constructor() {
27
- super();
28
- this.protocol = _constants.PROTOCOLS.MJSONWP;
29
- this.sessionId = null;
30
- this.jwpProxyActive = false;
31
- }
32
-
33
- sessionExists(sessionId) {
34
- if (!sessionId) {
35
- return false;
36
- }
37
-
38
- return sessionId === this.sessionId;
39
- }
40
-
41
- driverForSession() {
42
- return this;
43
- }
44
-
45
- async createSession(desiredCapabilities, requiredCapabilities, capabilities) {
46
- this.sessionId = `fakeSession_${_support.util.uuidV4()}`;
47
- return [this.sessionId, capabilities];
48
- }
49
-
50
- async executeCommand(cmd, ...args) {
51
- if (!this[cmd]) {
52
- throw new _lib.errors.NotYetImplementedError();
53
- }
54
-
55
- if (cmd === 'createSession') {
56
- this.protocol = (0, _lib.determineProtocol)(args);
57
- }
58
-
59
- return await this[cmd](...args);
60
- }
61
-
62
- async deleteSession() {
63
- this.jwpProxyActive = false;
64
- this.sessionId = null;
65
- }
66
-
67
- async getStatus() {
68
- return "I'm fine";
69
- }
70
-
71
- async setUrl(url) {
72
- return `Navigated to: ${url}`;
73
- }
74
-
75
- async getUrl() {
76
- return 'http://foobar.com';
77
- }
78
-
79
- async back(sessionId) {
80
- return sessionId;
81
- }
82
-
83
- async forward() {}
84
-
85
- async refresh() {
86
- throw new Error('Too Fresh!');
87
- }
88
-
89
- async getSession() {
90
- throw new _lib.errors.NoSuchDriverError();
91
- }
92
-
93
- async click(elementId, sessionId) {
94
- return [elementId, sessionId];
95
- }
96
-
97
- async implicitWait(ms) {
98
- return ms;
99
- }
100
-
101
- async clickCurrent(button) {
102
- return button;
103
- }
104
-
105
- async setNetworkConnection(type) {
106
- return type;
107
- }
108
-
109
- async moveTo(element, xOffset, yOffset) {
110
- return [element, xOffset, yOffset];
111
- }
112
-
113
- async getText() {
114
- return '';
115
- }
116
-
117
- async getAttribute(attr, elementId, sessionId) {
118
- return [attr, elementId, sessionId];
119
- }
120
-
121
- async setValue(value, elementId) {
122
- return [value, elementId];
123
- }
124
-
125
- async performTouch(...args) {
126
- return args;
127
- }
128
-
129
- async setFrame(frameId) {
130
- return frameId;
131
- }
132
-
133
- async removeApp(app) {
134
- return app;
135
- }
136
-
137
- async receiveAsyncResponse() {
138
- return {
139
- status: 13,
140
- value: 'Mishandled Driver Error'
141
- };
142
- }
143
-
144
- proxyActive() {
145
- return false;
146
- }
147
-
148
- getProxyAvoidList() {
149
- return [];
150
- }
151
-
152
- canProxy() {
153
- return false;
154
- }
155
-
156
- async notProxiedCommand() {
157
- return 'This was not proxied';
158
- }
159
-
160
- }
161
-
162
- exports.FakeDriver = FakeDriver;require('source-map-support').install();
163
-
164
-
165
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvcHJvdG9jb2wvZmFrZS1kcml2ZXIuanMiXSwibmFtZXMiOlsiRmFrZURyaXZlciIsIkJhc2VEcml2ZXIiLCJuZXdNZXRob2RNYXAiLCJHRVQiLCJjb21tYW5kIiwibmV2ZXJQcm94eSIsImNvbnN0cnVjdG9yIiwicHJvdG9jb2wiLCJQUk9UT0NPTFMiLCJNSlNPTldQIiwic2Vzc2lvbklkIiwiandwUHJveHlBY3RpdmUiLCJzZXNzaW9uRXhpc3RzIiwiZHJpdmVyRm9yU2Vzc2lvbiIsImNyZWF0ZVNlc3Npb24iLCJkZXNpcmVkQ2FwYWJpbGl0aWVzIiwicmVxdWlyZWRDYXBhYmlsaXRpZXMiLCJjYXBhYmlsaXRpZXMiLCJ1dGlsIiwidXVpZFY0IiwiZXhlY3V0ZUNvbW1hbmQiLCJjbWQiLCJhcmdzIiwiZXJyb3JzIiwiTm90WWV0SW1wbGVtZW50ZWRFcnJvciIsImRlbGV0ZVNlc3Npb24iLCJnZXRTdGF0dXMiLCJzZXRVcmwiLCJ1cmwiLCJnZXRVcmwiLCJiYWNrIiwiZm9yd2FyZCIsInJlZnJlc2giLCJFcnJvciIsImdldFNlc3Npb24iLCJOb1N1Y2hEcml2ZXJFcnJvciIsImNsaWNrIiwiZWxlbWVudElkIiwiaW1wbGljaXRXYWl0IiwibXMiLCJjbGlja0N1cnJlbnQiLCJidXR0b24iLCJzZXROZXR3b3JrQ29ubmVjdGlvbiIsInR5cGUiLCJtb3ZlVG8iLCJlbGVtZW50IiwieE9mZnNldCIsInlPZmZzZXQiLCJnZXRUZXh0IiwiZ2V0QXR0cmlidXRlIiwiYXR0ciIsInNldFZhbHVlIiwidmFsdWUiLCJwZXJmb3JtVG91Y2giLCJzZXRGcmFtZSIsImZyYW1lSWQiLCJyZW1vdmVBcHAiLCJhcHAiLCJyZWNlaXZlQXN5bmNSZXNwb25zZSIsInN0YXR1cyIsInByb3h5QWN0aXZlIiwiZ2V0UHJveHlBdm9pZExpc3QiLCJjYW5Qcm94eSIsIm5vdFByb3hpZWRDb21tYW5kIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxNQUFNQSxVQUFOLFNBQXlCQyxlQUF6QixDQUFvQztBQUVmLFNBQVpDLFlBQVksR0FBRztBQUNwQixtQ0FBK0I7QUFDN0JDLE1BQUFBLEdBQUcsRUFBRTtBQUFDQyxRQUFBQSxPQUFPLEVBQUUsbUJBQVY7QUFBK0JDLFFBQUFBLFVBQVUsRUFBRTtBQUEzQztBQUR3QjtBQURYLEdBQUg7O0FBTW5CQyxFQUFBQSxXQUFXLEdBQUk7QUFDYjtBQUNBLFNBQUtDLFFBQUwsR0FBZ0JDLHFCQUFVQyxPQUExQjtBQUNBLFNBQUtDLFNBQUwsR0FBaUIsSUFBakI7QUFDQSxTQUFLQyxjQUFMLEdBQXNCLEtBQXRCO0FBQ0Q7O0FBRURDLEVBQUFBLGFBQWEsQ0FBRUYsU0FBRixFQUFhO0FBQ3hCLFFBQUksQ0FBQ0EsU0FBTCxFQUFnQjtBQUNkLGFBQU8sS0FBUDtBQUNEOztBQUNELFdBQU9BLFNBQVMsS0FBSyxLQUFLQSxTQUExQjtBQUNEOztBQUVERyxFQUFBQSxnQkFBZ0IsR0FBaUI7QUFDL0IsV0FBTyxJQUFQO0FBQ0Q7O0FBRWtCLFFBQWJDLGFBQWEsQ0FBRUMsbUJBQUYsRUFBdUJDLG9CQUF2QixFQUE2Q0MsWUFBN0MsRUFBMkQ7QUFFNUUsU0FBS1AsU0FBTCxHQUFrQixlQUFjUSxjQUFLQyxNQUFMLEVBQWMsRUFBOUM7QUFDQSxXQUFPLENBQUMsS0FBS1QsU0FBTixFQUFpQk8sWUFBakIsQ0FBUDtBQUNEOztBQUVtQixRQUFkRyxjQUFjLENBQUVDLEdBQUYsRUFBTyxHQUFHQyxJQUFWLEVBQWdCO0FBQ2xDLFFBQUksQ0FBQyxLQUFLRCxHQUFMLENBQUwsRUFBZ0I7QUFDZCxZQUFNLElBQUlFLFlBQU9DLHNCQUFYLEVBQU47QUFDRDs7QUFDRCxRQUFJSCxHQUFHLEtBQUssZUFBWixFQUE2QjtBQUMzQixXQUFLZCxRQUFMLEdBQWdCLDRCQUFrQmUsSUFBbEIsQ0FBaEI7QUFDRDs7QUFDRCxXQUFPLE1BQU0sS0FBS0QsR0FBTCxFQUFVLEdBQUdDLElBQWIsQ0FBYjtBQUNEOztBQUVrQixRQUFiRyxhQUFhLEdBQUk7QUFDckIsU0FBS2QsY0FBTCxHQUFzQixLQUF0QjtBQUNBLFNBQUtELFNBQUwsR0FBaUIsSUFBakI7QUFDRDs7QUFFYyxRQUFUZ0IsU0FBUyxHQUFJO0FBQ2pCLFdBQU8sVUFBUDtBQUNEOztBQUVXLFFBQU5DLE1BQU0sQ0FBRUMsR0FBRixFQUFPO0FBQ2pCLFdBQVEsaUJBQWdCQSxHQUFJLEVBQTVCO0FBQ0Q7O0FBRVcsUUFBTkMsTUFBTSxHQUFJO0FBQ2QsV0FBTyxtQkFBUDtBQUNEOztBQUVTLFFBQUpDLElBQUksQ0FBRXBCLFNBQUYsRUFBYTtBQUNyQixXQUFPQSxTQUFQO0FBQ0Q7O0FBRVksUUFBUHFCLE9BQU8sR0FBSSxDQUFFOztBQUVOLFFBQVBDLE9BQU8sR0FBSTtBQUNmLFVBQU0sSUFBSUMsS0FBSixDQUFVLFlBQVYsQ0FBTjtBQUNEOztBQUVlLFFBQVZDLFVBQVUsR0FBSTtBQUNsQixVQUFNLElBQUlYLFlBQU9ZLGlCQUFYLEVBQU47QUFDRDs7QUFFVSxRQUFMQyxLQUFLLENBQUVDLFNBQUYsRUFBYTNCLFNBQWIsRUFBd0I7QUFDakMsV0FBTyxDQUFDMkIsU0FBRCxFQUFZM0IsU0FBWixDQUFQO0FBQ0Q7O0FBRWlCLFFBQVo0QixZQUFZLENBQUVDLEVBQUYsRUFBTTtBQUN0QixXQUFPQSxFQUFQO0FBQ0Q7O0FBRWlCLFFBQVpDLFlBQVksQ0FBRUMsTUFBRixFQUFVO0FBQzFCLFdBQU9BLE1BQVA7QUFDRDs7QUFFeUIsUUFBcEJDLG9CQUFvQixDQUFFQyxJQUFGLEVBQVE7QUFDaEMsV0FBT0EsSUFBUDtBQUNEOztBQUVXLFFBQU5DLE1BQU0sQ0FBRUMsT0FBRixFQUFXQyxPQUFYLEVBQW9CQyxPQUFwQixFQUE2QjtBQUN2QyxXQUFPLENBQUNGLE9BQUQsRUFBVUMsT0FBVixFQUFtQkMsT0FBbkIsQ0FBUDtBQUNEOztBQUVZLFFBQVBDLE9BQU8sR0FBSTtBQUNmLFdBQU8sRUFBUDtBQUNEOztBQUVpQixRQUFaQyxZQUFZLENBQUVDLElBQUYsRUFBUWIsU0FBUixFQUFtQjNCLFNBQW5CLEVBQThCO0FBQzlDLFdBQU8sQ0FBQ3dDLElBQUQsRUFBT2IsU0FBUCxFQUFrQjNCLFNBQWxCLENBQVA7QUFDRDs7QUFFYSxRQUFSeUMsUUFBUSxDQUFFQyxLQUFGLEVBQVNmLFNBQVQsRUFBb0I7QUFDaEMsV0FBTyxDQUFDZSxLQUFELEVBQVFmLFNBQVIsQ0FBUDtBQUNEOztBQUVpQixRQUFaZ0IsWUFBWSxDQUFFLEdBQUcvQixJQUFMLEVBQVc7QUFDM0IsV0FBT0EsSUFBUDtBQUNEOztBQUVhLFFBQVJnQyxRQUFRLENBQUVDLE9BQUYsRUFBVztBQUN2QixXQUFPQSxPQUFQO0FBQ0Q7O0FBRWMsUUFBVEMsU0FBUyxDQUFFQyxHQUFGLEVBQU87QUFDcEIsV0FBT0EsR0FBUDtBQUNEOztBQUV5QixRQUFwQkMsb0JBQW9CLEdBQUk7QUFFNUIsV0FBTztBQUFDQyxNQUFBQSxNQUFNLEVBQUUsRUFBVDtBQUFhUCxNQUFBQSxLQUFLLEVBQUU7QUFBcEIsS0FBUDtBQUNEOztBQUVEUSxFQUFBQSxXQUFXLEdBQWlCO0FBQzFCLFdBQU8sS0FBUDtBQUNEOztBQUVEQyxFQUFBQSxpQkFBaUIsR0FBaUI7QUFDaEMsV0FBTyxFQUFQO0FBQ0Q7O0FBRURDLEVBQUFBLFFBQVEsR0FBaUI7QUFDdkIsV0FBTyxLQUFQO0FBQ0Q7O0FBRXNCLFFBQWpCQyxpQkFBaUIsR0FBSTtBQUN6QixXQUFPLHNCQUFQO0FBQ0Q7O0FBeElpQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIHJlcXVpcmUtYXdhaXQgKi9cbmltcG9ydCB7IGVycm9ycywgQmFzZURyaXZlciwgZGV0ZXJtaW5lUHJvdG9jb2wgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IHsgUFJPVE9DT0xTIH0gZnJvbSAnLi4vLi4vbGliL2NvbnN0YW50cyc7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcblxuXG5jbGFzcyBGYWtlRHJpdmVyIGV4dGVuZHMgQmFzZURyaXZlciB7XG5cbiAgc3RhdGljIG5ld01ldGhvZE1hcCA9IHtcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9ub3Byb3h5Jzoge1xuICAgICAgR0VUOiB7Y29tbWFuZDogJ25vdFByb3hpZWRDb21tYW5kJywgbmV2ZXJQcm94eTogdHJ1ZX1cbiAgICB9XG4gIH07XG5cbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5wcm90b2NvbCA9IFBST1RPQ09MUy5NSlNPTldQO1xuICAgIHRoaXMuc2Vzc2lvbklkID0gbnVsbDtcbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG4gIH1cblxuICBzZXNzaW9uRXhpc3RzIChzZXNzaW9uSWQpIHtcbiAgICBpZiAoIXNlc3Npb25JZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gc2Vzc2lvbklkID09PSB0aGlzLnNlc3Npb25JZDtcbiAgfVxuXG4gIGRyaXZlckZvclNlc3Npb24gKC8qc2Vzc2lvbklkKi8pIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKGRlc2lyZWRDYXBhYmlsaXRpZXMsIHJlcXVpcmVkQ2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXMpIHtcbiAgICAvLyBVc2UgYSBjb3VudGVyIHRvIG1ha2Ugc3VyZSBlYWNoIHNlc3Npb24gaGFzIGEgdW5pcXVlIGlkXG4gICAgdGhpcy5zZXNzaW9uSWQgPSBgZmFrZVNlc3Npb25fJHt1dGlsLnV1aWRWNCgpfWA7XG4gICAgcmV0dXJuIFt0aGlzLnNlc3Npb25JZCwgY2FwYWJpbGl0aWVzXTtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVDb21tYW5kIChjbWQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIXRoaXNbY21kXSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RZZXRJbXBsZW1lbnRlZEVycm9yKCk7XG4gICAgfVxuICAgIGlmIChjbWQgPT09ICdjcmVhdGVTZXNzaW9uJykge1xuICAgICAgdGhpcy5wcm90b2NvbCA9IGRldGVybWluZVByb3RvY29sKGFyZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpc1tjbWRdKC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlU2Vzc2lvbiAoKSB7XG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuc2Vzc2lvbklkID0gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIGdldFN0YXR1cyAoKSB7XG4gICAgcmV0dXJuIFwiSSdtIGZpbmVcIjtcbiAgfVxuXG4gIGFzeW5jIHNldFVybCAodXJsKSB7XG4gICAgcmV0dXJuIGBOYXZpZ2F0ZWQgdG86ICR7dXJsfWA7XG4gIH1cblxuICBhc3luYyBnZXRVcmwgKCkge1xuICAgIHJldHVybiAnaHR0cDovL2Zvb2Jhci5jb20nO1xuICB9XG5cbiAgYXN5bmMgYmFjayAoc2Vzc2lvbklkKSB7XG4gICAgcmV0dXJuIHNlc3Npb25JZDtcbiAgfVxuXG4gIGFzeW5jIGZvcndhcmQgKCkge31cblxuICBhc3luYyByZWZyZXNoICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RvbyBGcmVzaCEnKTtcbiAgfVxuXG4gIGFzeW5jIGdldFNlc3Npb24gKCkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm9TdWNoRHJpdmVyRXJyb3IoKTtcbiAgfVxuXG4gIGFzeW5jIGNsaWNrIChlbGVtZW50SWQsIHNlc3Npb25JZCkge1xuICAgIHJldHVybiBbZWxlbWVudElkLCBzZXNzaW9uSWRdO1xuICB9XG5cbiAgYXN5bmMgaW1wbGljaXRXYWl0IChtcykge1xuICAgIHJldHVybiBtcztcbiAgfVxuXG4gIGFzeW5jIGNsaWNrQ3VycmVudCAoYnV0dG9uKSB7XG4gICAgcmV0dXJuIGJ1dHRvbjtcbiAgfVxuXG4gIGFzeW5jIHNldE5ldHdvcmtDb25uZWN0aW9uICh0eXBlKSB7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBhc3luYyBtb3ZlVG8gKGVsZW1lbnQsIHhPZmZzZXQsIHlPZmZzZXQpIHtcbiAgICByZXR1cm4gW2VsZW1lbnQsIHhPZmZzZXQsIHlPZmZzZXRdO1xuICB9XG5cbiAgYXN5bmMgZ2V0VGV4dCAoKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgYXN5bmMgZ2V0QXR0cmlidXRlIChhdHRyLCBlbGVtZW50SWQsIHNlc3Npb25JZCkge1xuICAgIHJldHVybiBbYXR0ciwgZWxlbWVudElkLCBzZXNzaW9uSWRdO1xuICB9XG5cbiAgYXN5bmMgc2V0VmFsdWUgKHZhbHVlLCBlbGVtZW50SWQpIHtcbiAgICByZXR1cm4gW3ZhbHVlLCBlbGVtZW50SWRdO1xuICB9XG5cbiAgYXN5bmMgcGVyZm9ybVRvdWNoICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIGFyZ3M7XG4gIH1cblxuICBhc3luYyBzZXRGcmFtZSAoZnJhbWVJZCkge1xuICAgIHJldHVybiBmcmFtZUlkO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlQXBwIChhcHApIHtcbiAgICByZXR1cm4gYXBwO1xuICB9XG5cbiAgYXN5bmMgcmVjZWl2ZUFzeW5jUmVzcG9uc2UgKCkge1xuICAgIC8vIHRoaXMgaXMgaGVyZSB0byB0ZXN0IGEgZmFpbGluZyBjb21tYW5kIHRoYXQgZG9lcyBub3QgdGhyb3cgYW4gZXJyb3JcbiAgICByZXR1cm4ge3N0YXR1czogMTMsIHZhbHVlOiAnTWlzaGFuZGxlZCBEcml2ZXIgRXJyb3InfTtcbiAgfVxuXG4gIHByb3h5QWN0aXZlICgvKnNlc3Npb25JZCovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0UHJveHlBdm9pZExpc3QgKC8qc2Vzc2lvbklkKi8pIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjYW5Qcm94eSAoLypzZXNzaW9uSWQqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIG5vdFByb3hpZWRDb21tYW5kICgpIHtcbiAgICByZXR1cm4gJ1RoaXMgd2FzIG5vdCBwcm94aWVkJztcbiAgfVxufVxuXG5leHBvcnQgeyBGYWtlRHJpdmVyIH07XG4iXSwiZmlsZSI6InRlc3QvcHJvdG9jb2wvZmFrZS1kcml2ZXIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==