appium-android-driver 5.4.3 → 5.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/index.js +1 -9
- package/build/lib/android-helpers.js +10 -194
- package/build/lib/android-helpers.js.map +1 -1
- package/build/lib/bootstrap.js +4 -45
- package/build/lib/bootstrap.js.map +1 -1
- package/build/lib/commands/actions.js +3 -78
- package/build/lib/commands/actions.js.map +1 -1
- package/build/lib/commands/alert.js +3 -10
- package/build/lib/commands/alert.js.map +1 -1
- package/build/lib/commands/app-management.js +4 -32
- package/build/lib/commands/app-management.js.map +1 -1
- package/build/lib/commands/context.js +6 -78
- package/build/lib/commands/context.js.map +1 -1
- package/build/lib/commands/coverage.js +1 -6
- package/build/lib/commands/coverage.js.map +1 -1
- package/build/lib/commands/element.js +4 -47
- package/build/lib/commands/element.js.map +1 -1
- package/build/lib/commands/emu-console.js +2 -7
- package/build/lib/commands/emu-console.js.map +1 -1
- package/build/lib/commands/execute.js +1 -13
- package/build/lib/commands/execute.js.map +1 -1
- package/build/lib/commands/file-actions.js +3 -44
- package/build/lib/commands/file-actions.js.map +1 -1
- package/build/lib/commands/find.js +3 -16
- package/build/lib/commands/find.js.map +1 -1
- package/build/lib/commands/general.js +32 -91
- package/build/lib/commands/general.js.map +1 -1
- package/build/lib/commands/ime.js +3 -14
- package/build/lib/commands/ime.js.map +1 -1
- package/build/lib/commands/index.js +3 -27
- package/build/lib/commands/index.js.map +1 -1
- package/build/lib/commands/intent.js +1 -40
- package/build/lib/commands/intent.js.map +1 -1
- package/build/lib/commands/log.js +3 -35
- package/build/lib/commands/log.js.map +1 -1
- package/build/lib/commands/media-projection.js +2 -47
- package/build/lib/commands/media-projection.js.map +1 -1
- package/build/lib/commands/network.js +4 -40
- package/build/lib/commands/network.js.map +1 -1
- package/build/lib/commands/performance.js +5 -57
- package/build/lib/commands/performance.js.map +1 -1
- package/build/lib/commands/recordscreen.js +1 -59
- package/build/lib/commands/recordscreen.js.map +1 -1
- package/build/lib/commands/shell.js +1 -15
- package/build/lib/commands/shell.js.map +1 -1
- package/build/lib/commands/streamscreen.js +7 -74
- package/build/lib/commands/streamscreen.js.map +1 -1
- package/build/lib/commands/system-bars.js +1 -23
- package/build/lib/commands/system-bars.js.map +1 -1
- package/build/lib/commands/touch.js +13 -79
- package/build/lib/commands/touch.js.map +1 -1
- package/build/lib/desired-caps.js +3 -4
- package/build/lib/desired-caps.js.map +1 -1
- package/build/lib/driver.js +8 -97
- package/build/lib/driver.js.map +1 -1
- package/build/lib/logger.js +1 -5
- package/build/lib/logger.js.map +1 -1
- package/build/lib/uiautomator.js +3 -24
- package/build/lib/uiautomator.js.map +1 -1
- package/build/lib/unlock-helpers.js +1 -61
- package/build/lib/unlock-helpers.js.map +1 -1
- package/build/lib/utils.js +1 -7
- package/build/lib/utils.js.map +1 -1
- package/build/lib/webview-helpers.js +1 -94
- package/build/lib/webview-helpers.js.map +1 -1
- package/lib/android-helpers.js +2 -1
- package/lib/commands/general.js +34 -15
- package/package.json +1 -1
|
@@ -1,21 +1,16 @@
|
|
|
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.helpers = exports.default = exports.commands = exports.SUPPORTED_PERFORMANCE_DATA_TYPES = exports.NETWORK_KEYS = exports.MEMORY_KEYS = exports.CPU_KEYS = exports.BATTERY_KEYS = void 0;
|
|
9
|
-
|
|
10
8
|
require("source-map-support/register");
|
|
11
|
-
|
|
12
9
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
|
-
|
|
14
10
|
var _asyncbox = require("asyncbox");
|
|
15
|
-
|
|
16
11
|
const commands = {},
|
|
17
|
-
|
|
18
|
-
|
|
12
|
+
helpers = {},
|
|
13
|
+
extensions = {};
|
|
19
14
|
exports.helpers = helpers;
|
|
20
15
|
exports.commands = commands;
|
|
21
16
|
const NETWORK_KEYS = [['bucketStart', 'activeTime', 'rxBytes', 'rxPackets', 'txBytes', 'txPackets', 'operations', 'bucketDuration'], ['st', 'activeTime', 'rb', 'rp', 'tb', 'tp', 'op', 'bucketDuration']];
|
|
@@ -46,7 +41,6 @@ const RETRY_PAUSE_MS = 1000;
|
|
|
46
41
|
|
|
47
42
|
function parseMeminfoForApi19To29(entries, valDict) {
|
|
48
43
|
const [type, subType] = entries;
|
|
49
|
-
|
|
50
44
|
if (type === MEMINFO_TITLES.NATIVE && subType === MEMINFO_TITLES.HEAP) {
|
|
51
45
|
[,, valDict.nativePss, valDict.nativePrivateDirty,,, valDict.nativeHeapSize, valDict.nativeHeapAllocatedSize] = entries;
|
|
52
46
|
} else if (type === MEMINFO_TITLES.DALVIK && subType === MEMINFO_TITLES.HEAP) {
|
|
@@ -62,7 +56,6 @@ function parseMeminfoForApi19To29(entries, valDict) {
|
|
|
62
56
|
|
|
63
57
|
function parseMeminfoForApiBelow19(entries, valDict) {
|
|
64
58
|
const type = entries[0];
|
|
65
|
-
|
|
66
59
|
if (type === MEMINFO_TITLES.NATIVE) {
|
|
67
60
|
[, valDict.nativePss,, valDict.nativePrivateDirty, valDict.nativeHeapSize, valDict.nativeHeapAllocatedSize] = entries;
|
|
68
61
|
} else if (type === MEMINFO_TITLES.DALVIK) {
|
|
@@ -78,7 +71,6 @@ function parseMeminfoForApiBelow19(entries, valDict) {
|
|
|
78
71
|
|
|
79
72
|
function parseMeminfoForApiAbove29(entries, valDict) {
|
|
80
73
|
const [type, subType] = entries;
|
|
81
|
-
|
|
82
74
|
if (type === MEMINFO_TITLES.NATIVE && subType === MEMINFO_TITLES.HEAP) {
|
|
83
75
|
[,, valDict.nativePss, valDict.nativePrivateDirty,,, valDict.nativeRss, valDict.nativeHeapSize, valDict.nativeHeapAllocatedSize] = entries;
|
|
84
76
|
} else if (type === MEMINFO_TITLES.DALVIK && subType === MEMINFO_TITLES.HEAP) {
|
|
@@ -100,54 +92,43 @@ commands.getPerformanceData = async function getPerformanceData(packageName, dat
|
|
|
100
92
|
switch (_lodash.default.toLower(dataType)) {
|
|
101
93
|
case 'batteryinfo':
|
|
102
94
|
return await this.getBatteryInfo(retries);
|
|
103
|
-
|
|
104
95
|
case 'cpuinfo':
|
|
105
96
|
return await this.getCPUInfo(packageName, retries);
|
|
106
|
-
|
|
107
97
|
case 'memoryinfo':
|
|
108
98
|
return await this.getMemoryInfo(packageName, retries);
|
|
109
|
-
|
|
110
99
|
case 'networkinfo':
|
|
111
100
|
return await this.getNetworkTrafficInfo(retries);
|
|
112
|
-
|
|
113
101
|
default:
|
|
114
102
|
throw new Error(`No performance data of type '${dataType}' found. ` + `Only the following values are supported: ${JSON.stringify(SUPPORTED_PERFORMANCE_DATA_TYPES, ' ', 2)}`);
|
|
115
103
|
}
|
|
116
104
|
};
|
|
117
|
-
|
|
118
105
|
helpers.getCPUInfo = async function getCPUInfo(packageName, retries = 2) {
|
|
119
106
|
return await (0, _asyncbox.retryInterval)(retries, RETRY_PAUSE_MS, async () => {
|
|
120
107
|
let output;
|
|
121
|
-
|
|
122
108
|
try {
|
|
123
109
|
output = await this.adb.shell(['dumpsys', 'cpuinfo']);
|
|
124
110
|
} catch (e) {
|
|
125
111
|
if (e.stderr) {
|
|
126
112
|
this.log.info(e.stderr);
|
|
127
113
|
}
|
|
128
|
-
|
|
129
114
|
throw e;
|
|
130
115
|
}
|
|
131
|
-
|
|
132
116
|
const usagesPattern = new RegExp(`^.+\\/${_lodash.default.escapeRegExp(packageName)}:\\D+([\\d.]+)%\\s+user\\s+\\+\\s+([\\d.]+)%\\s+kernel`, 'm');
|
|
133
117
|
const match = usagesPattern.exec(output);
|
|
134
|
-
|
|
135
118
|
if (!match) {
|
|
136
119
|
this.log.debug(output);
|
|
137
120
|
throw new Error(`Unable to parse cpu usage data for '${packageName}'. Check the server log for more details`);
|
|
138
121
|
}
|
|
139
|
-
|
|
140
122
|
return [CPU_KEYS, [match[1], match[2]]];
|
|
141
123
|
});
|
|
142
124
|
};
|
|
143
|
-
|
|
144
125
|
helpers.getBatteryInfo = async function getBatteryInfo(retries = 2) {
|
|
145
126
|
return await (0, _asyncbox.retryInterval)(retries, RETRY_PAUSE_MS, async () => {
|
|
146
127
|
let cmd = ['dumpsys', 'battery', '|', 'grep', 'level'];
|
|
147
128
|
let data = await this.adb.shell(cmd);
|
|
148
129
|
if (!data) throw new Error('No data from dumpsys');
|
|
149
|
-
let power = parseInt((data.split(':')[1] || '').trim(), 10);
|
|
150
130
|
|
|
131
|
+
let power = parseInt((data.split(':')[1] || '').trim(), 10);
|
|
151
132
|
if (!Number.isNaN(power)) {
|
|
152
133
|
return [_lodash.default.clone(BATTERY_KEYS), [power.toString()]];
|
|
153
134
|
} else {
|
|
@@ -155,24 +136,19 @@ helpers.getBatteryInfo = async function getBatteryInfo(retries = 2) {
|
|
|
155
136
|
}
|
|
156
137
|
});
|
|
157
138
|
};
|
|
158
|
-
|
|
159
139
|
helpers.getMemoryInfo = async function getMemoryInfo(packageName, retries = 2) {
|
|
160
140
|
return await (0, _asyncbox.retryInterval)(retries, RETRY_PAUSE_MS, async () => {
|
|
161
141
|
const cmd = ['dumpsys', 'meminfo', `'${packageName}'`, '|', 'grep', '-E', `'${MEMINFO_TITLES.NATIVE}|${MEMINFO_TITLES.DALVIK}|${MEMINFO_TITLES.EGL}` + `|${MEMINFO_TITLES.GL}|${MEMINFO_TITLES.TOTAL}'`];
|
|
162
142
|
const data = await this.adb.shell(cmd);
|
|
163
|
-
|
|
164
143
|
if (!data) {
|
|
165
144
|
throw new Error('No data from dumpsys');
|
|
166
145
|
}
|
|
167
|
-
|
|
168
146
|
const valDict = {
|
|
169
147
|
totalPrivateDirty: ''
|
|
170
148
|
};
|
|
171
149
|
const apiLevel = await this.adb.getApiLevel();
|
|
172
|
-
|
|
173
150
|
for (const line of data.split('\n')) {
|
|
174
151
|
const entries = line.trim().split(/\s+/).filter(Boolean);
|
|
175
|
-
|
|
176
152
|
if (apiLevel >= 30) {
|
|
177
153
|
parseMeminfoForApiAbove29(entries, valDict);
|
|
178
154
|
} else if (apiLevel > 18 && apiLevel < 30) {
|
|
@@ -181,18 +157,14 @@ helpers.getMemoryInfo = async function getMemoryInfo(packageName, retries = 2) {
|
|
|
181
157
|
parseMeminfoForApiBelow19(entries, valDict);
|
|
182
158
|
}
|
|
183
159
|
}
|
|
184
|
-
|
|
185
160
|
if (valDict.totalPrivateDirty && valDict.totalPrivateDirty !== 'nodex') {
|
|
186
161
|
const headers = _lodash.default.clone(MEMORY_KEYS);
|
|
187
|
-
|
|
188
162
|
const values = headers.map(header => valDict[header]);
|
|
189
163
|
return [headers, values];
|
|
190
164
|
}
|
|
191
|
-
|
|
192
165
|
throw new Error(`Unable to parse memory data: '${data}'`);
|
|
193
166
|
});
|
|
194
167
|
};
|
|
195
|
-
|
|
196
168
|
helpers.getNetworkTrafficInfo = async function getNetworkTrafficInfo(retries = 2) {
|
|
197
169
|
return await (0, _asyncbox.retryInterval)(retries, RETRY_PAUSE_MS, async () => {
|
|
198
170
|
let returnValue = [];
|
|
@@ -200,119 +172,96 @@ helpers.getNetworkTrafficInfo = async function getNetworkTrafficInfo(retries = 2
|
|
|
200
172
|
let cmd = ['dumpsys', 'netstats'];
|
|
201
173
|
let data = await this.adb.shell(cmd);
|
|
202
174
|
if (!data) throw new Error('No data from dumpsys');
|
|
175
|
+
|
|
203
176
|
let index = 0;
|
|
204
177
|
let fromXtstats = data.indexOf('Xt stats:');
|
|
205
178
|
let start = data.indexOf('Pending bytes:', fromXtstats);
|
|
206
179
|
let delimiter = data.indexOf(':', start + 1);
|
|
207
180
|
let end = data.indexOf('\n', delimiter + 1);
|
|
208
181
|
let pendingBytes = data.substring(delimiter + 1, end).trim();
|
|
209
|
-
|
|
210
182
|
if (end > delimiter) {
|
|
211
183
|
start = data.indexOf('bucketDuration', end + 1);
|
|
212
184
|
delimiter = data.indexOf('=', start + 1);
|
|
213
185
|
end = data.indexOf('\n', delimiter + 1);
|
|
214
186
|
bucketDuration = data.substring(delimiter + 1, end).trim();
|
|
215
187
|
}
|
|
216
|
-
|
|
217
188
|
if (start >= 0) {
|
|
218
189
|
data = data.substring(end + 1, data.length);
|
|
219
190
|
let arrayList = data.split('\n');
|
|
220
|
-
|
|
221
191
|
if (arrayList.length > 0) {
|
|
222
192
|
start = -1;
|
|
223
|
-
|
|
224
193
|
for (let j = 0; j < NETWORK_KEYS.length; ++j) {
|
|
225
194
|
start = arrayList[0].indexOf(NETWORK_KEYS[j][0]);
|
|
226
|
-
|
|
227
195
|
if (start >= 0) {
|
|
228
196
|
index = j;
|
|
229
197
|
returnValue[0] = [];
|
|
230
|
-
|
|
231
198
|
for (let k = 0; k < NETWORK_KEYS[j].length; ++k) {
|
|
232
199
|
returnValue[0][k] = NETWORK_KEYS[j][k];
|
|
233
200
|
}
|
|
234
|
-
|
|
235
201
|
break;
|
|
236
202
|
}
|
|
237
203
|
}
|
|
238
|
-
|
|
239
204
|
let returnIndex = 1;
|
|
240
|
-
|
|
241
205
|
for (let i = 0; i < arrayList.length; i++) {
|
|
242
206
|
data = arrayList[i];
|
|
243
207
|
start = data.indexOf(NETWORK_KEYS[index][0]);
|
|
244
|
-
|
|
245
208
|
if (start >= 0) {
|
|
246
209
|
delimiter = data.indexOf('=', start + 1);
|
|
247
210
|
end = data.indexOf(' ', delimiter + 1);
|
|
248
211
|
bucketStart = data.substring(delimiter + 1, end).trim();
|
|
249
|
-
|
|
250
212
|
if (end > delimiter) {
|
|
251
213
|
start = data.indexOf(NETWORK_KEYS[index][1], end + 1);
|
|
252
|
-
|
|
253
214
|
if (start >= 0) {
|
|
254
215
|
delimiter = data.indexOf('=', start + 1);
|
|
255
216
|
end = data.indexOf(' ', delimiter + 1);
|
|
256
217
|
activeTime = data.substring(delimiter + 1, end).trim();
|
|
257
218
|
}
|
|
258
219
|
}
|
|
259
|
-
|
|
260
220
|
if (end > delimiter) {
|
|
261
221
|
start = data.indexOf(NETWORK_KEYS[index][2], end + 1);
|
|
262
|
-
|
|
263
222
|
if (start >= 0) {
|
|
264
223
|
delimiter = data.indexOf('=', start + 1);
|
|
265
224
|
end = data.indexOf(' ', delimiter + 1);
|
|
266
225
|
rxBytes = data.substring(delimiter + 1, end).trim();
|
|
267
226
|
}
|
|
268
227
|
}
|
|
269
|
-
|
|
270
228
|
if (end > delimiter) {
|
|
271
229
|
start = data.indexOf(NETWORK_KEYS[index][3], end + 1);
|
|
272
|
-
|
|
273
230
|
if (start >= 0) {
|
|
274
231
|
delimiter = data.indexOf('=', start + 1);
|
|
275
232
|
end = data.indexOf(' ', delimiter + 1);
|
|
276
233
|
rxPackets = data.substring(delimiter + 1, end).trim();
|
|
277
234
|
}
|
|
278
235
|
}
|
|
279
|
-
|
|
280
236
|
if (end > delimiter) {
|
|
281
237
|
start = data.indexOf(NETWORK_KEYS[index][4], end + 1);
|
|
282
|
-
|
|
283
238
|
if (start >= 0) {
|
|
284
239
|
delimiter = data.indexOf('=', start + 1);
|
|
285
240
|
end = data.indexOf(' ', delimiter + 1);
|
|
286
241
|
txBytes = data.substring(delimiter + 1, end).trim();
|
|
287
242
|
}
|
|
288
243
|
}
|
|
289
|
-
|
|
290
244
|
if (end > delimiter) {
|
|
291
245
|
start = data.indexOf(NETWORK_KEYS[index][5], end + 1);
|
|
292
|
-
|
|
293
246
|
if (start >= 0) {
|
|
294
247
|
delimiter = data.indexOf('=', start + 1);
|
|
295
248
|
end = data.indexOf(' ', delimiter + 1);
|
|
296
249
|
txPackets = data.substring(delimiter + 1, end).trim();
|
|
297
250
|
}
|
|
298
251
|
}
|
|
299
|
-
|
|
300
252
|
if (end > delimiter) {
|
|
301
253
|
start = data.indexOf(NETWORK_KEYS[index][6], end + 1);
|
|
302
|
-
|
|
303
254
|
if (start >= 0) {
|
|
304
255
|
delimiter = data.indexOf('=', start + 1);
|
|
305
256
|
end = data.length;
|
|
306
257
|
operations = data.substring(delimiter + 1, end).trim();
|
|
307
258
|
}
|
|
308
259
|
}
|
|
309
|
-
|
|
310
260
|
returnValue[returnIndex++] = [bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations, bucketDuration];
|
|
311
261
|
}
|
|
312
262
|
}
|
|
313
263
|
}
|
|
314
264
|
}
|
|
315
|
-
|
|
316
265
|
if (!_lodash.default.isEqual(pendingBytes, '') && !_lodash.default.isUndefined(pendingBytes) && !_lodash.default.isEqual(pendingBytes, 'nodex')) {
|
|
317
266
|
return returnValue;
|
|
318
267
|
} else {
|
|
@@ -320,8 +269,7 @@ helpers.getNetworkTrafficInfo = async function getNetworkTrafficInfo(retries = 2
|
|
|
320
269
|
}
|
|
321
270
|
});
|
|
322
271
|
};
|
|
323
|
-
|
|
324
272
|
Object.assign(extensions, commands, helpers);
|
|
325
273
|
var _default = extensions;
|
|
326
274
|
exports.default = _default;
|
|
327
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiTkVUV09SS19LRVlTIiwiQ1BVX0tFWVMiLCJCQVRURVJZX0tFWVMiLCJNRU1PUllfS0VZUyIsIlNVUFBPUlRFRF9QRVJGT1JNQU5DRV9EQVRBX1RZUEVTIiwiT2JqZWN0IiwiZnJlZXplIiwiY3B1aW5mbyIsIm1lbW9yeWluZm8iLCJiYXR0ZXJ5aW5mbyIsIm5ldHdvcmtpbmZvIiwiTUVNSU5GT19USVRMRVMiLCJOQVRJVkUiLCJEQUxWSUsiLCJFR0wiLCJHTCIsIk1UUkFDSyIsIlRPVEFMIiwiSEVBUCIsIlJFVFJZX1BBVVNFX01TIiwicGFyc2VNZW1pbmZvRm9yQXBpMTlUbzI5IiwiZW50cmllcyIsInZhbERpY3QiLCJ0eXBlIiwic3ViVHlwZSIsIm5hdGl2ZVBzcyIsIm5hdGl2ZVByaXZhdGVEaXJ0eSIsIm5hdGl2ZUhlYXBTaXplIiwibmF0aXZlSGVhcEFsbG9jYXRlZFNpemUiLCJkYWx2aWtQc3MiLCJkYWx2aWtQcml2YXRlRGlydHkiLCJlZ2xQc3MiLCJlZ2xQcml2YXRlRGlydHkiLCJnbFBzcyIsImdsUHJpdmF0ZURpcnR5IiwibGVuZ3RoIiwidG90YWxQc3MiLCJ0b3RhbFByaXZhdGVEaXJ0eSIsInBhcnNlTWVtaW5mb0ZvckFwaUJlbG93MTkiLCJwYXJzZU1lbWluZm9Gb3JBcGlBYm92ZTI5IiwibmF0aXZlUnNzIiwiZGFsdmlrUnNzIiwidG90YWxSc3MiLCJnZXRQZXJmb3JtYW5jZURhdGFUeXBlcyIsIl8iLCJrZXlzIiwiZ2V0UGVyZm9ybWFuY2VEYXRhIiwicGFja2FnZU5hbWUiLCJkYXRhVHlwZSIsInJldHJpZXMiLCJ0b0xvd2VyIiwiZ2V0QmF0dGVyeUluZm8iLCJnZXRDUFVJbmZvIiwiZ2V0TWVtb3J5SW5mbyIsImdldE5ldHdvcmtUcmFmZmljSW5mbyIsIkVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsInJldHJ5SW50ZXJ2YWwiLCJvdXRwdXQiLCJhZGIiLCJzaGVsbCIsImUiLCJzdGRlcnIiLCJsb2ciLCJpbmZvIiwidXNhZ2VzUGF0dGVybiIsIlJlZ0V4cCIsImVzY2FwZVJlZ0V4cCIsIm1hdGNoIiwiZXhlYyIsImRlYnVnIiwiY21kIiwiZGF0YSIsInBvd2VyIiwicGFyc2VJbnQiLCJzcGxpdCIsInRyaW0iLCJOdW1iZXIiLCJpc05hTiIsImNsb25lIiwidG9TdHJpbmciLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwibGluZSIsImZpbHRlciIsIkJvb2xlYW4iLCJoZWFkZXJzIiwidmFsdWVzIiwibWFwIiwiaGVhZGVyIiwicmV0dXJuVmFsdWUiLCJidWNrZXREdXJhdGlvbiIsImJ1Y2tldFN0YXJ0IiwiYWN0aXZlVGltZSIsInJ4Qnl0ZXMiLCJyeFBhY2tldHMiLCJ0eEJ5dGVzIiwidHhQYWNrZXRzIiwib3BlcmF0aW9ucyIsImluZGV4IiwiZnJvbVh0c3RhdHMiLCJpbmRleE9mIiwic3RhcnQiLCJkZWxpbWl0ZXIiLCJlbmQiLCJwZW5kaW5nQnl0ZXMiLCJzdWJzdHJpbmciLCJhcnJheUxpc3QiLCJqIiwiayIsInJldHVybkluZGV4IiwiaSIsImlzRXF1YWwiLCJpc1VuZGVmaW5lZCIsImFzc2lnbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9wZXJmb3JtYW5jZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCB9IGZyb20gJ2FzeW5jYm94JztcblxuY29uc3QgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmNvbnN0IE5FVFdPUktfS0VZUyA9IFtcbiAgWydidWNrZXRTdGFydCcsICdhY3RpdmVUaW1lJywgJ3J4Qnl0ZXMnLCAncnhQYWNrZXRzJywgJ3R4Qnl0ZXMnLCAndHhQYWNrZXRzJywgJ29wZXJhdGlvbnMnLCAnYnVja2V0RHVyYXRpb24nXSxcbiAgWydzdCcsICdhY3RpdmVUaW1lJywgJ3JiJywgJ3JwJywgJ3RiJywgJ3RwJywgJ29wJywgJ2J1Y2tldER1cmF0aW9uJ11cbl07XG5jb25zdCBDUFVfS0VZUyA9IFsndXNlcicsICdrZXJuZWwnXTtcbmNvbnN0IEJBVFRFUllfS0VZUyA9IFsncG93ZXInXTtcbmNvbnN0IE1FTU9SWV9LRVlTID0gW1xuICAndG90YWxQcml2YXRlRGlydHknLCAnbmF0aXZlUHJpdmF0ZURpcnR5JywgJ2RhbHZpa1ByaXZhdGVEaXJ0eScsXG4gICdlZ2xQcml2YXRlRGlydHknLCAnZ2xQcml2YXRlRGlydHknLFxuICAndG90YWxQc3MnLCAnbmF0aXZlUHNzJywgJ2RhbHZpa1BzcycsICdlZ2xQc3MnLCAnZ2xQc3MnLFxuICAnbmF0aXZlSGVhcEFsbG9jYXRlZFNpemUnLCAnbmF0aXZlSGVhcFNpemUnLFxuICAnbmF0aXZlUnNzJywgJ2RhbHZpa1JzcycsICd0b3RhbFJzcydcbl07XG5jb25zdCBTVVBQT1JURURfUEVSRk9STUFOQ0VfREFUQV9UWVBFUyA9IE9iamVjdC5mcmVlemUoe1xuICBjcHVpbmZvOiAndGhlIGFtb3VudCBvZiBjcHUgYnkgdXNlciBhbmQga2VybmVsIHByb2Nlc3MgLSBjcHUgaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZXMgYW5kIHNpbXVsYXRvcnMnLFxuICBtZW1vcnlpbmZvOiAndGhlIGFtb3VudCBvZiBtZW1vcnkgdXNlZCBieSB0aGUgcHJvY2VzcyAtIG1lbW9yeSBpbmZvcm1hdGlvbiBmb3IgYXBwbGljYXRpb25zIG9uIHJlYWwgZGV2aWNlcyBhbmQgc2ltdWxhdG9ycycsXG4gIGJhdHRlcnlpbmZvOiAndGhlIHJlbWFpbmluZyBiYXR0ZXJ5IHBvd2VyIC0gYmF0dGVyeSBwb3dlciBpbmZvcm1hdGlvbiBmb3IgYXBwbGljYXRpb25zIG9uIHJlYWwgZGV2aWNlcyBhbmQgc2ltdWxhdG9ycycsXG4gIG5ldHdvcmtpbmZvOiAndGhlIG5ldHdvcmsgc3RhdGlzdGljcyAtIG5ldHdvcmsgcngvdHggaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZXMgYW5kIHNpbXVsYXRvcnMnXG59KTtcbmNvbnN0IE1FTUlORk9fVElUTEVTID0gT2JqZWN0LmZyZWV6ZSh7XG4gIE5BVElWRTogJ05hdGl2ZScsXG4gIERBTFZJSzogJ0RhbHZpaycsXG4gIEVHTDogJ0VHTCcsXG4gIEdMOiAnR0wnLFxuICBNVFJBQ0s6ICdtdHJhY2snLFxuICBUT1RBTDogJ1RPVEFMJyxcbiAgSEVBUDogJ0hlYXAnXG59KTtcbmNvbnN0IFJFVFJZX1BBVVNFX01TID0gMTAwMDtcblxuLyoqXG4gKiBBUEkgbGV2ZWwgYmV0d2VlbiAxOCBhbmQgMzBcbiAqIFsnPFN5c3RlbSBUeXBlPicsICc8TWVtb3J5IFR5cGU+JywgPHBzcyB0b3RhbD4sIDxwcml2YXRlIGRpcnR5PiwgPHByaXZhdGUgY2xlYW4+LCA8c3dhcFBzcyBkaXJ0eT4sIDxoZWFwIHNpemU+LCA8aGVhcCBhbGxvYz4sIDxoZWFwIGZyZWU+XVxuICogZXhjZXB0ICdUT1RBTCcsIHdoaWNoIHNraXBzIHRoZSBzZWNvbmQgdHlwZSBuYW1lXG4gKiAhISEgdmFsRGljdCBnZXRzIG11dGF0ZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VNZW1pbmZvRm9yQXBpMTlUbzI5IChlbnRyaWVzLCB2YWxEaWN0KSB7XG4gIGNvbnN0IFt0eXBlLCBzdWJUeXBlXSA9IGVudHJpZXM7XG4gIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5OQVRJVkUgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuSEVBUCkge1xuICAgIFssLCB2YWxEaWN0Lm5hdGl2ZVBzcywgdmFsRGljdC5uYXRpdmVQcml2YXRlRGlydHksLCwgdmFsRGljdC5uYXRpdmVIZWFwU2l6ZSwgdmFsRGljdC5uYXRpdmVIZWFwQWxsb2NhdGVkU2l6ZV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkRBTFZJSyAmJiBzdWJUeXBlID09PSBNRU1JTkZPX1RJVExFUy5IRUFQKSB7XG4gICAgWywsIHZhbERpY3QuZGFsdmlrUHNzLCB2YWxEaWN0LmRhbHZpa1ByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkVHTCAmJiBzdWJUeXBlID09PSBNRU1JTkZPX1RJVExFUy5NVFJBQ0spIHtcbiAgICBbLCwgdmFsRGljdC5lZ2xQc3MsIHZhbERpY3QuZWdsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuR0wgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTVRSQUNLKSB7XG4gICAgWywsIHZhbERpY3QuZ2xQc3MsIHZhbERpY3QuZ2xQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5UT1RBTCAmJiBlbnRyaWVzLmxlbmd0aCA9PT0gOCkge1xuICAgIC8vIHRoZXJlIGFyZSB0d28gdG90YWxzLCBhbmQgd2Ugb25seSB3YW50IHRoZSBmdWxsIGxpc3RpbmcsIHdoaWNoIGhhcyA4IGVudHJpZXNcbiAgICBbLCB2YWxEaWN0LnRvdGFsUHNzLCB2YWxEaWN0LnRvdGFsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBbJzxTeXN0ZW0gVHlwZScsICc8cHBzPicsICc8c2hhcmVkIGRpcnR5PicsICc8cHJpdmF0ZSBkaXJ0eT4nLCAnPGhlYXAgc2l6ZT4nLCAnPGhlYXAgYWxsb2M+JywgJzxoZWFwIGZyZWU+J11cbiAqICEhISB2YWxEaWN0IGdldHMgbXV0YXRlZFxuICovXG5mdW5jdGlvbiBwYXJzZU1lbWluZm9Gb3JBcGlCZWxvdzE5IChlbnRyaWVzLCB2YWxEaWN0KSB7XG4gIGNvbnN0IHR5cGUgPSBlbnRyaWVzWzBdO1xuICBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTkFUSVZFKSB7XG4gICAgWywgdmFsRGljdC5uYXRpdmVQc3MsLCB2YWxEaWN0Lm5hdGl2ZVByaXZhdGVEaXJ0eSwgdmFsRGljdC5uYXRpdmVIZWFwU2l6ZSwgdmFsRGljdC5uYXRpdmVIZWFwQWxsb2NhdGVkU2l6ZV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkRBTFZJSykge1xuICAgIFssIHZhbERpY3QuZGFsdmlrUHNzLCwgdmFsRGljdC5kYWx2aWtQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5FR0wpIHtcbiAgICBbLCB2YWxEaWN0LmVnbFBzcywsIHZhbERpY3QuZWdsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuR0wpIHtcbiAgICBbLCB2YWxEaWN0LmdsUHNzLCwgdmFsRGljdC5nbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLlRPVEFMKSB7XG4gICAgWywgdmFsRGljdC50b3RhbFBzcywsIHZhbERpY3QudG90YWxQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfVxufVxuXG4vKipcbiAqIEFQSSBsZXZlbCAzMCBhbmQgYWJvdmVcbiAqIFsnPFN5c3RlbSBUeXBlPicsICc8TWVtb3J5IFR5cGU+JywgPHBzcyB0b3RhbD4sIDxwcml2YXRlIGRpcnR5PiwgPHByaXZhdGUgY2xlYW4+LCA8c3dhcFBzcyBkaXJ0eT4sIDxyc3MgdG90YWw+LCA8aGVhcCBzaXplPiwgPGhlYXAgYWxsb2M+LCA8aGVhcCBmcmVlPl1cbiAqICEhISB2YWxEaWN0IGdldHMgbXV0YXRlZFxuICovXG5mdW5jdGlvbiBwYXJzZU1lbWluZm9Gb3JBcGlBYm92ZTI5IChlbnRyaWVzLCB2YWxEaWN0KSB7XG4gIGNvbnN0IFt0eXBlLCBzdWJUeXBlXSA9IGVudHJpZXM7XG4gIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5OQVRJVkUgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuSEVBUCkge1xuICAgIFssLCB2YWxEaWN0Lm5hdGl2ZVBzcywgdmFsRGljdC5uYXRpdmVQcml2YXRlRGlydHksLCwgdmFsRGljdC5uYXRpdmVSc3MsIHZhbERpY3QubmF0aXZlSGVhcFNpemUsIHZhbERpY3QubmF0aXZlSGVhcEFsbG9jYXRlZFNpemVdID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5EQUxWSUsgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuSEVBUCkge1xuICAgIFssLCB2YWxEaWN0LmRhbHZpa1BzcywgdmFsRGljdC5kYWx2aWtQcml2YXRlRGlydHksLCwgdmFsRGljdC5kYWx2aWtSc3NdID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5FR0wgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTVRSQUNLKSB7XG4gICAgWywsIHZhbERpY3QuZWdsUHNzLCB2YWxEaWN0LmVnbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkdMICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLk1UUkFDSykge1xuICAgIFssLCB2YWxEaWN0LmdsUHNzLCB2YWxEaWN0LmdsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuVE9UQUwgJiYgZW50cmllcy5sZW5ndGggPT09IDkpIHtcbiAgICAvLyBoYXMgOSBlbnRyaWVzXG4gICAgWywgdmFsRGljdC50b3RhbFBzcywgdmFsRGljdC50b3RhbFByaXZhdGVEaXJ0eSwsLCB2YWxEaWN0LnRvdGFsUnNzXSA9IGVudHJpZXM7XG4gIH1cbn1cblxuLy9cbi8vIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIHR5cGUgb2YgdGhlIHN5c3RlbSBzdGF0ZSB3aGljaCBpcyBzdXBwb3J0ZWQgdG8gcmVhZCBhcyBsaWtlIGNwdSwgbWVtb3J5LCBuZXR3b3JrIHRyYWZmaWMsIGFuZCBiYXR0ZXJ5LlxuLy8gb3V0cHV0IC0gYXJyYXkgbGlrZSBiZWxvd1xuLy8gW2NwdWluZm8sIGJhdHRlcnlpbmZvLCBuZXR3b3JraW5mbywgbWVtb3J5aW5mb11cbi8vXG5jb21tYW5kcy5nZXRQZXJmb3JtYW5jZURhdGFUeXBlcyA9IGZ1bmN0aW9uIGdldFBlcmZvcm1hbmNlRGF0YVR5cGVzICgpIHtcbiAgcmV0dXJuIF8ua2V5cyhTVVBQT1JURURfUEVSRk9STUFOQ0VfREFUQV9UWVBFUyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm5zIFRoZSBpbmZvcm1hdGlvbiB0eXBlIG9mIHRoZSBzeXN0ZW0gc3RhdGUgd2hpY2ggaXMgc3VwcG9ydGVkIHRvIHJlYWQgYXMgbGlrZSBjcHUsIG1lbW9yeSwgbmV0d29yayB0cmFmZmljLCBhbmQgYmF0dGVyeS5cbiAqIGlucHV0IC0gKHBhY2thZ2VOYW1lKSB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvblxuICogICAgICAgIChkYXRhVHlwZSkgdGhlIHR5cGUgb2Ygc3lzdGVtIHN0YXRlIHdoaWNoIHdhbnRzIHRvIHJlYWQuIEl0IHNob3VsZCBiZSBvbmUgb2YgdGhlIGtleXMgb2YgdGhlIFNVUFBPUlRFRF9QRVJGT1JNQU5DRV9EQVRBX1RZUEVTXG4gKiAgICAgICAgKGRhdGFSZWFkVGltZW91dCkgdGhlIG51bWJlciBvZiBhdHRlbXB0cyB0byByZWFkXG4gKiBvdXRwdXQgLSB0YWJsZSBvZiB0aGUgcGVyZm9ybWFuY2UgZGF0YSwgVGhlIGZpcnN0IGxpbmUgb2YgdGhlIHRhYmxlIHJlcHJlc2VudHMgdGhlIHR5cGUgb2YgZGF0YS4gVGhlIHJlbWFpbmluZyBsaW5lcyByZXByZXNlbnQgdGhlIHZhbHVlcyBvZiB0aGUgZGF0YS5cbiAqXG4gKiBpbiBjYXNlIG9mIGJhdHRlcnkgaW5mbyA6IFtbcG93ZXJdLCBbMjNdXVxuICogaW4gY2FzZSBvZiBtZW1vcnkgaW5mbyA6ICBbW3RvdGFsUHJpdmF0ZURpcnR5LCBuYXRpdmVQcml2YXRlRGlydHksIGRhbHZpa1ByaXZhdGVEaXJ0eSwgZWdsUHJpdmF0ZURpcnR5LCBnbFByaXZhdGVEaXJ0eSwgdG90YWxQc3MsXG4gKiAgIG5hdGl2ZVBzcywgZGFsdmlrUHNzLCBlZ2xQc3MsIGdsUHNzLCBuYXRpdmVIZWFwQWxsb2NhdGVkU2l6ZSwgbmF0aXZlSGVhcFNpemVdLCBbMTgzNjAsIDgyOTYsIDYxMzIsIG51bGwsIG51bGwsIDQyNTg4LCA4NDA2LCA3MDI0LCBudWxsLCBudWxsLCAyNjUxOSwgMTAzNDRdXVxuICogaW4gY2FzZSBvZiBuZXR3b3JrIGluZm8gOiBbW2J1Y2tldFN0YXJ0LCBhY3RpdmVUaW1lLCByeEJ5dGVzLCByeFBhY2tldHMsIHR4Qnl0ZXMsIHR4UGFja2V0cywgb3BlcmF0aW9ucywgYnVja2V0RHVyYXRpb24sXSxcbiAqICAgWzE0NzgwOTE2MDAwMDAsIG51bGwsIDEwOTkwNzUsIDYxMDk0NywgOTI4LCAxMTQzNjIsIDc2OSwgMCwgMzYwMDAwMF0sIFsxNDc4MDk1MjAwMDAwLCBudWxsLCAxMzA2MzAwLCA0MDU5OTcsIDUwOSwgNDYzNTksIDM3MCwgMCwgMzYwMDAwMF1dXG4gKiBpbiBjYXNlIG9mIG5ldHdvcmsgaW5mbyA6IFtbc3QsIGFjdGl2ZVRpbWUsIHJiLCBycCwgdGIsIHRwLCBvcCwgYnVja2V0RHVyYXRpb25dLCBbMTQ3ODA4ODAwMCwgbnVsbCwgbnVsbCwgMzIxMTUyOTYsIDM0MjkxLCAyOTU2ODA1LCAyNTcwNSwgMCwgMzYwMF0sXG4gKiAgIFsxNDc4MDkxNjAwLCBudWxsLCBudWxsLCAyNzE0NjgzLCAxMTgyMSwgMTQyMDU2NCwgMTI2NTAsIDAsIDM2MDBdLCBbMTQ3ODA5NTIwMCwgbnVsbCwgbnVsbCwgMTAwNzkyMTMsIDE5OTYyLCAyNDg3NzA1LCAyMDAxNSwgMCwgMzYwMF0sXG4gKiAgIFsxNDc4MDk4ODAwLCBudWxsLCBudWxsLCA0NDQ0NDMzLCAxMDIyNywgMTQzMDM1NiwgMTA0OTMsIDAsIDM2MDBdXVxuICogaW4gY2FzZSBvZiBjcHUgaW5mbyA6IFtbdXNlciwga2VybmVsXSwgWzAuOSwgMS4zXV1cbiAqL1xuY29tbWFuZHMuZ2V0UGVyZm9ybWFuY2VEYXRhID0gYXN5bmMgZnVuY3Rpb24gZ2V0UGVyZm9ybWFuY2VEYXRhIChwYWNrYWdlTmFtZSwgZGF0YVR5cGUsIHJldHJpZXMgPSAyKSB7XG4gIHN3aXRjaCAoXy50b0xvd2VyKGRhdGFUeXBlKSkge1xuICAgIGNhc2UgJ2JhdHRlcnlpbmZvJzpcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldEJhdHRlcnlJbmZvKHJldHJpZXMpO1xuICAgIGNhc2UgJ2NwdWluZm8nOlxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0Q1BVSW5mbyhwYWNrYWdlTmFtZSwgcmV0cmllcyk7XG4gICAgY2FzZSAnbWVtb3J5aW5mbyc6XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRNZW1vcnlJbmZvKHBhY2thZ2VOYW1lLCByZXRyaWVzKTtcbiAgICBjYXNlICduZXR3b3JraW5mbyc6XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXROZXR3b3JrVHJhZmZpY0luZm8ocmV0cmllcyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcGVyZm9ybWFuY2UgZGF0YSBvZiB0eXBlICcke2RhdGFUeXBlfScgZm91bmQuIGAgK1xuICAgICAgICBgT25seSB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgc3VwcG9ydGVkOiAke0pTT04uc3RyaW5naWZ5KFNVUFBPUlRFRF9QRVJGT1JNQU5DRV9EQVRBX1RZUEVTLCAnICcsIDIpfWApO1xuICB9XG59O1xuXG5oZWxwZXJzLmdldENQVUluZm8gPSBhc3luYyBmdW5jdGlvbiBnZXRDUFVJbmZvIChwYWNrYWdlTmFtZSwgcmV0cmllcyA9IDIpIHtcbiAgLy8gVE9ETzogZmlndXJlIG91dCB3aHkgdGhpcyBpc1xuICAvLyBzb21ldGltZXMsIHRoZSBmdW5jdGlvbiBvZiAnYWRiLnNoZWxsJyBmYWlscy4gd2hlbiBJIHRlc3RlZCB0aGlzIGZ1bmN0aW9uIG9uIHRoZSB0YXJnZXQgb2YgJ0dhbGF4eSBOb3RlNScsXG4gIC8vIGFkYi5zaGVsbChkdW1wc3lzIGNwdWluZm8pIHJldHVybnMgY3B1IGRhdGFzIGZvciBvdGhlciBhcHBsaWNhdGlvbiBwYWNrYWdlcywgYnV0IEkgY2FuJ3QgZmluZCB0aGUgZGF0YSBmb3IgcGFja2FnZU5hbWUuXG4gIC8vIEl0IHVzdWFsbHkgZmFpbHMgMzAgdGltZXMgYW5kIHN1Y2Nlc3MgZm9yIHRoZSBuZXh0IHRpbWUsXG4gIC8vIFNpbmNlIHRoZW4sIGhlIGhhcyBjb250aW51ZWQgdG8gc3VjY2VlZC5cbiAgcmV0dXJuIGF3YWl0IHJldHJ5SW50ZXJ2YWwocmV0cmllcywgUkVUUllfUEFVU0VfTVMsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgb3V0cHV0O1xuICAgIHRyeSB7XG4gICAgICBvdXRwdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2R1bXBzeXMnLCAnY3B1aW5mbyddKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5zdGRlcnIpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhlLnN0ZGVycik7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICAvLyBgb3V0cHV0YCB3aWxsIGJlIHNvbWV0aGluZyBsaWtlXG4gICAgLy8gICAgKzAlIDIyMDkvaW8uYXBwaXVtLmFuZHJvaWQuYXBpczogMC4xJSB1c2VyICsgMC4yJSBrZXJuZWwgLyBmYXVsdHM6IDcwIG1pbm9yXG4gICAgY29uc3QgdXNhZ2VzUGF0dGVybiA9XG4gICAgICBuZXcgUmVnRXhwKGBeLitcXFxcLyR7Xy5lc2NhcGVSZWdFeHAocGFja2FnZU5hbWUpfTpcXFxcRCsoW1xcXFxkLl0rKSVcXFxccyt1c2VyXFxcXHMrXFxcXCtcXFxccysoW1xcXFxkLl0rKSVcXFxccytrZXJuZWxgLCAnbScpO1xuICAgIGNvbnN0IG1hdGNoID0gdXNhZ2VzUGF0dGVybi5leGVjKG91dHB1dCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcob3V0cHV0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIGNwdSB1c2FnZSBkYXRhIGZvciAnJHtwYWNrYWdlTmFtZX0nLiBDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzYCk7XG4gICAgfVxuICAgIHJldHVybiBbQ1BVX0tFWVMsIFttYXRjaFsxXSwgbWF0Y2hbMl1dXTtcbiAgfSk7XG59O1xuXG5oZWxwZXJzLmdldEJhdHRlcnlJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0QmF0dGVyeUluZm8gKHJldHJpZXMgPSAyKSB7XG4gIHJldHVybiBhd2FpdCByZXRyeUludGVydmFsKHJldHJpZXMsIFJFVFJZX1BBVVNFX01TLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNtZCA9IFsnZHVtcHN5cycsICdiYXR0ZXJ5JywgJ3wnLCAnZ3JlcCcsICdsZXZlbCddO1xuICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoY21kKTtcbiAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcignTm8gZGF0YSBmcm9tIGR1bXBzeXMnKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICBsZXQgcG93ZXIgPSBwYXJzZUludCgoZGF0YS5zcGxpdCgnOicpWzFdIHx8ICcnKS50cmltKCksIDEwKTtcblxuICAgIGlmICghTnVtYmVyLmlzTmFOKHBvd2VyKSkge1xuICAgICAgcmV0dXJuIFtfLmNsb25lKEJBVFRFUllfS0VZUyksIFtwb3dlci50b1N0cmluZygpXV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIGJhdHRlcnkgZGF0YTogJyR7ZGF0YX0nYCk7XG4gICAgfVxuICB9KTtcbn07XG5cbmhlbHBlcnMuZ2V0TWVtb3J5SW5mbyA9IGFzeW5jIGZ1bmN0aW9uIGdldE1lbW9yeUluZm8gKHBhY2thZ2VOYW1lLCByZXRyaWVzID0gMikge1xuICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbChyZXRyaWVzLCBSRVRSWV9QQVVTRV9NUywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNtZCA9IFtcbiAgICAgICdkdW1wc3lzJywgJ21lbWluZm8nLCBgJyR7cGFja2FnZU5hbWV9J2AsXG4gICAgICAnfCcsICdncmVwJywgJy1FJyxcbiAgICAgIGAnJHtNRU1JTkZPX1RJVExFUy5OQVRJVkV9fCR7TUVNSU5GT19USVRMRVMuREFMVklLfXwke01FTUlORk9fVElUTEVTLkVHTH1gICtcbiAgICAgIGB8JHtNRU1JTkZPX1RJVExFUy5HTH18JHtNRU1JTkZPX1RJVExFUy5UT1RBTH0nYFxuICAgIF07XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGRhdGEgZnJvbSBkdW1wc3lzJyk7XG4gICAgfVxuICAgIGNvbnN0IHZhbERpY3QgPSB7dG90YWxQcml2YXRlRGlydHk6ICcnfTtcbiAgICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGRhdGEuc3BsaXQoJ1xcbicpKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBpZiAoYXBpTGV2ZWwgPj0gMzApIHtcbiAgICAgICAgcGFyc2VNZW1pbmZvRm9yQXBpQWJvdmUyOShlbnRyaWVzLCB2YWxEaWN0KTtcbiAgICAgIH0gZWxzZSBpZiAoYXBpTGV2ZWwgPiAxOCAmJiBhcGlMZXZlbCA8IDMwKSB7XG4gICAgICAgIHBhcnNlTWVtaW5mb0ZvckFwaTE5VG8yOShlbnRyaWVzLCB2YWxEaWN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlTWVtaW5mb0ZvckFwaUJlbG93MTkoZW50cmllcywgdmFsRGljdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2YWxEaWN0LnRvdGFsUHJpdmF0ZURpcnR5ICYmIHZhbERpY3QudG90YWxQcml2YXRlRGlydHkgIT09ICdub2RleCcpIHtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBfLmNsb25lKE1FTU9SWV9LRVlTKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGhlYWRlcnMubWFwKChoZWFkZXIpID0+IHZhbERpY3RbaGVhZGVyXSk7XG4gICAgICByZXR1cm4gW2hlYWRlcnMsIHZhbHVlc107XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgbWVtb3J5IGRhdGE6ICcke2RhdGF9J2ApO1xuICB9KTtcbn07XG5cbmhlbHBlcnMuZ2V0TmV0d29ya1RyYWZmaWNJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0TmV0d29ya1RyYWZmaWNJbmZvIChyZXRyaWVzID0gMikge1xuICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbChyZXRyaWVzLCBSRVRSWV9QQVVTRV9NUywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9IFtdO1xuICAgIGxldCBidWNrZXREdXJhdGlvbiwgYnVja2V0U3RhcnQsIGFjdGl2ZVRpbWUsIHJ4Qnl0ZXMsIHJ4UGFja2V0cywgdHhCeXRlcywgdHhQYWNrZXRzLCBvcGVyYXRpb25zO1xuXG4gICAgbGV0IGNtZCA9IFsnZHVtcHN5cycsICduZXRzdGF0cyddO1xuICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoY21kKTtcbiAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcignTm8gZGF0YSBmcm9tIGR1bXBzeXMnKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICAvLyBJbiBjYXNlIG9mIG5ldHdvcmsgdHJhZmZpYyBpbmZvcm1hdGlvbiwgaXQgaXMgZGlmZmVyZW50IGZvciB0aGUgcmV0dXJuIGRhdGEgYmV0d2VlbiBlbXVsYXRvciBhbmQgcmVhbCBkZXZpY2UuXG4gICAgLy8gdGhlIHJldHVybiBkYXRhIG9mIGVtdWxhdG9yXG4gICAgLy8gICBYdCBzdGF0czpcbiAgICAvLyAgIFBlbmRpbmcgYnl0ZXM6IDM5MjUwXG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1bW3R5cGU9V0lGSSwgc3ViVHlwZT1DT01CSU5FRCwgbmV0d29ya0lkPVwiV2lyZWRTU0lEXCJdXSB1aWQ9LTEgc2V0PUFMTCB0YWc9MHgwXG4gICAgLy8gICBOZXR3b3JrU3RhdHNIaXN0b3J5OiBidWNrZXREdXJhdGlvbj0zNjAwMDAwXG4gICAgLy8gICBidWNrZXRTdGFydD0xNDc4MDk4ODAwMDAwIGFjdGl2ZVRpbWU9MzE4MjQgcnhCeXRlcz0yMTUwMiByeFBhY2tldHM9NzggdHhCeXRlcz0xNzc0OCB0eFBhY2tldHM9OTAgb3BlcmF0aW9ucz0wXG4gICAgLy9cbiAgICAvLyA3LjFcbiAgICAvLyAgIFh0IHN0YXRzOlxuICAgIC8vICAgUGVuZGluZyBieXRlczogNDgxNDg3XG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1be3R5cGU9TU9CSUxFLCBzdWJUeXBlPUNPTUJJTkVELCBzdWJzY3JpYmVySWQ9MzEwMjYwLi4uLCBtZXRlcmVkPXRydWV9XSB1aWQ9LTEgc2V0PUFMTCB0YWc9MHgwXG4gICAgLy8gICAgIE5ldHdvcmtTdGF0c0hpc3Rvcnk6IGJ1Y2tldER1cmF0aW9uPTM2MDBcbiAgICAvLyAgICAgICBzdD0xNDgzOTg0ODAwIHJiPTAgcnA9MCB0Yj0xMjAzMSB0cD0xODQgb3A9MFxuICAgIC8vICAgICAgIHN0PTE0ODM5ODg0MDAgcmI9MCBycD0wIHRiPTM4NDc2IHRwPTU4NyBvcD0wXG4gICAgLy8gICAgICAgc3Q9MTQ4Mzk5OTIwMCByYj0zMTU2MTYgcnA9NDAwIHRiPTk0ODAwIHRwPTM2MiBvcD0wXG4gICAgLy8gICAgICAgc3Q9MTQ4NDAwMjgwMCByYj0xNTgyNiBycD0yMCB0Yj00NzM4IHRwPTE2IG9wPTBcbiAgICAvL1xuICAgIC8vIHRoZSByZXR1cm4gZGF0YSBvZiByZWFsIGRldmljZVxuICAgIC8vICAgWHQgc3RhdHM6XG4gICAgLy8gICBQZW5kaW5nIGJ5dGVzOiAwXG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1be3R5cGU9TU9CSUxFLCBzdWJUeXBlPUNPTUJJTkVELCBzdWJzY3JpYmVySWQ9NDUwMDUwLi4ufV0gdWlkPS0xIHNldD1BTEwgdGFnPTB4MFxuICAgIC8vICAgTmV0d29ya1N0YXRzSGlzdG9yeTogYnVja2V0RHVyYXRpb249MzYwMFxuICAgIC8vICAgc3Q9MTQ3ODA4ODAwMCByYj0zMjExNTI5NiBycD0zNDI5MSB0Yj0yOTU2ODA1IHRwPTI1NzA1IG9wPTBcbiAgICAvLyAgIHN0PTE0NzgwOTE2MDAgcmI9MjcxNDY4MyBycD0xMTgyMSB0Yj0xNDIwNTY0IHRwPTEyNjUwIG9wPTBcbiAgICAvLyAgIHN0PTE0NzgwOTUyMDAgcmI9MTAwNzkyMTMgcnA9MTk5NjIgdGI9MjQ4NzcwNSB0cD0yMDAxNSBvcD0wXG4gICAgLy8gICBzdD0xNDc4MDk4ODAwIHJiPTQ0NDQ0MzMgcnA9MTAyMjcgdGI9MTQzMDM1NiB0cD0xMDQ5MyBvcD0wXG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBsZXQgZnJvbVh0c3RhdHMgPSBkYXRhLmluZGV4T2YoJ1h0IHN0YXRzOicpO1xuXG4gICAgbGV0IHN0YXJ0ID0gZGF0YS5pbmRleE9mKCdQZW5kaW5nIGJ5dGVzOicsIGZyb21YdHN0YXRzKTtcbiAgICBsZXQgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc6Jywgc3RhcnQgKyAxKTtcbiAgICBsZXQgZW5kID0gZGF0YS5pbmRleE9mKCdcXG4nLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICBsZXQgcGVuZGluZ0J5dGVzID0gZGF0YS5zdWJzdHJpbmcoZGVsaW1pdGVyICsgMSwgZW5kKS50cmltKCk7XG5cbiAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICBzdGFydCA9IGRhdGEuaW5kZXhPZignYnVja2V0RHVyYXRpb24nLCBlbmQgKyAxKTtcbiAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJ1xcbicsIGRlbGltaXRlciArIDEpO1xuICAgICAgYnVja2V0RHVyYXRpb24gPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgZGF0YSA9IGRhdGEuc3Vic3RyaW5nKGVuZCArIDEsIGRhdGEubGVuZ3RoKTtcbiAgICAgIGxldCBhcnJheUxpc3QgPSBkYXRhLnNwbGl0KCdcXG4nKTtcblxuICAgICAgaWYgKGFycmF5TGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLTE7XG5cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBORVRXT1JLX0tFWVMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICBzdGFydCA9IGFycmF5TGlzdFswXS5pbmRleE9mKE5FVFdPUktfS0VZU1tqXVswXSk7XG5cbiAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgaW5kZXggPSBqO1xuICAgICAgICAgICAgcmV0dXJuVmFsdWVbMF0gPSBbXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBORVRXT1JLX0tFWVNbal0ubGVuZ3RoOyArK2spIHtcbiAgICAgICAgICAgICAgcmV0dXJuVmFsdWVbMF1ba10gPSBORVRXT1JLX0tFWVNbal1ba107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0dXJuSW5kZXggPSAxO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGRhdGEgPSBhcnJheUxpc3RbaV07XG4gICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVswXSk7XG5cbiAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgIGVuZCA9IGRhdGEuaW5kZXhPZignICcsIGRlbGltaXRlciArIDEpO1xuICAgICAgICAgICAgYnVja2V0U3RhcnQgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcblxuICAgICAgICAgICAgaWYgKGVuZCA+IGRlbGltaXRlcikge1xuICAgICAgICAgICAgICBzdGFydCA9IGRhdGEuaW5kZXhPZihORVRXT1JLX0tFWVNbaW5kZXhdWzFdLCBlbmQgKyAxKTtcbiAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IDApIHtcbiAgICAgICAgICAgICAgICBkZWxpbWl0ZXIgPSBkYXRhLmluZGV4T2YoJz0nLCBzdGFydCArIDEpO1xuICAgICAgICAgICAgICAgIGVuZCA9IGRhdGEuaW5kZXhPZignICcsIGRlbGltaXRlciArIDEpO1xuICAgICAgICAgICAgICAgIGFjdGl2ZVRpbWUgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bMl0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5pbmRleE9mKCcgJywgZGVsaW1pdGVyICsgMSk7XG4gICAgICAgICAgICAgICAgcnhCeXRlcyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVszXSwgZW5kICsgMSk7XG4gICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJyAnLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICAgICAgICAgICAgICByeFBhY2tldHMgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bNF0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5pbmRleE9mKCcgJywgZGVsaW1pdGVyICsgMSk7XG4gICAgICAgICAgICAgICAgdHhCeXRlcyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVs1XSwgZW5kICsgMSk7XG4gICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJyAnLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICAgICAgICAgICAgICB0eFBhY2tldHMgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bNl0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9ucyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVyblZhbHVlW3JldHVybkluZGV4KytdID0gW2J1Y2tldFN0YXJ0LCBhY3RpdmVUaW1lLCByeEJ5dGVzLCByeFBhY2tldHMsIHR4Qnl0ZXMsIHR4UGFja2V0cywgb3BlcmF0aW9ucywgYnVja2V0RHVyYXRpb25dO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc0VxdWFsKHBlbmRpbmdCeXRlcywgJycpICYmICFfLmlzVW5kZWZpbmVkKHBlbmRpbmdCeXRlcykgJiYgIV8uaXNFcXVhbChwZW5kaW5nQnl0ZXMsICdub2RleCcpKSB7XG4gICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIG5ldHdvcmsgdHJhZmZpYyBkYXRhOiAnJHtkYXRhfSdgKTtcbiAgICB9XG4gIH0pO1xufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcywgaGVscGVycyk7XG5leHBvcnQge1xuICBjb21tYW5kcywgaGVscGVycywgU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVMsIENQVV9LRVlTLCBNRU1PUllfS0VZUyxcbiAgQkFUVEVSWV9LRVlTLCBORVRXT1JLX0tFWVMsXG59O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcblxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUVBLE1BQU1BLFFBQVEsR0FBRyxFQUFqQjtBQUFBLE1BQXFCQyxPQUFPLEdBQUcsRUFBL0I7QUFBQSxNQUFtQ0MsVUFBVSxHQUFHLEVBQWhEOzs7QUFFQSxNQUFNQyxZQUFZLEdBQUcsQ0FDbkIsQ0FBQyxhQUFELEVBQWdCLFlBQWhCLEVBQThCLFNBQTlCLEVBQXlDLFdBQXpDLEVBQXNELFNBQXRELEVBQWlFLFdBQWpFLEVBQThFLFlBQTlFLEVBQTRGLGdCQUE1RixDQURtQixFQUVuQixDQUFDLElBQUQsRUFBTyxZQUFQLEVBQXFCLElBQXJCLEVBQTJCLElBQTNCLEVBQWlDLElBQWpDLEVBQXVDLElBQXZDLEVBQTZDLElBQTdDLEVBQW1ELGdCQUFuRCxDQUZtQixDQUFyQjs7QUFJQSxNQUFNQyxRQUFRLEdBQUcsQ0FBQyxNQUFELEVBQVMsUUFBVCxDQUFqQjs7QUFDQSxNQUFNQyxZQUFZLEdBQUcsQ0FBQyxPQUFELENBQXJCOztBQUNBLE1BQU1DLFdBQVcsR0FBRyxDQUNsQixtQkFEa0IsRUFDRyxvQkFESCxFQUN5QixvQkFEekIsRUFFbEIsaUJBRmtCLEVBRUMsZ0JBRkQsRUFHbEIsVUFIa0IsRUFHTixXQUhNLEVBR08sV0FIUCxFQUdvQixRQUhwQixF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
|
|
275
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiTkVUV09SS19LRVlTIiwiQ1BVX0tFWVMiLCJCQVRURVJZX0tFWVMiLCJNRU1PUllfS0VZUyIsIlNVUFBPUlRFRF9QRVJGT1JNQU5DRV9EQVRBX1RZUEVTIiwiT2JqZWN0IiwiZnJlZXplIiwiY3B1aW5mbyIsIm1lbW9yeWluZm8iLCJiYXR0ZXJ5aW5mbyIsIm5ldHdvcmtpbmZvIiwiTUVNSU5GT19USVRMRVMiLCJOQVRJVkUiLCJEQUxWSUsiLCJFR0wiLCJHTCIsIk1UUkFDSyIsIlRPVEFMIiwiSEVBUCIsIlJFVFJZX1BBVVNFX01TIiwicGFyc2VNZW1pbmZvRm9yQXBpMTlUbzI5IiwiZW50cmllcyIsInZhbERpY3QiLCJ0eXBlIiwic3ViVHlwZSIsIm5hdGl2ZVBzcyIsIm5hdGl2ZVByaXZhdGVEaXJ0eSIsIm5hdGl2ZUhlYXBTaXplIiwibmF0aXZlSGVhcEFsbG9jYXRlZFNpemUiLCJkYWx2aWtQc3MiLCJkYWx2aWtQcml2YXRlRGlydHkiLCJlZ2xQc3MiLCJlZ2xQcml2YXRlRGlydHkiLCJnbFBzcyIsImdsUHJpdmF0ZURpcnR5IiwibGVuZ3RoIiwidG90YWxQc3MiLCJ0b3RhbFByaXZhdGVEaXJ0eSIsInBhcnNlTWVtaW5mb0ZvckFwaUJlbG93MTkiLCJwYXJzZU1lbWluZm9Gb3JBcGlBYm92ZTI5IiwibmF0aXZlUnNzIiwiZGFsdmlrUnNzIiwidG90YWxSc3MiLCJnZXRQZXJmb3JtYW5jZURhdGFUeXBlcyIsIl8iLCJrZXlzIiwiZ2V0UGVyZm9ybWFuY2VEYXRhIiwicGFja2FnZU5hbWUiLCJkYXRhVHlwZSIsInJldHJpZXMiLCJ0b0xvd2VyIiwiZ2V0QmF0dGVyeUluZm8iLCJnZXRDUFVJbmZvIiwiZ2V0TWVtb3J5SW5mbyIsImdldE5ldHdvcmtUcmFmZmljSW5mbyIsIkVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsInJldHJ5SW50ZXJ2YWwiLCJvdXRwdXQiLCJhZGIiLCJzaGVsbCIsImUiLCJzdGRlcnIiLCJsb2ciLCJpbmZvIiwidXNhZ2VzUGF0dGVybiIsIlJlZ0V4cCIsImVzY2FwZVJlZ0V4cCIsIm1hdGNoIiwiZXhlYyIsImRlYnVnIiwiY21kIiwiZGF0YSIsInBvd2VyIiwicGFyc2VJbnQiLCJzcGxpdCIsInRyaW0iLCJOdW1iZXIiLCJpc05hTiIsImNsb25lIiwidG9TdHJpbmciLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwibGluZSIsImZpbHRlciIsIkJvb2xlYW4iLCJoZWFkZXJzIiwidmFsdWVzIiwibWFwIiwiaGVhZGVyIiwicmV0dXJuVmFsdWUiLCJidWNrZXREdXJhdGlvbiIsImJ1Y2tldFN0YXJ0IiwiYWN0aXZlVGltZSIsInJ4Qnl0ZXMiLCJyeFBhY2tldHMiLCJ0eEJ5dGVzIiwidHhQYWNrZXRzIiwib3BlcmF0aW9ucyIsImluZGV4IiwiZnJvbVh0c3RhdHMiLCJpbmRleE9mIiwic3RhcnQiLCJkZWxpbWl0ZXIiLCJlbmQiLCJwZW5kaW5nQnl0ZXMiLCJzdWJzdHJpbmciLCJhcnJheUxpc3QiLCJqIiwiayIsInJldHVybkluZGV4IiwiaSIsImlzRXF1YWwiLCJpc1VuZGVmaW5lZCIsImFzc2lnbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9wZXJmb3JtYW5jZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCB9IGZyb20gJ2FzeW5jYm94JztcblxuY29uc3QgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmNvbnN0IE5FVFdPUktfS0VZUyA9IFtcbiAgWydidWNrZXRTdGFydCcsICdhY3RpdmVUaW1lJywgJ3J4Qnl0ZXMnLCAncnhQYWNrZXRzJywgJ3R4Qnl0ZXMnLCAndHhQYWNrZXRzJywgJ29wZXJhdGlvbnMnLCAnYnVja2V0RHVyYXRpb24nXSxcbiAgWydzdCcsICdhY3RpdmVUaW1lJywgJ3JiJywgJ3JwJywgJ3RiJywgJ3RwJywgJ29wJywgJ2J1Y2tldER1cmF0aW9uJ11cbl07XG5jb25zdCBDUFVfS0VZUyA9IFsndXNlcicsICdrZXJuZWwnXTtcbmNvbnN0IEJBVFRFUllfS0VZUyA9IFsncG93ZXInXTtcbmNvbnN0IE1FTU9SWV9LRVlTID0gW1xuICAndG90YWxQcml2YXRlRGlydHknLCAnbmF0aXZlUHJpdmF0ZURpcnR5JywgJ2RhbHZpa1ByaXZhdGVEaXJ0eScsXG4gICdlZ2xQcml2YXRlRGlydHknLCAnZ2xQcml2YXRlRGlydHknLFxuICAndG90YWxQc3MnLCAnbmF0aXZlUHNzJywgJ2RhbHZpa1BzcycsICdlZ2xQc3MnLCAnZ2xQc3MnLFxuICAnbmF0aXZlSGVhcEFsbG9jYXRlZFNpemUnLCAnbmF0aXZlSGVhcFNpemUnLFxuICAnbmF0aXZlUnNzJywgJ2RhbHZpa1JzcycsICd0b3RhbFJzcydcbl07XG5jb25zdCBTVVBQT1JURURfUEVSRk9STUFOQ0VfREFUQV9UWVBFUyA9IE9iamVjdC5mcmVlemUoe1xuICBjcHVpbmZvOiAndGhlIGFtb3VudCBvZiBjcHUgYnkgdXNlciBhbmQga2VybmVsIHByb2Nlc3MgLSBjcHUgaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZXMgYW5kIHNpbXVsYXRvcnMnLFxuICBtZW1vcnlpbmZvOiAndGhlIGFtb3VudCBvZiBtZW1vcnkgdXNlZCBieSB0aGUgcHJvY2VzcyAtIG1lbW9yeSBpbmZvcm1hdGlvbiBmb3IgYXBwbGljYXRpb25zIG9uIHJlYWwgZGV2aWNlcyBhbmQgc2ltdWxhdG9ycycsXG4gIGJhdHRlcnlpbmZvOiAndGhlIHJlbWFpbmluZyBiYXR0ZXJ5IHBvd2VyIC0gYmF0dGVyeSBwb3dlciBpbmZvcm1hdGlvbiBmb3IgYXBwbGljYXRpb25zIG9uIHJlYWwgZGV2aWNlcyBhbmQgc2ltdWxhdG9ycycsXG4gIG5ldHdvcmtpbmZvOiAndGhlIG5ldHdvcmsgc3RhdGlzdGljcyAtIG5ldHdvcmsgcngvdHggaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZXMgYW5kIHNpbXVsYXRvcnMnXG59KTtcbmNvbnN0IE1FTUlORk9fVElUTEVTID0gT2JqZWN0LmZyZWV6ZSh7XG4gIE5BVElWRTogJ05hdGl2ZScsXG4gIERBTFZJSzogJ0RhbHZpaycsXG4gIEVHTDogJ0VHTCcsXG4gIEdMOiAnR0wnLFxuICBNVFJBQ0s6ICdtdHJhY2snLFxuICBUT1RBTDogJ1RPVEFMJyxcbiAgSEVBUDogJ0hlYXAnXG59KTtcbmNvbnN0IFJFVFJZX1BBVVNFX01TID0gMTAwMDtcblxuLyoqXG4gKiBBUEkgbGV2ZWwgYmV0d2VlbiAxOCBhbmQgMzBcbiAqIFsnPFN5c3RlbSBUeXBlPicsICc8TWVtb3J5IFR5cGU+JywgPHBzcyB0b3RhbD4sIDxwcml2YXRlIGRpcnR5PiwgPHByaXZhdGUgY2xlYW4+LCA8c3dhcFBzcyBkaXJ0eT4sIDxoZWFwIHNpemU+LCA8aGVhcCBhbGxvYz4sIDxoZWFwIGZyZWU+XVxuICogZXhjZXB0ICdUT1RBTCcsIHdoaWNoIHNraXBzIHRoZSBzZWNvbmQgdHlwZSBuYW1lXG4gKiAhISEgdmFsRGljdCBnZXRzIG11dGF0ZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VNZW1pbmZvRm9yQXBpMTlUbzI5IChlbnRyaWVzLCB2YWxEaWN0KSB7XG4gIGNvbnN0IFt0eXBlLCBzdWJUeXBlXSA9IGVudHJpZXM7XG4gIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5OQVRJVkUgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuSEVBUCkge1xuICAgIFssLCB2YWxEaWN0Lm5hdGl2ZVBzcywgdmFsRGljdC5uYXRpdmVQcml2YXRlRGlydHksLCwgdmFsRGljdC5uYXRpdmVIZWFwU2l6ZSwgdmFsRGljdC5uYXRpdmVIZWFwQWxsb2NhdGVkU2l6ZV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkRBTFZJSyAmJiBzdWJUeXBlID09PSBNRU1JTkZPX1RJVExFUy5IRUFQKSB7XG4gICAgWywsIHZhbERpY3QuZGFsdmlrUHNzLCB2YWxEaWN0LmRhbHZpa1ByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkVHTCAmJiBzdWJUeXBlID09PSBNRU1JTkZPX1RJVExFUy5NVFJBQ0spIHtcbiAgICBbLCwgdmFsRGljdC5lZ2xQc3MsIHZhbERpY3QuZWdsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuR0wgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTVRSQUNLKSB7XG4gICAgWywsIHZhbERpY3QuZ2xQc3MsIHZhbERpY3QuZ2xQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5UT1RBTCAmJiBlbnRyaWVzLmxlbmd0aCA9PT0gOCkge1xuICAgIC8vIHRoZXJlIGFyZSB0d28gdG90YWxzLCBhbmQgd2Ugb25seSB3YW50IHRoZSBmdWxsIGxpc3RpbmcsIHdoaWNoIGhhcyA4IGVudHJpZXNcbiAgICBbLCB2YWxEaWN0LnRvdGFsUHNzLCB2YWxEaWN0LnRvdGFsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBbJzxTeXN0ZW0gVHlwZScsICc8cHBzPicsICc8c2hhcmVkIGRpcnR5PicsICc8cHJpdmF0ZSBkaXJ0eT4nLCAnPGhlYXAgc2l6ZT4nLCAnPGhlYXAgYWxsb2M+JywgJzxoZWFwIGZyZWU+J11cbiAqICEhISB2YWxEaWN0IGdldHMgbXV0YXRlZFxuICovXG5mdW5jdGlvbiBwYXJzZU1lbWluZm9Gb3JBcGlCZWxvdzE5IChlbnRyaWVzLCB2YWxEaWN0KSB7XG4gIGNvbnN0IHR5cGUgPSBlbnRyaWVzWzBdO1xuICBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTkFUSVZFKSB7XG4gICAgWywgdmFsRGljdC5uYXRpdmVQc3MsLCB2YWxEaWN0Lm5hdGl2ZVByaXZhdGVEaXJ0eSwgdmFsRGljdC5uYXRpdmVIZWFwU2l6ZSwgdmFsRGljdC5uYXRpdmVIZWFwQWxsb2NhdGVkU2l6ZV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkRBTFZJSykge1xuICAgIFssIHZhbERpY3QuZGFsdmlrUHNzLCwgdmFsRGljdC5kYWx2aWtQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5FR0wpIHtcbiAgICBbLCB2YWxEaWN0LmVnbFBzcywsIHZhbERpY3QuZWdsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuR0wpIHtcbiAgICBbLCB2YWxEaWN0LmdsUHNzLCwgdmFsRGljdC5nbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLlRPVEFMKSB7XG4gICAgWywgdmFsRGljdC50b3RhbFBzcywsIHZhbERpY3QudG90YWxQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfVxufVxuXG4vKipcbiAqIEFQSSBsZXZlbCAzMCBhbmQgYWJvdmVcbiAqIFsnPFN5c3RlbSBUeXBlPicsICc8TWVtb3J5IFR5cGU+JywgPHBzcyB0b3RhbD4sIDxwcml2YXRlIGRpcnR5PiwgPHByaXZhdGUgY2xlYW4+LCA8c3dhcFBzcyBkaXJ0eT4sIDxyc3MgdG90YWw+LCA8aGVhcCBzaXplPiwgPGhlYXAgYWxsb2M+LCA8aGVhcCBmcmVlPl1cbiAqICEhISB2YWxEaWN0IGdldHMgbXV0YXRlZFxuICovXG5mdW5jdGlvbiBwYXJzZU1lbWluZm9Gb3JBcGlBYm92ZTI5IChlbnRyaWVzLCB2YWxEaWN0KSB7XG4gIGNvbnN0IFt0eXBlLCBzdWJUeXBlXSA9IGVudHJpZXM7XG4gIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5OQVRJVkUgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuSEVBUCkge1xuICAgIFssLCB2YWxEaWN0Lm5hdGl2ZVBzcywgdmFsRGljdC5uYXRpdmVQcml2YXRlRGlydHksLCwgdmFsRGljdC5uYXRpdmVSc3MsIHZhbERpY3QubmF0aXZlSGVhcFNpemUsIHZhbERpY3QubmF0aXZlSGVhcEFsbG9jYXRlZFNpemVdID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5EQUxWSUsgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuSEVBUCkge1xuICAgIFssLCB2YWxEaWN0LmRhbHZpa1BzcywgdmFsRGljdC5kYWx2aWtQcml2YXRlRGlydHksLCwgdmFsRGljdC5kYWx2aWtSc3NdID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5FR0wgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTVRSQUNLKSB7XG4gICAgWywsIHZhbERpY3QuZWdsUHNzLCB2YWxEaWN0LmVnbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkdMICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLk1UUkFDSykge1xuICAgIFssLCB2YWxEaWN0LmdsUHNzLCB2YWxEaWN0LmdsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuVE9UQUwgJiYgZW50cmllcy5sZW5ndGggPT09IDkpIHtcbiAgICAvLyBoYXMgOSBlbnRyaWVzXG4gICAgWywgdmFsRGljdC50b3RhbFBzcywgdmFsRGljdC50b3RhbFByaXZhdGVEaXJ0eSwsLCB2YWxEaWN0LnRvdGFsUnNzXSA9IGVudHJpZXM7XG4gIH1cbn1cblxuLy9cbi8vIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIHR5cGUgb2YgdGhlIHN5c3RlbSBzdGF0ZSB3aGljaCBpcyBzdXBwb3J0ZWQgdG8gcmVhZCBhcyBsaWtlIGNwdSwgbWVtb3J5LCBuZXR3b3JrIHRyYWZmaWMsIGFuZCBiYXR0ZXJ5LlxuLy8gb3V0cHV0IC0gYXJyYXkgbGlrZSBiZWxvd1xuLy8gW2NwdWluZm8sIGJhdHRlcnlpbmZvLCBuZXR3b3JraW5mbywgbWVtb3J5aW5mb11cbi8vXG5jb21tYW5kcy5nZXRQZXJmb3JtYW5jZURhdGFUeXBlcyA9IGZ1bmN0aW9uIGdldFBlcmZvcm1hbmNlRGF0YVR5cGVzICgpIHtcbiAgcmV0dXJuIF8ua2V5cyhTVVBQT1JURURfUEVSRk9STUFOQ0VfREFUQV9UWVBFUyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm5zIFRoZSBpbmZvcm1hdGlvbiB0eXBlIG9mIHRoZSBzeXN0ZW0gc3RhdGUgd2hpY2ggaXMgc3VwcG9ydGVkIHRvIHJlYWQgYXMgbGlrZSBjcHUsIG1lbW9yeSwgbmV0d29yayB0cmFmZmljLCBhbmQgYmF0dGVyeS5cbiAqIGlucHV0IC0gKHBhY2thZ2VOYW1lKSB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvblxuICogICAgICAgIChkYXRhVHlwZSkgdGhlIHR5cGUgb2Ygc3lzdGVtIHN0YXRlIHdoaWNoIHdhbnRzIHRvIHJlYWQuIEl0IHNob3VsZCBiZSBvbmUgb2YgdGhlIGtleXMgb2YgdGhlIFNVUFBPUlRFRF9QRVJGT1JNQU5DRV9EQVRBX1RZUEVTXG4gKiAgICAgICAgKGRhdGFSZWFkVGltZW91dCkgdGhlIG51bWJlciBvZiBhdHRlbXB0cyB0byByZWFkXG4gKiBvdXRwdXQgLSB0YWJsZSBvZiB0aGUgcGVyZm9ybWFuY2UgZGF0YSwgVGhlIGZpcnN0IGxpbmUgb2YgdGhlIHRhYmxlIHJlcHJlc2VudHMgdGhlIHR5cGUgb2YgZGF0YS4gVGhlIHJlbWFpbmluZyBsaW5lcyByZXByZXNlbnQgdGhlIHZhbHVlcyBvZiB0aGUgZGF0YS5cbiAqXG4gKiBpbiBjYXNlIG9mIGJhdHRlcnkgaW5mbyA6IFtbcG93ZXJdLCBbMjNdXVxuICogaW4gY2FzZSBvZiBtZW1vcnkgaW5mbyA6ICBbW3RvdGFsUHJpdmF0ZURpcnR5LCBuYXRpdmVQcml2YXRlRGlydHksIGRhbHZpa1ByaXZhdGVEaXJ0eSwgZWdsUHJpdmF0ZURpcnR5LCBnbFByaXZhdGVEaXJ0eSwgdG90YWxQc3MsXG4gKiAgIG5hdGl2ZVBzcywgZGFsdmlrUHNzLCBlZ2xQc3MsIGdsUHNzLCBuYXRpdmVIZWFwQWxsb2NhdGVkU2l6ZSwgbmF0aXZlSGVhcFNpemVdLCBbMTgzNjAsIDgyOTYsIDYxMzIsIG51bGwsIG51bGwsIDQyNTg4LCA4NDA2LCA3MDI0LCBudWxsLCBudWxsLCAyNjUxOSwgMTAzNDRdXVxuICogaW4gY2FzZSBvZiBuZXR3b3JrIGluZm8gOiBbW2J1Y2tldFN0YXJ0LCBhY3RpdmVUaW1lLCByeEJ5dGVzLCByeFBhY2tldHMsIHR4Qnl0ZXMsIHR4UGFja2V0cywgb3BlcmF0aW9ucywgYnVja2V0RHVyYXRpb24sXSxcbiAqICAgWzE0NzgwOTE2MDAwMDAsIG51bGwsIDEwOTkwNzUsIDYxMDk0NywgOTI4LCAxMTQzNjIsIDc2OSwgMCwgMzYwMDAwMF0sIFsxNDc4MDk1MjAwMDAwLCBudWxsLCAxMzA2MzAwLCA0MDU5OTcsIDUwOSwgNDYzNTksIDM3MCwgMCwgMzYwMDAwMF1dXG4gKiBpbiBjYXNlIG9mIG5ldHdvcmsgaW5mbyA6IFtbc3QsIGFjdGl2ZVRpbWUsIHJiLCBycCwgdGIsIHRwLCBvcCwgYnVja2V0RHVyYXRpb25dLCBbMTQ3ODA4ODAwMCwgbnVsbCwgbnVsbCwgMzIxMTUyOTYsIDM0MjkxLCAyOTU2ODA1LCAyNTcwNSwgMCwgMzYwMF0sXG4gKiAgIFsxNDc4MDkxNjAwLCBudWxsLCBudWxsLCAyNzE0NjgzLCAxMTgyMSwgMTQyMDU2NCwgMTI2NTAsIDAsIDM2MDBdLCBbMTQ3ODA5NTIwMCwgbnVsbCwgbnVsbCwgMTAwNzkyMTMsIDE5OTYyLCAyNDg3NzA1LCAyMDAxNSwgMCwgMzYwMF0sXG4gKiAgIFsxNDc4MDk4ODAwLCBudWxsLCBudWxsLCA0NDQ0NDMzLCAxMDIyNywgMTQzMDM1NiwgMTA0OTMsIDAsIDM2MDBdXVxuICogaW4gY2FzZSBvZiBjcHUgaW5mbyA6IFtbdXNlciwga2VybmVsXSwgWzAuOSwgMS4zXV1cbiAqL1xuY29tbWFuZHMuZ2V0UGVyZm9ybWFuY2VEYXRhID0gYXN5bmMgZnVuY3Rpb24gZ2V0UGVyZm9ybWFuY2VEYXRhIChwYWNrYWdlTmFtZSwgZGF0YVR5cGUsIHJldHJpZXMgPSAyKSB7XG4gIHN3aXRjaCAoXy50b0xvd2VyKGRhdGFUeXBlKSkge1xuICAgIGNhc2UgJ2JhdHRlcnlpbmZvJzpcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldEJhdHRlcnlJbmZvKHJldHJpZXMpO1xuICAgIGNhc2UgJ2NwdWluZm8nOlxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0Q1BVSW5mbyhwYWNrYWdlTmFtZSwgcmV0cmllcyk7XG4gICAgY2FzZSAnbWVtb3J5aW5mbyc6XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRNZW1vcnlJbmZvKHBhY2thZ2VOYW1lLCByZXRyaWVzKTtcbiAgICBjYXNlICduZXR3b3JraW5mbyc6XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXROZXR3b3JrVHJhZmZpY0luZm8ocmV0cmllcyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcGVyZm9ybWFuY2UgZGF0YSBvZiB0eXBlICcke2RhdGFUeXBlfScgZm91bmQuIGAgK1xuICAgICAgICBgT25seSB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgc3VwcG9ydGVkOiAke0pTT04uc3RyaW5naWZ5KFNVUFBPUlRFRF9QRVJGT1JNQU5DRV9EQVRBX1RZUEVTLCAnICcsIDIpfWApO1xuICB9XG59O1xuXG5oZWxwZXJzLmdldENQVUluZm8gPSBhc3luYyBmdW5jdGlvbiBnZXRDUFVJbmZvIChwYWNrYWdlTmFtZSwgcmV0cmllcyA9IDIpIHtcbiAgLy8gVE9ETzogZmlndXJlIG91dCB3aHkgdGhpcyBpc1xuICAvLyBzb21ldGltZXMsIHRoZSBmdW5jdGlvbiBvZiAnYWRiLnNoZWxsJyBmYWlscy4gd2hlbiBJIHRlc3RlZCB0aGlzIGZ1bmN0aW9uIG9uIHRoZSB0YXJnZXQgb2YgJ0dhbGF4eSBOb3RlNScsXG4gIC8vIGFkYi5zaGVsbChkdW1wc3lzIGNwdWluZm8pIHJldHVybnMgY3B1IGRhdGFzIGZvciBvdGhlciBhcHBsaWNhdGlvbiBwYWNrYWdlcywgYnV0IEkgY2FuJ3QgZmluZCB0aGUgZGF0YSBmb3IgcGFja2FnZU5hbWUuXG4gIC8vIEl0IHVzdWFsbHkgZmFpbHMgMzAgdGltZXMgYW5kIHN1Y2Nlc3MgZm9yIHRoZSBuZXh0IHRpbWUsXG4gIC8vIFNpbmNlIHRoZW4sIGhlIGhhcyBjb250aW51ZWQgdG8gc3VjY2VlZC5cbiAgcmV0dXJuIGF3YWl0IHJldHJ5SW50ZXJ2YWwocmV0cmllcywgUkVUUllfUEFVU0VfTVMsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgb3V0cHV0O1xuICAgIHRyeSB7XG4gICAgICBvdXRwdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2R1bXBzeXMnLCAnY3B1aW5mbyddKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5zdGRlcnIpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhlLnN0ZGVycik7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICAvLyBgb3V0cHV0YCB3aWxsIGJlIHNvbWV0aGluZyBsaWtlXG4gICAgLy8gICAgKzAlIDIyMDkvaW8uYXBwaXVtLmFuZHJvaWQuYXBpczogMC4xJSB1c2VyICsgMC4yJSBrZXJuZWwgLyBmYXVsdHM6IDcwIG1pbm9yXG4gICAgY29uc3QgdXNhZ2VzUGF0dGVybiA9XG4gICAgICBuZXcgUmVnRXhwKGBeLitcXFxcLyR7Xy5lc2NhcGVSZWdFeHAocGFja2FnZU5hbWUpfTpcXFxcRCsoW1xcXFxkLl0rKSVcXFxccyt1c2VyXFxcXHMrXFxcXCtcXFxccysoW1xcXFxkLl0rKSVcXFxccytrZXJuZWxgLCAnbScpO1xuICAgIGNvbnN0IG1hdGNoID0gdXNhZ2VzUGF0dGVybi5leGVjKG91dHB1dCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcob3V0cHV0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIGNwdSB1c2FnZSBkYXRhIGZvciAnJHtwYWNrYWdlTmFtZX0nLiBDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzYCk7XG4gICAgfVxuICAgIHJldHVybiBbQ1BVX0tFWVMsIFttYXRjaFsxXSwgbWF0Y2hbMl1dXTtcbiAgfSk7XG59O1xuXG5oZWxwZXJzLmdldEJhdHRlcnlJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0QmF0dGVyeUluZm8gKHJldHJpZXMgPSAyKSB7XG4gIHJldHVybiBhd2FpdCByZXRyeUludGVydmFsKHJldHJpZXMsIFJFVFJZX1BBVVNFX01TLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNtZCA9IFsnZHVtcHN5cycsICdiYXR0ZXJ5JywgJ3wnLCAnZ3JlcCcsICdsZXZlbCddO1xuICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoY21kKTtcbiAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcignTm8gZGF0YSBmcm9tIGR1bXBzeXMnKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICBsZXQgcG93ZXIgPSBwYXJzZUludCgoZGF0YS5zcGxpdCgnOicpWzFdIHx8ICcnKS50cmltKCksIDEwKTtcblxuICAgIGlmICghTnVtYmVyLmlzTmFOKHBvd2VyKSkge1xuICAgICAgcmV0dXJuIFtfLmNsb25lKEJBVFRFUllfS0VZUyksIFtwb3dlci50b1N0cmluZygpXV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIGJhdHRlcnkgZGF0YTogJyR7ZGF0YX0nYCk7XG4gICAgfVxuICB9KTtcbn07XG5cbmhlbHBlcnMuZ2V0TWVtb3J5SW5mbyA9IGFzeW5jIGZ1bmN0aW9uIGdldE1lbW9yeUluZm8gKHBhY2thZ2VOYW1lLCByZXRyaWVzID0gMikge1xuICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbChyZXRyaWVzLCBSRVRSWV9QQVVTRV9NUywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNtZCA9IFtcbiAgICAgICdkdW1wc3lzJywgJ21lbWluZm8nLCBgJyR7cGFja2FnZU5hbWV9J2AsXG4gICAgICAnfCcsICdncmVwJywgJy1FJyxcbiAgICAgIGAnJHtNRU1JTkZPX1RJVExFUy5OQVRJVkV9fCR7TUVNSU5GT19USVRMRVMuREFMVklLfXwke01FTUlORk9fVElUTEVTLkVHTH1gICtcbiAgICAgIGB8JHtNRU1JTkZPX1RJVExFUy5HTH18JHtNRU1JTkZPX1RJVExFUy5UT1RBTH0nYFxuICAgIF07XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGRhdGEgZnJvbSBkdW1wc3lzJyk7XG4gICAgfVxuICAgIGNvbnN0IHZhbERpY3QgPSB7dG90YWxQcml2YXRlRGlydHk6ICcnfTtcbiAgICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGRhdGEuc3BsaXQoJ1xcbicpKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBpZiAoYXBpTGV2ZWwgPj0gMzApIHtcbiAgICAgICAgcGFyc2VNZW1pbmZvRm9yQXBpQWJvdmUyOShlbnRyaWVzLCB2YWxEaWN0KTtcbiAgICAgIH0gZWxzZSBpZiAoYXBpTGV2ZWwgPiAxOCAmJiBhcGlMZXZlbCA8IDMwKSB7XG4gICAgICAgIHBhcnNlTWVtaW5mb0ZvckFwaTE5VG8yOShlbnRyaWVzLCB2YWxEaWN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlTWVtaW5mb0ZvckFwaUJlbG93MTkoZW50cmllcywgdmFsRGljdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2YWxEaWN0LnRvdGFsUHJpdmF0ZURpcnR5ICYmIHZhbERpY3QudG90YWxQcml2YXRlRGlydHkgIT09ICdub2RleCcpIHtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBfLmNsb25lKE1FTU9SWV9LRVlTKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGhlYWRlcnMubWFwKChoZWFkZXIpID0+IHZhbERpY3RbaGVhZGVyXSk7XG4gICAgICByZXR1cm4gW2hlYWRlcnMsIHZhbHVlc107XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgbWVtb3J5IGRhdGE6ICcke2RhdGF9J2ApO1xuICB9KTtcbn07XG5cbmhlbHBlcnMuZ2V0TmV0d29ya1RyYWZmaWNJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0TmV0d29ya1RyYWZmaWNJbmZvIChyZXRyaWVzID0gMikge1xuICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbChyZXRyaWVzLCBSRVRSWV9QQVVTRV9NUywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9IFtdO1xuICAgIGxldCBidWNrZXREdXJhdGlvbiwgYnVja2V0U3RhcnQsIGFjdGl2ZVRpbWUsIHJ4Qnl0ZXMsIHJ4UGFja2V0cywgdHhCeXRlcywgdHhQYWNrZXRzLCBvcGVyYXRpb25zO1xuXG4gICAgbGV0IGNtZCA9IFsnZHVtcHN5cycsICduZXRzdGF0cyddO1xuICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoY21kKTtcbiAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcignTm8gZGF0YSBmcm9tIGR1bXBzeXMnKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICAvLyBJbiBjYXNlIG9mIG5ldHdvcmsgdHJhZmZpYyBpbmZvcm1hdGlvbiwgaXQgaXMgZGlmZmVyZW50IGZvciB0aGUgcmV0dXJuIGRhdGEgYmV0d2VlbiBlbXVsYXRvciBhbmQgcmVhbCBkZXZpY2UuXG4gICAgLy8gdGhlIHJldHVybiBkYXRhIG9mIGVtdWxhdG9yXG4gICAgLy8gICBYdCBzdGF0czpcbiAgICAvLyAgIFBlbmRpbmcgYnl0ZXM6IDM5MjUwXG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1bW3R5cGU9V0lGSSwgc3ViVHlwZT1DT01CSU5FRCwgbmV0d29ya0lkPVwiV2lyZWRTU0lEXCJdXSB1aWQ9LTEgc2V0PUFMTCB0YWc9MHgwXG4gICAgLy8gICBOZXR3b3JrU3RhdHNIaXN0b3J5OiBidWNrZXREdXJhdGlvbj0zNjAwMDAwXG4gICAgLy8gICBidWNrZXRTdGFydD0xNDc4MDk4ODAwMDAwIGFjdGl2ZVRpbWU9MzE4MjQgcnhCeXRlcz0yMTUwMiByeFBhY2tldHM9NzggdHhCeXRlcz0xNzc0OCB0eFBhY2tldHM9OTAgb3BlcmF0aW9ucz0wXG4gICAgLy9cbiAgICAvLyA3LjFcbiAgICAvLyAgIFh0IHN0YXRzOlxuICAgIC8vICAgUGVuZGluZyBieXRlczogNDgxNDg3XG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1be3R5cGU9TU9CSUxFLCBzdWJUeXBlPUNPTUJJTkVELCBzdWJzY3JpYmVySWQ9MzEwMjYwLi4uLCBtZXRlcmVkPXRydWV9XSB1aWQ9LTEgc2V0PUFMTCB0YWc9MHgwXG4gICAgLy8gICAgIE5ldHdvcmtTdGF0c0hpc3Rvcnk6IGJ1Y2tldER1cmF0aW9uPTM2MDBcbiAgICAvLyAgICAgICBzdD0xNDgzOTg0ODAwIHJiPTAgcnA9MCB0Yj0xMjAzMSB0cD0xODQgb3A9MFxuICAgIC8vICAgICAgIHN0PTE0ODM5ODg0MDAgcmI9MCBycD0wIHRiPTM4NDc2IHRwPTU4NyBvcD0wXG4gICAgLy8gICAgICAgc3Q9MTQ4Mzk5OTIwMCByYj0zMTU2MTYgcnA9NDAwIHRiPTk0ODAwIHRwPTM2MiBvcD0wXG4gICAgLy8gICAgICAgc3Q9MTQ4NDAwMjgwMCByYj0xNTgyNiBycD0yMCB0Yj00NzM4IHRwPTE2IG9wPTBcbiAgICAvL1xuICAgIC8vIHRoZSByZXR1cm4gZGF0YSBvZiByZWFsIGRldmljZVxuICAgIC8vICAgWHQgc3RhdHM6XG4gICAgLy8gICBQZW5kaW5nIGJ5dGVzOiAwXG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1be3R5cGU9TU9CSUxFLCBzdWJUeXBlPUNPTUJJTkVELCBzdWJzY3JpYmVySWQ9NDUwMDUwLi4ufV0gdWlkPS0xIHNldD1BTEwgdGFnPTB4MFxuICAgIC8vICAgTmV0d29ya1N0YXRzSGlzdG9yeTogYnVja2V0RHVyYXRpb249MzYwMFxuICAgIC8vICAgc3Q9MTQ3ODA4ODAwMCByYj0zMjExNTI5NiBycD0zNDI5MSB0Yj0yOTU2ODA1IHRwPTI1NzA1IG9wPTBcbiAgICAvLyAgIHN0PTE0NzgwOTE2MDAgcmI9MjcxNDY4MyBycD0xMTgyMSB0Yj0xNDIwNTY0IHRwPTEyNjUwIG9wPTBcbiAgICAvLyAgIHN0PTE0NzgwOTUyMDAgcmI9MTAwNzkyMTMgcnA9MTk5NjIgdGI9MjQ4NzcwNSB0cD0yMDAxNSBvcD0wXG4gICAgLy8gICBzdD0xNDc4MDk4ODAwIHJiPTQ0NDQ0MzMgcnA9MTAyMjcgdGI9MTQzMDM1NiB0cD0xMDQ5MyBvcD0wXG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBsZXQgZnJvbVh0c3RhdHMgPSBkYXRhLmluZGV4T2YoJ1h0IHN0YXRzOicpO1xuXG4gICAgbGV0IHN0YXJ0ID0gZGF0YS5pbmRleE9mKCdQZW5kaW5nIGJ5dGVzOicsIGZyb21YdHN0YXRzKTtcbiAgICBsZXQgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc6Jywgc3RhcnQgKyAxKTtcbiAgICBsZXQgZW5kID0gZGF0YS5pbmRleE9mKCdcXG4nLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICBsZXQgcGVuZGluZ0J5dGVzID0gZGF0YS5zdWJzdHJpbmcoZGVsaW1pdGVyICsgMSwgZW5kKS50cmltKCk7XG5cbiAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICBzdGFydCA9IGRhdGEuaW5kZXhPZignYnVja2V0RHVyYXRpb24nLCBlbmQgKyAxKTtcbiAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJ1xcbicsIGRlbGltaXRlciArIDEpO1xuICAgICAgYnVja2V0RHVyYXRpb24gPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgZGF0YSA9IGRhdGEuc3Vic3RyaW5nKGVuZCArIDEsIGRhdGEubGVuZ3RoKTtcbiAgICAgIGxldCBhcnJheUxpc3QgPSBkYXRhLnNwbGl0KCdcXG4nKTtcblxuICAgICAgaWYgKGFycmF5TGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLTE7XG5cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBORVRXT1JLX0tFWVMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICBzdGFydCA9IGFycmF5TGlzdFswXS5pbmRleE9mKE5FVFdPUktfS0VZU1tqXVswXSk7XG5cbiAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgaW5kZXggPSBqO1xuICAgICAgICAgICAgcmV0dXJuVmFsdWVbMF0gPSBbXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBORVRXT1JLX0tFWVNbal0ubGVuZ3RoOyArK2spIHtcbiAgICAgICAgICAgICAgcmV0dXJuVmFsdWVbMF1ba10gPSBORVRXT1JLX0tFWVNbal1ba107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0dXJuSW5kZXggPSAxO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGRhdGEgPSBhcnJheUxpc3RbaV07XG4gICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVswXSk7XG5cbiAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgIGVuZCA9IGRhdGEuaW5kZXhPZignICcsIGRlbGltaXRlciArIDEpO1xuICAgICAgICAgICAgYnVja2V0U3RhcnQgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcblxuICAgICAgICAgICAgaWYgKGVuZCA+IGRlbGltaXRlcikge1xuICAgICAgICAgICAgICBzdGFydCA9IGRhdGEuaW5kZXhPZihORVRXT1JLX0tFWVNbaW5kZXhdWzFdLCBlbmQgKyAxKTtcbiAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IDApIHtcbiAgICAgICAgICAgICAgICBkZWxpbWl0ZXIgPSBkYXRhLmluZGV4T2YoJz0nLCBzdGFydCArIDEpO1xuICAgICAgICAgICAgICAgIGVuZCA9IGRhdGEuaW5kZXhPZignICcsIGRlbGltaXRlciArIDEpO1xuICAgICAgICAgICAgICAgIGFjdGl2ZVRpbWUgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bMl0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5pbmRleE9mKCcgJywgZGVsaW1pdGVyICsgMSk7XG4gICAgICAgICAgICAgICAgcnhCeXRlcyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVszXSwgZW5kICsgMSk7XG4gICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJyAnLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICAgICAgICAgICAgICByeFBhY2tldHMgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bNF0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5pbmRleE9mKCcgJywgZGVsaW1pdGVyICsgMSk7XG4gICAgICAgICAgICAgICAgdHhCeXRlcyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVs1XSwgZW5kICsgMSk7XG4gICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJyAnLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICAgICAgICAgICAgICB0eFBhY2tldHMgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bNl0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9ucyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVyblZhbHVlW3JldHVybkluZGV4KytdID0gW2J1Y2tldFN0YXJ0LCBhY3RpdmVUaW1lLCByeEJ5dGVzLCByeFBhY2tldHMsIHR4Qnl0ZXMsIHR4UGFja2V0cywgb3BlcmF0aW9ucywgYnVja2V0RHVyYXRpb25dO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc0VxdWFsKHBlbmRpbmdCeXRlcywgJycpICYmICFfLmlzVW5kZWZpbmVkKHBlbmRpbmdCeXRlcykgJiYgIV8uaXNFcXVhbChwZW5kaW5nQnl0ZXMsICdub2RleCcpKSB7XG4gICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIG5ldHdvcmsgdHJhZmZpYyBkYXRhOiAnJHtkYXRhfSdgKTtcbiAgICB9XG4gIH0pO1xufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcywgaGVscGVycyk7XG5leHBvcnQge1xuICBjb21tYW5kcywgaGVscGVycywgU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVMsIENQVV9LRVlTLCBNRU1PUllfS0VZUyxcbiAgQkFUVEVSWV9LRVlTLCBORVRXT1JLX0tFWVMsXG59O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcblxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFFQSxNQUFNQSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLE9BQU8sR0FBRyxDQUFDLENBQUM7RUFBRUMsVUFBVSxHQUFHLENBQUMsQ0FBQztBQUFDO0FBQUE7QUFFbkQsTUFBTUMsWUFBWSxHQUFHLENBQ25CLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixDQUFDLEVBQzdHLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixDQUFDLENBQ3JFO0FBQUM7QUFDRixNQUFNQyxRQUFRLEdBQUcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDO0FBQUM7QUFDcEMsTUFBTUMsWUFBWSxHQUFHLENBQUMsT0FBTyxDQUFDO0FBQUM7QUFDL0IsTUFBTUMsV0FBVyxHQUFHLENBQ2xCLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUMvRCxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFDbkMsVUFBVSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFD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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"performance.js","names":["commands","helpers","extensions","NETWORK_KEYS","CPU_KEYS","BATTERY_KEYS","MEMORY_KEYS","SUPPORTED_PERFORMANCE_DATA_TYPES","Object","freeze","cpuinfo","memoryinfo","batteryinfo","networkinfo","MEMINFO_TITLES","NATIVE","DALVIK","EGL","GL","MTRACK","TOTAL","HEAP","RETRY_PAUSE_MS","parseMeminfoForApi19To29","entries","valDict","type","subType","nativePss","nativePrivateDirty","nativeHeapSize","nativeHeapAllocatedSize","dalvikPss","dalvikPrivateDirty","eglPss","eglPrivateDirty","glPss","glPrivateDirty","length","totalPss","totalPrivateDirty","parseMeminfoForApiBelow19","parseMeminfoForApiAbove29","nativeRss","dalvikRss","totalRss","getPerformanceDataTypes","_","keys","getPerformanceData","packageName","dataType","retries","toLower","getBatteryInfo","getCPUInfo","getMemoryInfo","getNetworkTrafficInfo","Error","JSON","stringify","retryInterval","output","adb","shell","e","stderr","log","info","usagesPattern","RegExp","escapeRegExp","match","exec","debug","cmd","data","power","parseInt","split","trim","Number","isNaN","clone","toString","apiLevel","getApiLevel","line","filter","Boolean","headers","values","map","header","returnValue","bucketDuration","bucketStart","activeTime","rxBytes","rxPackets","txBytes","txPackets","operations","index","fromXtstats","indexOf","start","delimiter","end","pendingBytes","substring","arrayList","j","k","returnIndex","i","isEqual","isUndefined","assign"],"sources":["../../../lib/commands/performance.js"],"sourcesContent":["import _ from 'lodash';\nimport { retryInterval } from 'asyncbox';\n\nconst commands = {}, helpers = {}, extensions = {};\n\nconst NETWORK_KEYS = [\n ['bucketStart', 'activeTime', 'rxBytes', 'rxPackets', 'txBytes', 'txPackets', 'operations', 'bucketDuration'],\n ['st', 'activeTime', 'rb', 'rp', 'tb', 'tp', 'op', 'bucketDuration']\n];\nconst CPU_KEYS = ['user', 'kernel'];\nconst BATTERY_KEYS = ['power'];\nconst MEMORY_KEYS = [\n 'totalPrivateDirty', 'nativePrivateDirty', 'dalvikPrivateDirty',\n 'eglPrivateDirty', 'glPrivateDirty',\n 'totalPss', 'nativePss', 'dalvikPss', 'eglPss', 'glPss',\n 'nativeHeapAllocatedSize', 'nativeHeapSize',\n 'nativeRss', 'dalvikRss', 'totalRss'\n];\nconst SUPPORTED_PERFORMANCE_DATA_TYPES = Object.freeze({\n cpuinfo: 'the amount of cpu by user and kernel process - cpu information for applications on real devices and simulators',\n memoryinfo: 'the amount of memory used by the process - memory information for applications on real devices and simulators',\n batteryinfo: 'the remaining battery power - battery power information for applications on real devices and simulators',\n networkinfo: 'the network statistics - network rx/tx information for applications on real devices and simulators'\n});\nconst MEMINFO_TITLES = Object.freeze({\n NATIVE: 'Native',\n DALVIK: 'Dalvik',\n EGL: 'EGL',\n GL: 'GL',\n MTRACK: 'mtrack',\n TOTAL: 'TOTAL',\n HEAP: 'Heap'\n});\nconst RETRY_PAUSE_MS = 1000;\n\n/**\n * API level between 18 and 30\n * ['<System Type>', '<Memory Type>', <pss total>, <private dirty>, <private clean>, <swapPss dirty>, <heap size>, <heap alloc>, <heap free>]\n * except 'TOTAL', which skips the second type name\n * !!! valDict gets mutated\n */\nfunction parseMeminfoForApi19To29 (entries, valDict) {\n const [type, subType] = entries;\n if (type === MEMINFO_TITLES.NATIVE && subType === MEMINFO_TITLES.HEAP) {\n [,, valDict.nativePss, valDict.nativePrivateDirty,,, valDict.nativeHeapSize, valDict.nativeHeapAllocatedSize] = entries;\n } else if (type === MEMINFO_TITLES.DALVIK && subType === MEMINFO_TITLES.HEAP) {\n [,, valDict.dalvikPss, valDict.dalvikPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.EGL && subType === MEMINFO_TITLES.MTRACK) {\n [,, valDict.eglPss, valDict.eglPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.GL && subType === MEMINFO_TITLES.MTRACK) {\n [,, valDict.glPss, valDict.glPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.TOTAL && entries.length === 8) {\n // there are two totals, and we only want the full listing, which has 8 entries\n [, valDict.totalPss, valDict.totalPrivateDirty] = entries;\n }\n}\n\n/**\n * ['<System Type', '<pps>', '<shared dirty>', '<private dirty>', '<heap size>', '<heap alloc>', '<heap free>']\n * !!! valDict gets mutated\n */\nfunction parseMeminfoForApiBelow19 (entries, valDict) {\n const type = entries[0];\n if (type === MEMINFO_TITLES.NATIVE) {\n [, valDict.nativePss,, valDict.nativePrivateDirty, valDict.nativeHeapSize, valDict.nativeHeapAllocatedSize] = entries;\n } else if (type === MEMINFO_TITLES.DALVIK) {\n [, valDict.dalvikPss,, valDict.dalvikPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.EGL) {\n [, valDict.eglPss,, valDict.eglPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.GL) {\n [, valDict.glPss,, valDict.glPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.TOTAL) {\n [, valDict.totalPss,, valDict.totalPrivateDirty] = entries;\n }\n}\n\n/**\n * API level 30 and above\n * ['<System Type>', '<Memory Type>', <pss total>, <private dirty>, <private clean>, <swapPss dirty>, <rss total>, <heap size>, <heap alloc>, <heap free>]\n * !!! valDict gets mutated\n */\nfunction parseMeminfoForApiAbove29 (entries, valDict) {\n const [type, subType] = entries;\n if (type === MEMINFO_TITLES.NATIVE && subType === MEMINFO_TITLES.HEAP) {\n [,, valDict.nativePss, valDict.nativePrivateDirty,,, valDict.nativeRss, valDict.nativeHeapSize, valDict.nativeHeapAllocatedSize] = entries;\n } else if (type === MEMINFO_TITLES.DALVIK && subType === MEMINFO_TITLES.HEAP) {\n [,, valDict.dalvikPss, valDict.dalvikPrivateDirty,,, valDict.dalvikRss] = entries;\n } else if (type === MEMINFO_TITLES.EGL && subType === MEMINFO_TITLES.MTRACK) {\n [,, valDict.eglPss, valDict.eglPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.GL && subType === MEMINFO_TITLES.MTRACK) {\n [,, valDict.glPss, valDict.glPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.TOTAL && entries.length === 9) {\n // has 9 entries\n [, valDict.totalPss, valDict.totalPrivateDirty,,, valDict.totalRss] = entries;\n }\n}\n\n//\n// returns the information type of the system state which is supported to read as like cpu, memory, network traffic, and battery.\n// output - array like below\n// [cpuinfo, batteryinfo, networkinfo, memoryinfo]\n//\ncommands.getPerformanceDataTypes = function getPerformanceDataTypes () {\n return _.keys(SUPPORTED_PERFORMANCE_DATA_TYPES);\n};\n\n/**\n * @returns The information type of the system state which is supported to read as like cpu, memory, network traffic, and battery.\n * input - (packageName) the package name of the application\n * (dataType) the type of system state which wants to read. It should be one of the keys of the SUPPORTED_PERFORMANCE_DATA_TYPES\n * (dataReadTimeout) the number of attempts to read\n * output - table of the performance data, The first line of the table represents the type of data. The remaining lines represent the values of the data.\n *\n * in case of battery info : [[power], [23]]\n * in case of memory info : [[totalPrivateDirty, nativePrivateDirty, dalvikPrivateDirty, eglPrivateDirty, glPrivateDirty, totalPss,\n * nativePss, dalvikPss, eglPss, glPss, nativeHeapAllocatedSize, nativeHeapSize], [18360, 8296, 6132, null, null, 42588, 8406, 7024, null, null, 26519, 10344]]\n * in case of network info : [[bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations, bucketDuration,],\n * [1478091600000, null, 1099075, 610947, 928, 114362, 769, 0, 3600000], [1478095200000, null, 1306300, 405997, 509, 46359, 370, 0, 3600000]]\n * in case of network info : [[st, activeTime, rb, rp, tb, tp, op, bucketDuration], [1478088000, null, null, 32115296, 34291, 2956805, 25705, 0, 3600],\n * [1478091600, null, null, 2714683, 11821, 1420564, 12650, 0, 3600], [1478095200, null, null, 10079213, 19962, 2487705, 20015, 0, 3600],\n * [1478098800, null, null, 4444433, 10227, 1430356, 10493, 0, 3600]]\n * in case of cpu info : [[user, kernel], [0.9, 1.3]]\n */\ncommands.getPerformanceData = async function getPerformanceData (packageName, dataType, retries = 2) {\n switch (_.toLower(dataType)) {\n case 'batteryinfo':\n return await this.getBatteryInfo(retries);\n case 'cpuinfo':\n return await this.getCPUInfo(packageName, retries);\n case 'memoryinfo':\n return await this.getMemoryInfo(packageName, retries);\n case 'networkinfo':\n return await this.getNetworkTrafficInfo(retries);\n default:\n throw new Error(`No performance data of type '${dataType}' found. ` +\n `Only the following values are supported: ${JSON.stringify(SUPPORTED_PERFORMANCE_DATA_TYPES, ' ', 2)}`);\n }\n};\n\nhelpers.getCPUInfo = async function getCPUInfo (packageName, retries = 2) {\n // TODO: figure out why this is\n // sometimes, the function of 'adb.shell' fails. when I tested this function on the target of 'Galaxy Note5',\n // adb.shell(dumpsys cpuinfo) returns cpu datas for other application packages, but I can't find the data for packageName.\n // It usually fails 30 times and success for the next time,\n // Since then, he has continued to succeed.\n return await retryInterval(retries, RETRY_PAUSE_MS, async () => {\n let output;\n try {\n output = await this.adb.shell(['dumpsys', 'cpuinfo']);\n } catch (e) {\n if (e.stderr) {\n this.log.info(e.stderr);\n }\n throw e;\n }\n // `output` will be something like\n // +0% 2209/io.appium.android.apis: 0.1% user + 0.2% kernel / faults: 70 minor\n const usagesPattern =\n new RegExp(`^.+\\\\/${_.escapeRegExp(packageName)}:\\\\D+([\\\\d.]+)%\\\\s+user\\\\s+\\\\+\\\\s+([\\\\d.]+)%\\\\s+kernel`, 'm');\n const match = usagesPattern.exec(output);\n if (!match) {\n this.log.debug(output);\n throw new Error(`Unable to parse cpu usage data for '${packageName}'. Check the server log for more details`);\n }\n return [CPU_KEYS, [match[1], match[2]]];\n });\n};\n\nhelpers.getBatteryInfo = async function getBatteryInfo (retries = 2) {\n return await retryInterval(retries, RETRY_PAUSE_MS, async () => {\n let cmd = ['dumpsys', 'battery', '|', 'grep', 'level'];\n let data = await this.adb.shell(cmd);\n if (!data) throw new Error('No data from dumpsys'); //eslint-disable-line curly\n\n let power = parseInt((data.split(':')[1] || '').trim(), 10);\n\n if (!Number.isNaN(power)) {\n return [_.clone(BATTERY_KEYS), [power.toString()]];\n } else {\n throw new Error(`Unable to parse battery data: '${data}'`);\n }\n });\n};\n\nhelpers.getMemoryInfo = async function getMemoryInfo (packageName, retries = 2) {\n return await retryInterval(retries, RETRY_PAUSE_MS, async () => {\n const cmd = [\n 'dumpsys', 'meminfo', `'${packageName}'`,\n '|', 'grep', '-E',\n `'${MEMINFO_TITLES.NATIVE}|${MEMINFO_TITLES.DALVIK}|${MEMINFO_TITLES.EGL}` +\n `|${MEMINFO_TITLES.GL}|${MEMINFO_TITLES.TOTAL}'`\n ];\n const data = await this.adb.shell(cmd);\n if (!data) {\n throw new Error('No data from dumpsys');\n }\n const valDict = {totalPrivateDirty: ''};\n const apiLevel = await this.adb.getApiLevel();\n for (const line of data.split('\\n')) {\n const entries = line.trim().split(/\\s+/).filter(Boolean);\n if (apiLevel >= 30) {\n parseMeminfoForApiAbove29(entries, valDict);\n } else if (apiLevel > 18 && apiLevel < 30) {\n parseMeminfoForApi19To29(entries, valDict);\n } else {\n parseMeminfoForApiBelow19(entries, valDict);\n }\n }\n if (valDict.totalPrivateDirty && valDict.totalPrivateDirty !== 'nodex') {\n const headers = _.clone(MEMORY_KEYS);\n const values = headers.map((header) => valDict[header]);\n return [headers, values];\n }\n\n throw new Error(`Unable to parse memory data: '${data}'`);\n });\n};\n\nhelpers.getNetworkTrafficInfo = async function getNetworkTrafficInfo (retries = 2) {\n return await retryInterval(retries, RETRY_PAUSE_MS, async () => {\n let returnValue = [];\n let bucketDuration, bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations;\n\n let cmd = ['dumpsys', 'netstats'];\n let data = await this.adb.shell(cmd);\n if (!data) throw new Error('No data from dumpsys'); //eslint-disable-line curly\n\n // In case of network traffic information, it is different for the return data between emulator and real device.\n // the return data of emulator\n // Xt stats:\n // Pending bytes: 39250\n // History since boot:\n // ident=[[type=WIFI, subType=COMBINED, networkId=\"WiredSSID\"]] uid=-1 set=ALL tag=0x0\n // NetworkStatsHistory: bucketDuration=3600000\n // bucketStart=1478098800000 activeTime=31824 rxBytes=21502 rxPackets=78 txBytes=17748 txPackets=90 operations=0\n //\n // 7.1\n // Xt stats:\n // Pending bytes: 481487\n // History since boot:\n // ident=[{type=MOBILE, subType=COMBINED, subscriberId=310260..., metered=true}] uid=-1 set=ALL tag=0x0\n // NetworkStatsHistory: bucketDuration=3600\n // st=1483984800 rb=0 rp=0 tb=12031 tp=184 op=0\n // st=1483988400 rb=0 rp=0 tb=38476 tp=587 op=0\n // st=1483999200 rb=315616 rp=400 tb=94800 tp=362 op=0\n // st=1484002800 rb=15826 rp=20 tb=4738 tp=16 op=0\n //\n // the return data of real device\n // Xt stats:\n // Pending bytes: 0\n // History since boot:\n // ident=[{type=MOBILE, subType=COMBINED, subscriberId=450050...}] uid=-1 set=ALL tag=0x0\n // NetworkStatsHistory: bucketDuration=3600\n // st=1478088000 rb=32115296 rp=34291 tb=2956805 tp=25705 op=0\n // st=1478091600 rb=2714683 rp=11821 tb=1420564 tp=12650 op=0\n // st=1478095200 rb=10079213 rp=19962 tb=2487705 tp=20015 op=0\n // st=1478098800 rb=4444433 rp=10227 tb=1430356 tp=10493 op=0\n let index = 0;\n let fromXtstats = data.indexOf('Xt stats:');\n\n let start = data.indexOf('Pending bytes:', fromXtstats);\n let delimiter = data.indexOf(':', start + 1);\n let end = data.indexOf('\\n', delimiter + 1);\n let pendingBytes = data.substring(delimiter + 1, end).trim();\n\n if (end > delimiter) {\n start = data.indexOf('bucketDuration', end + 1);\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf('\\n', delimiter + 1);\n bucketDuration = data.substring(delimiter + 1, end).trim();\n }\n\n if (start >= 0) {\n data = data.substring(end + 1, data.length);\n let arrayList = data.split('\\n');\n\n if (arrayList.length > 0) {\n start = -1;\n\n for (let j = 0; j < NETWORK_KEYS.length; ++j) {\n start = arrayList[0].indexOf(NETWORK_KEYS[j][0]);\n\n if (start >= 0) {\n index = j;\n returnValue[0] = [];\n\n for (let k = 0; k < NETWORK_KEYS[j].length; ++k) {\n returnValue[0][k] = NETWORK_KEYS[j][k];\n }\n break;\n }\n }\n\n let returnIndex = 1;\n for (let i = 0; i < arrayList.length; i++) {\n data = arrayList[i];\n start = data.indexOf(NETWORK_KEYS[index][0]);\n\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n bucketStart = data.substring(delimiter + 1, end).trim();\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][1], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n activeTime = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][2], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n rxBytes = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][3], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n rxPackets = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][4], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n txBytes = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][5], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n txPackets = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][6], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.length;\n operations = data.substring(delimiter + 1, end).trim();\n\n }\n }\n returnValue[returnIndex++] = [bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations, bucketDuration];\n }\n }\n }\n }\n\n if (!_.isEqual(pendingBytes, '') && !_.isUndefined(pendingBytes) && !_.isEqual(pendingBytes, 'nodex')) {\n return returnValue;\n } else {\n throw new Error(`Unable to parse network traffic data: '${data}'`);\n }\n });\n};\n\nObject.assign(extensions, commands, helpers);\nexport {\n commands, helpers, SUPPORTED_PERFORMANCE_DATA_TYPES, CPU_KEYS, MEMORY_KEYS,\n BATTERY_KEYS, NETWORK_KEYS,\n};\nexport default extensions;\n\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"performance.js","names":["commands","helpers","extensions","NETWORK_KEYS","CPU_KEYS","BATTERY_KEYS","MEMORY_KEYS","SUPPORTED_PERFORMANCE_DATA_TYPES","Object","freeze","cpuinfo","memoryinfo","batteryinfo","networkinfo","MEMINFO_TITLES","NATIVE","DALVIK","EGL","GL","MTRACK","TOTAL","HEAP","RETRY_PAUSE_MS","parseMeminfoForApi19To29","entries","valDict","type","subType","nativePss","nativePrivateDirty","nativeHeapSize","nativeHeapAllocatedSize","dalvikPss","dalvikPrivateDirty","eglPss","eglPrivateDirty","glPss","glPrivateDirty","length","totalPss","totalPrivateDirty","parseMeminfoForApiBelow19","parseMeminfoForApiAbove29","nativeRss","dalvikRss","totalRss","getPerformanceDataTypes","_","keys","getPerformanceData","packageName","dataType","retries","toLower","getBatteryInfo","getCPUInfo","getMemoryInfo","getNetworkTrafficInfo","Error","JSON","stringify","retryInterval","output","adb","shell","e","stderr","log","info","usagesPattern","RegExp","escapeRegExp","match","exec","debug","cmd","data","power","parseInt","split","trim","Number","isNaN","clone","toString","apiLevel","getApiLevel","line","filter","Boolean","headers","values","map","header","returnValue","bucketDuration","bucketStart","activeTime","rxBytes","rxPackets","txBytes","txPackets","operations","index","fromXtstats","indexOf","start","delimiter","end","pendingBytes","substring","arrayList","j","k","returnIndex","i","isEqual","isUndefined","assign"],"sources":["../../../lib/commands/performance.js"],"sourcesContent":["import _ from 'lodash';\nimport { retryInterval } from 'asyncbox';\n\nconst commands = {}, helpers = {}, extensions = {};\n\nconst NETWORK_KEYS = [\n ['bucketStart', 'activeTime', 'rxBytes', 'rxPackets', 'txBytes', 'txPackets', 'operations', 'bucketDuration'],\n ['st', 'activeTime', 'rb', 'rp', 'tb', 'tp', 'op', 'bucketDuration']\n];\nconst CPU_KEYS = ['user', 'kernel'];\nconst BATTERY_KEYS = ['power'];\nconst MEMORY_KEYS = [\n 'totalPrivateDirty', 'nativePrivateDirty', 'dalvikPrivateDirty',\n 'eglPrivateDirty', 'glPrivateDirty',\n 'totalPss', 'nativePss', 'dalvikPss', 'eglPss', 'glPss',\n 'nativeHeapAllocatedSize', 'nativeHeapSize',\n 'nativeRss', 'dalvikRss', 'totalRss'\n];\nconst SUPPORTED_PERFORMANCE_DATA_TYPES = Object.freeze({\n cpuinfo: 'the amount of cpu by user and kernel process - cpu information for applications on real devices and simulators',\n memoryinfo: 'the amount of memory used by the process - memory information for applications on real devices and simulators',\n batteryinfo: 'the remaining battery power - battery power information for applications on real devices and simulators',\n networkinfo: 'the network statistics - network rx/tx information for applications on real devices and simulators'\n});\nconst MEMINFO_TITLES = Object.freeze({\n NATIVE: 'Native',\n DALVIK: 'Dalvik',\n EGL: 'EGL',\n GL: 'GL',\n MTRACK: 'mtrack',\n TOTAL: 'TOTAL',\n HEAP: 'Heap'\n});\nconst RETRY_PAUSE_MS = 1000;\n\n/**\n * API level between 18 and 30\n * ['<System Type>', '<Memory Type>', <pss total>, <private dirty>, <private clean>, <swapPss dirty>, <heap size>, <heap alloc>, <heap free>]\n * except 'TOTAL', which skips the second type name\n * !!! valDict gets mutated\n */\nfunction parseMeminfoForApi19To29 (entries, valDict) {\n const [type, subType] = entries;\n if (type === MEMINFO_TITLES.NATIVE && subType === MEMINFO_TITLES.HEAP) {\n [,, valDict.nativePss, valDict.nativePrivateDirty,,, valDict.nativeHeapSize, valDict.nativeHeapAllocatedSize] = entries;\n } else if (type === MEMINFO_TITLES.DALVIK && subType === MEMINFO_TITLES.HEAP) {\n [,, valDict.dalvikPss, valDict.dalvikPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.EGL && subType === MEMINFO_TITLES.MTRACK) {\n [,, valDict.eglPss, valDict.eglPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.GL && subType === MEMINFO_TITLES.MTRACK) {\n [,, valDict.glPss, valDict.glPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.TOTAL && entries.length === 8) {\n // there are two totals, and we only want the full listing, which has 8 entries\n [, valDict.totalPss, valDict.totalPrivateDirty] = entries;\n }\n}\n\n/**\n * ['<System Type', '<pps>', '<shared dirty>', '<private dirty>', '<heap size>', '<heap alloc>', '<heap free>']\n * !!! valDict gets mutated\n */\nfunction parseMeminfoForApiBelow19 (entries, valDict) {\n const type = entries[0];\n if (type === MEMINFO_TITLES.NATIVE) {\n [, valDict.nativePss,, valDict.nativePrivateDirty, valDict.nativeHeapSize, valDict.nativeHeapAllocatedSize] = entries;\n } else if (type === MEMINFO_TITLES.DALVIK) {\n [, valDict.dalvikPss,, valDict.dalvikPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.EGL) {\n [, valDict.eglPss,, valDict.eglPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.GL) {\n [, valDict.glPss,, valDict.glPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.TOTAL) {\n [, valDict.totalPss,, valDict.totalPrivateDirty] = entries;\n }\n}\n\n/**\n * API level 30 and above\n * ['<System Type>', '<Memory Type>', <pss total>, <private dirty>, <private clean>, <swapPss dirty>, <rss total>, <heap size>, <heap alloc>, <heap free>]\n * !!! valDict gets mutated\n */\nfunction parseMeminfoForApiAbove29 (entries, valDict) {\n const [type, subType] = entries;\n if (type === MEMINFO_TITLES.NATIVE && subType === MEMINFO_TITLES.HEAP) {\n [,, valDict.nativePss, valDict.nativePrivateDirty,,, valDict.nativeRss, valDict.nativeHeapSize, valDict.nativeHeapAllocatedSize] = entries;\n } else if (type === MEMINFO_TITLES.DALVIK && subType === MEMINFO_TITLES.HEAP) {\n [,, valDict.dalvikPss, valDict.dalvikPrivateDirty,,, valDict.dalvikRss] = entries;\n } else if (type === MEMINFO_TITLES.EGL && subType === MEMINFO_TITLES.MTRACK) {\n [,, valDict.eglPss, valDict.eglPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.GL && subType === MEMINFO_TITLES.MTRACK) {\n [,, valDict.glPss, valDict.glPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.TOTAL && entries.length === 9) {\n // has 9 entries\n [, valDict.totalPss, valDict.totalPrivateDirty,,, valDict.totalRss] = entries;\n }\n}\n\n//\n// returns the information type of the system state which is supported to read as like cpu, memory, network traffic, and battery.\n// output - array like below\n// [cpuinfo, batteryinfo, networkinfo, memoryinfo]\n//\ncommands.getPerformanceDataTypes = function getPerformanceDataTypes () {\n return _.keys(SUPPORTED_PERFORMANCE_DATA_TYPES);\n};\n\n/**\n * @returns The information type of the system state which is supported to read as like cpu, memory, network traffic, and battery.\n * input - (packageName) the package name of the application\n * (dataType) the type of system state which wants to read. It should be one of the keys of the SUPPORTED_PERFORMANCE_DATA_TYPES\n * (dataReadTimeout) the number of attempts to read\n * output - table of the performance data, The first line of the table represents the type of data. The remaining lines represent the values of the data.\n *\n * in case of battery info : [[power], [23]]\n * in case of memory info : [[totalPrivateDirty, nativePrivateDirty, dalvikPrivateDirty, eglPrivateDirty, glPrivateDirty, totalPss,\n * nativePss, dalvikPss, eglPss, glPss, nativeHeapAllocatedSize, nativeHeapSize], [18360, 8296, 6132, null, null, 42588, 8406, 7024, null, null, 26519, 10344]]\n * in case of network info : [[bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations, bucketDuration,],\n * [1478091600000, null, 1099075, 610947, 928, 114362, 769, 0, 3600000], [1478095200000, null, 1306300, 405997, 509, 46359, 370, 0, 3600000]]\n * in case of network info : [[st, activeTime, rb, rp, tb, tp, op, bucketDuration], [1478088000, null, null, 32115296, 34291, 2956805, 25705, 0, 3600],\n * [1478091600, null, null, 2714683, 11821, 1420564, 12650, 0, 3600], [1478095200, null, null, 10079213, 19962, 2487705, 20015, 0, 3600],\n * [1478098800, null, null, 4444433, 10227, 1430356, 10493, 0, 3600]]\n * in case of cpu info : [[user, kernel], [0.9, 1.3]]\n */\ncommands.getPerformanceData = async function getPerformanceData (packageName, dataType, retries = 2) {\n switch (_.toLower(dataType)) {\n case 'batteryinfo':\n return await this.getBatteryInfo(retries);\n case 'cpuinfo':\n return await this.getCPUInfo(packageName, retries);\n case 'memoryinfo':\n return await this.getMemoryInfo(packageName, retries);\n case 'networkinfo':\n return await this.getNetworkTrafficInfo(retries);\n default:\n throw new Error(`No performance data of type '${dataType}' found. ` +\n `Only the following values are supported: ${JSON.stringify(SUPPORTED_PERFORMANCE_DATA_TYPES, ' ', 2)}`);\n }\n};\n\nhelpers.getCPUInfo = async function getCPUInfo (packageName, retries = 2) {\n // TODO: figure out why this is\n // sometimes, the function of 'adb.shell' fails. when I tested this function on the target of 'Galaxy Note5',\n // adb.shell(dumpsys cpuinfo) returns cpu datas for other application packages, but I can't find the data for packageName.\n // It usually fails 30 times and success for the next time,\n // Since then, he has continued to succeed.\n return await retryInterval(retries, RETRY_PAUSE_MS, async () => {\n let output;\n try {\n output = await this.adb.shell(['dumpsys', 'cpuinfo']);\n } catch (e) {\n if (e.stderr) {\n this.log.info(e.stderr);\n }\n throw e;\n }\n // `output` will be something like\n // +0% 2209/io.appium.android.apis: 0.1% user + 0.2% kernel / faults: 70 minor\n const usagesPattern =\n new RegExp(`^.+\\\\/${_.escapeRegExp(packageName)}:\\\\D+([\\\\d.]+)%\\\\s+user\\\\s+\\\\+\\\\s+([\\\\d.]+)%\\\\s+kernel`, 'm');\n const match = usagesPattern.exec(output);\n if (!match) {\n this.log.debug(output);\n throw new Error(`Unable to parse cpu usage data for '${packageName}'. Check the server log for more details`);\n }\n return [CPU_KEYS, [match[1], match[2]]];\n });\n};\n\nhelpers.getBatteryInfo = async function getBatteryInfo (retries = 2) {\n return await retryInterval(retries, RETRY_PAUSE_MS, async () => {\n let cmd = ['dumpsys', 'battery', '|', 'grep', 'level'];\n let data = await this.adb.shell(cmd);\n if (!data) throw new Error('No data from dumpsys'); //eslint-disable-line curly\n\n let power = parseInt((data.split(':')[1] || '').trim(), 10);\n\n if (!Number.isNaN(power)) {\n return [_.clone(BATTERY_KEYS), [power.toString()]];\n } else {\n throw new Error(`Unable to parse battery data: '${data}'`);\n }\n });\n};\n\nhelpers.getMemoryInfo = async function getMemoryInfo (packageName, retries = 2) {\n return await retryInterval(retries, RETRY_PAUSE_MS, async () => {\n const cmd = [\n 'dumpsys', 'meminfo', `'${packageName}'`,\n '|', 'grep', '-E',\n `'${MEMINFO_TITLES.NATIVE}|${MEMINFO_TITLES.DALVIK}|${MEMINFO_TITLES.EGL}` +\n `|${MEMINFO_TITLES.GL}|${MEMINFO_TITLES.TOTAL}'`\n ];\n const data = await this.adb.shell(cmd);\n if (!data) {\n throw new Error('No data from dumpsys');\n }\n const valDict = {totalPrivateDirty: ''};\n const apiLevel = await this.adb.getApiLevel();\n for (const line of data.split('\\n')) {\n const entries = line.trim().split(/\\s+/).filter(Boolean);\n if (apiLevel >= 30) {\n parseMeminfoForApiAbove29(entries, valDict);\n } else if (apiLevel > 18 && apiLevel < 30) {\n parseMeminfoForApi19To29(entries, valDict);\n } else {\n parseMeminfoForApiBelow19(entries, valDict);\n }\n }\n if (valDict.totalPrivateDirty && valDict.totalPrivateDirty !== 'nodex') {\n const headers = _.clone(MEMORY_KEYS);\n const values = headers.map((header) => valDict[header]);\n return [headers, values];\n }\n\n throw new Error(`Unable to parse memory data: '${data}'`);\n });\n};\n\nhelpers.getNetworkTrafficInfo = async function getNetworkTrafficInfo (retries = 2) {\n return await retryInterval(retries, RETRY_PAUSE_MS, async () => {\n let returnValue = [];\n let bucketDuration, bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations;\n\n let cmd = ['dumpsys', 'netstats'];\n let data = await this.adb.shell(cmd);\n if (!data) throw new Error('No data from dumpsys'); //eslint-disable-line curly\n\n // In case of network traffic information, it is different for the return data between emulator and real device.\n // the return data of emulator\n // Xt stats:\n // Pending bytes: 39250\n // History since boot:\n // ident=[[type=WIFI, subType=COMBINED, networkId=\"WiredSSID\"]] uid=-1 set=ALL tag=0x0\n // NetworkStatsHistory: bucketDuration=3600000\n // bucketStart=1478098800000 activeTime=31824 rxBytes=21502 rxPackets=78 txBytes=17748 txPackets=90 operations=0\n //\n // 7.1\n // Xt stats:\n // Pending bytes: 481487\n // History since boot:\n // ident=[{type=MOBILE, subType=COMBINED, subscriberId=310260..., metered=true}] uid=-1 set=ALL tag=0x0\n // NetworkStatsHistory: bucketDuration=3600\n // st=1483984800 rb=0 rp=0 tb=12031 tp=184 op=0\n // st=1483988400 rb=0 rp=0 tb=38476 tp=587 op=0\n // st=1483999200 rb=315616 rp=400 tb=94800 tp=362 op=0\n // st=1484002800 rb=15826 rp=20 tb=4738 tp=16 op=0\n //\n // the return data of real device\n // Xt stats:\n // Pending bytes: 0\n // History since boot:\n // ident=[{type=MOBILE, subType=COMBINED, subscriberId=450050...}] uid=-1 set=ALL tag=0x0\n // NetworkStatsHistory: bucketDuration=3600\n // st=1478088000 rb=32115296 rp=34291 tb=2956805 tp=25705 op=0\n // st=1478091600 rb=2714683 rp=11821 tb=1420564 tp=12650 op=0\n // st=1478095200 rb=10079213 rp=19962 tb=2487705 tp=20015 op=0\n // st=1478098800 rb=4444433 rp=10227 tb=1430356 tp=10493 op=0\n let index = 0;\n let fromXtstats = data.indexOf('Xt stats:');\n\n let start = data.indexOf('Pending bytes:', fromXtstats);\n let delimiter = data.indexOf(':', start + 1);\n let end = data.indexOf('\\n', delimiter + 1);\n let pendingBytes = data.substring(delimiter + 1, end).trim();\n\n if (end > delimiter) {\n start = data.indexOf('bucketDuration', end + 1);\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf('\\n', delimiter + 1);\n bucketDuration = data.substring(delimiter + 1, end).trim();\n }\n\n if (start >= 0) {\n data = data.substring(end + 1, data.length);\n let arrayList = data.split('\\n');\n\n if (arrayList.length > 0) {\n start = -1;\n\n for (let j = 0; j < NETWORK_KEYS.length; ++j) {\n start = arrayList[0].indexOf(NETWORK_KEYS[j][0]);\n\n if (start >= 0) {\n index = j;\n returnValue[0] = [];\n\n for (let k = 0; k < NETWORK_KEYS[j].length; ++k) {\n returnValue[0][k] = NETWORK_KEYS[j][k];\n }\n break;\n }\n }\n\n let returnIndex = 1;\n for (let i = 0; i < arrayList.length; i++) {\n data = arrayList[i];\n start = data.indexOf(NETWORK_KEYS[index][0]);\n\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n bucketStart = data.substring(delimiter + 1, end).trim();\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][1], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n activeTime = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][2], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n rxBytes = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][3], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n rxPackets = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][4], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n txBytes = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][5], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n txPackets = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][6], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.length;\n operations = data.substring(delimiter + 1, end).trim();\n\n }\n }\n returnValue[returnIndex++] = [bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations, bucketDuration];\n }\n }\n }\n }\n\n if (!_.isEqual(pendingBytes, '') && !_.isUndefined(pendingBytes) && !_.isEqual(pendingBytes, 'nodex')) {\n return returnValue;\n } else {\n throw new Error(`Unable to parse network traffic data: '${data}'`);\n }\n });\n};\n\nObject.assign(extensions, commands, helpers);\nexport {\n commands, helpers, SUPPORTED_PERFORMANCE_DATA_TYPES, CPU_KEYS, MEMORY_KEYS,\n BATTERY_KEYS, NETWORK_KEYS,\n};\nexport default extensions;\n\n"],"mappings":"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"}
|