@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.
- package/build/lib/basedriver/capabilities.d.ts +80 -0
- package/build/lib/basedriver/capabilities.d.ts.map +1 -0
- package/build/lib/basedriver/capabilities.js +12 -13
- package/build/lib/basedriver/commands/event.d.ts +9 -0
- package/build/lib/basedriver/commands/event.d.ts.map +1 -0
- package/build/lib/basedriver/commands/event.js +21 -23
- package/build/lib/basedriver/commands/find.d.ts +11 -0
- package/build/lib/basedriver/commands/find.d.ts.map +1 -0
- package/build/lib/basedriver/commands/find.js +42 -37
- package/build/lib/basedriver/commands/index.d.ts +8 -0
- package/build/lib/basedriver/commands/index.d.ts.map +1 -0
- package/build/lib/basedriver/commands/index.js +17 -16
- package/build/lib/basedriver/commands/log.d.ts +12 -0
- package/build/lib/basedriver/commands/log.d.ts.map +1 -0
- package/build/lib/basedriver/commands/log.js +23 -27
- package/build/lib/basedriver/commands/session.d.ts +11 -0
- package/build/lib/basedriver/commands/session.d.ts.map +1 -0
- package/build/lib/basedriver/commands/session.js +21 -149
- package/build/lib/basedriver/commands/settings.d.ts +10 -0
- package/build/lib/basedriver/commands/settings.d.ts.map +1 -0
- package/build/lib/basedriver/commands/settings.js +19 -19
- package/build/lib/basedriver/commands/timeout.d.ts +8 -0
- package/build/lib/basedriver/commands/timeout.d.ts.map +1 -0
- package/build/lib/basedriver/commands/timeout.js +118 -139
- package/build/lib/basedriver/core.d.ts +235 -0
- package/build/lib/basedriver/core.d.ts.map +1 -0
- package/build/lib/basedriver/core.js +283 -0
- package/build/lib/basedriver/desired-caps.d.ts +5 -0
- package/build/lib/basedriver/desired-caps.d.ts.map +1 -0
- package/build/lib/basedriver/desired-caps.js +2 -4
- package/build/lib/basedriver/device-settings.d.ts +32 -0
- package/build/lib/basedriver/device-settings.d.ts.map +1 -0
- package/build/lib/basedriver/device-settings.js +20 -14
- package/build/lib/basedriver/driver.d.ts +83 -0
- package/build/lib/basedriver/driver.d.ts.map +1 -0
- package/build/lib/basedriver/driver.js +101 -256
- package/build/lib/basedriver/helpers.d.ts +132 -0
- package/build/lib/basedriver/helpers.d.ts.map +1 -0
- package/build/lib/basedriver/helpers.js +16 -2
- package/build/lib/basedriver/logger.d.ts +3 -0
- package/build/lib/basedriver/logger.d.ts.map +1 -0
- package/build/lib/basedriver/logger.js +2 -4
- package/build/lib/constants.d.ts +9 -0
- package/build/lib/constants.d.ts.map +1 -0
- package/build/lib/constants.js +2 -4
- package/build/lib/express/crash.d.ts +3 -0
- package/build/lib/express/crash.d.ts.map +1 -0
- package/build/lib/express/crash.js +2 -4
- package/build/lib/express/express-logging.d.ts +3 -0
- package/build/lib/express/express-logging.d.ts.map +1 -0
- package/build/lib/express/express-logging.js +2 -4
- package/build/lib/express/idempotency.d.ts +2 -0
- package/build/lib/express/idempotency.d.ts.map +1 -0
- package/build/lib/express/idempotency.js +2 -4
- package/build/lib/express/logger.d.ts +3 -0
- package/build/lib/express/logger.d.ts.map +1 -0
- package/build/lib/express/logger.js +2 -4
- package/build/lib/express/middleware.d.ts +9 -0
- package/build/lib/express/middleware.d.ts.map +1 -0
- package/build/lib/express/middleware.js +2 -4
- package/build/lib/express/server.d.ts +10 -0
- package/build/lib/express/server.d.ts.map +1 -0
- package/build/lib/express/server.js +2 -4
- package/build/lib/express/static.d.ts +6 -0
- package/build/lib/express/static.d.ts.map +1 -0
- package/build/lib/express/static.js +2 -4
- package/build/lib/express/websocket.d.ts +64 -0
- package/build/lib/express/websocket.d.ts.map +1 -0
- package/build/lib/express/websocket.js +40 -41
- package/build/lib/helpers/capabilities.d.ts +13 -0
- package/build/lib/helpers/capabilities.d.ts.map +1 -0
- package/build/lib/helpers/capabilities.js +40 -2
- package/build/lib/index.d.ts +183 -0
- package/build/lib/index.d.ts.map +1 -0
- package/build/lib/index.js +41 -23
- package/build/lib/jsonwp-proxy/protocol-converter.d.ts +48 -0
- package/build/lib/jsonwp-proxy/protocol-converter.d.ts.map +1 -0
- package/build/lib/jsonwp-proxy/protocol-converter.js +2 -4
- package/build/lib/jsonwp-proxy/proxy.d.ts +41 -0
- package/build/lib/jsonwp-proxy/proxy.d.ts.map +1 -0
- package/build/lib/jsonwp-proxy/proxy.js +25 -9
- package/build/lib/jsonwp-status/status.d.ts +159 -0
- package/build/lib/jsonwp-status/status.d.ts.map +1 -0
- package/build/lib/jsonwp-status/status.js +2 -4
- package/build/lib/protocol/errors.d.ts +310 -0
- package/build/lib/protocol/errors.d.ts.map +1 -0
- package/build/lib/protocol/errors.js +82 -5
- package/build/lib/protocol/helpers.d.ts +22 -0
- package/build/lib/protocol/helpers.d.ts.map +1 -0
- package/build/lib/protocol/helpers.js +2 -4
- package/build/lib/protocol/index.d.ts +16 -0
- package/build/lib/protocol/index.d.ts.map +1 -0
- package/build/lib/protocol/index.js +8 -10
- package/build/lib/protocol/protocol.d.ts +11 -0
- package/build/lib/protocol/protocol.d.ts.map +1 -0
- package/build/lib/protocol/protocol.js +3 -9
- package/build/lib/protocol/routes.d.ts +6 -0
- package/build/lib/protocol/routes.d.ts.map +1 -0
- package/build/lib/protocol/routes.js +18 -4
- package/build/lib/protocol/validators.d.ts +8 -0
- package/build/lib/protocol/validators.d.ts.map +1 -0
- package/build/lib/protocol/validators.js +2 -4
- package/build/test/basedriver/README.md +5 -0
- package/build/test/basedriver/driver-e2e-tests.js +2 -4
- package/build/test/basedriver/driver-tests.js +31 -6
- package/build/test/basedriver/index.js +2 -4
- package/build/test/e2e/basedriver/driver.e2e.spec.js +15 -0
- package/build/test/e2e/basedriver/helpers.e2e.spec.js +192 -0
- package/build/test/e2e/basedriver/websockets.e2e.spec.js +87 -0
- package/build/test/e2e/express/server.e2e.spec.js +159 -0
- package/build/test/e2e/jsonwp-proxy/proxy.e2e.spec.js +59 -0
- package/build/test/e2e/protocol/fake-driver.js +163 -0
- package/build/test/e2e/protocol/helpers.js +25 -0
- package/build/test/e2e/protocol/protocol.e2e.spec.js +1186 -0
- package/build/test/helpers.js +2 -4
- package/build/test/unit/basedriver/capabilities.spec.js +672 -0
- package/build/test/unit/basedriver/capability.spec.js +353 -0
- package/build/test/unit/basedriver/commands/event.spec.js +110 -0
- package/build/test/unit/basedriver/commands/log.spec.js +92 -0
- package/build/test/unit/basedriver/driver.spec.js +15 -0
- package/build/test/unit/basedriver/helpers.spec.js +151 -0
- package/build/test/unit/basedriver/timeout.spec.js +135 -0
- package/build/test/unit/express/server.spec.js +155 -0
- package/build/test/unit/express/static.spec.js +26 -0
- package/build/test/unit/jsonwp-proxy/mock-request.js +91 -0
- package/build/test/unit/jsonwp-proxy/protocol-converter.spec.js +171 -0
- package/build/test/unit/jsonwp-proxy/proxy.spec.js +292 -0
- package/build/test/unit/jsonwp-proxy/url.spec.js +165 -0
- package/build/test/unit/jsonwp-status/status.spec.js +34 -0
- package/build/test/unit/protocol/errors.spec.js +390 -0
- package/build/test/unit/protocol/routes.spec.js +80 -0
- package/build/test/unit/protocol/validator.spec.js +149 -0
- package/build/tsconfig.tsbuildinfo +1 -0
- package/lib/basedriver/capabilities.js +49 -10
- package/lib/basedriver/commands/event.js +49 -31
- package/lib/basedriver/commands/find.js +108 -43
- package/lib/basedriver/commands/index.js +25 -19
- package/lib/basedriver/commands/log.js +60 -33
- package/lib/basedriver/commands/session.js +39 -141
- package/lib/basedriver/commands/settings.js +33 -13
- package/lib/basedriver/commands/timeout.js +153 -153
- package/lib/basedriver/core.js +497 -0
- package/lib/basedriver/desired-caps.js +1 -1
- package/lib/basedriver/device-settings.js +47 -12
- package/lib/basedriver/driver.js +272 -383
- package/lib/basedriver/helpers.js +18 -2
- package/lib/express/websocket.js +35 -32
- package/lib/helpers/capabilities.js +60 -1
- package/lib/index.js +16 -12
- package/lib/jsonwp-proxy/proxy.js +26 -6
- package/lib/protocol/errors.js +42 -42
- package/lib/protocol/index.js +4 -4
- package/lib/protocol/protocol.js +1 -3
- package/lib/protocol/routes.js +9 -0
- package/package.json +22 -14
- package/test/basedriver/README.md +5 -0
- package/test/basedriver/driver-e2e-tests.js +1 -1
- package/test/basedriver/driver-tests.js +31 -2
- package/build/test/basedriver/capabilities-specs.js +0 -674
- package/build/test/basedriver/capability-specs.js +0 -355
- package/build/test/basedriver/commands/event-specs.js +0 -112
- package/build/test/basedriver/commands/log-specs.js +0 -87
- package/build/test/basedriver/driver-e2e-specs.js +0 -17
- package/build/test/basedriver/driver-specs.js +0 -17
- package/build/test/basedriver/helpers-e2e-specs.js +0 -194
- package/build/test/basedriver/helpers-specs.js +0 -153
- package/build/test/basedriver/timeout-specs.js +0 -137
- package/build/test/basedriver/websockets-e2e-specs.js +0 -84
- package/build/test/express/server-e2e-specs.js +0 -161
- package/build/test/express/server-specs.js +0 -157
- package/build/test/express/static-specs.js +0 -28
- package/build/test/jsonwp-proxy/mock-request.js +0 -93
- package/build/test/jsonwp-proxy/protocol-converter-specs.js +0 -173
- package/build/test/jsonwp-proxy/proxy-e2e-specs.js +0 -61
- package/build/test/jsonwp-proxy/proxy-specs.js +0 -294
- package/build/test/jsonwp-proxy/url-specs.js +0 -167
- package/build/test/jsonwp-status/status-specs.js +0 -36
- package/build/test/protocol/errors-specs.js +0 -388
- package/build/test/protocol/fake-driver.js +0 -165
- package/build/test/protocol/helpers.js +0 -27
- package/build/test/protocol/protocol-e2e-specs.js +0 -1188
- package/build/test/protocol/routes-specs.js +0 -82
- package/build/test/protocol/validator-specs.js +0 -151
- package/index.d.ts +0 -386
- package/test/basedriver/capabilities-specs.js +0 -537
- package/test/basedriver/capability-specs.js +0 -383
- package/test/basedriver/commands/event-specs.js +0 -74
- package/test/basedriver/commands/log-specs.js +0 -79
- package/test/basedriver/driver-e2e-specs.js +0 -8
- package/test/basedriver/driver-specs.js +0 -8
- package/test/basedriver/fixtures/BadZippedApp.zip +0 -1
- package/test/basedriver/fixtures/FakeAndroidApp.apk +0 -1
- package/test/basedriver/fixtures/FakeAndroidApp.asd +0 -0
- package/test/basedriver/fixtures/FakeIOSApp.app +0 -1
- package/test/basedriver/fixtures/FakeIOSApp.app.zip +0 -0
- package/test/basedriver/fixtures/FakeIOSApp.ipa +0 -0
- package/test/basedriver/fixtures/custom-element-finder-bad.js +0 -5
- package/test/basedriver/fixtures/custom-element-finder.js +0 -29
- package/test/basedriver/helpers-e2e-specs.js +0 -187
- package/test/basedriver/helpers-specs.js +0 -137
- package/test/basedriver/timeout-specs.js +0 -128
- 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvcHJvdG9jb2wvZmFrZS1kcml2ZXIuanMiXSwibmFtZXMiOlsiRmFrZURyaXZlciIsIkJhc2VEcml2ZXIiLCJuZXdNZXRob2RNYXAiLCJHRVQiLCJjb21tYW5kIiwibmV2ZXJQcm94eSIsImNvbnN0cnVjdG9yIiwicHJvdG9jb2wiLCJQUk9UT0NPTFMiLCJNSlNPTldQIiwic2Vzc2lvbklkIiwiandwUHJveHlBY3RpdmUiLCJzZXNzaW9uRXhpc3RzIiwiZHJpdmVyRm9yU2Vzc2lvbiIsImNyZWF0ZVNlc3Npb24iLCJkZXNpcmVkQ2FwYWJpbGl0aWVzIiwicmVxdWlyZWRDYXBhYmlsaXRpZXMiLCJjYXBhYmlsaXRpZXMiLCJ1dGlsIiwidXVpZFY0IiwiZXhlY3V0ZUNvbW1hbmQiLCJjbWQiLCJhcmdzIiwiZXJyb3JzIiwiTm90WWV0SW1wbGVtZW50ZWRFcnJvciIsImRlbGV0ZVNlc3Npb24iLCJnZXRTdGF0dXMiLCJzZXRVcmwiLCJ1cmwiLCJnZXRVcmwiLCJiYWNrIiwiZm9yd2FyZCIsInJlZnJlc2giLCJFcnJvciIsImdldFNlc3Npb24iLCJOb1N1Y2hEcml2ZXJFcnJvciIsImNsaWNrIiwiZWxlbWVudElkIiwiaW1wbGljaXRXYWl0IiwibXMiLCJjbGlja0N1cnJlbnQiLCJidXR0b24iLCJzZXROZXR3b3JrQ29ubmVjdGlvbiIsInR5cGUiLCJtb3ZlVG8iLCJlbGVtZW50IiwieE9mZnNldCIsInlPZmZzZXQiLCJnZXRUZXh0IiwiZ2V0QXR0cmlidXRlIiwiYXR0ciIsInNldFZhbHVlIiwidmFsdWUiLCJwZXJmb3JtVG91Y2giLCJzZXRGcmFtZSIsImZyYW1lSWQiLCJyZW1vdmVBcHAiLCJhcHAiLCJyZWNlaXZlQXN5bmNSZXNwb25zZSIsInN0YXR1cyIsInByb3h5QWN0aXZlIiwiZ2V0UHJveHlBdm9pZExpc3QiLCJjYW5Qcm94eSIsIm5vdFByb3hpZWRDb21tYW5kIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFH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LEVBQThCO0FBQzlDLFdBQU8sQ0FBQ3dDLElBQUQsRUFBT2IsU0FBUCxFQUFrQjNCLFNBQWxCLENBQVA7QUFDRDs7QUFFYSxRQUFSeUMsUUFBUSxDQUFFQyxLQUFGLEVBQVNmLFNBQVQsRUFBb0I7QUFDaEMsV0FBTyxDQUFDZSxLQUFELEVBQVFmLFNBQVIsQ0FBUDtBQUNEOztBQUVpQixRQUFaZ0IsWUFBWSxDQUFFLEdBQUcvQixJQUFMLEVBQVc7QUFDM0IsV0FBT0EsSUFBUDtBQUNEOztBQUVhLFFBQVJnQyxRQUFRLENBQUVDLE9BQUYsRUFBVztBQUN2QixXQUFPQSxPQUFQO0FBQ0Q7O0FBRWMsUUFBVEMsU0FBUyxDQUFFQyxHQUFGLEVBQU87QUFDcEIsV0FBT0EsR0FBUDtBQUNEOztBQUV5QixRQUFwQkMsb0JBQW9CLEdBQUk7QUFFNUIsV0FBTztBQUFDQyxNQUFBQSxNQUFNLEVBQUUsRUFBVDtBQUFhUCxNQUFBQSxLQUFLLEVBQUU7QUFBcEIsS0FBUDtBQUNEOztBQUVEUSxFQUFBQSxXQUFXLEdBQWlCO0FBQzFCLFdBQU8sS0FBUDtBQUNEOztBQUVEQyxFQUFBQSxpQkFBaUIsR0FBaUI7QUFDaEMsV0FBTyxFQUFQO0FBQ0Q7O0FBRURDLEVBQUFBLFFBQVEsR0FBaUI7QUFDdkIsV0FBTyxLQUFQO0FBQ0Q7O0FBRXNCLFFBQWpCQyxpQkFBaUIsR0FBSTtBQUN6QixXQUFPLHNCQUFQO0FBQ0Q7O0FBeElpQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIHJlcXVpcmUtYXdhaXQgKi9cbmltcG9ydCB7IGVycm9ycywgQmFzZURyaXZlciwgZGV0ZXJtaW5lUHJvdG9jb2wgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IHsgUFJPVE9DT0xTIH0gZnJvbSAnLi4vLi4vbGliL2NvbnN0YW50cyc7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcblxuXG5jbGFzcyBGYWtlRHJpdmVyIGV4dGVuZHMgQmFzZURyaXZlciB7XG5cbiAgc3RhdGljIG5ld01ldGhvZE1hcCA9IHtcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9ub3Byb3h5Jzoge1xuICAgICAgR0VUOiB7Y29tbWFuZDogJ25vdFByb3hpZWRDb21tYW5kJywgbmV2ZXJQcm94eTogdHJ1ZX1cbiAgICB9XG4gIH07XG5cbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5wcm90b2NvbCA9IFBST1RPQ09MUy5NSlNPTldQO1xuICAgIHRoaXMuc2Vzc2lvbklkID0gbnVsbDtcbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG4gIH1cblxuICBzZXNzaW9uRXhpc3RzIChzZXNzaW9uSWQpIHtcbiAgICBpZiAoIXNlc3Npb25JZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gc2Vzc2lvbklkID09PSB0aGlzLnNlc3Npb25JZDtcbiAgfVxuXG4gIGRyaXZlckZvclNlc3Npb24gKC8qc2Vzc2lvbklkKi8pIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKGRlc2lyZWRDYXBhYmlsaXRpZXMsIHJlcXVpcmVkQ2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXMpIHtcbiAgICAvLyBVc2UgYSBjb3VudGVyIHRvIG1ha2Ugc3VyZSBlYWNoIHNlc3Npb24gaGFzIGEgdW5pcXVlIGlkXG4gICAgdGhpcy5zZXNzaW9uSWQgPSBgZmFrZVNlc3Npb25fJHt1dGlsLnV1aWRWNCgpfWA7XG4gICAgcmV0dXJuIFt0aGlzLnNlc3Npb25JZCwgY2FwYWJpbGl0aWVzXTtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVDb21tYW5kIChjbWQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIXRoaXNbY21kXSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RZZXRJbXBsZW1lbnRlZEVycm9yKCk7XG4gICAgfVxuICAgIGlmIChjbWQgPT09ICdjcmVhdGVTZXNzaW9uJykge1xuICAgICAgdGhpcy5wcm90b2NvbCA9IGRldGVybWluZVByb3RvY29sKGFyZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpc1tjbWRdKC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlU2Vzc2lvbiAoKSB7XG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuc2Vzc2lvbklkID0gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIGdldFN0YXR1cyAoKSB7XG4gICAgcmV0dXJuIFwiSSdtIGZpbmVcIjtcbiAgfVxuXG4gIGFzeW5jIHNldFVybCAodXJsKSB7XG4gICAgcmV0dXJuIGBOYXZpZ2F0ZWQgdG86ICR7dXJsfWA7XG4gIH1cblxuICBhc3luYyBnZXRVcmwgKCkge1xuICAgIHJldHVybiAnaHR0cDovL2Zvb2Jhci5jb20nO1xuICB9XG5cbiAgYXN5bmMgYmFjayAoc2Vzc2lvbklkKSB7XG4gICAgcmV0dXJuIHNlc3Npb25JZDtcbiAgfVxuXG4gIGFzeW5jIGZvcndhcmQgKCkge31cblxuICBhc3luYyByZWZyZXNoICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RvbyBGcmVzaCEnKTtcbiAgfVxuXG4gIGFzeW5jIGdldFNlc3Npb24gKCkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm9TdWNoRHJpdmVyRXJyb3IoKTtcbiAgfVxuXG4gIGFzeW5jIGNsaWNrIChlbGVtZW50SWQsIHNlc3Npb25JZCkge1xuICAgIHJldHVybiBbZWxlbWVudElkLCBzZXNzaW9uSWRdO1xuICB9XG5cbiAgYXN5bmMgaW1wbGljaXRXYWl0IChtcykge1xuICAgIHJldHVybiBtcztcbiAgfVxuXG4gIGFzeW5jIGNsaWNrQ3VycmVudCAoYnV0dG9uKSB7XG4gICAgcmV0dXJuIGJ1dHRvbjtcbiAgfVxuXG4gIGFzeW5jIHNldE5ldHdvcmtDb25uZWN0aW9uICh0eXBlKSB7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBhc3luYyBtb3ZlVG8gKGVsZW1lbnQsIHhPZmZzZXQsIHlPZmZzZXQpIHtcbiAgICByZXR1cm4gW2VsZW1lbnQsIHhPZmZzZXQsIHlPZmZzZXRdO1xuICB9XG5cbiAgYXN5bmMgZ2V0VGV4dCAoKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgYXN5bmMgZ2V0QXR0cmlidXRlIChhdHRyLCBlbGVtZW50SWQsIHNlc3Npb25JZCkge1xuICAgIHJldHVybiBbYXR0ciwgZWxlbWVudElkLCBzZXNzaW9uSWRdO1xuICB9XG5cbiAgYXN5bmMgc2V0VmFsdWUgKHZhbHVlLCBlbGVtZW50SWQpIHtcbiAgICByZXR1cm4gW3ZhbHVlLCBlbGVtZW50SWRdO1xuICB9XG5cbiAgYXN5bmMgcGVyZm9ybVRvdWNoICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIGFyZ3M7XG4gIH1cblxuICBhc3luYyBzZXRGcmFtZSAoZnJhbWVJZCkge1xuICAgIHJldHVybiBmcmFtZUlkO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlQXBwIChhcHApIHtcbiAgICByZXR1cm4gYXBwO1xuICB9XG5cbiAgYXN5bmMgcmVjZWl2ZUFzeW5jUmVzcG9uc2UgKCkge1xuICAgIC8vIHRoaXMgaXMgaGVyZSB0byB0ZXN0IGEgZmFpbGluZyBjb21tYW5kIHRoYXQgZG9lcyBub3QgdGhyb3cgYW4gZXJyb3JcbiAgICByZXR1cm4ge3N0YXR1czogMTMsIHZhbHVlOiAnTWlzaGFuZGxlZCBEcml2ZXIgRXJyb3InfTtcbiAgfVxuXG4gIHByb3h5QWN0aXZlICgvKnNlc3Npb25JZCovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0UHJveHlBdm9pZExpc3QgKC8qc2Vzc2lvbklkKi8pIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjYW5Qcm94eSAoLypzZXNzaW9uSWQqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIG5vdFByb3hpZWRDb21tYW5kICgpIHtcbiAgICByZXR1cm4gJ1RoaXMgd2FzIG5vdCBwcm94aWVkJztcbiAgfVxufVxuXG5leHBvcnQgeyBGYWtlRHJpdmVyIH07XG4iXSwiZmlsZSI6InRlc3QvcHJvdG9jb2wvZmFrZS1kcml2ZXIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|