appium-adb 9.0.0 → 9.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -2
- package/build/lib/tools/aab-utils.js +157 -0
- package/build/lib/tools/apk-signing.js +9 -4
- package/build/lib/tools/apk-utils.js +4 -4
- package/build/lib/tools/apks-utils.js +5 -6
- package/build/lib/tools/index.js +4 -2
- package/lib/tools/aab-utils.js +158 -0
- package/lib/tools/apk-signing.js +3 -3
- package/lib/tools/apk-utils.js +5 -6
- package/lib/tools/apks-utils.js +5 -5
- package/lib/tools/index.js +2 -0
- package/package.json +6 -8
- package/lib/.DS_Store +0 -0
|
@@ -37,12 +37,13 @@ const APKS_CACHE = new _lruCache.default({
|
|
|
37
37
|
});
|
|
38
38
|
const APKS_CACHE_GUARD = new _asyncLock.default();
|
|
39
39
|
const BUNDLETOOL_TIMEOUT_MS = 4 * 60 * 1000;
|
|
40
|
+
const apksUtilsMethods = {};
|
|
40
41
|
process.on('exit', () => {
|
|
41
|
-
if (APKS_CACHE.
|
|
42
|
+
if (!APKS_CACHE.size) {
|
|
42
43
|
return;
|
|
43
44
|
}
|
|
44
45
|
|
|
45
|
-
const paths = APKS_CACHE.values();
|
|
46
|
+
const paths = [...APKS_CACHE.values()];
|
|
46
47
|
|
|
47
48
|
_logger.default.debug(`Performing cleanup of ${paths.length} cached .apks ` + _support.util.pluralize('package', paths.length));
|
|
48
49
|
|
|
@@ -92,8 +93,6 @@ async function extractFromApks(apks, dstPath) {
|
|
|
92
93
|
});
|
|
93
94
|
}
|
|
94
95
|
|
|
95
|
-
let apksUtilsMethods = {};
|
|
96
|
-
|
|
97
96
|
apksUtilsMethods.execBundletool = async function execBundletool(args, errorMsg) {
|
|
98
97
|
await this.initBundletool();
|
|
99
98
|
args = ['-jar', this.binaries.bundletool, ...args];
|
|
@@ -209,7 +208,7 @@ apksUtilsMethods.extractLanguageApk = async function extractLanguageApk(apks, la
|
|
|
209
208
|
return await this.extractBaseApk(apks);
|
|
210
209
|
};
|
|
211
210
|
|
|
212
|
-
apksUtilsMethods.isTestPackageOnlyError = function (output) {
|
|
211
|
+
apksUtilsMethods.isTestPackageOnlyError = function isTestPackageOnlyError(output) {
|
|
213
212
|
return /\[INSTALL_FAILED_TEST_ONLY\]/.test(output);
|
|
214
213
|
};
|
|
215
214
|
|
|
@@ -217,4 +216,4 @@ var _default = apksUtilsMethods;
|
|
|
217
216
|
exports.default = _default;require('source-map-support').install();
|
|
218
217
|
|
|
219
218
|
|
|
220
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9hcGtzLXV0aWxzLmpzIl0sIm5hbWVzIjpbIkJBU0VfQVBLIiwiTEFOR1VBR0VfQVBLIiwibGFuZyIsIkFQS1NfQ0FDSEUiLCJMUlUiLCJtYXgiLCJkaXNwb3NlIiwiYXBrc0hhc2giLCJleHRyYWN0ZWRGaWxlc1Jvb3QiLCJmcyIsInJpbXJhZiIsIkFQS1NfQ0FDSEVfR1VBUkQiLCJBc3luY0xvY2siLCJCVU5ETEVUT09MX1RJTUVPVVRfTVMiLCJwcm9jZXNzIiwib24iLCJpdGVtQ291bnQiLCJwYXRocyIsInZhbHVlcyIsImxvZyIsImRlYnVnIiwibGVuZ3RoIiwidXRpbCIsInBsdXJhbGl6ZSIsImFwcFBhdGgiLCJyaW1yYWZTeW5jIiwiZSIsIndhcm4iLCJtZXNzYWdlIiwiZXh0cmFjdEZyb21BcGtzIiwiYXBrcyIsImRzdFBhdGgiLCJfIiwiaXNBcnJheSIsImFjcXVpcmUiLCJoYXNoIiwiaGFzIiwicmVzdWx0UGF0aCIsInBhdGgiLCJyZXNvbHZlIiwiZ2V0IiwiZXhpc3RzIiwiZGVsIiwidG1wUm9vdCIsInRlbXBEaXIiLCJvcGVuRGlyIiwiRXJyb3IiLCJqb2luIiwic2VwIiwic2V0IiwiYXBrc1V0aWxzTWV0aG9kcyIsImV4ZWNCdW5kbGV0b29sIiwiYXJncyIsImVycm9yTXNnIiwiaW5pdEJ1bmRsZXRvb2wiLCJiaW5hcmllcyIsImJ1bmRsZXRvb2wiLCJlbnYiLCJhZGJQb3J0IiwiQU5EUk9JRF9BREJfU0VSVkVSX1BPUlQiLCJhZGJIb3N0IiwiQU5EUk9JRF9BREJfU0VSVkVSX0hPU1QiLCJKU09OIiwic3RyaW5naWZ5Iiwic3Rkb3V0IiwidGltZW91dCIsInRydW5jYXRlIiwic3RkZXJyIiwiZ2V0RGV2aWNlU3BlYyIsInNwZWNMb2NhdGlvbiIsImV4ZWN1dGFibGUiLCJjdXJEZXZpY2VJZCIsImluc3RhbGxNdWx0aXBsZUFwa3MiLCJhcGtQYXRoc1RvSW5zdGFsbCIsIm9wdGlvbnMiLCJpbnN0YWxsQXJncyIsImdldEFwaUxldmVsIiwiYWRiRXhlYyIsInRpbWVvdXRDYXBOYW1lIiwiaW5zdGFsbEFwa3MiLCJncmFudFBlcm1pc3Npb25zIiwiYWxsb3dUZXN0UGFja2FnZXMiLCJBUEtTX0lOU1RBTExfVElNRU9VVCIsInB1c2giLCJ0YXNrcyIsImJhc2VuYW1lIiwiZ2V0QXBrSW5mbyIsImFwa0luZm8iLCJCIiwiYWxsIiwiZ3JhbnRBbGxQZXJtaXNzaW9ucyIsIm5hbWUiLCJleHRyYWN0QmFzZUFwayIsImV4dHJhY3RMYW5ndWFnZUFwayIsImxhbmd1YWdlIiwiaW5mbyIsImRlZmF1bHRMYW5ndWFnZXMiLCJpZ24iLCJpc1Rlc3RQYWNrYWdlT25seUVycm9yIiwib3V0cHV0IiwidGVzdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFFQSxNQUFNQSxRQUFRLEdBQUcsaUJBQWpCOztBQUNBLE1BQU1DLFlBQVksR0FBSUMsSUFBRCxJQUFXLFFBQU9BLElBQUssTUFBNUM7O0FBQ0EsTUFBTUMsVUFBVSxHQUFHLElBQUlDLGlCQUFKLENBQVE7QUFDekJDLEVBQUFBLEdBQUcsRUFBRSxFQURvQjtBQUV6QkMsRUFBQUEsT0FBTyxFQUFFLENBQUNDLFFBQUQsRUFBV0Msa0JBQVgsS0FBa0NDLFlBQUdDLE1BQUgsQ0FBVUYsa0JBQVY7QUFGbEIsQ0FBUixDQUFuQjtBQUlBLE1BQU1HLGdCQUFnQixHQUFHLElBQUlDLGtCQUFKLEVBQXpCO0FBQ0EsTUFBTUMscUJBQXFCLEdBQUcsSUFBSSxFQUFKLEdBQVMsSUFBdkM7QUFFQUMsT0FBTyxDQUFDQyxFQUFSLENBQVcsTUFBWCxFQUFtQixNQUFNO0FBQ3ZCLE1BQUlaLFVBQVUsQ0FBQ2EsU0FBWCxLQUF5QixDQUE3QixFQUFnQztBQUM5QjtBQUNEOztBQUVELFFBQU1DLEtBQUssR0FBR2QsVUFBVSxDQUFDZSxNQUFYLEVBQWQ7O0FBQ0FDLGtCQUFJQyxLQUFKLENBQVcseUJBQXdCSCxL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LE1BQU05RixJQUFYLElBQW1COEYsZ0JBQW5CLEVBQXFDO0FBQ25DLFFBQUk7QUFDRixhQUFPLE1BQU1uRSxlQUFlLENBQUNDLElBQUQsRUFBTyxDQUFDLFFBQUQsRUFBVzdCLFlBQVksQ0FBQ0MsSUFBRCxDQUF2QixDQUFQLENBQTVCO0FBQ0QsS0FGRCxDQUVFLE9BQU8rRixHQUFQLEVBQVksQ0FBRTtBQUNqQjs7QUFFRDlFLGtCQUFJNEUsSUFBSixDQUFVLHVEQUFzRGpDLElBQUksQ0FBQ0MsU0FBTCxDQUFlaUMsZ0JBQWYsQ0FBaUMsSUFBeEYsR0FDTixpQ0FESDs7QUFFQSxTQUFPLE1BQU0sS0FBS0osY0FBTCxDQUFvQjlELElBQXBCLENBQWI7QUFDRCxDQXRCRDs7QUF3QkFvQixnQkFBZ0IsQ0FBQ2dELHNCQUFqQixHQUEwQyxVQUFVQyxNQUFWLEVBQWtCO0FBQzFELFNBQU8sK0JBQStCQyxJQUEvQixDQUFvQ0QsTUFBcEMsQ0FBUDtBQUNELENBRkQ7O2VBSWVqRCxnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IExSVSBmcm9tICdscnUtY2FjaGUnO1xuaW1wb3J0IHtcbiAgZ2V0SmF2YUZvck9zLCB1bnppcEZpbGUsIGJ1aWxkSW5zdGFsbEFyZ3MsIEFQS1NfSU5TVEFMTF9USU1FT1VUXG59IGZyb20gJy4uL2hlbHBlcnMuanMnO1xuaW1wb3J0IEFzeW5jTG9jayBmcm9tICdhc3luYy1sb2NrJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxuY29uc3QgQkFTRV9BUEsgPSAnYmFzZS1tYXN0ZXIuYXBrJztcbmNvbnN0IExBTkdVQUdFX0FQSyA9IChsYW5nKSA9PiBgYmFzZS0ke2xhbmd9LmFwa2A7XG5jb25zdCBBUEtTX0NBQ0hFID0gbmV3IExSVSh7XG4gIG1heDogMTAsXG4gIGRpc3Bvc2U6IChhcGtzSGFzaCwgZXh0cmFjdGVkRmlsZXNSb290KSA9PiBmcy5yaW1yYWYoZXh0cmFjdGVkRmlsZXNSb290KSxcbn0pO1xuY29uc3QgQVBLU19DQUNIRV9HVUFSRCA9IG5ldyBBc3luY0xvY2soKTtcbmNvbnN0IEJVTkRMRVRPT0xfVElNRU9VVF9NUyA9IDQgKiA2MCAqIDEwMDA7XG5cbnByb2Nlc3Mub24oJ2V4aXQnLCAoKSA9PiB7XG4gIGlmIChBUEtTX0NBQ0hFLml0ZW1Db3VudCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBhdGhzID0gQVBLU19DQUNIRS52YWx1ZXMoKTtcbiAgbG9nLmRlYnVnKGBQZXJmb3JtaW5nIGNsZWFudXAgb2YgJHtwYXRocy5sZW5ndGh9IGNhY2hlZCAuYXBrcyBgICtcbiAgICB1dGlsLnBsdXJhbGl6ZSgncGFja2FnZScsIHBhdGhzLmxlbmd0aCkpO1xuICBmb3IgKGNvbnN0IGFwcFBhdGggb2YgcGF0aHMpIHtcbiAgICB0cnkge1xuICAgICAgLy8gQXN5bmNocm9ub3VzIGNhbGxzIGFyZSBub3Qgc3VwcG9ydGVkIGluIG9uRXhpdCBoYW5kbGVyXG4gICAgICBmcy5yaW1yYWZTeW5jKGFwcFBhdGgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy53YXJuKGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG59KTtcblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgcGFydGljdWxhciBhcGtzIHBhY2thZ2UgaW50byBhIHRlbXBvcmFyeSBmb2xkZXIsXG4gKiBmaW5kcyBhbmQgcmV0dXJucyB0aGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlIGNvbnRhaW5lZCBpbiB0aGlzIGFway5cbiAqIFRoZSByZXN1bHRpbmcgdGVtcG9yYXJ5IHBhdGgsIHdoZXJlIHRoZSAuYXBrcyBmaWxlIGhhcyBiZWVuIGV4dHJhY3RlZCxcbiAqIHdpbGwgYmUgc3RvcmVkIGludG8gdGhlIGludGVybmFsIExSVSBjYWNoZSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGtzIC0gVGhlIGZ1bGwgcGF0aCB0byB0aGUgLmFwa3MgZmlsZVxuICogQHBhcmFtIHtzdHJpbmd8QXJyYXk8U3RyaW5nPn0gZHN0UGF0aCAtIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBkZXN0aW5hdGlvbiBmaWxlLFxuICogd2hpY2ggaXMgZ29pbmcgdG8gYmUgZXh0cmFjdGVkLCB3aGVyZSBlYWNoIHBhdGggY29tcG9uZW50IGlzIGFuIGFycmF5IGl0ZW1cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEZ1bGwgcGF0aCB0byB0aGUgZXh0cmFjdGVkIGZpbGVcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcmVxdWVzdGVkIGl0ZW0gZG9lcyBub3QgZXhpc3QgaW4gdGhlIGV4dHJhY3RlZCBhcmNoaXZlIG9yIHRoZSBwcm92aWRlc1xuICogYXBrcyBmaWxlIGlzIG5vdCBhIHZhbGlkIGJ1bmRsZVxuICovXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0RnJvbUFwa3MgKGFwa3MsIGRzdFBhdGgpIHtcbiAgaWYgKCFfLmlzQXJyYXkoZHN0UGF0aCkpIHtcbiAgICBkc3RQYXRoID0gW2RzdFBhdGhdO1xuICB9XG5cbiAgcmV0dXJuIGF3YWl0IEFQS1NfQ0FDSEVfR1VBUkQuYWNxdWlyZShhcGtzLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gSXQgbWlnaHQgYmUgdGhhdCB0aGUgb3JpZ2luYWwgZmlsZSBoYXMgYmVlbiByZXBsYWNlZCxcbiAgICAvLyBzbyB3ZSBuZWVkIHRvIGtlZXAgdGhlIGhhc2ggc3VtcyBpbnN0ZWFkIG9mIHRoZSBhY3R1YWwgZmlsZSBwYXRoc1xuICAgIC8vIGFzIGNhY2hpbmcga2V5c1xuICAgIGNvbnN0IGFwa3NIYXNoID0gYXdhaXQgZnMuaGFzaChhcGtzKTtcbiAgICBsb2cuZGVidWcoYENhbGN1bGF0ZWQgJyR7YXBrc30nIGhhc2g6ICR7YXBrc0hhc2h9YCk7XG5cbiAgICBpZiAoQVBLU19DQUNIRS5oYXMoYXBrc0hhc2gpKSB7XG4gICAgICBjb25zdCByZXN1bHRQYXRoID0gcGF0aC5yZXNvbHZlKEFQS1NfQ0FDSEUuZ2V0KGFwa3NIYXNoKSwgLi4uZHN0UGF0aCk7XG4gICAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKHJlc3VsdFBhdGgpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHRQYXRoO1xuICAgICAgfVxuICAgICAgQVBLU19DQUNIRS5kZWwoYXBrc0hhc2gpO1xuICAgIH1cblxuICAgIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICBsb2cuZGVidWcoYFVucGFja2luZyBhcHBsaWNhdGlvbiBidW5kbGUgYXQgJyR7YXBrc30nIHRvICcke3RtcFJvb3R9J2ApO1xuICAgIGF3YWl0IHVuemlwRmlsZShhcGtzLCB0bXBSb290KTtcbiAgICBjb25zdCByZXN1bHRQYXRoID0gcGF0aC5yZXNvbHZlKHRtcFJvb3QsIC4uLmRzdFBhdGgpO1xuICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKHJlc3VsdFBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZHN0UGF0aC5qb2luKHBhdGguc2VwKX0gY2Fubm90IGJlIGZvdW5kIGluICcke2Fwa3N9JyBidW5kbGUuIGAgK1xuICAgICAgICBgRG9lcyB0aGUgYXJjaGl2ZSBjb250YWluIGEgdmFsaWQgYXBwbGljYXRpb24gYnVuZGxlP2ApO1xuICAgIH1cbiAgICBBUEtTX0NBQ0hFLnNldChhcGtzSGFzaCwgdG1wUm9vdCk7XG4gICAgcmV0dXJuIHJlc3VsdFBhdGg7XG4gIH0pO1xufVxuXG5sZXQgYXBrc1V0aWxzTWV0aG9kcyA9IHt9O1xuXG4vKipcbiAqIEV4ZWN1dGVzIGJ1bmRsZXRvb2wgdXRpbGl0eSB3aXRoIGdpdmVuIGFyZ3VtZW50cyBhbmQgcmV0dXJucyB0aGUgYWN0dWFsIHN0ZG91dFxuICpcbiAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0gYXJncyAtIHRoZSBsaXN0IG9mIGJ1bmRsZXRvb2wgYXJndW1lbnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gZXJyb3JNc2cgLSBUaGUgY3VzdG9taXplZCBlcnJvciBtZXNzYWdlIHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gdGhlIGFjdHVhbCBjb21tYW5kIHN0ZG91dFxuICogQHRocm93cyB7RXJyb3J9IElmIGJ1bmRsZXRvb2wgamFyIGRvZXMgbm90IGV4aXN0IGluIFBBVEggb3IgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlXG4gKiBleGVjdXRpbmcgaXRcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5leGVjQnVuZGxldG9vbCA9IGFzeW5jIGZ1bmN0aW9uIGV4ZWNCdW5kbGV0b29sIChhcmdzLCBlcnJvck1zZykge1xuICBhd2FpdCB0aGlzLmluaXRCdW5kbGV0b29sKCk7XG4gIGFyZ3MgPSBbXG4gICAgJy1qYXInLCB0aGlzLmJpbmFyaWVzLmJ1bmRsZXRvb2wsXG4gICAgLi4uYXJnc1xuICBdO1xuICBjb25zdCBlbnYgPSBwcm9jZXNzLmVudjtcbiAgaWYgKHRoaXMuYWRiUG9ydCkge1xuICAgIGVudi5BTkRST0lEX0FEQl9TRVJWRVJfUE9SVCA9IGAke3RoaXMuYWRiUG9ydH1gO1xuICB9XG4gIGlmICh0aGlzLmFkYkhvc3QpIHtcbiAgICBlbnYuQU5EUk9JRF9BREJfU0VSVkVSX0hPU1QgPSB0aGlzLmFkYkhvc3Q7XG4gIH1cbiAgbG9nLmRlYnVnKGBFeGVjdXRpbmcgYnVuZGxldG9vbCB3aXRoIGFyZ3VtZW50czogJHtKU09OLnN0cmluZ2lmeShhcmdzKX1gKTtcbiAgbGV0IHN0ZG91dDtcbiAgdHJ5IHtcbiAgICAoe3N0ZG91dH0gPSBhd2FpdCBleGVjKGF3YWl0IGdldEphdmFGb3JPcygpLCBhcmdzLCB7XG4gICAgICBlbnYsXG4gICAgICB0aW1lb3V0OiBCVU5ETEVUT09MX1RJTUVPVVRfTVMsXG4gICAgfSkpO1xuICAgIGxvZy5kZWJ1ZyhgQ29tbWFuZCBzdGRvdXQ6ICR7Xy50cnVuY2F0ZShzdGRvdXQsIHtsZW5ndGg6IDMwMH0pfWApO1xuICAgIHJldHVybiBzdGRvdXQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZS5zdGRvdXQpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgQ29tbWFuZCBzdGRvdXQ6ICR7ZS5zdGRvdXR9YCk7XG4gICAgfVxuICAgIGlmIChlLnN0ZGVycikge1xuICAgICAgbG9nLmRlYnVnKGBDb21tYW5kIHN0ZGVycjogJHtlLnN0ZGVycn1gKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2Vycm9yTXNnfS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcGVjTG9jYXRpb24gLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBnZW5lcmF0ZWQgZGV2aWNlIHNwZWMgbG9jYXRpb25cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzYW1lIGBzcGVjTG9jYXRpb25gIHZhbHVlXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIHRoZSBzcGVjIGZvciB0aGUgY3VycmVudCBkZXZpY2VcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5nZXREZXZpY2VTcGVjID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlU3BlYyAoc3BlY0xvY2F0aW9uKSB7XG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgJ2dldC1kZXZpY2Utc3BlYycsXG4gICAgJy0tYWRiJywgdGhpcy5leGVjdXRhYmxlLnBhdGgsXG4gICAgJy0tZGV2aWNlLWlkJywgdGhpcy5jdXJEZXZpY2VJZCxcbiAgICAnLS1vdXRwdXQnLCBzcGVjTG9jYXRpb24sXG4gIF07XG4gIGxvZy5kZWJ1ZyhgR2V0dGluZyB0aGUgc3BlYyBmb3IgdGhlIGRldmljZSAnJHt0aGlzLmN1ckRldmljZUlkfSdgKTtcbiAgYXdhaXQgdGhpcy5leGVjQnVuZGxldG9vbChhcmdzLCAnQ2Fubm90IHJldHJpZXZlIHRoZSBkZXZpY2Ugc3BlYycpO1xuICByZXR1cm4gc3BlY0xvY2F0aW9uO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsTXVsdGlwbGVBcGtzT3B0aW9uc1xuICogQHByb3BlcnR5IHs/bnVtYmVyfHN0cmluZ30gdGltZW91dCBbMjAwMDBdIC0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbFxuICogdGhlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aW1lb3V0Q2FwTmFtZSBbYW5kcm9pZEluc3RhbGxUaW1lb3V0XSAtIFRoZSB0aW1lb3V0IG9wdGlvbiBuYW1lXG4gKiB1c2VycyBjYW4gaW5jcmVhc2UgdGhlIHRpbWVvdXQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93VGVzdFBhY2thZ2VzIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBhbGxvdyB0ZXN0XG4gKiBwYWNrYWdlcyBpbnN0YWxsYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVNkY2FyZCBbZmFsc2VdIC0gU2V0IHRvIHRydWUgdG8gaW5zdGFsbCB0aGUgYXBwIG9uIHNkY2FyZFxuICogaW5zdGVhZCBvZiB0aGUgZGV2aWNlIG1lbW9yeS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ3JhbnRQZXJtaXNzaW9ucyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gZ3JhbnQgYWxsIHRoZVxuICogcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvblxuICogaXMgY29tcGxldGVkIHVuZGVyIEFuZHJvaWQgNisuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHBhcnRpYWxJbnN0YWxsIFtmYWxzZV0gLSBJbnN0YWxsIGFwa3MgcGFydGlhbGx5LiBJdCBpcyB1c2VkIGZvciAnaW5zdGFsbC1tdWx0aXBsZScuXG4gKiBodHRwczovL2FuZHJvaWQuc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzExMTA2NC93aGF0LWlzLWEtcGFydGlhbC1hcHBsaWNhdGlvbi1pbnN0YWxsLXZpYS1hZGJcbiAqL1xuXG4vKipcbiAqIEluc3RhbGxzIHRoZSBnaXZlbiBhcGtzIGludG8gdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBhcGtQYXRoc1RvSW5zdGFsbCAtIFRoZSBmdWxsIHBhdGhzIHRvIGluc3RhbGwgYXBrc1xuICogQHBhcmFtIHs/aW5zdGFsbE11bHRpcGxlQXBrc09wdGlvbnN9IG9wdGlvbnMgLSBJbnN0YWxsYXRpb24gb3B0aW9uc1xuICovXG5hcGtzVXRpbHNNZXRob2RzLmluc3RhbGxNdWx0aXBsZUFwa3MgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsTXVsdGlwbGVBcGtzIChhcGtQYXRoc1RvSW5zdGFsbCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGluc3RhbGxBcmdzID0gYnVpbGRJbnN0YWxsQXJncyhhd2FpdCB0aGlzLmdldEFwaUxldmVsKCksIG9wdGlvbnMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGJFeGVjKFsnaW5zdGFsbC1tdWx0aXBsZScsIC4uLmluc3RhbGxBcmdzLCAuLi5hcGtQYXRoc1RvSW5zdGFsbF0sIHtcbiAgICB0aW1lb3V0OiBvcHRpb25zLnRpbWVvdXQsXG4gICAgdGltZW91dENhcE5hbWU6IG9wdGlvbnMudGltZW91dENhcE5hbWUsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsQXBrc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P251bWJlcnxzdHJpbmd9IHRpbWVvdXQgWzEyMDAwMF0gLSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsXG4gKiB0aGUgaW5zdGFsbGF0aW9uIGlzIGNvbXBsZXRlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpbWVvdXRDYXBOYW1lIFthbmRyb2lkSW5zdGFsbFRpbWVvdXRdIC0gVGhlIHRpbWVvdXQgb3B0aW9uIG5hbWVcbiAqIHVzZXJzIGNhbiBpbmNyZWFzZSB0aGUgdGltZW91dC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYWxsb3dUZXN0UGFja2FnZXMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGFsbG93IHRlc3RcbiAqIHBhY2thZ2VzIGluc3RhbGxhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ3JhbnRQZXJtaXNzaW9ucyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gZ3JhbnQgYWxsIHRoZVxuICogcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvblxuICogaXMgY29tcGxldGVkIHVuZGVyIEFuZHJvaWQgNisuXG4gKi9cblxuLyoqXG4gKiBJbnN0YWxscyB0aGUgZ2l2ZW4gLmFwa3MgcGFja2FnZSBpbnRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGtzIC0gVGhlIGZ1bGwgcGF0aCB0byB0aGUgLmFwa3MgZmlsZVxuICogQHBhcmFtIHs/SW5zdGFsbEFwa3NPcHRpb25zfSBvcHRpb25zIC0gSW5zdGFsbGF0aW9uIG9wdGlvbnNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgLmFwa3MgYnVuZGxlIGNhbm5vdCBiZSBpbnN0YWxsZWRcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5pbnN0YWxsQXBrcyA9IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBcGtzIChhcGtzLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGdyYW50UGVybWlzc2lvbnMsXG4gICAgYWxsb3dUZXN0UGFja2FnZXMsXG4gICAgdGltZW91dCxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgYXJncyA9IFtcbiAgICAnaW5zdGFsbC1hcGtzJyxcbiAgICAnLS1hZGInLCB0aGlzLmV4ZWN1dGFibGUucGF0aCxcbiAgICAnLS1hcGtzJywgYXBrcyxcbiAgICAnLS10aW1lb3V0LW1pbGxpcycsIHRpbWVvdXQgfHwgQVBLU19JTlNUQUxMX1RJTUVPVVQsXG4gICAgJy0tZGV2aWNlLWlkJywgdGhpcy5jdXJEZXZpY2VJZCxcbiAgXTtcbiAgaWYgKGFsbG93VGVzdFBhY2thZ2VzKSB7XG4gICAgYXJncy5wdXNoKCctLWFsbG93LXRlc3Qtb25seScpO1xuICB9XG4gIGNvbnN0IHRhc2tzID0gW1xuICAgIHRoaXMuZXhlY0J1bmRsZXRvb2woYXJncywgYENhbm5vdCBpbnN0YWxsICcke3BhdGguYmFzZW5hbWUoYXBrcyl9JyB0byB0aGUgZGV2aWNlICR7dGhpcy5jdXJEZXZpY2VJZH1gKVxuICBdO1xuICBpZiAoZ3JhbnRQZXJtaXNzaW9ucykge1xuICAgIHRhc2tzLnB1c2godGhpcy5nZXRBcGtJbmZvKGFwa3MpKTtcbiAgfVxuICBjb25zdCBbLCBhcGtJbmZvXSA9IGF3YWl0IEIuYWxsKHRhc2tzKTtcbiAgaWYgKGdyYW50UGVybWlzc2lvbnMgJiYgYXBrSW5mbykge1xuICAgIC8vIFRPRE86IFNpbXBsaWZ5IGl0IGFmdGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvYnVuZGxldG9vbC9pc3N1ZXMvMjQ2IGlzIGltcGxlbWVudGVkXG4gICAgYXdhaXQgdGhpcy5ncmFudEFsbFBlcm1pc3Npb25zKGFwa0luZm8ubmFtZSk7XG4gIH1cbn07XG5cbi8qKlxuICogRXh0cmFjdHMgYW5kIHJldHVybnMgdGhlIGZ1bGwgcGF0aCB0byB0aGUgbWFzdGVyIC5hcGsgZmlsZSBpbnNpZGUgdGhlIGJ1bmRsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBrcyAtIFRoZSBmdWxsIHBhdGggdG8gdGhlIC5hcGtzIGZpbGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmdWxsIHBhdGggdG8gdGhlIG1hc3RlciBidW5kbGUgLmFwa1xuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBleHRyYWN0aW5nL2ZpbmRpbmcgdGhlIGZpbGVcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5leHRyYWN0QmFzZUFwayA9IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RCYXNlQXBrIChhcGtzKSB7XG4gIHJldHVybiBhd2FpdCBleHRyYWN0RnJvbUFwa3MoYXBrcywgWydzcGxpdHMnLCBCQVNFX0FQS10pO1xufTtcblxuLyoqXG4gKiBFeHRyYWN0cyBhbmQgcmV0dXJucyB0aGUgZnVsbCBwYXRoIHRvIHRoZSAuYXBrLCB3aGljaCBjb250YWlucyB0aGUgY29ycmVzcG9uZGluZ1xuICogcmVzb3VyY2VzIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgaW4gdGhlIC5hcGtzIGJ1bmRsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBrcyAtIFRoZSBmdWxsIHBhdGggdG8gdGhlIC5hcGtzIGZpbGVcbiAqIEBwYXJhbSB7P3N0cmluZ30gbGFuZ3VhZ2UgLSBUaGUgbGFuZ3VhZ2UgYWJicmV2aWF0aW9uLiBUaGUgZGVmYXVsdCBsYW5ndWFnZSBpc1xuICogZ29pbmcgdG8gYmUgc2VsZWN0ZWQgaWYgaXQgaXMgbm90IHNldC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmdWxsIHBhdGggdG8gdGhlIGNvcnJlc3BvbmRpbmcgbGFuZ3VhZ2UgLmFwayBvciB0aGUgbWFzdGVyIC5hcGtcbiAqIGlmIGxhbmd1YWdlIHNwbGl0IGlzIG5vdCBlbmFibGVkIGZvciB0aGUgYnVuZGxlLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBleHRyYWN0aW5nL2ZpbmRpbmcgdGhlIGZpbGVcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5leHRyYWN0TGFuZ3VhZ2VBcGsgPSBhc3luYyBmdW5jdGlvbiBleHRyYWN0TGFuZ3VhZ2VBcGsgKGFwa3MsIGxhbmd1YWdlID0gbnVsbCkge1xuICBpZiAobGFuZ3VhZ2UpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGV4dHJhY3RGcm9tQXBrcyhhcGtzLCBbJ3NwbGl0cycsIExBTkdVQUdFX0FQSyhsYW5ndWFnZSldKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZGVidWcoZS5tZXNzYWdlKTtcbiAgICAgIGxvZy5pbmZvKGBBc3N1bWluZyB0aGF0IHNwbGl0dGluZyBieSBsYW5ndWFnZSBpcyBub3QgZW5hYmxlZCBmb3IgdGhlICcke2Fwa3N9JyBidW5kbGUgYCArXG4gICAgICAgIGBhbmQgcmV0dXJuaW5nIHRoZSBtYWluIGFwayBpbnN0ZWFkYCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRyYWN0QmFzZUFwayhhcGtzKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZWZhdWx0TGFuZ3VhZ2VzID0gWydlbicsICdlbl91cyddO1xuICBmb3IgKGNvbnN0IGxhbmcgb2YgZGVmYXVsdExhbmd1YWdlcykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZXh0cmFjdEZyb21BcGtzKGFwa3MsIFsnc3BsaXRzJywgTEFOR1VBR0VfQVBLKGxhbmcpXSk7XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICB9XG5cbiAgbG9nLmluZm8oYENhbm5vdCBmaW5kIGFueSBzcGxpdCBhcGsgZm9yIHRoZSBkZWZhdWx0IGxhbmd1YWdlcyAke0pTT04uc3RyaW5naWZ5KGRlZmF1bHRMYW5ndWFnZXMpfS4gYCArXG4gICAgYFJldHVybmluZyB0aGUgbWFpbiBhcGsgaW5zdGVhZC5gKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0cmFjdEJhc2VBcGsoYXBrcyk7XG59O1xuXG5hcGtzVXRpbHNNZXRob2RzLmlzVGVzdFBhY2thZ2VPbmx5RXJyb3IgPSBmdW5jdGlvbiAob3V0cHV0KSB7XG4gIHJldHVybiAvXFxbSU5TVEFMTF9GQUlMRURfVEVTVF9PTkxZXFxdLy50ZXN0KG91dHB1dCk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBhcGtzVXRpbHNNZXRob2RzO1xuIl0sImZpbGUiOiJsaWIvdG9vbHMvYXBrcy11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|
|
219
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9hcGtzLXV0aWxzLmpzIl0sIm5hbWVzIjpbIkJBU0VfQVBLIiwiTEFOR1VBR0VfQVBLIiwibGFuZyIsIkFQS1NfQ0FDSEUiLCJMUlUiLCJtYXgiLCJkaXNwb3NlIiwiYXBrc0hhc2giLCJleHRyYWN0ZWRGaWxlc1Jvb3QiLCJmcyIsInJpbXJhZiIsIkFQS1NfQ0FDSEVfR1VBUkQiLCJBc3luY0xvY2siLCJCVU5ETEVUT09MX1RJTUVPVVRfTVMiLCJhcGtzVXRpbHNNZXRob2RzIiwicHJvY2VzcyIsIm9uIiwic2l6ZSIsInBhdGhzIiwidmFsdWVzIiwibG9nIiwiZGVidWciLCJsZW5ndGgiLCJ1dGlsIiwicGx1cmFsaXplIiwiYXBwUGF0aCIsInJpbXJhZlN5bmMiLCJlIiwid2FybiIsIm1lc3NhZ2UiLCJleHRyYWN0RnJvbUFwa3MiLCJhcGtzIiwiZHN0UGF0aCIsIl8iLCJpc0FycmF5IiwiYWNxdWlyZSIsImhhc2giLCJoYXMiLCJyZXN1bHRQYXRoIiwicGF0aCIsInJlc29sdmUiLCJnZXQiLCJleGlzdHMiLCJkZWwiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJFcnJvciIsImpvaW4iLCJzZXAiLCJzZXQiLCJleGVjQnVuZGxldG9vbCIsImFyZ3MiLCJlcnJvck1zZyIsImluaXRCdW5kbGV0b29sIiwiYmluYXJpZXMiLCJidW5kbGV0b29sIiwiZW52IiwiYWRiUG9ydCIsIkFORFJPSURfQURCX1NFUlZFUl9QT1JUIiwiYWRiSG9zdCIsIkFORFJPSURfQURCX1NFUlZFUl9IT1NUIiwiSlNPTiIsInN0cmluZ2lmeSIsInN0ZG91dCIsInRpbWVvdXQiLCJ0cnVuY2F0ZSIsInN0ZGVyciIsImdldERldmljZVNwZWMiLCJzcGVjTG9jYXRpb24iLCJleGVjdXRhYmxlIiwiY3VyRGV2aWNlSWQiLCJpbnN0YWxsTXVsdGlwbGVBcGtzIiwiYXBrUGF0aHNUb0luc3RhbGwiLCJvcHRpb25zIiwiaW5zdGFsbEFyZ3MiLCJnZXRBcGlMZXZlbCIsImFkYkV4ZWMiLCJ0aW1lb3V0Q2FwTmFtZSIsImluc3RhbGxBcGtzIiwiZ3JhbnRQZXJtaXNzaW9ucyIsImFsbG93VGVzdFBhY2thZ2VzIiwiQVBLU19JTlNUQUxMX1RJTUVPVVQiLCJwdXNoIiwidGFza3MiLCJiYXNlbmFtZSIsImdldEFwa0luZm8iLCJhcGtJbmZvIiwiQiIsImFsbCIsImdyYW50QWxsUGVybWlzc2lvbnMiLCJuYW1lIiwiZXh0cmFjdEJhc2VBcGsiLCJleHRyYWN0TGFuZ3VhZ2VBcGsiLCJsYW5ndWFnZSIsImluZm8iLCJkZWZhdWx0TGFuZ3VhZ2VzIiwiaWduIiwiaXNUZXN0UGFja2FnZU9ubHlFcnJvciIsIm91dHB1dCIsInRlc3QiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0E7O0FBQ0E7O0FBRUEsTUFBTUEsUUFBUSxHQUFHLGlCQUFqQjs7QUFDQSxNQUFNQyxZQUFZLEdBQUlDLElBQUQsSUFBVyxRQUFPQSxJQUFLLE1BQTVDOztBQUNBLE1BQU1DLFVBQVUsR0FBRyxJQUFJQyxpQkFBSixDQUFRO0FBQ3pCQyxFQUFBQSxHQUFHLEVBQUUsRUFEb0I7QUFFekJDLEVBQUFBLE9BQU8sRUFBRSxDQUFDQyxRQUFELEVBQVdDLGtCQUFYLEtBQWtDQyxZQUFHQyxNQUFILENBQVVGLGtCQUFWO0FBRmxCLENBQVIsQ0FBbkI7QUFJQSxNQUFNRyxnQkFBZ0IsR0FBRyxJQUFJQyxrQkFBSixFQUF6QjtBQUNBLE1BQU1DLHFCQUFxQixHQUFHLElBQUksRUFBSixHQUFTLElBQXZDO0FBRUEsTUFBTUMsZ0JBQWdCLEdBQUcsRUFBekI7QUFFQUMsT0FBTyxDQUFDQyxFQUFSLENBQVcsTUFBWCxFQUFtQixNQUFNO0FBQ3ZCLE1BQUksQ0FBQ2IsVUFBVSxDQUFDYyxJQUFoQixFQUFzQjtBQUNwQjtBQUNEOztBQUVELFFBQU1DLEtBQUssR0FBRyxDQUFDLEdBQUdmLFVBQVUsQ0FBQ2dCLE1BQVgsRUFBSixDQUFkOztBQUNBQyxrQkFBSUMsS0FBSixDQUFXLHlCQUF3QkgsS0FBSyxDQUFDSSxNQUFPLGdCQUF0QyxHQUNSQyxjQUFLQyxTQUFMLENBQWUsU0FBZixFQUEwQk4sS0FBSyxDQUFDSSxNQUFoQyxDQURGOztBQUVBLE9BQUssTUFBTUcsT0FBWCxJQUFzQlAsS0FBdEIsRUFBNkI7QUFDM0IsUUFBSTtBQUVGVCxrQkFBR2lCLFVBQUgsQ0FBY0QsT0FBZDtBQUNELEtBSEQsQ0FHRSxPQUFPRSxDQUFQLEVBQVU7QUFDVlAsc0JBQUlRLElBQUosQ0FBU0QsQ0FBQyxDQUFDRSxPQUFYO0FBQ0Q7QUFDRjtBQUNGLENBaEJEOztBQStCQSxlQUFlQyxlQUFmLENBQWdDQyxJQUFoQyxFQUFzQ0MsT0FBdEMsRUFBK0M7QUFDN0MsTUFBSSxDQUFDQyxnQkFBRUMsT0FBRixDQUFVRixPQUFWLENBQUwsRUFBeUI7QUFDdkJBLElBQUFBLE9BQU8sR0FBRyxDQUFDQSxPQUFELENBQVY7QUFDRDs7QUFFRCxTQUFPLE1BQU1yQixnQkFBZ0IsQ0FBQ3dCLE9BQWpCLENBQXlCSixJQUF6QixFQUErQixZQUFZO0FBSXRELFVBQU14QixRQUFRLEdBQUcsTUFBTUUsWUFBRzJCLElBQUgsQ0FBUUwsSUFBUixDQUF2Qjs7QUFDQVgsb0JBQUlDLEtBQUosQ0FBVyxlQUFjVSxJQUFLLFdBQVV4QixRQUFTLEVBQWpEOztBQUVBLFFBQUlKLFVBQVUsQ0FBQ2tDLEdBQVgsQ0FBZTlCLFFBQWYsQ0FBSixFQUE4QjtBQUM1QixZQUFNK0IsVUFBVSxHQUFHQyxjQUFLQyxPQUFMLENBQWFyQyxVQUFVLENBQUNzQyxHQUFYLENBQWVsQyxRQUFmLENBQWIsRUFBdUMsR0FBR3lCLE9BQTFDLENBQW5COztBQUNBLFVBQUksTUFBTXZCLFlBQUdpQyxNQUFILENBQVVKLFVBQVYsQ0FBVixFQUFpQztBQUMvQixlQUFPQSxVQUFQO0FBQ0Q7O0FBQ0RuQyxNQUFBQSxVQUFVLENBQUN3QyxHQUFYLENBQWVwQyxRQUFmO0FBQ0Q7O0FBRUQsVUFBTXFDLE9BQU8sR0FBRyxNQUFNQyxpQkFBUUMsT0FBUixFQUF0Qjs7QUFDQTFCLG9CQUFJQyxLQUFKLENBQVcsb0NBQW1DVSxJQUFLLFNBQVFhLE9BQVEsR0FBbkU7O0FBQ0EsVUFBTSx3QkFBVWIsSUFBVixFQUFnQmEsT0FBaEIsQ0FBTjs7QUFDQSxVQUFNTixVQUFVLEdBQUdDLGNBQUtDLE9BQUwsQ0FBYUksT0FBYixFQUFzQixHQUFHWixPQUF6QixDQUFuQjs7QUFDQSxRQUFJLEVBQUMsTUFBTXZCLFlBQUdpQyxNQUFILENBQVVKLFVBQVYsQ0FBUCxDQUFKLEVBQWtDO0FBQ2hDLFlBQU0sSUFBSVMsS0FBSixDQUFXLEdBQUVmLE9BQU8sQ0FBQ2dCLElBQVIsQ0FBYVQsY0FBS1UsR0FBbEIsQ0FBdUIsd0JBQXVCbEIsSUFBSyxZQUF0RCxHQUNiLHNEQURHLENBQU47QUFFRDs7QUFDRDVCLElBQUFBLFVBQVUsQ0FBQytDLEdBQVgsQ0FBZTNDLFFBQWYsRUFBeUJxQyxPQUF6QjtBQUNBLFdBQU9OLFVBQVA7QUFDRCxHQXpCWSxDQUFiO0FBMEJEOztBQVdEeEIsZ0JBQWdCLENBQUNxQyxjQUFqQixHQUFrQyxlQUFlQSxjQUFmLENBQStCQyxJQUEvQixFQUFxQ0MsUUFBckMsRUFBK0M7QUFDL0UsUUFBTSxLQUFLQyxjQUFMLEVBQU47QUFDQUYsRUFBQUEsSUFBSSxHQUFHLENBQ0wsTUFESyxFQUNHLEtBQUtHLFFBQUwsQ0FBY0MsVUFEakIsRUFFTCxHQUFHSixJQUZFLENBQVA7QUFJQSxRQUFNSyxHQUFHLEdBQUcxQyxPQUFPLENBQUMwQyxHQUFwQjs7QUFDQSxNQUFJLEtBQUtDLE9BQVQsRUFBa0I7QUFDaEJELElBQUFBLEdBQUcsQ0FBQ0UsdUJBQUosR0FBK0IsR0FBRSxLQUFLRCxPQUFRLEVBQTlDO0FBQ0Q7O0FBQ0QsTUFBSSxLQUFLRSxPQUFULEVBQWtCO0FBQ2hCSCxJQUFBQSxHQUFHLENBQUNJLHVCQUFKLEdBQThCLEtBQUtELE9BQW5DO0FBQ0Q7O0FBQ0R4QyxrQkFBSUMsS0FBSixDQUFXLHdDQUF1Q3lDLElBQUksQ0FBQ0MsU0FBTCxDQUFlWCxJQUFmLENBQXFCLEVBQXZFOztBQUNBLE1BQUlZLE1BQUo7O0FBQ0EsTUFBSTtBQUNGLEtBQUM7QUFBQ0EsTUFBQUE7QUFBRCxRQUFXLE1BQU0sd0JBQUssTUFBTSw0QkFBWCxFQUEyQlosSUFBM0IsRUFBaUM7QUFDakRLLE1BQUFBLEdBRGlEO0FBRWpEUSxNQUFBQSxPQUFPLEVBQUVwRDtBQUZ3QyxLQUFqQyxDQUFsQjs7QUFJQU8sb0JBQUlDLEtBQUosQ0FBVyxtQkFBa0JZLGdCQUFFaUMsUUFBRixDQUFXRixNQUFYLEVBQW1CO0FBQUMxQyxNQUFBQSxNQUFNLEVBQUU7QUFBVCxLQUFuQixDQUFrQyxFQUEvRDs7QUFDQSxXQUFPMEMsTUFBUDtBQUNELEdBUEQsQ0FPRSxPQUFPckMsQ0FBUCxFQUFVO0FBQ1YsUUFBSUEsQ0FBQyxDQUFDcUMsTUFBTixFQUFjO0FBQ1o1QyxzQkFBSUMsS0FBSixDQUFXLG1CQUFrQk0sQ0FBQyxDQUFDcUMsTUFBTyxFQUF0QztBQUNEOztBQUNELFFBQUlyQyxDQUFDLENBQUN3QyxNQUFOLEVBQWM7QUFDWi9DLHNCQUFJQyxLQUFKLENBQVcsbUJBQWtCTSxDQUFDLENBQUN3QyxNQUFPLEVBQXRDO0FBQ0Q7O0FBQ0QsVUFBTSxJQUFJcEIsS0FBSixDQUFXLEdBQUVNLFFBQVMscUJBQW9CMUIsQ0FBQyxDQUFDRSxPQUFRLEVBQXBELENBQU47QUFDRDtBQUNGLENBL0JEOztBQXNDQWYsZ0JBQWdCLENBQUNzRCxhQUFqQixHQUFpQyxlQUFlQSxhQUFmLENBQThCQyxZQUE5QixFQUE0QztBQUMzRSxRQUFNakIsSUFBSSxHQUFHLENBQ1gsaUJBRFcsRUFFWCxPQUZXLEVBRUYsS0FBS2tCLFVBQUwsQ0FBZ0IvQixJQUZkLEVBR1gsYUFIVyxFQUdJLEtBQUtnQyxXQUhULEVBSVgsVUFKVyxFQUlDRixZQUpELENBQWI7O0FBTUFqRCxrQkFBSUMsS0FBSixDQUFXLG9DQUFtQyxLQUFLa0QsV0FBWSxHQUEvRDs7QUFDQSxRQUFNLEtBQUtwQixjQUFMLENBQW9CQyxJQUFwQixFQUEwQixpQ0FBMUIsQ0FBTjtBQUNBLFNBQU9pQixZQUFQO0FBQ0QsQ0FWRDs7QUFtQ0F2RCxnQkFBZ0IsQ0FBQzBELG1CQUFqQixHQUF1QyxlQUFlQSxtQkFBZixDQUFvQ0MsaUJBQXBDLEVBQXVEQyxPQUFPLEdBQUcsRUFBakUsRUFBcUU7QUFDMUcsUUFBTUMsV0FBVyxHQUFHLCtCQUFpQixNQUFNLEtBQUtDLFdBQUwsRUFBdkIsRUFBMkNGLE9BQTNDLENBQXBCO0FBQ0EsU0FBTyxNQUFNLEtBQUtHLE9BQUwsQ0FBYSxDQUFDLGtCQUFELEVBQXFCLEdBQUdGLFdBQXhCLEVBQXFDLEdBQUdGLGlCQUF4QyxDQUFiLEVBQXlFO0FBQ3BGUixJQUFBQSxPQUFPLEVBQUVTLE9BQU8sQ0FBQ1QsT0FEbUU7QUFFcEZhLElBQUFBLGNBQWMsRUFBRUosT0FBTyxDQUFDSTtBQUY0RCxHQUF6RSxDQUFiO0FBSUQsQ0FORDs7QUE0QkFoRSxnQkFBZ0IsQ0FBQ2lFLFdBQWpCLEdBQStCLGVBQWVBLFdBQWYsQ0FBNEJoRCxJQUE1QixFQUFrQzJDLE9BQU8sR0FBRyxFQUE1QyxFQUFnRDtBQUM3RSxRQUFNO0FBQ0pNLElBQUFBLGdCQURJO0FBRUpDLElBQUFBLGlCQUZJO0FBR0poQixJQUFBQTtBQUhJLE1BSUZTLE9BSko7QUFNQSxRQUFNdEIsSUFBSSxHQUFHLENBQ1gsY0FEVyxFQUVYLE9BRlcsRUFFRixLQUFLa0IsVUFBTCxDQUFnQi9CLElBRmQsRUFHWCxRQUhXLEVBR0RSLElBSEMsRUFJWCxrQkFKVyxFQUlTa0MsT0FBTyxJQUFJaUIsNkJBSnBCLEVBS1gsYUFMVyxFQUtJLEtBQUtYLFdBTFQsQ0FBYjs7QUFPQSxNQUFJVSxpQkFBSixFQUF1QjtBQUNyQjdCLElBQUFBLElBQUksQ0FBQytCLElBQUwsQ0FBVSxtQkFBVjtBQUNEOztBQUNELFFBQU1DLEtBQUssR0FBRyxDQUNaLEtBQUtqQyxjQUFMLENBQW9CQyxJQUFwQixFQUEyQixtQkFBa0JiLGNBQUs4QyxRQUFMLENBQWN0RCxJQUFkLENBQW9CLG1CQUFrQixLQUFLd0MsV0FBWSxFQUFwRyxDQURZLENBQWQ7O0FBR0EsTUFBSVMsZ0JBQUosRUFBc0I7QUFDcEJJLElBQUFBLEtBQUssQ0FBQ0QsSUFBTixDQUFXLEtBQUtHLFVBQUwsQ0FBZ0J2RCxJQUFoQixDQUFYO0FBQ0Q7O0FBQ0QsUUFBTSxHQUFHd0QsT0FBSCxJQUFjLE1BQU1DLGtCQUFFQyxHQUFGLENBQU1MLEtBQU4sQ0FBMUI7O0FBQ0EsTUFBSUosZ0JBQWdCLElBQUlPLE9BQXhCLEVBQWlDO0FBRS9CLFVBQU0sS0FBS0csbUJBQUwsQ0FBeUJILE9BQU8sQ0FBQ0ksSUFBakMsQ0FBTjtBQUNEO0FBQ0YsQ0E1QkQ7O0FBcUNBN0UsZ0JBQWdCLENBQUM4RSxjQUFqQixHQUFrQyxlQUFlQSxjQUFmLENBQStCN0QsSUFBL0IsRUFBcUM7QUFDckUsU0FBTyxNQUFNRCxlQUFlLENBQUNDLElBQUQsRUFBTyxDQUFDLFFBQUQsRUFBVy9CLFFBQVgsQ0FBUCxDQUE1QjtBQUNELENBRkQ7O0FBZUFjLGdCQUFnQixDQUFDK0Usa0JBQWpCLEdBQXNDLGVBQWVBLGtCQUFmLENBQW1DOUQsSUFBbkMsRUFBeUMrRCxRQUFRLEdBQUcsSUFBcEQsRUFBMEQ7QUFDOUYsTUFBSUEsUUFBSixFQUFjO0FBQ1osUUFBSTtBQUNGLGFBQU8sTUFBTWhFLGVBQWUsQ0FBQ0MsSUFBRCxFQUFPLENBQUMsUUFBRCxFQUFXOUIsWUFBWSxDQUFDNkYsUUFBRCxDQUF2QixDQUFQLENBQTVCO0FBQ0QsS0FGRCxDQUVFLE9BQU9uRSxDQUFQLEVBQVU7QUFDVlAsc0JBQUlDLEtBQUosQ0FBVU0sQ0FBQyxDQUFDRSxPQUFaOztBQUNBVCxzQkFBSTJFLElBQUosQ0FBVSwrREFBOERoRSxJQUFLLFdBQXBFLEdBQ04sb0NBREg7O0FBRUEsYUFBTyxNQUFNLEtBQUs2RCxjQUFMLENBQW9CN0QsSUFBcEIsQ0FBYjtBQUNEO0FBQ0Y7O0FBRUQsUUFBTWlFLGdCQUFnQixHQUFHLENBQUMsSUFBRCxFQUFPLE9BQVAsQ0FBekI7O0FBQ0EsT0FBSyxNQUFNOUYsSUFBWCxJQUFtQjhGLGdCQUFuQixFQUFxQztBQUNuQyxRQUFJO0FBQ0YsYUFBTyxNQUFNbEUsZUFBZSxDQUFDQyxJQUFELEVBQU8sQ0FBQyxRQUFELEVBQVc5QixZQUFZLENBQUNDLElBQUQsQ0FBdkIsQ0FBUCxDQUE1QjtBQUNELEtBRkQsQ0FFRSxPQUFPK0YsR0FBUCxFQUFZLENBQUU7QUFDakI7O0FBRUQ3RSxrQkFBSTJFLElBQUosQ0FBVSx1REFBc0RqQyxJQUFJLENBQUNDLFNBQUwsQ0FBZWlDLGdCQUFmLENBQWlDLElBQXhGLEdBQ04saUNBREg7O0FBRUEsU0FBTyxNQUFNLEtBQUtKLGNBQUwsQ0FBb0I3RCxJQUFwQixDQUFiO0FBQ0QsQ0F0QkQ7O0FBd0JBakIsZ0JBQWdCLENBQUNvRixzQkFBakIsR0FBMEMsU0FBU0Esc0JBQVQsQ0FBaUNDLE1BQWpDLEVBQXlDO0FBQ2pGLFNBQU8sK0JBQStCQyxJQUEvQixDQUFvQ0QsTUFBcEMsQ0FBUDtBQUNELENBRkQ7O2VBSWVyRixnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IExSVSBmcm9tICdscnUtY2FjaGUnO1xuaW1wb3J0IHtcbiAgZ2V0SmF2YUZvck9zLCB1bnppcEZpbGUsIGJ1aWxkSW5zdGFsbEFyZ3MsIEFQS1NfSU5TVEFMTF9USU1FT1VUXG59IGZyb20gJy4uL2hlbHBlcnMuanMnO1xuaW1wb3J0IEFzeW5jTG9jayBmcm9tICdhc3luYy1sb2NrJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxuY29uc3QgQkFTRV9BUEsgPSAnYmFzZS1tYXN0ZXIuYXBrJztcbmNvbnN0IExBTkdVQUdFX0FQSyA9IChsYW5nKSA9PiBgYmFzZS0ke2xhbmd9LmFwa2A7XG5jb25zdCBBUEtTX0NBQ0hFID0gbmV3IExSVSh7XG4gIG1heDogMTAsXG4gIGRpc3Bvc2U6IChhcGtzSGFzaCwgZXh0cmFjdGVkRmlsZXNSb290KSA9PiBmcy5yaW1yYWYoZXh0cmFjdGVkRmlsZXNSb290KSxcbn0pO1xuY29uc3QgQVBLU19DQUNIRV9HVUFSRCA9IG5ldyBBc3luY0xvY2soKTtcbmNvbnN0IEJVTkRMRVRPT0xfVElNRU9VVF9NUyA9IDQgKiA2MCAqIDEwMDA7XG5cbmNvbnN0IGFwa3NVdGlsc01ldGhvZHMgPSB7fTtcblxucHJvY2Vzcy5vbignZXhpdCcsICgpID0+IHtcbiAgaWYgKCFBUEtTX0NBQ0hFLnNpemUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYXRocyA9IFsuLi5BUEtTX0NBQ0hFLnZhbHVlcygpXTtcbiAgbG9nLmRlYnVnKGBQZXJmb3JtaW5nIGNsZWFudXAgb2YgJHtwYXRocy5sZW5ndGh9IGNhY2hlZCAuYXBrcyBgICtcbiAgICB1dGlsLnBsdXJhbGl6ZSgncGFja2FnZScsIHBhdGhzLmxlbmd0aCkpO1xuICBmb3IgKGNvbnN0IGFwcFBhdGggb2YgcGF0aHMpIHtcbiAgICB0cnkge1xuICAgICAgLy8gQXN5bmNocm9ub3VzIGNhbGxzIGFyZSBub3Qgc3VwcG9ydGVkIGluIG9uRXhpdCBoYW5kbGVyXG4gICAgICBmcy5yaW1yYWZTeW5jKGFwcFBhdGgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy53YXJuKGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG59KTtcblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgcGFydGljdWxhciBhcGtzIHBhY2thZ2UgaW50byBhIHRlbXBvcmFyeSBmb2xkZXIsXG4gKiBmaW5kcyBhbmQgcmV0dXJucyB0aGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlIGNvbnRhaW5lZCBpbiB0aGlzIGFway5cbiAqIFRoZSByZXN1bHRpbmcgdGVtcG9yYXJ5IHBhdGgsIHdoZXJlIHRoZSAuYXBrcyBmaWxlIGhhcyBiZWVuIGV4dHJhY3RlZCxcbiAqIHdpbGwgYmUgc3RvcmVkIGludG8gdGhlIGludGVybmFsIExSVSBjYWNoZSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGtzIC0gVGhlIGZ1bGwgcGF0aCB0byB0aGUgLmFwa3MgZmlsZVxuICogQHBhcmFtIHtzdHJpbmd8QXJyYXk8U3RyaW5nPn0gZHN0UGF0aCAtIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBkZXN0aW5hdGlvbiBmaWxlLFxuICogd2hpY2ggaXMgZ29pbmcgdG8gYmUgZXh0cmFjdGVkLCB3aGVyZSBlYWNoIHBhdGggY29tcG9uZW50IGlzIGFuIGFycmF5IGl0ZW1cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEZ1bGwgcGF0aCB0byB0aGUgZXh0cmFjdGVkIGZpbGVcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcmVxdWVzdGVkIGl0ZW0gZG9lcyBub3QgZXhpc3QgaW4gdGhlIGV4dHJhY3RlZCBhcmNoaXZlIG9yIHRoZSBwcm92aWRlc1xuICogYXBrcyBmaWxlIGlzIG5vdCBhIHZhbGlkIGJ1bmRsZVxuICovXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0RnJvbUFwa3MgKGFwa3MsIGRzdFBhdGgpIHtcbiAgaWYgKCFfLmlzQXJyYXkoZHN0UGF0aCkpIHtcbiAgICBkc3RQYXRoID0gW2RzdFBhdGhdO1xuICB9XG5cbiAgcmV0dXJuIGF3YWl0IEFQS1NfQ0FDSEVfR1VBUkQuYWNxdWlyZShhcGtzLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gSXQgbWlnaHQgYmUgdGhhdCB0aGUgb3JpZ2luYWwgZmlsZSBoYXMgYmVlbiByZXBsYWNlZCxcbiAgICAvLyBzbyB3ZSBuZWVkIHRvIGtlZXAgdGhlIGhhc2ggc3VtcyBpbnN0ZWFkIG9mIHRoZSBhY3R1YWwgZmlsZSBwYXRoc1xuICAgIC8vIGFzIGNhY2hpbmcga2V5c1xuICAgIGNvbnN0IGFwa3NIYXNoID0gYXdhaXQgZnMuaGFzaChhcGtzKTtcbiAgICBsb2cuZGVidWcoYENhbGN1bGF0ZWQgJyR7YXBrc30nIGhhc2g6ICR7YXBrc0hhc2h9YCk7XG5cbiAgICBpZiAoQVBLU19DQUNIRS5oYXMoYXBrc0hhc2gpKSB7XG4gICAgICBjb25zdCByZXN1bHRQYXRoID0gcGF0aC5yZXNvbHZlKEFQS1NfQ0FDSEUuZ2V0KGFwa3NIYXNoKSwgLi4uZHN0UGF0aCk7XG4gICAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKHJlc3VsdFBhdGgpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHRQYXRoO1xuICAgICAgfVxuICAgICAgQVBLU19DQUNIRS5kZWwoYXBrc0hhc2gpO1xuICAgIH1cblxuICAgIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICBsb2cuZGVidWcoYFVucGFja2luZyBhcHBsaWNhdGlvbiBidW5kbGUgYXQgJyR7YXBrc30nIHRvICcke3RtcFJvb3R9J2ApO1xuICAgIGF3YWl0IHVuemlwRmlsZShhcGtzLCB0bXBSb290KTtcbiAgICBjb25zdCByZXN1bHRQYXRoID0gcGF0aC5yZXNvbHZlKHRtcFJvb3QsIC4uLmRzdFBhdGgpO1xuICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKHJlc3VsdFBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZHN0UGF0aC5qb2luKHBhdGguc2VwKX0gY2Fubm90IGJlIGZvdW5kIGluICcke2Fwa3N9JyBidW5kbGUuIGAgK1xuICAgICAgICBgRG9lcyB0aGUgYXJjaGl2ZSBjb250YWluIGEgdmFsaWQgYXBwbGljYXRpb24gYnVuZGxlP2ApO1xuICAgIH1cbiAgICBBUEtTX0NBQ0hFLnNldChhcGtzSGFzaCwgdG1wUm9vdCk7XG4gICAgcmV0dXJuIHJlc3VsdFBhdGg7XG4gIH0pO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGJ1bmRsZXRvb2wgdXRpbGl0eSB3aXRoIGdpdmVuIGFyZ3VtZW50cyBhbmQgcmV0dXJucyB0aGUgYWN0dWFsIHN0ZG91dFxuICpcbiAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0gYXJncyAtIHRoZSBsaXN0IG9mIGJ1bmRsZXRvb2wgYXJndW1lbnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gZXJyb3JNc2cgLSBUaGUgY3VzdG9taXplZCBlcnJvciBtZXNzYWdlIHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gdGhlIGFjdHVhbCBjb21tYW5kIHN0ZG91dFxuICogQHRocm93cyB7RXJyb3J9IElmIGJ1bmRsZXRvb2wgamFyIGRvZXMgbm90IGV4aXN0IGluIFBBVEggb3IgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlXG4gKiBleGVjdXRpbmcgaXRcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5leGVjQnVuZGxldG9vbCA9IGFzeW5jIGZ1bmN0aW9uIGV4ZWNCdW5kbGV0b29sIChhcmdzLCBlcnJvck1zZykge1xuICBhd2FpdCB0aGlzLmluaXRCdW5kbGV0b29sKCk7XG4gIGFyZ3MgPSBbXG4gICAgJy1qYXInLCB0aGlzLmJpbmFyaWVzLmJ1bmRsZXRvb2wsXG4gICAgLi4uYXJnc1xuICBdO1xuICBjb25zdCBlbnYgPSBwcm9jZXNzLmVudjtcbiAgaWYgKHRoaXMuYWRiUG9ydCkge1xuICAgIGVudi5BTkRST0lEX0FEQl9TRVJWRVJfUE9SVCA9IGAke3RoaXMuYWRiUG9ydH1gO1xuICB9XG4gIGlmICh0aGlzLmFkYkhvc3QpIHtcbiAgICBlbnYuQU5EUk9JRF9BREJfU0VSVkVSX0hPU1QgPSB0aGlzLmFkYkhvc3Q7XG4gIH1cbiAgbG9nLmRlYnVnKGBFeGVjdXRpbmcgYnVuZGxldG9vbCB3aXRoIGFyZ3VtZW50czogJHtKU09OLnN0cmluZ2lmeShhcmdzKX1gKTtcbiAgbGV0IHN0ZG91dDtcbiAgdHJ5IHtcbiAgICAoe3N0ZG91dH0gPSBhd2FpdCBleGVjKGF3YWl0IGdldEphdmFGb3JPcygpLCBhcmdzLCB7XG4gICAgICBlbnYsXG4gICAgICB0aW1lb3V0OiBCVU5ETEVUT09MX1RJTUVPVVRfTVMsXG4gICAgfSkpO1xuICAgIGxvZy5kZWJ1ZyhgQ29tbWFuZCBzdGRvdXQ6ICR7Xy50cnVuY2F0ZShzdGRvdXQsIHtsZW5ndGg6IDMwMH0pfWApO1xuICAgIHJldHVybiBzdGRvdXQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZS5zdGRvdXQpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgQ29tbWFuZCBzdGRvdXQ6ICR7ZS5zdGRvdXR9YCk7XG4gICAgfVxuICAgIGlmIChlLnN0ZGVycikge1xuICAgICAgbG9nLmRlYnVnKGBDb21tYW5kIHN0ZGVycjogJHtlLnN0ZGVycn1gKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2Vycm9yTXNnfS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcGVjTG9jYXRpb24gLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBnZW5lcmF0ZWQgZGV2aWNlIHNwZWMgbG9jYXRpb25cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzYW1lIGBzcGVjTG9jYXRpb25gIHZhbHVlXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIHRoZSBzcGVjIGZvciB0aGUgY3VycmVudCBkZXZpY2VcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5nZXREZXZpY2VTcGVjID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlU3BlYyAoc3BlY0xvY2F0aW9uKSB7XG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgJ2dldC1kZXZpY2Utc3BlYycsXG4gICAgJy0tYWRiJywgdGhpcy5leGVjdXRhYmxlLnBhdGgsXG4gICAgJy0tZGV2aWNlLWlkJywgdGhpcy5jdXJEZXZpY2VJZCxcbiAgICAnLS1vdXRwdXQnLCBzcGVjTG9jYXRpb24sXG4gIF07XG4gIGxvZy5kZWJ1ZyhgR2V0dGluZyB0aGUgc3BlYyBmb3IgdGhlIGRldmljZSAnJHt0aGlzLmN1ckRldmljZUlkfSdgKTtcbiAgYXdhaXQgdGhpcy5leGVjQnVuZGxldG9vbChhcmdzLCAnQ2Fubm90IHJldHJpZXZlIHRoZSBkZXZpY2Ugc3BlYycpO1xuICByZXR1cm4gc3BlY0xvY2F0aW9uO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsTXVsdGlwbGVBcGtzT3B0aW9uc1xuICogQHByb3BlcnR5IHs/bnVtYmVyfHN0cmluZ30gdGltZW91dCBbMjAwMDBdIC0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbFxuICogdGhlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aW1lb3V0Q2FwTmFtZSBbYW5kcm9pZEluc3RhbGxUaW1lb3V0XSAtIFRoZSB0aW1lb3V0IG9wdGlvbiBuYW1lXG4gKiB1c2VycyBjYW4gaW5jcmVhc2UgdGhlIHRpbWVvdXQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93VGVzdFBhY2thZ2VzIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBhbGxvdyB0ZXN0XG4gKiBwYWNrYWdlcyBpbnN0YWxsYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVNkY2FyZCBbZmFsc2VdIC0gU2V0IHRvIHRydWUgdG8gaW5zdGFsbCB0aGUgYXBwIG9uIHNkY2FyZFxuICogaW5zdGVhZCBvZiB0aGUgZGV2aWNlIG1lbW9yeS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ3JhbnRQZXJtaXNzaW9ucyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gZ3JhbnQgYWxsIHRoZVxuICogcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvblxuICogaXMgY29tcGxldGVkIHVuZGVyIEFuZHJvaWQgNisuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHBhcnRpYWxJbnN0YWxsIFtmYWxzZV0gLSBJbnN0YWxsIGFwa3MgcGFydGlhbGx5LiBJdCBpcyB1c2VkIGZvciAnaW5zdGFsbC1tdWx0aXBsZScuXG4gKiBodHRwczovL2FuZHJvaWQuc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzExMTA2NC93aGF0LWlzLWEtcGFydGlhbC1hcHBsaWNhdGlvbi1pbnN0YWxsLXZpYS1hZGJcbiAqL1xuXG4vKipcbiAqIEluc3RhbGxzIHRoZSBnaXZlbiBhcGtzIGludG8gdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBhcGtQYXRoc1RvSW5zdGFsbCAtIFRoZSBmdWxsIHBhdGhzIHRvIGluc3RhbGwgYXBrc1xuICogQHBhcmFtIHs/aW5zdGFsbE11bHRpcGxlQXBrc09wdGlvbnN9IG9wdGlvbnMgLSBJbnN0YWxsYXRpb24gb3B0aW9uc1xuICovXG5hcGtzVXRpbHNNZXRob2RzLmluc3RhbGxNdWx0aXBsZUFwa3MgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsTXVsdGlwbGVBcGtzIChhcGtQYXRoc1RvSW5zdGFsbCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGluc3RhbGxBcmdzID0gYnVpbGRJbnN0YWxsQXJncyhhd2FpdCB0aGlzLmdldEFwaUxldmVsKCksIG9wdGlvbnMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGJFeGVjKFsnaW5zdGFsbC1tdWx0aXBsZScsIC4uLmluc3RhbGxBcmdzLCAuLi5hcGtQYXRoc1RvSW5zdGFsbF0sIHtcbiAgICB0aW1lb3V0OiBvcHRpb25zLnRpbWVvdXQsXG4gICAgdGltZW91dENhcE5hbWU6IG9wdGlvbnMudGltZW91dENhcE5hbWUsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsQXBrc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P251bWJlcnxzdHJpbmd9IHRpbWVvdXQgWzEyMDAwMF0gLSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsXG4gKiB0aGUgaW5zdGFsbGF0aW9uIGlzIGNvbXBsZXRlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpbWVvdXRDYXBOYW1lIFthbmRyb2lkSW5zdGFsbFRpbWVvdXRdIC0gVGhlIHRpbWVvdXQgb3B0aW9uIG5hbWVcbiAqIHVzZXJzIGNhbiBpbmNyZWFzZSB0aGUgdGltZW91dC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYWxsb3dUZXN0UGFja2FnZXMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGFsbG93IHRlc3RcbiAqIHBhY2thZ2VzIGluc3RhbGxhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ3JhbnRQZXJtaXNzaW9ucyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gZ3JhbnQgYWxsIHRoZVxuICogcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvblxuICogaXMgY29tcGxldGVkIHVuZGVyIEFuZHJvaWQgNisuXG4gKi9cblxuLyoqXG4gKiBJbnN0YWxscyB0aGUgZ2l2ZW4gLmFwa3MgcGFja2FnZSBpbnRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGtzIC0gVGhlIGZ1bGwgcGF0aCB0byB0aGUgLmFwa3MgZmlsZVxuICogQHBhcmFtIHs/SW5zdGFsbEFwa3NPcHRpb25zfSBvcHRpb25zIC0gSW5zdGFsbGF0aW9uIG9wdGlvbnNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgLmFwa3MgYnVuZGxlIGNhbm5vdCBiZSBpbnN0YWxsZWRcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5pbnN0YWxsQXBrcyA9IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBcGtzIChhcGtzLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGdyYW50UGVybWlzc2lvbnMsXG4gICAgYWxsb3dUZXN0UGFja2FnZXMsXG4gICAgdGltZW91dCxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgYXJncyA9IFtcbiAgICAnaW5zdGFsbC1hcGtzJyxcbiAgICAnLS1hZGInLCB0aGlzLmV4ZWN1dGFibGUucGF0aCxcbiAgICAnLS1hcGtzJywgYXBrcyxcbiAgICAnLS10aW1lb3V0LW1pbGxpcycsIHRpbWVvdXQgfHwgQVBLU19JTlNUQUxMX1RJTUVPVVQsXG4gICAgJy0tZGV2aWNlLWlkJywgdGhpcy5jdXJEZXZpY2VJZCxcbiAgXTtcbiAgaWYgKGFsbG93VGVzdFBhY2thZ2VzKSB7XG4gICAgYXJncy5wdXNoKCctLWFsbG93LXRlc3Qtb25seScpO1xuICB9XG4gIGNvbnN0IHRhc2tzID0gW1xuICAgIHRoaXMuZXhlY0J1bmRsZXRvb2woYXJncywgYENhbm5vdCBpbnN0YWxsICcke3BhdGguYmFzZW5hbWUoYXBrcyl9JyB0byB0aGUgZGV2aWNlICR7dGhpcy5jdXJEZXZpY2VJZH1gKVxuICBdO1xuICBpZiAoZ3JhbnRQZXJtaXNzaW9ucykge1xuICAgIHRhc2tzLnB1c2godGhpcy5nZXRBcGtJbmZvKGFwa3MpKTtcbiAgfVxuICBjb25zdCBbLCBhcGtJbmZvXSA9IGF3YWl0IEIuYWxsKHRhc2tzKTtcbiAgaWYgKGdyYW50UGVybWlzc2lvbnMgJiYgYXBrSW5mbykge1xuICAgIC8vIFRPRE86IFNpbXBsaWZ5IGl0IGFmdGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvYnVuZGxldG9vbC9pc3N1ZXMvMjQ2IGlzIGltcGxlbWVudGVkXG4gICAgYXdhaXQgdGhpcy5ncmFudEFsbFBlcm1pc3Npb25zKGFwa0luZm8ubmFtZSk7XG4gIH1cbn07XG5cbi8qKlxuICogRXh0cmFjdHMgYW5kIHJldHVybnMgdGhlIGZ1bGwgcGF0aCB0byB0aGUgbWFzdGVyIC5hcGsgZmlsZSBpbnNpZGUgdGhlIGJ1bmRsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBrcyAtIFRoZSBmdWxsIHBhdGggdG8gdGhlIC5hcGtzIGZpbGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmdWxsIHBhdGggdG8gdGhlIG1hc3RlciBidW5kbGUgLmFwa1xuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBleHRyYWN0aW5nL2ZpbmRpbmcgdGhlIGZpbGVcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5leHRyYWN0QmFzZUFwayA9IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RCYXNlQXBrIChhcGtzKSB7XG4gIHJldHVybiBhd2FpdCBleHRyYWN0RnJvbUFwa3MoYXBrcywgWydzcGxpdHMnLCBCQVNFX0FQS10pO1xufTtcblxuLyoqXG4gKiBFeHRyYWN0cyBhbmQgcmV0dXJucyB0aGUgZnVsbCBwYXRoIHRvIHRoZSAuYXBrLCB3aGljaCBjb250YWlucyB0aGUgY29ycmVzcG9uZGluZ1xuICogcmVzb3VyY2VzIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgaW4gdGhlIC5hcGtzIGJ1bmRsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBrcyAtIFRoZSBmdWxsIHBhdGggdG8gdGhlIC5hcGtzIGZpbGVcbiAqIEBwYXJhbSB7P3N0cmluZ30gbGFuZ3VhZ2UgLSBUaGUgbGFuZ3VhZ2UgYWJicmV2aWF0aW9uLiBUaGUgZGVmYXVsdCBsYW5ndWFnZSBpc1xuICogZ29pbmcgdG8gYmUgc2VsZWN0ZWQgaWYgaXQgaXMgbm90IHNldC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmdWxsIHBhdGggdG8gdGhlIGNvcnJlc3BvbmRpbmcgbGFuZ3VhZ2UgLmFwayBvciB0aGUgbWFzdGVyIC5hcGtcbiAqIGlmIGxhbmd1YWdlIHNwbGl0IGlzIG5vdCBlbmFibGVkIGZvciB0aGUgYnVuZGxlLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBleHRyYWN0aW5nL2ZpbmRpbmcgdGhlIGZpbGVcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5leHRyYWN0TGFuZ3VhZ2VBcGsgPSBhc3luYyBmdW5jdGlvbiBleHRyYWN0TGFuZ3VhZ2VBcGsgKGFwa3MsIGxhbmd1YWdlID0gbnVsbCkge1xuICBpZiAobGFuZ3VhZ2UpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGV4dHJhY3RGcm9tQXBrcyhhcGtzLCBbJ3NwbGl0cycsIExBTkdVQUdFX0FQSyhsYW5ndWFnZSldKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZGVidWcoZS5tZXNzYWdlKTtcbiAgICAgIGxvZy5pbmZvKGBBc3N1bWluZyB0aGF0IHNwbGl0dGluZyBieSBsYW5ndWFnZSBpcyBub3QgZW5hYmxlZCBmb3IgdGhlICcke2Fwa3N9JyBidW5kbGUgYCArXG4gICAgICAgIGBhbmQgcmV0dXJuaW5nIHRoZSBtYWluIGFwayBpbnN0ZWFkYCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRyYWN0QmFzZUFwayhhcGtzKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZWZhdWx0TGFuZ3VhZ2VzID0gWydlbicsICdlbl91cyddO1xuICBmb3IgKGNvbnN0IGxhbmcgb2YgZGVmYXVsdExhbmd1YWdlcykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZXh0cmFjdEZyb21BcGtzKGFwa3MsIFsnc3BsaXRzJywgTEFOR1VBR0VfQVBLKGxhbmcpXSk7XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICB9XG5cbiAgbG9nLmluZm8oYENhbm5vdCBmaW5kIGFueSBzcGxpdCBhcGsgZm9yIHRoZSBkZWZhdWx0IGxhbmd1YWdlcyAke0pTT04uc3RyaW5naWZ5KGRlZmF1bHRMYW5ndWFnZXMpfS4gYCArXG4gICAgYFJldHVybmluZyB0aGUgbWFpbiBhcGsgaW5zdGVhZC5gKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0cmFjdEJhc2VBcGsoYXBrcyk7XG59O1xuXG5hcGtzVXRpbHNNZXRob2RzLmlzVGVzdFBhY2thZ2VPbmx5RXJyb3IgPSBmdW5jdGlvbiBpc1Rlc3RQYWNrYWdlT25seUVycm9yIChvdXRwdXQpIHtcbiAgcmV0dXJuIC9cXFtJTlNUQUxMX0ZBSUxFRF9URVNUX09OTFlcXF0vLnRlc3Qob3V0cHV0KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGFwa3NVdGlsc01ldGhvZHM7XG4iXSwiZmlsZSI6ImxpYi90b29scy9hcGtzLXV0aWxzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
|
package/build/lib/tools/index.js
CHANGED
|
@@ -27,6 +27,8 @@ var _apkUtils = _interopRequireDefault(require("./apk-utils.js"));
|
|
|
27
27
|
|
|
28
28
|
var _apksUtils = _interopRequireDefault(require("./apks-utils.js"));
|
|
29
29
|
|
|
30
|
+
var _aabUtils = _interopRequireDefault(require("./aab-utils.js"));
|
|
31
|
+
|
|
30
32
|
var _adbEmuCommands = _interopRequireDefault(require("./adb-emu-commands.js"));
|
|
31
33
|
|
|
32
34
|
var _settingsClientCommands = _interopRequireDefault(require("./settings-client-commands"));
|
|
@@ -39,9 +41,9 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
|
|
|
39
41
|
|
|
40
42
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
41
43
|
|
|
42
|
-
Object.assign(_adbCommands.default, _androidManifest.default, _systemCalls.default, _adbEmuCommands.default, _apkSigning.default, _apkUtils.default, _apksUtils.default, _settingsClientCommands.default, _lockmgmt.default, _keyboardCommands.default);
|
|
44
|
+
Object.assign(_adbCommands.default, _androidManifest.default, _systemCalls.default, _adbEmuCommands.default, _apkSigning.default, _apkUtils.default, _apksUtils.default, _aabUtils.default, _settingsClientCommands.default, _lockmgmt.default, _keyboardCommands.default);
|
|
43
45
|
var _default = _adbCommands.default;
|
|
44
46
|
exports.default = _default;require('source-map-support').install();
|
|
45
47
|
|
|
46
48
|
|
|
47
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
49
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9pbmRleC5qcyJdLCJuYW1lcyI6WyJPYmplY3QiLCJhc3NpZ24iLCJtZXRob2RzIiwibWFuaWZlc3RNZXRob2RzIiwic3lzdGVtQ2FsbE1ldGhvZHMiLCJlbXVNZXRob2RzIiwiYXBrU2lnbmluZ01ldGhvZHMiLCJhcGtVdGlsc01ldGhvZHMiLCJhcGtzVXRpbHNNZXRob2RzIiwiYWFiVXRpbHNNZXRob2RzIiwic2V0dGluZ3NDbGllbnRDb21tYW5kcyIsImxvY2tNYW5hZ2VtZW50Q29tbWFuZHMiLCJrZXlib2FyZENvbW1hbmRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7QUFFQUEsTUFBTSxDQUFDQyxNQUFQLENBQ0lDLG9CQURKLEVBRUlDLHdCQUZKLEVBR0lDLG9CQUhKLEVBSUlDLHVCQUpKLEVBS0lDLG1CQUxKLEVBTUlDLGlCQU5KLEVBT0lDLGtCQVBKLEVBUUlDLGlCQVJKLEVBU0lDLCtCQVRKLEVBVUlDLGlCQVZKLEVBV0lDLHlCQVhKO2VBY2VWLG9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1ldGhvZHMgZnJvbSAnLi9hZGItY29tbWFuZHMuanMnO1xuaW1wb3J0IG1hbmlmZXN0TWV0aG9kcyBmcm9tICcuL2FuZHJvaWQtbWFuaWZlc3QuanMnO1xuaW1wb3J0IHN5c3RlbUNhbGxNZXRob2RzLCB7IGdldEFuZHJvaWRCaW5hcnlQYXRoIH0gZnJvbSAnLi9zeXN0ZW0tY2FsbHMuanMnO1xuaW1wb3J0IGFwa1NpZ25pbmdNZXRob2RzIGZyb20gJy4vYXBrLXNpZ25pbmcuanMnO1xuaW1wb3J0IGFwa1V0aWxzTWV0aG9kcyBmcm9tICcuL2Fway11dGlscy5qcyc7XG5pbXBvcnQgYXBrc1V0aWxzTWV0aG9kcyBmcm9tICcuL2Fwa3MtdXRpbHMuanMnO1xuaW1wb3J0IGFhYlV0aWxzTWV0aG9kcyBmcm9tICcuL2FhYi11dGlscy5qcyc7XG5pbXBvcnQgZW11TWV0aG9kcyBmcm9tICcuL2FkYi1lbXUtY29tbWFuZHMuanMnO1xuaW1wb3J0IHNldHRpbmdzQ2xpZW50Q29tbWFuZHMgZnJvbSAnLi9zZXR0aW5ncy1jbGllbnQtY29tbWFuZHMnO1xuaW1wb3J0IGxvY2tNYW5hZ2VtZW50Q29tbWFuZHMgZnJvbSAnLi9sb2NrbWdtdCc7XG5pbXBvcnQga2V5Ym9hcmRDb21tYW5kcyBmcm9tICcuL2tleWJvYXJkLWNvbW1hbmRzJztcblxuT2JqZWN0LmFzc2lnbihcbiAgICBtZXRob2RzLFxuICAgIG1hbmlmZXN0TWV0aG9kcyxcbiAgICBzeXN0ZW1DYWxsTWV0aG9kcyxcbiAgICBlbXVNZXRob2RzLFxuICAgIGFwa1NpZ25pbmdNZXRob2RzLFxuICAgIGFwa1V0aWxzTWV0aG9kcyxcbiAgICBhcGtzVXRpbHNNZXRob2RzLFxuICAgIGFhYlV0aWxzTWV0aG9kcyxcbiAgICBzZXR0aW5nc0NsaWVudENvbW1hbmRzLFxuICAgIGxvY2tNYW5hZ2VtZW50Q29tbWFuZHMsXG4gICAga2V5Ym9hcmRDb21tYW5kcyxcbik7XG5cbmV4cG9ydCBkZWZhdWx0IG1ldGhvZHM7XG5leHBvcnQgeyBnZXRBbmRyb2lkQmluYXJ5UGF0aCB9O1xuIl0sImZpbGUiOiJsaWIvdG9vbHMvaW5kZXguanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import log from '../logger.js';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { fs, tempDir, util } from '@appium/support';
|
|
4
|
+
import LRU from 'lru-cache';
|
|
5
|
+
import { unzipFile } from '../helpers.js';
|
|
6
|
+
import AsyncLock from 'async-lock';
|
|
7
|
+
import B from 'bluebird';
|
|
8
|
+
import crypto from 'crypto';
|
|
9
|
+
|
|
10
|
+
const AAB_CACHE = new LRU({
|
|
11
|
+
max: 10,
|
|
12
|
+
dispose: (hash, extractedFilesRoot) => fs.rimraf(extractedFilesRoot),
|
|
13
|
+
});
|
|
14
|
+
const AAB_CACHE_GUARD = new AsyncLock();
|
|
15
|
+
const UNIVERSAL_APK = 'universal.apk';
|
|
16
|
+
|
|
17
|
+
const aabUtilsMethods = {};
|
|
18
|
+
|
|
19
|
+
process.on('exit', () => {
|
|
20
|
+
if (!AAB_CACHE.size) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const paths = [...AAB_CACHE.values()];
|
|
25
|
+
log.debug(`Performing cleanup of ${paths.length} cached .aab ` +
|
|
26
|
+
util.pluralize('package', paths.length));
|
|
27
|
+
for (const appPath of paths) {
|
|
28
|
+
try {
|
|
29
|
+
// Asynchronous calls are not supported in onExit handler
|
|
30
|
+
fs.rimrafSync(appPath);
|
|
31
|
+
} catch (e) {
|
|
32
|
+
log.warn(e.message);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @typedef {Object} ApkCreationOptions
|
|
39
|
+
* @property {string} keystore Specifies the path to the deployment keystore used
|
|
40
|
+
* to sign the APKs. This flag is optional. If you don't include it,
|
|
41
|
+
* bundletool attempts to sign your APKs with a debug signing key.
|
|
42
|
+
* If the .apk has been already signed and cached then it is not going to be resigned
|
|
43
|
+
* unless a different keystore or key alias is used.
|
|
44
|
+
* @property {string} keystorePassword Specifies your keystore’s password.
|
|
45
|
+
* It is mandatory to provide this value if `keystore` one is assigned
|
|
46
|
+
* otherwise it is going to be ignored.
|
|
47
|
+
* @property {string} keyAlias Specifies the alias of the signing key you want to use.
|
|
48
|
+
* It is mandatory to provide this value if `keystore` one is assigned
|
|
49
|
+
* otherwise it is going to be ignored.
|
|
50
|
+
* @property {string} keyPassword Specifies the password for the signing key.
|
|
51
|
+
* It is mandatory to provide this value if `keystore` one is assigned
|
|
52
|
+
* otherwise it is going to be ignored.
|
|
53
|
+
*/
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Builds a universal .apk from the given .aab package. See
|
|
57
|
+
* https://developer.android.com/studio/command-line/bundletool#generate_apks
|
|
58
|
+
* for more details.
|
|
59
|
+
*
|
|
60
|
+
* @param {string} aabPath Full path to the source .aab package
|
|
61
|
+
* @param {ApkCreationOptions} opts
|
|
62
|
+
* @returns The path to the resulting universal .apk. The .apk is stored in the internal cache
|
|
63
|
+
* by default.
|
|
64
|
+
* @throws {Error} If there was an error while creating the universal .apk
|
|
65
|
+
*/
|
|
66
|
+
aabUtilsMethods.extractUniversalApk = async function extractUniversalApk (aabPath, opts = {}) {
|
|
67
|
+
if (!await fs.exists(aabPath)) {
|
|
68
|
+
throw new Error(`The file at '${aabPath}' either does not exist or is not accessible`);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const aabName = path.basename(aabPath);
|
|
72
|
+
const apkName = aabName.substring(0, aabName.length - path.extname(aabName).length) + '.apk';
|
|
73
|
+
const tmpRoot = await tempDir.openDir();
|
|
74
|
+
const tmpApksPath = path.join(tmpRoot, `${aabName}.apks`);
|
|
75
|
+
try {
|
|
76
|
+
return await AAB_CACHE_GUARD.acquire(aabPath, async () => {
|
|
77
|
+
const aabHash = await fs.hash(aabPath);
|
|
78
|
+
const {
|
|
79
|
+
keystore,
|
|
80
|
+
keystorePassword,
|
|
81
|
+
keyAlias,
|
|
82
|
+
keyPassword,
|
|
83
|
+
} = opts;
|
|
84
|
+
let cacheHash = aabHash;
|
|
85
|
+
if (keystore) {
|
|
86
|
+
if (!await fs.exists(keystore)) {
|
|
87
|
+
throw new Error(`The keystore file at '${keystore}' either does not exist ` +
|
|
88
|
+
`or is not accessible`);
|
|
89
|
+
}
|
|
90
|
+
if (!keystorePassword || !keyAlias || !keyPassword) {
|
|
91
|
+
throw new Error('It is mandatory to also provide keystore password, key alias, ' +
|
|
92
|
+
'and key password if the keystore path is set');
|
|
93
|
+
}
|
|
94
|
+
const keystoreHash = await fs.hash(keystore);
|
|
95
|
+
const keyAliasHash = crypto.createHash('sha1');
|
|
96
|
+
keyAliasHash.update(keyAlias);
|
|
97
|
+
cacheHash = [cacheHash, keystoreHash, keyAliasHash.digest('hex')].join(':');
|
|
98
|
+
}
|
|
99
|
+
log.debug(`Calculated the cache key for '${aabPath}': ${cacheHash}`);
|
|
100
|
+
if (AAB_CACHE.has(cacheHash)) {
|
|
101
|
+
const resultPath = path.resolve(AAB_CACHE.get(cacheHash), apkName);
|
|
102
|
+
if (await fs.exists(resultPath)) {
|
|
103
|
+
return resultPath;
|
|
104
|
+
}
|
|
105
|
+
AAB_CACHE.del(cacheHash);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
await this.initAapt2();
|
|
109
|
+
const args = [
|
|
110
|
+
'build-apks',
|
|
111
|
+
'--aapt2', this.binaries.aapt2,
|
|
112
|
+
'--bundle', aabPath,
|
|
113
|
+
'--output', tmpApksPath,
|
|
114
|
+
...(keystore ? [
|
|
115
|
+
'--ks', keystore,
|
|
116
|
+
'--ks-pass', `pass:${keystorePassword}`,
|
|
117
|
+
'--ks-key-alias', keyAlias,
|
|
118
|
+
'--key-pass', `pass:${keyPassword}`,
|
|
119
|
+
] : []),
|
|
120
|
+
'--mode=universal'
|
|
121
|
+
];
|
|
122
|
+
log.debug(`Preparing universal .apks bundle from '${aabPath}'`);
|
|
123
|
+
await this.execBundletool(args, `Cannot build a universal .apks bundle from '${aabPath}'`);
|
|
124
|
+
|
|
125
|
+
log.debug(`Unpacking universal application bundle at '${tmpApksPath}' to '${tmpRoot}'`);
|
|
126
|
+
await unzipFile(tmpApksPath, tmpRoot);
|
|
127
|
+
let universalApkPath;
|
|
128
|
+
const fileDeletionPromises = [];
|
|
129
|
+
const allFileNames = await fs.readdir(tmpRoot);
|
|
130
|
+
for (const fileName of allFileNames) {
|
|
131
|
+
const fullPath = path.join(tmpRoot, fileName);
|
|
132
|
+
if (fileName === UNIVERSAL_APK) {
|
|
133
|
+
universalApkPath = fullPath;
|
|
134
|
+
} else {
|
|
135
|
+
fileDeletionPromises.push(fs.rimraf(fullPath));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
await B.all(fileDeletionPromises);
|
|
140
|
+
} catch (ign) {}
|
|
141
|
+
if (!universalApkPath) {
|
|
142
|
+
log.debug(`The following items were extracted from the .aab bundle: ${allFileNames}`);
|
|
143
|
+
throw new Error(`${UNIVERSAL_APK} cannot be found in '${aabPath}' bundle. ` +
|
|
144
|
+
`Does the archive contain a valid application bundle?`);
|
|
145
|
+
}
|
|
146
|
+
const resultPath = path.join(tmpRoot, apkName);
|
|
147
|
+
log.debug(`Found ${UNIVERSAL_APK} at '${universalApkPath}'. Caching it to '${resultPath}'`);
|
|
148
|
+
await fs.mv(universalApkPath, resultPath);
|
|
149
|
+
AAB_CACHE.set(cacheHash, tmpRoot);
|
|
150
|
+
return resultPath;
|
|
151
|
+
});
|
|
152
|
+
} catch (e) {
|
|
153
|
+
await fs.rimraf(tmpRoot);
|
|
154
|
+
throw e;
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
export default aabUtilsMethods;
|
package/lib/tools/apk-signing.js
CHANGED
|
@@ -47,7 +47,7 @@ apkSigningMethods.executeApksigner = async function executeApksigner (args = [])
|
|
|
47
47
|
log.debug(`Starting apksigner: ${util.quote(fullCmd)}`);
|
|
48
48
|
// It is necessary to specify CWD explicitly; see https://github.com/appium/appium/issues/14724#issuecomment-737446715
|
|
49
49
|
const {stdout, stderr} = await exec(fullCmd[0], fullCmd.slice(1), {
|
|
50
|
-
cwd: path.dirname(apkSignerJar)
|
|
50
|
+
cwd: path.dirname(apkSignerJar), windowsVerbatimArguments: system.isWindows()
|
|
51
51
|
});
|
|
52
52
|
for (let [name, stream] of [['stdout', stdout], ['stderr', stderr]]) {
|
|
53
53
|
if (!_.trim(stream)) {
|
|
@@ -132,7 +132,7 @@ apkSigningMethods.signWithCustomCert = async function signWithCustomCert (apk) {
|
|
|
132
132
|
'-keypass', this.keyPassword,
|
|
133
133
|
apk, this.keyAlias];
|
|
134
134
|
log.debug(`Starting jarsigner: ${util.quote(fullCmd)}`);
|
|
135
|
-
await exec(fullCmd[0], fullCmd.slice(1));
|
|
135
|
+
await exec(fullCmd[0], fullCmd.slice(1), { windowsVerbatimArguments: system.isWindows() });
|
|
136
136
|
} catch (e) {
|
|
137
137
|
throw new Error(`Could not sign with custom certificate. ` +
|
|
138
138
|
`Original error: ${e.stderr || e.message}`);
|
|
@@ -337,7 +337,7 @@ apkSigningMethods.getKeystoreHash = async function getKeystoreHash () {
|
|
|
337
337
|
];
|
|
338
338
|
log.info(`Running '${keytool}' with arguments: ${util.quote(args)}`);
|
|
339
339
|
try {
|
|
340
|
-
const {stdout} = await exec(keytool, args);
|
|
340
|
+
const {stdout} = await exec(keytool, args, { windowsVerbatimArguments: system.isWindows() });
|
|
341
341
|
const result = {};
|
|
342
342
|
for (const hashName of [SHA512, SHA256, SHA1, MD5]) {
|
|
343
343
|
const hashRe = new RegExp(`^\\s*${hashName}:\\s*([a-f0-9:]+)`, 'mi');
|
package/lib/tools/apk-utils.js
CHANGED
|
@@ -15,8 +15,7 @@ import os from 'os';
|
|
|
15
15
|
import LRU from 'lru-cache';
|
|
16
16
|
import ApkReader from 'adbkit-apkreader';
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
let apkUtilsMethods = {};
|
|
18
|
+
const apkUtilsMethods = {};
|
|
20
19
|
|
|
21
20
|
const ACTIVITIES_TROUBLESHOOTING_LINK =
|
|
22
21
|
'https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/android/activity-startup.md';
|
|
@@ -460,8 +459,8 @@ apkUtilsMethods.cacheApk = async function cacheApk (apkPath, options = {}) {
|
|
|
460
459
|
log.info(`The application at '${apkPath}' is already cached to '${remotePath}'`);
|
|
461
460
|
// Update the application timestamp asynchronously in order to bump its position
|
|
462
461
|
// in the sorted ls output
|
|
463
|
-
|
|
464
|
-
|
|
462
|
+
// eslint-disable-next-line promise/prefer-await-to-then
|
|
463
|
+
this.shell(['touch', '-am', remotePath]).catch(() => {});
|
|
465
464
|
} else {
|
|
466
465
|
log.info(`Caching the application at '${apkPath}' to '${remotePath}'`);
|
|
467
466
|
const timer = new timing.Timer().start();
|
|
@@ -476,7 +475,7 @@ apkUtilsMethods.cacheApk = async function cacheApk (apkPath, options = {}) {
|
|
|
476
475
|
});
|
|
477
476
|
}
|
|
478
477
|
// Cleanup the invalid entries from the cache
|
|
479
|
-
_.difference(this.remoteAppsCache.keys(), remoteCachedFiles.map(toHash))
|
|
478
|
+
_.difference([...this.remoteAppsCache.keys()], remoteCachedFiles.map(toHash))
|
|
480
479
|
.forEach((hash) => this.remoteAppsCache.del(hash));
|
|
481
480
|
// Bump the cache record for the recently cached item
|
|
482
481
|
this.remoteAppsCache.set(appHash, remotePath);
|
|
@@ -484,7 +483,7 @@ apkUtilsMethods.cacheApk = async function cacheApk (apkPath, options = {}) {
|
|
|
484
483
|
const entriesToCleanup = remoteCachedFiles
|
|
485
484
|
.map((x) => path.posix.join(REMOTE_CACHE_ROOT, x))
|
|
486
485
|
.filter((x) => !this.remoteAppsCache.has(toHash(x)))
|
|
487
|
-
.slice(this.remoteAppsCacheLimit - this.remoteAppsCache.keys().length);
|
|
486
|
+
.slice(this.remoteAppsCacheLimit - [...this.remoteAppsCache.keys()].length);
|
|
488
487
|
if (!_.isEmpty(entriesToCleanup)) {
|
|
489
488
|
try {
|
|
490
489
|
await this.shell(['rm', '-f', ...entriesToCleanup]);
|
package/lib/tools/apks-utils.js
CHANGED
|
@@ -19,12 +19,14 @@ const APKS_CACHE = new LRU({
|
|
|
19
19
|
const APKS_CACHE_GUARD = new AsyncLock();
|
|
20
20
|
const BUNDLETOOL_TIMEOUT_MS = 4 * 60 * 1000;
|
|
21
21
|
|
|
22
|
+
const apksUtilsMethods = {};
|
|
23
|
+
|
|
22
24
|
process.on('exit', () => {
|
|
23
|
-
if (APKS_CACHE.
|
|
25
|
+
if (!APKS_CACHE.size) {
|
|
24
26
|
return;
|
|
25
27
|
}
|
|
26
28
|
|
|
27
|
-
const paths = APKS_CACHE.values();
|
|
29
|
+
const paths = [...APKS_CACHE.values()];
|
|
28
30
|
log.debug(`Performing cleanup of ${paths.length} cached .apks ` +
|
|
29
31
|
util.pluralize('package', paths.length));
|
|
30
32
|
for (const appPath of paths) {
|
|
@@ -83,8 +85,6 @@ async function extractFromApks (apks, dstPath) {
|
|
|
83
85
|
});
|
|
84
86
|
}
|
|
85
87
|
|
|
86
|
-
let apksUtilsMethods = {};
|
|
87
|
-
|
|
88
88
|
/**
|
|
89
89
|
* Executes bundletool utility with given arguments and returns the actual stdout
|
|
90
90
|
*
|
|
@@ -271,7 +271,7 @@ apksUtilsMethods.extractLanguageApk = async function extractLanguageApk (apks, l
|
|
|
271
271
|
return await this.extractBaseApk(apks);
|
|
272
272
|
};
|
|
273
273
|
|
|
274
|
-
apksUtilsMethods.isTestPackageOnlyError = function (output) {
|
|
274
|
+
apksUtilsMethods.isTestPackageOnlyError = function isTestPackageOnlyError (output) {
|
|
275
275
|
return /\[INSTALL_FAILED_TEST_ONLY\]/.test(output);
|
|
276
276
|
};
|
|
277
277
|
|
package/lib/tools/index.js
CHANGED
|
@@ -4,6 +4,7 @@ import systemCallMethods, { getAndroidBinaryPath } from './system-calls.js';
|
|
|
4
4
|
import apkSigningMethods from './apk-signing.js';
|
|
5
5
|
import apkUtilsMethods from './apk-utils.js';
|
|
6
6
|
import apksUtilsMethods from './apks-utils.js';
|
|
7
|
+
import aabUtilsMethods from './aab-utils.js';
|
|
7
8
|
import emuMethods from './adb-emu-commands.js';
|
|
8
9
|
import settingsClientCommands from './settings-client-commands';
|
|
9
10
|
import lockManagementCommands from './lockmgmt';
|
|
@@ -17,6 +18,7 @@ Object.assign(
|
|
|
17
18
|
apkSigningMethods,
|
|
18
19
|
apkUtilsMethods,
|
|
19
20
|
apksUtilsMethods,
|
|
21
|
+
aabUtilsMethods,
|
|
20
22
|
settingsClientCommands,
|
|
21
23
|
lockManagementCommands,
|
|
22
24
|
keyboardCommands,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "appium-adb",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.2.1",
|
|
4
4
|
"description": "Android Debug Bridge interface",
|
|
5
5
|
"main": "./build/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -49,9 +49,9 @@
|
|
|
49
49
|
"async-lock": "^1.0.0",
|
|
50
50
|
"asyncbox": "^2.6.0",
|
|
51
51
|
"bluebird": "^3.4.7",
|
|
52
|
-
"ini": "^
|
|
52
|
+
"ini": "^3.0.0",
|
|
53
53
|
"lodash": "^4.0.0",
|
|
54
|
-
"lru-cache": "^
|
|
54
|
+
"lru-cache": "^7.3.0",
|
|
55
55
|
"semver": "^7.0.0",
|
|
56
56
|
"source-map-support": "^0.x",
|
|
57
57
|
"teen_process": "^1.11.0",
|
|
@@ -67,18 +67,16 @@
|
|
|
67
67
|
"@appium/test-support": "^1.0.0",
|
|
68
68
|
"@babel/core": "^7.16.0",
|
|
69
69
|
"@babel/eslint-parser": "^7.16.3",
|
|
70
|
+
"@semantic-release/git": "^10.0.1",
|
|
70
71
|
"chai": "^4.1.0",
|
|
71
72
|
"chai-as-promised": "^7.1.1",
|
|
72
|
-
"eslint": "^7.32.0",
|
|
73
|
-
"eslint-plugin-import": "^2.25.3",
|
|
74
|
-
"eslint-plugin-mocha": "^9.0.0",
|
|
75
|
-
"eslint-plugin-promise": "^6.0.0",
|
|
76
73
|
"gulp": "^4.0.0",
|
|
77
74
|
"mocha": "^9.0.0",
|
|
78
75
|
"mocha-junit-reporter": "^2.0.0",
|
|
79
76
|
"mocha-multi-reporters": "^1.1.7",
|
|
80
77
|
"pre-commit": "^1.1.3",
|
|
81
|
-
"
|
|
78
|
+
"semantic-release": "^19.0.2",
|
|
79
|
+
"sinon": "^13.0.0",
|
|
82
80
|
"temp": "^0.x"
|
|
83
81
|
}
|
|
84
82
|
}
|
package/lib/.DS_Store
DELETED
|
Binary file
|