appium-espresso-driver 2.2.0 → 2.2.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/README.md +3 -2
- package/build/index.js +1 -1
- package/build/lib/commands/execute.js +1 -1
- package/build/lib/commands/general.js +9 -15
- package/build/lib/commands/idling-resources.js +1 -1
- package/build/lib/commands/index.js +1 -1
- package/build/lib/commands/services.js +1 -1
- package/build/lib/desired-caps.js +1 -1
- package/build/lib/driver.js +32 -47
- package/build/lib/espresso-runner.js +41 -66
- package/build/lib/logger.js +1 -1
- package/build/lib/server-builder.js +11 -20
- package/build/lib/server.js +1 -1
- package/build/lib/utils.js +1 -1
- package/espresso-server/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk +0 -0
- package/lib/commands/general.js +6 -9
- package/lib/driver.js +31 -32
- package/lib/espresso-runner.js +40 -39
- package/lib/server-builder.js +10 -12
- package/npm-shrinkwrap.json +1842 -1614
- package/package.json +3 -3
|
@@ -13,8 +13,6 @@ var _baseDriver = require("@appium/base-driver");
|
|
|
13
13
|
|
|
14
14
|
var _asyncbox = require("asyncbox");
|
|
15
15
|
|
|
16
|
-
var _logger = _interopRequireDefault(require("./logger"));
|
|
17
|
-
|
|
18
16
|
var _serverBuilder = require("./server-builder");
|
|
19
17
|
|
|
20
18
|
var _path = _interopRequireDefault(require("path"));
|
|
@@ -57,7 +55,7 @@ class EspressoProxy extends _baseDriver.JWProxy {
|
|
|
57
55
|
}
|
|
58
56
|
|
|
59
57
|
class EspressoRunner {
|
|
60
|
-
constructor(opts = {}) {
|
|
58
|
+
constructor(log, opts = {}) {
|
|
61
59
|
for (let req of REQUIRED_PARAMS) {
|
|
62
60
|
if (!opts || !_support.util.hasValue(opts[req])) {
|
|
63
61
|
throw new Error(`Option '${req}' is required!`);
|
|
@@ -66,7 +64,9 @@ class EspressoRunner {
|
|
|
66
64
|
this[req] = opts[req];
|
|
67
65
|
}
|
|
68
66
|
|
|
67
|
+
this.log = log;
|
|
69
68
|
this.jwproxy = new EspressoProxy({
|
|
69
|
+
log,
|
|
70
70
|
server: this.host,
|
|
71
71
|
port: this.systemPort,
|
|
72
72
|
base: '',
|
|
@@ -104,15 +104,12 @@ class EspressoRunner {
|
|
|
104
104
|
|
|
105
105
|
async isAppPackageChanged() {
|
|
106
106
|
if (!(await this.adb.fileExists(TARGET_PACKAGE_CONTAINER))) {
|
|
107
|
-
|
|
108
|
-
|
|
107
|
+
this.log.debug('The previous target application package is unknown');
|
|
109
108
|
return true;
|
|
110
109
|
}
|
|
111
110
|
|
|
112
111
|
const previousAppPackage = (await this.adb.shell(['cat', TARGET_PACKAGE_CONTAINER])).trim();
|
|
113
|
-
|
|
114
|
-
_logger.default.debug(`The previous target application package was '${previousAppPackage}'. ` + `The current package is '${this.appPackage}'`);
|
|
115
|
-
|
|
112
|
+
this.log.debug(`The previous target application package was '${previousAppPackage}'. ` + `The current package is '${this.appPackage}'`);
|
|
116
113
|
return previousAppPackage !== this.appPackage;
|
|
117
114
|
}
|
|
118
115
|
|
|
@@ -122,27 +119,26 @@ class EspressoRunner {
|
|
|
122
119
|
const shouldInstallApp = shouldUninstallApp || [this.adb.APP_INSTALL_STATE.NOT_INSTALLED].includes(appState);
|
|
123
120
|
|
|
124
121
|
if (shouldUninstallApp) {
|
|
125
|
-
|
|
122
|
+
this.log.info(`Uninstalling Espresso Test Server apk from the target device (pkg: '${TEST_APK_PKG}')`);
|
|
126
123
|
|
|
127
124
|
try {
|
|
128
125
|
await this.adb.uninstallApk(TEST_APK_PKG);
|
|
129
126
|
} catch (err) {
|
|
130
|
-
|
|
127
|
+
this.log.warn(`Error uninstalling '${TEST_APK_PKG}': ${err.message}`);
|
|
131
128
|
}
|
|
132
129
|
}
|
|
133
130
|
|
|
134
131
|
if (shouldInstallApp) {
|
|
135
|
-
|
|
132
|
+
this.log.info(`Installing Espresso Test Server apk from the target device (path: '${this.modServerPath}')`);
|
|
136
133
|
|
|
137
134
|
try {
|
|
138
135
|
await this.adb.install(this.modServerPath, {
|
|
139
136
|
replace: false,
|
|
140
137
|
timeout: this.androidInstallTimeout
|
|
141
138
|
});
|
|
142
|
-
|
|
143
|
-
_logger.default.info(`Installed Espresso Test Server apk '${this.modServerPath}' (pkg: '${TEST_APK_PKG}')`);
|
|
139
|
+
this.log.info(`Installed Espresso Test Server apk '${this.modServerPath}' (pkg: '${TEST_APK_PKG}')`);
|
|
144
140
|
} catch (err) {
|
|
145
|
-
|
|
141
|
+
this.log.errorAndThrow(`Cannot install '${this.modServerPath}' because of '${err.message}'`);
|
|
146
142
|
}
|
|
147
143
|
}
|
|
148
144
|
}
|
|
@@ -151,16 +147,14 @@ class EspressoRunner {
|
|
|
151
147
|
let rebuild = this.forceEspressoRebuild;
|
|
152
148
|
|
|
153
149
|
if (rebuild) {
|
|
154
|
-
|
|
150
|
+
this.log.debug(`'forceEspressoRebuild' capability is enabled`);
|
|
155
151
|
} else if (await this.isAppPackageChanged()) {
|
|
156
|
-
|
|
157
|
-
|
|
152
|
+
this.log.info(`Forcing Espresso server rebuild because of changed application package`);
|
|
158
153
|
rebuild = true;
|
|
159
154
|
}
|
|
160
155
|
|
|
161
156
|
if (rebuild && (await _support.fs.exists(this.modServerPath))) {
|
|
162
|
-
|
|
163
|
-
|
|
157
|
+
this.log.debug(`Deleting the obsolete Espresso server package '${this.modServerPath}'`);
|
|
164
158
|
await _support.fs.unlink(this.modServerPath);
|
|
165
159
|
}
|
|
166
160
|
|
|
@@ -175,7 +169,7 @@ class EspressoRunner {
|
|
|
175
169
|
}
|
|
176
170
|
|
|
177
171
|
if ((rebuild || !isSigned) && (await this.adb.uninstallApk(TEST_APK_PKG))) {
|
|
178
|
-
|
|
172
|
+
this.log.info('Uninstalled the obsolete Espresso server package from the device under test');
|
|
179
173
|
}
|
|
180
174
|
|
|
181
175
|
await this.installServer();
|
|
@@ -188,20 +182,17 @@ class EspressoRunner {
|
|
|
188
182
|
let buildConfigurationStr;
|
|
189
183
|
|
|
190
184
|
if (await _support.fs.exists(this.espressoBuildConfig)) {
|
|
191
|
-
|
|
192
|
-
|
|
185
|
+
this.log.info(`Loading the build configuration from '${this.espressoBuildConfig}'`);
|
|
193
186
|
buildConfigurationStr = await _support.fs.readFile(this.espressoBuildConfig, 'utf8');
|
|
194
187
|
} else {
|
|
195
|
-
|
|
196
|
-
|
|
188
|
+
this.log.info(`Loading the build configuration from 'espressoBuildConfig' capability`);
|
|
197
189
|
buildConfigurationStr = this.espressoBuildConfig;
|
|
198
190
|
}
|
|
199
191
|
|
|
200
192
|
try {
|
|
201
193
|
buildConfiguration = JSON.parse(buildConfigurationStr);
|
|
202
194
|
} catch (e) {
|
|
203
|
-
|
|
204
|
-
|
|
195
|
+
this.log.error('Cannot parse the build configuration JSON', e);
|
|
205
196
|
throw e;
|
|
206
197
|
}
|
|
207
198
|
}
|
|
@@ -212,20 +203,14 @@ class EspressoRunner {
|
|
|
212
203
|
|
|
213
204
|
const serverPath = _path.default.resolve(this.tmpDir, dirName);
|
|
214
205
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
_logger.default.debug(`The build folder root could be customized by changing the 'tmpDir' capability`);
|
|
218
|
-
|
|
206
|
+
this.log.info(`Building espresso server in '${serverPath}'`);
|
|
207
|
+
this.log.debug(`The build folder root could be customized by changing the 'tmpDir' capability`);
|
|
219
208
|
await _support.fs.rimraf(serverPath);
|
|
220
209
|
await (0, _support.mkdirp)(serverPath);
|
|
221
|
-
|
|
222
|
-
_logger.default.debug(`Copying espresso server template from ('${TEST_SERVER_ROOT}' to '${serverPath}')`);
|
|
223
|
-
|
|
210
|
+
this.log.debug(`Copying espresso server template from ('${TEST_SERVER_ROOT}' to '${serverPath}')`);
|
|
224
211
|
await (0, _utils.copyGradleProjectRecursively)(TEST_SERVER_ROOT, serverPath);
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
await new _serverBuilder.ServerBuilder({
|
|
212
|
+
this.log.debug('Bulding espresso server');
|
|
213
|
+
await new _serverBuilder.ServerBuilder(this.log, {
|
|
229
214
|
serverPath,
|
|
230
215
|
buildConfiguration,
|
|
231
216
|
showGradleLog: this.showGradleLog,
|
|
@@ -235,13 +220,12 @@ class EspressoRunner {
|
|
|
235
220
|
|
|
236
221
|
const apkPath = _path.default.resolve(serverPath, 'app', 'build', 'outputs', 'apk', 'androidTest', 'debug', 'app-debug-androidTest.apk');
|
|
237
222
|
|
|
238
|
-
|
|
239
|
-
|
|
223
|
+
this.log.debug(`Copying built apk from '${apkPath}' to '${this.modServerPath}'`);
|
|
240
224
|
await _support.fs.copyFile(apkPath, this.modServerPath);
|
|
241
225
|
}
|
|
242
226
|
|
|
243
227
|
async cleanupSessionLeftovers() {
|
|
244
|
-
|
|
228
|
+
this.log.debug('Performing cleanup of automation leftovers');
|
|
245
229
|
|
|
246
230
|
try {
|
|
247
231
|
const {
|
|
@@ -253,20 +237,18 @@ class EspressoRunner {
|
|
|
253
237
|
const activeSessionIds = value.map(sess => sess.id);
|
|
254
238
|
|
|
255
239
|
if (activeSessionIds.length) {
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
_logger.default.debug('Cleaning up the obsolete sessions');
|
|
259
|
-
|
|
240
|
+
this.log.debug(`The following obsolete sessions are still running: ${JSON.stringify(activeSessionIds)}`);
|
|
241
|
+
this.log.debug('Cleaning up the obsolete sessions');
|
|
260
242
|
await _bluebird.default.all(activeSessionIds.map(id => (0, _axios.default)({
|
|
261
243
|
url: `http://${this.host}:${this.systemPort}/session/${id}`,
|
|
262
244
|
method: 'DELETE'
|
|
263
245
|
})));
|
|
264
246
|
await _bluebird.default.delay(1000);
|
|
265
247
|
} else {
|
|
266
|
-
|
|
248
|
+
this.log.debug('No obsolete sessions have been detected');
|
|
267
249
|
}
|
|
268
250
|
} catch (e) {
|
|
269
|
-
|
|
251
|
+
this.log.debug(`No obsolete sessions have been detected (${e.message})`);
|
|
270
252
|
}
|
|
271
253
|
}
|
|
272
254
|
|
|
@@ -279,9 +261,7 @@ class EspressoRunner {
|
|
|
279
261
|
}
|
|
280
262
|
|
|
281
263
|
cmd.push(`${TEST_APK_PKG}/androidx.test.runner.AndroidJUnitRunner`);
|
|
282
|
-
|
|
283
|
-
_logger.default.info(`Starting Espresso Server v${_package.version} with cmd: adb ${cmd.join(' ')}`);
|
|
284
|
-
|
|
264
|
+
this.log.info(`Starting Espresso Server v${_package.version} with cmd: adb ${cmd.join(' ')}`);
|
|
285
265
|
let hasSocketError = false;
|
|
286
266
|
this.jwproxy.instrumentationState = {
|
|
287
267
|
exited: false,
|
|
@@ -289,8 +269,7 @@ class EspressoRunner {
|
|
|
289
269
|
};
|
|
290
270
|
this.instProcess = this.adb.createSubProcess(cmd);
|
|
291
271
|
this.instProcess.on('exit', (code, signal) => {
|
|
292
|
-
|
|
293
|
-
|
|
272
|
+
this.log.info(`Instrumentation process exited with code ${code} from signal ${signal}`);
|
|
294
273
|
this.jwproxy.instrumentationState.exited = true;
|
|
295
274
|
});
|
|
296
275
|
this.instProcess.on('output', (stdout, stderr) => {
|
|
@@ -300,7 +279,7 @@ class EspressoRunner {
|
|
|
300
279
|
return;
|
|
301
280
|
}
|
|
302
281
|
|
|
303
|
-
|
|
282
|
+
this.log.debug(`[Instrumentation] ${line.trim()}`);
|
|
304
283
|
|
|
305
284
|
if (line.toLowerCase().includes('java.net.socketexception')) {
|
|
306
285
|
hasSocketError = true;
|
|
@@ -310,15 +289,14 @@ class EspressoRunner {
|
|
|
310
289
|
});
|
|
311
290
|
const timer = new _support.timing.Timer().start();
|
|
312
291
|
await this.instProcess.start(0);
|
|
313
|
-
|
|
314
|
-
_logger.default.info(`Waiting up to ${this.serverLaunchTimeout}ms for Espresso server to be online`);
|
|
292
|
+
this.log.info(`Waiting up to ${this.serverLaunchTimeout}ms for Espresso server to be online`);
|
|
315
293
|
|
|
316
294
|
try {
|
|
317
295
|
await (0, _asyncbox.waitForCondition)(async () => {
|
|
318
296
|
if (hasSocketError) {
|
|
319
|
-
|
|
297
|
+
this.log.errorAndThrow(`Espresso server has failed to start due to an unexpected exception. ` + `Make sure the 'INTERNET' permission is requested in the Android manifest of your ` + `application under test (<uses-permission android:name="android.permission.INTERNET" />)`);
|
|
320
298
|
} else if (this.jwproxy.instrumentationState.exited) {
|
|
321
|
-
|
|
299
|
+
this.log.errorAndThrow(`Espresso server process has been unexpectedly terminated. ` + `Check the Appium server log and the logcat output for more details`);
|
|
322
300
|
}
|
|
323
301
|
|
|
324
302
|
try {
|
|
@@ -333,16 +311,14 @@ class EspressoRunner {
|
|
|
333
311
|
});
|
|
334
312
|
} catch (e) {
|
|
335
313
|
if (/Condition unmet/.test(e.message)) {
|
|
336
|
-
|
|
314
|
+
this.log.errorAndThrow(`Timed out waiting for Espresso server to be ` + `online within ${this.serverLaunchTimeout}ms. The timeout value could be ` + `customized using 'espressoServerLaunchTimeout' capability`);
|
|
337
315
|
}
|
|
338
316
|
|
|
339
317
|
throw e;
|
|
340
318
|
}
|
|
341
319
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
_logger.default.info('Starting the session');
|
|
345
|
-
|
|
320
|
+
this.log.info(`Espresso server is online. ` + `The initialization process took ${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);
|
|
321
|
+
this.log.info('Starting the session');
|
|
346
322
|
await this.jwproxy.command('/session', 'POST', {
|
|
347
323
|
capabilities: {
|
|
348
324
|
firstMatch: [caps],
|
|
@@ -354,17 +330,16 @@ class EspressoRunner {
|
|
|
354
330
|
|
|
355
331
|
async recordTargetAppPackage() {
|
|
356
332
|
await this.adb.shell([`echo "${this.appPackage}" > "${TARGET_PACKAGE_CONTAINER}"`]);
|
|
357
|
-
|
|
358
|
-
_logger.default.info(`Recorded the target application package '${this.appPackage}' to ${TARGET_PACKAGE_CONTAINER}`);
|
|
333
|
+
this.log.info(`Recorded the target application package '${this.appPackage}' to ${TARGET_PACKAGE_CONTAINER}`);
|
|
359
334
|
}
|
|
360
335
|
|
|
361
336
|
async deleteSession() {
|
|
362
|
-
|
|
337
|
+
this.log.debug('Deleting Espresso server session');
|
|
363
338
|
|
|
364
339
|
try {
|
|
365
340
|
await this.jwproxy.command('/', 'DELETE');
|
|
366
341
|
} catch (err) {
|
|
367
|
-
|
|
342
|
+
this.log.warn(`Did not get confirmation Espresso deleteSession worked; ` + `Error was: ${err}`);
|
|
368
343
|
}
|
|
369
344
|
|
|
370
345
|
if (this.instProcess && this.instProcess.isRunning) {
|
|
@@ -379,4 +354,4 @@ var _default = EspressoRunner;
|
|
|
379
354
|
exports.default = _default;require('source-map-support').install();
|
|
380
355
|
|
|
381
356
|
|
|
382
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9lc3ByZXNzby1ydW5uZXIuanMiXSwibmFtZXMiOlsiVEVTVF9TRVJWRVJfUk9PVCIsInBhdGgiLCJyZXNvbHZlIiwiX19kaXJuYW1lIiwiVEVTVF9BUEtfUEtHIiwiUkVRVUlSRURfUEFSQU1TIiwiRVNQUkVTU09fU0VSVkVSX0xBVU5DSF9USU1FT1VUX01TIiwiVEFSR0VUX1BBQ0tBR0VfQ09OVEFJTkVSIiwiRXNwcmVzc29Qcm94eSIsIkpXUHJveHkiLCJwcm94eUNvbW1hbmQiLCJ1cmwiLCJtZXRob2QiLCJib2R5IiwiY3Jhc2hlZCIsImV4aXRlZCIsImluc3RydW1lbnRhdGlvblN0YXRlIiwiZXJyb3JzIiwiSW52YWxpZENvbnRleHRFcnJvciIsIkVzcHJlc3NvUnVubmVyIiwiY29uc3RydWN0b3IiLCJvcHRzIiwicmVxIiwidXRpbCIsImhhc1ZhbHVlIiwiRXJyb3IiLCJqd3Byb3h5Iiwic2VydmVyIiwiaG9zdCIsInBvcnQiLCJzeXN0ZW1Qb3J0IiwiYmFzZSIsImtlZXBBbGl2ZSIsInByb3h5UmVxUmVzIiwiYmluZCIsImNvbW1hbmQiLCJtb2RTZXJ2ZXJOYW1lIiwiZnMiLCJzYW5pdGl6ZU5hbWUiLCJ2ZXJzaW9uIiwiYXBwUGFja2FnZSIsImFkYiIsImN1ckRldmljZUlkIiwicmVwbGFjZW1lbnQiLCJtb2RTZXJ2ZXJQYXRoIiwidG1wRGlyIiwic2hvd0dyYWRsZUxvZyIsImVzcHJlc3NvQnVpbGRDb25maWciLCJzZXJ2ZXJMYXVuY2hUaW1lb3V0IiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UiLCJ1c2VLZXlzdG9yZSIsImtleXN0b3JlUGF0aCIsImtleXN0b3JlUGFzc3dvcmQiLCJrZXlBbGlhcyIsImtleVBhc3N3b3JkIiwic2lnbmluZ0NvbmZpZyIsImtleXN0b3JlRmlsZSIsImlzQXBwUGFja2FnZUNoYW5nZWQiLCJmaWxlRXhpc3RzIiwibG9nZ2VyIiwiZGVidWciLCJwcmV2aW91c0FwcFBhY2thZ2UiLCJzaGVsbCIsInRyaW0iLCJpbnN0YWxsU2VydmVyIiwiYXBwU3RhdGUiLCJnZXRBcHBsaWNhdGlvbkluc3RhbGxTdGF0ZSIsInNob3VsZFVuaW5zdGFsbEFwcCIsIkFQUF9JTlNUQUxMX1NUQVRFIiwiT0xERVJfVkVSU0lPTl9JTlNUQUxMRUQiLCJORVdFUl9WRVJTSU9OX0lOU1RBTExFRCIsImluY2x1ZGVzIiwic2hvdWxkSW5zdGFsbEFwcCIsIk5PVF9JTlNUQUxMRUQiLCJpbmZvIiwidW5pbnN0YWxsQXBrIiwiZXJyIiwid2FybiIsIm1lc3NhZ2UiLCJpbnN0YWxsIiwicmVwbGFjZSIsInRpbWVvdXQiLCJlcnJvckFuZFRocm93IiwiaW5zdGFsbFRlc3RBcGsiLCJyZWJ1aWxkIiwiZm9yY2VFc3ByZXNzb1JlYnVpbGQiLCJleGlzdHMiLCJ1bmxpbmsiLCJidWlsZE5ld01vZFNlcnZlciIsImlzU2lnbmVkIiwiY2hlY2tBcGtDZXJ0Iiwic2lnbiIsImJ1aWxkQ29uZmlndXJhdGlvbiIsImJ1aWxkQ29uZmlndXJhdGlvblN0ciIsInJlYWRGaWxlIiwiSlNPTiIsInBhcnNlIiwiZSIsImVycm9yIiwiZGlyTmFtZSIsInNlcnZlclBhdGgiLCJyaW1yYWYiLCJTZXJ2ZXJCdWlsZGVyIiwidGVzdEFwcFBhY2thZ2UiLCJidWlsZCIsImFwa1BhdGgiLCJjb3B5RmlsZSIsImNsZWFudXBTZXNzaW9uTGVmdG92ZXJzIiwidmFsdWUiLCJkYXRhIiwiYWN0aXZlU2Vzc2lvbklkcyIsIm1hcCIsInNlc3MiLCJpZCIsImxlbmd0aCIsInN0cmluZ2lmeSIsIkIiLCJhbGwiLCJkZWxheSIsInN0YXJ0U2Vzc2lvbiIsImNhcHMiLCJjbWQiLCJwcm9jZXNzIiwiZW52IiwiRVNQUkVTU09fSkFWQV9ERUJVRyIsIl8iLCJpc0Jvb2xlYW4iLCJwdXNoIiwiam9pbiIsImhhc1NvY2tldEVycm9yIiwiaW5zdFByb2Nlc3MiLCJjcmVhdGVTdWJQcm9jZXNzIiwib24iLCJjb2RlIiwic2lnbmFsIiwic3Rkb3V0Iiwic3RkZXJyIiwibGluZSIsImlzRW1wdHkiLCJ0b0xvd2VyQ2FzZSIsInRpbWVyIiwidGltaW5nIiwiVGltZXIiLCJzdGFydCIsIndhaXRNcyIsImludGVydmFsTXMiLCJ0ZXN0IiwiZ2V0RHVyYXRpb24iLCJhc01pbGxpU2Vjb25kcyIsInRvRml4ZWQiLCJjYXBhYmlsaXRpZXMiLCJmaXJzdE1hdGNoIiwiYWx3YXlzTWF0Y2giLCJyZWNvcmRUYXJnZXRBcHBQYWNrYWdlIiwiZGVsZXRlU2Vzc2lvbiIsImlzUnVubmluZyIsInN0b3AiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsZ0JBQWdCLEdBQUdDLGNBQUtDLE9BQUwsQ0FBYUMsU0FBYixFQUF3QixJQUF4QixFQUE4QixJQUE5QixFQUFvQyxpQkFBcEMsQ0FBekI7O0FBQ0EsTUFBTUMsWUFBWSxHQUFHLCtCQUFyQjs7QUFDQSxNQUFNQyxlQUFlLEdBQUcsQ0FDdEIsS0FEc0IsRUFFdEIsUUFGc0IsRUFHdEIsTUFIc0IsRUFJdEIsWUFKc0IsRUFLdEIsWUFMc0IsRUFNdEIsWUFOc0IsRUFPdEIsc0JBUHNCLENBQXhCOztBQVNBLE1BQU1DLGlDQUFpQyxHQUFHLEtBQTFDO0FBQ0EsTUFBTUMsd0JBQXdCLEdBQUcscUNBQWpDOztBQUVBLE1BQU1DLGFBQU4sU0FBNEJDLG1CQUE1QixDQUFvQztBQUNoQixRQUFaQyxZQUFZLENBQUVDLEdBQUYsRUFBT0MsTUFBUCxFQUFlQyxJQUFJLEdBQUcsSUFBdEIsRUFBNEI7QUFDNUMsVUFBTTtBQUFDQyxNQUFBQSxPQUFEO0FBQVVDLE1BQUFBO0FBQVYsUUFBb0IsS0FBS0Msb0JBQS9COztBQUNBLFFBQUlELE1BQUosRUFBWTtBQUNWLFlBQU0sSUFBSUUsbUJBQU9DLG1CQUFYLENBQWdDLElBQUdOLE1BQU8sSUFBR0QsR0FBSSxpREFBbEIsR0FDbEMs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QTFELENBQWYsQ0FBTjs7QUFDQXFELG9CQUFPZSxJQUFQLENBQWEsNENBQTJDLEtBQUtuQyxVQUFXLFFBQU9qQyx3QkFBeUIsRUFBeEc7QUFDRDs7QUFFa0IsUUFBYm9KLGFBQWEsR0FBSTtBQUNyQi9GLG9CQUFPQyxLQUFQLENBQWEsa0NBQWI7O0FBR0EsUUFBSTtBQUNGLFlBQU0sS0FBS25DLE9BQUwsQ0FBYVMsT0FBYixDQUFxQixHQUFyQixFQUEwQixRQUExQixDQUFOO0FBQ0QsS0FGRCxDQUVFLE9BQU8wQyxHQUFQLEVBQVk7QUFDWmpCLHNCQUFPa0IsSUFBUCxDQUFhLDBEQUFELEdBQ1AsY0FBYUQsR0FBSSxFQUR0QjtBQUVEOztBQUVELFFBQUksS0FBS3NELFdBQUwsSUFBb0IsS0FBS0EsV0FBTCxDQUFpQnlCLFNBQXpDLEVBQW9EO0FBQ2xELFlBQU0sS0FBS3pCLFdBQUwsQ0FBaUIwQixJQUFqQixFQUFOO0FBQ0Q7QUFDRjs7QUF6U2tCOzs7ZUE2U04xSSxjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSldQcm94eSwgZXJyb3JzIH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBTZXJ2ZXJCdWlsZGVyLCBidWlsZFNlcnZlclNpZ25pbmdDb25maWcgfSBmcm9tICcuL3NlcnZlci1idWlsZGVyJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZnMsIHV0aWwsIG1rZGlycCwgdGltaW5nIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi8uLi9wYWNrYWdlLmpzb24nOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9uby11bnJlc29sdmVkXG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgY29weUdyYWRsZVByb2plY3RSZWN1cnNpdmVseSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcblxuXG5jb25zdCBURVNUX1NFUlZFUl9ST09UID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ2VzcHJlc3NvLXNlcnZlcicpO1xuY29uc3QgVEVTVF9BUEtfUEtHID0gJ2lvLmFwcGl1bS5lc3ByZXNzb3NlcnZlci50ZXN0JztcbmNvbnN0IFJFUVVJUkVEX1BBUkFNUyA9IFtcbiAgJ2FkYicsXG4gICd0bXBEaXInLFxuICAnaG9zdCcsXG4gICdzeXN0ZW1Qb3J0JyxcbiAgJ2RldmljZVBvcnQnLFxuICAnYXBwUGFja2FnZScsXG4gICdmb3JjZUVzcHJlc3NvUmVidWlsZCcsXG5dO1xuY29uc3QgRVNQUkVTU09fU0VSVkVSX0xBVU5DSF9USU1FT1VUX01TID0gNDUwMDA7XG5jb25zdCBUQVJHRVRfUEFDS0FHRV9DT05UQUlORVIgPSAnL2RhdGEvbG9jYWwvdG1wL2VzcHJlc3NvLmFwcHBhY2thZ2UnO1xuXG5jbGFzcyBFc3ByZXNzb1Byb3h5IGV4dGVuZHMgSldQcm94eSB7XG4gIGFzeW5jIHByb3h5Q29tbWFuZCAodXJsLCBtZXRob2QsIGJvZHkgPSBudWxsKSB7XG4gICAgY29uc3Qge2NyYXNoZWQsIGV4aXRlZH0gPSB0aGlzLmluc3RydW1lbnRhdGlvblN0YXRlO1xuICAgIGlmIChleGl0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZENvbnRleHRFcnJvcihgJyR7bWV0aG9kfSAke3VybH0nIGNhbm5vdCBiZSBwcm94aWVkIHRvIEVzcHJlc3NvIHNlcnZlciBiZWNhdXNlIGAgK1xuICAgICAgICBgdGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIGhhcyAke2NyYXNoZWQgPyAnY3Jhc2hlZCcgOiAnYmVlbiB1bmV4cGVjdGVkbHkgdGVybWluYXRlZCd9LiBgICtcbiAgICAgICAgYENoZWNrIHRoZSBBcHBpdW0gc2VydmVyIGxvZyBhbmQgdGhlIGxvZ2NhdCBvdXRwdXQgZm9yIG1vcmUgZGV0YWlsc2ApO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgc3VwZXIucHJveHlDb21tYW5kKHVybCwgbWV0aG9kLCBib2R5KTtcbiAgfVxufVxuXG5jbGFzcyBFc3ByZXNzb1J1bm5lciB7XG4gIGNvbnN0cnVjdG9yIChvcHRzID0ge30pIHtcbiAgICBmb3IgKGxldCByZXEgb2YgUkVRVUlSRURfUEFSQU1TKSB7XG4gICAgICBpZiAoIW9wdHMgfHwgIXV0aWwuaGFzVmFsdWUob3B0c1tyZXFdKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9wdGlvbiAnJHtyZXF9JyBpcyByZXF1aXJlZCFgKTtcbiAgICAgIH1cbiAgICAgIHRoaXNbcmVxXSA9IG9wdHNbcmVxXTtcbiAgICB9XG4gICAgdGhpcy5qd3Byb3h5ID0gbmV3IEVzcHJlc3NvUHJveHkoe1xuICAgICAgc2VydmVyOiB0aGlzLmhvc3QsXG4gICAgICBwb3J0OiB0aGlzLnN5c3RlbVBvcnQsXG4gICAgICBiYXNlOiAnJyxcbiAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5qd3Byb3h5LnByb3h5UmVxUmVzLmJpbmQodGhpcy5qd3Byb3h5KTtcbiAgICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuandwcm94eS5jb21tYW5kLmJpbmQodGhpcy5qd3Byb3h5KTtcbiAgICB0aGlzLmp3cHJveHkuaW5zdHJ1bWVudGF0aW9uU3RhdGUgPSB7XG4gICAgICBleGl0ZWQ6IGZhbHNlLFxuICAgICAgY3Jhc2hlZDogZmFsc2UsXG4gICAgfTtcblxuICAgIGNvbnN0IG1vZFNlcnZlck5hbWUgPSBmcy5zYW5pdGl6ZU5hbWUoYCR7VEVTVF9BUEtfUEtHfV8ke3ZlcnNpb259XyR7dGhpcy5hcHBQYWNrYWdlfV8ke3RoaXMuYWRiLmN1ckRldmljZUlkfS5hcGtgLCB7XG4gICAgICByZXBsYWNlbWVudDogJy0nLFxuICAgIH0pO1xuICAgIHRoaXMubW9kU2VydmVyUGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLnRtcERpciwgbW9kU2VydmVyTmFtZSk7XG4gICAgdGhpcy5zaG93R3JhZGxlTG9nID0gb3B0cy5zaG93R3JhZGxlTG9nO1xuICAgIHRoaXMuZXNwcmVzc29CdWlsZENvbmZpZyA9IG9wdHMuZXNwcmVzc29CdWlsZENvbmZpZztcblxuICAgIHRoaXMuc2VydmVyTGF1bmNoVGltZW91dCA9IG9wdHMuc2VydmVyTGF1bmNoVGltZW91dCB8fCBFU1BSRVNTT19TRVJWRVJfTEFVTkNIX1RJTUVPVVRfTVM7XG4gICAgdGhpcy5hbmRyb2lkSW5zdGFsbFRpbWVvdXQgPSBvcHRzLmFuZHJvaWRJbnN0YWxsVGltZW91dDtcblxuICAgIHRoaXMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UgPSBvcHRzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlO1xuXG4gICAgLy8gRXNwcmVzc28gU2VydmVyIGFwcCBuZWVkcyB0byBiZSBzaWduZWQgd2l0aCBzYW1lIGtleVN0b3JlIGFzIGFwcFBhY2thZ2VcbiAgICBpZiAob3B0cy51c2VLZXlzdG9yZSAmJiBvcHRzLmtleXN0b3JlUGF0aCAmJiBvcHRzLmtleXN0b3JlUGFzc3dvcmQgJiYgb3B0cy5rZXlBbGlhcyAmJiBvcHRzLmtleVBhc3N3b3JkKSB7XG4gICAgICB0aGlzLnNpZ25pbmdDb25maWcgPSBidWlsZFNlcnZlclNpZ25pbmdDb25maWcoe1xuICAgICAgICBrZXlzdG9yZUZpbGU6IG9wdHMua2V5c3RvcmVQYXRoLFxuICAgICAgICBrZXlzdG9yZVBhc3N3b3JkOiBvcHRzLmtleXN0b3JlUGFzc3dvcmQsXG4gICAgICAgIGtleUFsaWFzOiBvcHRzLmtleUFsaWFzLFxuICAgICAgICBrZXlQYXNzd29yZDogb3B0cy5rZXlQYXNzd29yZFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2lnbmluZ0NvbmZpZyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaXNBcHBQYWNrYWdlQ2hhbmdlZCAoKSB7XG4gICAgaWYgKCFhd2FpdCB0aGlzLmFkYi5maWxlRXhpc3RzKFRBUkdFVF9QQUNLQUdFX0NPTlRBSU5FUikpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnVGhlIHByZXZpb3VzIHRhcmdldCBhcHBsaWNhdGlvbiBwYWNrYWdlIGlzIHVua25vd24nKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwcmV2aW91c0FwcFBhY2thZ2UgPSAoYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydjYXQnLCBUQVJHRVRfUEFDS0FHRV9DT05UQUlORVJdKSkudHJpbSgpO1xuICAgIGxvZ2dlci5kZWJ1ZyhgVGhlIHByZXZpb3VzIHRhcmdldCBhcHBsaWNhdGlvbiBwYWNrYWdlIHdhcyAnJHtwcmV2aW91c0FwcFBhY2thZ2V9Jy4gYCArXG4gICAgICBgVGhlIGN1cnJlbnQgcGFja2FnZSBpcyAnJHt0aGlzLmFwcFBhY2thZ2V9J2ApO1xuICAgIHJldHVybiBwcmV2aW91c0FwcFBhY2thZ2UgIT09IHRoaXMuYXBwUGFja2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxscyBFc3ByZXNzbyBzZXJ2ZXIgYXBrIG9uIHRvIHRoZSBkZXZpY2Ugb3IgZW11bGF0b3IuXG4gICAqIEVhY2ggYWRiIGNvbW1hbmQgdXNlcyBkZWZhdWx0IHRpbWVvdXQgYnkgdGhlbS5cbiAgICovXG4gIGFzeW5jIGluc3RhbGxTZXJ2ZXIgKCkge1xuICAgIGNvbnN0IGFwcFN0YXRlID0gYXdhaXQgdGhpcy5hZGIuZ2V0QXBwbGljYXRpb25JbnN0YWxsU3RhdGUodGhpcy5tb2RTZXJ2ZXJQYXRoLCBURVNUX0FQS19QS0cpO1xuXG4gICAgY29uc3Qgc2hvdWxkVW5pbnN0YWxsQXBwID0gW1xuICAgICAgdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuT0xERVJfVkVSU0lPTl9JTlNUQUxMRUQsXG4gICAgICB0aGlzLmFkYi5BUFBfSU5TVEFMTF9TVEFURS5ORVdFUl9WRVJTSU9OX0lOU1RBTExFRFxuICAgIF0uaW5jbHVkZXMoYXBwU3RhdGUpO1xuICAgIGNvbnN0IHNob3VsZEluc3RhbGxBcHAgPSBzaG91bGRVbmluc3RhbGxBcHAgfHwgW1xuICAgICAgdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuTk9UX0lOU1RBTExFRFxuICAgIF0uaW5jbHVkZXMoYXBwU3RhdGUpO1xuXG4gICAgaWYgKHNob3VsZFVuaW5zdGFsbEFwcCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFVuaW5zdGFsbGluZyBFc3ByZXNzbyBUZXN0IFNlcnZlciBhcGsgZnJvbSB0aGUgdGFyZ2V0IGRldmljZSAocGtnOiAnJHtURVNUX0FQS19QS0d9JylgKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayhURVNUX0FQS19QS0cpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBFcnJvciB1bmluc3RhbGxpbmcgJyR7VEVTVF9BUEtfUEtHfSc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZEluc3RhbGxBcHApIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBJbnN0YWxsaW5nIEVzcHJlc3NvIFRlc3QgU2VydmVyIGFwayBmcm9tIHRoZSB0YXJnZXQgZGV2aWNlIChwYXRoOiAnJHt0aGlzLm1vZFNlcnZlclBhdGh9JylgKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmluc3RhbGwodGhpcy5tb2RTZXJ2ZXJQYXRoLCB7IHJlcGxhY2U6IGZhbHNlLCB0aW1lb3V0OiB0aGlzLmFuZHJvaWRJbnN0YWxsVGltZW91dCB9KTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYEluc3RhbGxlZCBFc3ByZXNzbyBUZXN0IFNlcnZlciBhcGsgJyR7dGhpcy5tb2RTZXJ2ZXJQYXRofScgKHBrZzogJyR7VEVTVF9BUEtfUEtHfScpYCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYENhbm5vdCBpbnN0YWxsICcke3RoaXMubW9kU2VydmVyUGF0aH0nIGJlY2F1c2Ugb2YgJyR7ZXJyLm1lc3NhZ2V9J2ApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGluc3RhbGxUZXN0QXBrICgpIHtcbiAgICBsZXQgcmVidWlsZCA9IHRoaXMuZm9yY2VFc3ByZXNzb1JlYnVpbGQ7XG4gICAgaWYgKHJlYnVpbGQpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgJ2ZvcmNlRXNwcmVzc29SZWJ1aWxkJyBjYXBhYmlsaXR5IGlzIGVuYWJsZWRgKTtcbiAgICB9IGVsc2UgaWYgKGF3YWl0IHRoaXMuaXNBcHBQYWNrYWdlQ2hhbmdlZCgpKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgRm9yY2luZyBFc3ByZXNzbyBzZXJ2ZXIgcmVidWlsZCBiZWNhdXNlIG9mIGNoYW5nZWQgYXBwbGljYXRpb24gcGFja2FnZWApO1xuICAgICAgcmVidWlsZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHJlYnVpbGQgJiYgYXdhaXQgZnMuZXhpc3RzKHRoaXMubW9kU2VydmVyUGF0aCkpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgRGVsZXRpbmcgdGhlIG9ic29sZXRlIEVzcHJlc3NvIHNlcnZlciBwYWNrYWdlICcke3RoaXMubW9kU2VydmVyUGF0aH0nYCk7XG4gICAgICBhd2FpdCBmcy51bmxpbmsodGhpcy5tb2RTZXJ2ZXJQYXRoKTtcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKHRoaXMubW9kU2VydmVyUGF0aCkpKSB7XG4gICAgICBhd2FpdCB0aGlzLmJ1aWxkTmV3TW9kU2VydmVyKCk7XG4gICAgfVxuICAgIGNvbnN0IGlzU2lnbmVkID0gYXdhaXQgdGhpcy5hZGIuY2hlY2tBcGtDZXJ0KHRoaXMubW9kU2VydmVyUGF0aCwgVEVTVF9BUEtfUEtHKTtcbiAgICBpZiAoIWlzU2lnbmVkKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zaWduKHRoaXMubW9kU2VydmVyUGF0aCk7XG4gICAgfVxuICAgIGlmICgocmVidWlsZCB8fCAhaXNTaWduZWQpICYmIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayhURVNUX0FQS19QS0cpKSB7XG4gICAgICBsb2dnZXIuaW5mbygnVW5pbnN0YWxsZWQgdGhlIG9ic29sZXRlIEVzcHJlc3NvIHNlcnZlciBwYWNrYWdlIGZyb20gdGhlIGRldmljZSB1bmRlciB0ZXN0Jyk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5pbnN0YWxsU2VydmVyKCk7XG4gIH1cblxuICBhc3luYyBidWlsZE5ld01vZFNlcnZlciAoKSB7XG4gICAgbGV0IGJ1aWxkQ29uZmlndXJhdGlvbiA9IHt9O1xuICAgIGlmICh0aGlzLmVzcHJlc3NvQnVpbGRDb25maWcpIHtcbiAgICAgIGxldCBidWlsZENvbmZpZ3VyYXRpb25TdHI7XG4gICAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKHRoaXMuZXNwcmVzc29CdWlsZENvbmZpZykpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYExvYWRpbmcgdGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb24gZnJvbSAnJHt0aGlzLmVzcHJlc3NvQnVpbGRDb25maWd9J2ApO1xuICAgICAgICBidWlsZENvbmZpZ3VyYXRpb25TdHIgPSBhd2FpdCBmcy5yZWFkRmlsZSh0aGlzLmVzcHJlc3NvQnVpbGRDb25maWcsICd1dGY4Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuaW5mbyhgTG9hZGluZyB0aGUgYnVpbGQgY29uZmlndXJhdGlvbiBmcm9tICdlc3ByZXNzb0J1aWxkQ29uZmlnJyBjYXBhYmlsaXR5YCk7XG4gICAgICAgIGJ1aWxkQ29uZmlndXJhdGlvblN0ciA9IHRoaXMuZXNwcmVzc29CdWlsZENvbmZpZztcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbiA9IEpTT04ucGFyc2UoYnVpbGRDb25maWd1cmF0aW9uU3RyKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdDYW5ub3QgcGFyc2UgdGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb24gSlNPTicsIGUpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkaXJOYW1lID0gZnMuc2FuaXRpemVOYW1lKGBlc3ByZXNzby1zZXJ2ZXItJHt0aGlzLmFkYi5jdXJEZXZpY2VJZH1gLCB7XG4gICAgICByZXBsYWNlbWVudDogJy0nLFxuICAgIH0pO1xuICAgIGNvbnN0IHNlcnZlclBhdGggPSBwYXRoLnJlc29sdmUodGhpcy50bXBEaXIsIGRpck5hbWUpO1xuICAgIGxvZ2dlci5pbmZvKGBCdWlsZGluZyBlc3ByZXNzbyBzZXJ2ZXIgaW4gJyR7c2VydmVyUGF0aH0nYCk7XG4gICAgbG9nZ2VyLmRlYnVnKGBUaGUgYnVpbGQgZm9sZGVyIHJvb3QgY291bGQgYmUgY3VzdG9taXplZCBieSBjaGFuZ2luZyB0aGUgJ3RtcERpcicgY2FwYWJpbGl0eWApO1xuICAgIGF3YWl0IGZzLnJpbXJhZihzZXJ2ZXJQYXRoKTtcbiAgICBhd2FpdCBta2RpcnAoc2VydmVyUGF0aCk7XG4gICAgbG9nZ2VyLmRlYnVnKGBDb3B5aW5nIGVzcHJlc3NvIHNlcnZlciB0ZW1wbGF0ZSBmcm9tICgnJHtURVNUX1NFUlZFUl9ST09UfScgdG8gJyR7c2VydmVyUGF0aH0nKWApO1xuICAgIGF3YWl0IGNvcHlHcmFkbGVQcm9qZWN0UmVjdXJzaXZlbHkoVEVTVF9TRVJWRVJfUk9PVCwgc2VydmVyUGF0aCk7XG4gICAgbG9nZ2VyLmRlYnVnKCdCdWxkaW5nIGVzcHJlc3NvIHNlcnZlcicpO1xuICAgIGF3YWl0IG5ldyBTZXJ2ZXJCdWlsZGVyKHtcbiAgICAgIHNlcnZlclBhdGgsIGJ1aWxkQ29uZmlndXJhdGlvbixcbiAgICAgIHNob3dHcmFkbGVMb2c6IHRoaXMuc2hvd0dyYWRsZUxvZyxcbiAgICAgIHRlc3RBcHBQYWNrYWdlOiB0aGlzLmFwcFBhY2thZ2UsXG4gICAgICBzaWduaW5nQ29uZmlnOiB0aGlzLnNpZ25pbmdDb25maWdcbiAgICB9KS5idWlsZCgpO1xuICAgIGNvbnN0IGFwa1BhdGggPSBwYXRoLnJlc29sdmUoc2VydmVyUGF0aCwgJ2FwcCcsICdidWlsZCcsICdvdXRwdXRzJywgJ2FwaycsICdhbmRyb2lkVGVzdCcsICdkZWJ1ZycsICdhcHAtZGVidWctYW5kcm9pZFRlc3QuYXBrJyk7XG4gICAgbG9nZ2VyLmRlYnVnKGBDb3B5aW5nIGJ1aWx0IGFwayBmcm9tICcke2Fwa1BhdGh9JyB0byAnJHt0aGlzLm1vZFNlcnZlclBhdGh9J2ApO1xuICAgIGF3YWl0IGZzLmNvcHlGaWxlKGFwa1BhdGgsIHRoaXMubW9kU2VydmVyUGF0aCk7XG4gIH1cblxuICBhc3luYyBjbGVhbnVwU2Vzc2lvbkxlZnRvdmVycyAoKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdQZXJmb3JtaW5nIGNsZWFudXAgb2YgYXV0b21hdGlvbiBsZWZ0b3ZlcnMnKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7dmFsdWV9ID0gKGF3YWl0IGF4aW9zKHtcbiAgICAgICAgdXJsOiBgaHR0cDovLyR7dGhpcy5ob3N0fToke3RoaXMuc3lzdGVtUG9ydH0vc2Vzc2lvbnNgLFxuICAgICAgICB0aW1lb3V0OiA1MDAsXG4gICAgICB9KSkuZGF0YTtcbiAgICAgIGNvbnN0IGFjdGl2ZVNlc3Npb25JZHMgPSB2YWx1ZS5tYXAoKHNlc3MpID0+IHNlc3MuaWQpO1xuICAgICAgaWYgKGFjdGl2ZVNlc3Npb25JZHMubGVuZ3RoKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgVGhlIGZvbGxvd2luZyBvYnNvbGV0ZSBzZXNzaW9ucyBhcmUgc3RpbGwgcnVubmluZzogJHtKU09OLnN0cmluZ2lmeShhY3RpdmVTZXNzaW9uSWRzKX1gKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdDbGVhbmluZyB1cCB0aGUgb2Jzb2xldGUgc2Vzc2lvbnMnKTtcbiAgICAgICAgYXdhaXQgQi5hbGwoYWN0aXZlU2Vzc2lvbklkcy5tYXAoKGlkKSA9PlxuICAgICAgICAgIGF4aW9zKHtcbiAgICAgICAgICAgIHVybDogYGh0dHA6Ly8ke3RoaXMuaG9zdH06JHt0aGlzLnN5c3RlbVBvcnR9L3Nlc3Npb24vJHtpZH1gLFxuICAgICAgICAgICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICAgICAgICB9KVxuICAgICAgICApKTtcbiAgICAgICAgLy8gTGV0IGFsbCBzZXNzaW9ucyB0byBiZSBwcm9wZXJseSB0ZXJtaW5hdGVkIGJlZm9yZSBjb250aW51aW5nXG4gICAgICAgIGF3YWl0IEIuZGVsYXkoMTAwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ05vIG9ic29sZXRlIHNlc3Npb25zIGhhdmUgYmVlbiBkZXRlY3RlZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgTm8gb2Jzb2xldGUgc2Vzc2lvbnMgaGF2ZSBiZWVuIGRldGVjdGVkICgke2UubWVzc2FnZX0pYCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRTZXNzaW9uIChjYXBzKSB7XG4gICAgYXdhaXQgdGhpcy5jbGVhbnVwU2Vzc2lvbkxlZnRvdmVycygpO1xuXG4gICAgY29uc3QgY21kID0gW1xuICAgICAgJ3NoZWxsJyxcbiAgICAgICdhbScsICdpbnN0cnVtZW50JyxcbiAgICAgICctdycsXG4gICAgICAnLWUnLCAnZGVidWcnLCBwcm9jZXNzLmVudi5FU1BSRVNTT19KQVZBX0RFQlVHID09PSAndHJ1ZScsXG4gICAgICAnLWUnLCAnZGlzYWJsZUFuYWx5dGljcycsIHRydWUsIC8vIFRvIGF2b2lkIHVuZXhwZWN0ZWQgZXJyb3IgYnkgZ29vZ2xlIGFuYWx5dGljc1xuICAgIF07XG5cbiAgICBpZiAoXy5pc0Jvb2xlYW4odGhpcy5kaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSkpIHtcbiAgICAgIGNtZC5wdXNoKCctZScsICdESVNBQkxFX1NVUFBSRVNTX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMnLCB0aGlzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlKTtcbiAgICB9XG5cbiAgICBjbWQucHVzaChgJHtURVNUX0FQS19QS0d9L2FuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lcmApO1xuXG4gICAgbG9nZ2VyLmluZm8oYFN0YXJ0aW5nIEVzcHJlc3NvIFNlcnZlciB2JHt2ZXJzaW9ufSB3aXRoIGNtZDogYWRiICR7Y21kLmpvaW4oJyAnKX1gKTtcblxuICAgIGxldCBoYXNTb2NrZXRFcnJvciA9IGZhbHNlO1xuICAgIC8vIHN0YXJ0IHRoZSBpbnN0cnVtZW50YXRpb24gcHJvY2Vzc1xuICAgIHRoaXMuandwcm94eS5pbnN0cnVtZW50YXRpb25TdGF0ZSA9IHtcbiAgICAgIGV4aXRlZDogZmFsc2UsXG4gICAgICBjcmFzaGVkOiBmYWxzZSxcbiAgICB9O1xuICAgIHRoaXMuaW5zdFByb2Nlc3MgPSB0aGlzLmFkYi5jcmVhdGVTdWJQcm9jZXNzKGNtZCk7XG4gICAgdGhpcy5pbnN0UHJvY2Vzcy5vbignZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKGBJbnN0cnVtZW50YXRpb24gcHJvY2VzcyBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX0gZnJvbSBzaWduYWwgJHtzaWduYWx9YCk7XG4gICAgICB0aGlzLmp3cHJveHkuaW5zdHJ1bWVudGF0aW9uU3RhdGUuZXhpdGVkID0gdHJ1ZTtcbiAgICB9KTtcbiAgICB0aGlzLmluc3RQcm9jZXNzLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgIGNvbnN0IGxpbmUgPSBzdGRvdXQgfHwgc3RkZXJyO1xuICAgICAgaWYgKF8uaXNFbXB0eShsaW5lLnRyaW0oKSkpIHtcbiAgICAgICAgLy8gRG8gbm90IHByaW50IGVtcHR5IGxpbmVzIGludG8gdGhlIHN5c3RlbSBsb2dcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuZGVidWcoYFtJbnN0cnVtZW50YXRpb25dICR7bGluZS50cmltKCl9YCk7XG4gICAgICAvLyBBICdTb2NrZXRFeGNlcHRpb24nIGluZGljYXRlcyB0aGF0IHdlIGNvdWxkbid0IGNvbm5lY3QgdG8gdGhlIEVzcHJlc3NvIHNlcnZlcixcbiAgICAgIC8vIGJlY2F1c2UgdGhlIElOVEVSTkVUIHBlcm1pc3Npb24gaXMgbm90IHNldFxuICAgICAgaWYgKGxpbmUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnamF2YS5uZXQuc29ja2V0ZXhjZXB0aW9uJykpIHtcbiAgICAgICAgaGFzU29ja2V0RXJyb3IgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChsaW5lLmluY2x1ZGVzKCdQcm9jZXNzIGNyYXNoZWQnKSkge1xuICAgICAgICB0aGlzLmp3cHJveHkuaW5zdHJ1bWVudGF0aW9uU3RhdGUuY3Jhc2hlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuICAgIGF3YWl0IHRoaXMuaW5zdFByb2Nlc3Muc3RhcnQoMCk7XG4gICAgbG9nZ2VyLmluZm8oYFdhaXRpbmcgdXAgdG8gJHt0aGlzLnNlcnZlckxhdW5jaFRpbWVvdXR9bXMgZm9yIEVzcHJlc3NvIHNlcnZlciB0byBiZSBvbmxpbmVgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChoYXNTb2NrZXRFcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBFc3ByZXNzbyBzZXJ2ZXIgaGFzIGZhaWxlZCB0byBzdGFydCBkdWUgdG8gYW4gdW5leHBlY3RlZCBleGNlcHRpb24uIGAgK1xuICAgICAgICAgICAgYE1ha2Ugc3VyZSB0aGUgJ0lOVEVSTkVUJyBwZXJtaXNzaW9uIGlzIHJlcXVlc3RlZCBpbiB0aGUgQW5kcm9pZCBtYW5pZmVzdCBvZiB5b3VyIGAgK1xuICAgICAgICAgICAgYGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgKDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPVwiYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUXCIgLz4pYCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5qd3Byb3h5Lmluc3RydW1lbnRhdGlvblN0YXRlLmV4aXRlZCkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBFc3ByZXNzbyBzZXJ2ZXIgcHJvY2VzcyBoYXMgYmVlbiB1bmV4cGVjdGVkbHkgdGVybWluYXRlZC4gYCArXG4gICAgICAgICAgICBgQ2hlY2sgdGhlIEFwcGl1bSBzZXJ2ZXIgbG9nIGFuZCB0aGUgbG9nY2F0IG91dHB1dCBmb3IgbW9yZSBkZXRhaWxzYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnL3N0YXR1cycsICdHRVQnKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICB3YWl0TXM6IHRoaXMuc2VydmVyTGF1bmNoVGltZW91dCxcbiAgICAgICAgaW50ZXJ2YWxNczogNTAwLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKC9Db25kaXRpb24gdW5tZXQvLnRlc3QoZS5tZXNzYWdlKSkge1xuICAgICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdyhgVGltZWQgb3V0IHdhaXRpbmcgZm9yIEVzcHJlc3NvIHNlcnZlciB0byBiZSBgICtcbiAgICAgICAgICBgb25saW5lIHdpdGhpbiAke3RoaXMuc2VydmVyTGF1bmNoVGltZW91dH1tcy4gVGhlIHRpbWVvdXQgdmFsdWUgY291bGQgYmUgYCArXG4gICAgICAgICAgYGN1c3RvbWl6ZWQgdXNpbmcgJ2VzcHJlc3NvU2VydmVyTGF1bmNoVGltZW91dCcgY2FwYWJpbGl0eWApO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgbG9nZ2VyLmluZm8oYEVzcHJlc3NvIHNlcnZlciBpcyBvbmxpbmUuIGAgK1xuICAgICAgYFRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHRvb2sgJHt0aW1lci5nZXREdXJhdGlvbigpLmFzTWlsbGlTZWNvbmRzLnRvRml4ZWQoMCl9bXNgKTtcbiAgICBsb2dnZXIuaW5mbygnU3RhcnRpbmcgdGhlIHNlc3Npb24nKTtcblxuICAgIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKCcvc2Vzc2lvbicsICdQT1NUJywge1xuICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgIGZpcnN0TWF0Y2g6IFtjYXBzXSxcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHt9XG4gICAgICB9XG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5yZWNvcmRUYXJnZXRBcHBQYWNrYWdlKCk7XG4gIH1cblxuICBhc3luYyByZWNvcmRUYXJnZXRBcHBQYWNrYWdlICgpIHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbYGVjaG8gXCIke3RoaXMuYXBwUGFja2FnZX1cIiA+IFwiJHtUQVJHRVRfUEFDS0FHRV9DT05UQUlORVJ9XCJgXSk7XG4gICAgbG9nZ2VyLmluZm8oYFJlY29yZGVkIHRoZSB0YXJnZXQgYXBwbGljYXRpb24gcGFja2FnZSAnJHt0aGlzLmFwcFBhY2thZ2V9JyB0byAke1RBUkdFVF9QQUNLQUdFX0NPTlRBSU5FUn1gKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIGxvZ2dlci5kZWJ1ZygnRGVsZXRpbmcgRXNwcmVzc28gc2VydmVyIHNlc3Npb24nKTtcbiAgICAvLyByZWx5IG9uIGp3cHJveHkncyBpbnRlbGxpZ2VuY2UgdG8ga25vdyB3aGF0IHdlJ3JlIHRhbGtpbmcgYWJvdXQgYW5kXG4gICAgLy8gZGVsZXRlIHRoZSBjdXJyZW50IHNlc3Npb25cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy8nLCAnREVMRVRFJyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIud2FybihgRGlkIG5vdCBnZXQgY29uZmlybWF0aW9uIEVzcHJlc3NvIGRlbGV0ZVNlc3Npb24gd29ya2VkOyBgICtcbiAgICAgICAgICBgRXJyb3Igd2FzOiAke2Vycn1gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pbnN0UHJvY2VzcyAmJiB0aGlzLmluc3RQcm9jZXNzLmlzUnVubmluZykge1xuICAgICAgYXdhaXQgdGhpcy5pbnN0UHJvY2Vzcy5zdG9wKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IEVzcHJlc3NvUnVubmVyLCBSRVFVSVJFRF9QQVJBTVMsIFRFU1RfQVBLX1BLRyB9O1xuZXhwb3J0IGRlZmF1bHQgRXNwcmVzc29SdW5uZXI7XG4iXSwiZmlsZSI6ImxpYi9lc3ByZXNzby1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
|
357
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2VzcHJlc3NvLXJ1bm5lci5qcyIsIm5hbWVzIjpbIlRFU1RfU0VSVkVSX1JPT1QiLCJwYXRoIiwicmVzb2x2ZSIsIl9fZGlybmFtZSIsIlRFU1RfQVBLX1BLRyIsIlJFUVVJUkVEX1BBUkFNUyIsIkVTUFJFU1NPX1NFUlZFUl9MQVVOQ0hfVElNRU9VVF9NUyIsIlRBUkdFVF9QQUNLQUdFX0NPTlRBSU5FUiIsIkVzcHJlc3NvUHJveHkiLCJKV1Byb3h5IiwicHJveHlDb21tYW5kIiwidXJsIiwibWV0aG9kIiwiYm9keSIsImNyYXNoZWQiLCJleGl0ZWQiLCJpbnN0cnVtZW50YXRpb25TdGF0ZSIsImVycm9ycyIsIkludmFsaWRDb250ZXh0RXJyb3IiLCJFc3ByZXNzb1J1bm5lciIsImNvbnN0cnVjdG9yIiwibG9nIiwib3B0cyIsInJlcSIsInV0aWwiLCJoYXNWYWx1ZSIsIkVycm9yIiwiandwcm94eSIsInNlcnZlciIsImhvc3QiLCJwb3J0Iiwic3lzdGVtUG9ydCIsImJhc2UiLCJrZWVwQWxpdmUiLCJwcm94eVJlcVJlcyIsImJpbmQiLCJjb21tYW5kIiwibW9kU2VydmVyTmFtZSIsImZzIiwic2FuaXRpemVOYW1lIiwidmVyc2lvbiIsImFwcFBhY2thZ2UiLCJhZGIiLCJjdXJEZXZpY2VJZCIsInJlcGxhY2VtZW50IiwibW9kU2VydmVyUGF0aCIsInRtcERpciIsInNob3dHcmFkbGVMb2ciLCJlc3ByZXNzb0J1aWxkQ29uZmlnIiwic2VydmVyTGF1bmNoVGltZW91dCIsImFuZHJvaWRJbnN0YWxsVGltZW91dCIsImRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlIiwidXNlS2V5c3RvcmUiLCJrZXlzdG9yZVBhdGgiLCJrZXlzdG9yZVBhc3N3b3JkIiwia2V5QWxpYXMiLCJrZXlQYXNzd29yZCIsInNpZ25pbmdDb25maWciLCJrZXlzdG9yZUZpbGUiLCJpc0FwcFBhY2thZ2VDaGFuZ2VkIiwiZmlsZUV4aXN0cyIsImRlYnVnIiwicHJldmlvdXNBcHBQYWNrYWdlIiwic2hlbGwiLCJ0cmltIiwiaW5zdGFsbFNlcnZlciIsImFwcFN0YXRlIiwiZ2V0QXBwbGljYXRpb25JbnN0YWxsU3RhdGUiLCJzaG91bGRVbmluc3RhbGxBcHAiLCJBUFBfSU5TVEFMTF9TVEFURSIsIk9MREVSX1ZFUlNJT05fSU5TVEFMTEVEIiwiTkVXRVJfVkVSU0lPTl9JTlNUQUxMRUQiLCJpbmNsdWRlcyIsInNob3VsZEluc3RhbGxBcHAiLCJOT1RfSU5TVEFMTEVEIiwiaW5mbyIsInVuaW5zdGFsbEFwayIsImVyciIsIndhcm4iLCJtZXNzYWdlIiwiaW5zdGFsbCIsInJlcGxhY2UiLCJ0aW1lb3V0IiwiZXJyb3JBbmRUaHJvdyIsImluc3RhbGxUZXN0QXBrIiwicmVidWlsZCIsImZvcmNlRXNwcmVzc29SZWJ1aWxkIiwiZXhpc3RzIiwidW5saW5rIiwiYnVpbGROZXdNb2RTZXJ2ZXIiLCJpc1NpZ25lZCIsImNoZWNrQXBrQ2VydCIsInNpZ24iLCJidWlsZENvbmZpZ3VyYXRpb24iLCJidWlsZENvbmZpZ3VyYXRpb25TdHIiLCJyZWFkRmlsZSIsIkpTT04iLCJwYXJzZSIsImUiLCJlcnJvciIsImRpck5hbWUiLCJzZXJ2ZXJQYXRoIiwicmltcmFmIiwiU2VydmVyQnVpbGRlciIsInRlc3RBcHBQYWNrYWdlIiwiYnVpbGQiLCJhcGtQYXRoIiwiY29weUZpbGUiLCJjbGVhbnVwU2Vzc2lvbkxlZnRvdmVycyIsInZhbHVlIiwiZGF0YSIsImFjdGl2ZVNlc3Npb25JZHMiLCJtYXAiLCJzZXNzIiwiaWQiLCJsZW5ndGgiLCJzdHJpbmdpZnkiLCJCIiwiYWxsIiwiZGVsYXkiLCJzdGFydFNlc3Npb24iLCJjYXBzIiwiY21kIiwicHJvY2VzcyIsImVudiIsIkVTUFJFU1NPX0pBVkFfREVCVUciLCJfIiwiaXNCb29sZWFuIiwicHVzaCIsImpvaW4iLCJoYXNTb2NrZXRFcnJvciIsImluc3RQcm9jZXNzIiwiY3JlYXRlU3ViUHJvY2VzcyIsIm9uIiwiY29kZSIsInNpZ25hbCIsInN0ZG91dCIsInN0ZGVyciIsImxpbmUiLCJpc0VtcHR5IiwidG9Mb3dlckNhc2UiLCJ0aW1lciIsInRpbWluZyIsIlRpbWVyIiwic3RhcnQiLCJ3YWl0TXMiLCJpbnRlcnZhbE1zIiwidGVzdCIsImdldER1cmF0aW9uIiwiYXNNaWxsaVNlY29uZHMiLCJ0b0ZpeGVkIiwiY2FwYWJpbGl0aWVzIiwiZmlyc3RNYXRjaCIsImFsd2F5c01hdGNoIiwicmVjb3JkVGFyZ2V0QXBwUGFja2FnZSIsImRlbGV0ZVNlc3Npb24iLCJpc1J1bm5pbmciLCJzdG9wIl0sInNvdXJjZVJvb3QiOiIuLi8uLiIsInNvdXJjZXMiOlsibGliL2VzcHJlc3NvLXJ1bm5lci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBKV1Byb3h5LCBlcnJvcnMgfSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcbmltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBTZXJ2ZXJCdWlsZGVyLCBidWlsZFNlcnZlclNpZ25pbmdDb25maWcgfSBmcm9tICcuL3NlcnZlci1idWlsZGVyJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZnMsIHV0aWwsIG1rZGlycCwgdGltaW5nIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi8uLi9wYWNrYWdlLmpzb24nOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9uby11bnJlc29sdmVkXG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgY29weUdyYWRsZVByb2plY3RSZWN1cnNpdmVseSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcblxuXG5jb25zdCBURVNUX1NFUlZFUl9ST09UID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ2VzcHJlc3NvLXNlcnZlcicpO1xuY29uc3QgVEVTVF9BUEtfUEtHID0gJ2lvLmFwcGl1bS5lc3ByZXNzb3NlcnZlci50ZXN0JztcbmNvbnN0IFJFUVVJUkVEX1BBUkFNUyA9IFtcbiAgJ2FkYicsXG4gICd0bXBEaXInLFxuICAnaG9zdCcsXG4gICdzeXN0ZW1Qb3J0JyxcbiAgJ2RldmljZVBvcnQnLFxuICAnYXBwUGFja2FnZScsXG4gICdmb3JjZUVzcHJlc3NvUmVidWlsZCcsXG5dO1xuY29uc3QgRVNQUkVTU09fU0VSVkVSX0xBVU5DSF9USU1FT1VUX01TID0gNDUwMDA7XG5jb25zdCBUQVJHRVRfUEFDS0FHRV9DT05UQUlORVIgPSAnL2RhdGEvbG9jYWwvdG1wL2VzcHJlc3NvLmFwcHBhY2thZ2UnO1xuXG5jbGFzcyBFc3ByZXNzb1Byb3h5IGV4dGVuZHMgSldQcm94eSB7XG4gIGFzeW5jIHByb3h5Q29tbWFuZCAodXJsLCBtZXRob2QsIGJvZHkgPSBudWxsKSB7XG4gICAgY29uc3Qge2NyYXNoZWQsIGV4aXRlZH0gPSB0aGlzLmluc3RydW1lbnRhdGlvblN0YXRlO1xuICAgIGlmIChleGl0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZENvbnRleHRFcnJvcihgJyR7bWV0aG9kfSAke3VybH0nIGNhbm5vdCBiZSBwcm94aWVkIHRvIEVzcHJlc3NvIHNlcnZlciBiZWNhdXNlIGAgK1xuICAgICAgICBgdGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIGhhcyAke2NyYXNoZWQgPyAnY3Jhc2hlZCcgOiAnYmVlbiB1bmV4cGVjdGVkbHkgdGVybWluYXRlZCd9LiBgICtcbiAgICAgICAgYENoZWNrIHRoZSBBcHBpdW0gc2VydmVyIGxvZyBhbmQgdGhlIGxvZ2NhdCBvdXRwdXQgZm9yIG1vcmUgZGV0YWlsc2ApO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgc3VwZXIucHJveHlDb21tYW5kKHVybCwgbWV0aG9kLCBib2R5KTtcbiAgfVxufVxuXG5jbGFzcyBFc3ByZXNzb1J1bm5lciB7XG4gIGNvbnN0cnVjdG9yIChsb2csIG9wdHMgPSB7fSkge1xuICAgIGZvciAobGV0IHJlcSBvZiBSRVFVSVJFRF9QQVJBTVMpIHtcbiAgICAgIGlmICghb3B0cyB8fCAhdXRpbC5oYXNWYWx1ZShvcHRzW3JlcV0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgT3B0aW9uICcke3JlcX0nIGlzIHJlcXVpcmVkIWApO1xuICAgICAgfVxuICAgICAgdGhpc1tyZXFdID0gb3B0c1tyZXFdO1xuICAgIH1cbiAgICB0aGlzLmxvZyA9IGxvZztcbiAgICB0aGlzLmp3cHJveHkgPSBuZXcgRXNwcmVzc29Qcm94eSh7XG4gICAgICBsb2csXG4gICAgICBzZXJ2ZXI6IHRoaXMuaG9zdCxcbiAgICAgIHBvcnQ6IHRoaXMuc3lzdGVtUG9ydCxcbiAgICAgIGJhc2U6ICcnLFxuICAgICAga2VlcEFsaXZlOiB0cnVlLFxuICAgIH0pO1xuICAgIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLmp3cHJveHkucHJveHlSZXFSZXMuYmluZCh0aGlzLmp3cHJveHkpO1xuICAgIHRoaXMucHJveHlDb21tYW5kID0gdGhpcy5qd3Byb3h5LmNvbW1hbmQuYmluZCh0aGlzLmp3cHJveHkpO1xuICAgIHRoaXMuandwcm94eS5pbnN0cnVtZW50YXRpb25TdGF0ZSA9IHtcbiAgICAgIGV4aXRlZDogZmFsc2UsXG4gICAgICBjcmFzaGVkOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgY29uc3QgbW9kU2VydmVyTmFtZSA9IGZzLnNhbml0aXplTmFtZShgJHtURVNUX0FQS19QS0d9XyR7dmVyc2lvbn1fJHt0aGlzLmFwcFBhY2thZ2V9XyR7dGhpcy5hZGIuY3VyRGV2aWNlSWR9LmFwa2AsIHtcbiAgICAgIHJlcGxhY2VtZW50OiAnLScsXG4gICAgfSk7XG4gICAgdGhpcy5tb2RTZXJ2ZXJQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMudG1wRGlyLCBtb2RTZXJ2ZXJOYW1lKTtcbiAgICB0aGlzLnNob3dHcmFkbGVMb2cgPSBvcHRzLnNob3dHcmFkbGVMb2c7XG4gICAgdGhpcy5lc3ByZXNzb0J1aWxkQ29uZmlnID0gb3B0cy5lc3ByZXNzb0J1aWxkQ29uZmlnO1xuXG4gICAgdGhpcy5zZXJ2ZXJMYXVuY2hUaW1lb3V0ID0gb3B0cy5zZXJ2ZXJMYXVuY2hUaW1lb3V0IHx8IEVTUFJFU1NPX1NFUlZFUl9MQVVOQ0hfVElNRU9VVF9NUztcbiAgICB0aGlzLmFuZHJvaWRJbnN0YWxsVGltZW91dCA9IG9wdHMuYW5kcm9pZEluc3RhbGxUaW1lb3V0O1xuXG4gICAgdGhpcy5kaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSA9IG9wdHMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2U7XG5cbiAgICAvLyBFc3ByZXNzbyBTZXJ2ZXIgYXBwIG5lZWRzIHRvIGJlIHNpZ25lZCB3aXRoIHNhbWUga2V5U3RvcmUgYXMgYXBwUGFja2FnZVxuICAgIGlmIChvcHRzLnVzZUtleXN0b3JlICYmIG9wdHMua2V5c3RvcmVQYXRoICYmIG9wdHMua2V5c3RvcmVQYXNzd29yZCAmJiBvcHRzLmtleUFsaWFzICYmIG9wdHMua2V5UGFzc3dvcmQpIHtcbiAgICAgIHRoaXMuc2lnbmluZ0NvbmZpZyA9IGJ1aWxkU2VydmVyU2lnbmluZ0NvbmZpZyh7XG4gICAgICAgIGtleXN0b3JlRmlsZTogb3B0cy5rZXlzdG9yZVBhdGgsXG4gICAgICAgIGtleXN0b3JlUGFzc3dvcmQ6IG9wdHMua2V5c3RvcmVQYXNzd29yZCxcbiAgICAgICAga2V5QWxpYXM6IG9wdHMua2V5QWxpYXMsXG4gICAgICAgIGtleVBhc3N3b3JkOiBvcHRzLmtleVBhc3N3b3JkXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaWduaW5nQ29uZmlnID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpc0FwcFBhY2thZ2VDaGFuZ2VkICgpIHtcbiAgICBpZiAoIWF3YWl0IHRoaXMuYWRiLmZpbGVFeGlzdHMoVEFSR0VUX1BBQ0tBR0VfQ09OVEFJTkVSKSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoJ1RoZSBwcmV2aW91cyB0YXJnZXQgYXBwbGljYXRpb24gcGFja2FnZSBpcyB1bmtub3duJyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgcHJldmlvdXNBcHBQYWNrYWdlID0gKGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnY2F0JywgVEFSR0VUX1BBQ0tBR0VfQ09OVEFJTkVSXSkpLnRyaW0oKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgVGhlIHByZXZpb3VzIHRhcmdldCBhcHBsaWNhdGlvbiBwYWNrYWdlIHdhcyAnJHtwcmV2aW91c0FwcFBhY2thZ2V9Jy4gYCArXG4gICAgICBgVGhlIGN1cnJlbnQgcGFja2FnZSBpcyAnJHt0aGlzLmFwcFBhY2thZ2V9J2ApO1xuICAgIHJldHVybiBwcmV2aW91c0FwcFBhY2thZ2UgIT09IHRoaXMuYXBwUGFja2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxscyBFc3ByZXNzbyBzZXJ2ZXIgYXBrIG9uIHRvIHRoZSBkZXZpY2Ugb3IgZW11bGF0b3IuXG4gICAqIEVhY2ggYWRiIGNvbW1hbmQgdXNlcyBkZWZhdWx0IHRpbWVvdXQgYnkgdGhlbS5cbiAgICovXG4gIGFzeW5jIGluc3RhbGxTZXJ2ZXIgKCkge1xuICAgIGNvbnN0IGFwcFN0YXRlID0gYXdhaXQgdGhpcy5hZGIuZ2V0QXBwbGljYXRpb25JbnN0YWxsU3RhdGUodGhpcy5tb2RTZXJ2ZXJQYXRoLCBURVNUX0FQS19QS0cpO1xuXG4gICAgY29uc3Qgc2hvdWxkVW5pbnN0YWxsQXBwID0gW1xuICAgICAgdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuT0xERVJfVkVSU0lPTl9JTlNUQUxMRUQsXG4gICAgICB0aGlzLmFkYi5BUFBfSU5TVEFMTF9TVEFURS5ORVdFUl9WRVJTSU9OX0lOU1RBTExFRFxuICAgIF0uaW5jbHVkZXMoYXBwU3RhdGUpO1xuICAgIGNvbnN0IHNob3VsZEluc3RhbGxBcHAgPSBzaG91bGRVbmluc3RhbGxBcHAgfHwgW1xuICAgICAgdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuTk9UX0lOU1RBTExFRFxuICAgIF0uaW5jbHVkZXMoYXBwU3RhdGUpO1xuXG4gICAgaWYgKHNob3VsZFVuaW5zdGFsbEFwcCkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgVW5pbnN0YWxsaW5nIEVzcHJlc3NvIFRlc3QgU2VydmVyIGFwayBmcm9tIHRoZSB0YXJnZXQgZGV2aWNlIChwa2c6ICcke1RFU1RfQVBLX1BLR30nKWApO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKFRFU1RfQVBLX1BLRyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgRXJyb3IgdW5pbnN0YWxsaW5nICcke1RFU1RfQVBLX1BLR30nOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG91bGRJbnN0YWxsQXBwKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBJbnN0YWxsaW5nIEVzcHJlc3NvIFRlc3QgU2VydmVyIGFwayBmcm9tIHRoZSB0YXJnZXQgZGV2aWNlIChwYXRoOiAnJHt0aGlzLm1vZFNlcnZlclBhdGh9JylgKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmluc3RhbGwodGhpcy5tb2RTZXJ2ZXJQYXRoLCB7IHJlcGxhY2U6IGZhbHNlLCB0aW1lb3V0OiB0aGlzLmFuZHJvaWRJbnN0YWxsVGltZW91dCB9KTtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgSW5zdGFsbGVkIEVzcHJlc3NvIFRlc3QgU2VydmVyIGFwayAnJHt0aGlzLm1vZFNlcnZlclBhdGh9JyAocGtnOiAnJHtURVNUX0FQS19QS0d9JylgKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDYW5ub3QgaW5zdGFsbCAnJHt0aGlzLm1vZFNlcnZlclBhdGh9JyBiZWNhdXNlIG9mICcke2Vyci5tZXNzYWdlfSdgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBpbnN0YWxsVGVzdEFwayAoKSB7XG4gICAgbGV0IHJlYnVpbGQgPSB0aGlzLmZvcmNlRXNwcmVzc29SZWJ1aWxkO1xuICAgIGlmIChyZWJ1aWxkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgJ2ZvcmNlRXNwcmVzc29SZWJ1aWxkJyBjYXBhYmlsaXR5IGlzIGVuYWJsZWRgKTtcbiAgICB9IGVsc2UgaWYgKGF3YWl0IHRoaXMuaXNBcHBQYWNrYWdlQ2hhbmdlZCgpKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBGb3JjaW5nIEVzcHJlc3NvIHNlcnZlciByZWJ1aWxkIGJlY2F1c2Ugb2YgY2hhbmdlZCBhcHBsaWNhdGlvbiBwYWNrYWdlYCk7XG4gICAgICByZWJ1aWxkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAocmVidWlsZCAmJiBhd2FpdCBmcy5leGlzdHModGhpcy5tb2RTZXJ2ZXJQYXRoKSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYERlbGV0aW5nIHRoZSBvYnNvbGV0ZSBFc3ByZXNzbyBzZXJ2ZXIgcGFja2FnZSAnJHt0aGlzLm1vZFNlcnZlclBhdGh9J2ApO1xuICAgICAgYXdhaXQgZnMudW5saW5rKHRoaXMubW9kU2VydmVyUGF0aCk7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGZzLmV4aXN0cyh0aGlzLm1vZFNlcnZlclBhdGgpKSkge1xuICAgICAgYXdhaXQgdGhpcy5idWlsZE5ld01vZFNlcnZlcigpO1xuICAgIH1cbiAgICBjb25zdCBpc1NpZ25lZCA9IGF3YWl0IHRoaXMuYWRiLmNoZWNrQXBrQ2VydCh0aGlzLm1vZFNlcnZlclBhdGgsIFRFU1RfQVBLX1BLRyk7XG4gICAgaWYgKCFpc1NpZ25lZCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2lnbih0aGlzLm1vZFNlcnZlclBhdGgpO1xuICAgIH1cbiAgICBpZiAoKHJlYnVpbGQgfHwgIWlzU2lnbmVkKSAmJiBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsoVEVTVF9BUEtfUEtHKSkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnVW5pbnN0YWxsZWQgdGhlIG9ic29sZXRlIEVzcHJlc3NvIHNlcnZlciBwYWNrYWdlIGZyb20gdGhlIGRldmljZSB1bmRlciB0ZXN0Jyk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5pbnN0YWxsU2VydmVyKCk7XG4gIH1cblxuICBhc3luYyBidWlsZE5ld01vZFNlcnZlciAoKSB7XG4gICAgbGV0IGJ1aWxkQ29uZmlndXJhdGlvbiA9IHt9O1xuICAgIGlmICh0aGlzLmVzcHJlc3NvQnVpbGRDb25maWcpIHtcbiAgICAgIGxldCBidWlsZENvbmZpZ3VyYXRpb25TdHI7XG4gICAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKHRoaXMuZXNwcmVzc29CdWlsZENvbmZpZykpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgTG9hZGluZyB0aGUgYnVpbGQgY29uZmlndXJhdGlvbiBmcm9tICcke3RoaXMuZXNwcmVzc29CdWlsZENvbmZpZ30nYCk7XG4gICAgICAgIGJ1aWxkQ29uZmlndXJhdGlvblN0ciA9IGF3YWl0IGZzLnJlYWRGaWxlKHRoaXMuZXNwcmVzc29CdWlsZENvbmZpZywgJ3V0ZjgnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYExvYWRpbmcgdGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb24gZnJvbSAnZXNwcmVzc29CdWlsZENvbmZpZycgY2FwYWJpbGl0eWApO1xuICAgICAgICBidWlsZENvbmZpZ3VyYXRpb25TdHIgPSB0aGlzLmVzcHJlc3NvQnVpbGRDb25maWc7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSBKU09OLnBhcnNlKGJ1aWxkQ29uZmlndXJhdGlvblN0cik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yKCdDYW5ub3QgcGFyc2UgdGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb24gSlNPTicsIGUpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkaXJOYW1lID0gZnMuc2FuaXRpemVOYW1lKGBlc3ByZXNzby1zZXJ2ZXItJHt0aGlzLmFkYi5jdXJEZXZpY2VJZH1gLCB7XG4gICAgICByZXBsYWNlbWVudDogJy0nLFxuICAgIH0pO1xuICAgIGNvbnN0IHNlcnZlclBhdGggPSBwYXRoLnJlc29sdmUodGhpcy50bXBEaXIsIGRpck5hbWUpO1xuICAgIHRoaXMubG9nLmluZm8oYEJ1aWxkaW5nIGVzcHJlc3NvIHNlcnZlciBpbiAnJHtzZXJ2ZXJQYXRofSdgKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgVGhlIGJ1aWxkIGZvbGRlciByb290IGNvdWxkIGJlIGN1c3RvbWl6ZWQgYnkgY2hhbmdpbmcgdGhlICd0bXBEaXInIGNhcGFiaWxpdHlgKTtcbiAgICBhd2FpdCBmcy5yaW1yYWYoc2VydmVyUGF0aCk7XG4gICAgYXdhaXQgbWtkaXJwKHNlcnZlclBhdGgpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBDb3B5aW5nIGVzcHJlc3NvIHNlcnZlciB0ZW1wbGF0ZSBmcm9tICgnJHtURVNUX1NFUlZFUl9ST09UfScgdG8gJyR7c2VydmVyUGF0aH0nKWApO1xuICAgIGF3YWl0IGNvcHlHcmFkbGVQcm9qZWN0UmVjdXJzaXZlbHkoVEVTVF9TRVJWRVJfUk9PVCwgc2VydmVyUGF0aCk7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0J1bGRpbmcgZXNwcmVzc28gc2VydmVyJyk7XG4gICAgYXdhaXQgbmV3IFNlcnZlckJ1aWxkZXIodGhpcy5sb2csIHtcbiAgICAgIHNlcnZlclBhdGgsIGJ1aWxkQ29uZmlndXJhdGlvbixcbiAgICAgIHNob3dHcmFkbGVMb2c6IHRoaXMuc2hvd0dyYWRsZUxvZyxcbiAgICAgIHRlc3RBcHBQYWNrYWdlOiB0aGlzLmFwcFBhY2thZ2UsXG4gICAgICBzaWduaW5nQ29uZmlnOiB0aGlzLnNpZ25pbmdDb25maWdcbiAgICB9KS5idWlsZCgpO1xuICAgIGNvbnN0IGFwa1BhdGggPSBwYXRoLnJlc29sdmUoc2VydmVyUGF0aCwgJ2FwcCcsICdidWlsZCcsICdvdXRwdXRzJywgJ2FwaycsICdhbmRyb2lkVGVzdCcsICdkZWJ1ZycsICdhcHAtZGVidWctYW5kcm9pZFRlc3QuYXBrJyk7XG4gICAgdGhpcy5sb2cuZGVidWcoYENvcHlpbmcgYnVpbHQgYXBrIGZyb20gJyR7YXBrUGF0aH0nIHRvICcke3RoaXMubW9kU2VydmVyUGF0aH0nYCk7XG4gICAgYXdhaXQgZnMuY29weUZpbGUoYXBrUGF0aCwgdGhpcy5tb2RTZXJ2ZXJQYXRoKTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFudXBTZXNzaW9uTGVmdG92ZXJzICgpIHtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnUGVyZm9ybWluZyBjbGVhbnVwIG9mIGF1dG9tYXRpb24gbGVmdG92ZXJzJyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qge3ZhbHVlfSA9IChhd2FpdCBheGlvcyh7XG4gICAgICAgIHVybDogYGh0dHA6Ly8ke3RoaXMuaG9zdH06JHt0aGlzLnN5c3RlbVBvcnR9L3Nlc3Npb25zYCxcbiAgICAgICAgdGltZW91dDogNTAwLFxuICAgICAgfSkpLmRhdGE7XG4gICAgICBjb25zdCBhY3RpdmVTZXNzaW9uSWRzID0gdmFsdWUubWFwKChzZXNzKSA9PiBzZXNzLmlkKTtcbiAgICAgIGlmIChhY3RpdmVTZXNzaW9uSWRzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgVGhlIGZvbGxvd2luZyBvYnNvbGV0ZSBzZXNzaW9ucyBhcmUgc3RpbGwgcnVubmluZzogJHtKU09OLnN0cmluZ2lmeShhY3RpdmVTZXNzaW9uSWRzKX1gKTtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoJ0NsZWFuaW5nIHVwIHRoZSBvYnNvbGV0ZSBzZXNzaW9ucycpO1xuICAgICAgICBhd2FpdCBCLmFsbChhY3RpdmVTZXNzaW9uSWRzLm1hcCgoaWQpID0+XG4gICAgICAgICAgYXhpb3Moe1xuICAgICAgICAgICAgdXJsOiBgaHR0cDovLyR7dGhpcy5ob3N0fToke3RoaXMuc3lzdGVtUG9ydH0vc2Vzc2lvbi8ke2lkfWAsXG4gICAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICAgIH0pXG4gICAgICAgICkpO1xuICAgICAgICAvLyBMZXQgYWxsIHNlc3Npb25zIHRvIGJlIHByb3Blcmx5IHRlcm1pbmF0ZWQgYmVmb3JlIGNvbnRpbnVpbmdcbiAgICAgICAgYXdhaXQgQi5kZWxheSgxMDAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCdObyBvYnNvbGV0ZSBzZXNzaW9ucyBoYXZlIGJlZW4gZGV0ZWN0ZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgTm8gb2Jzb2xldGUgc2Vzc2lvbnMgaGF2ZSBiZWVuIGRldGVjdGVkICgke2UubWVzc2FnZX0pYCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRTZXNzaW9uIChjYXBzKSB7XG4gICAgYXdhaXQgdGhpcy5jbGVhbnVwU2Vzc2lvbkxlZnRvdmVycygpO1xuXG4gICAgY29uc3QgY21kID0gW1xuICAgICAgJ3NoZWxsJyxcbiAgICAgICdhbScsICdpbnN0cnVtZW50JyxcbiAgICAgICctdycsXG4gICAgICAnLWUnLCAnZGVidWcnLCBwcm9jZXNzLmVudi5FU1BSRVNTT19KQVZBX0RFQlVHID09PSAndHJ1ZScsXG4gICAgICAnLWUnLCAnZGlzYWJsZUFuYWx5dGljcycsIHRydWUsIC8vIFRvIGF2b2lkIHVuZXhwZWN0ZWQgZXJyb3IgYnkgZ29vZ2xlIGFuYWx5dGljc1xuICAgIF07XG5cbiAgICBpZiAoXy5pc0Jvb2xlYW4odGhpcy5kaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSkpIHtcbiAgICAgIGNtZC5wdXNoKCctZScsICdESVNBQkxFX1NVUFBSRVNTX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMnLCB0aGlzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlKTtcbiAgICB9XG5cbiAgICBjbWQucHVzaChgJHtURVNUX0FQS19QS0d9L2FuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lcmApO1xuXG4gICAgdGhpcy5sb2cuaW5mbyhgU3RhcnRpbmcgRXNwcmVzc28gU2VydmVyIHYke3ZlcnNpb259IHdpdGggY21kOiBhZGIgJHtjbWQuam9pbignICcpfWApO1xuXG4gICAgbGV0IGhhc1NvY2tldEVycm9yID0gZmFsc2U7XG4gICAgLy8gc3RhcnQgdGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzXG4gICAgdGhpcy5qd3Byb3h5Lmluc3RydW1lbnRhdGlvblN0YXRlID0ge1xuICAgICAgZXhpdGVkOiBmYWxzZSxcbiAgICAgIGNyYXNoZWQ6IGZhbHNlLFxuICAgIH07XG4gICAgdGhpcy5pbnN0UHJvY2VzcyA9IHRoaXMuYWRiLmNyZWF0ZVN1YlByb2Nlc3MoY21kKTtcbiAgICB0aGlzLmluc3RQcm9jZXNzLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgSW5zdHJ1bWVudGF0aW9uIHByb2Nlc3MgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9IGZyb20gc2lnbmFsICR7c2lnbmFsfWApO1xuICAgICAgdGhpcy5qd3Byb3h5Lmluc3RydW1lbnRhdGlvblN0YXRlLmV4aXRlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgdGhpcy5pbnN0UHJvY2Vzcy5vbignb3V0cHV0JywgKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICBjb25zdCBsaW5lID0gc3Rkb3V0IHx8IHN0ZGVycjtcbiAgICAgIGlmIChfLmlzRW1wdHkobGluZS50cmltKCkpKSB7XG4gICAgICAgIC8vIERvIG5vdCBwcmludCBlbXB0eSBsaW5lcyBpbnRvIHRoZSBzeXN0ZW0gbG9nXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2cuZGVidWcoYFtJbnN0cnVtZW50YXRpb25dICR7bGluZS50cmltKCl9YCk7XG4gICAgICAvLyBBICdTb2NrZXRFeGNlcHRpb24nIGluZGljYXRlcyB0aGF0IHdlIGNvdWxkbid0IGNvbm5lY3QgdG8gdGhlIEVzcHJlc3NvIHNlcnZlcixcbiAgICAgIC8vIGJlY2F1c2UgdGhlIElOVEVSTkVUIHBlcm1pc3Npb24gaXMgbm90IHNldFxuICAgICAgaWYgKGxpbmUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnamF2YS5uZXQuc29ja2V0ZXhjZXB0aW9uJykpIHtcbiAgICAgICAgaGFzU29ja2V0RXJyb3IgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChsaW5lLmluY2x1ZGVzKCdQcm9jZXNzIGNyYXNoZWQnKSkge1xuICAgICAgICB0aGlzLmp3cHJveHkuaW5zdHJ1bWVudGF0aW9uU3RhdGUuY3Jhc2hlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuICAgIGF3YWl0IHRoaXMuaW5zdFByb2Nlc3Muc3RhcnQoMCk7XG4gICAgdGhpcy5sb2cuaW5mbyhgV2FpdGluZyB1cCB0byAke3RoaXMuc2VydmVyTGF1bmNoVGltZW91dH1tcyBmb3IgRXNwcmVzc28gc2VydmVyIHRvIGJlIG9ubGluZWApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKGhhc1NvY2tldEVycm9yKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgRXNwcmVzc28gc2VydmVyIGhhcyBmYWlsZWQgdG8gc3RhcnQgZHVlIHRvIGFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uLiBgICtcbiAgICAgICAgICAgIGBNYWtlIHN1cmUgdGhlICdJTlRFUk5FVCcgcGVybWlzc2lvbiBpcyByZXF1ZXN0ZWQgaW4gdGhlIEFuZHJvaWQgbWFuaWZlc3Qgb2YgeW91ciBgICtcbiAgICAgICAgICAgIGBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0ICg8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT1cImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVFwiIC8+KWApO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuandwcm94eS5pbnN0cnVtZW50YXRpb25TdGF0ZS5leGl0ZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBFc3ByZXNzbyBzZXJ2ZXIgcHJvY2VzcyBoYXMgYmVlbiB1bmV4cGVjdGVkbHkgdGVybWluYXRlZC4gYCArXG4gICAgICAgICAgICBgQ2hlY2sgdGhlIEFwcGl1bSBzZXJ2ZXIgbG9nIGFuZCB0aGUgbG9nY2F0IG91dHB1dCBmb3IgbW9yZSBkZXRhaWxzYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnL3N0YXR1cycsICdHRVQnKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICB3YWl0TXM6IHRoaXMuc2VydmVyTGF1bmNoVGltZW91dCxcbiAgICAgICAgaW50ZXJ2YWxNczogNTAwLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKC9Db25kaXRpb24gdW5tZXQvLnRlc3QoZS5tZXNzYWdlKSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBUaW1lZCBvdXQgd2FpdGluZyBmb3IgRXNwcmVzc28gc2VydmVyIHRvIGJlIGAgK1xuICAgICAgICAgIGBvbmxpbmUgd2l0aGluICR7dGhpcy5zZXJ2ZXJMYXVuY2hUaW1lb3V0fW1zLiBUaGUgdGltZW91dCB2YWx1ZSBjb3VsZCBiZSBgICtcbiAgICAgICAgICBgY3VzdG9taXplZCB1c2luZyAnZXNwcmVzc29TZXJ2ZXJMYXVuY2hUaW1lb3V0JyBjYXBhYmlsaXR5YCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICB0aGlzLmxvZy5pbmZvKGBFc3ByZXNzbyBzZXJ2ZXIgaXMgb25saW5lLiBgICtcbiAgICAgIGBUaGUgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyB0b29rICR7dGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcy50b0ZpeGVkKDApfW1zYCk7XG4gICAgdGhpcy5sb2cuaW5mbygnU3RhcnRpbmcgdGhlIHNlc3Npb24nKTtcblxuICAgIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKCcvc2Vzc2lvbicsICdQT1NUJywge1xuICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgIGZpcnN0TWF0Y2g6IFtjYXBzXSxcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHt9XG4gICAgICB9XG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5yZWNvcmRUYXJnZXRBcHBQYWNrYWdlKCk7XG4gIH1cblxuICBhc3luYyByZWNvcmRUYXJnZXRBcHBQYWNrYWdlICgpIHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbYGVjaG8gXCIke3RoaXMuYXBwUGFja2FnZX1cIiA+IFwiJHtUQVJHRVRfUEFDS0FHRV9DT05UQUlORVJ9XCJgXSk7XG4gICAgdGhpcy5sb2cuaW5mbyhgUmVjb3JkZWQgdGhlIHRhcmdldCBhcHBsaWNhdGlvbiBwYWNrYWdlICcke3RoaXMuYXBwUGFja2FnZX0nIHRvICR7VEFSR0VUX1BBQ0tBR0VfQ09OVEFJTkVSfWApO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlU2Vzc2lvbiAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0RlbGV0aW5nIEVzcHJlc3NvIHNlcnZlciBzZXNzaW9uJyk7XG4gICAgLy8gcmVseSBvbiBqd3Byb3h5J3MgaW50ZWxsaWdlbmNlIHRvIGtub3cgd2hhdCB3ZSdyZSB0YWxraW5nIGFib3V0IGFuZFxuICAgIC8vIGRlbGV0ZSB0aGUgY3VycmVudCBzZXNzaW9uXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKCcvJywgJ0RFTEVURScpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2cud2FybihgRGlkIG5vdCBnZXQgY29uZmlybWF0aW9uIEVzcHJlc3NvIGRlbGV0ZVNlc3Npb24gd29ya2VkOyBgICtcbiAgICAgICAgICBgRXJyb3Igd2FzOiAke2Vycn1gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pbnN0UHJvY2VzcyAmJiB0aGlzLmluc3RQcm9jZXNzLmlzUnVubmluZykge1xuICAgICAgYXdhaXQgdGhpcy5pbnN0UHJvY2Vzcy5zdG9wKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IEVzcHJlc3NvUnVubmVyLCBSRVFVSVJFRF9QQVJBTVMsIFRFU1RfQVBLX1BLRyB9O1xuZXhwb3J0IGRlZmF1bHQgRXNwcmVzc29SdW5uZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsZ0JBQWdCLEdBQUdDLGNBQUtDLE9BQUwsQ0FBYUMsU0FBYixFQUF3QixJQUF4QixFQUE4QixJQUE5QixFQUFvQyxpQkFBcEMsQ0FBekI7O0FBQ0EsTUFBTUMsWUFBWSxHQUFHLCtCQUFyQjs7QUFDQSxNQUFNQyxlQUFlLEdBQUcsQ0FDdEIsS0FEc0IsRUFFdEIsUUFGc0IsRUFHdEIsTUFIc0IsRUFJdEIsWUFKc0IsRUFLdEIsWUFMc0IsRUFNdEIsWUFOc0IsRUFPdEIsc0JBUHNCLENBQXhCOztBQVNBLE1BQU1DLGlDQUFpQyxHQUFHLEtBQTFDO0FBQ0EsTUFBTUMsd0JBQXdCLEdBQUcscUNBQWpDOztBQUVBLE1BQU1DLGFBQU4sU0FBNEJDLG1CQUE1QixDQUFvQztFQUNoQixNQUFaQyxZQUFZLENBQUVDLEdBQUYsRUFBT0MsTUFBUCxFQUFlQyxJQUFJLEdBQUcsSUFBdEIsRUFBNEI7SUFDNUMsTUFBTTtNQUFDQyxPQUFEO01BQVVDO0lBQVYsSUFBb0IsS0FBS0Msb0JBQS9COztJQUNBLElBQUlE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
|
package/build/lib/logger.js
CHANGED
|
@@ -15,4 +15,4 @@ var _default = log;
|
|
|
15
15
|
exports.default = _default;require('source-map-support').install();
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
18
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2xvZ2dlci5qcyIsIm5hbWVzIjpbImxvZyIsImxvZ2dlciIsImdldExvZ2dlciJdLCJzb3VyY2VSb290IjoiLi4vLi4iLCJzb3VyY2VzIjpbImxpYi9sb2dnZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcblxuXG5jb25zdCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdFc3ByZXNzbycpO1xuXG5leHBvcnQgZGVmYXVsdCBsb2c7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOztBQUdBLE1BQU1BLEdBQUcsR0FBR0MsZ0JBQU9DLFNBQVAsQ0FBaUIsVUFBakIsQ0FBWjs7ZUFFZUYsRyJ9
|
|
@@ -17,8 +17,6 @@ var _support = require("@appium/support");
|
|
|
17
17
|
|
|
18
18
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
19
19
|
|
|
20
|
-
var _logger = _interopRequireDefault(require("./logger"));
|
|
21
|
-
|
|
22
20
|
var _path = _interopRequireDefault(require("path"));
|
|
23
21
|
|
|
24
22
|
var _os = require("os");
|
|
@@ -34,8 +32,6 @@ const DEPENDENCY_PROP_NAMES = ['additionalAppDependencies', 'additionalAndroidTe
|
|
|
34
32
|
const VERSION_KEYS = [GRADLE_VERSION_KEY, 'androidGradlePlugin', 'compileSdk', 'buildTools', 'minSdk', 'targetSdk', 'kotlin', 'sourceCompatibility', 'targetCompatibility', 'jvmTarget', 'composeVersion'];
|
|
35
33
|
exports.VERSION_KEYS = VERSION_KEYS;
|
|
36
34
|
|
|
37
|
-
const gradleLog = _support.logger.getLogger('Gradle');
|
|
38
|
-
|
|
39
35
|
function buildServerSigningConfig(args) {
|
|
40
36
|
return {
|
|
41
37
|
zipAlign: true,
|
|
@@ -47,7 +43,8 @@ function buildServerSigningConfig(args) {
|
|
|
47
43
|
}
|
|
48
44
|
|
|
49
45
|
class ServerBuilder {
|
|
50
|
-
constructor(args = {}) {
|
|
46
|
+
constructor(log, args = {}) {
|
|
47
|
+
this.log = log;
|
|
51
48
|
this.serverPath = args.serverPath;
|
|
52
49
|
this.showGradleLog = args.showGradleLog;
|
|
53
50
|
const buildConfiguration = args.buildConfiguration || {};
|
|
@@ -56,7 +53,7 @@ class ServerBuilder {
|
|
|
56
53
|
if (VERSION_KEYS.includes(key)) {
|
|
57
54
|
acc[key] = value;
|
|
58
55
|
} else {
|
|
59
|
-
|
|
56
|
+
log.warn(`Got unexpected '${key}' in toolsVersion block of the build configuration`);
|
|
60
57
|
}
|
|
61
58
|
|
|
62
59
|
return acc;
|
|
@@ -79,7 +76,7 @@ class ServerBuilder {
|
|
|
79
76
|
}
|
|
80
77
|
|
|
81
78
|
getCommand() {
|
|
82
|
-
const cmd = _support.system.isWindows() ? 'gradlew.bat' : '
|
|
79
|
+
const cmd = _support.system.isWindows() ? 'gradlew.bat' : _path.default.resolve(this.serverPath, 'gradlew');
|
|
83
80
|
|
|
84
81
|
const buildProperty = (key, value) => value ? `-P${key}=${value}` : null;
|
|
85
82
|
|
|
@@ -153,8 +150,7 @@ class ServerBuilder {
|
|
|
153
150
|
continue;
|
|
154
151
|
}
|
|
155
152
|
|
|
156
|
-
|
|
157
|
-
|
|
153
|
+
this.log.info(`Adding the following ${propName} to build.gradle.kts: ${deps}`);
|
|
158
154
|
configuration = (0, _utils.updateDependencyLines)(configuration, propName, deps);
|
|
159
155
|
}
|
|
160
156
|
|
|
@@ -166,9 +162,7 @@ class ServerBuilder {
|
|
|
166
162
|
cmd,
|
|
167
163
|
args
|
|
168
164
|
} = this.getCommand();
|
|
169
|
-
|
|
170
|
-
_logger.default.debug(`Beginning build with command '${cmd} ${args.join(' ')}' ` + `in directory '${this.serverPath}'`);
|
|
171
|
-
|
|
165
|
+
this.log.debug(`Beginning build with command '${cmd} ${args.join(' ')}' ` + `in directory '${this.serverPath}'`);
|
|
172
166
|
const gradlebuild = new _teen_process.SubProcess(cmd, args, {
|
|
173
167
|
cwd: this.serverPath,
|
|
174
168
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
@@ -176,15 +170,13 @@ class ServerBuilder {
|
|
|
176
170
|
});
|
|
177
171
|
let buildLastLines = [];
|
|
178
172
|
const logMsg = `Output from Gradle ${this.showGradleLog ? 'will' : 'will not'} be logged`;
|
|
179
|
-
|
|
180
|
-
_logger.default.debug(`${logMsg}. To change this, use 'showGradleLog' desired capability`);
|
|
181
|
-
|
|
173
|
+
this.log.debug(`${logMsg}. To change this, use 'showGradleLog' desired capability`);
|
|
182
174
|
gradlebuild.on('stream-line', line => {
|
|
183
175
|
if (this.showGradleLog) {
|
|
184
176
|
if (line.startsWith('[STDERR]')) {
|
|
185
|
-
|
|
177
|
+
this.log.warn(`[Gradle] ${line}`);
|
|
186
178
|
} else {
|
|
187
|
-
|
|
179
|
+
this.log.info(`[Gradle] ${line}`);
|
|
188
180
|
}
|
|
189
181
|
}
|
|
190
182
|
|
|
@@ -200,8 +192,7 @@ class ServerBuilder {
|
|
|
200
192
|
await gradlebuild.join();
|
|
201
193
|
} catch (err) {
|
|
202
194
|
let msg = `Unable to build Espresso server - ${err.message}\n` + `Gradle error message:${_os.EOL}${buildLastLines}`;
|
|
203
|
-
|
|
204
|
-
_logger.default.errorAndThrow(msg);
|
|
195
|
+
this.log.errorAndThrow(msg);
|
|
205
196
|
}
|
|
206
197
|
}
|
|
207
198
|
|
|
@@ -212,4 +203,4 @@ var _default = ServerBuilder;
|
|
|
212
203
|
exports.default = _default;require('source-map-support').install();
|
|
213
204
|
|
|
214
205
|
|
|
215
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zZXJ2ZXItYnVpbGRlci5qcyJdLCJuYW1lcyI6WyJHUkFETEVfVkVSU0lPTl9LRVkiLCJHUkFETEVfVVJMX1BSRUZJWCIsIkdSQURMRV9VUkxfVEVNUExBVEUiLCJHUkFETEVfTUFYX0VSUk9SX0xPR19MSU5FUyIsIkRFUEVOREVOQ1lfUFJPUF9OQU1FUyIsIlZFUlNJT05fS0VZUyIsImdyYWRsZUxvZyIsImxvZ2dlciIsImdldExvZ2dlciIsImJ1aWxkU2VydmVyU2lnbmluZ0NvbmZpZyIsImFyZ3MiLCJ6aXBBbGlnbiIsImtleXN0b3JlRmlsZSIsImtleXN0b3JlUGFzc3dvcmQiLCJrZXlBbGlhcyIsImtleVBhc3N3b3JkIiwiU2VydmVyQnVpbGRlciIsImNvbnN0cnVjdG9yIiwic2VydmVyUGF0aCIsInNob3dHcmFkbGVMb2ciLCJidWlsZENvbmZpZ3VyYXRpb24iLCJ2ZXJzaW9uQ29uZmlndXJhdGlvbiIsInRvb2xzVmVyc2lvbnMiLCJzZXJ2ZXJWZXJzaW9ucyIsIl8iLCJyZWR1Y2UiLCJhY2MiLCJ2YWx1ZSIsImtleSIsImluY2x1ZGVzIiwibG9nIiwid2FybiIsInRlc3RBcHBQYWNrYWdlIiwic2lnbmluZ0NvbmZpZyIsInByb3BOYW1lIiwiYnVpbGQiLCJzZXRHcmFkbGVXcmFwcGVyVmVyc2lvbiIsImluc2VydEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMiLCJydW5CdWlsZFByb2Nlc3MiLCJnZXRDb21tYW5kIiwiY21kIiwic3lzdGVtIiwiaXNXaW5kb3dzIiwiYnVpbGRQcm9wZXJ0eSIsImZpbHRlciIsIm1hcCIsInNlcnZlclZlcnNpb24iLCJncmFkbGVQcm9wZXJ0eSIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJCb29sZWFuIiwicHVzaCIsImtleXMiLCJ1cHBlckZpcnN0IiwiayIsInYiLCJ2ZXJzaW9uIiwicHJvcGVydGllc1BhdGgiLCJwYXRoIiwicmVzb2x2ZSIsIm9yaWdpbmFsUHJvcGVydGllcyIsImZzIiwicmVhZEZpbGUiLCJuZXdQcm9wZXJ0aWVzIiwidXBkYXRlR3JhZGxlRGlzdFVybCIsIndyaXRlRmlsZSIsInByb3BlcnRpZXNDb250ZW50IiwicmVwbGFjZSIsIlJlZ0V4cCIsImVzY2FwZVJlZ0V4cCIsImhhc0FkZGl0aW9uYWxEZXBzIiwiaXNBcnJheSIsIkVycm9yIiwiaXNFbXB0eSIsImxpbmUiLCJ0cmltIiwiZGVwIiwidGVzdCIsImJ1aWxkUGF0aCIsImNvbmZpZ3VyYXRpb24iLCJwcmVmaXgiLCJkZXBzIiwiaW5mbyIsImRlYnVnIiwiam9pbiIsImdyYWRsZWJ1aWxkIiwiU3ViUHJvY2VzcyIsImN3ZCIsInN0ZGlvIiwid2luZG93c1ZlcmJhdGltQXJndW1lbnRzIiwiYnVpbGRMYXN0TGluZXMiLCJsb2dNc2ciLCJvbiIsInN0YXJ0c1dpdGgiLCJFT0wiLCJsZW5ndGgiLCJzdGFydCIsImVyciIsIm1zZyIsIm1lc3NhZ2UiLCJlcnJvckFuZFRocm93Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsa0JBQWtCLEdBQUcsUUFBM0I7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRyxrQkFBMUI7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxvRUFBNUI7O0FBQ0EsTUFBTUMsMEJBQTBCLEdBQUcsRUFBbkM7QUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxDQUFDLDJCQUFELEVBQThCLG1DQUE5QixDQUE5QjtBQUVBLE1BQU1DLFlBQVksR0FBRyxDQUNuQkwsa0JBRG1CLEVBRW5CLHFCQUZtQixFQUduQixZQUhtQixFQUluQixZQUptQixFQUtuQixRQUxtQixFQU1uQixXQU5tQixFQU9uQixRQVBtQixFQVFuQixxQkFSbUIsRUFTbkIscUJBVG1CLEVBVW5CLFdBVm1CLEVBV25CLGdCQVhtQixDQUFyQjs7O0FBY0EsTUFBTU0sU0FBUyxHQUFHQyxnQkFBT0MsU0FBUCxDQUFpQixRQUFqQixDQUFsQjs7QUFFQSxTQUFTQyx3QkFB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Qjs7O2VBOEpMbkYsYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN1YlByb2Nlc3MgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgZnMsIGxvZ2dlciwgc3lzdGVtIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgRU9MIH0gZnJvbSAnb3MnO1xuaW1wb3J0IHsgdXBkYXRlRGVwZW5kZW5jeUxpbmVzIH0gZnJvbSAnLi91dGlscyc7XG5cbmNvbnN0IEdSQURMRV9WRVJTSU9OX0tFWSA9ICdncmFkbGUnO1xuY29uc3QgR1JBRExFX1VSTF9QUkVGSVggPSAnZGlzdHJpYnV0aW9uVXJsPSc7XG5jb25zdCBHUkFETEVfVVJMX1RFTVBMQVRFID0gJ2h0dHBzXFxcXDovL3NlcnZpY2VzLmdyYWRsZS5vcmcvZGlzdHJpYnV0aW9ucy9ncmFkbGUtVkVSU0lPTi1hbGwuemlwJztcbmNvbnN0IEdSQURMRV9NQVhfRVJST1JfTE9HX0xJTkVTID0gMTU7XG5jb25zdCBERVBFTkRFTkNZX1BST1BfTkFNRVMgPSBbJ2FkZGl0aW9uYWxBcHBEZXBlbmRlbmNpZXMnLCAnYWRkaXRpb25hbEFuZHJvaWRUZXN0RGVwZW5kZW5jaWVzJ107XG5cbmNvbnN0IFZFUlNJT05fS0VZUyA9IFtcbiAgR1JBRExFX1ZFUlNJT05fS0VZLFxuICAnYW5kcm9pZEdyYWRsZVBsdWdpbicsXG4gICdjb21waWxlU2RrJyxcbiAgJ2J1aWxkVG9vbHMnLFxuICAnbWluU2RrJyxcbiAgJ3RhcmdldFNkaycsXG4gICdrb3RsaW4nLFxuICAnc291cmNlQ29tcGF0aWJpbGl0eScsXG4gICd0YXJnZXRDb21wYXRpYmlsaXR5JyxcbiAgJ2p2bVRhcmdldCcsXG4gICdjb21wb3NlVmVyc2lvbidcbl07XG5cbmNvbnN0IGdyYWRsZUxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0dyYWRsZScpO1xuXG5mdW5jdGlvbiBidWlsZFNlcnZlclNpZ25pbmdDb25maWcgKGFyZ3MpIHtcbiAgcmV0dXJuIHtcbiAgICB6aXBBbGlnbjogdHJ1ZSxcbiAgICBrZXlzdG9yZUZpbGU6IGFyZ3Mua2V5c3RvcmVGaWxlLFxuICAgIGtleXN0b3JlUGFzc3dvcmQ6IGFyZ3Mua2V5c3RvcmVQYXNzd29yZCxcbiAgICBrZXlBbGlhczogYXJncy5rZXlBbGlhcyxcbiAgICBrZXlQYXNzd29yZDogYXJncy5rZXlQYXNzd29yZFxuICB9O1xufVxuXG5jbGFzcyBTZXJ2ZXJCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IgKGFyZ3MgPSB7fSkge1xuICAgIHRoaXMuc2VydmVyUGF0aCA9IGFyZ3Muc2VydmVyUGF0aDtcbiAgICB0aGlzLnNob3dHcmFkbGVMb2cgPSBhcmdzLnNob3dHcmFkbGVMb2c7XG5cbiAgICBjb25zdCBidWlsZENvbmZpZ3VyYXRpb24gPSBhcmdzLmJ1aWxkQ29uZmlndXJhdGlvbiB8fCB7fTtcblxuICAgIGNvbnN0IHZlcnNpb25Db25maWd1cmF0aW9uID0gYnVpbGRDb25maWd1cmF0aW9uLnRvb2xzVmVyc2lvbnMgfHwge307XG4gICAgdGhpcy5zZXJ2ZXJWZXJzaW9ucyA9IF8ucmVkdWNlKHZlcnNpb25Db25maWd1cmF0aW9uLCAoYWNjLCB2YWx1ZSwga2V5KSA9PiB7XG4gICAgICBpZiAoVkVSU0lPTl9LRVlTLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgYWNjW2tleV0gPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZy53YXJuKGBHb3QgdW5leHBlY3RlZCAnJHtrZXl9JyBpbiB0b29sc1ZlcnNpb24gYmxvY2sgb2YgdGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb25gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xuXG4gICAgdGhpcy50ZXN0QXBwUGFja2FnZSA9IGFyZ3MudGVzdEFwcFBhY2thZ2U7XG4gICAgdGhpcy5zaWduaW5nQ29uZmlnID0gYXJncy5zaWduaW5nQ29uZmlnO1xuXG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBERVBFTkRFTkNZX1BST1BfTkFNRVMpIHtcbiAgICAgIHRoaXNbcHJvcE5hbWVdID0gYnVpbGRDb25maWd1cmF0aW9uW3Byb3BOYW1lXSB8fCBbXTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBidWlsZCAoKSB7XG4gICAgaWYgKHRoaXMuc2VydmVyVmVyc2lvbnNbR1JBRExFX1ZFUlNJT05fS0VZXSkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRHcmFkbGVXcmFwcGVyVmVyc2lvbih0aGlzLnNlcnZlclZlcnNpb25zW0dSQURMRV9WRVJTSU9OX0tFWV0pO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuaW5zZXJ0QWRkaXRpb25hbERlcGVuZGVuY2llcygpO1xuXG4gICAgYXdhaXQgdGhpcy5ydW5CdWlsZFByb2Nlc3MoKTtcbiAgfVxuXG4gIGdldENvbW1hbmQgKCkge1xuICAgIGNvbnN0IGNtZCA9IHN5c3RlbS5pc1dpbmRvd3MoKSA/ICdncmFkbGV3LmJhdCcgOiAnLi9ncmFkbGV3JztcbiAgICBjb25zdCBidWlsZFByb3BlcnR5ID0gKGtleSwgdmFsdWUpID0+IHZhbHVlID8gYC1QJHtrZXl9PSR7dmFsdWV9YCA6IG51bGw7XG4gICAgbGV0IGFyZ3MgPSBWRVJTSU9OX0tFWVNcbiAgICAgIC5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBHUkFETEVfVkVSU0lPTl9LRVkpXG4gICAgICAubWFwKChrZXkpID0+IHtcbiAgICAgICAgY29uc3Qgc2VydmVyVmVyc2lvbiA9IHRoaXMuc2VydmVyVmVyc2lvbnNba2V5XTtcbiAgICAgICAgY29uc3QgZ3JhZGxlUHJvcGVydHkgPSBgYXBwaXVtJHtrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9JHtrZXkuc2xpY2UoMSl9YDtcbiAgICAgICAgcmV0dXJuIGJ1aWxkUHJvcGVydHkoZ3JhZGxlUHJvcGVydHksIHNlcnZlclZlcnNpb24pO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICBpZiAodGhpcy5zaWduaW5nQ29uZmlnKSB7XG4gICAgICBhcmdzLnB1c2goLi4uKFxuICAgICAgICBfLmtleXModGhpcy5zaWduaW5nQ29uZmlnKVxuICAgICAgICAubWFwKChrZXkpID0+IFtgYXBwaXVtJHtfLnVwcGVyRmlyc3Qoa2V5KX1gLCB0aGlzLnNpZ25pbmdDb25maWdba2V5XV0pXG4gICAgICAgIC5tYXAoKFtrLCB2XSkgPT4gYnVpbGRQcm9wZXJ0eShrLCB2KSlcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGVzdEFwcFBhY2thZ2UpIHtcbiAgICAgIGFyZ3MucHVzaChidWlsZFByb3BlcnR5KCdhcHBpdW1UYXJnZXRQYWNrYWdlJywgdGhpcy50ZXN0QXBwUGFja2FnZSkpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ2FwcDphc3NlbWJsZUFuZHJvaWRUZXN0Jyk7XG5cbiAgICByZXR1cm4ge2NtZCwgYXJnc307XG4gIH1cblxuICBhc3luYyBzZXRHcmFkbGVXcmFwcGVyVmVyc2lvbiAodmVyc2lvbikge1xuICAgIGNvbnN0IHByb3BlcnRpZXNQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuc2VydmVyUGF0aCwgJ2dyYWRsZScsICd3cmFwcGVyJywgJ2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMnKTtcbiAgICBjb25zdCBvcmlnaW5hbFByb3BlcnRpZXMgPSBhd2FpdCBmcy5yZWFkRmlsZShwcm9wZXJ0aWVzUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBuZXdQcm9wZXJ0aWVzID0gdGhpcy51cGRhdGVHcmFkbGVEaXN0VXJsKG9yaWdpbmFsUHJvcGVydGllcywgdmVyc2lvbik7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHByb3BlcnRpZXNQYXRoLCBuZXdQcm9wZXJ0aWVzLCAndXRmOCcpO1xuICB9XG5cbiAgdXBkYXRlR3JhZGxlRGlzdFVybCAocHJvcGVydGllc0NvbnRlbnQsIHZlcnNpb24pIHtcbiAgICByZXR1cm4gcHJvcGVydGllc0NvbnRlbnQucmVwbGFjZShcbiAgICAgIG5ldyBSZWdFeHAoYF4oJHtfLmVzY2FwZVJlZ0V4cChHUkFETEVfVVJMX1BSRUZJWCl9KS4rJGAsICdnbScpLFxuICAgICAgYCQxJHtHUkFETEVfVVJMX1RFTVBMQVRFLnJlcGxhY2UoJ1ZFUlNJT04nLCB2ZXJzaW9uKX1gXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGluc2VydEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMgKCkge1xuICAgIGxldCBoYXNBZGRpdGlvbmFsRGVwcyA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgcHJvcE5hbWUgb2YgREVQRU5ERU5DWV9QUk9QX05BTUVTKSB7XG4gICAgICBpZiAoIV8uaXNBcnJheSh0aGlzW3Byb3BOYW1lXSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtwcm9wTmFtZX0nIG11c3QgYmUgYW4gYXJyYXlgKTtcbiAgICAgIH1cbiAgICAgIGlmIChfLmlzRW1wdHkodGhpc1twcm9wTmFtZV0uZmlsdGVyKChsaW5lKSA9PiBfLnRyaW0obGluZSkpKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBkZXAgb2YgdGhpc1twcm9wTmFtZV0pIHtcbiAgICAgICAgaWYgKC9bXFxzJ1xcXFwkXS8udGVzdChkZXApKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaW5nbGUgcXVvdGVzLCBkb2xsYXIgY2hhcmFjdGVycyBhbmQgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzJyArXG4gICAgICAgICAgICBgIGFyZSBkaXNhbGxvd2VkIGluIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzOiAke2RlcH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaGFzQWRkaXRpb25hbERlcHMgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIWhhc0FkZGl0aW9uYWxEZXBzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuc2VydmVyUGF0aCwgJ2FwcCcsICdidWlsZC5ncmFkbGUua3RzJyk7XG4gICAgbGV0IGNvbmZpZ3VyYXRpb24gPSBhd2FpdCBmcy5yZWFkRmlsZShidWlsZFBhdGgsICd1dGY4Jyk7XG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBERVBFTkRFTkNZX1BST1BfTkFNRVMpIHtcbiAgICAgIGNvbnN0IHByZWZpeCA9IHByb3BOYW1lID09PSBERVBFTkRFTkNZX1BST1BfTkFNRVNbMF1cbiAgICAgICAgPyAnaW1wbGVtZW50YXRpb24nXG4gICAgICAgIDogJ2FuZHJvaWRUZXN0SW1wbGVtZW50YXRpb24nO1xuICAgICAgY29uc3QgZGVwcyA9IHRoaXNbcHJvcE5hbWVdXG4gICAgICAgIC5maWx0ZXIoKGxpbmUpID0+IF8udHJpbShsaW5lKSlcbiAgICAgICAgLm1hcCgobGluZSkgPT4gYCR7cHJlZml4fShcIiR7bGluZX1cIilgKTtcbiAgICAgIGlmIChfLmlzRW1wdHkoZGVwcykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxvZy5pbmZvKGBBZGRpbmcgdGhlIGZvbGxvd2luZyAke3Byb3BOYW1lfSB0byBidWlsZC5ncmFkbGUua3RzOiAke2RlcHN9YCk7XG4gICAgICBjb25maWd1cmF0aW9uID0gdXBkYXRlRGVwZW5kZW5jeUxpbmVzKGNvbmZpZ3VyYXRpb24sIHByb3BOYW1lLCBkZXBzKTtcbiAgICB9XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGJ1aWxkUGF0aCwgY29uZmlndXJhdGlvbiwgJ3V0ZjgnKTtcbiAgfVxuXG4gIGFzeW5jIHJ1bkJ1aWxkUHJvY2VzcyAoKSB7XG4gICAgY29uc3Qge2NtZCwgYXJnc30gPSB0aGlzLmdldENvbW1hbmQoKTtcbiAgICBsb2cuZGVidWcoYEJlZ2lubmluZyBidWlsZCB3aXRoIGNvbW1hbmQgJyR7Y21kfSAke2FyZ3Muam9pbignICcpfScgYCArXG4gICAgICBgaW4gZGlyZWN0b3J5ICcke3RoaXMuc2VydmVyUGF0aH0nYCk7XG4gICAgY29uc3QgZ3JhZGxlYnVpbGQgPSBuZXcgU3ViUHJvY2VzcyhjbWQsIGFyZ3MsIHtcbiAgICAgIGN3ZDogdGhpcy5zZXJ2ZXJQYXRoLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgICAgd2luZG93c1ZlcmJhdGltQXJndW1lbnRzOiB0cnVlXG4gICAgfSk7XG4gICAgbGV0IGJ1aWxkTGFzdExpbmVzID0gW107XG5cbiAgICBjb25zdCBsb2dNc2cgPSBgT3V0cHV0IGZyb20gR3JhZGxlICR7dGhpcy5zaG93R3JhZGxlTG9nID8gJ3dpbGwnIDogJ3dpbGwgbm90J30gYmUgbG9nZ2VkYDtcbiAgICBsb2cuZGVidWcoYCR7bG9nTXNnfS4gVG8gY2hhbmdlIHRoaXMsIHVzZSAnc2hvd0dyYWRsZUxvZycgZGVzaXJlZCBjYXBhYmlsaXR5YCk7XG4gICAgZ3JhZGxlYnVpbGQub24oJ3N0cmVhbS1saW5lJywgKGxpbmUpID0+IHtcbiAgICAgIGlmICh0aGlzLnNob3dHcmFkbGVMb2cpIHtcbiAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnW1NUREVSUl0nKSkge1xuICAgICAgICAgIGdyYWRsZUxvZy53YXJuKGxpbmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdyYWRsZUxvZy5pbmZvKGxpbmUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBidWlsZExhc3RMaW5lcy5wdXNoKGAke0VPTH0ke2xpbmV9YCk7XG4gICAgICBpZiAoYnVpbGRMYXN0TGluZXMubGVuZ3RoID4gR1JBRExFX01BWF9FUlJPUl9MT0dfTElORVMpIHtcbiAgICAgICAgYnVpbGRMYXN0TGluZXMgPSBidWlsZExhc3RMaW5lcy5zbGljZSgtR1JBRExFX01BWF9FUlJPUl9MT0dfTElORVMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGdyYWRsZWJ1aWxkLnN0YXJ0KCk7XG4gICAgICBhd2FpdCBncmFkbGVidWlsZC5qb2luKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsZXQgbXNnID0gYFVuYWJsZSB0byBidWlsZCBFc3ByZXNzbyBzZXJ2ZXIgLSAke2Vyci5tZXNzYWdlfVxcbmAgK1xuICAgICAgICBgR3JhZGxlIGVycm9yIG1lc3NhZ2U6JHtFT0x9JHtidWlsZExhc3RMaW5lc31gO1xuICAgICAgbG9nLmVycm9yQW5kVGhyb3cobXNnKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgU2VydmVyQnVpbGRlciwgVkVSU0lPTl9LRVlTLCBHUkFETEVfVVJMX1RFTVBMQVRFLCBidWlsZFNlcnZlclNpZ25pbmdDb25maWcgfTtcbmV4cG9ydCBkZWZhdWx0IFNlcnZlckJ1aWxkZXI7XG4iXSwiZmlsZSI6ImxpYi9zZXJ2ZXItYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|
|
206
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL3NlcnZlci1idWlsZGVyLmpzIiwibmFtZXMiOlsiR1JBRExFX1ZFUlNJT05fS0VZIiwiR1JBRExFX1VSTF9QUkVGSVgiLCJHUkFETEVfVVJMX1RFTVBMQVRFIiwiR1JBRExFX01BWF9FUlJPUl9MT0dfTElORVMiLCJERVBFTkRFTkNZX1BST1BfTkFNRVMiLCJWRVJTSU9OX0tFWVMiLCJidWlsZFNlcnZlclNpZ25pbmdDb25maWciLCJhcmdzIiwiemlwQWxpZ24iLCJrZXlzdG9yZUZpbGUiLCJrZXlzdG9yZVBhc3N3b3JkIiwia2V5QWxpYXMiLCJrZXlQYXNzd29yZCIsIlNlcnZlckJ1aWxkZXIiLCJjb25zdHJ1Y3RvciIsImxvZyIsInNlcnZlclBhdGgiLCJzaG93R3JhZGxlTG9nIiwiYnVpbGRDb25maWd1cmF0aW9uIiwidmVyc2lvbkNvbmZpZ3VyYXRpb24iLCJ0b29sc1ZlcnNpb25zIiwic2VydmVyVmVyc2lvbnMiLCJfIiwicmVkdWNlIiwiYWNjIiwidmFsdWUiLCJrZXkiLCJpbmNsdWRlcyIsIndhcm4iLCJ0ZXN0QXBwUGFja2FnZSIsInNpZ25pbmdDb25maWciLCJwcm9wTmFtZSIsImJ1aWxkIiwic2V0R3JhZGxlV3JhcHBlclZlcnNpb24iLCJpbnNlcnRBZGRpdGlvbmFsRGVwZW5kZW5jaWVzIiwicnVuQnVpbGRQcm9jZXNzIiwiZ2V0Q29tbWFuZCIsImNtZCIsInN5c3RlbSIsImlzV2luZG93cyIsInBhdGgiLCJyZXNvbHZlIiwiYnVpbGRQcm9wZXJ0eSIsImZpbHRlciIsIm1hcCIsInNlcnZlclZlcnNpb24iLCJncmFkbGVQcm9wZXJ0eSIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJCb29sZWFuIiwicHVzaCIsImtleXMiLCJ1cHBlckZpcnN0IiwiayIsInYiLCJ2ZXJzaW9uIiwicHJvcGVydGllc1BhdGgiLCJvcmlnaW5hbFByb3BlcnRpZXMiLCJmcyIsInJlYWRGaWxlIiwibmV3UHJvcGVydGllcyIsInVwZGF0ZUdyYWRsZURpc3RVcmwiLCJ3cml0ZUZpbGUiLCJwcm9wZXJ0aWVzQ29udGVudCIsInJlcGxhY2UiLCJSZWdFeHAiLCJlc2NhcGVSZWdFeHAiLCJoYXNBZGRpdGlvbmFsRGVwcyIsImlzQXJyYXkiLCJFcnJvciIsImlzRW1wdHkiLCJsaW5lIiwidHJpbSIsImRlcCIsInRlc3QiLCJidWlsZFBhdGgiLCJjb25maWd1cmF0aW9uIiwicHJlZml4IiwiZGVwcyIsImluZm8iLCJkZWJ1ZyIsImpvaW4iLCJncmFkbGVidWlsZCIsIlN1YlByb2Nlc3MiLCJjd2QiLCJzdGRpbyIsIndpbmRvd3NWZXJiYXRpbUFyZ3VtZW50cyIsImJ1aWxkTGFzdExpbmVzIiwibG9nTXNnIiwib24iLCJzdGFydHNXaXRoIiwiRU9MIiwibGVuZ3RoIiwic3RhcnQiLCJlcnIiLCJtc2ciLCJtZXNzYWdlIiwiZXJyb3JBbmRUaHJvdyJdLCJzb3VyY2VSb290IjoiLi4vLi4iLCJzb3VyY2VzIjpbImxpYi9zZXJ2ZXItYnVpbGRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdWJQcm9jZXNzIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCB7IGZzLCBzeXN0ZW0gfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgRU9MIH0gZnJvbSAnb3MnO1xuaW1wb3J0IHsgdXBkYXRlRGVwZW5kZW5jeUxpbmVzIH0gZnJvbSAnLi91dGlscyc7XG5cbmNvbnN0IEdSQURMRV9WRVJTSU9OX0tFWSA9ICdncmFkbGUnO1xuY29uc3QgR1JBRExFX1VSTF9QUkVGSVggPSAnZGlzdHJpYnV0aW9uVXJsPSc7XG5jb25zdCBHUkFETEVfVVJMX1RFTVBMQVRFID0gJ2h0dHBzXFxcXDovL3NlcnZpY2VzLmdyYWRsZS5vcmcvZGlzdHJpYnV0aW9ucy9ncmFkbGUtVkVSU0lPTi1hbGwuemlwJztcbmNvbnN0IEdSQURMRV9NQVhfRVJST1JfTE9HX0xJTkVTID0gMTU7XG5jb25zdCBERVBFTkRFTkNZX1BST1BfTkFNRVMgPSBbJ2FkZGl0aW9uYWxBcHBEZXBlbmRlbmNpZXMnLCAnYWRkaXRpb25hbEFuZHJvaWRUZXN0RGVwZW5kZW5jaWVzJ107XG5cbmNvbnN0IFZFUlNJT05fS0VZUyA9IFtcbiAgR1JBRExFX1ZFUlNJT05fS0VZLFxuICAnYW5kcm9pZEdyYWRsZVBsdWdpbicsXG4gICdjb21waWxlU2RrJyxcbiAgJ2J1aWxkVG9vbHMnLFxuICAnbWluU2RrJyxcbiAgJ3RhcmdldFNkaycsXG4gICdrb3RsaW4nLFxuICAnc291cmNlQ29tcGF0aWJpbGl0eScsXG4gICd0YXJnZXRDb21wYXRpYmlsaXR5JyxcbiAgJ2p2bVRhcmdldCcsXG4gICdjb21wb3NlVmVyc2lvbidcbl07XG5cbmZ1bmN0aW9uIGJ1aWxkU2VydmVyU2lnbmluZ0NvbmZpZyAoYXJncykge1xuICByZXR1cm4ge1xuICAgIHppcEFsaWduOiB0cnVlLFxuICAgIGtleXN0b3JlRmlsZTogYXJncy5rZXlzdG9yZUZpbGUsXG4gICAga2V5c3RvcmVQYXNzd29yZDogYXJncy5rZXlzdG9yZVBhc3N3b3JkLFxuICAgIGtleUFsaWFzOiBhcmdzLmtleUFsaWFzLFxuICAgIGtleVBhc3N3b3JkOiBhcmdzLmtleVBhc3N3b3JkXG4gIH07XG59XG5cbmNsYXNzIFNlcnZlckJ1aWxkZXIge1xuICBjb25zdHJ1Y3RvciAobG9nLCBhcmdzID0ge30pIHtcbiAgICB0aGlzLmxvZyA9IGxvZztcbiAgICB0aGlzLnNlcnZlclBhdGggPSBhcmdzLnNlcnZlclBhdGg7XG4gICAgdGhpcy5zaG93R3JhZGxlTG9nID0gYXJncy5zaG93R3JhZGxlTG9nO1xuXG4gICAgY29uc3QgYnVpbGRDb25maWd1cmF0aW9uID0gYXJncy5idWlsZENvbmZpZ3VyYXRpb24gfHwge307XG5cbiAgICBjb25zdCB2ZXJzaW9uQ29uZmlndXJhdGlvbiA9IGJ1aWxkQ29uZmlndXJhdGlvbi50b29sc1ZlcnNpb25zIHx8IHt9O1xuICAgIHRoaXMuc2VydmVyVmVyc2lvbnMgPSBfLnJlZHVjZSh2ZXJzaW9uQ29uZmlndXJhdGlvbiwgKGFjYywgdmFsdWUsIGtleSkgPT4ge1xuICAgICAgaWYgKFZFUlNJT05fS0VZUy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cud2FybihgR290IHVuZXhwZWN0ZWQgJyR7a2V5fScgaW4gdG9vbHNWZXJzaW9uIGJsb2NrIG9mIHRoZSBidWlsZCBjb25maWd1cmF0aW9uYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcblxuICAgIHRoaXMudGVzdEFwcFBhY2thZ2UgPSBhcmdzLnRlc3RBcHBQYWNrYWdlO1xuICAgIHRoaXMuc2lnbmluZ0NvbmZpZyA9IGFyZ3Muc2lnbmluZ0NvbmZpZztcblxuICAgIGZvciAoY29uc3QgcHJvcE5hbWUgb2YgREVQRU5ERU5DWV9QUk9QX05BTUVTKSB7XG4gICAgICB0aGlzW3Byb3BOYW1lXSA9IGJ1aWxkQ29uZmlndXJhdGlvbltwcm9wTmFtZV0gfHwgW107XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYnVpbGQgKCkge1xuICAgIGlmICh0aGlzLnNlcnZlclZlcnNpb25zW0dSQURMRV9WRVJTSU9OX0tFWV0pIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0R3JhZGxlV3JhcHBlclZlcnNpb24odGhpcy5zZXJ2ZXJWZXJzaW9uc1tHUkFETEVfVkVSU0lPTl9LRVldKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmluc2VydEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMoKTtcblxuICAgIGF3YWl0IHRoaXMucnVuQnVpbGRQcm9jZXNzKCk7XG4gIH1cblxuICBnZXRDb21tYW5kICgpIHtcbiAgICBjb25zdCBjbWQgPSBzeXN0ZW0uaXNXaW5kb3dzKCkgPyAnZ3JhZGxldy5iYXQnIDogcGF0aC5yZXNvbHZlKHRoaXMuc2VydmVyUGF0aCwgJ2dyYWRsZXcnKTtcbiAgICBjb25zdCBidWlsZFByb3BlcnR5ID0gKGtleSwgdmFsdWUpID0+IHZhbHVlID8gYC1QJHtrZXl9PSR7dmFsdWV9YCA6IG51bGw7XG4gICAgbGV0IGFyZ3MgPSBWRVJTSU9OX0tFWVNcbiAgICAgIC5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBHUkFETEVfVkVSU0lPTl9LRVkpXG4gICAgICAubWFwKChrZXkpID0+IHtcbiAgICAgICAgY29uc3Qgc2VydmVyVmVyc2lvbiA9IHRoaXMuc2VydmVyVmVyc2lvbnNba2V5XTtcbiAgICAgICAgY29uc3QgZ3JhZGxlUHJvcGVydHkgPSBgYXBwaXVtJHtrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9JHtrZXkuc2xpY2UoMSl9YDtcbiAgICAgICAgcmV0dXJuIGJ1aWxkUHJvcGVydHkoZ3JhZGxlUHJvcGVydHksIHNlcnZlclZlcnNpb24pO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICBpZiAodGhpcy5zaWduaW5nQ29uZmlnKSB7XG4gICAgICBhcmdzLnB1c2goLi4uKFxuICAgICAgICBfLmtleXModGhpcy5zaWduaW5nQ29uZmlnKVxuICAgICAgICAubWFwKChrZXkpID0+IFtgYXBwaXVtJHtfLnVwcGVyRmlyc3Qoa2V5KX1gLCB0aGlzLnNpZ25pbmdDb25maWdba2V5XV0pXG4gICAgICAgIC5tYXAoKFtrLCB2XSkgPT4gYnVpbGRQcm9wZXJ0eShrLCB2KSlcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGVzdEFwcFBhY2thZ2UpIHtcbiAgICAgIGFyZ3MucHVzaChidWlsZFByb3BlcnR5KCdhcHBpdW1UYXJnZXRQYWNrYWdlJywgdGhpcy50ZXN0QXBwUGFja2FnZSkpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ2FwcDphc3NlbWJsZUFuZHJvaWRUZXN0Jyk7XG5cbiAgICByZXR1cm4ge2NtZCwgYXJnc307XG4gIH1cblxuICBhc3luYyBzZXRHcmFkbGVXcmFwcGVyVmVyc2lvbiAodmVyc2lvbikge1xuICAgIGNvbnN0IHByb3BlcnRpZXNQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuc2VydmVyUGF0aCwgJ2dyYWRsZScsICd3cmFwcGVyJywgJ2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMnKTtcbiAgICBjb25zdCBvcmlnaW5hbFByb3BlcnRpZXMgPSBhd2FpdCBmcy5yZWFkRmlsZShwcm9wZXJ0aWVzUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBuZXdQcm9wZXJ0aWVzID0gdGhpcy51cGRhdGVHcmFkbGVEaXN0VXJsKG9yaWdpbmFsUHJvcGVydGllcywgdmVyc2lvbik7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHByb3BlcnRpZXNQYXRoLCBuZXdQcm9wZXJ0aWVzLCAndXRmOCcpO1xuICB9XG5cbiAgdXBkYXRlR3JhZGxlRGlzdFVybCAocHJvcGVydGllc0NvbnRlbnQsIHZlcnNpb24pIHtcbiAgICByZXR1cm4gcHJvcGVydGllc0NvbnRlbnQucmVwbGFjZShcbiAgICAgIG5ldyBSZWdFeHAoYF4oJHtfLmVzY2FwZVJlZ0V4cChHUkFETEVfVVJMX1BSRUZJWCl9KS4rJGAsICdnbScpLFxuICAgICAgYCQxJHtHUkFETEVfVVJMX1RFTVBMQVRFLnJlcGxhY2UoJ1ZFUlNJT04nLCB2ZXJzaW9uKX1gXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGluc2VydEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMgKCkge1xuICAgIGxldCBoYXNBZGRpdGlvbmFsRGVwcyA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgcHJvcE5hbWUgb2YgREVQRU5ERU5DWV9QUk9QX05BTUVTKSB7XG4gICAgICBpZiAoIV8uaXNBcnJheSh0aGlzW3Byb3BOYW1lXSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtwcm9wTmFtZX0nIG11c3QgYmUgYW4gYXJyYXlgKTtcbiAgICAgIH1cbiAgICAgIGlmIChfLmlzRW1wdHkodGhpc1twcm9wTmFtZV0uZmlsdGVyKChsaW5lKSA9PiBfLnRyaW0obGluZSkpKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBkZXAgb2YgdGhpc1twcm9wTmFtZV0pIHtcbiAgICAgICAgaWYgKC9bXFxzJ1xcXFwkXS8udGVzdChkZXApKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaW5nbGUgcXVvdGVzLCBkb2xsYXIgY2hhcmFjdGVycyBhbmQgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzJyArXG4gICAgICAgICAgICBgIGFyZSBkaXNhbGxvd2VkIGluIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzOiAke2RlcH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaGFzQWRkaXRpb25hbERlcHMgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIWhhc0FkZGl0aW9uYWxEZXBzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuc2VydmVyUGF0aCwgJ2FwcCcsICdidWlsZC5ncmFkbGUua3RzJyk7XG4gICAgbGV0IGNvbmZpZ3VyYXRpb24gPSBhd2FpdCBmcy5yZWFkRmlsZShidWlsZFBhdGgsICd1dGY4Jyk7XG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBERVBFTkRFTkNZX1BST1BfTkFNRVMpIHtcbiAgICAgIGNvbnN0IHByZWZpeCA9IHByb3BOYW1lID09PSBERVBFTkRFTkNZX1BST1BfTkFNRVNbMF1cbiAgICAgICAgPyAnaW1wbGVtZW50YXRpb24nXG4gICAgICAgIDogJ2FuZHJvaWRUZXN0SW1wbGVtZW50YXRpb24nO1xuICAgICAgY29uc3QgZGVwcyA9IHRoaXNbcHJvcE5hbWVdXG4gICAgICAgIC5maWx0ZXIoKGxpbmUpID0+IF8udHJpbShsaW5lKSlcbiAgICAgICAgLm1hcCgobGluZSkgPT4gYCR7cHJlZml4fShcIiR7bGluZX1cIilgKTtcbiAgICAgIGlmIChfLmlzRW1wdHkoZGVwcykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nLmluZm8oYEFkZGluZyB0aGUgZm9sbG93aW5nICR7cHJvcE5hbWV9IHRvIGJ1aWxkLmdyYWRsZS5rdHM6ICR7ZGVwc31gKTtcbiAgICAgIGNvbmZpZ3VyYXRpb24gPSB1cGRhdGVEZXBlbmRlbmN5TGluZXMoY29uZmlndXJhdGlvbiwgcHJvcE5hbWUsIGRlcHMpO1xuICAgIH1cbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoYnVpbGRQYXRoLCBjb25maWd1cmF0aW9uLCAndXRmOCcpO1xuICB9XG5cbiAgYXN5bmMgcnVuQnVpbGRQcm9jZXNzICgpIHtcbiAgICBjb25zdCB7Y21kLCBhcmdzfSA9IHRoaXMuZ2V0Q29tbWFuZCgpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBCZWdpbm5pbmcgYnVpbGQgd2l0aCBjb21tYW5kICcke2NtZH0gJHthcmdzLmpvaW4oJyAnKX0nIGAgK1xuICAgICAgYGluIGRpcmVjdG9yeSAnJHt0aGlzLnNlcnZlclBhdGh9J2ApO1xuICAgIGNvbnN0IGdyYWRsZWJ1aWxkID0gbmV3IFN1YlByb2Nlc3MoY21kLCBhcmdzLCB7XG4gICAgICBjd2Q6IHRoaXMuc2VydmVyUGF0aCxcbiAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgICAgIHdpbmRvd3NWZXJiYXRpbUFyZ3VtZW50czogdHJ1ZVxuICAgIH0pO1xuICAgIGxldCBidWlsZExhc3RMaW5lcyA9IFtdO1xuXG4gICAgY29uc3QgbG9nTXNnID0gYE91dHB1dCBmcm9tIEdyYWRsZSAke3RoaXMuc2hvd0dyYWRsZUxvZyA/ICd3aWxsJyA6ICd3aWxsIG5vdCd9IGJlIGxvZ2dlZGA7XG4gICAgdGhpcy5sb2cuZGVidWcoYCR7bG9nTXNnfS4gVG8gY2hhbmdlIHRoaXMsIHVzZSAnc2hvd0dyYWRsZUxvZycgZGVzaXJlZCBjYXBhYmlsaXR5YCk7XG4gICAgZ3JhZGxlYnVpbGQub24oJ3N0cmVhbS1saW5lJywgKGxpbmUpID0+IHtcbiAgICAgIGlmICh0aGlzLnNob3dHcmFkbGVMb2cpIHtcbiAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnW1NUREVSUl0nKSkge1xuICAgICAgICAgIHRoaXMubG9nLndhcm4oYFtHcmFkbGVdICR7bGluZX1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBbR3JhZGxlXSAke2xpbmV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJ1aWxkTGFzdExpbmVzLnB1c2goYCR7RU9MfSR7bGluZX1gKTtcbiAgICAgIGlmIChidWlsZExhc3RMaW5lcy5sZW5ndGggPiBHUkFETEVfTUFYX0VSUk9SX0xPR19MSU5FUykge1xuICAgICAgICBidWlsZExhc3RMaW5lcyA9IGJ1aWxkTGFzdExpbmVzLnNsaWNlKC1HUkFETEVfTUFYX0VSUk9SX0xPR19MSU5FUyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZ3JhZGxlYnVpbGQuc3RhcnQoKTtcbiAgICAgIGF3YWl0IGdyYWRsZWJ1aWxkLmpvaW4oKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxldCBtc2cgPSBgVW5hYmxlIHRvIGJ1aWxkIEVzcHJlc3NvIHNlcnZlciAtICR7ZXJyLm1lc3NhZ2V9XFxuYCArXG4gICAgICAgIGBHcmFkbGUgZXJyb3IgbWVzc2FnZToke0VPTH0ke2J1aWxkTGFzdExpbmVzfWA7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KG1zZyk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IFNlcnZlckJ1aWxkZXIsIFZFUlNJT05fS0VZUywgR1JBRExFX1VSTF9URU1QTEFURSwgYnVpbGRTZXJ2ZXJTaWduaW5nQ29uZmlnIH07XG5leHBvcnQgZGVmYXVsdCBTZXJ2ZXJCdWlsZGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsa0JBQWtCLEdBQUcsUUFBM0I7QUFDQSxNQUFN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
|