@appium/base-driver 8.7.1 → 8.7.3
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 +207 -42
- package/build/lib/basedriver/capabilities.d.ts.map +1 -1
- package/build/lib/basedriver/capabilities.js +39 -44
- package/build/lib/basedriver/capabilities.js.map +1 -0
- package/build/lib/basedriver/commands/event.js +3 -3
- package/build/lib/basedriver/commands/event.js.map +1 -0
- package/build/lib/basedriver/commands/execute.js +3 -3
- package/build/lib/basedriver/commands/execute.js.map +1 -0
- package/build/lib/basedriver/commands/find.js.map +1 -0
- package/build/lib/basedriver/commands/index.js.map +1 -0
- package/build/lib/basedriver/commands/log.js +3 -3
- package/build/lib/basedriver/commands/log.js.map +1 -0
- package/build/lib/basedriver/commands/session.js +3 -3
- package/build/lib/basedriver/commands/session.js.map +1 -0
- package/build/lib/basedriver/commands/settings.js.map +1 -0
- package/build/lib/basedriver/commands/timeout.js +3 -3
- package/build/lib/basedriver/commands/timeout.js.map +1 -0
- package/build/lib/basedriver/core.d.ts +171 -20
- package/build/lib/basedriver/core.d.ts.map +1 -1
- package/build/lib/basedriver/core.js +4 -6
- package/build/lib/basedriver/core.js.map +1 -0
- package/build/lib/basedriver/desired-caps.d.ts +0 -2
- package/build/lib/basedriver/desired-caps.d.ts.map +1 -1
- package/build/lib/basedriver/desired-caps.js +4 -53
- package/build/lib/basedriver/desired-caps.js.map +1 -0
- package/build/lib/basedriver/device-settings.js +3 -3
- package/build/lib/basedriver/device-settings.js.map +1 -0
- package/build/lib/basedriver/driver.d.ts +323 -28
- package/build/lib/basedriver/driver.d.ts.map +1 -1
- package/build/lib/basedriver/driver.js +27 -30
- package/build/lib/basedriver/driver.js.map +1 -0
- package/build/lib/basedriver/helpers.d.ts +1 -1
- package/build/lib/basedriver/helpers.d.ts.map +1 -1
- package/build/lib/basedriver/helpers.js +3 -3
- package/build/lib/basedriver/helpers.js.map +1 -0
- package/build/lib/basedriver/logger.js.map +1 -0
- package/build/lib/constants.js.map +1 -0
- package/build/lib/express/crash.js.map +1 -0
- package/build/lib/express/express-logging.js +3 -3
- package/build/lib/express/express-logging.js.map +1 -0
- package/build/lib/express/idempotency.js +3 -3
- package/build/lib/express/idempotency.js.map +1 -0
- package/build/lib/express/logger.js.map +1 -0
- package/build/lib/express/middleware.js +3 -3
- package/build/lib/express/middleware.js.map +1 -0
- package/build/lib/express/server.js +3 -3
- package/build/lib/express/server.js.map +1 -0
- package/build/lib/express/static.js +3 -3
- package/build/lib/express/static.js.map +1 -0
- package/build/lib/express/websocket.js +3 -3
- package/build/lib/express/websocket.js.map +1 -0
- package/build/lib/helpers/capabilities.d.ts +66 -5
- package/build/lib/helpers/capabilities.d.ts.map +1 -1
- package/build/lib/helpers/capabilities.js +7 -7
- package/build/lib/helpers/capabilities.js.map +1 -0
- package/build/lib/index.d.ts +1 -1
- package/build/lib/index.d.ts.map +1 -1
- package/build/lib/index.js +10 -3
- package/build/lib/index.js.map +1 -0
- package/build/lib/jsonwp-proxy/protocol-converter.js +3 -3
- package/build/lib/jsonwp-proxy/protocol-converter.js.map +1 -0
- package/build/lib/jsonwp-proxy/proxy.js +3 -3
- package/build/lib/jsonwp-proxy/proxy.js.map +1 -0
- package/build/lib/jsonwp-status/status.js +3 -3
- package/build/lib/jsonwp-status/status.js.map +1 -0
- package/build/lib/protocol/errors.js +3 -3
- package/build/lib/protocol/errors.js.map +1 -0
- package/build/lib/protocol/helpers.js +3 -3
- package/build/lib/protocol/helpers.js.map +1 -0
- package/build/lib/protocol/index.js.map +1 -0
- package/build/lib/protocol/protocol.js +3 -3
- package/build/lib/protocol/protocol.js.map +1 -0
- package/build/lib/protocol/routes.js +3 -3
- package/build/lib/protocol/routes.js.map +1 -0
- package/build/lib/protocol/validators.js +3 -3
- package/build/lib/protocol/validators.js.map +1 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/lib/basedriver/capabilities.js +151 -93
- package/lib/basedriver/core.js +34 -18
- package/lib/basedriver/desired-caps.js +1 -53
- package/lib/basedriver/driver.js +113 -51
- package/lib/helpers/capabilities.js +19 -9
- package/lib/index.js +1 -0
- package/package.json +9 -10
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
3
|
Object.defineProperty(exports, "__esModule", {
|
|
6
4
|
value: true
|
|
7
5
|
});
|
|
@@ -27,7 +25,9 @@ var _commands = require("./commands");
|
|
|
27
25
|
|
|
28
26
|
var _helpers = _interopRequireDefault(require("./helpers"));
|
|
29
27
|
|
|
30
|
-
var
|
|
28
|
+
var _types = require("@appium/types");
|
|
29
|
+
|
|
30
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
31
31
|
|
|
32
32
|
const EVENT_SESSION_INIT = 'newSessionRequested';
|
|
33
33
|
const EVENT_SESSION_START = 'newSessionStarted';
|
|
@@ -36,8 +36,21 @@ const EVENT_SESSION_QUIT_DONE = 'quitSessionFinished';
|
|
|
36
36
|
const ON_UNEXPECTED_SHUTDOWN_EVENT = 'onUnexpectedShutdown';
|
|
37
37
|
|
|
38
38
|
class BaseDriverCore extends _core.DriverCore {
|
|
39
|
-
_constraints = _lodash.default.cloneDeep(_desiredCaps.desiredCapabilityConstraints);
|
|
40
39
|
cliArgs;
|
|
40
|
+
caps;
|
|
41
|
+
originalCaps;
|
|
42
|
+
desiredCapConstraints;
|
|
43
|
+
opts;
|
|
44
|
+
static BASE_DESIRED_CAP_CONSTRAINTS = _types.BASE_DESIRED_CAP_CONSTRAINTS;
|
|
45
|
+
|
|
46
|
+
constructor(opts = {}, shouldValidateCaps = true) {
|
|
47
|
+
super(opts, shouldValidateCaps);
|
|
48
|
+
this.opts = opts;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
get _desiredCapConstraints() {
|
|
52
|
+
return Object.freeze(_lodash.default.merge({}, _types.BASE_DESIRED_CAP_CONSTRAINTS, this.desiredCapConstraints));
|
|
53
|
+
}
|
|
41
54
|
|
|
42
55
|
async executeCommand(cmd, ...args) {
|
|
43
56
|
let startTime = Date.now();
|
|
@@ -165,19 +178,19 @@ class BaseDriverCore extends _core.DriverCore {
|
|
|
165
178
|
}
|
|
166
179
|
|
|
167
180
|
this.setProtocolW3C();
|
|
168
|
-
this.originalCaps =
|
|
181
|
+
this.originalCaps = originalCaps;
|
|
169
182
|
this.log.debug(`Creating session with W3C capabilities: ${JSON.stringify(originalCaps, null, 2)}`);
|
|
170
183
|
let caps;
|
|
171
184
|
|
|
172
185
|
try {
|
|
173
|
-
caps = (0, _capabilities.processCapabilities)(originalCaps, this.
|
|
186
|
+
caps = (0, _capabilities.processCapabilities)(originalCaps, this._desiredCapConstraints, this.shouldValidateCaps);
|
|
174
187
|
|
|
175
188
|
if (caps[_capabilities.APPIUM_OPTS_CAP]) {
|
|
176
189
|
this.log.debug(`Found ${_capabilities.PREFIXED_APPIUM_OPTS_CAP} capability present; will promote items inside to caps`);
|
|
177
190
|
caps = (0, _capabilities.promoteAppiumOptions)(caps);
|
|
178
191
|
}
|
|
179
192
|
|
|
180
|
-
caps = (0, _capabilities2.fixCaps)(caps, this.
|
|
193
|
+
caps = (0, _capabilities2.fixCaps)(caps, this._desiredCapConstraints, this.log);
|
|
181
194
|
} catch (e) {
|
|
182
195
|
throw new _protocol.errors.SessionNotCreatedError(e.message);
|
|
183
196
|
}
|
|
@@ -185,8 +198,9 @@ class BaseDriverCore extends _core.DriverCore {
|
|
|
185
198
|
this.validateDesiredCaps(caps);
|
|
186
199
|
this.sessionId = _support.util.uuidV4();
|
|
187
200
|
this.caps = caps;
|
|
188
|
-
this.opts = _lodash.default.cloneDeep(this.initialOpts)
|
|
189
|
-
|
|
201
|
+
this.opts = { ..._lodash.default.cloneDeep(this.initialOpts),
|
|
202
|
+
...this.caps
|
|
203
|
+
};
|
|
190
204
|
|
|
191
205
|
if (this.opts.noReset && this.opts.fullReset) {
|
|
192
206
|
throw new Error("The 'noReset' and 'fullReset' capabilities are mutually " + 'exclusive and should not both be set to true. You ' + "probably meant to just use 'fullReset' on its own");
|
|
@@ -230,7 +244,7 @@ class BaseDriverCore extends _core.DriverCore {
|
|
|
230
244
|
}
|
|
231
245
|
|
|
232
246
|
logExtraCaps(caps) {
|
|
233
|
-
let extraCaps = _lodash.default.difference(_lodash.default.keys(caps), _lodash.default.keys(this.
|
|
247
|
+
let extraCaps = _lodash.default.difference(_lodash.default.keys(caps), _lodash.default.keys(this._desiredCapConstraints));
|
|
234
248
|
|
|
235
249
|
if (extraCaps.length) {
|
|
236
250
|
this.log.warn(`The following capabilities were provided, but are not ` + `recognized by Appium:`);
|
|
@@ -247,7 +261,7 @@ class BaseDriverCore extends _core.DriverCore {
|
|
|
247
261
|
}
|
|
248
262
|
|
|
249
263
|
try {
|
|
250
|
-
(0, _capabilities.validateCaps)(caps, this.
|
|
264
|
+
(0, _capabilities.validateCaps)(caps, this._desiredCapConstraints);
|
|
251
265
|
} catch (e) {
|
|
252
266
|
this.log.errorAndThrow(new _protocol.errors.SessionNotCreatedError(`The desiredCapabilities object was not valid for the ` + `following reason(s): ${e.message}`));
|
|
253
267
|
}
|
|
@@ -256,30 +270,13 @@ class BaseDriverCore extends _core.DriverCore {
|
|
|
256
270
|
return true;
|
|
257
271
|
}
|
|
258
272
|
|
|
259
|
-
set desiredCapConstraints(constraints) {
|
|
260
|
-
this._constraints = Object.assign(this._constraints, constraints);
|
|
261
|
-
|
|
262
|
-
for (const [, value] of _lodash.default.toPairs(this._constraints)) {
|
|
263
|
-
if (value && value.presence === true) {
|
|
264
|
-
value.presence = {
|
|
265
|
-
allowEmpty: false
|
|
266
|
-
};
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
get desiredCapConstraints() {
|
|
272
|
-
return this._constraints;
|
|
273
|
-
}
|
|
274
|
-
|
|
275
273
|
}
|
|
276
274
|
|
|
277
275
|
exports.BaseDriverCore = BaseDriverCore;
|
|
278
276
|
|
|
279
|
-
class
|
|
277
|
+
class BaseDriver extends (0, _commands.createBaseDriverClass)(BaseDriverCore) {}
|
|
280
278
|
|
|
281
|
-
const BaseDriver = _BaseDriver;
|
|
282
279
|
exports.BaseDriver = BaseDriver;
|
|
283
280
|
var _default = BaseDriver;
|
|
284
281
|
exports.default = _default;
|
|
285
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFVkVOVF9TRVNTSU9OX0lOSVQiLCJFVkVOVF9TRVNTSU9OX1NUQVJUIiwiRVZFTlRfU0VTU0lPTl9RVUlUX1NUQVJUIiwiRVZFTlRfU0VTU0lPTl9RVUlUX0RPTkUiLCJPTl9VTkVYUEVDVEVEX1NIVVRET1dOX0VWRU5UIiwiQmFzZURyaXZlckNvcmUiLCJEcml2ZXJDb3JlIiwiX2NvbnN0cmFpbnRzIiwiXyIsImNsb25lRGVlcCIsImRlc2lyZWRDYXBhYmlsaXR5Q29uc3RyYWludHMiLCJjbGlBcmdzIiwiZXhlY3V0ZUNvbW1hbmQiLCJjbWQiLCJhcmdzIiwic3RhcnRUaW1lIiwiRGF0ZSIsIm5vdyIsInByb3RvY29sIiwiZGV0ZXJtaW5lUHJvdG9jb2wiLCJsb2dFdmVudCIsIkRFTEVURV9TRVNTSU9OX0NPTU1BTkQiLCJjbGVhck5ld0NvbW1hbmRUaW1lb3V0Iiwic2h1dGRvd25VbmV4cGVjdGVkbHkiLCJlcnJvcnMiLCJOb1N1Y2hEcml2ZXJFcnJvciIsIk5vdFlldEltcGxlbWVudGVkRXJyb3IiLCJ1bmV4cGVjdGVkU2h1dGRvd25MaXN0ZW5lciIsImNvbW1hbmRFeGVjdXRvciIsIkIiLCJyYWNlIiwicmVzb2x2ZSIsInJlamVjdCIsImV2ZW50RW1pdHRlciIsIm9uIiwiZmluYWxseSIsInJlbW92ZUxpc3RlbmVyIiwicmVzIiwiaXNDb21tYW5kc1F1ZXVlRW5hYmxlZCIsImNvbW1hbmRzUXVldWVHdWFyZCIsImFjcXVpcmUiLCJCYXNlRHJpdmVyIiwibmFtZSIsInN0YXJ0TmV3Q29tbWFuZFRpbWVvdXQiLCJlbmRUaW1lIiwiX2V2ZW50SGlzdG9yeSIsImNvbW1hbmRzIiwicHVzaCIsInN0YXJ0VW5leHBlY3RlZFNodXRkb3duIiwiZXJyIiwiZW1pdCIsInNlc3Npb25JZCIsImRlbGV0ZVNlc3Npb24iLCJuZXdDb21tYW5kVGltZW91dE1zIiwibm9Db21tYW5kVGltZXIiLCJzZXRUaW1lb3V0IiwibG9nIiwid2FybiIsImVycm9yTWVzc2FnZSIsIkVycm9yIiwiYXNzaWduU2VydmVyIiwic2VydmVyIiwiaG9zdCIsInBvcnQiLCJwYXRoIiwic2VydmVySG9zdCIsInNlcnZlclBvcnQiLCJzZXJ2ZXJQYXRoIiwicmVzZXQiLCJkZWJ1ZyIsImN1cnJlbnRDb25maWciLCJwcm9wZXJ0eSIsInJlc2V0T25VbmV4cGVjdGVkU2h1dGRvd24iLCJjcmVhdGVTZXNzaW9uIiwib3JpZ2luYWxDYXBzIiwia2V5IiwidmFsdWUiLCJ0b1BhaXJzIiwidzNjQ2FwYWJpbGl0aWVzMSIsInczY0NhcGFiaWxpdGllczIiLCJ3M2NDYXBhYmlsaXRpZXMiLCJkcml2ZXJEYXRhIiwiU2Vzc2lvbk5vdENyZWF0ZWRFcnJvciIsImZpbmQiLCJpc1czY0NhcHMiLCJzZXRQcm90b2NvbFczQyIsIkpTT04iLCJzdHJpbmdpZnkiLCJjYXBzIiwicHJvY2Vzc0NhcGFiaWxpdGllcyIsImRlc2lyZWRDYXBDb25zdHJhaW50cyIsInNob3VsZFZhbGlkYXRlQ2FwcyIsIkFQUElVTV9PUFRTX0NBUCIsIlBSRUZJWEVEX0FQUElVTV9PUFRTX0NBUCIsInByb21vdGVBcHBpdW1PcHRpb25zIiwiZml4Q2FwcyIsImUiLCJtZXNzYWdlIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsInV0aWwiLCJ1dWlkVjQiLCJvcHRzIiwiaW5pdGlhbE9wdHMiLCJPYmplY3QiLCJhc3NpZ24iLCJub1Jlc2V0IiwiZnVsbFJlc2V0IiwiZmFzdFJlc2V0Iiwic2tpcFVuaW5zdGFsbCIsImFwcCIsInRyaW0iLCJpc1VuZGVmaW5lZCIsIm5ld0NvbW1hbmRUaW1lb3V0IiwiX2xvZyIsInByZWZpeCIsImhlbHBlcnMiLCJnZW5lcmF0ZURyaXZlckxvZ1ByZWZpeCIsImluZm8iLCJpc0J1c3kiLCJrZXlzIiwicXVldWVzIiwibG9nRXh0cmFDYXBzIiwiZXh0cmFDYXBzIiwiZGlmZmVyZW5jZSIsImxlbmd0aCIsImNhcCIsInZhbGlkYXRlQ2FwcyIsImVycm9yQW5kVGhyb3ciLCJjb25zdHJhaW50cyIsInByZXNlbmNlIiwiYWxsb3dFbXB0eSIsIl9CYXNlRHJpdmVyIiwiY3JlYXRlQmFzZURyaXZlckNsYXNzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2Jhc2Vkcml2ZXIvZHJpdmVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIHJlcXVpcmUtYXdhaXQgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG5cbmltcG9ydCB7XG4gIHZhbGlkYXRlQ2FwcyxcbiAgQVBQSVVNX09QVFNfQ0FQLFxuICBQUkVGSVhFRF9BUFBJVU1fT1BUU19DQVAsXG4gIHByb2Nlc3NDYXBhYmlsaXRpZXMsXG4gIHByb21vdGVBcHBpdW1PcHRpb25zLFxufSBmcm9tICcuL2NhcGFiaWxpdGllcyc7XG5pbXBvcnQge0RyaXZlckNvcmV9IGZyb20gJy4vY29yZSc7XG5pbXBvcnQge3V0aWx9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtmaXhDYXBzLCBpc1czY0NhcHN9IGZyb20gJy4uL2hlbHBlcnMvY2FwYWJpbGl0aWVzJztcbmltcG9ydCB7REVMRVRFX1NFU1NJT05fQ09NTUFORCwgZGV0ZXJtaW5lUHJvdG9jb2wsIGVycm9yc30gZnJvbSAnLi4vcHJvdG9jb2wnO1xuaW1wb3J0IHtjcmVhdGVCYXNlRHJpdmVyQ2xhc3N9IGZyb20gJy4vY29tbWFuZHMnO1xuaW1wb3J0IGhlbHBlcnMgZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7ZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50c30gZnJvbSAnLi9kZXNpcmVkLWNhcHMnO1xuXG5jb25zdCBFVkVOVF9TRVNTSU9OX0lOSVQgPSAnbmV3U2Vzc2lvblJlcXVlc3RlZCc7XG5jb25zdCBFVkVOVF9TRVNTSU9OX1NUQVJUID0gJ25ld1Nlc3Npb25TdGFydGVkJztcbmNvbnN0IEVWRU5UX1NFU1NJT05fUVVJVF9TVEFSVCA9ICdxdWl0U2Vzc2lvblJlcXVlc3RlZCc7XG5jb25zdCBFVkVOVF9TRVNTSU9OX1FVSVRfRE9ORSA9ICdxdWl0U2Vzc2lvbkZpbmlzaGVkJztcbmNvbnN0IE9OX1VORVhQRUNURURfU0hVVERPV05fRVZFTlQgPSAnb25VbmV4cGVjdGVkU2h1dGRvd24nO1xuXG4vKipcbiAqIEBpbXBsZW1lbnRzIHtTZXNzaW9uSGFuZGxlcn1cbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VEcml2ZXJDb3JlIGV4dGVuZHMgRHJpdmVyQ29yZSB7XG4gIF9jb25zdHJhaW50cyA9IF8uY2xvbmVEZWVwKGRlc2lyZWRDYXBhYmlsaXR5Q29uc3RyYWludHMpO1xuXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxhbnk+fHVuZGVmaW5lZH0gKi9cbiAgY2xpQXJncztcblxuICAvLyBUaGlzIGlzIHRoZSBtYWluIGNvbW1hbmQgaGFuZGxlciBmb3IgdGhlIGRyaXZlci4gSXQgd3JhcHMgY29tbWFuZFxuICAvLyBleGVjdXRpb24gd2l0aCB0aW1lb3V0IGxvZ2ljLCBjaGVja2luZyB0aGF0IHdlIGhhdmUgYSB2YWxpZCBzZXNzaW9uLFxuICAvLyBhbmQgZW5zdXJpbmcgdGhhdCB3ZSBleGVjdXRlIGNvbW1hbmRzIG9uZSBhdCBhIHRpbWUuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZFxuICAvLyBieSBNSlNPTldQJ3MgZXhwcmVzcyByb3V0ZXIuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY21kXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZUNvbW1hbmQoY21kLCAuLi5hcmdzKSB7XG4gICAgLy8gZ2V0IHN0YXJ0IHRpbWUgZm9yIHRoaXMgY29tbWFuZCwgYW5kIGxvZyBpbiBzcGVjaWFsIGNhc2VzXG4gICAgbGV0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICBpZiAoY21kID09PSAnY3JlYXRlU2Vzc2lvbicpIHtcbiAgICAgIC8vIElmIGNyZWF0aW5nIGEgc2Vzc2lvbiBkZXRlcm1pbmUgaWYgVzNDIG9yIE1KU09OV1AgcHJvdG9jb2wgd2FzIHJlcXVlc3RlZCBhbmQgcmVtZW1iZXIgdGhlIGNob2ljZVxuICAgICAgdGhpcy5wcm90b2NvbCA9IGRldGVybWluZVByb3RvY29sKGFyZ3MpO1xuICAgICAgdGhpcy5sb2dFdmVudChFVkVOVF9TRVNTSU9OX0lOSVQpO1xuICAgIH0gZWxzZSBpZiAoY21kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICB0aGlzLmxvZ0V2ZW50KEVWRU5UX1NFU1NJT05fUVVJVF9TVEFSVCk7XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgaGFkIGEgY29tbWFuZCB0aW1lciBydW5uaW5nLCBjbGVhciBpdCBub3cgdGhhdCB3ZSdyZSBzdGFydGluZ1xuICAgIC8vIGEgbmV3IGNvbW1hbmQgYW5kIHNvIGRvbid0IHdhbnQgdG8gdGltZSBvdXRcbiAgICBhd2FpdCB0aGlzLmNsZWFyTmV3Q29tbWFuZFRpbWVvdXQoKTtcblxuICAgIGlmICh0aGlzLnNodXRkb3duVW5leHBlY3RlZGx5KSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vU3VjaERyaXZlckVycm9yKCdUaGUgZHJpdmVyIHdhcyB1bmV4cGVjdGVkbHkgc2h1dCBkb3duIScpO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhpcyBjb21tYW5kLCBpdCBtdXN0IG5vdCBiZSBpbXBsZW1lbnRlZFxuICAgIGlmICghdGhpc1tjbWRdKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdFlldEltcGxlbWVudGVkRXJyb3IoKTtcbiAgICB9XG5cbiAgICBsZXQgdW5leHBlY3RlZFNodXRkb3duTGlzdGVuZXI7XG4gICAgY29uc3QgY29tbWFuZEV4ZWN1dG9yID0gYXN5bmMgKCkgPT5cbiAgICAgIGF3YWl0IEIucmFjZShbXG4gICAgICAgIHRoaXNbY21kXSguLi5hcmdzKSxcbiAgICAgICAgbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHVuZXhwZWN0ZWRTaHV0ZG93bkxpc3RlbmVyID0gcmVqZWN0O1xuICAgICAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLm9uKE9OX1VORVhQRUNURURfU0hVVERPV05fRVZFTlQsIHVuZXhwZWN0ZWRTaHV0ZG93bkxpc3RlbmVyKTtcbiAgICAgICAgfSksXG4gICAgICBdKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgaWYgKHVuZXhwZWN0ZWRTaHV0ZG93bkxpc3RlbmVyKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gcHJldmVudCBtZW1vcnkgbGVha3NcbiAgICAgICAgICB0aGlzLmV2ZW50RW1pdHRlci5yZW1vdmVMaXN0ZW5lcihcbiAgICAgICAgICAgIE9OX1VORVhQRUNURURfU0hVVERPV05fRVZFTlQsXG4gICAgICAgICAgICB1bmV4cGVjdGVkU2h1dGRvd25MaXN0ZW5lclxuICAgICAgICAgICk7XG4gICAgICAgICAgdW5leHBlY3RlZFNodXRkb3duTGlzdGVuZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICBjb25zdCByZXMgPSB0aGlzLmlzQ29tbWFuZHNRdWV1ZUVuYWJsZWRcbiAgICAgID8gYXdhaXQgdGhpcy5jb21tYW5kc1F1ZXVlR3VhcmQuYWNxdWlyZShCYXNlRHJpdmVyLm5hbWUsIGNvbW1hbmRFeGVjdXRvcilcbiAgICAgIDogYXdhaXQgY29tbWFuZEV4ZWN1dG9yKCk7XG5cbiAgICAvLyBpZiB3ZSBoYXZlIHNldCBhIG5ldyBjb21tYW5kIHRpbWVvdXQgKHdoaWNoIGlzIHRoZSBkZWZhdWx0KSwgc3RhcnQgYVxuICAgIC8vIHRpbWVyIG9uY2Ugd2UndmUgZmluaXNoZWQgZXhlY3V0aW5nIHRoaXMgY29tbWFuZC4gSWYgd2UgZG9uJ3QgY2xlYXJcbiAgICAvLyB0aGUgdGltZXIgKHdoaWNoIGlzIGRvbmUgd2hlbiBhIG5ldyBjb21tYW5kIGNvbWVzIGluKSwgd2Ugd2lsbCB0cmlnZ2VyXG4gICAgLy8gYXV0b21hdGljIHNlc3Npb24gZGVsZXRpb24gaW4gdGhpcy5vbkNvbW1hbmRUaW1lb3V0LiBPZiBjb3Vyc2Ugd2UgZG9uJ3RcbiAgICAvLyB3YW50IHRvIHRyaWdnZXIgdGhlIHRpbWVyIHdoZW4gdGhlIHVzZXIgaXMgc2h1dHRpbmcgZG93biB0aGUgc2Vzc2lvblxuICAgIC8vIGludGVudGlvbmFsbHlcbiAgICBpZiAodGhpcy5pc0NvbW1hbmRzUXVldWVFbmFibGVkICYmIGNtZCAhPT0gREVMRVRFX1NFU1NJT05fQ09NTUFORCkge1xuICAgICAgLy8gcmVzZXR0aW5nIGV4aXN0aW5nIHRpbWVvdXRcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnROZXdDb21tYW5kVGltZW91dCgpO1xuICAgIH1cblxuICAgIC8vIGxvZyB0aW1pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb21tYW5kXG4gICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgdGhpcy5fZXZlbnRIaXN0b3J5LmNvbW1hbmRzLnB1c2goe2NtZCwgc3RhcnRUaW1lLCBlbmRUaW1lfSk7XG4gICAgaWYgKGNtZCA9PT0gJ2NyZWF0ZVNlc3Npb24nKSB7XG4gICAgICB0aGlzLmxvZ0V2ZW50KEVWRU5UX1NFU1NJT05fU1RBUlQpO1xuICAgIH0gZWxzZSBpZiAoY21kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICB0aGlzLmxvZ0V2ZW50KEVWRU5UX1NFU1NJT05fUVVJVF9ET05FKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICAgKi9cbiAgYXN5bmMgc3RhcnRVbmV4cGVjdGVkU2h1dGRvd24oXG4gICAgZXJyID0gbmV3IGVycm9ycy5Ob1N1Y2hEcml2ZXJFcnJvcignVGhlIGRyaXZlciB3YXMgdW5leHBlY3RlZGx5IHNodXQgZG93biEnKVxuICApIHtcbiAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KE9OX1VORVhQRUNURURfU0hVVERPV05fRVZFTlQsIGVycik7IC8vIGFsbG93IG90aGVycyB0byBsaXN0ZW4gZm9yIHRoaXNcbiAgICB0aGlzLnNodXRkb3duVW5leHBlY3RlZGx5ID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuc2Vzc2lvbklkICE9PSBudWxsKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbih0aGlzLnNlc3Npb25JZCk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc2h1dGRvd25VbmV4cGVjdGVkbHkgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydE5ld0NvbW1hbmRUaW1lb3V0KCkge1xuICAgIC8vIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gcm9ndWUgdGltZW91dHNcbiAgICBhd2FpdCB0aGlzLmNsZWFyTmV3Q29tbWFuZFRpbWVvdXQoKTtcblxuICAgIC8vIGlmIGNvbW1hbmQgdGltZW91dCBpcyAwLCBpdCBpcyBkaXNhYmxlZFxuICAgIGlmICghdGhpcy5uZXdDb21tYW5kVGltZW91dE1zKSByZXR1cm47IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcblxuICAgIHRoaXMubm9Db21tYW5kVGltZXIgPSBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMubG9nLndhcm4oXG4gICAgICAgIGBTaHV0dGluZyBkb3duIGJlY2F1c2Ugd2Ugd2FpdGVkIGAgK1xuICAgICAgICAgIGAke3RoaXMubmV3Q29tbWFuZFRpbWVvdXRNcyAvIDEwMDAuMH0gc2Vjb25kcyBmb3IgYSBjb21tYW5kYFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9XG4gICAgICAgIGBOZXcgQ29tbWFuZCBUaW1lb3V0IG9mIGAgK1xuICAgICAgICBgJHt0aGlzLm5ld0NvbW1hbmRUaW1lb3V0TXMgLyAxMDAwLjB9IHNlY29uZHMgYCArXG4gICAgICAgIGBleHBpcmVkLiBUcnkgY3VzdG9taXppbmcgdGhlIHRpbWVvdXQgdXNpbmcgdGhlIGAgK1xuICAgICAgICBgJ25ld0NvbW1hbmRUaW1lb3V0JyBkZXNpcmVkIGNhcGFiaWxpdHlgO1xuICAgICAgYXdhaXQgdGhpcy5zdGFydFVuZXhwZWN0ZWRTaHV0ZG93bihuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKSk7XG4gICAgfSwgdGhpcy5uZXdDb21tYW5kVGltZW91dE1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkFwcGl1bVNlcnZlcn0gc2VydmVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBob3N0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwb3J0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBhc3NpZ25TZXJ2ZXIoc2VydmVyLCBob3N0LCBwb3J0LCBwYXRoKSB7XG4gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgdGhpcy5zZXJ2ZXJIb3N0ID0gaG9zdDtcbiAgICB0aGlzLnNlcnZlclBvcnQgPSBwb3J0O1xuICAgIHRoaXMuc2VydmVyUGF0aCA9IHBhdGg7XG4gIH1cblxuICAvKlxuICAgKiBSZXN0YXJ0IHRoZSBzZXNzaW9uIHdpdGggdGhlIG9yaWdpbmFsIGNhcHMsXG4gICAqIHByZXNlcnZpbmcgdGhlIHRpbWVvdXQgY29uZmlnLlxuICAgKi9cbiAgYXN5bmMgcmVzZXQoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ1Jlc2V0dGluZyBhcHAgbWlkLXNlc3Npb24nKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnUnVubmluZyBnZW5lcmljIGZ1bGwgcmVzZXQnKTtcblxuICAgIC8vIHByZXNlcnZpbmcgc3RhdGVcbiAgICBsZXQgY3VycmVudENvbmZpZyA9IHt9O1xuICAgIGZvciAobGV0IHByb3BlcnR5IG9mIFtcbiAgICAgICdpbXBsaWNpdFdhaXRNcycsXG4gICAgICAnbmV3Q29tbWFuZFRpbWVvdXRNcycsXG4gICAgICAnc2Vzc2lvbklkJyxcbiAgICAgICdyZXNldE9uVW5leHBlY3RlZFNodXRkb3duJyxcbiAgICBdKSB7XG4gICAgICBjdXJyZW50Q29uZmlnW3Byb3BlcnR5XSA9IHRoaXNbcHJvcGVydHldO1xuICAgIH1cblxuICAgIC8vIFdlIGFsc28gbmVlZCB0byBwcmVzZXJ2ZSB0aGUgdW5leHBlY3RlZCBzaHV0ZG93biwgYW5kIG1ha2Ugc3VyZSBpdCBpcyBub3QgY2FuY2VsbGVkIGR1cmluZyByZXNldC5cbiAgICB0aGlzLnJlc2V0T25VbmV4cGVjdGVkU2h1dGRvd24gPSAoKSA9PiB7fTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5zZXNzaW9uSWQgIT09IG51bGwpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKHRoaXMuc2Vzc2lvbklkKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nLmRlYnVnKCdSZXN0YXJ0aW5nIGFwcCcpO1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVTZXNzaW9uKHRoaXMub3JpZ2luYWxDYXBzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gYWx3YXlzIHJlc3RvcmUgc3RhdGUuXG4gICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgXy50b1BhaXJzKGN1cnJlbnRDb25maWcpKSB7XG4gICAgICAgIHRoaXNba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCB0aGlzLmNsZWFyTmV3Q29tbWFuZFRpbWVvdXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBIaXN0b3JpY2FsbHkgdGhlIGZpcnN0IHR3byBhcmd1bWVudHMgd2VyZSByZXNlcnZlZCBmb3IgSlNPTldQIGNhcGFiaWxpdGllcy5cbiAgICogQXBwaXVtIDIgaGFzIGRyb3BwZWQgdGhlIHN1cHBvcnQgb2YgdGhlc2UsIHNvIG5vdyB3ZSBvbmx5IGFjY2VwdCBjYXBhYmlsaXR5XG4gICAqIG9iamVjdHMgaW4gVzNDIGZvcm1hdCBhbmQgdGh1cyBhbGxvdyBhbnkgb2YgdGhlIHRocmVlIGFyZ3VtZW50cyB0byByZXByZXNlbnRcbiAgICogdGhlIGxhdHRlci5cbiAgICogQHBhcmFtIHtXM0NDYXBhYmlsaXRpZXN9IHczY0NhcGFiaWxpdGllczFcbiAgICogQHBhcmFtIHtXM0NDYXBhYmlsaXRpZXN9IFt3M2NDYXBhYmlsaXRpZXMyXVxuICAgKiBAcGFyYW0ge1czQ0NhcGFiaWxpdGllc30gW3czY0NhcGFiaWxpdGllc11cbiAgICogQHBhcmFtIHtEcml2ZXJEYXRhW119IFtkcml2ZXJEYXRhXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxbc3RyaW5nLG9iamVjdF0+fVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlU2Vzc2lvbih3M2NDYXBhYmlsaXRpZXMxLCB3M2NDYXBhYmlsaXRpZXMyLCB3M2NDYXBhYmlsaXRpZXMsIGRyaXZlckRhdGEpIHtcbiAgICBpZiAodGhpcy5zZXNzaW9uSWQgIT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBjcmVhdGUgYSBuZXcgc2Vzc2lvbiB3aGlsZSBvbmUgaXMgaW4gcHJvZ3Jlc3MnXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMubG9nLmRlYnVnKCk7XG5cbiAgICBjb25zdCBvcmlnaW5hbENhcHMgPSBfLmNsb25lRGVlcChcbiAgICAgIFt3M2NDYXBhYmlsaXRpZXMsIHczY0NhcGFiaWxpdGllczEsIHczY0NhcGFiaWxpdGllczJdLmZpbmQoaXNXM2NDYXBzKVxuICAgICk7XG4gICAgaWYgKCFvcmlnaW5hbENhcHMpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcihcbiAgICAgICAgJ0FwcGl1bSBvbmx5IHN1cHBvcnRzIFczQy1zdHlsZSBjYXBhYmlsaXR5IG9iamVjdHMuICcgK1xuICAgICAgICAgICdZb3VyIGNsaWVudCBpcyBzZW5kaW5nIGFuIG9sZGVyIGNhcGFiaWxpdGllcyBmb3JtYXQuIFBsZWFzZSB1cGRhdGUgeW91ciBjbGllbnQgbGlicmFyeS4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuc2V0UHJvdG9jb2xXM0MoKTtcblxuICAgIHRoaXMub3JpZ2luYWxDYXBzID0gXy5jbG9uZURlZXAob3JpZ2luYWxDYXBzKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgIGBDcmVhdGluZyBzZXNzaW9uIHdpdGggVzNDIGNhcGFiaWxpdGllczogJHtKU09OLnN0cmluZ2lmeShvcmlnaW5hbENhcHMsIG51bGwsIDIpfWBcbiAgICApO1xuXG4gICAgbGV0IGNhcHM7XG4gICAgdHJ5IHtcbiAgICAgIGNhcHMgPSBwcm9jZXNzQ2FwYWJpbGl0aWVzKG9yaWdpbmFsQ2FwcywgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMsIHRoaXMuc2hvdWxkVmFsaWRhdGVDYXBzKTtcbiAgICAgIGlmIChjYXBzW0FQUElVTV9PUFRTX0NBUF0pIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYEZvdW5kICR7UFJFRklYRURfQVBQSVVNX09QVFNfQ0FQfSBjYXBhYmlsaXR5IHByZXNlbnQ7IHdpbGwgcHJvbW90ZSBpdGVtcyBpbnNpZGUgdG8gY2Fwc2BcbiAgICAgICAgKTtcbiAgICAgICAgY2FwcyA9IHByb21vdGVBcHBpdW1PcHRpb25zKGNhcHMpO1xuICAgICAgfVxuICAgICAgY2FwcyA9IGZpeENhcHMoY2FwcywgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMsIHRoaXMubG9nKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IoZS5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbGlkYXRlRGVzaXJlZENhcHMoY2Fwcyk7XG5cbiAgICB0aGlzLnNlc3Npb25JZCA9IHV0aWwudXVpZFY0KCk7XG4gICAgdGhpcy5jYXBzID0gY2FwcztcbiAgICB0aGlzLm9wdHMgPSBfLmNsb25lRGVlcCh0aGlzLmluaXRpYWxPcHRzKTtcblxuICAgIC8vIG1lcmdlIGNhcHMgb250byBvcHRzIHNvIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgd2hhdCdzIHdoZXJlXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdHMsIHRoaXMuY2Fwcyk7XG5cbiAgICAvLyBkZWFsIHdpdGggcmVzZXRzXG4gICAgLy8gc29tZSBwZW9wbGUgbGlrZSB0byBkbyB3ZWlyZCB0aGluZ3MgYnkgc2V0dGluZyBub1Jlc2V0IGFuZCBmdWxsUmVzZXRcbiAgICAvLyBib3RoIHRvIHRydWUsIGJ1dCB0aGlzIGlzIG1pc2d1aWRlZCBhbmQgc3RyYW5nZSwgc28gZXJyb3IgaGVyZSBpbnN0ZWFkXG4gICAgaWYgKHRoaXMub3B0cy5ub1Jlc2V0ICYmIHRoaXMub3B0cy5mdWxsUmVzZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJUaGUgJ25vUmVzZXQnIGFuZCAnZnVsbFJlc2V0JyBjYXBhYmlsaXRpZXMgYXJlIG11dHVhbGx5IFwiICtcbiAgICAgICAgICAnZXhjbHVzaXZlIGFuZCBzaG91bGQgbm90IGJvdGggYmUgc2V0IHRvIHRydWUuIFlvdSAnICtcbiAgICAgICAgICBcInByb2JhYmx5IG1lYW50IHRvIGp1c3QgdXNlICdmdWxsUmVzZXQnIG9uIGl0cyBvd25cIlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5ub1Jlc2V0ID09PSB0cnVlKSB7XG4gICAgICB0aGlzLm9wdHMuZnVsbFJlc2V0ID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ID09PSB0cnVlKSB7XG4gICAgICB0aGlzLm9wdHMubm9SZXNldCA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLm9wdHMuZmFzdFJlc2V0ID0gIXRoaXMub3B0cy5mdWxsUmVzZXQgJiYgIXRoaXMub3B0cy5ub1Jlc2V0O1xuICAgIHRoaXMub3B0cy5za2lwVW5pbnN0YWxsID0gdGhpcy5vcHRzLmZhc3RSZXNldCB8fCB0aGlzLm9wdHMubm9SZXNldDtcblxuICAgIC8vIFByZXZlbnRzIGVtcHR5IHN0cmluZyBjYXBzIHNvIHdlIGRvbid0IG5lZWQgdG8gdGVzdCBpdCBldmVyeXdoZXJlXG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdHMuYXBwID09PSAnc3RyaW5nJyAmJiB0aGlzLm9wdHMuYXBwLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLm9wdHMuYXBwO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZCh0aGlzLmNhcHMubmV3Q29tbWFuZFRpbWVvdXQpKSB7XG4gICAgICB0aGlzLm5ld0NvbW1hbmRUaW1lb3V0TXMgPSB0aGlzLmNhcHMubmV3Q29tbWFuZFRpbWVvdXQgKiAxMDAwO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZy5wcmVmaXggPSBoZWxwZXJzLmdlbmVyYXRlRHJpdmVyTG9nUHJlZml4KHRoaXMsIHRoaXMuc2Vzc2lvbklkKTtcblxuICAgIHRoaXMubG9nLmluZm8oYFNlc3Npb24gY3JlYXRlZCB3aXRoIHNlc3Npb24gaWQ6ICR7dGhpcy5zZXNzaW9uSWR9YCk7XG5cbiAgICByZXR1cm4gW3RoaXMuc2Vzc2lvbklkLCBjYXBzXTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3Nlc3Npb25JZF1cbiAgICogQHBhcmFtIHtEcml2ZXJEYXRhW119IFtkcml2ZXJEYXRhXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24oc2Vzc2lvbklkLCBkcml2ZXJEYXRhKSB7XG4gICAgYXdhaXQgdGhpcy5jbGVhck5ld0NvbW1hbmRUaW1lb3V0KCk7XG4gICAgaWYgKHRoaXMuaXNDb21tYW5kc1F1ZXVlRW5hYmxlZCAmJiB0aGlzLmNvbW1hbmRzUXVldWVHdWFyZC5pc0J1c3koKSkge1xuICAgICAgLy8gc2ltcGxlIGhhY2sgdG8gcmVsZWFzZSBwZW5kaW5nIGNvbW1hbmRzIGlmIHRoZXkgZXhpc3RcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIF8ua2V5cyh0aGlzLmNvbW1hbmRzUXVldWVHdWFyZC5xdWV1ZXMpKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5jb21tYW5kc1F1ZXVlR3VhcmQucXVldWVzW2tleV0gPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zZXNzaW9uSWQgPSBudWxsO1xuICAgIHRoaXMuX2xvZy5wcmVmaXggPSBoZWxwZXJzLmdlbmVyYXRlRHJpdmVyTG9nUHJlZml4KHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7Q2FwYWJpbGl0aWVzfSBjYXBzXG4gICAqL1xuICBsb2dFeHRyYUNhcHMoY2Fwcykge1xuICAgIGxldCBleHRyYUNhcHMgPSBfLmRpZmZlcmVuY2UoXy5rZXlzKGNhcHMpLCBfLmtleXModGhpcy5fY29uc3RyYWludHMpKTtcbiAgICBpZiAoZXh0cmFDYXBzLmxlbmd0aCkge1xuICAgICAgdGhpcy5sb2cud2FybihcbiAgICAgICAgYFRoZSBmb2xsb3dpbmcgY2FwYWJpbGl0aWVzIHdlcmUgcHJvdmlkZWQsIGJ1dCBhcmUgbm90IGAgKyBgcmVjb2duaXplZCBieSBBcHBpdW06YFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgY2FwIG9mIGV4dHJhQ2Fwcykge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGAgICR7Y2FwfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0NhcGFiaWxpdGllc30gY2Fwc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHZhbGlkYXRlRGVzaXJlZENhcHMoY2Fwcykge1xuICAgIGlmICghdGhpcy5zaG91bGRWYWxpZGF0ZUNhcHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB2YWxpZGF0ZUNhcHMoY2FwcywgdGhpcy5fY29uc3RyYWludHMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coXG4gICAgICAgIG5ldyBlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcihcbiAgICAgICAgICBgVGhlIGRlc2lyZWRDYXBhYmlsaXRpZXMgb2JqZWN0IHdhcyBub3QgdmFsaWQgZm9yIHRoZSBgICtcbiAgICAgICAgICAgIGBmb2xsb3dpbmcgcmVhc29uKHMpOiAke2UubWVzc2FnZX1gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2dFeHRyYUNhcHMoY2Fwcyk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIHdlIG9ubHkgd2FudCBzdWJjbGFzc2VzIHRvIGV2ZXIgZXh0ZW5kIHRoZSBjb250cmFpbnRzXG4gIHNldCBkZXNpcmVkQ2FwQ29uc3RyYWludHMoY29uc3RyYWludHMpIHtcbiAgICB0aGlzLl9jb25zdHJhaW50cyA9IE9iamVjdC5hc3NpZ24odGhpcy5fY29uc3RyYWludHMsIGNvbnN0cmFpbnRzKTtcbiAgICAvLyAncHJlc2VuY2UnIG1lYW5zIGRpZmZlcmVudCB0aGluZ3MgaW4gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSB2YWxpZGF0b3IsXG4gICAgLy8gd2hlbiB3ZSBzYXkgJ3RydWUnIHdlIG1lYW4gdGhhdCBpdCBzaG91bGQgbm90IGJlIGFibGUgdG8gYmUgZW1wdHlcbiAgICBmb3IgKGNvbnN0IFssIHZhbHVlXSBvZiBfLnRvUGFpcnModGhpcy5fY29uc3RyYWludHMpKSB7XG4gICAgICBpZiAodmFsdWUgJiYgdmFsdWUucHJlc2VuY2UgPT09IHRydWUpIHtcbiAgICAgICAgdmFsdWUucHJlc2VuY2UgPSB7XG4gICAgICAgICAgYWxsb3dFbXB0eTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IGRlc2lyZWRDYXBDb25zdHJhaW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uc3RyYWludHM7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGVuc3VyZXMgdGhhdCBhbGwgb2YgdGhlIG1peGlucyBjb3JyZWN0bHkgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2UgZGVzY3JpYmVkIGluIHtAbGlua2NvZGUgRHJpdmVyfS5cbiAqIEBpbXBsZW1lbnRzIHtEcml2ZXJ9XG4gKi9cbmNsYXNzIF9CYXNlRHJpdmVyIGV4dGVuZHMgY3JlYXRlQmFzZURyaXZlckNsYXNzKEJhc2VEcml2ZXJDb3JlKSB7fVxuXG4vKipcbiAqIEB0eXBlIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJDbGFzczxEcml2ZXI+fVxuICovXG5jb25zdCBCYXNlRHJpdmVyID0gX0Jhc2VEcml2ZXI7XG5cbmV4cG9ydCB7QmFzZURyaXZlcn07XG5leHBvcnQgZGVmYXVsdCBCYXNlRHJpdmVyO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5IVFRQTWV0aG9kfSBIVFRQTWV0aG9kXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyfSBEcml2ZXJcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5FeHRlcm5hbERyaXZlcn0gRXh0ZXJuYWxEcml2ZXJcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5DYXBhYmlsaXRpZXN9IENhcGFiaWxpdGllc1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlczQ0NhcGFiaWxpdGllc30gVzNDQ2FwYWJpbGl0aWVzXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyRGF0YX0gRHJpdmVyRGF0YVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFVwZGF0ZVNlcnZlckNhbGxiYWNrXG4gKiBAcGFyYW0ge2ltcG9ydCgnZXhwcmVzcycpLkV4cHJlc3N9IGFwcCAtIEV4cHJlc3MgYXBwXG4gKiBAcGFyYW0ge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkFwcGl1bVNlcnZlcn0gaHR0cFNlcnZlciAtIEhUVFAgc2VydmVyXG4gKiBAcmV0dXJucyB7aW1wb3J0KCd0eXBlLWZlc3QnKS5Qcm9taXNhYmxlPHZvaWQ+fVxuICovXG5cbi8qKlxuICogVGhpcyBpcyB1c2VkIHRvIGV4dGVuZCB7QGxpbmtjb2RlIEJhc2VEcml2ZXJDb3JlfSBieSB0aGUgbWl4aW5zIGFuZCBhbHNvIGV4dGVybmFsIGRyaXZlcnMuXG4gKiBAdGVtcGxhdGUgW1Byb3RvPXt9XVxuICogQHRlbXBsYXRlIFtTdGF0aWM9e31dXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ2xhc3M8QmFzZURyaXZlckNvcmUgJiBQcm90byxpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJTdGF0aWMgJiBTdGF0aWM+fSBCYXNlRHJpdmVyQmFzZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlNlc3Npb25IYW5kbGVyPFtzdHJpbmcsIG9iamVjdF0sdm9pZD59IFNlc3Npb25IYW5kbGVyXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFHQTs7QUFPQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxrQkFBa0IsR0FBRyxxQkFBM0I7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxtQkFBNUI7QUFDQSxNQUFNQyx3QkFBd0IsR0FBRyxzQkFBakM7QUFDQSxNQUFNQyx1QkFBdUIsR0FBRyxxQkFBaEM7QUFDQSxNQUFNQyw0QkFBNEIsR0FBRyxzQkFBckM7O0FBS08sTUFBTUMsY0FBTixTQUE2QkMsZ0JBQTdCLENBQXdDO0VBQzdDQyxZQUFZLEdBQUdDLGVBQUEsQ0FBRUMsU0FBRixDQUFZQyx5Q0FBWixDQUFIO0VBR1pDLE9BQU87O0VBV2EsTUFBZEMsY0FBYyxDQUFDQyxHQUFELEVBQU0sR0FBR0MsSUFBVCxFQUFlO0lBRWpDLElBQUlDLFNBQVMsR0FBR0MsSUFBSSxDQUFDQyxHQUFMLEVBQWhC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
|
|
282
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFVkVOVF9TRVNTSU9OX0lOSVQiLCJFVkVOVF9TRVNTSU9OX1NUQVJUIiwiRVZFTlRfU0VTU0lPTl9RVUlUX1NUQVJUIiwiRVZFTlRfU0VTU0lPTl9RVUlUX0RPTkUiLCJPTl9VTkVYUEVDVEVEX1NIVVRET1dOX0VWRU5UIiwiQmFzZURyaXZlckNvcmUiLCJEcml2ZXJDb3JlIiwiY2xpQXJncyIsImNhcHMiLCJvcmlnaW5hbENhcHMiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJvcHRzIiwiQkFTRV9ERVNJUkVEX0NBUF9DT05TVFJBSU5UUyIsImNvbnN0cnVjdG9yIiwic2hvdWxkVmFsaWRhdGVDYXBzIiwiX2Rlc2lyZWRDYXBDb25zdHJhaW50cyIsIk9iamVjdCIsImZyZWV6ZSIsIl8iLCJtZXJnZSIsImV4ZWN1dGVDb21tYW5kIiwiY21kIiwiYXJncyIsInN0YXJ0VGltZSIsIkRhdGUiLCJub3ciLCJwcm90b2NvbCIsImRldGVybWluZVByb3RvY29sIiwibG9nRXZlbnQiLCJERUxFVEVfU0VTU0lPTl9DT01NQU5EIiwiY2xlYXJOZXdDb21tYW5kVGltZW91dCIsInNodXRkb3duVW5leHBlY3RlZGx5IiwiZXJyb3JzIiwiTm9TdWNoRHJpdmVyRXJyb3IiLCJOb3RZZXRJbXBsZW1lbnRlZEVycm9yIiwidW5leHBlY3RlZFNodXRkb3duTGlzdGVuZXIiLCJjb21tYW5kRXhlY3V0b3IiLCJCIiwicmFjZSIsInJlc29sdmUiLCJyZWplY3QiLCJldmVudEVtaXR0ZXIiLCJvbiIsImZpbmFsbHkiLCJyZW1vdmVMaXN0ZW5lciIsInJlcyIsImlzQ29tbWFuZHNRdWV1ZUVuYWJsZWQiLCJjb21tYW5kc1F1ZXVlR3VhcmQiLCJhY3F1aXJlIiwiQmFzZURyaXZlciIsIm5hbWUiLCJzdGFydE5ld0NvbW1hbmRUaW1lb3V0IiwiZW5kVGltZSIsIl9ldmVudEhpc3RvcnkiLCJjb21tYW5kcyIsInB1c2giLCJzdGFydFVuZXhwZWN0ZWRTaHV0ZG93biIsImVyciIsImVtaXQiLCJzZXNzaW9uSWQiLCJkZWxldGVTZXNzaW9uIiwibmV3Q29tbWFuZFRpbWVvdXRNcyIsIm5vQ29tbWFuZFRpbWVyIiwic2V0VGltZW91dCIsImxvZyIsIndhcm4iLCJlcnJvck1lc3NhZ2UiLCJFcnJvciIsImFzc2lnblNlcnZlciIsInNlcnZlciIsImhvc3QiLCJwb3J0IiwicGF0aCIsInNlcnZlckhvc3QiLCJzZXJ2ZXJQb3J0Iiwic2VydmVyUGF0aCIsInJlc2V0IiwiZGVidWciLCJjdXJyZW50Q29uZmlnIiwicHJvcGVydHkiLCJyZXNldE9uVW5leHBlY3RlZFNodXRkb3duIiwiY3JlYXRlU2Vzc2lvbiIsImtleSIsInZhbHVlIiwidG9QYWlycyIsInczY0NhcGFiaWxpdGllczEiLCJ3M2NDYXBhYmlsaXRpZXMyIiwidzNjQ2FwYWJpbGl0aWVzIiwiZHJpdmVyRGF0YSIsIlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IiLCJjbG9uZURlZXAiLCJmaW5kIiwiaXNXM2NDYXBzIiwic2V0UHJvdG9jb2xXM0MiLCJKU09OIiwic3RyaW5naWZ5IiwicHJvY2Vzc0NhcGFiaWxpdGllcyIsIkFQUElVTV9PUFRTX0NBUCIsIlBSRUZJWEVEX0FQUElVTV9PUFRTX0NBUCIsInByb21vdGVBcHBpdW1PcHRpb25zIiwiZml4Q2FwcyIsImUiLCJtZXNzYWdlIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsInV0aWwiLCJ1dWlkVjQiLCJpbml0aWFsT3B0cyIsIm5vUmVzZXQiLCJmdWxsUmVzZXQiLCJmYXN0UmVzZXQiLCJza2lwVW5pbnN0YWxsIiwiYXBwIiwidHJpbSIsImlzVW5kZWZpbmVkIiwibmV3Q29tbWFuZFRpbWVvdXQiLCJfbG9nIiwicHJlZml4IiwiaGVscGVycyIsImdlbmVyYXRlRHJpdmVyTG9nUHJlZml4IiwiaW5mbyIsImlzQnVzeSIsImtleXMiLCJxdWV1ZXMiLCJsb2dFeHRyYUNhcHMiLCJleHRyYUNhcHMiLCJkaWZmZXJlbmNlIiwibGVuZ3RoIiwiY2FwIiwidmFsaWRhdGVDYXBzIiwiZXJyb3JBbmRUaHJvdyIsImNyZWF0ZUJhc2VEcml2ZXJDbGFzcyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9iYXNlZHJpdmVyL2RyaXZlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSByZXF1aXJlLWF3YWl0ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXG5pbXBvcnQge1xuICB2YWxpZGF0ZUNhcHMsXG4gIEFQUElVTV9PUFRTX0NBUCxcbiAgUFJFRklYRURfQVBQSVVNX09QVFNfQ0FQLFxuICBwcm9jZXNzQ2FwYWJpbGl0aWVzLFxuICBwcm9tb3RlQXBwaXVtT3B0aW9ucyxcbn0gZnJvbSAnLi9jYXBhYmlsaXRpZXMnO1xuaW1wb3J0IHtEcml2ZXJDb3JlfSBmcm9tICcuL2NvcmUnO1xuaW1wb3J0IHt1dGlsfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7Zml4Q2FwcywgaXNXM2NDYXBzfSBmcm9tICcuLi9oZWxwZXJzL2NhcGFiaWxpdGllcyc7XG5pbXBvcnQge0RFTEVURV9TRVNTSU9OX0NPTU1BTkQsIGRldGVybWluZVByb3RvY29sLCBlcnJvcnN9IGZyb20gJy4uL3Byb3RvY29sJztcbmltcG9ydCB7Y3JlYXRlQmFzZURyaXZlckNsYXNzfSBmcm9tICcuL2NvbW1hbmRzJztcbmltcG9ydCBoZWxwZXJzIGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge0JBU0VfREVTSVJFRF9DQVBfQ09OU1RSQUlOVFN9IGZyb20gJ0BhcHBpdW0vdHlwZXMnO1xuXG5jb25zdCBFVkVOVF9TRVNTSU9OX0lOSVQgPSAnbmV3U2Vzc2lvblJlcXVlc3RlZCc7XG5jb25zdCBFVkVOVF9TRVNTSU9OX1NUQVJUID0gJ25ld1Nlc3Npb25TdGFydGVkJztcbmNvbnN0IEVWRU5UX1NFU1NJT05fUVVJVF9TVEFSVCA9ICdxdWl0U2Vzc2lvblJlcXVlc3RlZCc7XG5jb25zdCBFVkVOVF9TRVNTSU9OX1FVSVRfRE9ORSA9ICdxdWl0U2Vzc2lvbkZpbmlzaGVkJztcbmNvbnN0IE9OX1VORVhQRUNURURfU0hVVERPV05fRVZFTlQgPSAnb25VbmV4cGVjdGVkU2h1dGRvd24nO1xuXG4vKipcbiAqIEBpbXBsZW1lbnRzIHtTZXNzaW9uSGFuZGxlcjxDPn1cbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IENcbiAqIEB0ZW1wbGF0ZSB7U3RyaW5nUmVjb3JkfSBbQ0FyZ3M9U3RyaW5nUmVjb3JkXVxuICogQGV4dGVuZHMge0RyaXZlckNvcmU8Qz59XG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlRHJpdmVyQ29yZSBleHRlbmRzIERyaXZlckNvcmUge1xuICAvKipcbiAgICogQHR5cGUge0NBcmdzICYgU2VydmVyQXJnc31cbiAgICovXG4gIGNsaUFyZ3M7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtDYXBhYmlsaXRpZXM8Qz59XG4gICAqL1xuICBjYXBzO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7VzNDQ2FwYWJpbGl0aWVzPEM+fVxuICAgKi9cbiAgb3JpZ2luYWxDYXBzO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7Q31cbiAgICovXG4gIGRlc2lyZWRDYXBDb25zdHJhaW50cztcblxuICAvKipcbiAgICogQHR5cGUge0RyaXZlck9wdHM8Qz4gJiBEcml2ZXJPcHRzPEJhc2VEcml2ZXJDYXBDb25zdHJhaW50cz59XG4gICAqL1xuICBvcHRzO1xuXG4gIHN0YXRpYyBCQVNFX0RFU0lSRURfQ0FQX0NPTlNUUkFJTlRTID0gQkFTRV9ERVNJUkVEX0NBUF9DT05TVFJBSU5UUztcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtEcml2ZXJPcHRzPEM+fSBvcHRzXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkVmFsaWRhdGVDYXBzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRzID0gLyoqIEB0eXBlIHtEcml2ZXJPcHRzPEM+fSAqLyAoe30pLCBzaG91bGRWYWxpZGF0ZUNhcHMgPSB0cnVlKSB7XG4gICAgc3VwZXIob3B0cywgc2hvdWxkVmFsaWRhdGVDYXBzKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbXVzdCBiZSBhc3NpZ25lZCBoZXJlIGJlY2F1c2UgdGhlIGRlY2xhcmF0aW9uIG9mIHtAbGlua2NvZGUgQmFzZURyaXZlckNvcmUub3B0c30gYWJvdmVcbiAgICAgKiBibG93cyBhd2F5IHtAbGlua2NvZGUgRHJpdmVyQ29yZS5vcHRzfS5cbiAgICAgKi9cbiAgICB0aGlzLm9wdHMgPSBvcHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnRhaW5zIHRoZSBiYXNlIGNvbnN0cmFpbnRzIHBsdXMgd2hhdGV2ZXIgdGhlIHN1YmNsYXNzIHdhbnRzIHRvIGFkZC5cbiAgICpcbiAgICogU3ViY2xhc3NlcyBfc2hvdWxkbid0XyBuZWVkIHRvIHVzZSB0aGlzLiBJZiB5b3UgbmVlZCB0byB1c2UgdGhpcywgcGxlYXNlIGNyZWF0ZVxuICAgKiBhbiBpc3N1ZTpcbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvbmV3XG4gICAqIEB0eXBlIHtSZWFkb25seTxCYXNlRHJpdmVyQ2FwQ29uc3RyYWludHMgJiBDPn1cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgZ2V0IF9kZXNpcmVkQ2FwQ29uc3RyYWludHMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoXy5tZXJnZSh7fSwgQkFTRV9ERVNJUkVEX0NBUF9DT05TVFJBSU5UUywgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMpKTtcbiAgfVxuXG4gIC8vIFRoaXMgaXMgdGhlIG1haW4gY29tbWFuZCBoYW5kbGVyIGZvciB0aGUgZHJpdmVyLiBJdCB3cmFwcyBjb21tYW5kXG4gIC8vIGV4ZWN1dGlvbiB3aXRoIHRpbWVvdXQgbG9naWMsIGNoZWNraW5nIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIHNlc3Npb24sXG4gIC8vIGFuZCBlbnN1cmluZyB0aGF0IHdlIGV4ZWN1dGUgY29tbWFuZHMgb25lIGF0IGEgdGltZS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkXG4gIC8vIGJ5IE1KU09OV1AncyBleHByZXNzIHJvdXRlci5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbWRcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBhc3luYyBleGVjdXRlQ29tbWFuZChjbWQsIC4uLmFyZ3MpIHtcbiAgICAvLyBnZXQgc3RhcnQgdGltZSBmb3IgdGhpcyBjb21tYW5kLCBhbmQgbG9nIGluIHNwZWNpYWwgY2FzZXNcbiAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgIGlmIChjbWQgPT09ICdjcmVhdGVTZXNzaW9uJykge1xuICAgICAgLy8gSWYgY3JlYXRpbmcgYSBzZXNzaW9uIGRldGVybWluZSBpZiBXM0Mgb3IgTUpTT05XUCBwcm90b2NvbCB3YXMgcmVxdWVzdGVkIGFuZCByZW1lbWJlciB0aGUgY2hvaWNlXG4gICAgICB0aGlzLnByb3RvY29sID0gZGV0ZXJtaW5lUHJvdG9jb2woYXJncyk7XG4gICAgICB0aGlzLmxvZ0V2ZW50KEVWRU5UX1NFU1NJT05fSU5JVCk7XG4gICAgfSBlbHNlIGlmIChjbWQgPT09IERFTEVURV9TRVNTSU9OX0NPTU1BTkQpIHtcbiAgICAgIHRoaXMubG9nRXZlbnQoRVZFTlRfU0VTU0lPTl9RVUlUX1NUQVJUKTtcbiAgICB9XG5cbiAgICAvLyBpZiB3ZSBoYWQgYSBjb21tYW5kIHRpbWVyIHJ1bm5pbmcsIGNsZWFyIGl0IG5vdyB0aGF0IHdlJ3JlIHN0YXJ0aW5nXG4gICAgLy8gYSBuZXcgY29tbWFuZCBhbmQgc28gZG9uJ3Qgd2FudCB0byB0aW1lIG91dFxuICAgIGF3YWl0IHRoaXMuY2xlYXJOZXdDb21tYW5kVGltZW91dCgpO1xuXG4gICAgaWYgKHRoaXMuc2h1dGRvd25VbmV4cGVjdGVkbHkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuTm9TdWNoRHJpdmVyRXJyb3IoJ1RoZSBkcml2ZXIgd2FzIHVuZXhwZWN0ZWRseSBzaHV0IGRvd24hJyk7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSB0aGlzIGNvbW1hbmQsIGl0IG11c3Qgbm90IGJlIGltcGxlbWVudGVkXG4gICAgaWYgKCF0aGlzW2NtZF0pIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuTm90WWV0SW1wbGVtZW50ZWRFcnJvcigpO1xuICAgIH1cblxuICAgIGxldCB1bmV4cGVjdGVkU2h1dGRvd25MaXN0ZW5lcjtcbiAgICBjb25zdCBjb21tYW5kRXhlY3V0b3IgPSBhc3luYyAoKSA9PlxuICAgICAgYXdhaXQgQi5yYWNlKFtcbiAgICAgICAgdGhpc1tjbWRdKC4uLmFyZ3MpLFxuICAgICAgICBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgdW5leHBlY3RlZFNodXRkb3duTGlzdGVuZXIgPSByZWplY3Q7XG4gICAgICAgICAgdGhpcy5ldmVudEVtaXR0ZXIub24oT05fVU5FWFBFQ1RFRF9TSFVURE9XTl9FVkVOVCwgdW5leHBlY3RlZFNodXRkb3duTGlzdGVuZXIpO1xuICAgICAgICB9KSxcbiAgICAgIF0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBpZiAodW5leHBlY3RlZFNodXRkb3duTGlzdGVuZXIpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrc1xuICAgICAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLnJlbW92ZUxpc3RlbmVyKFxuICAgICAgICAgICAgT05fVU5FWFBFQ1RFRF9TSFVURE9XTl9FVkVOVCxcbiAgICAgICAgICAgIHVuZXhwZWN0ZWRTaHV0ZG93bkxpc3RlbmVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICB1bmV4cGVjdGVkU2h1dGRvd25MaXN0ZW5lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIGNvbnN0IHJlcyA9IHRoaXMuaXNDb21tYW5kc1F1ZXVlRW5hYmxlZFxuICAgICAgPyBhd2FpdCB0aGlzLmNvbW1hbmRzUXVldWVHdWFyZC5hY3F1aXJlKEJhc2VEcml2ZXIubmFtZSwgY29tbWFuZEV4ZWN1dG9yKVxuICAgICAgOiBhd2FpdCBjb21tYW5kRXhlY3V0b3IoKTtcblxuICAgIC8vIGlmIHdlIGhhdmUgc2V0IGEgbmV3IGNvbW1hbmQgdGltZW91dCAod2hpY2ggaXMgdGhlIGRlZmF1bHQpLCBzdGFydCBhXG4gICAgLy8gdGltZXIgb25jZSB3ZSd2ZSBmaW5pc2hlZCBleGVjdXRpbmcgdGhpcyBjb21tYW5kLiBJZiB3ZSBkb24ndCBjbGVhclxuICAgIC8vIHRoZSB0aW1lciAod2hpY2ggaXMgZG9uZSB3aGVuIGEgbmV3IGNvbW1hbmQgY29tZXMgaW4pLCB3ZSB3aWxsIHRyaWdnZXJcbiAgICAvLyBhdXRvbWF0aWMgc2Vzc2lvbiBkZWxldGlvbiBpbiB0aGlzLm9uQ29tbWFuZFRpbWVvdXQuIE9mIGNvdXJzZSB3ZSBkb24ndFxuICAgIC8vIHdhbnQgdG8gdHJpZ2dlciB0aGUgdGltZXIgd2hlbiB0aGUgdXNlciBpcyBzaHV0dGluZyBkb3duIHRoZSBzZXNzaW9uXG4gICAgLy8gaW50ZW50aW9uYWxseVxuICAgIGlmICh0aGlzLmlzQ29tbWFuZHNRdWV1ZUVuYWJsZWQgJiYgY21kICE9PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICAvLyByZXNldHRpbmcgZXhpc3RpbmcgdGltZW91dFxuICAgICAgYXdhaXQgdGhpcy5zdGFydE5ld0NvbW1hbmRUaW1lb3V0KCk7XG4gICAgfVxuXG4gICAgLy8gbG9nIHRpbWluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbW1hbmRcbiAgICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLl9ldmVudEhpc3RvcnkuY29tbWFuZHMucHVzaCh7Y21kLCBzdGFydFRpbWUsIGVuZFRpbWV9KTtcbiAgICBpZiAoY21kID09PSAnY3JlYXRlU2Vzc2lvbicpIHtcbiAgICAgIHRoaXMubG9nRXZlbnQoRVZFTlRfU0VTU0lPTl9TVEFSVCk7XG4gICAgfSBlbHNlIGlmIChjbWQgPT09IERFTEVURV9TRVNTSU9OX0NPTU1BTkQpIHtcbiAgICAgIHRoaXMubG9nRXZlbnQoRVZFTlRfU0VTU0lPTl9RVUlUX0RPTkUpO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtFcnJvcnxpbXBvcnQoJy4uL3Byb3RvY29sL2Vycm9ycycpLk5vU3VjaERyaXZlckVycm9yfSBlcnJcbiAgICovXG4gIGFzeW5jIHN0YXJ0VW5leHBlY3RlZFNodXRkb3duKFxuICAgIGVyciA9IG5ldyBlcnJvcnMuTm9TdWNoRHJpdmVyRXJyb3IoJ1RoZSBkcml2ZXIgd2FzIHVuZXhwZWN0ZWRseSBzaHV0IGRvd24hJylcbiAgKSB7XG4gICAgdGhpcy5ldmVudEVtaXR0ZXIuZW1pdChPTl9VTkVYUEVDVEVEX1NIVVRET1dOX0VWRU5ULCBlcnIpOyAvLyBhbGxvdyBvdGhlcnMgdG8gbGlzdGVuIGZvciB0aGlzXG4gICAgdGhpcy5zaHV0ZG93blVuZXhwZWN0ZWRseSA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnNlc3Npb25JZCAhPT0gbnVsbCkge1xuICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24odGhpcy5zZXNzaW9uSWQpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnNodXRkb3duVW5leHBlY3RlZGx5ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnROZXdDb21tYW5kVGltZW91dCgpIHtcbiAgICAvLyBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHJvZ3VlIHRpbWVvdXRzXG4gICAgYXdhaXQgdGhpcy5jbGVhck5ld0NvbW1hbmRUaW1lb3V0KCk7XG5cbiAgICAvLyBpZiBjb21tYW5kIHRpbWVvdXQgaXMgMCwgaXQgaXMgZGlzYWJsZWRcbiAgICBpZiAoIXRoaXMubmV3Q29tbWFuZFRpbWVvdXRNcykgcmV0dXJuOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICB0aGlzLm5vQ29tbWFuZFRpbWVyID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICB0aGlzLmxvZy53YXJuKFxuICAgICAgICBgU2h1dHRpbmcgZG93biBiZWNhdXNlIHdlIHdhaXRlZCBgICtcbiAgICAgICAgICBgJHt0aGlzLm5ld0NvbW1hbmRUaW1lb3V0TXMgLyAxMDAwLjB9IHNlY29uZHMgZm9yIGEgY29tbWFuZGBcbiAgICAgICk7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPVxuICAgICAgICBgTmV3IENvbW1hbmQgVGltZW91dCBvZiBgICtcbiAgICAgICAgYCR7dGhpcy5uZXdDb21tYW5kVGltZW91dE1zIC8gMTAwMC4wfSBzZWNvbmRzIGAgK1xuICAgICAgICBgZXhwaXJlZC4gVHJ5IGN1c3RvbWl6aW5nIHRoZSB0aW1lb3V0IHVzaW5nIHRoZSBgICtcbiAgICAgICAgYCduZXdDb21tYW5kVGltZW91dCcgZGVzaXJlZCBjYXBhYmlsaXR5YDtcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRVbmV4cGVjdGVkU2h1dGRvd24obmV3IEVycm9yKGVycm9yTWVzc2FnZSkpO1xuICAgIH0sIHRoaXMubmV3Q29tbWFuZFRpbWVvdXRNcyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5BcHBpdW1TZXJ2ZXJ9IHNlcnZlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaG9zdFxuICAgKiBAcGFyYW0ge251bWJlcn0gcG9ydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgYXNzaWduU2VydmVyKHNlcnZlciwgaG9zdCwgcG9ydCwgcGF0aCkge1xuICAgIHRoaXMuc2VydmVyID0gc2VydmVyO1xuICAgIHRoaXMuc2VydmVySG9zdCA9IGhvc3Q7XG4gICAgdGhpcy5zZXJ2ZXJQb3J0ID0gcG9ydDtcbiAgICB0aGlzLnNlcnZlclBhdGggPSBwYXRoO1xuICB9XG5cbiAgLypcbiAgICogUmVzdGFydCB0aGUgc2Vzc2lvbiB3aXRoIHRoZSBvcmlnaW5hbCBjYXBzLFxuICAgKiBwcmVzZXJ2aW5nIHRoZSB0aW1lb3V0IGNvbmZpZy5cbiAgICovXG4gIGFzeW5jIHJlc2V0KCkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdSZXNldHRpbmcgYXBwIG1pZC1zZXNzaW9uJyk7XG4gICAgdGhpcy5sb2cuZGVidWcoJ1J1bm5pbmcgZ2VuZXJpYyBmdWxsIHJlc2V0Jyk7XG5cbiAgICAvLyBwcmVzZXJ2aW5nIHN0YXRlXG4gICAgbGV0IGN1cnJlbnRDb25maWcgPSB7fTtcbiAgICBmb3IgKGxldCBwcm9wZXJ0eSBvZiBbXG4gICAgICAnaW1wbGljaXRXYWl0TXMnLFxuICAgICAgJ25ld0NvbW1hbmRUaW1lb3V0TXMnLFxuICAgICAgJ3Nlc3Npb25JZCcsXG4gICAgICAncmVzZXRPblVuZXhwZWN0ZWRTaHV0ZG93bicsXG4gICAgXSkge1xuICAgICAgY3VycmVudENvbmZpZ1twcm9wZXJ0eV0gPSB0aGlzW3Byb3BlcnR5XTtcbiAgICB9XG5cbiAgICAvLyBXZSBhbHNvIG5lZWQgdG8gcHJlc2VydmUgdGhlIHVuZXhwZWN0ZWQgc2h1dGRvd24sIGFuZCBtYWtlIHN1cmUgaXQgaXMgbm90IGNhbmNlbGxlZCBkdXJpbmcgcmVzZXQuXG4gICAgdGhpcy5yZXNldE9uVW5leHBlY3RlZFNodXRkb3duID0gKCkgPT4ge307XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuc2Vzc2lvbklkICE9PSBudWxsKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbih0aGlzLnNlc3Npb25JZCk7XG4gICAgICB9XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnUmVzdGFydGluZyBhcHAnKTtcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlU2Vzc2lvbih0aGlzLm9yaWdpbmFsQ2Fwcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIGFsd2F5cyByZXN0b3JlIHN0YXRlLlxuICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIF8udG9QYWlycyhjdXJyZW50Q29uZmlnKSkge1xuICAgICAgICB0aGlzW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jbGVhck5ld0NvbW1hbmRUaW1lb3V0KCk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogSGlzdG9yaWNhbGx5IHRoZSBmaXJzdCB0d28gYXJndW1lbnRzIHdlcmUgcmVzZXJ2ZWQgZm9yIEpTT05XUCBjYXBhYmlsaXRpZXMuXG4gICAqIEFwcGl1bSAyIGhhcyBkcm9wcGVkIHRoZSBzdXBwb3J0IG9mIHRoZXNlLCBzbyBub3cgd2Ugb25seSBhY2NlcHQgY2FwYWJpbGl0eVxuICAgKiBvYmplY3RzIGluIFczQyBmb3JtYXQgYW5kIHRodXMgYWxsb3cgYW55IG9mIHRoZSB0aHJlZSBhcmd1bWVudHMgdG8gcmVwcmVzZW50XG4gICAqIHRoZSBsYXR0ZXIuXG4gICAqIEBwYXJhbSB7VzNDQ2FwYWJpbGl0aWVzPEM+fSB3M2NDYXBhYmlsaXRpZXMxXG4gICAqIEBwYXJhbSB7VzNDQ2FwYWJpbGl0aWVzPEM+fSBbdzNjQ2FwYWJpbGl0aWVzMl1cbiAgICogQHBhcmFtIHtXM0NDYXBhYmlsaXRpZXM8Qz59IFt3M2NDYXBhYmlsaXRpZXNdXG4gICAqIEBwYXJhbSB7RHJpdmVyRGF0YVtdfSBbZHJpdmVyRGF0YV1cbiAgICogQHJldHVybnMge1Byb21pc2U8W3N0cmluZyxDYXBhYmlsaXRpZXM8Qz5dPn1cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24odzNjQ2FwYWJpbGl0aWVzMSwgdzNjQ2FwYWJpbGl0aWVzMiwgdzNjQ2FwYWJpbGl0aWVzLCBkcml2ZXJEYXRhKSB7XG4gICAgaWYgKHRoaXMuc2Vzc2lvbklkICE9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IoXG4gICAgICAgICdDYW5ub3QgY3JlYXRlIGEgbmV3IHNlc3Npb24gd2hpbGUgb25lIGlzIGluIHByb2dyZXNzJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZy5kZWJ1ZygpO1xuXG4gICAgY29uc3Qgb3JpZ2luYWxDYXBzID0gXy5jbG9uZURlZXAoXG4gICAgICBbdzNjQ2FwYWJpbGl0aWVzLCB3M2NDYXBhYmlsaXRpZXMxLCB3M2NDYXBhYmlsaXRpZXMyXS5maW5kKGlzVzNjQ2FwcylcbiAgICApO1xuICAgIGlmICghb3JpZ2luYWxDYXBzKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IoXG4gICAgICAgICdBcHBpdW0gb25seSBzdXBwb3J0cyBXM0Mtc3R5bGUgY2FwYWJpbGl0eSBvYmplY3RzLiAnICtcbiAgICAgICAgICAnWW91ciBjbGllbnQgaXMgc2VuZGluZyBhbiBvbGRlciBjYXBhYmlsaXRpZXMgZm9ybWF0LiBQbGVhc2UgdXBkYXRlIHlvdXIgY2xpZW50IGxpYnJhcnkuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldFByb3RvY29sVzNDKCk7XG5cbiAgICB0aGlzLm9yaWdpbmFsQ2FwcyA9IG9yaWdpbmFsQ2FwcztcbiAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgIGBDcmVhdGluZyBzZXNzaW9uIHdpdGggVzNDIGNhcGFiaWxpdGllczogJHtKU09OLnN0cmluZ2lmeShvcmlnaW5hbENhcHMsIG51bGwsIDIpfWBcbiAgICApO1xuXG4gICAgLyoqIEB0eXBlIHtDYXBhYmlsaXRpZXM8Qz59ICovXG4gICAgbGV0IGNhcHM7XG4gICAgdHJ5IHtcbiAgICAgIGNhcHMgPSBwcm9jZXNzQ2FwYWJpbGl0aWVzKFxuICAgICAgICBvcmlnaW5hbENhcHMsXG4gICAgICAgIHRoaXMuX2Rlc2lyZWRDYXBDb25zdHJhaW50cyxcbiAgICAgICAgdGhpcy5zaG91bGRWYWxpZGF0ZUNhcHNcbiAgICAgICk7XG4gICAgICBpZiAoY2Fwc1tBUFBJVU1fT1BUU19DQVBdKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBGb3VuZCAke1BSRUZJWEVEX0FQUElVTV9PUFRTX0NBUH0gY2FwYWJpbGl0eSBwcmVzZW50OyB3aWxsIHByb21vdGUgaXRlbXMgaW5zaWRlIHRvIGNhcHNgXG4gICAgICAgICk7XG4gICAgICAgIGNhcHMgPSBwcm9tb3RlQXBwaXVtT3B0aW9ucyhjYXBzKTtcbiAgICAgIH1cbiAgICAgIGNhcHMgPSBmaXhDYXBzKGNhcHMsIHRoaXMuX2Rlc2lyZWRDYXBDb25zdHJhaW50cywgdGhpcy5sb2cpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcihlLm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHRoaXMudmFsaWRhdGVEZXNpcmVkQ2FwcyhjYXBzKTtcblxuICAgIHRoaXMuc2Vzc2lvbklkID0gdXRpbC51dWlkVjQoKTtcbiAgICB0aGlzLmNhcHMgPSBjYXBzO1xuICAgIC8vIG1lcmdlIGNhcHMgb250byBvcHRzIHNvIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgd2hhdCdzIHdoZXJlXG4gICAgdGhpcy5vcHRzID0gey4uLl8uY2xvbmVEZWVwKHRoaXMuaW5pdGlhbE9wdHMpLCAuLi50aGlzLmNhcHN9O1xuXG4gICAgLy8gZGVhbCB3aXRoIHJlc2V0c1xuICAgIC8vIHNvbWUgcGVvcGxlIGxpa2UgdG8gZG8gd2VpcmQgdGhpbmdzIGJ5IHNldHRpbmcgbm9SZXNldCBhbmQgZnVsbFJlc2V0XG4gICAgLy8gYm90aCB0byB0cnVlLCBidXQgdGhpcyBpcyBtaXNndWlkZWQgYW5kIHN0cmFuZ2UsIHNvIGVycm9yIGhlcmUgaW5zdGVhZFxuICAgIGlmICh0aGlzLm9wdHMubm9SZXNldCAmJiB0aGlzLm9wdHMuZnVsbFJlc2V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiVGhlICdub1Jlc2V0JyBhbmQgJ2Z1bGxSZXNldCcgY2FwYWJpbGl0aWVzIGFyZSBtdXR1YWxseSBcIiArXG4gICAgICAgICAgJ2V4Y2x1c2l2ZSBhbmQgc2hvdWxkIG5vdCBib3RoIGJlIHNldCB0byB0cnVlLiBZb3UgJyArXG4gICAgICAgICAgXCJwcm9iYWJseSBtZWFudCB0byBqdXN0IHVzZSAnZnVsbFJlc2V0JyBvbiBpdHMgb3duXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdHMubm9SZXNldCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5vcHRzLmZ1bGxSZXNldCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5vcHRzLm5vUmVzZXQgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5vcHRzLmZhc3RSZXNldCA9ICF0aGlzLm9wdHMuZnVsbFJlc2V0ICYmICF0aGlzLm9wdHMubm9SZXNldDtcbiAgICB0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCA9IHRoaXMub3B0cy5mYXN0UmVzZXQgfHwgdGhpcy5vcHRzLm5vUmVzZXQ7XG5cbiAgICAvLyBQcmV2ZW50cyBlbXB0eSBzdHJpbmcgY2FwcyBzbyB3ZSBkb24ndCBuZWVkIHRvIHRlc3QgaXQgZXZlcnl3aGVyZVxuICAgIGlmICh0eXBlb2YgdGhpcy5vcHRzLmFwcCA9PT0gJ3N0cmluZycgJiYgdGhpcy5vcHRzLmFwcC50cmltKCkgPT09ICcnKSB7XG4gICAgICBkZWxldGUgdGhpcy5vcHRzLmFwcDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5jYXBzLm5ld0NvbW1hbmRUaW1lb3V0KSkge1xuICAgICAgdGhpcy5uZXdDb21tYW5kVGltZW91dE1zID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovICh0aGlzLmNhcHMubmV3Q29tbWFuZFRpbWVvdXQpICogMTAwMDtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2cucHJlZml4ID0gaGVscGVycy5nZW5lcmF0ZURyaXZlckxvZ1ByZWZpeCh0aGlzLCB0aGlzLnNlc3Npb25JZCk7XG5cbiAgICB0aGlzLmxvZy5pbmZvKGBTZXNzaW9uIGNyZWF0ZWQgd2l0aCBzZXNzaW9uIGlkOiAke3RoaXMuc2Vzc2lvbklkfWApO1xuXG4gICAgcmV0dXJuIFt0aGlzLnNlc3Npb25JZCwgY2Fwc107XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZXNzaW9uSWRdXG4gICAqIEBwYXJhbSB7RHJpdmVyRGF0YVtdfSBbZHJpdmVyRGF0YV1cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkZWxldGVTZXNzaW9uKHNlc3Npb25JZCwgZHJpdmVyRGF0YSkge1xuICAgIGF3YWl0IHRoaXMuY2xlYXJOZXdDb21tYW5kVGltZW91dCgpO1xuICAgIGlmICh0aGlzLmlzQ29tbWFuZHNRdWV1ZUVuYWJsZWQgJiYgdGhpcy5jb21tYW5kc1F1ZXVlR3VhcmQuaXNCdXN5KCkpIHtcbiAgICAgIC8vIHNpbXBsZSBoYWNrIHRvIHJlbGVhc2UgcGVuZGluZyBjb21tYW5kcyBpZiB0aGV5IGV4aXN0XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBfLmtleXModGhpcy5jb21tYW5kc1F1ZXVlR3VhcmQucXVldWVzKSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuY29tbWFuZHNRdWV1ZUd1YXJkLnF1ZXVlc1trZXldID0gW107XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2Vzc2lvbklkID0gbnVsbDtcbiAgICB0aGlzLl9sb2cucHJlZml4ID0gaGVscGVycy5nZW5lcmF0ZURyaXZlckxvZ1ByZWZpeCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0NhcGFiaWxpdGllc30gY2Fwc1xuICAgKi9cbiAgbG9nRXh0cmFDYXBzKGNhcHMpIHtcbiAgICBsZXQgZXh0cmFDYXBzID0gXy5kaWZmZXJlbmNlKF8ua2V5cyhjYXBzKSwgXy5rZXlzKHRoaXMuX2Rlc2lyZWRDYXBDb25zdHJhaW50cykpO1xuICAgIGlmIChleHRyYUNhcHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKFxuICAgICAgICBgVGhlIGZvbGxvd2luZyBjYXBhYmlsaXRpZXMgd2VyZSBwcm92aWRlZCwgYnV0IGFyZSBub3QgYCArIGByZWNvZ25pemVkIGJ5IEFwcGl1bTpgXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBjYXAgb2YgZXh0cmFDYXBzKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYCAgJHtjYXB9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7Q2FwYWJpbGl0aWVzPEM+fSBjYXBzXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgdmFsaWRhdGVEZXNpcmVkQ2FwcyhjYXBzKSB7XG4gICAgaWYgKCF0aGlzLnNob3VsZFZhbGlkYXRlQ2Fwcykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlQ2FwcyhjYXBzLCB0aGlzLl9kZXNpcmVkQ2FwQ29uc3RyYWludHMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coXG4gICAgICAgIG5ldyBlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcihcbiAgICAgICAgICBgVGhlIGRlc2lyZWRDYXBhYmlsaXRpZXMgb2JqZWN0IHdhcyBub3QgdmFsaWQgZm9yIHRoZSBgICtcbiAgICAgICAgICAgIGBmb2xsb3dpbmcgcmVhc29uKHMpOiAke2UubWVzc2FnZX1gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2dFeHRyYUNhcHMoY2Fwcyk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgZW5zdXJlcyB0aGF0IGFsbCBvZiB0aGUgbWl4aW5zIGNvcnJlY3RseSBpbXBsZW1lbnQgdGhlIGludGVyZmFjZSBkZXNjcmliZWQgaW4ge0BsaW5rY29kZSBEcml2ZXJ9LlxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gW0M9e31dXG4gKiBAaW1wbGVtZW50cyB7RHJpdmVyPEM+fVxuICovXG5leHBvcnQgY2xhc3MgQmFzZURyaXZlciBleHRlbmRzIGNyZWF0ZUJhc2VEcml2ZXJDbGFzcyhCYXNlRHJpdmVyQ29yZSkge31cbmV4cG9ydCBkZWZhdWx0IEJhc2VEcml2ZXI7XG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkhUVFBNZXRob2R9IEhUVFBNZXRob2RcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5FeHRlcm5hbERyaXZlcn0gRXh0ZXJuYWxEcml2ZXJcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJEYXRhfSBEcml2ZXJEYXRhXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ29uc3RyYWludHN9IENvbnN0cmFpbnRzXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ29uc3RyYWludH0gQ29uc3RyYWludFxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlN0cmluZ1JlY29yZH0gU3RyaW5nUmVjb3JkXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQmFzZURyaXZlckNhcENvbnN0cmFpbnRzfSBCYXNlRHJpdmVyQ2FwQ29uc3RyYWludHNcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5TZXJ2ZXJBcmdzfSBTZXJ2ZXJBcmdzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgVXBkYXRlU2VydmVyQ2FsbGJhY2tcbiAqIEBwYXJhbSB7aW1wb3J0KCdleHByZXNzJykuRXhwcmVzc30gYXBwIC0gRXhwcmVzcyBhcHBcbiAqIEBwYXJhbSB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQXBwaXVtU2VydmVyfSBodHRwU2VydmVyIC0gSFRUUCBzZXJ2ZXJcbiAqIEByZXR1cm5zIHtpbXBvcnQoJ3R5cGUtZmVzdCcpLlByb21pc2FibGU8dm9pZD59XG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIHVzZWQgdG8gZXh0ZW5kIHtAbGlua2NvZGUgQmFzZURyaXZlckNvcmV9IGJ5IHRoZSBtaXhpbnMgYW5kIGFsc28gZXh0ZXJuYWwgZHJpdmVycy5cbiAqIEB0ZW1wbGF0ZSBbUHJvdG89e31dXG4gKiBAdGVtcGxhdGUgW1N0YXRpYz17fV1cbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5DbGFzczxCYXNlRHJpdmVyQ29yZSAmIFByb3RvLGltcG9ydCgnQGFwcGl1bS90eXBlcycpLkRyaXZlclN0YXRpYyAmIFN0YXRpYz59IEJhc2VEcml2ZXJCYXNlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0NvbnN0cmFpbnRzfSBbQz1CYXNlRHJpdmVyQ2FwQ29uc3RyYWludHNdXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuU2Vzc2lvbkhhbmRsZXI8W3N0cmluZywgb2JqZWN0XSx2b2lkLCBDPn0gU2Vzc2lvbkhhbmRsZXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IFtDPUJhc2VEcml2ZXJDYXBDb25zdHJhaW50c11cbiAqIEB0ZW1wbGF0ZSB7U3RyaW5nUmVjb3JkfHZvaWR9IFtFeHRyYT12b2lkXVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNhcGFiaWxpdGllczxDLCBFeHRyYT59IENhcGFiaWxpdGllc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gW0M9QmFzZURyaXZlckNhcENvbnN0cmFpbnRzXVxuICogQHRlbXBsYXRlIHtTdHJpbmdSZWNvcmR8dm9pZH0gW0V4dHJhPXZvaWRdXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuVzNDQ2FwYWJpbGl0aWVzPEMsIEV4dHJhPn0gVzNDQ2FwYWJpbGl0aWVzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0NvbnN0cmFpbnRzfSBDXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ29uc3RyYWludHNUb0NhcHM8Qz59IENvbnN0cmFpbnRzVG9DYXBzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0NvbnN0cmFpbnRzfSBDXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyPEM+fSBEcml2ZXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IENcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJPcHRzPEM+fSBEcml2ZXJPcHRzXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBR0E7O0FBT0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFFQSxNQUFNQSxrQkFBa0IsR0FBRyxxQkFBM0I7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxtQkFBNUI7QUFDQSxNQUFNQyx3QkFBd0IsR0FBRyxzQkFBakM7QUFDQSxNQUFNQyx1QkFBdUIsR0FBRyxxQkFBaEM7QUFDQSxNQUFNQyw0QkFBNEIsR0FBRyxzQkFBckM7O0FBUU8sTUFBTUMsY0FBTixTQUE2QkMsZ0JBQTdCLENBQXdDO0VBSTdDQyxPQUFPO0VBS1BDLElBQUk7RUFLSkMsWUFBWTtFQUtaQyxxQkFBcUI7RUFLckJDLElBQUk7RUFFK0IsT0FBNUJDLDRCQUE0QixHQUFHQSxtQ0FBSDs7RUFPbkNDLFdBQVcsQ0FBQ0YsSUFBSSxHQUFpQyxFQUF0QyxFQUEyQ0csa0JBQWtCLEdBQUcsSUFBaEUsRUFBc0U7SUFDL0UsTUFBTUgsSUFBTixFQUFZRyxrQkFBWjtJQU1BLEtBQUtILElBQUwsR0FBWUEsSUFBWjtFQUNEOztFQVd5QixJQUF0Qkksc0JBQXNCLEdBQUc7SUFDM0IsT0FBT0MsTUFBTSxDQUFDQyxNQUFQLENBQWNDLGVBQUEsQ0FBRUMsS0FBRixDQUFRLEVBQVIsRUFBWVAsbUNBQVos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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.js","names":["EVENT_SESSION_INIT","EVENT_SESSION_START","EVENT_SESSION_QUIT_START","EVENT_SESSION_QUIT_DONE","ON_UNEXPECTED_SHUTDOWN_EVENT","BaseDriverCore","DriverCore","cliArgs","caps","originalCaps","desiredCapConstraints","opts","BASE_DESIRED_CAP_CONSTRAINTS","constructor","shouldValidateCaps","_desiredCapConstraints","Object","freeze","_","merge","executeCommand","cmd","args","startTime","Date","now","protocol","determineProtocol","logEvent","DELETE_SESSION_COMMAND","clearNewCommandTimeout","shutdownUnexpectedly","errors","NoSuchDriverError","NotYetImplementedError","unexpectedShutdownListener","commandExecutor","B","race","resolve","reject","eventEmitter","on","finally","removeListener","res","isCommandsQueueEnabled","commandsQueueGuard","acquire","BaseDriver","name","startNewCommandTimeout","endTime","_eventHistory","commands","push","startUnexpectedShutdown","err","emit","sessionId","deleteSession","newCommandTimeoutMs","noCommandTimer","setTimeout","log","warn","errorMessage","Error","assignServer","server","host","port","path","serverHost","serverPort","serverPath","reset","debug","currentConfig","property","resetOnUnexpectedShutdown","createSession","key","value","toPairs","w3cCapabilities1","w3cCapabilities2","w3cCapabilities","driverData","SessionNotCreatedError","cloneDeep","find","isW3cCaps","setProtocolW3C","JSON","stringify","processCapabilities","APPIUM_OPTS_CAP","PREFIXED_APPIUM_OPTS_CAP","promoteAppiumOptions","fixCaps","e","message","validateDesiredCaps","util","uuidV4","initialOpts","noReset","fullReset","fastReset","skipUninstall","app","trim","isUndefined","newCommandTimeout","_log","prefix","helpers","generateDriverLogPrefix","info","isBusy","keys","queues","logExtraCaps","extraCaps","difference","length","cap","validateCaps","errorAndThrow","createBaseDriverClass"],"sources":["../../../lib/basedriver/driver.js"],"sourcesContent":["/* eslint-disable require-await */\n/* eslint-disable no-unused-vars */\n\nimport {\n validateCaps,\n APPIUM_OPTS_CAP,\n PREFIXED_APPIUM_OPTS_CAP,\n processCapabilities,\n promoteAppiumOptions,\n} from './capabilities';\nimport {DriverCore} from './core';\nimport {util} from '@appium/support';\nimport B from 'bluebird';\nimport _ from 'lodash';\nimport {fixCaps, isW3cCaps} from '../helpers/capabilities';\nimport {DELETE_SESSION_COMMAND, determineProtocol, errors} from '../protocol';\nimport {createBaseDriverClass} from './commands';\nimport helpers from './helpers';\nimport {BASE_DESIRED_CAP_CONSTRAINTS} from '@appium/types';\n\nconst EVENT_SESSION_INIT = 'newSessionRequested';\nconst EVENT_SESSION_START = 'newSessionStarted';\nconst EVENT_SESSION_QUIT_START = 'quitSessionRequested';\nconst EVENT_SESSION_QUIT_DONE = 'quitSessionFinished';\nconst ON_UNEXPECTED_SHUTDOWN_EVENT = 'onUnexpectedShutdown';\n\n/**\n * @implements {SessionHandler<C>}\n * @template {Constraints} C\n * @template {StringRecord} [CArgs=StringRecord]\n * @extends {DriverCore<C>}\n */\nexport class BaseDriverCore extends DriverCore {\n /**\n * @type {CArgs & ServerArgs}\n */\n cliArgs;\n\n /**\n * @type {Capabilities<C>}\n */\n caps;\n\n /**\n * @type {W3CCapabilities<C>}\n */\n originalCaps;\n\n /**\n * @type {C}\n */\n desiredCapConstraints;\n\n /**\n * @type {DriverOpts<C> & DriverOpts<BaseDriverCapConstraints>}\n */\n opts;\n\n static BASE_DESIRED_CAP_CONSTRAINTS = BASE_DESIRED_CAP_CONSTRAINTS;\n\n /**\n *\n * @param {DriverOpts<C>} opts\n * @param {boolean} shouldValidateCaps\n */\n constructor(opts = /** @type {DriverOpts<C>} */ ({}), shouldValidateCaps = true) {\n super(opts, shouldValidateCaps);\n\n /**\n * This must be assigned here because the declaration of {@linkcode BaseDriverCore.opts} above\n * blows away {@linkcode DriverCore.opts}.\n */\n this.opts = opts;\n }\n\n /**\n * Contains the base constraints plus whatever the subclass wants to add.\n *\n * Subclasses _shouldn't_ need to use this. If you need to use this, please create\n * an issue:\n * @see https://github.com/appium/appium/issues/new\n * @type {Readonly<BaseDriverCapConstraints & C>}\n * @protected\n */\n get _desiredCapConstraints() {\n return Object.freeze(_.merge({}, BASE_DESIRED_CAP_CONSTRAINTS, this.desiredCapConstraints));\n }\n\n // This is the main command handler for the driver. It wraps command\n // execution with timeout logic, checking that we have a valid session,\n // and ensuring that we execute commands one at a time. This method is called\n // by MJSONWP's express router.\n /**\n * @param {string} cmd\n * @param {...any} args\n * @returns {Promise<any>}\n */\n async executeCommand(cmd, ...args) {\n // get start time for this command, and log in special cases\n let startTime = Date.now();\n\n if (cmd === 'createSession') {\n // If creating a session determine if W3C or MJSONWP protocol was requested and remember the choice\n this.protocol = determineProtocol(args);\n this.logEvent(EVENT_SESSION_INIT);\n } else if (cmd === DELETE_SESSION_COMMAND) {\n this.logEvent(EVENT_SESSION_QUIT_START);\n }\n\n // if we had a command timer running, clear it now that we're starting\n // a new command and so don't want to time out\n await this.clearNewCommandTimeout();\n\n if (this.shutdownUnexpectedly) {\n throw new errors.NoSuchDriverError('The driver was unexpectedly shut down!');\n }\n\n // If we don't have this command, it must not be implemented\n if (!this[cmd]) {\n throw new errors.NotYetImplementedError();\n }\n\n let unexpectedShutdownListener;\n const commandExecutor = async () =>\n await B.race([\n this[cmd](...args),\n new B((resolve, reject) => {\n unexpectedShutdownListener = reject;\n this.eventEmitter.on(ON_UNEXPECTED_SHUTDOWN_EVENT, unexpectedShutdownListener);\n }),\n ]).finally(() => {\n if (unexpectedShutdownListener) {\n // This is needed to prevent memory leaks\n this.eventEmitter.removeListener(\n ON_UNEXPECTED_SHUTDOWN_EVENT,\n unexpectedShutdownListener\n );\n unexpectedShutdownListener = null;\n }\n });\n const res = this.isCommandsQueueEnabled\n ? await this.commandsQueueGuard.acquire(BaseDriver.name, commandExecutor)\n : await commandExecutor();\n\n // if we have set a new command timeout (which is the default), start a\n // timer once we've finished executing this command. If we don't clear\n // the timer (which is done when a new command comes in), we will trigger\n // automatic session deletion in this.onCommandTimeout. Of course we don't\n // want to trigger the timer when the user is shutting down the session\n // intentionally\n if (this.isCommandsQueueEnabled && cmd !== DELETE_SESSION_COMMAND) {\n // resetting existing timeout\n await this.startNewCommandTimeout();\n }\n\n // log timing information about this command\n const endTime = Date.now();\n this._eventHistory.commands.push({cmd, startTime, endTime});\n if (cmd === 'createSession') {\n this.logEvent(EVENT_SESSION_START);\n } else if (cmd === DELETE_SESSION_COMMAND) {\n this.logEvent(EVENT_SESSION_QUIT_DONE);\n }\n\n return res;\n }\n\n /**\n *\n * @param {Error|import('../protocol/errors').NoSuchDriverError} err\n */\n async startUnexpectedShutdown(\n err = new errors.NoSuchDriverError('The driver was unexpectedly shut down!')\n ) {\n this.eventEmitter.emit(ON_UNEXPECTED_SHUTDOWN_EVENT, err); // allow others to listen for this\n this.shutdownUnexpectedly = true;\n try {\n if (this.sessionId !== null) {\n await this.deleteSession(this.sessionId);\n }\n } finally {\n this.shutdownUnexpectedly = false;\n }\n }\n\n async startNewCommandTimeout() {\n // make sure there are no rogue timeouts\n await this.clearNewCommandTimeout();\n\n // if command timeout is 0, it is disabled\n if (!this.newCommandTimeoutMs) return; // eslint-disable-line curly\n\n this.noCommandTimer = setTimeout(async () => {\n this.log.warn(\n `Shutting down because we waited ` +\n `${this.newCommandTimeoutMs / 1000.0} seconds for a command`\n );\n const errorMessage =\n `New Command Timeout of ` +\n `${this.newCommandTimeoutMs / 1000.0} seconds ` +\n `expired. Try customizing the timeout using the ` +\n `'newCommandTimeout' desired capability`;\n await this.startUnexpectedShutdown(new Error(errorMessage));\n }, this.newCommandTimeoutMs);\n }\n\n /**\n *\n * @param {import('@appium/types').AppiumServer} server\n * @param {string} host\n * @param {number} port\n * @param {string} path\n */\n assignServer(server, host, port, path) {\n this.server = server;\n this.serverHost = host;\n this.serverPort = port;\n this.serverPath = path;\n }\n\n /*\n * Restart the session with the original caps,\n * preserving the timeout config.\n */\n async reset() {\n this.log.debug('Resetting app mid-session');\n this.log.debug('Running generic full reset');\n\n // preserving state\n let currentConfig = {};\n for (let property of [\n 'implicitWaitMs',\n 'newCommandTimeoutMs',\n 'sessionId',\n 'resetOnUnexpectedShutdown',\n ]) {\n currentConfig[property] = this[property];\n }\n\n // We also need to preserve the unexpected shutdown, and make sure it is not cancelled during reset.\n this.resetOnUnexpectedShutdown = () => {};\n\n try {\n if (this.sessionId !== null) {\n await this.deleteSession(this.sessionId);\n }\n this.log.debug('Restarting app');\n await this.createSession(this.originalCaps);\n } finally {\n // always restore state.\n for (let [key, value] of _.toPairs(currentConfig)) {\n this[key] = value;\n }\n }\n await this.clearNewCommandTimeout();\n }\n\n /**\n *\n * Historically the first two arguments were reserved for JSONWP capabilities.\n * Appium 2 has dropped the support of these, so now we only accept capability\n * objects in W3C format and thus allow any of the three arguments to represent\n * the latter.\n * @param {W3CCapabilities<C>} w3cCapabilities1\n * @param {W3CCapabilities<C>} [w3cCapabilities2]\n * @param {W3CCapabilities<C>} [w3cCapabilities]\n * @param {DriverData[]} [driverData]\n * @returns {Promise<[string,Capabilities<C>]>}\n */\n async createSession(w3cCapabilities1, w3cCapabilities2, w3cCapabilities, driverData) {\n if (this.sessionId !== null) {\n throw new errors.SessionNotCreatedError(\n 'Cannot create a new session while one is in progress'\n );\n }\n\n this.log.debug();\n\n const originalCaps = _.cloneDeep(\n [w3cCapabilities, w3cCapabilities1, w3cCapabilities2].find(isW3cCaps)\n );\n if (!originalCaps) {\n throw new errors.SessionNotCreatedError(\n 'Appium only supports W3C-style capability objects. ' +\n 'Your client is sending an older capabilities format. Please update your client library.'\n );\n }\n\n this.setProtocolW3C();\n\n this.originalCaps = originalCaps;\n this.log.debug(\n `Creating session with W3C capabilities: ${JSON.stringify(originalCaps, null, 2)}`\n );\n\n /** @type {Capabilities<C>} */\n let caps;\n try {\n caps = processCapabilities(\n originalCaps,\n this._desiredCapConstraints,\n this.shouldValidateCaps\n );\n if (caps[APPIUM_OPTS_CAP]) {\n this.log.debug(\n `Found ${PREFIXED_APPIUM_OPTS_CAP} capability present; will promote items inside to caps`\n );\n caps = promoteAppiumOptions(caps);\n }\n caps = fixCaps(caps, this._desiredCapConstraints, this.log);\n } catch (e) {\n throw new errors.SessionNotCreatedError(e.message);\n }\n\n this.validateDesiredCaps(caps);\n\n this.sessionId = util.uuidV4();\n this.caps = caps;\n // merge caps onto opts so we don't need to worry about what's where\n this.opts = {..._.cloneDeep(this.initialOpts), ...this.caps};\n\n // deal with resets\n // some people like to do weird things by setting noReset and fullReset\n // both to true, but this is misguided and strange, so error here instead\n if (this.opts.noReset && this.opts.fullReset) {\n throw new Error(\n \"The 'noReset' and 'fullReset' capabilities are mutually \" +\n 'exclusive and should not both be set to true. You ' +\n \"probably meant to just use 'fullReset' on its own\"\n );\n }\n if (this.opts.noReset === true) {\n this.opts.fullReset = false;\n }\n if (this.opts.fullReset === true) {\n this.opts.noReset = false;\n }\n this.opts.fastReset = !this.opts.fullReset && !this.opts.noReset;\n this.opts.skipUninstall = this.opts.fastReset || this.opts.noReset;\n\n // Prevents empty string caps so we don't need to test it everywhere\n if (typeof this.opts.app === 'string' && this.opts.app.trim() === '') {\n delete this.opts.app;\n }\n\n if (!_.isUndefined(this.caps.newCommandTimeout)) {\n this.newCommandTimeoutMs = /** @type {number} */ (this.caps.newCommandTimeout) * 1000;\n }\n\n this._log.prefix = helpers.generateDriverLogPrefix(this, this.sessionId);\n\n this.log.info(`Session created with session id: ${this.sessionId}`);\n\n return [this.sessionId, caps];\n }\n\n /**\n *\n * @param {string} [sessionId]\n * @param {DriverData[]} [driverData]\n * @returns {Promise<void>}\n */\n async deleteSession(sessionId, driverData) {\n await this.clearNewCommandTimeout();\n if (this.isCommandsQueueEnabled && this.commandsQueueGuard.isBusy()) {\n // simple hack to release pending commands if they exist\n // @ts-ignore\n for (const key of _.keys(this.commandsQueueGuard.queues)) {\n // @ts-ignore\n this.commandsQueueGuard.queues[key] = [];\n }\n }\n this.sessionId = null;\n this._log.prefix = helpers.generateDriverLogPrefix(this);\n }\n\n /**\n *\n * @param {Capabilities} caps\n */\n logExtraCaps(caps) {\n let extraCaps = _.difference(_.keys(caps), _.keys(this._desiredCapConstraints));\n if (extraCaps.length) {\n this.log.warn(\n `The following capabilities were provided, but are not ` + `recognized by Appium:`\n );\n for (const cap of extraCaps) {\n this.log.warn(` ${cap}`);\n }\n }\n }\n\n /**\n *\n * @param {Capabilities<C>} caps\n * @returns {boolean}\n */\n validateDesiredCaps(caps) {\n if (!this.shouldValidateCaps) {\n return true;\n }\n\n try {\n validateCaps(caps, this._desiredCapConstraints);\n } catch (e) {\n this.log.errorAndThrow(\n new errors.SessionNotCreatedError(\n `The desiredCapabilities object was not valid for the ` +\n `following reason(s): ${e.message}`\n )\n );\n }\n\n this.logExtraCaps(caps);\n\n return true;\n }\n}\n\n/**\n * This ensures that all of the mixins correctly implement the interface described in {@linkcode Driver}.\n * @template {Constraints} [C={}]\n * @implements {Driver<C>}\n */\nexport class BaseDriver extends createBaseDriverClass(BaseDriverCore) {}\nexport default BaseDriver;\n\n/**\n * @typedef {import('@appium/types').HTTPMethod} HTTPMethod\n * @typedef {import('@appium/types').ExternalDriver} ExternalDriver\n * @typedef {import('@appium/types').DriverData} DriverData\n * @typedef {import('@appium/types').Constraints} Constraints\n * @typedef {import('@appium/types').Constraint} Constraint\n * @typedef {import('@appium/types').StringRecord} StringRecord\n * @typedef {import('@appium/types').BaseDriverCapConstraints} BaseDriverCapConstraints\n * @typedef {import('@appium/types').ServerArgs} ServerArgs\n */\n\n/**\n * @callback UpdateServerCallback\n * @param {import('express').Express} app - Express app\n * @param {import('@appium/types').AppiumServer} httpServer - HTTP server\n * @returns {import('type-fest').Promisable<void>}\n */\n\n/**\n * This is used to extend {@linkcode BaseDriverCore} by the mixins and also external drivers.\n * @template [Proto={}]\n * @template [Static={}]\n * @typedef {import('@appium/types').Class<BaseDriverCore & Proto,import('@appium/types').DriverStatic & Static>} BaseDriverBase\n */\n\n/**\n * @template {Constraints} [C=BaseDriverCapConstraints]\n * @typedef {import('@appium/types').SessionHandler<[string, object],void, C>} SessionHandler\n */\n\n/**\n * @template {Constraints} [C=BaseDriverCapConstraints]\n * @template {StringRecord|void} [Extra=void]\n * @typedef {import('@appium/types').Capabilities<C, Extra>} Capabilities\n */\n\n/**\n * @template {Constraints} [C=BaseDriverCapConstraints]\n * @template {StringRecord|void} [Extra=void]\n * @typedef {import('@appium/types').W3CCapabilities<C, Extra>} W3CCapabilities\n */\n\n/**\n * @template {Constraints} C\n * @typedef {import('@appium/types').ConstraintsToCaps<C>} ConstraintsToCaps\n */\n\n/**\n * @template {Constraints} C\n * @typedef {import('@appium/types').Driver<C>} Driver\n */\n\n/**\n * @template {Constraints} C\n * @typedef {import('@appium/types').DriverOpts<C>} DriverOpts\n */\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../lib/basedriver/helpers.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../lib/basedriver/helpers.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;WAyKc,OAAO;;;;;;;;;;aAGP,MAAM;;;;;;;aAMN,MAAM;;;;;;;;;;;;2BAMA,kBAAkB,KAAK,CAAC,QAAQ,iBAAiB,GAAC,SAAS,CAAC,GAAC,iBAAiB,GAAC,SAAS,CAAC;;;;;yBAQ/F,MAAM,EAAE;;;kBA8ZR,IAAI;eACJ,OAAO;YACP,MAAM;;AApcpB;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;;GAIG;AAEH;;;;;;;;;;;;GAYG;AAEH;;;;;;;;;GASG;AACH,kCAJW,MAAM,YACN,MAAM,GAAC,MAAM,EAAE,GAAC,mBAAmB,gBA4N7C;AA8FD,qDAEC;AAED;;;;;;;;;GASG;AACH,oFAuBC;AAED;;;;;GAKG;AACH,oCAFW,MAAM,GAAC,aAAa,SAoB9B;AAED;;;;;;GAMG;AACH,6CAJW,OAAO,eAAe,EAAE,IAAI,cAC5B,MAAM,UACJ,MAAM,CAKlB"}
|