appium-mac2-driver 1.4.2 → 1.4.4
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/README.md +6 -4
- package/WebDriverAgentMac/WebDriverAgentLib/Commands/FBElementCommands.m +1 -1
- package/WebDriverAgentMac/WebDriverAgentLib/Commands/FBScreenshotCommands.m +2 -3
- package/WebDriverAgentMac/WebDriverAgentLib/Utilities/AMSnapshotUtils.m +1 -1
- package/build/index.js +1 -5
- package/build/lib/commands/app-management.js +1 -4
- package/build/lib/commands/app-management.js.map +1 -0
- package/build/lib/commands/applescript.js +2 -19
- package/build/lib/commands/applescript.js.map +1 -0
- package/build/lib/commands/execute.js +1 -13
- package/build/lib/commands/execute.js.map +1 -0
- package/build/lib/commands/find.js +2 -8
- package/build/lib/commands/find.js.map +1 -0
- package/build/lib/commands/gestures.js +1 -20
- package/build/lib/commands/gestures.js.map +1 -0
- package/build/lib/commands/index.js +3 -13
- package/build/lib/commands/index.js.map +1 -0
- package/build/lib/commands/record-screen.js +1 -63
- package/build/lib/commands/record-screen.js.map +1 -0
- package/build/lib/commands/screenshots.js +2 -4
- package/build/lib/commands/screenshots.js.map +1 -0
- package/build/lib/commands/source.js +1 -4
- package/build/lib/commands/source.js.map +1 -0
- package/build/lib/desired-caps.js +1 -3
- package/build/lib/desired-caps.js.map +1 -0
- package/build/lib/driver.js +1 -33
- package/build/lib/driver.js.map +1 -0
- package/build/lib/logger.js +1 -5
- package/build/lib/logger.js.map +1 -0
- package/build/lib/utils.js +7 -27
- package/build/lib/utils.js.map +1 -0
- package/build/lib/wda-mac.js +2 -109
- package/build/lib/wda-mac.js.map +1 -0
- package/lib/utils.js +7 -15
- package/npm-shrinkwrap.json +1493 -1346
- package/package.json +3 -3
package/build/lib/wda-mac.js
CHANGED
|
@@ -1,46 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.default = void 0;
|
|
9
|
-
|
|
10
8
|
require("source-map-support/register");
|
|
11
|
-
|
|
12
9
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
|
-
|
|
14
10
|
var _path = _interopRequireDefault(require("path"));
|
|
15
|
-
|
|
16
11
|
var _url = _interopRequireDefault(require("url"));
|
|
17
|
-
|
|
18
12
|
var _axios = _interopRequireDefault(require("axios"));
|
|
19
|
-
|
|
20
13
|
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
21
|
-
|
|
22
14
|
var _driver = require("appium/driver");
|
|
23
|
-
|
|
24
15
|
var _support = require("appium/support");
|
|
25
|
-
|
|
26
16
|
var _teen_process = require("teen_process");
|
|
27
|
-
|
|
28
17
|
var _asyncbox = require("asyncbox");
|
|
29
|
-
|
|
30
18
|
var _portscanner = require("portscanner");
|
|
31
|
-
|
|
32
19
|
var _child_process = require("child_process");
|
|
33
|
-
|
|
34
20
|
var _utils = require("./utils");
|
|
35
|
-
|
|
36
21
|
const log = _support.logger.getLogger('WebDriverAgentMac');
|
|
37
|
-
|
|
38
22
|
const DEFAULT_WDA_ROOT = _path.default.resolve((0, _utils.getModuleRoot)(), 'WebDriverAgentMac');
|
|
39
|
-
|
|
40
23
|
const WDA_PROJECT_NAME = 'WebDriverAgentMac.xcodeproj';
|
|
41
|
-
|
|
42
24
|
const WDA_PROJECT = (wdaRoot = DEFAULT_WDA_ROOT) => _path.default.resolve(wdaRoot, WDA_PROJECT_NAME);
|
|
43
|
-
|
|
44
25
|
const RUNNER_SCHEME = 'WebDriverAgentRunner';
|
|
45
26
|
const DISABLE_STORE_ARG = 'COMPILER_INDEX_STORE_ENABLE=NO';
|
|
46
27
|
const XCODEBUILD = 'xcodebuild';
|
|
@@ -49,55 +30,42 @@ const DEFAULT_SYSTEM_PORT = 10100;
|
|
|
49
30
|
const DEFAULT_SYSTEM_HOST = '127.0.0.1';
|
|
50
31
|
const DEFAULT_SHOW_SERVER_LOGS = false;
|
|
51
32
|
const RUNNING_PROCESS_IDS = [];
|
|
52
|
-
|
|
53
33
|
const RECENT_UPGRADE_TIMESTAMP_PATH = _path.default.join('.appium', 'webdriveragent_mac', 'upgrade.time');
|
|
54
|
-
|
|
55
34
|
async function getUpgradeTimestamp() {
|
|
56
35
|
const packageManifest = _path.default.resolve((0, _utils.getModuleRoot)(), 'package.json');
|
|
57
|
-
|
|
58
36
|
if (!(await _support.fs.exists(packageManifest))) {
|
|
59
37
|
return null;
|
|
60
38
|
}
|
|
61
|
-
|
|
62
39
|
const {
|
|
63
40
|
mtime
|
|
64
41
|
} = await _support.fs.stat(packageManifest);
|
|
65
42
|
return mtime.getTime();
|
|
66
43
|
}
|
|
67
|
-
|
|
68
44
|
async function cleanupObsoleteProcesses() {
|
|
69
45
|
if (!_lodash.default.isEmpty(RUNNING_PROCESS_IDS)) {
|
|
70
46
|
log.debug(`Cleaning up ${RUNNING_PROCESS_IDS.length} obsolete ` + _support.util.pluralize('process', RUNNING_PROCESS_IDS.length, false));
|
|
71
|
-
|
|
72
47
|
try {
|
|
73
48
|
await (0, _teen_process.exec)('kill', ['-9', ...RUNNING_PROCESS_IDS]);
|
|
74
49
|
} catch (ign) {}
|
|
75
|
-
|
|
76
50
|
_lodash.default.pullAll(RUNNING_PROCESS_IDS, RUNNING_PROCESS_IDS);
|
|
77
51
|
}
|
|
78
52
|
}
|
|
79
|
-
|
|
80
53
|
process.once('exit', () => {
|
|
81
54
|
if (!_lodash.default.isEmpty(RUNNING_PROCESS_IDS)) {
|
|
82
55
|
try {
|
|
83
56
|
(0, _child_process.execSync)(`kill -9 ${RUNNING_PROCESS_IDS.join(' ')}`);
|
|
84
57
|
} catch (ign) {}
|
|
85
|
-
|
|
86
58
|
_lodash.default.pullAll(RUNNING_PROCESS_IDS, RUNNING_PROCESS_IDS);
|
|
87
59
|
}
|
|
88
60
|
});
|
|
89
|
-
|
|
90
61
|
class WDAMacProxy extends _driver.JWProxy {
|
|
91
62
|
async proxyCommand(url, method, body = null) {
|
|
92
63
|
if (this.didProcessExit) {
|
|
93
64
|
throw new _driver.errors.InvalidContextError(`'${method} ${url}' cannot be proxied to Mac2 Driver server because ` + 'its process is not running (probably crashed). Check the Appium log for more details');
|
|
94
65
|
}
|
|
95
|
-
|
|
96
66
|
return await super.proxyCommand(url, method, body);
|
|
97
67
|
}
|
|
98
|
-
|
|
99
68
|
}
|
|
100
|
-
|
|
101
69
|
class WDAMacProcess {
|
|
102
70
|
constructor() {
|
|
103
71
|
this.showServerLogs = DEFAULT_SHOW_SERVER_LOGS;
|
|
@@ -106,38 +74,28 @@ class WDAMacProcess {
|
|
|
106
74
|
this.bootstrapRoot = DEFAULT_WDA_ROOT;
|
|
107
75
|
this.proc = null;
|
|
108
76
|
}
|
|
109
|
-
|
|
110
77
|
get isRunning() {
|
|
111
78
|
var _this$proc;
|
|
112
|
-
|
|
113
79
|
return !!((_this$proc = this.proc) !== null && _this$proc !== void 0 && _this$proc.isRunning);
|
|
114
80
|
}
|
|
115
|
-
|
|
116
81
|
get pid() {
|
|
117
82
|
return this.isRunning ? this.proc.pid : null;
|
|
118
83
|
}
|
|
119
|
-
|
|
120
84
|
async listChildrenPids() {
|
|
121
85
|
return this.pid ? await (0, _utils.listChildrenProcessIds)(this.pid) : [];
|
|
122
86
|
}
|
|
123
|
-
|
|
124
87
|
async isFreshUpgrade() {
|
|
125
88
|
const homeFolder = process.env.HOME;
|
|
126
|
-
|
|
127
89
|
if (!homeFolder) {
|
|
128
90
|
log.info('The HOME folder path cannot be determined');
|
|
129
91
|
return false;
|
|
130
92
|
}
|
|
131
|
-
|
|
132
93
|
const currentUpgradeTimestamp = await getUpgradeTimestamp();
|
|
133
|
-
|
|
134
94
|
if (!_lodash.default.isInteger(currentUpgradeTimestamp)) {
|
|
135
95
|
log.info('It is impossible to determine the timestamp of the package');
|
|
136
96
|
return false;
|
|
137
97
|
}
|
|
138
|
-
|
|
139
98
|
const timestampPath = _path.default.resolve(homeFolder, RECENT_UPGRADE_TIMESTAMP_PATH);
|
|
140
|
-
|
|
141
99
|
if (await _support.fs.exists(timestampPath)) {
|
|
142
100
|
try {
|
|
143
101
|
await _support.fs.access(timestampPath, _support.fs.W_OK);
|
|
@@ -145,21 +103,17 @@ class WDAMacProcess {
|
|
|
145
103
|
log.info(`WebDriverAgent upgrade timestamp at '${timestampPath}' is not writeable`);
|
|
146
104
|
return false;
|
|
147
105
|
}
|
|
148
|
-
|
|
149
106
|
const recentUpgradeTimestamp = parseInt(await _support.fs.readFile(timestampPath, 'utf8'), 10);
|
|
150
|
-
|
|
151
107
|
if (_lodash.default.isInteger(recentUpgradeTimestamp)) {
|
|
152
108
|
if (recentUpgradeTimestamp >= currentUpgradeTimestamp) {
|
|
153
109
|
log.info(`WebDriverAgent sources are up to date ` + `(${recentUpgradeTimestamp} >= ${currentUpgradeTimestamp})`);
|
|
154
110
|
return false;
|
|
155
111
|
}
|
|
156
|
-
|
|
157
112
|
log.info(`WebDriverAgent sources have been upgraded ` + `(${recentUpgradeTimestamp} < ${currentUpgradeTimestamp})`);
|
|
158
113
|
} else {
|
|
159
114
|
log.warn(`The recent upgrade timestamp at '${timestampPath}' is corrupted. Trying to fix it`);
|
|
160
115
|
}
|
|
161
116
|
}
|
|
162
|
-
|
|
163
117
|
try {
|
|
164
118
|
await (0, _support.mkdirp)(_path.default.dirname(timestampPath));
|
|
165
119
|
await _support.fs.writeFile(timestampPath, `${currentUpgradeTimestamp}`, 'utf8');
|
|
@@ -168,10 +122,8 @@ class WDAMacProcess {
|
|
|
168
122
|
log.info(`Unable to create the recent WebDriverAgent upgrade timestamp at '${timestampPath}'. ` + `Original error: ${e.message}`);
|
|
169
123
|
return false;
|
|
170
124
|
}
|
|
171
|
-
|
|
172
125
|
return true;
|
|
173
126
|
}
|
|
174
|
-
|
|
175
127
|
hasSameOpts({
|
|
176
128
|
showServerLogs,
|
|
177
129
|
systemPort,
|
|
@@ -181,53 +133,41 @@ class WDAMacProcess {
|
|
|
181
133
|
if (_lodash.default.isBoolean(showServerLogs) && this.showServerLogs !== showServerLogs || _lodash.default.isNil(showServerLogs) && this.showServerLogs !== DEFAULT_SHOW_SERVER_LOGS) {
|
|
182
134
|
return false;
|
|
183
135
|
}
|
|
184
|
-
|
|
185
136
|
if (systemPort && this.port !== systemPort || !systemPort && this.port !== DEFAULT_SYSTEM_PORT) {
|
|
186
137
|
return false;
|
|
187
138
|
}
|
|
188
|
-
|
|
189
139
|
if (systemHost && this.host !== systemHost || !systemHost && this.host !== DEFAULT_SYSTEM_HOST) {
|
|
190
140
|
return false;
|
|
191
141
|
}
|
|
192
|
-
|
|
193
142
|
if (bootstrapRoot && this.bootstrapRoot !== bootstrapRoot || !bootstrapRoot && this.bootstrapRoot !== DEFAULT_WDA_ROOT) {
|
|
194
143
|
return false;
|
|
195
144
|
}
|
|
196
|
-
|
|
197
145
|
return true;
|
|
198
146
|
}
|
|
199
|
-
|
|
200
147
|
async init(opts = {}) {
|
|
201
148
|
if (this.isRunning && this.hasSameOpts(opts)) {
|
|
202
149
|
return false;
|
|
203
150
|
}
|
|
204
|
-
|
|
205
151
|
this.showServerLogs = opts.showServerLogs ?? this.showServerLogs;
|
|
206
152
|
this.port = opts.systemPort ?? this.port;
|
|
207
153
|
this.host = opts.systemHost ?? this.host;
|
|
208
154
|
this.bootstrapRoot = opts.bootstrapRoot ?? this.bootstrapRoot;
|
|
209
155
|
log.debug(`Using bootstrap root: ${this.bootstrapRoot}`);
|
|
210
|
-
|
|
211
156
|
if (!(await _support.fs.exists(WDA_PROJECT(this.bootstrapRoot)))) {
|
|
212
157
|
throw new Error(`${WDA_PROJECT_NAME} does not exist at '${WDA_PROJECT(this.bootstrapRoot)}'. ` + `Was 'bootstrapRoot' set to a proper value?`);
|
|
213
158
|
}
|
|
214
|
-
|
|
215
159
|
await this.kill();
|
|
216
160
|
await cleanupObsoleteProcesses();
|
|
217
161
|
let xcodebuild;
|
|
218
|
-
|
|
219
162
|
try {
|
|
220
163
|
xcodebuild = await _support.fs.which(XCODEBUILD);
|
|
221
164
|
} catch (e) {
|
|
222
165
|
throw new Error(`${XCODEBUILD} binary cannot be found in PATH. ` + `Please make sure that Xcode is installed on your system`);
|
|
223
166
|
}
|
|
224
|
-
|
|
225
167
|
log.debug(`Using ${XCODEBUILD} binary at '${xcodebuild}'`);
|
|
226
|
-
|
|
227
168
|
if (await this.isFreshUpgrade()) {
|
|
228
169
|
log.info('Performing project cleanup');
|
|
229
170
|
const args = ['clean', '-project', WDA_PROJECT(this.bootstrapRoot), '-scheme', RUNNER_SCHEME];
|
|
230
|
-
|
|
231
171
|
try {
|
|
232
172
|
await (0, _teen_process.exec)(XCODEBUILD, args, {
|
|
233
173
|
cwd: this.bootstrapRoot
|
|
@@ -236,16 +176,12 @@ class WDAMacProcess {
|
|
|
236
176
|
log.warn(`Cannot perform project cleanup. ` + `Original error: ${e.stderr || e.message}`);
|
|
237
177
|
}
|
|
238
178
|
}
|
|
239
|
-
|
|
240
179
|
log.debug(`Using ${this.host} as server host`);
|
|
241
180
|
log.debug(`Using port ${this.port}`);
|
|
242
|
-
|
|
243
181
|
const isPortBusy = async () => (await (0, _portscanner.checkPortStatus)(this.port, this.host)) === 'open';
|
|
244
|
-
|
|
245
182
|
if (await isPortBusy()) {
|
|
246
183
|
log.warn(`The port #${this.port} at ${this.host} is busy. ` + `Assuming it is an obsolete WDA server instance and ` + `trying to terminate it in order to start a new one`);
|
|
247
184
|
const timer = new _support.timing.Timer().start();
|
|
248
|
-
|
|
249
185
|
try {
|
|
250
186
|
await _axios.default.delete(`http://${this.host}:${this.port}/`, {
|
|
251
187
|
timeout: 5000
|
|
@@ -259,10 +195,8 @@ class WDAMacProcess {
|
|
|
259
195
|
log.warn(`Did not know how to terminate the process at ${this.host}:${this.port}: ${e.message}. ` + `Perhaps, it is not a WDA server, which is hogging the port?`);
|
|
260
196
|
throw new Error(`The port #${this.port} at ${this.host} is busy. ` + `Consider setting 'systemPort' capability to another free port number and/or ` + `make sure previous driver sessions have been closed properly.`);
|
|
261
197
|
}
|
|
262
|
-
|
|
263
198
|
log.info(`The previously running WDA server has been successfully terminated after ` + `${Math.round(timer.getDuration().asMilliSeconds)}ms`);
|
|
264
199
|
}
|
|
265
|
-
|
|
266
200
|
const args = ['build-for-testing', 'test-without-building', '-project', WDA_PROJECT(this.bootstrapRoot), '-scheme', RUNNER_SCHEME, DISABLE_STORE_ARG];
|
|
267
201
|
const env = Object.assign({}, process.env, {
|
|
268
202
|
USE_PORT: `${this.port}`,
|
|
@@ -272,18 +206,14 @@ class WDAMacProcess {
|
|
|
272
206
|
cwd: this.bootstrapRoot,
|
|
273
207
|
env
|
|
274
208
|
});
|
|
275
|
-
|
|
276
209
|
if (!this.showServerLogs) {
|
|
277
210
|
log.info(`Mac2Driver host process logging is disabled. ` + `All the ${XCODEBUILD} output is going to be suppressed. ` + `Set the 'showServerLogs' capability to 'true' if this is an undesired behavior`);
|
|
278
211
|
}
|
|
279
|
-
|
|
280
212
|
this.proc.on('output', (stdout, stderr) => {
|
|
281
213
|
if (!this.showServerLogs) {
|
|
282
214
|
return;
|
|
283
215
|
}
|
|
284
|
-
|
|
285
216
|
const line = _lodash.default.trim(stdout || stderr);
|
|
286
|
-
|
|
287
217
|
if (line) {
|
|
288
218
|
log.debug(`[${XCODEBUILD}] ${line}`);
|
|
289
219
|
}
|
|
@@ -295,56 +225,45 @@ class WDAMacProcess {
|
|
|
295
225
|
await this.proc.start(0);
|
|
296
226
|
return true;
|
|
297
227
|
}
|
|
298
|
-
|
|
299
228
|
async stop() {
|
|
300
229
|
if (!this.isRunning) {
|
|
301
230
|
return;
|
|
302
231
|
}
|
|
303
|
-
|
|
304
232
|
const childrenPids = await this.listChildrenPids();
|
|
305
|
-
|
|
306
233
|
if (!_lodash.default.isEmpty(childrenPids)) {
|
|
307
234
|
try {
|
|
308
235
|
await (0, _teen_process.exec)('kill', childrenPids);
|
|
309
236
|
} catch (ign) {}
|
|
310
237
|
}
|
|
311
|
-
|
|
312
238
|
await this.proc.stop('SIGTERM', 3000);
|
|
313
239
|
}
|
|
314
|
-
|
|
315
240
|
async kill() {
|
|
316
241
|
if (!this.isRunning) {
|
|
317
242
|
return;
|
|
318
243
|
}
|
|
319
|
-
|
|
320
244
|
const childrenPids = await this.listChildrenPids();
|
|
321
|
-
|
|
322
245
|
if (!_lodash.default.isEmpty(childrenPids)) {
|
|
323
246
|
try {
|
|
324
247
|
await (0, _teen_process.exec)('kill', ['-9', ...childrenPids]);
|
|
325
248
|
} catch (ign) {}
|
|
326
249
|
}
|
|
327
|
-
|
|
328
250
|
try {
|
|
329
251
|
await this.proc.stop('SIGKILL');
|
|
330
252
|
} catch (ign) {}
|
|
331
253
|
}
|
|
332
|
-
|
|
333
254
|
}
|
|
334
|
-
|
|
335
255
|
class WDAMacServer {
|
|
336
256
|
constructor() {
|
|
337
257
|
this.process = null;
|
|
338
258
|
this.serverStartupTimeoutMs = STARTUP_TIMEOUT_MS;
|
|
339
259
|
this.proxy = null;
|
|
260
|
+
|
|
340
261
|
this.isProxyingToRemoteServer = false;
|
|
341
262
|
}
|
|
342
|
-
|
|
343
263
|
async isProxyReady(throwOnExit = true) {
|
|
344
264
|
if (!this.proxy) {
|
|
345
265
|
return false;
|
|
346
266
|
}
|
|
347
|
-
|
|
348
267
|
try {
|
|
349
268
|
await this.proxy.command('/status', 'GET');
|
|
350
269
|
return true;
|
|
@@ -352,17 +271,14 @@ class WDAMacServer {
|
|
|
352
271
|
if (throwOnExit && this.proxy.didProcessExit) {
|
|
353
272
|
throw new Error(err.message);
|
|
354
273
|
}
|
|
355
|
-
|
|
356
274
|
return false;
|
|
357
275
|
}
|
|
358
276
|
}
|
|
359
277
|
|
|
360
278
|
parseProxyProperties(caps) {
|
|
361
279
|
let scheme = 'http';
|
|
362
|
-
|
|
363
280
|
if (!caps.webDriverAgentMacUrl) {
|
|
364
281
|
var _this$process, _this$process2;
|
|
365
|
-
|
|
366
282
|
return {
|
|
367
283
|
scheme,
|
|
368
284
|
server: ((_this$process = this.process) === null || _this$process === void 0 ? void 0 : _this$process.host) ?? caps.systemHost ?? DEFAULT_SYSTEM_HOST,
|
|
@@ -370,26 +286,21 @@ class WDAMacServer {
|
|
|
370
286
|
path: ''
|
|
371
287
|
};
|
|
372
288
|
}
|
|
373
|
-
|
|
374
289
|
let parsedUrl;
|
|
375
|
-
|
|
376
290
|
try {
|
|
377
291
|
parsedUrl = new _url.default.URL(caps.webDriverAgentMacUrl);
|
|
378
292
|
} catch (e) {
|
|
379
293
|
throw new Error(`webDriverAgentMacUrl, '${caps.webDriverAgentMacUrl}', ` + `in the capabilities is invalid. ${e.message}`);
|
|
380
294
|
}
|
|
381
|
-
|
|
382
295
|
const {
|
|
383
296
|
protocol,
|
|
384
297
|
hostname,
|
|
385
298
|
port,
|
|
386
299
|
pathname
|
|
387
300
|
} = parsedUrl;
|
|
388
|
-
|
|
389
301
|
if (_lodash.default.isString(protocol)) {
|
|
390
302
|
scheme = protocol.split(':')[0];
|
|
391
303
|
}
|
|
392
|
-
|
|
393
304
|
return {
|
|
394
305
|
scheme,
|
|
395
306
|
server: hostname ?? DEFAULT_SYSTEM_HOST,
|
|
@@ -397,28 +308,23 @@ class WDAMacServer {
|
|
|
397
308
|
path: pathname === '/' ? '' : pathname
|
|
398
309
|
};
|
|
399
310
|
}
|
|
400
|
-
|
|
401
311
|
async startSession(caps) {
|
|
402
312
|
this.serverStartupTimeoutMs = caps.serverStartupTimeout ?? this.serverStartupTimeoutMs;
|
|
403
313
|
this.isProxyingToRemoteServer = !!caps.webDriverAgentMacUrl;
|
|
404
314
|
let wasProcessInitNecessary;
|
|
405
|
-
|
|
406
315
|
if (this.isProxyingToRemoteServer) {
|
|
407
316
|
if (this.process) {
|
|
408
317
|
await this.process.kill();
|
|
409
318
|
await cleanupObsoleteProcesses();
|
|
410
319
|
this.process = null;
|
|
411
320
|
}
|
|
412
|
-
|
|
413
321
|
wasProcessInitNecessary = false;
|
|
414
322
|
} else {
|
|
415
323
|
if (!this.process) {
|
|
416
324
|
this.process = new WDAMacProcess();
|
|
417
325
|
}
|
|
418
|
-
|
|
419
326
|
wasProcessInitNecessary = await this.process.init(caps);
|
|
420
327
|
}
|
|
421
|
-
|
|
422
328
|
if (wasProcessInitNecessary || this.isProxyingToRemoteServer || !this.proxy) {
|
|
423
329
|
const {
|
|
424
330
|
scheme,
|
|
@@ -434,15 +340,12 @@ class WDAMacServer {
|
|
|
434
340
|
keepAlive: true
|
|
435
341
|
});
|
|
436
342
|
this.proxy.didProcessExit = false;
|
|
437
|
-
|
|
438
343
|
if (this.process) {
|
|
439
344
|
this.process.proc.on('exit', () => {
|
|
440
345
|
this.proxy.didProcessExit = true;
|
|
441
346
|
});
|
|
442
347
|
}
|
|
443
|
-
|
|
444
348
|
const timer = new _support.timing.Timer().start();
|
|
445
|
-
|
|
446
349
|
try {
|
|
447
350
|
await (0, _asyncbox.waitForCondition)(async () => await this.isProxyReady(), {
|
|
448
351
|
waitMs: this.serverStartupTimeoutMs,
|
|
@@ -450,19 +353,15 @@ class WDAMacServer {
|
|
|
450
353
|
});
|
|
451
354
|
} catch (e) {
|
|
452
355
|
var _this$process3;
|
|
453
|
-
|
|
454
356
|
if ((_this$process3 = this.process) !== null && _this$process3 !== void 0 && _this$process3.isRunning) {
|
|
455
357
|
await this.process.kill();
|
|
456
358
|
}
|
|
457
|
-
|
|
458
359
|
if (/Condition unmet/.test(e.message)) {
|
|
459
360
|
const msg = this.isProxyingToRemoteServer ? `No response from '${scheme}://${server}:${port}${path}' within ${this.serverStartupTimeoutMs}ms timeout.` + `Please make sure the remote server is running and accessible by Appium` : `Mac2Driver server is not listening within ${this.serverStartupTimeoutMs}ms timeout. ` + `Try to increase the value of 'serverStartupTimeout' capability, check the server logs ` + `and make sure the ${XCODEBUILD} host process could be started manually from a terminal`;
|
|
460
361
|
throw new Error(msg);
|
|
461
362
|
}
|
|
462
|
-
|
|
463
363
|
throw e;
|
|
464
364
|
}
|
|
465
|
-
|
|
466
365
|
if (this.process) {
|
|
467
366
|
const pid = this.process.pid;
|
|
468
367
|
const childrenPids = await this.process.listChildrenPids();
|
|
@@ -473,7 +372,6 @@ class WDAMacServer {
|
|
|
473
372
|
} else {
|
|
474
373
|
log.info('The host process has already been listening. Proceeding with session creation');
|
|
475
374
|
}
|
|
476
|
-
|
|
477
375
|
await this.proxy.command('/session', 'POST', {
|
|
478
376
|
capabilities: {
|
|
479
377
|
firstMatch: [{}],
|
|
@@ -481,15 +379,12 @@ class WDAMacServer {
|
|
|
481
379
|
}
|
|
482
380
|
});
|
|
483
381
|
}
|
|
484
|
-
|
|
485
382
|
async stopSession() {
|
|
486
383
|
var _this$process4, _this$proxy;
|
|
487
|
-
|
|
488
384
|
if (!this.isProxyingToRemoteServer && !((_this$process4 = this.process) !== null && _this$process4 !== void 0 && _this$process4.isRunning)) {
|
|
489
385
|
log.info(`Mac2Driver session cannot be stopped, because the server is not running`);
|
|
490
386
|
return;
|
|
491
387
|
}
|
|
492
|
-
|
|
493
388
|
if ((_this$proxy = this.proxy) !== null && _this$proxy !== void 0 && _this$proxy.sessionId) {
|
|
494
389
|
try {
|
|
495
390
|
await this.proxy.command(`/session/${this.proxy.sessionId}`, 'DELETE');
|
|
@@ -498,10 +393,8 @@ class WDAMacServer {
|
|
|
498
393
|
}
|
|
499
394
|
}
|
|
500
395
|
}
|
|
501
|
-
|
|
502
396
|
}
|
|
503
|
-
|
|
504
397
|
const WDA_MAC_SERVER = new WDAMacServer();
|
|
505
398
|
var _default = WDA_MAC_SERVER;
|
|
506
399
|
exports.default = _default;
|
|
507
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJERUZBVUxUX1dEQV9ST09UIiwicGF0aCIsInJlc29sdmUiLCJnZXRNb2R1bGVSb290IiwiV0RBX1BST0pFQ1RfTkFNRSIsIldEQV9QUk9KRUNUIiwid2RhUm9vdCIsIlJVTk5FUl9TQ0hFTUUiLCJESVNBQkxFX1NUT1JFX0FSRyIsIlhDT0RFQlVJTEQiLCJTVEFSVFVQX1RJTUVPVVRfTVMiLCJERUZBVUxUX1NZU1RFTV9QT1JUIiwiREVGQVVMVF9TWVNURU1fSE9TVCIsIkRFRkFVTFRfU0hPV19TRVJWRVJfTE9HUyIsIlJVTk5JTkdfUFJPQ0VTU19JRFMiLCJSRUNFTlRfVVBHUkFERV9USU1FU1RBTVBfUEFUSCIsImpvaW4iLCJnZXRVcGdyYWRlVGltZXN0YW1wIiwicGFja2FnZU1hbmlmZXN0IiwiZnMiLCJleGlzdHMiLCJtdGltZSIsInN0YXQiLCJnZXRUaW1lIiwiY2xlYW51cE9ic29sZXRlUHJvY2Vzc2VzIiwiXyIsImlzRW1wdHkiLCJkZWJ1ZyIsImxlbmd0aCIsInV0aWwiLCJwbHVyYWxpemUiLCJleGVjIiwiaWduIiwicHVsbEFsbCIsInByb2Nlc3MiLCJvbmNlIiwiZXhlY1N5bmMiLCJXREFNYWNQcm94eSIsIkpXUHJveHkiLCJwcm94eUNvbW1hbmQiLCJ1cmwiLCJtZXRob2QiLCJib2R5IiwiZGlkUHJvY2Vzc0V4aXQiLCJlcnJvcnMiLCJJbnZhbGlkQ29udGV4dEVycm9yIiwiV0RBTWFjUHJvY2VzcyIsImNvbnN0cnVjdG9yIiwic2hvd1NlcnZlckxvZ3MiLCJwb3J0IiwiaG9zdCIsImJvb3RzdHJhcFJvb3QiLCJwcm9jIiwiaXNSdW5uaW5nIiwicGlkIiwibGlzdENoaWxkcmVuUGlkcyIsImxpc3RDaGlsZHJlblByb2Nlc3NJZHMiLCJpc0ZyZXNoVXBncmFkZSIsImhvbWVGb2xkZXIiLCJlbnYiLCJIT01FIiwiaW5mbyIsImN1cnJlbnRVcGdyYWRlVGltZXN0YW1wIiwiaXNJbnRlZ2VyIiwidGltZXN0YW1wUGF0aCIsImFjY2VzcyIsIldfT0siLCJyZWNlbnRVcGdyYWRlVGltZXN0YW1wIiwicGFyc2VJbnQiLCJyZWFkRmlsZSIsIndhcm4iLCJta2RpcnAiLCJkaXJuYW1lIiwid3JpdGVGaWxlIiwiZSIsIm1lc3NhZ2UiLCJoYXNTYW1lT3B0cyIsInN5c3RlbVBvcnQiLCJzeXN0ZW1Ib3N0IiwiaXNCb29sZWFuIiwiaXNOaWwiLCJpbml0Iiwib3B0cyIsIkVycm9yIiwia2lsbCIsInhjb2RlYnVpbGQiLCJ3aGljaCIsImFyZ3MiLCJjd2QiLCJzdGRlcnIiLCJpc1BvcnRCdXN5IiwiY2hlY2tQb3J0U3RhdHVzIiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsInN0YXJ0IiwiYXhpb3MiLCJkZWxldGUiLCJ0aW1lb3V0IiwiQiIsImRlbGF5Iiwid2FpdEZvckNvbmRpdGlvbiIsIndhaXRNcyIsImludGVydmFsTXMiLCJNYXRoIiwicm91bmQiLCJnZXREdXJhdGlvbiIsImFzTWlsbGlTZWNvbmRzIiwiT2JqZWN0IiwiYXNzaWduIiwiVVNFX1BPUlQiLCJVU0VfSE9TVCIsIlN1YlByb2Nlc3MiLCJvbiIsInN0ZG91dCIsImxpbmUiLCJ0cmltIiwiY29kZSIsInNpZ25hbCIsInF1b3RlIiwic3RvcCIsImNoaWxkcmVuUGlkcyIsIldEQU1hY1NlcnZlciIsInNlcnZlclN0YXJ0dXBUaW1lb3V0TXMiLCJwcm94eSIsImlzUHJveHlpbmdUb1JlbW90ZVNlcnZlciIsImlzUHJveHlSZWFkeSIsInRocm93T25FeGl0IiwiY29tbWFuZCIsImVyciIsInBhcnNlUHJveHlQcm9wZXJ0aWVzIiwiY2FwcyIsInNjaGVtZSIsIndlYkRyaXZlckFnZW50TWFjVXJsIiwic2VydmVyIiwicGFyc2VkVXJsIiwiVVJMIiwicHJvdG9jb2wiLCJob3N0bmFtZSIsInBhdGhuYW1lIiwiaXNTdHJpbmciLCJzcGxpdCIsInN0YXJ0U2Vzc2lvbiIsInNlcnZlclN0YXJ0dXBUaW1lb3V0Iiwid2FzUHJvY2Vzc0luaXROZWNlc3NhcnkiLCJiYXNlIiwia2VlcEFsaXZlIiwidGVzdCIsIm1zZyIsInB1c2giLCJwdWxsIiwidG9GaXhlZCIsImNhcGFiaWxpdGllcyIsImZpcnN0TWF0Y2giLCJhbHdheXNNYXRjaCIsInN0b3BTZXNzaW9uIiwic2Vzc2lvbklkIiwiV0RBX01BQ19TRVJWRVIiXSwic291cmNlcyI6WyIuLi8uLi9saWIvd2RhLW1hYy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgdXJsIGZyb20gJ3VybCc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgSldQcm94eSwgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgeyBmcywgbG9nZ2VyLCB1dGlsLCB0aW1pbmcsIG1rZGlycCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IFN1YlByb2Nlc3MsIGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IGNoZWNrUG9ydFN0YXR1cyB9IGZyb20gJ3BvcnRzY2FubmVyJztcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBsaXN0Q2hpbGRyZW5Qcm9jZXNzSWRzLCBnZXRNb2R1bGVSb290IH0gZnJvbSAnLi91dGlscyc7XG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1dlYkRyaXZlckFnZW50TWFjJyk7XG5cbmNvbnN0IERFRkFVTFRfV0RBX1JPT1QgPSBwYXRoLnJlc29sdmUoZ2V0TW9kdWxlUm9vdCgpLCAnV2ViRHJpdmVyQWdlbnRNYWMnKTtcbmNvbnN0IFdEQV9QUk9KRUNUX05BTUUgPSAnV2ViRHJpdmVyQWdlbnRNYWMueGNvZGVwcm9qJztcbmNvbnN0IFdEQV9QUk9KRUNUID0gKHdkYVJvb3QgPSBERUZBVUxUX1dEQV9ST09UKSA9PiBwYXRoLnJlc29sdmUod2RhUm9vdCwgV0RBX1BST0pFQ1RfTkFNRSk7XG5jb25zdCBSVU5ORVJfU0NIRU1FID0gJ1dlYkRyaXZlckFnZW50UnVubmVyJztcbmNvbnN0IERJU0FCTEVfU1RPUkVfQVJHID0gJ0NPTVBJTEVSX0lOREVYX1NUT1JFX0VOQUJMRT1OTyc7XG5jb25zdCBYQ09ERUJVSUxEID0gJ3hjb2RlYnVpbGQnO1xuY29uc3QgU1RBUlRVUF9USU1FT1VUX01TID0gMTIwMDAwO1xuY29uc3QgREVGQVVMVF9TWVNURU1fUE9SVCA9IDEwMTAwO1xuY29uc3QgREVGQVVMVF9TWVNURU1fSE9TVCA9ICcxMjcuMC4wLjEnO1xuY29uc3QgREVGQVVMVF9TSE9XX1NFUlZFUl9MT0dTID0gZmFsc2U7XG5jb25zdCBSVU5OSU5HX1BST0NFU1NfSURTID0gW107XG5jb25zdCBSRUNFTlRfVVBHUkFERV9USU1FU1RBTVBfUEFUSCA9IHBhdGguam9pbignLmFwcGl1bScsICd3ZWJkcml2ZXJhZ2VudF9tYWMnLCAndXBncmFkZS50aW1lJyk7XG5cblxuYXN5bmMgZnVuY3Rpb24gZ2V0VXBncmFkZVRpbWVzdGFtcCAoKSB7XG4gIGNvbnN0IHBhY2thZ2VNYW5pZmVzdCA9IHBhdGgucmVzb2x2ZShnZXRNb2R1bGVSb290KCksICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKCFhd2FpdCBmcy5leGlzdHMocGFja2FnZU1hbmlmZXN0KSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHttdGltZX0gPSBhd2FpdCBmcy5zdGF0KHBhY2thZ2VNYW5pZmVzdCk7XG4gIHJldHVybiBtdGltZS5nZXRUaW1lKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsZWFudXBPYnNvbGV0ZVByb2Nlc3NlcyAoKSB7XG4gIGlmICghXy5pc0VtcHR5KFJVTk5JTkdfUFJPQ0VTU19JRFMpKSB7XG4gICAgbG9nLmRlYnVnKGBDbGVhbmluZyB1cCAke1JVTk5JTkdfUFJPQ0VTU19JRFMubGVuZ3RofSBvYnNvbGV0ZSBgICtcbiAgICAgIHV0aWwucGx1cmFsaXplKCdwcm9jZXNzJywgUlVOTklOR19QUk9DRVNTX0lEUy5sZW5ndGgsIGZhbHNlKSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWMoJ2tpbGwnLCBbJy05JywgLi4uUlVOTklOR19QUk9DRVNTX0lEU10pO1xuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICBfLnB1bGxBbGwoUlVOTklOR19QUk9DRVNTX0lEUywgUlVOTklOR19QUk9DRVNTX0lEUyk7XG4gIH1cbn1cblxucHJvY2Vzcy5vbmNlKCdleGl0JywgKCkgPT4ge1xuICBpZiAoIV8uaXNFbXB0eShSVU5OSU5HX1BST0NFU1NfSURTKSkge1xuICAgIHRyeSB7XG4gICAgICBleGVjU3luYyhga2lsbCAtOSAke1JVTk5JTkdfUFJPQ0VTU19JRFMuam9pbignICcpfWApO1xuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICBfLnB1bGxBbGwoUlVOTklOR19QUk9DRVNTX0lEUywgUlVOTklOR19QUk9DRVNTX0lEUyk7XG4gIH1cbn0pO1xuXG5cbmNsYXNzIFdEQU1hY1Byb3h5IGV4dGVuZHMgSldQcm94eSB7XG4gIGFzeW5jIHByb3h5Q29tbWFuZCAodXJsLCBtZXRob2QsIGJvZHkgPSBudWxsKSB7XG4gICAgaWYgKHRoaXMuZGlkUHJvY2Vzc0V4aXQpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZENvbnRleHRFcnJvcihcbiAgICAgICAgYCcke21ldGhvZH0gJHt1cmx9JyBjYW5ub3QgYmUgcHJveGllZCB0byBNYWMyIERyaXZlciBzZXJ2ZXIgYmVjYXVzZSBgICtcbiAgICAgICAgJ2l0cyBwcm9jZXNzIGlzIG5vdCBydW5uaW5nIChwcm9iYWJseSBjcmFzaGVkKS4gQ2hlY2sgdGhlIEFwcGl1bSBsb2cgZm9yIG1vcmUgZGV0YWlscycpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgc3VwZXIucHJveHlDb21tYW5kKHVybCwgbWV0aG9kLCBib2R5KTtcbiAgfVxufVxuXG5jbGFzcyBXREFNYWNQcm9jZXNzIHtcbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHRoaXMuc2hvd1NlcnZlckxvZ3MgPSBERUZBVUxUX1NIT1dfU0VSVkVSX0xPR1M7XG4gICAgdGhpcy5wb3J0ID0gREVGQVVMVF9TWVNURU1fUE9SVDtcbiAgICB0aGlzLmhvc3QgPSBERUZBVUxUX1NZU1RFTV9IT1NUO1xuICAgIHRoaXMuYm9vdHN0cmFwUm9vdCA9IERFRkFVTFRfV0RBX1JPT1Q7XG4gICAgdGhpcy5wcm9jID0gbnVsbDtcbiAgfVxuXG4gIGdldCBpc1J1bm5pbmcgKCkge1xuICAgIHJldHVybiAhISh0aGlzLnByb2M/LmlzUnVubmluZyk7XG4gIH1cblxuICBnZXQgcGlkICgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1J1bm5pbmcgPyB0aGlzLnByb2MucGlkIDogbnVsbDtcbiAgfVxuXG4gIGFzeW5jIGxpc3RDaGlsZHJlblBpZHMgKCkge1xuICAgIHJldHVybiB0aGlzLnBpZCA/IChhd2FpdCBsaXN0Q2hpbGRyZW5Qcm9jZXNzSWRzKHRoaXMucGlkKSkgOiBbXTtcbiAgfVxuXG4gIGFzeW5jIGlzRnJlc2hVcGdyYWRlICgpIHtcbiAgICBjb25zdCBob21lRm9sZGVyID0gcHJvY2Vzcy5lbnYuSE9NRTtcbiAgICBpZiAoIWhvbWVGb2xkZXIpIHtcbiAgICAgIGxvZy5pbmZvKCdUaGUgSE9NRSBmb2xkZXIgcGF0aCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCcpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRVcGdyYWRlVGltZXN0YW1wID0gYXdhaXQgZ2V0VXBncmFkZVRpbWVzdGFtcCgpO1xuICAgIGlmICghXy5pc0ludGVnZXIoY3VycmVudFVwZ3JhZGVUaW1lc3RhbXApKSB7XG4gICAgICBsb2cuaW5mbygnSXQgaXMgaW1wb3NzaWJsZSB0byBkZXRlcm1pbmUgdGhlIHRpbWVzdGFtcCBvZiB0aGUgcGFja2FnZScpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHRpbWVzdGFtcFBhdGggPSBwYXRoLnJlc29sdmUoaG9tZUZvbGRlciwgUkVDRU5UX1VQR1JBREVfVElNRVNUQU1QX1BBVEgpO1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHModGltZXN0YW1wUGF0aCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLmFjY2Vzcyh0aW1lc3RhbXBQYXRoLCBmcy5XX09LKTtcbiAgICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgICBsb2cuaW5mbyhgV2ViRHJpdmVyQWdlbnQgdXBncmFkZSB0aW1lc3RhbXAgYXQgJyR7dGltZXN0YW1wUGF0aH0nIGlzIG5vdCB3cml0ZWFibGVgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVjZW50VXBncmFkZVRpbWVzdGFtcCA9IHBhcnNlSW50KGF3YWl0IGZzLnJlYWRGaWxlKHRpbWVzdGFtcFBhdGgsICd1dGY4JyksIDEwKTtcbiAgICAgIGlmIChfLmlzSW50ZWdlcihyZWNlbnRVcGdyYWRlVGltZXN0YW1wKSkge1xuICAgICAgICBpZiAocmVjZW50VXBncmFkZVRpbWVzdGFtcCA+PSBjdXJyZW50VXBncmFkZVRpbWVzdGFtcCkge1xuICAgICAgICAgIGxvZy5pbmZvKGBXZWJEcml2ZXJBZ2VudCBzb3VyY2VzIGFyZSB1cCB0byBkYXRlIGAgK1xuICAgICAgICAgICAgYCgke3JlY2VudFVwZ3JhZGVUaW1lc3RhbXB9ID49ICR7Y3VycmVudFVwZ3JhZGVUaW1lc3RhbXB9KWApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsb2cuaW5mbyhgV2ViRHJpdmVyQWdlbnQgc291cmNlcyBoYXZlIGJlZW4gdXBncmFkZWQgYCArXG4gICAgICAgICAgYCgke3JlY2VudFVwZ3JhZGVUaW1lc3RhbXB9IDwgJHtjdXJyZW50VXBncmFkZVRpbWVzdGFtcH0pYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cud2FybihgVGhlIHJlY2VudCB1cGdyYWRlIHRpbWVzdGFtcCBhdCAnJHt0aW1lc3RhbXBQYXRofScgaXMgY29ycnVwdGVkLiBUcnlpbmcgdG8gZml4IGl0YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG1rZGlycChwYXRoLmRpcm5hbWUodGltZXN0YW1wUGF0aCkpO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHRpbWVzdGFtcFBhdGgsIGAke2N1cnJlbnRVcGdyYWRlVGltZXN0YW1wfWAsICd1dGY4Jyk7XG4gICAgICBsb2cuZGVidWcoYFN0b3JlZCB0aGUgcmVjZW50IFdlYkRyaXZlckFnZW50IHVwZ3JhZGUgdGltZXN0YW1wICR7Y3VycmVudFVwZ3JhZGVUaW1lc3RhbXB9IGAgK1xuICAgICAgICBgYXQgJyR7dGltZXN0YW1wUGF0aH0nYCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmluZm8oYFVuYWJsZSB0byBjcmVhdGUgdGhlIHJlY2VudCBXZWJEcml2ZXJBZ2VudCB1cGdyYWRlIHRpbWVzdGFtcCBhdCAnJHt0aW1lc3RhbXBQYXRofScuIGAgK1xuICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaGFzU2FtZU9wdHMgKHsgc2hvd1NlcnZlckxvZ3MsIHN5c3RlbVBvcnQsIHN5c3RlbUhvc3QsIGJvb3RzdHJhcFJvb3QgfSkge1xuICAgIGlmIChfLmlzQm9vbGVhbihzaG93U2VydmVyTG9ncykgJiYgdGhpcy5zaG93U2VydmVyTG9ncyAhPT0gc2hvd1NlcnZlckxvZ3NcbiAgICAgIHx8IF8uaXNOaWwoc2hvd1NlcnZlckxvZ3MpICYmIHRoaXMuc2hvd1NlcnZlckxvZ3MgIT09IERFRkFVTFRfU0hPV19TRVJWRVJfTE9HUykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3lzdGVtUG9ydCAmJiB0aGlzLnBvcnQgIT09IHN5c3RlbVBvcnRcbiAgICAgIHx8ICFzeXN0ZW1Qb3J0ICYmIHRoaXMucG9ydCAhPT0gREVGQVVMVF9TWVNURU1fUE9SVCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3lzdGVtSG9zdCAmJiB0aGlzLmhvc3QgIT09IHN5c3RlbUhvc3RcbiAgICAgIHx8ICFzeXN0ZW1Ib3N0ICYmIHRoaXMuaG9zdCAhPT0gREVGQVVMVF9TWVNURU1fSE9TVCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoYm9vdHN0cmFwUm9vdCAmJiB0aGlzLmJvb3RzdHJhcFJvb3QgIT09IGJvb3RzdHJhcFJvb3RcbiAgICAgIHx8ICFib290c3RyYXBSb290ICYmIHRoaXMuYm9vdHN0cmFwUm9vdCAhPT0gREVGQVVMVF9XREFfUk9PVCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgaW5pdCAob3B0cyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuaXNSdW5uaW5nICYmIHRoaXMuaGFzU2FtZU9wdHMob3B0cykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnNob3dTZXJ2ZXJMb2dzID0gb3B0cy5zaG93U2VydmVyTG9ncyA/PyB0aGlzLnNob3dTZXJ2ZXJMb2dzO1xuICAgIHRoaXMucG9ydCA9IG9wdHMuc3lzdGVtUG9ydCA/PyB0aGlzLnBvcnQ7XG4gICAgdGhpcy5ob3N0ID0gb3B0cy5zeXN0ZW1Ib3N0ID8/IHRoaXMuaG9zdDtcbiAgICB0aGlzLmJvb3RzdHJhcFJvb3QgPSBvcHRzLmJvb3RzdHJhcFJvb3QgPz8gdGhpcy5ib290c3RyYXBSb290O1xuXG4gICAgbG9nLmRlYnVnKGBVc2luZyBib290c3RyYXAgcm9vdDogJHt0aGlzLmJvb3RzdHJhcFJvb3R9YCk7XG4gICAgaWYgKCFhd2FpdCBmcy5leGlzdHMoV0RBX1BST0pFQ1QodGhpcy5ib290c3RyYXBSb290KSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtXREFfUFJPSkVDVF9OQU1FfSBkb2VzIG5vdCBleGlzdCBhdCAnJHtXREFfUFJPSkVDVCh0aGlzLmJvb3RzdHJhcFJvb3QpfScuIGAgK1xuICAgICAgICBgV2FzICdib290c3RyYXBSb290JyBzZXQgdG8gYSBwcm9wZXIgdmFsdWU/YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5raWxsKCk7XG4gICAgYXdhaXQgY2xlYW51cE9ic29sZXRlUHJvY2Vzc2VzKCk7XG5cbiAgICBsZXQgeGNvZGVidWlsZDtcbiAgICB0cnkge1xuICAgICAgeGNvZGVidWlsZCA9IGF3YWl0IGZzLndoaWNoKFhDT0RFQlVJTEQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtYQ09ERUJVSUxEfSBiaW5hcnkgY2Fubm90IGJlIGZvdW5kIGluIFBBVEguIGAgK1xuICAgICAgICBgUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IFhjb2RlIGlzIGluc3RhbGxlZCBvbiB5b3VyIHN5c3RlbWApO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYFVzaW5nICR7WENPREVCVUlMRH0gYmluYXJ5IGF0ICcke3hjb2RlYnVpbGR9J2ApO1xuXG4gICAgaWYgKGF3YWl0IHRoaXMuaXNGcmVzaFVwZ3JhZGUoKSkge1xuICAgICAgbG9nLmluZm8oJ1BlcmZvcm1pbmcgcHJvamVjdCBjbGVhbnVwJyk7XG4gICAgICBjb25zdCBhcmdzID0gW1xuICAgICAgICAnY2xlYW4nLFxuICAgICAgICAnLXByb2plY3QnLCBXREFfUFJPSkVDVCh0aGlzLmJvb3RzdHJhcFJvb3QpLFxuICAgICAgICAnLXNjaGVtZScsIFJVTk5FUl9TQ0hFTUUsXG4gICAgICBdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZXhlYyhYQ09ERUJVSUxELCBhcmdzLCB7XG4gICAgICAgICAgY3dkOiB0aGlzLmJvb3RzdHJhcFJvb3QsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2cud2FybihgQ2Fubm90IHBlcmZvcm0gcHJvamVjdCBjbGVhbnVwLiBgICtcbiAgICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5zdGRlcnIgfHwgZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxvZy5kZWJ1ZyhgVXNpbmcgJHt0aGlzLmhvc3R9IGFzIHNlcnZlciBob3N0YCk7XG4gICAgbG9nLmRlYnVnKGBVc2luZyBwb3J0ICR7dGhpcy5wb3J0fWApO1xuICAgIGNvbnN0IGlzUG9ydEJ1c3kgPSBhc3luYyAoKSA9PiAoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKHRoaXMucG9ydCwgdGhpcy5ob3N0KSkgPT09ICdvcGVuJztcbiAgICBpZiAoYXdhaXQgaXNQb3J0QnVzeSgpKSB7XG4gICAgICBsb2cud2FybihgVGhlIHBvcnQgIyR7dGhpcy5wb3J0fSBhdCAke3RoaXMuaG9zdH0gaXMgYnVzeS4gYCArXG4gICAgICAgIGBBc3N1bWluZyBpdCBpcyBhbiBvYnNvbGV0ZSBXREEgc2VydmVyIGluc3RhbmNlIGFuZCBgICtcbiAgICAgICAgYHRyeWluZyB0byB0ZXJtaW5hdGUgaXQgaW4gb3JkZXIgdG8gc3RhcnQgYSBuZXcgb25lYCk7XG4gICAgICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgYXhpb3MuZGVsZXRlKGBodHRwOi8vJHt0aGlzLmhvc3R9OiR7dGhpcy5wb3J0fS9gLCB7XG4gICAgICAgICAgdGltZW91dDogNTAwMCxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEdpdmUgdGhlIHNlcnZlciBzb21lIHRpbWUgdG8gZmluaXNoIGFuZCBzdG9wIGxpc3RlbmluZ1xuICAgICAgICBhd2FpdCBCLmRlbGF5KDUwMCk7XG4gICAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4gIShhd2FpdCBpc1BvcnRCdXN5KCkpLCB7XG4gICAgICAgICAgd2FpdE1zOiAzMDAwLFxuICAgICAgICAgIGludGVydmFsTXM6IDEwMCxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy53YXJuKGBEaWQgbm90IGtub3cgaG93IHRvIHRlcm1pbmF0ZSB0aGUgcHJvY2VzcyBhdCAke3RoaXMuaG9zdH06JHt0aGlzLnBvcnR9OiAke2UubWVzc2FnZX0uIGAgK1xuICAgICAgICAgIGBQZXJoYXBzLCBpdCBpcyBub3QgYSBXREEgc2VydmVyLCB3aGljaCBpcyBob2dnaW5nIHRoZSBwb3J0P2ApO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwb3J0ICMke3RoaXMucG9ydH0gYXQgJHt0aGlzLmhvc3R9IGlzIGJ1c3kuIGAgK1xuICAgICAgICAgIGBDb25zaWRlciBzZXR0aW5nICdzeXN0ZW1Qb3J0JyBjYXBhYmlsaXR5IHRvIGFub3RoZXIgZnJlZSBwb3J0IG51bWJlciBhbmQvb3IgYCArXG4gICAgICAgICAgYG1ha2Ugc3VyZSBwcmV2aW91cyBkcml2ZXIgc2Vzc2lvbnMgaGF2ZSBiZWVuIGNsb3NlZCBwcm9wZXJseS5gKTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKGBUaGUgcHJldmlvdXNseSBydW5uaW5nIFdEQSBzZXJ2ZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHRlcm1pbmF0ZWQgYWZ0ZXIgYCArXG4gICAgICAgIGAke01hdGgucm91bmQodGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcyl9bXNgKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcmdzID0gW1xuICAgICAgJ2J1aWxkLWZvci10ZXN0aW5nJywgJ3Rlc3Qtd2l0aG91dC1idWlsZGluZycsXG4gICAgICAnLXByb2plY3QnLCBXREFfUFJPSkVDVCh0aGlzLmJvb3RzdHJhcFJvb3QpLFxuICAgICAgJy1zY2hlbWUnLCBSVU5ORVJfU0NIRU1FLFxuICAgICAgRElTQUJMRV9TVE9SRV9BUkcsXG4gICAgXTtcbiAgICBjb25zdCBlbnYgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9jZXNzLmVudiwge1xuICAgICAgVVNFX1BPUlQ6IGAke3RoaXMucG9ydH1gLFxuICAgICAgVVNFX0hPU1Q6IHRoaXMuaG9zdCxcbiAgICB9KTtcbiAgICB0aGlzLnByb2MgPSBuZXcgU3ViUHJvY2Vzcyh4Y29kZWJ1aWxkLCBhcmdzLCB7XG4gICAgICBjd2Q6IHRoaXMuYm9vdHN0cmFwUm9vdCxcbiAgICAgIGVudixcbiAgICB9KTtcbiAgICBpZiAoIXRoaXMuc2hvd1NlcnZlckxvZ3MpIHtcbiAgICAgIGxvZy5pbmZvKGBNYWMyRHJpdmVyIGhvc3QgcHJvY2VzcyBsb2dnaW5nIGlzIGRpc2FibGVkLiBgICtcbiAgICAgICAgYEFsbCB0aGUgJHtYQ09ERUJVSUxEfSBvdXRwdXQgaXMgZ29pbmcgdG8gYmUgc3VwcHJlc3NlZC4gYCArXG4gICAgICAgIGBTZXQgdGhlICdzaG93U2VydmVyTG9ncycgY2FwYWJpbGl0eSB0byAndHJ1ZScgaWYgdGhpcyBpcyBhbiB1bmRlc2lyZWQgYmVoYXZpb3JgKTtcbiAgICB9XG4gICAgdGhpcy5wcm9jLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgIGlmICghdGhpcy5zaG93U2VydmVyTG9ncykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxpbmUgPSBfLnRyaW0oc3Rkb3V0IHx8IHN0ZGVycik7XG4gICAgICBpZiAobGluZSkge1xuICAgICAgICBsb2cuZGVidWcoYFske1hDT0RFQlVJTER9XSAke2xpbmV9YCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5wcm9jLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgbG9nLmluZm8oYE1hYzJEcml2ZXIgaG9zdCBwcm9jZXNzIGhhcyBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX0sIHNpZ25hbCAke3NpZ25hbH1gKTtcbiAgICB9KTtcbiAgICBsb2cuaW5mbyhgU3RhcnRpbmcgTWFjMkRyaXZlciBob3N0IHByb2Nlc3M6ICR7WENPREVCVUlMRH0gJHt1dGlsLnF1b3RlKGFyZ3MpfWApO1xuICAgIGF3YWl0IHRoaXMucHJvYy5zdGFydCgwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIHN0b3AgKCkge1xuICAgIGlmICghdGhpcy5pc1J1bm5pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZHJlblBpZHMgPSBhd2FpdCB0aGlzLmxpc3RDaGlsZHJlblBpZHMoKTtcbiAgICBpZiAoIV8uaXNFbXB0eShjaGlsZHJlblBpZHMpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBleGVjKCdraWxsJywgY2hpbGRyZW5QaWRzKTtcbiAgICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICB9XG4gICAgYXdhaXQgdGhpcy5wcm9jLnN0b3AoJ1NJR1RFUk0nLCAzMDAwKTtcbiAgfVxuXG4gIGFzeW5jIGtpbGwgKCkge1xuICAgIGlmICghdGhpcy5pc1J1bm5pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZHJlblBpZHMgPSBhd2FpdCB0aGlzLmxpc3RDaGlsZHJlblBpZHMoKTtcbiAgICBpZiAoIV8uaXNFbXB0eShjaGlsZHJlblBpZHMpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBleGVjKCdraWxsJywgWyctOScsIC4uLmNoaWxkcmVuUGlkc10pO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5wcm9jLnN0b3AoJ1NJR0tJTEwnKTtcbiAgICB9IGNhdGNoIChpZ24pIHt9XG4gIH1cbn1cblxuY2xhc3MgV0RBTWFjU2VydmVyIHtcbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHRoaXMucHJvY2VzcyA9IG51bGw7XG4gICAgdGhpcy5zZXJ2ZXJTdGFydHVwVGltZW91dE1zID0gU1RBUlRVUF9USU1FT1VUX01TO1xuICAgIHRoaXMucHJveHkgPSBudWxsO1xuXG4gICAgLy8gVG8gaGFuZGxlIGlmIHRoZSBXREFNYWMgc2VydmVyIGlzIHByb3h5aW5nIHJlcXVlc3RzIHRvIGEgcmVtb3RlIFdEQU1hYyBhcHAgaW5zdGFuY2VcbiAgICB0aGlzLmlzUHJveHlpbmdUb1JlbW90ZVNlcnZlciA9IGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgaXNQcm94eVJlYWR5ICh0aHJvd09uRXhpdCA9IHRydWUpIHtcbiAgICBpZiAoIXRoaXMucHJveHkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5wcm94eS5jb21tYW5kKCcvc3RhdHVzJywgJ0dFVCcpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAodGhyb3dPbkV4aXQgJiYgdGhpcy5wcm94eS5kaWRQcm9jZXNzRXhpdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IFByb3h5UHJvcGVydGllc1xuICAgKlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gc2NoZW1lIC0gVGhlIHNjaGVtZSBwcm94eSB0by5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGhvc3QgLSBUaGUgaG9zdCBuYW1lIHByb3h5IHRvLlxuICAgKiBAcHJvcGVydHkge251bWJlcn0gcG9ydCAtIFRoZSBwb3J0IG51bWJlciBwcm94eSB0by5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCBwcm94eSB0by5cbiAgICovXG5cbiAgLyoqXG4gICAqIFJldHVybnMgcHJveHkgaW5mb3JtYXRpb24gd2hlcmUgV0RBTWFjU2VydmVyIHByb3h5IHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gY2FwcyAtIFRoZSBjYXBhYmlsaXRpZXMgaW4gdGhlIHNlc3Npb24uXG4gICAqIEByZXR1cm4ge1Byb3h5UHJvcGVydGllc31cbiAgICogQHRocm93cyBFcnJvciBpZiAnd2ViRHJpdmVyQWdlbnRNYWNVcmwnIGhhZCBpbnZhbGlkIFVSTFxuICAgKi9cbiAgcGFyc2VQcm94eVByb3BlcnRpZXMgKGNhcHMpIHtcbiAgICBsZXQgc2NoZW1lID0gJ2h0dHAnO1xuICAgIGlmICghY2Fwcy53ZWJEcml2ZXJBZ2VudE1hY1VybCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2NoZW1lLFxuICAgICAgICBzZXJ2ZXI6ICh0aGlzLnByb2Nlc3M/Lmhvc3QgPz8gY2Fwcy5zeXN0ZW1Ib3N0KSA/PyBERUZBVUxUX1NZU1RFTV9IT1NULFxuICAgICAgICBwb3J0OiAodGhpcy5wcm9jZXNzPy5wb3J0ID8/IGNhcHMuc3lzdGVtUG9ydCkgPz8gREVGQVVMVF9TWVNURU1fUE9SVCxcbiAgICAgICAgcGF0aDogJydcbiAgICAgIH07XG4gICAgfVxuXG4gICAgbGV0IHBhcnNlZFVybDtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkVXJsID0gbmV3IHVybC5VUkwoY2Fwcy53ZWJEcml2ZXJBZ2VudE1hY1VybCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB3ZWJEcml2ZXJBZ2VudE1hY1VybCwgJyR7Y2Fwcy53ZWJEcml2ZXJBZ2VudE1hY1VybH0nLCBgICtcbiAgICAgICAgYGluIHRoZSBjYXBhYmlsaXRpZXMgaXMgaW52YWxpZC4gJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBwcm90b2NvbCwgaG9zdG5hbWUsIHBvcnQsIHBhdGhuYW1lIH0gPSBwYXJzZWRVcmw7XG4gICAgaWYgKF8uaXNTdHJpbmcocHJvdG9jb2wpKSB7XG4gICAgICBzY2hlbWUgPSBwcm90b2NvbC5zcGxpdCgnOicpWzBdO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc2NoZW1lLFxuICAgICAgc2VydmVyOiBob3N0bmFtZSA/PyBERUZBVUxUX1NZU1RFTV9IT1NULFxuICAgICAgcG9ydDogXy5pc0VtcHR5KHBvcnQpID8gREVGQVVMVF9TWVNURU1fUE9SVCA6IF8ucGFyc2VJbnQocG9ydCksXG4gICAgICBwYXRoOiBwYXRobmFtZSA9PT0gJy8nID8gJycgOiBwYXRobmFtZVxuICAgIH07XG4gIH1cblxuICBhc3luYyBzdGFydFNlc3Npb24gKGNhcHMpIHtcbiAgICB0aGlzLnNlcnZlclN0YXJ0dXBUaW1lb3V0TXMgPSBjYXBzLnNlcnZlclN0YXJ0dXBUaW1lb3V0ID8/IHRoaXMuc2VydmVyU3RhcnR1cFRpbWVvdXRNcztcblxuICAgIHRoaXMuaXNQcm94eWluZ1RvUmVtb3RlU2VydmVyID0gISFjYXBzLndlYkRyaXZlckFnZW50TWFjVXJsO1xuXG4gICAgbGV0IHdhc1Byb2Nlc3NJbml0TmVjZXNzYXJ5O1xuICAgIGlmICh0aGlzLmlzUHJveHlpbmdUb1JlbW90ZVNlcnZlcikge1xuICAgICAgaWYgKHRoaXMucHJvY2Vzcykge1xuICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3Mua2lsbCgpO1xuICAgICAgICBhd2FpdCBjbGVhbnVwT2Jzb2xldGVQcm9jZXNzZXMoKTtcbiAgICAgICAgdGhpcy5wcm9jZXNzID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgd2FzUHJvY2Vzc0luaXROZWNlc3NhcnkgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLnByb2Nlc3MpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzID0gbmV3IFdEQU1hY1Byb2Nlc3MoKTtcbiAgICAgIH1cbiAgICAgIHdhc1Byb2Nlc3NJbml0TmVjZXNzYXJ5ID0gYXdhaXQgdGhpcy5wcm9jZXNzLmluaXQoY2Fwcyk7XG4gICAgfVxuXG4gICAgaWYgKHdhc1Byb2Nlc3NJbml0TmVjZXNzYXJ5IHx8IHRoaXMuaXNQcm94eWluZ1RvUmVtb3RlU2VydmVyIHx8ICF0aGlzLnByb3h5KSB7XG4gICAgICBjb25zdCB7c2NoZW1lLCBzZXJ2ZXIsIHBvcnQsIHBhdGh9ID0gdGhpcy5wYXJzZVByb3h5UHJvcGVydGllcyhjYXBzKTtcbiAgICAgIHRoaXMucHJveHkgPSBuZXcgV0RBTWFjUHJveHkoe1xuICAgICAgICBzY2hlbWUsXG4gICAgICAgIHNlcnZlcixcbiAgICAgICAgcG9ydCxcbiAgICAgICAgYmFzZTogcGF0aCxcbiAgICAgICAga2VlcEFsaXZlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnByb3h5LmRpZFByb2Nlc3NFeGl0ID0gZmFsc2U7XG5cbiAgICAgIGlmICh0aGlzLnByb2Nlc3MpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzLnByb2Mub24oJ2V4aXQnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wcm94eS5kaWRQcm9jZXNzRXhpdCA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmlzUHJveHlSZWFkeSgpLCB7XG4gICAgICAgICAgd2FpdE1zOiB0aGlzLnNlcnZlclN0YXJ0dXBUaW1lb3V0TXMsXG4gICAgICAgICAgaW50ZXJ2YWxNczogMTAwMCxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICh0aGlzLnByb2Nlc3M/LmlzUnVubmluZykge1xuICAgICAgICAgIC8vIGF2b2lkIFwiZnJvemVuXCIgcHJvY2Vzc2VzLFxuICAgICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzcy5raWxsKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKC9Db25kaXRpb24gdW5tZXQvLnRlc3QoZS5tZXNzYWdlKSkge1xuICAgICAgICAgIGNvbnN0IG1zZyA9IHRoaXMuaXNQcm94eWluZ1RvUmVtb3RlU2VydmVyXG4gICAgICAgICAgICA/IGBObyByZXNwb25zZSBmcm9tICcke3NjaGVtZX06Ly8ke3NlcnZlcn06JHtwb3J0fSR7cGF0aH0nIHdpdGhpbiAke3RoaXMuc2VydmVyU3RhcnR1cFRpbWVvdXRNc31tcyB0aW1lb3V0LmAgK1xuICAgICAgICAgICAgYFBsZWFzZSBtYWtlIHN1cmUgdGhlIHJlbW90ZSBzZXJ2ZXIgaXMgcnVubmluZyBhbmQgYWNjZXNzaWJsZSBieSBBcHBpdW1gXG4gICAgICAgICAgICA6IGBNYWMyRHJpdmVyIHNlcnZlciBpcyBub3QgbGlzdGVuaW5nIHdpdGhpbiAke3RoaXMuc2VydmVyU3RhcnR1cFRpbWVvdXRNc31tcyB0aW1lb3V0LiBgICtcbiAgICAgICAgICAgIGBUcnkgdG8gaW5jcmVhc2UgdGhlIHZhbHVlIG9mICdzZXJ2ZXJTdGFydHVwVGltZW91dCcgY2FwYWJpbGl0eSwgY2hlY2sgdGhlIHNlcnZlciBsb2dzIGAgK1xuICAgICAgICAgICAgYGFuZCBtYWtlIHN1cmUgdGhlICR7WENPREVCVUlMRH0gaG9zdCBwcm9jZXNzIGNvdWxkIGJlIHN0YXJ0ZWQgbWFudWFsbHkgZnJvbSBhIHRlcm1pbmFsYDtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wcm9jZXNzKSB7XG4gICAgICAgIGNvbnN0IHBpZCA9IHRoaXMucHJvY2Vzcy5waWQ7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuUGlkcyA9IGF3YWl0IHRoaXMucHJvY2Vzcy5saXN0Q2hpbGRyZW5QaWRzKCk7XG4gICAgICAgIFJVTk5JTkdfUFJPQ0VTU19JRFMucHVzaCguLi5jaGlsZHJlblBpZHMsIHBpZCk7XG4gICAgICAgIHRoaXMucHJvY2Vzcy5wcm9jLm9uKCdleGl0JywgKCkgPT4gdm9pZCBfLnB1bGwoUlVOTklOR19QUk9DRVNTX0lEUywgcGlkKSk7XG4gICAgICAgIGxvZy5pbmZvKGBUaGUgaG9zdCBwcm9jZXNzIGlzIHJlYWR5IHdpdGhpbiAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuaW5mbygnVGhlIGhvc3QgcHJvY2VzcyBoYXMgYWxyZWFkeSBiZWVuIGxpc3RlbmluZy4gUHJvY2VlZGluZyB3aXRoIHNlc3Npb24gY3JlYXRpb24nKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnByb3h5LmNvbW1hbmQoJy9zZXNzaW9uJywgJ1BPU1QnLCB7XG4gICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgZmlyc3RNYXRjaDogW3t9XSxcbiAgICAgICAgYWx3YXlzTWF0Y2g6IGNhcHMsXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzdG9wU2Vzc2lvbiAoKSB7XG4gICAgaWYgKCF0aGlzLmlzUHJveHlpbmdUb1JlbW90ZVNlcnZlciAmJiAhKHRoaXMucHJvY2Vzcz8uaXNSdW5uaW5nKSkge1xuICAgICAgbG9nLmluZm8oYE1hYzJEcml2ZXIgc2Vzc2lvbiBjYW5ub3QgYmUgc3RvcHBlZCwgYmVjYXVzZSB0aGUgc2VydmVyIGlzIG5vdCBydW5uaW5nYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJveHk/LnNlc3Npb25JZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm94eS5jb21tYW5kKGAvc2Vzc2lvbi8ke3RoaXMucHJveHkuc2Vzc2lvbklkfWAsICdERUxFVEUnKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nLmluZm8oYE1hYzJEcml2ZXIgc2Vzc2lvbiBjYW5ub3QgYmUgZGVsZXRlZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBXREFfTUFDX1NFUlZFUiA9IG5ldyBXREFNYWNTZXJ2ZXIoKTtcblxuZXhwb3J0IGRlZmF1bHQgV0RBX01BQ19TRVJWRVI7XG4iXSwibWFwcGluZ3MiOiI7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
|
|
400
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJERUZBVUxUX1dEQV9ST09UIiwicGF0aCIsInJlc29sdmUiLCJnZXRNb2R1bGVSb290IiwiV0RBX1BST0pFQ1RfTkFNRSIsIldEQV9QUk9KRUNUIiwid2RhUm9vdCIsIlJVTk5FUl9TQ0hFTUUiLCJESVNBQkxFX1NUT1JFX0FSRyIsIlhDT0RFQlVJTEQiLCJTVEFSVFVQX1RJTUVPVVRfTVMiLCJERUZBVUxUX1NZU1RFTV9QT1JUIiwiREVGQVVMVF9TWVNURU1fSE9TVCIsIkRFRkFVTFRfU0hPV19TRVJWRVJfTE9HUyIsIlJVTk5JTkdfUFJPQ0VTU19JRFMiLCJSRUNFTlRfVVBHUkFERV9USU1FU1RBTVBfUEFUSCIsImpvaW4iLCJnZXRVcGdyYWRlVGltZXN0YW1wIiwicGFja2FnZU1hbmlmZXN0IiwiZnMiLCJleGlzdHMiLCJtdGltZSIsInN0YXQiLCJnZXRUaW1lIiwiY2xlYW51cE9ic29sZXRlUHJvY2Vzc2VzIiwiXyIsImlzRW1wdHkiLCJkZWJ1ZyIsImxlbmd0aCIsInV0aWwiLCJwbHVyYWxpemUiLCJleGVjIiwiaWduIiwicHVsbEFsbCIsInByb2Nlc3MiLCJvbmNlIiwiZXhlY1N5bmMiLCJXREFNYWNQcm94eSIsIkpXUHJveHkiLCJwcm94eUNvbW1hbmQiLCJ1cmwiLCJtZXRob2QiLCJib2R5IiwiZGlkUHJvY2Vzc0V4aXQiLCJlcnJvcnMiLCJJbnZhbGlkQ29udGV4dEVycm9yIiwiV0RBTWFjUHJvY2VzcyIsImNvbnN0cnVjdG9yIiwic2hvd1NlcnZlckxvZ3MiLCJwb3J0IiwiaG9zdCIsImJvb3RzdHJhcFJvb3QiLCJwcm9jIiwiaXNSdW5uaW5nIiwicGlkIiwibGlzdENoaWxkcmVuUGlkcyIsImxpc3RDaGlsZHJlblByb2Nlc3NJZHMiLCJpc0ZyZXNoVXBncmFkZSIsImhvbWVGb2xkZXIiLCJlbnYiLCJIT01FIiwiaW5mbyIsImN1cnJlbnRVcGdyYWRlVGltZXN0YW1wIiwiaXNJbnRlZ2VyIiwidGltZXN0YW1wUGF0aCIsImFjY2VzcyIsIldfT0siLCJyZWNlbnRVcGdyYWRlVGltZXN0YW1wIiwicGFyc2VJbnQiLCJyZWFkRmlsZSIsIndhcm4iLCJta2RpcnAiLCJkaXJuYW1lIiwid3JpdGVGaWxlIiwiZSIsIm1lc3NhZ2UiLCJoYXNTYW1lT3B0cyIsInN5c3RlbVBvcnQiLCJzeXN0ZW1Ib3N0IiwiaXNCb29sZWFuIiwiaXNOaWwiLCJpbml0Iiwib3B0cyIsIkVycm9yIiwia2lsbCIsInhjb2RlYnVpbGQiLCJ3aGljaCIsImFyZ3MiLCJjd2QiLCJzdGRlcnIiLCJpc1BvcnRCdXN5IiwiY2hlY2tQb3J0U3RhdHVzIiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsInN0YXJ0IiwiYXhpb3MiLCJkZWxldGUiLCJ0aW1lb3V0IiwiQiIsImRlbGF5Iiwid2FpdEZvckNvbmRpdGlvbiIsIndhaXRNcyIsImludGVydmFsTXMiLCJNYXRoIiwicm91bmQiLCJnZXREdXJhdGlvbiIsImFzTWlsbGlTZWNvbmRzIiwiT2JqZWN0IiwiYXNzaWduIiwiVVNFX1BPUlQiLCJVU0VfSE9TVCIsIlN1YlByb2Nlc3MiLCJvbiIsInN0ZG91dCIsImxpbmUiLCJ0cmltIiwiY29kZSIsInNpZ25hbCIsInF1b3RlIiwic3RvcCIsImNoaWxkcmVuUGlkcyIsIldEQU1hY1NlcnZlciIsInNlcnZlclN0YXJ0dXBUaW1lb3V0TXMiLCJwcm94eSIsImlzUHJveHlpbmdUb1JlbW90ZVNlcnZlciIsImlzUHJveHlSZWFkeSIsInRocm93T25FeGl0IiwiY29tbWFuZCIsImVyciIsInBhcnNlUHJveHlQcm9wZXJ0aWVzIiwiY2FwcyIsInNjaGVtZSIsIndlYkRyaXZlckFnZW50TWFjVXJsIiwic2VydmVyIiwicGFyc2VkVXJsIiwiVVJMIiwicHJvdG9jb2wiLCJob3N0bmFtZSIsInBhdGhuYW1lIiwiaXNTdHJpbmciLCJzcGxpdCIsInN0YXJ0U2Vzc2lvbiIsInNlcnZlclN0YXJ0dXBUaW1lb3V0Iiwid2FzUHJvY2Vzc0luaXROZWNlc3NhcnkiLCJiYXNlIiwia2VlcEFsaXZlIiwidGVzdCIsIm1zZyIsInB1c2giLCJwdWxsIiwidG9GaXhlZCIsImNhcGFiaWxpdGllcyIsImZpcnN0TWF0Y2giLCJhbHdheXNNYXRjaCIsInN0b3BTZXNzaW9uIiwic2Vzc2lvbklkIiwiV0RBX01BQ19TRVJWRVIiXSwic291cmNlcyI6WyIuLi8uLi9saWIvd2RhLW1hYy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgdXJsIGZyb20gJ3VybCc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgSldQcm94eSwgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgeyBmcywgbG9nZ2VyLCB1dGlsLCB0aW1pbmcsIG1rZGlycCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IFN1YlByb2Nlc3MsIGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IGNoZWNrUG9ydFN0YXR1cyB9IGZyb20gJ3BvcnRzY2FubmVyJztcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBsaXN0Q2hpbGRyZW5Qcm9jZXNzSWRzLCBnZXRNb2R1bGVSb290IH0gZnJvbSAnLi91dGlscyc7XG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1dlYkRyaXZlckFnZW50TWFjJyk7XG5cbmNvbnN0IERFRkFVTFRfV0RBX1JPT1QgPSBwYXRoLnJlc29sdmUoZ2V0TW9kdWxlUm9vdCgpLCAnV2ViRHJpdmVyQWdlbnRNYWMnKTtcbmNvbnN0IFdEQV9QUk9KRUNUX05BTUUgPSAnV2ViRHJpdmVyQWdlbnRNYWMueGNvZGVwcm9qJztcbmNvbnN0IFdEQV9QUk9KRUNUID0gKHdkYVJvb3QgPSBERUZBVUxUX1dEQV9ST09UKSA9PiBwYXRoLnJlc29sdmUod2RhUm9vdCwgV0RBX1BST0pFQ1RfTkFNRSk7XG5jb25zdCBSVU5ORVJfU0NIRU1FID0gJ1dlYkRyaXZlckFnZW50UnVubmVyJztcbmNvbnN0IERJU0FCTEVfU1RPUkVfQVJHID0gJ0NPTVBJTEVSX0lOREVYX1NUT1JFX0VOQUJMRT1OTyc7XG5jb25zdCBYQ09ERUJVSUxEID0gJ3hjb2RlYnVpbGQnO1xuY29uc3QgU1RBUlRVUF9USU1FT1VUX01TID0gMTIwMDAwO1xuY29uc3QgREVGQVVMVF9TWVNURU1fUE9SVCA9IDEwMTAwO1xuY29uc3QgREVGQVVMVF9TWVNURU1fSE9TVCA9ICcxMjcuMC4wLjEnO1xuY29uc3QgREVGQVVMVF9TSE9XX1NFUlZFUl9MT0dTID0gZmFsc2U7XG5jb25zdCBSVU5OSU5HX1BST0NFU1NfSURTID0gW107XG5jb25zdCBSRUNFTlRfVVBHUkFERV9USU1FU1RBTVBfUEFUSCA9IHBhdGguam9pbignLmFwcGl1bScsICd3ZWJkcml2ZXJhZ2VudF9tYWMnLCAndXBncmFkZS50aW1lJyk7XG5cblxuYXN5bmMgZnVuY3Rpb24gZ2V0VXBncmFkZVRpbWVzdGFtcCAoKSB7XG4gIGNvbnN0IHBhY2thZ2VNYW5pZmVzdCA9IHBhdGgucmVzb2x2ZShnZXRNb2R1bGVSb290KCksICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKCFhd2FpdCBmcy5leGlzdHMocGFja2FnZU1hbmlmZXN0KSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHttdGltZX0gPSBhd2FpdCBmcy5zdGF0KHBhY2thZ2VNYW5pZmVzdCk7XG4gIHJldHVybiBtdGltZS5nZXRUaW1lKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsZWFudXBPYnNvbGV0ZVByb2Nlc3NlcyAoKSB7XG4gIGlmICghXy5pc0VtcHR5KFJVTk5JTkdfUFJPQ0VTU19JRFMpKSB7XG4gICAgbG9nLmRlYnVnKGBDbGVhbmluZyB1cCAke1JVTk5JTkdfUFJPQ0VTU19JRFMubGVuZ3RofSBvYnNvbGV0ZSBgICtcbiAgICAgIHV0aWwucGx1cmFsaXplKCdwcm9jZXNzJywgUlVOTklOR19QUk9DRVNTX0lEUy5sZW5ndGgsIGZhbHNlKSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWMoJ2tpbGwnLCBbJy05JywgLi4uUlVOTklOR19QUk9DRVNTX0lEU10pO1xuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICBfLnB1bGxBbGwoUlVOTklOR19QUk9DRVNTX0lEUywgUlVOTklOR19QUk9DRVNTX0lEUyk7XG4gIH1cbn1cblxucHJvY2Vzcy5vbmNlKCdleGl0JywgKCkgPT4ge1xuICBpZiAoIV8uaXNFbXB0eShSVU5OSU5HX1BST0NFU1NfSURTKSkge1xuICAgIHRyeSB7XG4gICAgICBleGVjU3luYyhga2lsbCAtOSAke1JVTk5JTkdfUFJPQ0VTU19JRFMuam9pbignICcpfWApO1xuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICBfLnB1bGxBbGwoUlVOTklOR19QUk9DRVNTX0lEUywgUlVOTklOR19QUk9DRVNTX0lEUyk7XG4gIH1cbn0pO1xuXG5cbmNsYXNzIFdEQU1hY1Byb3h5IGV4dGVuZHMgSldQcm94eSB7XG4gIGFzeW5jIHByb3h5Q29tbWFuZCAodXJsLCBtZXRob2QsIGJvZHkgPSBudWxsKSB7XG4gICAgaWYgKHRoaXMuZGlkUHJvY2Vzc0V4aXQpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZENvbnRleHRFcnJvcihcbiAgICAgICAgYCcke21ldGhvZH0gJHt1cmx9JyBjYW5ub3QgYmUgcHJveGllZCB0byBNYWMyIERyaXZlciBzZXJ2ZXIgYmVjYXVzZSBgICtcbiAgICAgICAgJ2l0cyBwcm9jZXNzIGlzIG5vdCBydW5uaW5nIChwcm9iYWJseSBjcmFzaGVkKS4gQ2hlY2sgdGhlIEFwcGl1bSBsb2cgZm9yIG1vcmUgZGV0YWlscycpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgc3VwZXIucHJveHlDb21tYW5kKHVybCwgbWV0aG9kLCBib2R5KTtcbiAgfVxufVxuXG5jbGFzcyBXREFNYWNQcm9jZXNzIHtcbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHRoaXMuc2hvd1NlcnZlckxvZ3MgPSBERUZBVUxUX1NIT1dfU0VSVkVSX0xPR1M7XG4gICAgdGhpcy5wb3J0ID0gREVGQVVMVF9TWVNURU1fUE9SVDtcbiAgICB0aGlzLmhvc3QgPSBERUZBVUxUX1NZU1RFTV9IT1NUO1xuICAgIHRoaXMuYm9vdHN0cmFwUm9vdCA9IERFRkFVTFRfV0RBX1JPT1Q7XG4gICAgdGhpcy5wcm9jID0gbnVsbDtcbiAgfVxuXG4gIGdldCBpc1J1bm5pbmcgKCkge1xuICAgIHJldHVybiAhISh0aGlzLnByb2M/LmlzUnVubmluZyk7XG4gIH1cblxuICBnZXQgcGlkICgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1J1bm5pbmcgPyB0aGlzLnByb2MucGlkIDogbnVsbDtcbiAgfVxuXG4gIGFzeW5jIGxpc3RDaGlsZHJlblBpZHMgKCkge1xuICAgIHJldHVybiB0aGlzLnBpZCA/IChhd2FpdCBsaXN0Q2hpbGRyZW5Qcm9jZXNzSWRzKHRoaXMucGlkKSkgOiBbXTtcbiAgfVxuXG4gIGFzeW5jIGlzRnJlc2hVcGdyYWRlICgpIHtcbiAgICBjb25zdCBob21lRm9sZGVyID0gcHJvY2Vzcy5lbnYuSE9NRTtcbiAgICBpZiAoIWhvbWVGb2xkZXIpIHtcbiAgICAgIGxvZy5pbmZvKCdUaGUgSE9NRSBmb2xkZXIgcGF0aCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCcpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRVcGdyYWRlVGltZXN0YW1wID0gYXdhaXQgZ2V0VXBncmFkZVRpbWVzdGFtcCgpO1xuICAgIGlmICghXy5pc0ludGVnZXIoY3VycmVudFVwZ3JhZGVUaW1lc3RhbXApKSB7XG4gICAgICBsb2cuaW5mbygnSXQgaXMgaW1wb3NzaWJsZSB0byBkZXRlcm1pbmUgdGhlIHRpbWVzdGFtcCBvZiB0aGUgcGFja2FnZScpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHRpbWVzdGFtcFBhdGggPSBwYXRoLnJlc29sdmUoaG9tZUZvbGRlciwgUkVDRU5UX1VQR1JBREVfVElNRVNUQU1QX1BBVEgpO1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHModGltZXN0YW1wUGF0aCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLmFjY2Vzcyh0aW1lc3RhbXBQYXRoLCBmcy5XX09LKTtcbiAgICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgICBsb2cuaW5mbyhgV2ViRHJpdmVyQWdlbnQgdXBncmFkZSB0aW1lc3RhbXAgYXQgJyR7dGltZXN0YW1wUGF0aH0nIGlzIG5vdCB3cml0ZWFibGVgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVjZW50VXBncmFkZVRpbWVzdGFtcCA9IHBhcnNlSW50KGF3YWl0IGZzLnJlYWRGaWxlKHRpbWVzdGFtcFBhdGgsICd1dGY4JyksIDEwKTtcbiAgICAgIGlmIChfLmlzSW50ZWdlcihyZWNlbnRVcGdyYWRlVGltZXN0YW1wKSkge1xuICAgICAgICBpZiAocmVjZW50VXBncmFkZVRpbWVzdGFtcCA+PSBjdXJyZW50VXBncmFkZVRpbWVzdGFtcCkge1xuICAgICAgICAgIGxvZy5pbmZvKGBXZWJEcml2ZXJBZ2VudCBzb3VyY2VzIGFyZSB1cCB0byBkYXRlIGAgK1xuICAgICAgICAgICAgYCgke3JlY2VudFVwZ3JhZGVUaW1lc3RhbXB9ID49ICR7Y3VycmVudFVwZ3JhZGVUaW1lc3RhbXB9KWApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsb2cuaW5mbyhgV2ViRHJpdmVyQWdlbnQgc291cmNlcyBoYXZlIGJlZW4gdXBncmFkZWQgYCArXG4gICAgICAgICAgYCgke3JlY2VudFVwZ3JhZGVUaW1lc3RhbXB9IDwgJHtjdXJyZW50VXBncmFkZVRpbWVzdGFtcH0pYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cud2FybihgVGhlIHJlY2VudCB1cGdyYWRlIHRpbWVzdGFtcCBhdCAnJHt0aW1lc3RhbXBQYXRofScgaXMgY29ycnVwdGVkLiBUcnlpbmcgdG8gZml4IGl0YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG1rZGlycChwYXRoLmRpcm5hbWUodGltZXN0YW1wUGF0aCkpO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHRpbWVzdGFtcFBhdGgsIGAke2N1cnJlbnRVcGdyYWRlVGltZXN0YW1wfWAsICd1dGY4Jyk7XG4gICAgICBsb2cuZGVidWcoYFN0b3JlZCB0aGUgcmVjZW50IFdlYkRyaXZlckFnZW50IHVwZ3JhZGUgdGltZXN0YW1wICR7Y3VycmVudFVwZ3JhZGVUaW1lc3RhbXB9IGAgK1xuICAgICAgICBgYXQgJyR7dGltZXN0YW1wUGF0aH0nYCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmluZm8oYFVuYWJsZSB0byBjcmVhdGUgdGhlIHJlY2VudCBXZWJEcml2ZXJBZ2VudCB1cGdyYWRlIHRpbWVzdGFtcCBhdCAnJHt0aW1lc3RhbXBQYXRofScuIGAgK1xuICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaGFzU2FtZU9wdHMgKHsgc2hvd1NlcnZlckxvZ3MsIHN5c3RlbVBvcnQsIHN5c3RlbUhvc3QsIGJvb3RzdHJhcFJvb3QgfSkge1xuICAgIGlmIChfLmlzQm9vbGVhbihzaG93U2VydmVyTG9ncykgJiYgdGhpcy5zaG93U2VydmVyTG9ncyAhPT0gc2hvd1NlcnZlckxvZ3NcbiAgICAgIHx8IF8uaXNOaWwoc2hvd1NlcnZlckxvZ3MpICYmIHRoaXMuc2hvd1NlcnZlckxvZ3MgIT09IERFRkFVTFRfU0hPV19TRVJWRVJfTE9HUykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3lzdGVtUG9ydCAmJiB0aGlzLnBvcnQgIT09IHN5c3RlbVBvcnRcbiAgICAgIHx8ICFzeXN0ZW1Qb3J0ICYmIHRoaXMucG9ydCAhPT0gREVGQVVMVF9TWVNURU1fUE9SVCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3lzdGVtSG9zdCAmJiB0aGlzLmhvc3QgIT09IHN5c3RlbUhvc3RcbiAgICAgIHx8ICFzeXN0ZW1Ib3N0ICYmIHRoaXMuaG9zdCAhPT0gREVGQVVMVF9TWVNURU1fSE9TVCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoYm9vdHN0cmFwUm9vdCAmJiB0aGlzLmJvb3RzdHJhcFJvb3QgIT09IGJvb3RzdHJhcFJvb3RcbiAgICAgIHx8ICFib290c3RyYXBSb290ICYmIHRoaXMuYm9vdHN0cmFwUm9vdCAhPT0gREVGQVVMVF9XREFfUk9PVCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgaW5pdCAob3B0cyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuaXNSdW5uaW5nICYmIHRoaXMuaGFzU2FtZU9wdHMob3B0cykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnNob3dTZXJ2ZXJMb2dzID0gb3B0cy5zaG93U2VydmVyTG9ncyA/PyB0aGlzLnNob3dTZXJ2ZXJMb2dzO1xuICAgIHRoaXMucG9ydCA9IG9wdHMuc3lzdGVtUG9ydCA/PyB0aGlzLnBvcnQ7XG4gICAgdGhpcy5ob3N0ID0gb3B0cy5zeXN0ZW1Ib3N0ID8/IHRoaXMuaG9zdDtcbiAgICB0aGlzLmJvb3RzdHJhcFJvb3QgPSBvcHRzLmJvb3RzdHJhcFJvb3QgPz8gdGhpcy5ib290c3RyYXBSb290O1xuXG4gICAgbG9nLmRlYnVnKGBVc2luZyBib290c3RyYXAgcm9vdDogJHt0aGlzLmJvb3RzdHJhcFJvb3R9YCk7XG4gICAgaWYgKCFhd2FpdCBmcy5leGlzdHMoV0RBX1BST0pFQ1QodGhpcy5ib290c3RyYXBSb290KSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtXREFfUFJPSkVDVF9OQU1FfSBkb2VzIG5vdCBleGlzdCBhdCAnJHtXREFfUFJPSkVDVCh0aGlzLmJvb3RzdHJhcFJvb3QpfScuIGAgK1xuICAgICAgICBgV2FzICdib290c3RyYXBSb290JyBzZXQgdG8gYSBwcm9wZXIgdmFsdWU/YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5raWxsKCk7XG4gICAgYXdhaXQgY2xlYW51cE9ic29sZXRlUHJvY2Vzc2VzKCk7XG5cbiAgICBsZXQgeGNvZGVidWlsZDtcbiAgICB0cnkge1xuICAgICAgeGNvZGVidWlsZCA9IGF3YWl0IGZzLndoaWNoKFhDT0RFQlVJTEQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtYQ09ERUJVSUxEfSBiaW5hcnkgY2Fubm90IGJlIGZvdW5kIGluIFBBVEguIGAgK1xuICAgICAgICBgUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IFhjb2RlIGlzIGluc3RhbGxlZCBvbiB5b3VyIHN5c3RlbWApO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYFVzaW5nICR7WENPREVCVUlMRH0gYmluYXJ5IGF0ICcke3hjb2RlYnVpbGR9J2ApO1xuXG4gICAgaWYgKGF3YWl0IHRoaXMuaXNGcmVzaFVwZ3JhZGUoKSkge1xuICAgICAgbG9nLmluZm8oJ1BlcmZvcm1pbmcgcHJvamVjdCBjbGVhbnVwJyk7XG4gICAgICBjb25zdCBhcmdzID0gW1xuICAgICAgICAnY2xlYW4nLFxuICAgICAgICAnLXByb2plY3QnLCBXREFfUFJPSkVDVCh0aGlzLmJvb3RzdHJhcFJvb3QpLFxuICAgICAgICAnLXNjaGVtZScsIFJVTk5FUl9TQ0hFTUUsXG4gICAgICBdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZXhlYyhYQ09ERUJVSUxELCBhcmdzLCB7XG4gICAgICAgICAgY3dkOiB0aGlzLmJvb3RzdHJhcFJvb3QsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2cud2FybihgQ2Fubm90IHBlcmZvcm0gcHJvamVjdCBjbGVhbnVwLiBgICtcbiAgICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5zdGRlcnIgfHwgZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxvZy5kZWJ1ZyhgVXNpbmcgJHt0aGlzLmhvc3R9IGFzIHNlcnZlciBob3N0YCk7XG4gICAgbG9nLmRlYnVnKGBVc2luZyBwb3J0ICR7dGhpcy5wb3J0fWApO1xuICAgIGNvbnN0IGlzUG9ydEJ1c3kgPSBhc3luYyAoKSA9PiAoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKHRoaXMucG9ydCwgdGhpcy5ob3N0KSkgPT09ICdvcGVuJztcbiAgICBpZiAoYXdhaXQgaXNQb3J0QnVzeSgpKSB7XG4gICAgICBsb2cud2FybihgVGhlIHBvcnQgIyR7dGhpcy5wb3J0fSBhdCAke3RoaXMuaG9zdH0gaXMgYnVzeS4gYCArXG4gICAgICAgIGBBc3N1bWluZyBpdCBpcyBhbiBvYnNvbGV0ZSBXREEgc2VydmVyIGluc3RhbmNlIGFuZCBgICtcbiAgICAgICAgYHRyeWluZyB0byB0ZXJtaW5hdGUgaXQgaW4gb3JkZXIgdG8gc3RhcnQgYSBuZXcgb25lYCk7XG4gICAgICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgYXhpb3MuZGVsZXRlKGBodHRwOi8vJHt0aGlzLmhvc3R9OiR7dGhpcy5wb3J0fS9gLCB7XG4gICAgICAgICAgdGltZW91dDogNTAwMCxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEdpdmUgdGhlIHNlcnZlciBzb21lIHRpbWUgdG8gZmluaXNoIGFuZCBzdG9wIGxpc3RlbmluZ1xuICAgICAgICBhd2FpdCBCLmRlbGF5KDUwMCk7XG4gICAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4gIShhd2FpdCBpc1BvcnRCdXN5KCkpLCB7XG4gICAgICAgICAgd2FpdE1zOiAzMDAwLFxuICAgICAgICAgIGludGVydmFsTXM6IDEwMCxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy53YXJuKGBEaWQgbm90IGtub3cgaG93IHRvIHRlcm1pbmF0ZSB0aGUgcHJvY2VzcyBhdCAke3RoaXMuaG9zdH06JHt0aGlzLnBvcnR9OiAke2UubWVzc2FnZX0uIGAgK1xuICAgICAgICAgIGBQZXJoYXBzLCBpdCBpcyBub3QgYSBXREEgc2VydmVyLCB3aGljaCBpcyBob2dnaW5nIHRoZSBwb3J0P2ApO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwb3J0ICMke3RoaXMucG9ydH0gYXQgJHt0aGlzLmhvc3R9IGlzIGJ1c3kuIGAgK1xuICAgICAgICAgIGBDb25zaWRlciBzZXR0aW5nICdzeXN0ZW1Qb3J0JyBjYXBhYmlsaXR5IHRvIGFub3RoZXIgZnJlZSBwb3J0IG51bWJlciBhbmQvb3IgYCArXG4gICAgICAgICAgYG1ha2Ugc3VyZSBwcmV2aW91cyBkcml2ZXIgc2Vzc2lvbnMgaGF2ZSBiZWVuIGNsb3NlZCBwcm9wZXJseS5gKTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKGBUaGUgcHJldmlvdXNseSBydW5uaW5nIFdEQSBzZXJ2ZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHRlcm1pbmF0ZWQgYWZ0ZXIgYCArXG4gICAgICAgIGAke01hdGgucm91bmQodGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcyl9bXNgKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcmdzID0gW1xuICAgICAgJ2J1aWxkLWZvci10ZXN0aW5nJywgJ3Rlc3Qtd2l0aG91dC1idWlsZGluZycsXG4gICAgICAnLXByb2plY3QnLCBXREFfUFJPSkVDVCh0aGlzLmJvb3RzdHJhcFJvb3QpLFxuICAgICAgJy1zY2hlbWUnLCBSVU5ORVJfU0NIRU1FLFxuICAgICAgRElTQUJMRV9TVE9SRV9BUkcsXG4gICAgXTtcbiAgICBjb25zdCBlbnYgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9jZXNzLmVudiwge1xuICAgICAgVVNFX1BPUlQ6IGAke3RoaXMucG9ydH1gLFxuICAgICAgVVNFX0hPU1Q6IHRoaXMuaG9zdCxcbiAgICB9KTtcbiAgICB0aGlzLnByb2MgPSBuZXcgU3ViUHJvY2Vzcyh4Y29kZWJ1aWxkLCBhcmdzLCB7XG4gICAgICBjd2Q6IHRoaXMuYm9vdHN0cmFwUm9vdCxcbiAgICAgIGVudixcbiAgICB9KTtcbiAgICBpZiAoIXRoaXMuc2hvd1NlcnZlckxvZ3MpIHtcbiAgICAgIGxvZy5pbmZvKGBNYWMyRHJpdmVyIGhvc3QgcHJvY2VzcyBsb2dnaW5nIGlzIGRpc2FibGVkLiBgICtcbiAgICAgICAgYEFsbCB0aGUgJHtYQ09ERUJVSUxEfSBvdXRwdXQgaXMgZ29pbmcgdG8gYmUgc3VwcHJlc3NlZC4gYCArXG4gICAgICAgIGBTZXQgdGhlICdzaG93U2VydmVyTG9ncycgY2FwYWJpbGl0eSB0byAndHJ1ZScgaWYgdGhpcyBpcyBhbiB1bmRlc2lyZWQgYmVoYXZpb3JgKTtcbiAgICB9XG4gICAgdGhpcy5wcm9jLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgIGlmICghdGhpcy5zaG93U2VydmVyTG9ncykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxpbmUgPSBfLnRyaW0oc3Rkb3V0IHx8IHN0ZGVycik7XG4gICAgICBpZiAobGluZSkge1xuICAgICAgICBsb2cuZGVidWcoYFske1hDT0RFQlVJTER9XSAke2xpbmV9YCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5wcm9jLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgbG9nLmluZm8oYE1hYzJEcml2ZXIgaG9zdCBwcm9jZXNzIGhhcyBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX0sIHNpZ25hbCAke3NpZ25hbH1gKTtcbiAgICB9KTtcbiAgICBsb2cuaW5mbyhgU3RhcnRpbmcgTWFjMkRyaXZlciBob3N0IHByb2Nlc3M6ICR7WENPREVCVUlMRH0gJHt1dGlsLnF1b3RlKGFyZ3MpfWApO1xuICAgIGF3YWl0IHRoaXMucHJvYy5zdGFydCgwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIHN0b3AgKCkge1xuICAgIGlmICghdGhpcy5pc1J1bm5pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZHJlblBpZHMgPSBhd2FpdCB0aGlzLmxpc3RDaGlsZHJlblBpZHMoKTtcbiAgICBpZiAoIV8uaXNFbXB0eShjaGlsZHJlblBpZHMpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBleGVjKCdraWxsJywgY2hpbGRyZW5QaWRzKTtcbiAgICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICB9XG4gICAgYXdhaXQgdGhpcy5wcm9jLnN0b3AoJ1NJR1RFUk0nLCAzMDAwKTtcbiAgfVxuXG4gIGFzeW5jIGtpbGwgKCkge1xuICAgIGlmICghdGhpcy5pc1J1bm5pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZHJlblBpZHMgPSBhd2FpdCB0aGlzLmxpc3RDaGlsZHJlblBpZHMoKTtcbiAgICBpZiAoIV8uaXNFbXB0eShjaGlsZHJlblBpZHMpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBleGVjKCdraWxsJywgWyctOScsIC4uLmNoaWxkcmVuUGlkc10pO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5wcm9jLnN0b3AoJ1NJR0tJTEwnKTtcbiAgICB9IGNhdGNoIChpZ24pIHt9XG4gIH1cbn1cblxuY2xhc3MgV0RBTWFjU2VydmVyIHtcbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHRoaXMucHJvY2VzcyA9IG51bGw7XG4gICAgdGhpcy5zZXJ2ZXJTdGFydHVwVGltZW91dE1zID0gU1RBUlRVUF9USU1FT1VUX01TO1xuICAgIHRoaXMucHJveHkgPSBudWxsO1xuXG4gICAgLy8gVG8gaGFuZGxlIGlmIHRoZSBXREFNYWMgc2VydmVyIGlzIHByb3h5aW5nIHJlcXVlc3RzIHRvIGEgcmVtb3RlIFdEQU1hYyBhcHAgaW5zdGFuY2VcbiAgICB0aGlzLmlzUHJveHlpbmdUb1JlbW90ZVNlcnZlciA9IGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgaXNQcm94eVJlYWR5ICh0aHJvd09uRXhpdCA9IHRydWUpIHtcbiAgICBpZiAoIXRoaXMucHJveHkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5wcm94eS5jb21tYW5kKCcvc3RhdHVzJywgJ0dFVCcpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAodGhyb3dPbkV4aXQgJiYgdGhpcy5wcm94eS5kaWRQcm9jZXNzRXhpdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IFByb3h5UHJvcGVydGllc1xuICAgKlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gc2NoZW1lIC0gVGhlIHNjaGVtZSBwcm94eSB0by5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGhvc3QgLSBUaGUgaG9zdCBuYW1lIHByb3h5IHRvLlxuICAgKiBAcHJvcGVydHkge251bWJlcn0gcG9ydCAtIFRoZSBwb3J0IG51bWJlciBwcm94eSB0by5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCBwcm94eSB0by5cbiAgICovXG5cbiAgLyoqXG4gICAqIFJldHVybnMgcHJveHkgaW5mb3JtYXRpb24gd2hlcmUgV0RBTWFjU2VydmVyIHByb3h5IHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gY2FwcyAtIFRoZSBjYXBhYmlsaXRpZXMgaW4gdGhlIHNlc3Npb24uXG4gICAqIEByZXR1cm4ge1Byb3h5UHJvcGVydGllc31cbiAgICogQHRocm93cyBFcnJvciBpZiAnd2ViRHJpdmVyQWdlbnRNYWNVcmwnIGhhZCBpbnZhbGlkIFVSTFxuICAgKi9cbiAgcGFyc2VQcm94eVByb3BlcnRpZXMgKGNhcHMpIHtcbiAgICBsZXQgc2NoZW1lID0gJ2h0dHAnO1xuICAgIGlmICghY2Fwcy53ZWJEcml2ZXJBZ2VudE1hY1VybCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2NoZW1lLFxuICAgICAgICBzZXJ2ZXI6ICh0aGlzLnByb2Nlc3M/Lmhvc3QgPz8gY2Fwcy5zeXN0ZW1Ib3N0KSA/PyBERUZBVUxUX1NZU1RFTV9IT1NULFxuICAgICAgICBwb3J0OiAodGhpcy5wcm9jZXNzPy5wb3J0ID8/IGNhcHMuc3lzdGVtUG9ydCkgPz8gREVGQVVMVF9TWVNURU1fUE9SVCxcbiAgICAgICAgcGF0aDogJydcbiAgICAgIH07XG4gICAgfVxuXG4gICAgbGV0IHBhcnNlZFVybDtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkVXJsID0gbmV3IHVybC5VUkwoY2Fwcy53ZWJEcml2ZXJBZ2VudE1hY1VybCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB3ZWJEcml2ZXJBZ2VudE1hY1VybCwgJyR7Y2Fwcy53ZWJEcml2ZXJBZ2VudE1hY1VybH0nLCBgICtcbiAgICAgICAgYGluIHRoZSBjYXBhYmlsaXRpZXMgaXMgaW52YWxpZC4gJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBwcm90b2NvbCwgaG9zdG5hbWUsIHBvcnQsIHBhdGhuYW1lIH0gPSBwYXJzZWRVcmw7XG4gICAgaWYgKF8uaXNTdHJpbmcocHJvdG9jb2wpKSB7XG4gICAgICBzY2hlbWUgPSBwcm90b2NvbC5zcGxpdCgnOicpWzBdO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc2NoZW1lLFxuICAgICAgc2VydmVyOiBob3N0bmFtZSA/PyBERUZBVUxUX1NZU1RFTV9IT1NULFxuICAgICAgcG9ydDogXy5pc0VtcHR5KHBvcnQpID8gREVGQVVMVF9TWVNURU1fUE9SVCA6IF8ucGFyc2VJbnQocG9ydCksXG4gICAgICBwYXRoOiBwYXRobmFtZSA9PT0gJy8nID8gJycgOiBwYXRobmFtZVxuICAgIH07XG4gIH1cblxuICBhc3luYyBzdGFydFNlc3Npb24gKGNhcHMpIHtcbiAgICB0aGlzLnNlcnZlclN0YXJ0dXBUaW1lb3V0TXMgPSBjYXBzLnNlcnZlclN0YXJ0dXBUaW1lb3V0ID8/IHRoaXMuc2VydmVyU3RhcnR1cFRpbWVvdXRNcztcblxuICAgIHRoaXMuaXNQcm94eWluZ1RvUmVtb3RlU2VydmVyID0gISFjYXBzLndlYkRyaXZlckFnZW50TWFjVXJsO1xuXG4gICAgbGV0IHdhc1Byb2Nlc3NJbml0TmVjZXNzYXJ5O1xuICAgIGlmICh0aGlzLmlzUHJveHlpbmdUb1JlbW90ZVNlcnZlcikge1xuICAgICAgaWYgKHRoaXMucHJvY2Vzcykge1xuICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3Mua2lsbCgpO1xuICAgICAgICBhd2FpdCBjbGVhbnVwT2Jzb2xldGVQcm9jZXNzZXMoKTtcbiAgICAgICAgdGhpcy5wcm9jZXNzID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgd2FzUHJvY2Vzc0luaXROZWNlc3NhcnkgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLnByb2Nlc3MpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzID0gbmV3IFdEQU1hY1Byb2Nlc3MoKTtcbiAgICAgIH1cbiAgICAgIHdhc1Byb2Nlc3NJbml0TmVjZXNzYXJ5ID0gYXdhaXQgdGhpcy5wcm9jZXNzLmluaXQoY2Fwcyk7XG4gICAgfVxuXG4gICAgaWYgKHdhc1Byb2Nlc3NJbml0TmVjZXNzYXJ5IHx8IHRoaXMuaXNQcm94eWluZ1RvUmVtb3RlU2VydmVyIHx8ICF0aGlzLnByb3h5KSB7XG4gICAgICBjb25zdCB7c2NoZW1lLCBzZXJ2ZXIsIHBvcnQsIHBhdGh9ID0gdGhpcy5wYXJzZVByb3h5UHJvcGVydGllcyhjYXBzKTtcbiAgICAgIHRoaXMucHJveHkgPSBuZXcgV0RBTWFjUHJveHkoe1xuICAgICAgICBzY2hlbWUsXG4gICAgICAgIHNlcnZlcixcbiAgICAgICAgcG9ydCxcbiAgICAgICAgYmFzZTogcGF0aCxcbiAgICAgICAga2VlcEFsaXZlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnByb3h5LmRpZFByb2Nlc3NFeGl0ID0gZmFsc2U7XG5cbiAgICAgIGlmICh0aGlzLnByb2Nlc3MpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzLnByb2Mub24oJ2V4aXQnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wcm94eS5kaWRQcm9jZXNzRXhpdCA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmlzUHJveHlSZWFkeSgpLCB7XG4gICAgICAgICAgd2FpdE1zOiB0aGlzLnNlcnZlclN0YXJ0dXBUaW1lb3V0TXMsXG4gICAgICAgICAgaW50ZXJ2YWxNczogMTAwMCxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICh0aGlzLnByb2Nlc3M/LmlzUnVubmluZykge1xuICAgICAgICAgIC8vIGF2b2lkIFwiZnJvemVuXCIgcHJvY2Vzc2VzLFxuICAgICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzcy5raWxsKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKC9Db25kaXRpb24gdW5tZXQvLnRlc3QoZS5tZXNzYWdlKSkge1xuICAgICAgICAgIGNvbnN0IG1zZyA9IHRoaXMuaXNQcm94eWluZ1RvUmVtb3RlU2VydmVyXG4gICAgICAgICAgICA/IGBObyByZXNwb25zZSBmcm9tICcke3NjaGVtZX06Ly8ke3NlcnZlcn06JHtwb3J0fSR7cGF0aH0nIHdpdGhpbiAke3RoaXMuc2VydmVyU3RhcnR1cFRpbWVvdXRNc31tcyB0aW1lb3V0LmAgK1xuICAgICAgICAgICAgYFBsZWFzZSBtYWtlIHN1cmUgdGhlIHJlbW90ZSBzZXJ2ZXIgaXMgcnVubmluZyBhbmQgYWNjZXNzaWJsZSBieSBBcHBpdW1gXG4gICAgICAgICAgICA6IGBNYWMyRHJpdmVyIHNlcnZlciBpcyBub3QgbGlzdGVuaW5nIHdpdGhpbiAke3RoaXMuc2VydmVyU3RhcnR1cFRpbWVvdXRNc31tcyB0aW1lb3V0LiBgICtcbiAgICAgICAgICAgIGBUcnkgdG8gaW5jcmVhc2UgdGhlIHZhbHVlIG9mICdzZXJ2ZXJTdGFydHVwVGltZW91dCcgY2FwYWJpbGl0eSwgY2hlY2sgdGhlIHNlcnZlciBsb2dzIGAgK1xuICAgICAgICAgICAgYGFuZCBtYWtlIHN1cmUgdGhlICR7WENPREVCVUlMRH0gaG9zdCBwcm9jZXNzIGNvdWxkIGJlIHN0YXJ0ZWQgbWFudWFsbHkgZnJvbSBhIHRlcm1pbmFsYDtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wcm9jZXNzKSB7XG4gICAgICAgIGNvbnN0IHBpZCA9IHRoaXMucHJvY2Vzcy5waWQ7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuUGlkcyA9IGF3YWl0IHRoaXMucHJvY2Vzcy5saXN0Q2hpbGRyZW5QaWRzKCk7XG4gICAgICAgIFJVTk5JTkdfUFJPQ0VTU19JRFMucHVzaCguLi5jaGlsZHJlblBpZHMsIHBpZCk7XG4gICAgICAgIHRoaXMucHJvY2Vzcy5wcm9jLm9uKCdleGl0JywgKCkgPT4gdm9pZCBfLnB1bGwoUlVOTklOR19QUk9DRVNTX0lEUywgcGlkKSk7XG4gICAgICAgIGxvZy5pbmZvKGBUaGUgaG9zdCBwcm9jZXNzIGlzIHJlYWR5IHdpdGhpbiAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuaW5mbygnVGhlIGhvc3QgcHJvY2VzcyBoYXMgYWxyZWFkeSBiZWVuIGxpc3RlbmluZy4gUHJvY2VlZGluZyB3aXRoIHNlc3Npb24gY3JlYXRpb24nKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnByb3h5LmNvbW1hbmQoJy9zZXNzaW9uJywgJ1BPU1QnLCB7XG4gICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgZmlyc3RNYXRjaDogW3t9XSxcbiAgICAgICAgYWx3YXlzTWF0Y2g6IGNhcHMsXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzdG9wU2Vzc2lvbiAoKSB7XG4gICAgaWYgKCF0aGlzLmlzUHJveHlpbmdUb1JlbW90ZVNlcnZlciAmJiAhKHRoaXMucHJvY2Vzcz8uaXNSdW5uaW5nKSkge1xuICAgICAgbG9nLmluZm8oYE1hYzJEcml2ZXIgc2Vzc2lvbiBjYW5ub3QgYmUgc3RvcHBlZCwgYmVjYXVzZSB0aGUgc2VydmVyIGlzIG5vdCBydW5uaW5nYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJveHk/LnNlc3Npb25JZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm94eS5jb21tYW5kKGAvc2Vzc2lvbi8ke3RoaXMucHJveHkuc2Vzc2lvbklkfWAsICdERUxFVEUnKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nLmluZm8oYE1hYzJEcml2ZXIgc2Vzc2lvbiBjYW5ub3QgYmUgZGVsZXRlZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBXREFfTUFDX1NFUlZFUiA9IG5ldyBXREFNYWNTZXJ2ZXIoKTtcblxuZXhwb3J0IGRlZmF1bHQgV0RBX01BQ19TRVJWRVI7XG4iXSwibWFwcGluZ3MiOiI7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
|