appium-adb 9.0.0 → 9.1.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/README.md CHANGED
@@ -3,8 +3,6 @@ appium-adb
3
3
 
4
4
  [![NPM version](http://img.shields.io/npm/v/appium-adb.svg)](https://npmjs.org/package/appium-adb)
5
5
  [![Downloads](http://img.shields.io/npm/dm/appium-adb.svg)](https://npmjs.org/package/appium-adb)
6
- [![Dependency Status](https://david-dm.org/appium/appium-adb.svg)](https://david-dm.org/appium/appium-adb)
7
- [![devDependency Status](https://david-dm.org/appium/appium-adb/dev-status.svg)](https://david-dm.org/appium/appium-adb#info=devDependencies)
8
6
 
9
7
  [![Build Status](https://api.travis-ci.org/appium/appium-adb.png?branch=master)](https://travis-ci.org/appium/appium-adb)
10
8
 
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+
10
+ require("source-map-support/register");
11
+
12
+ var _logger = _interopRequireDefault(require("../logger.js"));
13
+
14
+ var _path = _interopRequireDefault(require("path"));
15
+
16
+ var _support = require("@appium/support");
17
+
18
+ var _lruCache = _interopRequireDefault(require("lru-cache"));
19
+
20
+ var _helpers = require("../helpers.js");
21
+
22
+ var _asyncLock = _interopRequireDefault(require("async-lock"));
23
+
24
+ var _bluebird = _interopRequireDefault(require("bluebird"));
25
+
26
+ var _crypto = _interopRequireDefault(require("crypto"));
27
+
28
+ const AAB_CACHE = new _lruCache.default({
29
+ max: 10,
30
+ dispose: (hash, extractedFilesRoot) => _support.fs.rimraf(extractedFilesRoot)
31
+ });
32
+ const AAB_CACHE_GUARD = new _asyncLock.default();
33
+ const UNIVERSAL_APK = 'universal.apk';
34
+ const aabUtilsMethods = {};
35
+ process.on('exit', () => {
36
+ if (!AAB_CACHE.size) {
37
+ return;
38
+ }
39
+
40
+ const paths = [...AAB_CACHE.values()];
41
+
42
+ _logger.default.debug(`Performing cleanup of ${paths.length} cached .aab ` + _support.util.pluralize('package', paths.length));
43
+
44
+ for (const appPath of paths) {
45
+ try {
46
+ _support.fs.rimrafSync(appPath);
47
+ } catch (e) {
48
+ _logger.default.warn(e.message);
49
+ }
50
+ }
51
+ });
52
+
53
+ aabUtilsMethods.extractUniversalApk = async function extractUniversalApk(aabPath, opts = {}) {
54
+ if (!(await _support.fs.exists(aabPath))) {
55
+ throw new Error(`The file at '${aabPath}' either does not exist or is not accessible`);
56
+ }
57
+
58
+ const aabName = _path.default.basename(aabPath);
59
+
60
+ const apkName = aabName.substring(0, aabName.length - _path.default.extname(aabName).length) + '.apk';
61
+ const tmpRoot = await _support.tempDir.openDir();
62
+
63
+ const tmpApksPath = _path.default.join(tmpRoot, `${aabName}.apks`);
64
+
65
+ try {
66
+ return await AAB_CACHE_GUARD.acquire(aabPath, async () => {
67
+ const aabHash = await _support.fs.hash(aabPath);
68
+ const {
69
+ keystore,
70
+ keystorePassword,
71
+ keyAlias,
72
+ keyPassword
73
+ } = opts;
74
+ let cacheHash = aabHash;
75
+
76
+ if (keystore) {
77
+ if (!(await _support.fs.exists(keystore))) {
78
+ throw new Error(`The keystore file at '${keystore}' either does not exist ` + `or is not accessible`);
79
+ }
80
+
81
+ if (!keystorePassword || !keyAlias || !keyPassword) {
82
+ throw new Error('It is mandatory to also provide keystore password, key alias, ' + 'and key password if the keystore path is set');
83
+ }
84
+
85
+ const keystoreHash = await _support.fs.hash(keystore);
86
+
87
+ const keyAliasHash = _crypto.default.createHash('sha1');
88
+
89
+ keyAliasHash.update(keyAlias);
90
+ cacheHash = [cacheHash, keystoreHash, keyAliasHash.digest('hex')].join(':');
91
+ }
92
+
93
+ _logger.default.debug(`Calculated the cache key for '${aabPath}': ${cacheHash}`);
94
+
95
+ if (AAB_CACHE.has(cacheHash)) {
96
+ const resultPath = _path.default.resolve(AAB_CACHE.get(cacheHash), apkName);
97
+
98
+ if (await _support.fs.exists(resultPath)) {
99
+ return resultPath;
100
+ }
101
+
102
+ AAB_CACHE.del(cacheHash);
103
+ }
104
+
105
+ await this.initAapt2();
106
+ const args = ['build-apks', '--aapt2', this.binaries.aapt2, '--bundle', aabPath, '--output', tmpApksPath, ...(keystore ? ['--ks', keystore, '--ks-pass', `pass:${keystorePassword}`, '--ks-key-alias', keyAlias, '--key-pass', `pass:${keyPassword}`] : []), '--mode=universal'];
107
+
108
+ _logger.default.debug(`Preparing universal .apks bundle from '${aabPath}'`);
109
+
110
+ await this.execBundletool(args, `Cannot build a universal .apks bundle from '${aabPath}'`);
111
+
112
+ _logger.default.debug(`Unpacking universal application bundle at '${tmpApksPath}' to '${tmpRoot}'`);
113
+
114
+ await (0, _helpers.unzipFile)(tmpApksPath, tmpRoot);
115
+ let universalApkPath;
116
+ const fileDeletionPromises = [];
117
+ const allFileNames = await _support.fs.readdir(tmpRoot);
118
+
119
+ for (const fileName of allFileNames) {
120
+ const fullPath = _path.default.join(tmpRoot, fileName);
121
+
122
+ if (fileName === UNIVERSAL_APK) {
123
+ universalApkPath = fullPath;
124
+ } else {
125
+ fileDeletionPromises.push(_support.fs.rimraf(fullPath));
126
+ }
127
+ }
128
+
129
+ try {
130
+ await _bluebird.default.all(fileDeletionPromises);
131
+ } catch (ign) {}
132
+
133
+ if (!universalApkPath) {
134
+ _logger.default.debug(`The following items were extracted from the .aab bundle: ${allFileNames}`);
135
+
136
+ throw new Error(`${UNIVERSAL_APK} cannot be found in '${aabPath}' bundle. ` + `Does the archive contain a valid application bundle?`);
137
+ }
138
+
139
+ const resultPath = _path.default.join(tmpRoot, apkName);
140
+
141
+ _logger.default.debug(`Found ${UNIVERSAL_APK} at '${universalApkPath}'. Caching it to '${resultPath}'`);
142
+
143
+ await _support.fs.mv(universalApkPath, resultPath);
144
+ AAB_CACHE.set(cacheHash, tmpRoot);
145
+ return resultPath;
146
+ });
147
+ } catch (e) {
148
+ await _support.fs.rimraf(tmpRoot);
149
+ throw e;
150
+ }
151
+ };
152
+
153
+ var _default = aabUtilsMethods;
154
+ exports.default = _default;require('source-map-support').install();
155
+
156
+
157
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9hYWItdXRpbHMuanMiXSwibmFtZXMiOlsiQUFCX0NBQ0hFIiwiTFJVIiwibWF4IiwiZGlzcG9zZSIsImhhc2giLCJleHRyYWN0ZWRGaWxlc1Jvb3QiLCJmcyIsInJpbXJhZiIsIkFBQl9DQUNIRV9HVUFSRCIsIkFzeW5jTG9jayIsIlVOSVZFUlNBTF9BUEsiLCJhYWJVdGlsc01ldGhvZHMiLCJwcm9jZXNzIiwib24iLCJzaXplIiwicGF0aHMiLCJ2YWx1ZXMiLCJsb2ciLCJkZWJ1ZyIsImxlbmd0aCIsInV0aWwiLCJwbHVyYWxpemUiLCJhcHBQYXRoIiwicmltcmFmU3luYyIsImUiLCJ3YXJuIiwibWVzc2FnZSIsImV4dHJhY3RVbml2ZXJzYWxBcGsiLCJhYWJQYXRoIiwib3B0cyIsImV4aXN0cyIsIkVycm9yIiwiYWFiTmFtZSIsInBhdGgiLCJiYXNlbmFtZSIsImFwa05hbWUiLCJzdWJzdHJpbmciLCJleHRuYW1lIiwidG1wUm9vdCIsInRlbXBEaXIiLCJvcGVuRGlyIiwidG1wQXBrc1BhdGgiLCJqb2luIiwiYWNxdWlyZSIsImFhYkhhc2giLCJrZXlzdG9yZSIsImtleXN0b3JlUGFzc3dvcmQiLCJrZXlBbGlhcyIsImtleVBhc3N3b3JkIiwiY2FjaGVIYXNoIiwia2V5c3RvcmVIYXNoIiwia2V5QWxpYXNIYXNoIiwiY3J5cHRvIiwiY3JlYXRlSGFzaCIsInVwZGF0ZSIsImRpZ2VzdCIsImhhcyIsInJlc3VsdFBhdGgiLCJyZXNvbHZlIiwiZ2V0IiwiZGVsIiwiaW5pdEFhcHQyIiwiYXJncyIsImJpbmFyaWVzIiwiYWFwdDIiLCJleGVjQnVuZGxldG9vbCIsInVuaXZlcnNhbEFwa1BhdGgiLCJmaWxlRGVsZXRpb25Qcm9taXNlcyIsImFsbEZpbGVOYW1lcyIsInJlYWRkaXIiLCJmaWxlTmFtZSIsImZ1bGxQYXRoIiwicHVzaCIsIkIiLCJhbGwiLCJpZ24iLCJtdiIsInNldCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxTQUFTLEdBQUcsSUFBSUMsaUJBQUosQ0FBUTtBQUN4QkMsRUFBQUEsR0FBRyxFQUFFLEVBRG1CO0FBRXhCQyxFQUFBQSxPQUFPLEVBQUUsQ0FBQ0MsSUFBRCxFQUFPQyxrQkFBUCxLQUE4QkMsWUFBR0MsTUFBSCxDQUFVRixrQkFBVjtBQUZmLENBQVIsQ0FBbEI7QUFJQSxNQUFNRyxlQUFlLEdBQUcsSUFBSUMsa0JBQUosRUFBeEI7QUFDQSxNQUFNQyxhQUFhLEdBQUcsZUFBdEI7QUFFQSxNQUFNQyxlQUFlLEdBQUcsRUFBeEI7QUFFQUMsT0FBTyxDQUFDQyxFQUFSLENBQVcsTUFBWCxFQUFtQixNQUFNO0FBQ3ZCLE1BQUksQ0FBQ2IsU0FBUyxDQUFDYyxJQUFmLEVBQXFCO0FBQ25CO0FBQ0Q7O0FBRUQsUUFBTUMsS0FBSyxHQUFHLENBQUMsR0FBR2YsU0FBUyxDQUFDZ0IsTUFBVixFQUFKLENBQWQ7O0FBQ0FDLGtCQUFJQyxLQUFKLENBQVcseUJBQXdCSCxLQUFLLENBQUNJLE1BQU8sZUFBdEMsR0FDUkMsY0FBS0MsU0FBTCxDQUFlLFNBQWYsRUFBMEJOLEtBQUssQ0FBQ0ksTUFBaEMsQ0FERjs7QUFFQSxPQUFLLE1BQU1HLE9BQVgsSUFBc0JQLEtBQXRCLEVBQTZCO0FBQzNCLFFBQUk7QUFFRlQsa0JBQUdpQixVQUFILENBQWNELE9BQWQ7QUFDRCxLQUhELENBR0UsT0FBT0UsQ0FBUCxFQUFVO0FBQ1ZQLHNCQUFJUSxJQUFKLENBQVNELENBQUMsQ0FBQ0UsT0FBWDtBQUNEO0FBQ0Y7QUFDRixDQWhCRDs7QUErQ0FmLGVBQWUsQ0FBQ2dCLG1CQUFoQixHQUFzQyxlQUFlQSxtQkFBZixDQUFvQ0MsT0FBcEMsRUFBNkNDLElBQUksR0FBRyxFQUFwRCxFQUF3RDtBQUM1RixNQUFJLEVBQUMsTUFBTXZCLFlBQUd3QixNQUFILENBQVVGLE9BQVYsQ0FBUCxDQUFKLEVBQStCO0FBQzdCLFVBQU0sSUFBSUcsS0FBSixDQUFXLGdCQUFlSCxPQUFRLDhDQUFsQyxDQUFOO0FBQ0Q7O0FBRUQsUUFBTUksT0FBTyxHQUFHQyxjQUFLQyxRQUFMLENBQWNOLE9BQWQsQ0FBaEI7O0FBQ0EsUUFBTU8sT0FBTyxHQUFHSCxPQUFPLENBQUNJLFNBQVIsQ0FBa0IsQ0FBbEIsRUFBcUJKLE9BQU8sQ0FBQ2IsTUFBUixHQUFpQmMsY0FBS0ksT0FBTCxDQUFhTCxPQUFiLEVBQXNCYixNQUE1RCxJQUFzRSxNQUF0RjtBQUNBLFFBQU1tQixPQUFPLEdBQUcsTUFBTUMsaUJBQVFDLE9BQVIsRUFBdEI7O0FBQ0EsUUFBTUMsV0FBVyxHQUFHUixjQUFLUyxJQUFMLENBQVVKLE9BQVYsRUFBb0IsR0FBRU4sT0FBUSxPQUE5QixDQUFwQjs7QUFDQSxNQUFJO0FBQ0YsV0FBTyxNQUFNeEIsZUFBZSxDQUFDbUMsT0FBaEIsQ0FBd0JmLE9BQXhCLEVBQWlDLFlBQVk7QUFDeEQsWUFBTWdCLE9BQU8sR0FBRyxNQUFNdEMsWUFBR0YsSUFBSCxDQUFRd0IsT0FBUixDQUF0QjtBQUNBLFlBQU07QUFDSmlCLFFBQUFBLFFBREk7QUFFSkMsUUFBQUEsZ0JBRkk7QUFHSkMsUUFBQUEsUUFISTtBQUlKQyxRQUFBQTtBQUpJLFVBS0ZuQixJQUxKO0FBTUEsVUFBSW9CLFNBQVMsR0FBR0wsT0FBaEI7O0FBQ0EsVUFBSUMsUUFBSixFQUFjO0FBQ1osWUFBSSxFQUFDLE1BQU12QyxZQUFHd0IsTUFBSCxDQUFVZSxRQUFWLENBQVAsQ0FBSixFQUFnQztBQUM5QixnQkFBTSxJQUFJZCxLQUFKLENBQVcseUJBQXdCYyxRQUFTLDBCQUFsQyxHQUNiLHNCQURHLENBQU47QUFFRDs7QUFDRCxZQUFJLENBQUNDLGdCQUFELElBQXFCLENBQUNDLFFBQXRCLElBQWtDLENBQUNDLFdBQXZDLEVBQW9EO0FBQ2xELGdCQUFNLElBQUlqQixLQUFKLENBQVUsbUVBQ2QsOENBREksQ0FBTjtBQUVEOztBQUNELGNBQU1tQixZQUFZLEdBQUcsTUFBTTVDLFlBQUdGLElBQUgsQ0FBUXlDLFFBQVIsQ0FBM0I7O0FBQ0EsY0FBTU0sWUFBWSxHQUFHQyxnQkFBT0MsVUFBUCxDQUFrQixNQUFsQixDQUFyQjs7QUFDQUYsUUFBQUEsWUFBWSxDQUFDRyxNQUFiLENBQW9CUCxRQUFwQjtBQUNBRSxRQUFBQSxTQUFTLEdBQUcsQ0FBQ0EsU0FBRCxFQUFZQyxZQUFaLEVBQTBCQyxZQUFZLENBQUNJLE1BQWIsQ0FBb0IsS0FBcEIsQ0FBMUIsRUFBc0RiLElBQXRELENBQTJELEdBQTNELENBQVo7QUFDRDs7QUFDRHpCLHNCQUFJQyxLQUFKLENBQVcsaUNBQWdDVSxPQUFRLE1BQUtxQixTQUFVLEVBQWxFOztBQUNBLFVBQUlqRCxTQUFTLENBQUN3RCxHQUFWLENBQWNQLFNBQWQsQ0FBSixFQUE4QjtBQUM1QixjQUFNUSxVQUFVLEdBQUd4QixjQUFLeUIsT0FBTCxDQUFhMUQsU0FBUyxDQUFDMkQsR0FBVixDQUFjVixTQUFkLENBQWIsRUFBdUNkLE9BQXZDLENBQW5COztBQUNBLFlBQUksTUFBTTdCLFlBQUd3QixNQUFILENBQVUyQixVQUFWLENBQVYsRUFBaUM7QUFDL0IsaUJBQU9BLFVBQVA7QUFDRDs7QUFDRHpELFFBQUFBLFNBQVMsQ0FBQzRELEdBQVYsQ0FBY1gsU0FBZDtBQUNEOztBQUVELFlBQU0sS0FBS1ksU0FBTCxFQUFOO0FBQ0EsWUFBTUMsSUFBSSxHQUFHLENBQ1gsWUFEVyxFQUVYLFNBRlcsRUFFQSxLQUFLQyxRQUFMLENBQWNDLEtBRmQsRUFHWCxVQUhXLEVBR0NwQyxPQUhELEVBSVgsVUFKVyxFQUlDYSxXQUpELEVBS1gsSUFBSUksUUFBUSxHQUFHLENBQ2IsTUFEYSxFQUNMQSxRQURLLEVBRWIsV0FGYSxFQUVDLFFBQU9DLGdCQUFpQixFQUZ6QixFQUdiLGdCQUhhLEVBR0tDLFFBSEwsRUFJYixZQUphLEVBSUUsUUFBT0MsV0FBWSxFQUpyQixDQUFILEdBS1IsRUFMSixDQUxXLEVBV1gsa0JBWFcsQ0FBYjs7QUFhQS9CLHNCQUFJQyxLQUFKLENBQVcsMENBQXlDVSxPQUFRLEdBQTVEOztBQUNBLFlBQU0sS0FBS3FDLGNBQUwsQ0FBb0JILElBQXBCLEVBQTJCLCtDQUE4Q2xDLE9BQVEsR0FBakYsQ0FBTjs7QUFFQVgsc0JBQUlDLEtBQUosQ0FBVyw4Q0FBNkN1QixXQUFZLFNBQVFILE9BQVEsR0FBcEY7O0FBQ0EsWUFBTSx3QkFBVUcsV0FBVixFQUF1QkgsT0FBdkIsQ0FBTjtBQUNBLFVBQUk0QixnQkFBSjtBQUNBLFlBQU1DLG9CQUFvQixHQUFHLEVBQTdCO0FBQ0EsWUFBTUMsWUFBWSxHQUFHLE1BQU05RCxZQUFHK0QsT0FBSCxDQUFXL0IsT0FBWCxDQUEzQjs7QUFDQSxXQUFLLE1BQU1nQyxRQUFYLElBQXVCRixZQUF2QixFQUFxQztBQUNuQyxjQUFNRyxRQUFRLEdBQUd0QyxjQUFLUyxJQUFMLENBQVVKLE9BQVYsRUFBbUJnQyxRQUFuQixDQUFqQjs7QUFDQSxZQUFJQSxRQUFRLEtBQUs1RCxhQUFqQixFQUFnQztBQUM5QndELFVBQUFBLGdCQUFnQixHQUFHSyxRQUFuQjtBQUNELFNBRkQsTUFFTztBQUNMSixVQUFBQSxvQkFBb0IsQ0FBQ0ssSUFBckIsQ0FBMEJsRSxZQUFHQyxNQUFILENBQVVnRSxRQUFWLENBQTFCO0FBQ0Q7QUFDRjs7QUFDRCxVQUFJO0FBQ0YsY0FBTUUsa0JBQUVDLEdBQUYsQ0FBTVAsb0JBQU4sQ0FBTjtBQUNELE9BRkQsQ0FFRSxPQUFPUSxHQUFQLEVBQVksQ0FBRTs7QUFDaEIsVUFBSSxDQUFDVCxnQkFBTCxFQUF1QjtBQUNyQmpELHdCQUFJQyxLQUFKLENBQVcsNERBQTJEa0QsWUFBYSxFQUFuRjs7QUFDQSxjQUFNLElBQUlyQyxLQUFKLENBQVcsR0FBRXJCLGFBQWMsd0JBQXVCa0IsT0FBUSxZQUFoRCxHQUNiLHNEQURHLENBQU47QUFFRDs7QUFDRCxZQUFNNkIsVUFBVSxHQUFHeEIsY0FBS1MsSUFBTCxDQUFVSixPQUFWLEVBQW1CSCxPQUFuQixDQUFuQjs7QUFDQWxCLHNCQUFJQyxLQUFKLENBQVcsU0FBUVIsYUFBYyxRQUFPd0QsZ0JBQWlCLHFCQUFvQlQsVUFBVyxHQUF4Rjs7QUFDQSxZQUFNbkQsWUFBR3NFLEVBQUgsQ0FBTVYsZ0JBQU4sRUFBd0JULFVBQXhCLENBQU47QUFDQXpELE1BQUFBLFNBQVMsQ0FBQzZFLEdBQVYsQ0FBYzVCLFNBQWQsRUFBeUJYLE9BQXpCO0FBQ0EsYUFBT21CLFVBQVA7QUFDRCxLQTNFWSxDQUFiO0FBNEVELEdBN0VELENBNkVFLE9BQU9qQyxDQUFQLEVBQVU7QUFDVixVQUFNbEIsWUFBR0MsTUFBSCxDQUFVK0IsT0FBVixDQUFOO0FBQ0EsVUFBTWQsQ0FBTjtBQUNEO0FBQ0YsQ0ExRkQ7O2VBNEZlYixlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBmcywgdGVtcERpciwgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgTFJVIGZyb20gJ2xydS1jYWNoZSc7XG5pbXBvcnQgeyB1bnppcEZpbGUgfSBmcm9tICcuLi9oZWxwZXJzLmpzJztcbmltcG9ydCBBc3luY0xvY2sgZnJvbSAnYXN5bmMtbG9jayc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5cbmNvbnN0IEFBQl9DQUNIRSA9IG5ldyBMUlUoe1xuICBtYXg6IDEwLFxuICBkaXNwb3NlOiAoaGFzaCwgZXh0cmFjdGVkRmlsZXNSb290KSA9PiBmcy5yaW1yYWYoZXh0cmFjdGVkRmlsZXNSb290KSxcbn0pO1xuY29uc3QgQUFCX0NBQ0hFX0dVQVJEID0gbmV3IEFzeW5jTG9jaygpO1xuY29uc3QgVU5JVkVSU0FMX0FQSyA9ICd1bml2ZXJzYWwuYXBrJztcblxuY29uc3QgYWFiVXRpbHNNZXRob2RzID0ge307XG5cbnByb2Nlc3Mub24oJ2V4aXQnLCAoKSA9PiB7XG4gIGlmICghQUFCX0NBQ0hFLnNpemUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYXRocyA9IFsuLi5BQUJfQ0FDSEUudmFsdWVzKCldO1xuICBsb2cuZGVidWcoYFBlcmZvcm1pbmcgY2xlYW51cCBvZiAke3BhdGhzLmxlbmd0aH0gY2FjaGVkIC5hYWIgYCArXG4gICAgdXRpbC5wbHVyYWxpemUoJ3BhY2thZ2UnLCBwYXRocy5sZW5ndGgpKTtcbiAgZm9yIChjb25zdCBhcHBQYXRoIG9mIHBhdGhzKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEFzeW5jaHJvbm91cyBjYWxscyBhcmUgbm90IHN1cHBvcnRlZCBpbiBvbkV4aXQgaGFuZGxlclxuICAgICAgZnMucmltcmFmU3luYyhhcHBQYXRoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cud2FybihlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxufSk7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQXBrQ3JlYXRpb25PcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30ga2V5c3RvcmUgU3BlY2lmaWVzIHRoZSBwYXRoIHRvIHRoZSBkZXBsb3ltZW50IGtleXN0b3JlIHVzZWRcbiAqIHRvIHNpZ24gdGhlIEFQS3MuIFRoaXMgZmxhZyBpcyBvcHRpb25hbC4gSWYgeW91IGRvbid0IGluY2x1ZGUgaXQsXG4gKiBidW5kbGV0b29sIGF0dGVtcHRzIHRvIHNpZ24geW91ciBBUEtzIHdpdGggYSBkZWJ1ZyBzaWduaW5nIGtleS5cbiAqIElmIHRoZSAuYXBrIGhhcyBiZWVuIGFscmVhZHkgc2lnbmVkIGFuZCBjYWNoZWQgdGhlbiBpdCBpcyBub3QgZ29pbmcgdG8gYmUgcmVzaWduZWRcbiAqIHVubGVzcyBhIGRpZmZlcmVudCBrZXlzdG9yZSBvciBrZXkgYWxpYXMgaXMgdXNlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBrZXlzdG9yZVBhc3N3b3JkIFNwZWNpZmllcyB5b3VyIGtleXN0b3Jl4oCZcyBwYXNzd29yZC5cbiAqIEl0IGlzIG1hbmRhdG9yeSB0byBwcm92aWRlIHRoaXMgdmFsdWUgaWYgYGtleXN0b3JlYCBvbmUgaXMgYXNzaWduZWRcbiAqIG90aGVyd2lzZSBpdCBpcyBnb2luZyB0byBiZSBpZ25vcmVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGtleUFsaWFzIFNwZWNpZmllcyB0aGUgYWxpYXMgb2YgdGhlIHNpZ25pbmcga2V5IHlvdSB3YW50IHRvIHVzZS5cbiAqIEl0IGlzIG1hbmRhdG9yeSB0byBwcm92aWRlIHRoaXMgdmFsdWUgaWYgYGtleXN0b3JlYCBvbmUgaXMgYXNzaWduZWRcbiAqIG90aGVyd2lzZSBpdCBpcyBnb2luZyB0byBiZSBpZ25vcmVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGtleVBhc3N3b3JkIFNwZWNpZmllcyB0aGUgcGFzc3dvcmQgZm9yIHRoZSBzaWduaW5nIGtleS5cbiAqIEl0IGlzIG1hbmRhdG9yeSB0byBwcm92aWRlIHRoaXMgdmFsdWUgaWYgYGtleXN0b3JlYCBvbmUgaXMgYXNzaWduZWRcbiAqIG90aGVyd2lzZSBpdCBpcyBnb2luZyB0byBiZSBpZ25vcmVkLlxuICovXG5cbi8qKlxuICogQnVpbGRzIGEgdW5pdmVyc2FsIC5hcGsgZnJvbSB0aGUgZ2l2ZW4gLmFhYiBwYWNrYWdlLiBTZWVcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3N0dWRpby9jb21tYW5kLWxpbmUvYnVuZGxldG9vbCNnZW5lcmF0ZV9hcGtzXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhYWJQYXRoIEZ1bGwgcGF0aCB0byB0aGUgc291cmNlIC5hYWIgcGFja2FnZVxuICogQHBhcmFtIHtBcGtDcmVhdGlvbk9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIFRoZSBwYXRoIHRvIHRoZSByZXN1bHRpbmcgdW5pdmVyc2FsIC5hcGsuIFRoZSAuYXBrIGlzIHN0b3JlZCBpbiB0aGUgaW50ZXJuYWwgY2FjaGVcbiAqIGJ5IGRlZmF1bHQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSB1bml2ZXJzYWwgLmFwa1xuICovXG5hYWJVdGlsc01ldGhvZHMuZXh0cmFjdFVuaXZlcnNhbEFwayA9IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RVbml2ZXJzYWxBcGsgKGFhYlBhdGgsIG9wdHMgPSB7fSkge1xuICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhhYWJQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGZpbGUgYXQgJyR7YWFiUGF0aH0nIGVpdGhlciBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYWNjZXNzaWJsZWApO1xuICB9XG5cbiAgY29uc3QgYWFiTmFtZSA9IHBhdGguYmFzZW5hbWUoYWFiUGF0aCk7XG4gIGNvbnN0IGFwa05hbWUgPSBhYWJOYW1lLnN1YnN0cmluZygwLCBhYWJOYW1lLmxlbmd0aCAtIHBhdGguZXh0bmFtZShhYWJOYW1lKS5sZW5ndGgpICsgJy5hcGsnO1xuICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gIGNvbnN0IHRtcEFwa3NQYXRoID0gcGF0aC5qb2luKHRtcFJvb3QsIGAke2FhYk5hbWV9LmFwa3NgKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgQUFCX0NBQ0hFX0dVQVJELmFjcXVpcmUoYWFiUGF0aCwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYWFiSGFzaCA9IGF3YWl0IGZzLmhhc2goYWFiUGF0aCk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGtleXN0b3JlLFxuICAgICAgICBrZXlzdG9yZVBhc3N3b3JkLFxuICAgICAgICBrZXlBbGlhcyxcbiAgICAgICAga2V5UGFzc3dvcmQsXG4gICAgICB9ID0gb3B0cztcbiAgICAgIGxldCBjYWNoZUhhc2ggPSBhYWJIYXNoO1xuICAgICAgaWYgKGtleXN0b3JlKSB7XG4gICAgICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKGtleXN0b3JlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGtleXN0b3JlIGZpbGUgYXQgJyR7a2V5c3RvcmV9JyBlaXRoZXIgZG9lcyBub3QgZXhpc3QgYCArXG4gICAgICAgICAgICBgb3IgaXMgbm90IGFjY2Vzc2libGVgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWtleXN0b3JlUGFzc3dvcmQgfHwgIWtleUFsaWFzIHx8ICFrZXlQYXNzd29yZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSXQgaXMgbWFuZGF0b3J5IHRvIGFsc28gcHJvdmlkZSBrZXlzdG9yZSBwYXNzd29yZCwga2V5IGFsaWFzLCAnICtcbiAgICAgICAgICAgICdhbmQga2V5IHBhc3N3b3JkIGlmIHRoZSBrZXlzdG9yZSBwYXRoIGlzIHNldCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtleXN0b3JlSGFzaCA9IGF3YWl0IGZzLmhhc2goa2V5c3RvcmUpO1xuICAgICAgICBjb25zdCBrZXlBbGlhc0hhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMScpO1xuICAgICAgICBrZXlBbGlhc0hhc2gudXBkYXRlKGtleUFsaWFzKTtcbiAgICAgICAgY2FjaGVIYXNoID0gW2NhY2hlSGFzaCwga2V5c3RvcmVIYXNoLCBrZXlBbGlhc0hhc2guZGlnZXN0KCdoZXgnKV0uam9pbignOicpO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKGBDYWxjdWxhdGVkIHRoZSBjYWNoZSBrZXkgZm9yICcke2FhYlBhdGh9JzogJHtjYWNoZUhhc2h9YCk7XG4gICAgICBpZiAoQUFCX0NBQ0hFLmhhcyhjYWNoZUhhc2gpKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdFBhdGggPSBwYXRoLnJlc29sdmUoQUFCX0NBQ0hFLmdldChjYWNoZUhhc2gpLCBhcGtOYW1lKTtcbiAgICAgICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhyZXN1bHRQYXRoKSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHRQYXRoO1xuICAgICAgICB9XG4gICAgICAgIEFBQl9DQUNIRS5kZWwoY2FjaGVIYXNoKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5pbml0QWFwdDIoKTtcbiAgICAgIGNvbnN0IGFyZ3MgPSBbXG4gICAgICAgICdidWlsZC1hcGtzJyxcbiAgICAgICAgJy0tYWFwdDInLCB0aGlzLmJpbmFyaWVzLmFhcHQyLFxuICAgICAgICAnLS1idW5kbGUnLCBhYWJQYXRoLFxuICAgICAgICAnLS1vdXRwdXQnLCB0bXBBcGtzUGF0aCxcbiAgICAgICAgLi4uKGtleXN0b3JlID8gW1xuICAgICAgICAgICctLWtzJywga2V5c3RvcmUsXG4gICAgICAgICAgJy0ta3MtcGFzcycsIGBwYXNzOiR7a2V5c3RvcmVQYXNzd29yZH1gLFxuICAgICAgICAgICctLWtzLWtleS1hbGlhcycsIGtleUFsaWFzLFxuICAgICAgICAgICctLWtleS1wYXNzJywgYHBhc3M6JHtrZXlQYXNzd29yZH1gLFxuICAgICAgICBdIDogW10pLFxuICAgICAgICAnLS1tb2RlPXVuaXZlcnNhbCdcbiAgICAgIF07XG4gICAgICBsb2cuZGVidWcoYFByZXBhcmluZyB1bml2ZXJzYWwgLmFwa3MgYnVuZGxlIGZyb20gJyR7YWFiUGF0aH0nYCk7XG4gICAgICBhd2FpdCB0aGlzLmV4ZWNCdW5kbGV0b29sKGFyZ3MsIGBDYW5ub3QgYnVpbGQgYSB1bml2ZXJzYWwgLmFwa3MgYnVuZGxlIGZyb20gJyR7YWFiUGF0aH0nYCk7XG5cbiAgICAgIGxvZy5kZWJ1ZyhgVW5wYWNraW5nIHVuaXZlcnNhbCBhcHBsaWNhdGlvbiBidW5kbGUgYXQgJyR7dG1wQXBrc1BhdGh9JyB0byAnJHt0bXBSb290fSdgKTtcbiAgICAgIGF3YWl0IHVuemlwRmlsZSh0bXBBcGtzUGF0aCwgdG1wUm9vdCk7XG4gICAgICBsZXQgdW5pdmVyc2FsQXBrUGF0aDtcbiAgICAgIGNvbnN0IGZpbGVEZWxldGlvblByb21pc2VzID0gW107XG4gICAgICBjb25zdCBhbGxGaWxlTmFtZXMgPSBhd2FpdCBmcy5yZWFkZGlyKHRtcFJvb3QpO1xuICAgICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBhbGxGaWxlTmFtZXMpIHtcbiAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4odG1wUm9vdCwgZmlsZU5hbWUpO1xuICAgICAgICBpZiAoZmlsZU5hbWUgPT09IFVOSVZFUlNBTF9BUEspIHtcbiAgICAgICAgICB1bml2ZXJzYWxBcGtQYXRoID0gZnVsbFBhdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmlsZURlbGV0aW9uUHJvbWlzZXMucHVzaChmcy5yaW1yYWYoZnVsbFBhdGgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgQi5hbGwoZmlsZURlbGV0aW9uUHJvbWlzZXMpO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgICAgaWYgKCF1bml2ZXJzYWxBcGtQYXRoKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgVGhlIGZvbGxvd2luZyBpdGVtcyB3ZXJlIGV4dHJhY3RlZCBmcm9tIHRoZSAuYWFiIGJ1bmRsZTogJHthbGxGaWxlTmFtZXN9YCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtVTklWRVJTQUxfQVBLfSBjYW5ub3QgYmUgZm91bmQgaW4gJyR7YWFiUGF0aH0nIGJ1bmRsZS4gYCArXG4gICAgICAgICAgYERvZXMgdGhlIGFyY2hpdmUgY29udGFpbiBhIHZhbGlkIGFwcGxpY2F0aW9uIGJ1bmRsZT9gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdFBhdGggPSBwYXRoLmpvaW4odG1wUm9vdCwgYXBrTmFtZSk7XG4gICAgICBsb2cuZGVidWcoYEZvdW5kICR7VU5JVkVSU0FMX0FQS30gYXQgJyR7dW5pdmVyc2FsQXBrUGF0aH0nLiBDYWNoaW5nIGl0IHRvICcke3Jlc3VsdFBhdGh9J2ApO1xuICAgICAgYXdhaXQgZnMubXYodW5pdmVyc2FsQXBrUGF0aCwgcmVzdWx0UGF0aCk7XG4gICAgICBBQUJfQ0FDSEUuc2V0KGNhY2hlSGFzaCwgdG1wUm9vdCk7XG4gICAgICByZXR1cm4gcmVzdWx0UGF0aDtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgICB0aHJvdyBlO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBhYWJVdGlsc01ldGhvZHM7XG4iXSwiZmlsZSI6ImxpYi90b29scy9hYWItdXRpbHMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
@@ -31,7 +31,7 @@ var _lruCache = _interopRequireDefault(require("lru-cache"));
31
31
 
32
32
  var _adbkitApkreader = _interopRequireDefault(require("adbkit-apkreader"));
33
33
 
34
- let apkUtilsMethods = {};
34
+ const apkUtilsMethods = {};
35
35
  const ACTIVITIES_TROUBLESHOOTING_LINK = 'https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/android/activity-startup.md';
36
36
  apkUtilsMethods.APP_INSTALL_STATE = {
37
37
  UNKNOWN: 'unknown',
@@ -383,10 +383,10 @@ apkUtilsMethods.cacheApk = async function cacheApk(apkPath, options = {}) {
383
383
  });
384
384
  }
385
385
 
386
- _lodash.default.difference(this.remoteAppsCache.keys(), remoteCachedFiles.map(toHash)).forEach(hash => this.remoteAppsCache.del(hash));
386
+ _lodash.default.difference([...this.remoteAppsCache.keys()], remoteCachedFiles.map(toHash)).forEach(hash => this.remoteAppsCache.del(hash));
387
387
 
388
388
  this.remoteAppsCache.set(appHash, remotePath);
389
- const entriesToCleanup = remoteCachedFiles.map(x => _path.default.posix.join(REMOTE_CACHE_ROOT, x)).filter(x => !this.remoteAppsCache.has(toHash(x))).slice(this.remoteAppsCacheLimit - this.remoteAppsCache.keys().length);
389
+ const entriesToCleanup = remoteCachedFiles.map(x => _path.default.posix.join(REMOTE_CACHE_ROOT, x)).filter(x => !this.remoteAppsCache.has(toHash(x))).slice(this.remoteAppsCacheLimit - [...this.remoteAppsCache.keys()].length);
390
390
 
391
391
  if (!_lodash.default.isEmpty(entriesToCleanup)) {
392
392
  try {
@@ -963,4 +963,4 @@ var _default = apkUtilsMethods;
963
963
  exports.default = _default;require('source-map-support').install();
964
964
 
965
965
 
966
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9hcGstdXRpbHMuanMiXSwibmFtZXMiOlsiYXBrVXRpbHNNZXRob2RzIiwiQUNUSVZJVElFU19UUk9VQkxFU0hPT1RJTkdfTElOSyIsIkFQUF9JTlNUQUxMX1NUQVRFIiwiVU5LTk9XTiIsIk5PVF9JTlNUQUxMRUQiLCJORVdFUl9WRVJTSU9OX0lOU1RBTExFRCIsIlNBTUVfVkVSU0lPTl9JTlNUQUxMRUQiLCJPTERFUl9WRVJTSU9OX0lOU1RBTExFRCIsIlJFTU9URV9DQUNIRV9ST09UIiwiaXNBcHBJbnN0YWxsZWQiLCJwa2ciLCJsb2ciLCJkZWJ1ZyIsImluc3RhbGxlZFBhdHRlcm4iLCJSZWdFeHAiLCJfIiwiZXNjYXBlUmVnRXhwIiwic3Rkb3V0Iiwic2hlbGwiLCJpc0luc3RhbGxlZCIsInRlc3QiLCJlIiwiRXJyb3IiLCJtZXNzYWdlIiwic3RhcnRVcmkiLCJ1cmkiLCJvcHRzIiwid2FpdEZvckxhdW5jaCIsImFyZ3MiLCJwdXNoIiwicmVzIiwidG9Mb3dlckNhc2UiLCJpbmNsdWRlcyIsInN0YXJ0QXBwIiwic3RhcnRBcHBPcHRpb25zIiwiYWN0aXZpdHkiLCJhY3Rpb24iLCJjbG9uZSIsInJlcGxhY2UiLCJkZWZhdWx0cyIsIndhaXRQa2ciLCJ3YWl0QWN0aXZpdHkiLCJyZXRyeSIsInN0b3BBcHAiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwiY21kIiwiaW50ZW50TmFtZSIsIm9wdGlvbmFsSW50ZW50QXJndW1lbnRzIiwic2hlbGxPcHRzIiwiaXNJbnRlZ2VyIiwid2FpdER1cmF0aW9uIiwidGltZW91dCIsInN0YXJ0c1dpdGgiLCJ3YWl0Rm9yQWN0aXZpdHkiLCJhcHBEZXNjcmlwdG9yIiwiZHVtcFdpbmRvd3MiLCJkdW1wc3lzQXJnIiwiZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSIsIm51bGxGb2N1c2VkQXBwUmUiLCJmb2N1c2VkQXBwUmUiLCJudWxsQ3VycmVudEZvY3VzUmUiLCJjdXJyZW50Rm9jdXNBcHBSZSIsInBhdHRlcm4iLCJtYXRjaCIsImV4ZWMiLCJhcHBQYWNrYWdlIiwidHJpbSIsImFwcEFjdGl2aXR5Iiwid2FpdEZvckFjdGl2aXR5T3JOb3QiLCJ3YWl0Rm9yU3RvcCIsIndhaXRNcyIsInNwbGl0TmFtZXMiLCJuYW1lcyIsInNwbGl0IiwibWFwIiwibmFtZSIsImFsbFBhY2thZ2VzIiwiYWxsQWN0aXZpdGllcyIsInBvc3NpYmxlQWN0aXZpdHlOYW1lcyIsIm9uZUFjdGl2aXR5IiwiY3VycmVudFBrZyIsImpvaW4iLCJwb3NzaWJsZUFjdGl2aXR5UGF0dGVybnMiLCJhY3ROYW1lIiwiY29uZGl0aW9uRnVuYyIsImZ1bGx5UXVhbGlmaWVkQWN0aXZpdHkiLCJpc0FjdGl2aXR5Rm91bmQiLCJzb21lIiwicCIsInBhcnNlSW50IiwiaW50ZXJ2YWxNcyIsImFjdCIsIndhaXRGb3JOb3RBY3Rpdml0eSIsInVuaW5zdGFsbEFwayIsIm9wdGlvbnMiLCJpbmZvIiwia2VlcERhdGEiLCJmb3JjZVN0b3AiLCJhZGJFeGVjIiwiaW5zdGFsbEZyb21EZXZpY2VQYXRoIiwiYXBrUGF0aE9uRGV2aWNlIiwiaW5kZXhPZiIsImNhY2hlQXBrIiwiYXBrUGF0aCIsImFwcEhhc2giLCJmcyIsImhhc2giLCJyZW1vdGVQYXRoIiwicGF0aCIsInBvc2l4IiwicmVtb3RlQ2FjaGVkRmlsZXMiLCJlcnJvck1hcmtlciIsImxzT3V0cHV0IiwiX2FyZUV4dGVuZGVkTHNPcHRpb25zU3VwcG9ydGVkIiwiaXNCb29sZWFuIiwiaXNTdHJpbmciLCJzdWJzdHJpbmciLCJ4IiwiZmlsdGVyIiwiQm9vbGVhbiIsImxlbmd0aCIsInRvSGFzaCIsInBhcnNlIiwiY2F0Y2giLCJ0aW1lciIsInRpbWluZyIsIlRpbWVyIiwic3RhcnQiLCJzaXplIiwic3RhdCIsImJhc2VuYW1lIiwidXRpbCIsInRvUmVhZGFibGVTaXplU3RyaW5nIiwiZ2V0RHVyYXRpb24iLCJhc01pbGxpU2Vjb25kcyIsInRvRml4ZWQiLCJyZW1vdGVBcHBzQ2FjaGUiLCJMUlUiLCJtYXgiLCJyZW1vdGVBcHBzQ2FjaGVMaW1pdCIsImRpZmZlcmVuY2UiLCJrZXlzIiwiZm9yRWFjaCIsImRlbCIsInNldCIsImVudHJpZXNUb0NsZWFudXAiLCJoYXMiLCJzbGljZSIsImlzRW1wdHkiLCJ3YXJuIiwiaW5zdGFsbCIsImFwcFBhdGgiLCJlbmRzV2l0aCIsIkFQS1NfRVhURU5TSU9OIiwiaW5zdGFsbEFwa3MiLCJjbG9uZURlZXAiLCJhZGJFeGVjVGltZW91dCIsIkRFRkFVTFRfQURCX0VYRUNfVElNRU9VVCIsIkFQS19JTlNUQUxMX1RJTUVPVVQiLCJ0aW1lb3V0Q2FwTmFtZSIsImluc3RhbGxBcmdzIiwibm9JbmNyZW1lbnRhbCIsImlzSW5jcmVtZW50YWxJbnN0YWxsU3VwcG9ydGVkIiwiaW5zdGFsbE9wdHMiLCJpbnN0YWxsQ21kIiwicGVyZm9ybUFwcEluc3RhbGwiLCJzaG91bGRDYWNoZUFwcCIsImlzU3RyZWFtZWRJbnN0YWxsU3VwcG9ydGVkIiwiY2xlYXJDYWNoZSIsImNhY2hlQXBwIiwiY2FjaGVkQXBwUGF0aCIsInBtSW5zdGFsbENtZEJ5UmVtb3RlUGF0aCIsIm91dHB1dCIsIm5ld0NhY2hlZEFwcFBhdGgiLCJ0cnVuY2F0ZWRPdXRwdXQiLCJzdWJzdHIiLCJpc1Rlc3RQYWNrYWdlT25seUVycm9yIiwibXNnIiwiZXJyIiwiZ2V0QXBwbGljYXRpb25JbnN0YWxsU3RhdGUiLCJhcGtJbmZvIiwiZ2V0QXBrSW5mbyIsInZlcnNpb25Db2RlIiwicGtnVmVyc2lvbkNvZGUiLCJ2ZXJzaW9uTmFtZSIsInBrZ1ZlcnNpb25OYW1lU3RyIiwiZ2V0UGFja2FnZUluZm8iLCJwa2dWZXJzaW9uTmFtZSIsInNlbXZlciIsInZhbGlkIiwiY29lcmNlIiwiYXBrVmVyc2lvbkNvZGUiLCJhcGtWZXJzaW9uTmFtZVN0ciIsImFwa1ZlcnNpb25OYW1lIiwic2F0aXNmaWVzIiwiaW5zdGFsbE9yVXBncmFkZSIsImVuZm9yY2VDdXJyZW50QnVpbGQiLCJhcHBTdGF0ZSIsIndhc1VuaW5zdGFsbGVkIiwidW5pbnN0YWxsUGFja2FnZSIsIk9iamVjdCIsImFzc2lnbiIsImV4dHJhY3RTdHJpbmdzRnJvbUFwayIsImxhbmd1YWdlIiwib3V0Iiwib3JpZ2luYWxBcHBQYXRoIiwiZXh0cmFjdExhbmd1YWdlQXBrIiwiYXBrU3RyaW5ncyIsImNvbmZpZ01hcmtlciIsImluaXRBYXB0IiwiYmluYXJpZXMiLCJhYXB0IiwidW5pcSIsIm9zIiwiRU9MIiwic3RkZXJyIiwiaW5pdEFhcHQyIiwiYWFwdDIiLCJsb2NhbFBhdGgiLCJyZXNvbHZlIiwid3JpdGVGaWxlIiwiSlNPTiIsInN0cmluZ2lmeSIsImdldERldmljZUxhbmd1YWdlIiwiZ2V0RGV2aWNlU3lzTGFuZ3VhZ2UiLCJnZXREZXZpY2VQcm9kdWN0TGFuZ3VhZ2UiLCJnZXREZXZpY2VMb2NhbGUiLCJnZXREZXZpY2VDb3VudHJ5IiwiY291bnRyeSIsImdldERldmljZVN5c0NvdW50cnkiLCJnZXREZXZpY2VQcm9kdWN0Q291bnRyeSIsImxvY2FsZSIsImdldERldmljZVN5c0xvY2FsZSIsImdldERldmljZVByb2R1Y3RMb2NhbGUiLCJzZXREZXZpY2VMb2NhbGUiLCJ2YWxpZGF0ZUxvY2FsZSIsInNwbGl0X2xvY2FsZSIsInNldERldmljZUxhbmd1YWdlQ291bnRyeSIsImVuc3VyZUN1cnJlbnRMb2NhbGUiLCJzY3JpcHQiLCJoYXNMYW5ndWFnZSIsImhhc0NvdW50cnkiLCJjdXJMYW5ndWFnZSIsImN1ckNvdW50cnkiLCJjdXJMb2NhbGUiLCJsb2NhbGVDb2RlIiwiZXJyb3IiLCJyZWNvbm5lY3QiLCJpZ24iLCJyZXN0YXJ0QWRiIiwidG9VcHBlckNhc2UiLCJzZXREZXZpY2VTeXNMb2NhbGVWaWFTZXR0aW5nQXBwIiwiZXhpc3RzIiwiZXh0cmFjdEJhc2VBcGsiLCJhcGtSZWFkZXIiLCJBcGtSZWFkZXIiLCJvcGVuIiwibWFuaWZlc3QiLCJyZWFkTWFuaWZlc3QiLCJyZXN1bHQiLCJ2ZXJzaW9uTmFtZU1hdGNoIiwidmVyc2lvbkNv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WCxFQUFnQ21ELElBQWhDLENBQXFDaEQsTUFBckMsQ0FBekI7O0FBQ0EsUUFBSXFQLGdCQUFKLEVBQXNCO0FBQ3BCRixNQUFBQSxNQUFNLENBQUM3RSxXQUFQLEdBQXFCN0YsUUFBUSxDQUFDNEssZ0JBQWdCLENBQUMsQ0FBRCxDQUFqQixFQUFzQixFQUF0QixDQUE3QjtBQUNEOztBQUNELFdBQU9GLE1BQVA7QUFDRCxHQVhELENBV0UsT0FBT2pGLEdBQVAsRUFBWTtBQUNaeEssb0JBQUkySSxJQUFKLENBQVUsVUFBUzZCLEdBQUcsQ0FBQzVKLE9BQVEsOEJBQS9CO0FBQ0Q7O0FBQ0QsU0FBTzZPLE1BQVA7QUFDRCxDQWxCRDs7QUFvQkFwUSxlQUFlLENBQUN1USxPQUFoQixHQUEwQixlQUFlQSxPQUFmLENBQXdCN1AsR0FBeEIsRUFBNkI4UCxNQUE3QixFQUFxQztBQUM3RCxRQUFNQyxPQUFPLEdBQUcsQ0FBQyxNQUFNLEtBQUt0SyxPQUFMLENBQWEsQ0FBQyxPQUFELEVBQVUsSUFBVixFQUFnQixNQUFoQixFQUF3QnpGLEdBQXhCLENBQWIsQ0FBUCxFQUFtRDRCLE9BQW5ELENBQTJELFVBQTNELEVBQXVFLEVBQXZFLENBQWhCOztBQUNBLFFBQU1vTyxNQUFNLEdBQUc3SixjQUFLK0csT0FBTCxDQUFhNEMsTUFBYixFQUFzQixHQUFFOVAsR0FBSSxNQUE1QixDQUFmOztBQUNBLFFBQU0sS0FBS2lRLElBQUwsQ0FBVUYsT0FBVixFQUFtQkMsTUFBbkIsQ0FBTjs7QUFDQS9QLGtCQUFJQyxLQUFKLENBQVcsMkJBQTBCRixHQUFJLFNBQVFnUSxNQUFPLEdBQXhEOztBQUNBLFNBQU9BLE1BQVA7QUFDRCxDQU5EOztlQVNlMVEsZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGJ1aWxkU3RhcnRDbWQsIEFQS1NfRVhURU5TSU9OLCBidWlsZEluc3RhbGxBcmdzLFxuICBBUEtfSU5TVEFMTF9USU1FT1VULCBERUZBVUxUX0FEQl9FWEVDX1RJTUVPVVQsXG4gIHBhcnNlTWFuaWZlc3QsIHBhcnNlQWFwdFN0cmluZ3MsIHBhcnNlQWFwdDJTdHJpbmdzLCBmb3JtYXRDb25maWdNYXJrZXIsXG4gIGVzY2FwZVNoZWxsQXJnLFxufSBmcm9tICcuLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCwgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IGZzLCB1dGlsLCBta2RpcnAsIHRpbWluZyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IExSVSBmcm9tICdscnUtY2FjaGUnO1xuaW1wb3J0IEFwa1JlYWRlciBmcm9tICdhZGJraXQtYXBrcmVhZGVyJztcblxuXG5sZXQgYXBrVXRpbHNNZXRob2RzID0ge307XG5cbmNvbnN0IEFDVElWSVRJRVNfVFJPVUJMRVNIT09USU5HX0xJTksgPVxuICAnaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vYmxvYi9tYXN0ZXIvZG9jcy9lbi93cml0aW5nLXJ1bm5pbmctYXBwaXVtL2FuZHJvaWQvYWN0aXZpdHktc3RhcnR1cC5tZCc7XG5hcGtVdGlsc01ldGhvZHMuQVBQX0lOU1RBTExfU1RBVEUgPSB7XG4gIFVOS05PV046ICd1bmtub3duJyxcbiAgTk9UX0lOU1RBTExFRDogJ25vdEluc3RhbGxlZCcsXG4gIE5FV0VSX1ZFUlNJT05fSU5TVEFMTEVEOiAnbmV3ZXJWZXJzaW9uSW5zdGFsbGVkJyxcbiAgU0FNRV9WRVJTSU9OX0lOU1RBTExFRDogJ3NhbWVWZXJzaW9uSW5zdGFsbGVkJyxcbiAgT0xERVJfVkVSU0lPTl9JTlNUQUxMRUQ6ICdvbGRlclZlcnNpb25JbnN0YWxsZWQnLFxufTtcbmNvbnN0IFJFTU9URV9DQUNIRV9ST09UID0gJy9kYXRhL2xvY2FsL3RtcC9hcHBpdW1fY2FjaGUnO1xuXG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgcGFydGljdWxhciBwYWNrYWdlIGlzIHByZXNlbnQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBjaGVjay5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBkZXRlY3RpbmcgYXBwbGljYXRpb24gc3RhdGVcbiAqL1xuYXBrVXRpbHNNZXRob2RzLmlzQXBwSW5zdGFsbGVkID0gYXN5bmMgZnVuY3Rpb24gaXNBcHBJbnN0YWxsZWQgKHBrZykge1xuICBsb2cuZGVidWcoYEdldHRpbmcgaW5zdGFsbCBzdGF0dXMgZm9yICR7cGtnfWApO1xuICBjb25zdCBpbnN0YWxsZWRQYXR0ZXJuID0gbmV3IFJlZ0V4cChgXlxcXFxzKlBhY2thZ2VcXFxccytcXFxcWyR7Xy5lc2NhcGVSZWdFeHAocGtnKX1cXFxcXVteOl0rOiRgLCAnbScpO1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgICBjb25zdCBpc0luc3RhbGxlZCA9IGluc3RhbGxlZFBhdHRlcm4udGVzdChzdGRvdXQpO1xuICAgIGxvZy5kZWJ1ZyhgJyR7cGtnfScgaXMkeyFpc0luc3RhbGxlZCA/ICcgbm90JyA6ICcnfSBpbnN0YWxsZWRgKTtcbiAgICByZXR1cm4gaXNJbnN0YWxsZWQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGZpbmRpbmcgaWYgJyR7cGtnfScgaXMgaW5zdGFsbGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3RhcnRVcmlPcHRpb25zXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSB3YWl0Rm9yTGF1bmNoIFt0cnVlXSAtIGlmIGBmYWxzZWAgdGhlbiBhZGIgd29uJ3Qgd2FpdFxuICogZm9yIHRoZSBzdGFydGVkIGFjdGl2aXR5IHRvIHJldHVybiB0aGUgY29udHJvbFxuICovXG5cbi8qKlxuICogU3RhcnQgdGhlIHBhcnRpY3VsYXIgVVJJIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJpIC0gVGhlIG5hbWUgb2YgVVJJIHRvIHN0YXJ0LlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIHN0YXJ0IHRoZSBVUkkgd2l0aC5cbiAqIEBwYXJhbSB7U3RhcnRVcmlPcHRpb25zfSBvcHRzXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5zdGFydFVyaSA9IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0VXJpICh1cmksIHBrZywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB3YWl0Rm9yTGF1bmNoID0gdHJ1ZSxcbiAgfSA9IG9wdHM7XG5cbiAgaWYgKCF1cmkgfHwgIXBrZykge1xuICAgIHRocm93IG5ldyBFcnJvcignVVJJIGFuZCBwYWNrYWdlIGFyZ3VtZW50cyBhcmUgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGNvbnN0IGFyZ3MgPSBbJ2FtJywgJ3N0YXJ0J107XG4gIGlmICh3YWl0Rm9yTGF1bmNoKSB7XG4gICAgYXJncy5wdXNoKCctVycpO1xuICB9XG4gIGFyZ3MucHVzaCgnLWEnLCAnYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlZJRVcnLFxuICAgICctZCcsIGVzY2FwZVNoZWxsQXJnKHVyaSksXG4gICAgcGtnKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2hlbGwoYXJncyk7XG4gICAgaWYgKHJlcy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCd1bmFibGUgdG8gcmVzb2x2ZSBpbnRlbnQnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHJlcyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBhdHRlbXB0aW5nIHRvIHN0YXJ0IFVSSS4gT3JpZ2luYWwgZXJyb3I6ICR7ZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdGFydEFwcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gcGtnIC0gVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2VcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gYWN0aXZpdHkgLSBUaGUgbmFtZSBvZiB0aGUgbWFpbiBhcHBsaWNhdGlvbiBhY3Rpdml0eS5cbiAqIFRoaXMgb3IgYWN0aW9uIGlzIHJlcXVpcmVkIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gbGF1bmNoIGFuIGFwcC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gYWN0aW9uIC0gVGhlIG5hbWUgb2YgdGhlIGludGVudCBhY3Rpb24gdGhhdCB3aWxsIGxhdW5jaCB0aGUgcmVxdWlyZWQgYXBwLlxuICogVGhpcyBvciBhY3Rpdml0eSBpcyByZXF1aXJlZCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGxhdW5jaCBhbiBhcHAuXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSByZXRyeSBbdHJ1ZV0gLSBJZiB0aGlzIHByb3BlcnR5IGlzIHNldCB0byBgdHJ1ZWBcbiAqIGFuZCB0aGUgYWN0aXZpdHkgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoICcuJyB0aGVuIHRoZSBtZXRob2RcbiAqIHdpbGwgdHJ5IHRvIGFkZCB0aGUgbWlzc2luZyBkb3QgYW5kIHN0YXJ0IHRoZSBhY3Rpdml0eSBvbmNlIG1vcmVcbiAqIGlmIHRoZSBmaXJzdCBzdGFydHVwIHRyeSBmYWlscy5cbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IHN0b3BBcHAgW3RydWVdIC0gU2V0IGl0IHRvIGB0cnVlYCBpbiBvcmRlciB0byBmb3JjZWZ1bGx5XG4gKiBzdG9wIHRoZSBhY3Rpdml0eSBpZiBpdCBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHdhaXRQa2cgLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byB3YWl0IHRvIG9uXG4gKiBzdGFydHVwICh0aGlzIG9ubHkgbWFrZXMgc2Vuc2UgaWYgdGhpcyBuYW1lIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUsIHdoaWNoIGlzIHNldCBhcyBgcGtnYClcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gd2FpdEFjdGl2aXR5IC0gVGhlIG5hbWUgb2YgdGhlIGFjdGl2aXR5IHRvIHdhaXQgdG8gb25cbiAqIHN0YXJ0dXAgKHRoaXMgb25seSBtYWtlcyBzZW5zZSBpZiB0aGlzIG5hbWUgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9uZSwgd2hpY2ggaXMgc2V0IGFzIGBhY3Rpdml0eWApXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHdhaXREdXJhdGlvbiAtIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgdGhlXG4gKiBgd2FpdEFjdGl2aXR5YCBpcyBmb2N1c2VkXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8bnVtYmVyfSB1c2VyIC0gVGhlIG51bWJlciBvZiB0aGUgdXNlciBwcm9maWxlIHRvIHN0YXJ0XG4gKiB0aGUgZ2l2ZW4gYWN0aXZpdHkgd2l0aC4gVGhlIGRlZmF1bHQgT1MgdXNlciBwcm9maWxlICh1c3VhbGx5IHplcm8pIGlzIHVzZWRcbiAqIHdoZW4gdGhpcyBwcm9wZXJ0eSBpcyB1bnNldFxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gd2FpdEZvckxhdW5jaCBbdHJ1ZV0gLSBpZiBgZmFsc2VgIHRoZW4gYWRiIHdvbid0IHdhaXRcbiAqIGZvciB0aGUgc3RhcnRlZCBhY3Rpdml0eSB0byByZXR1cm4gdGhlIGNvbnRyb2xcbiAqL1xuXG4vKipcbiAqIFN0YXJ0IHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UvYWN0aXZpdHkgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7U3RhcnRBcHBPcHRpb25zfSBzdGFydEFwcE9wdGlvbnMgW3t9XSAtIFN0YXJ0dXAgb3B0aW9ucyBtYXBwaW5nLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIGlzIGFuIGVycm9yIHdoaWxlIGV4ZWN1dGluZyB0aGUgYWN0aXZpdHlcbiAqL1xuYXBrVXRpbHNNZXRob2RzLnN0YXJ0QXBwID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRBcHAgKHN0YXJ0QXBwT3B0aW9ucyA9IHt9KSB7XG4gIGlmICghc3RhcnRBcHBPcHRpb25zLnBrZyB8fCAhKHN0YXJ0QXBwT3B0aW9ucy5hY3Rpdml0eSB8fCBzdGFydEFwcE9wdGlvbnMuYWN0aW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncGtnLCBhbmQgYWN0aXZpdHkgb3IgaW50ZW50IGFjdGlvbiwgYXJlIHJlcXVpcmVkIHRvIHN0YXJ0IGFuIGFwcGxpY2F0aW9uJyk7XG4gIH1cblxuICBzdGFydEFwcE9wdGlvbnMgPSBfLmNsb25lKHN0YXJ0QXBwT3B0aW9ucyk7XG4gIGlmIChzdGFydEFwcE9wdGlvbnMuYWN0aXZpdHkpIHtcbiAgICBzdGFydEFwcE9wdGlvbnMuYWN0aXZpdHkgPSBzdGFydEFwcE9wdGlvbnMuYWN0aXZpdHkucmVwbGFjZSgnJCcsICdcXFxcJCcpO1xuICB9XG4gIC8vIGluaXRpYWxpemluZyBkZWZhdWx0c1xuICBfLmRlZmF1bHRzKHN0YXJ0QXBwT3B0aW9ucywge1xuICAgIHdhaXRQa2c6IHN0YXJ0QXBwT3B0aW9ucy5wa2csXG4gICAgd2FpdEZvckxhdW5jaDogdHJ1ZSxcbiAgICB3YWl0QWN0aXZpdHk6IGZhbHNlLFxuICAgIHJldHJ5OiB0cnVlLFxuICAgIHN0b3BBcHA6IHRydWVcbiAgfSk7XG4gIC8vIHByZXZlbnRpbmcgbnVsbCB3YWl0cGtnXG4gIHN0YXJ0QXBwT3B0aW9ucy53YWl0UGtnID0gc3RhcnRBcHBPcHRpb25zLndhaXRQa2cgfHwgc3RhcnRBcHBPcHRpb25zLnBrZztcblxuICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKTtcbiAgY29uc3QgY21kID0gYnVpbGRTdGFydENtZChzdGFydEFwcE9wdGlvbnMsIGFwaUxldmVsKTtcbiAgY29uc3QgaW50ZW50TmFtZSA9IGAke3N0YXJ0QXBwT3B0aW9ucy5hY3Rpb259JHtzdGFydEFwcE9wdGlvbnMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgPyAnICcgKyBzdGFydEFwcE9wdGlvbnMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgOiAnJ31gO1xuICB0cnkge1xuICAgIGNvbnN0IHNoZWxsT3B0cyA9IHt9O1xuICAgIGlmIChfLmlzSW50ZWdlcihzdGFydEFwcE9wdGlvbnMud2FpdER1cmF0aW9uKSAmJiBzdGFydEFwcE9wdGlvbnMud2FpdER1cmF0aW9uID49IDApIHtcbiAgICAgIHNoZWxsT3B0cy50aW1lb3V0ID0gc3RhcnRBcHBPcHRpb25zLndhaXREdXJhdGlvbjtcbiAgICB9XG4gICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChjbWQsIHNoZWxsT3B0cyk7XG4gICAgaWYgKHN0ZG91dC5pbmNsdWRlcygnRXJyb3I6IEFjdGl2aXR5IGNsYXNzJykgJiYgc3Rkb3V0LmluY2x1ZGVzKCdkb2VzIG5vdCBleGlzdCcpKSB7XG4gICAgICBpZiAoc3RhcnRBcHBPcHRpb25zLnJldHJ5ICYmICFzdGFydEFwcE9wdGlvbnMuYWN0aXZpdHkuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgV2UgdHJpZWQgdG8gc3RhcnQgYW4gYWN0aXZpdHkgdGhhdCBkb2Vzbid0IGV4aXN0LCBgICtcbiAgICAgICAgICAgICAgICAgIGByZXRyeWluZyB3aXRoICcuJHtzdGFydEFwcE9wdGlvbnMuYWN0aXZpdHl9JyBhY3Rpdml0eSBuYW1lYCk7XG4gICAgICAgIHN0YXJ0QXBwT3B0aW9ucy5hY3Rpdml0eSA9IGAuJHtzdGFydEFwcE9wdGlvbnMuYWN0aXZpdHl9YDtcbiAgICAgICAgc3RhcnRBcHBPcHRpb25zLnJldHJ5ID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN0YXJ0QXBwKHN0YXJ0QXBwT3B0aW9ucyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFjdGl2aXR5IG5hbWUgJyR7c3RhcnRBcHBPcHRpb25zLmFjdGl2aXR5fScgdXNlZCB0byBzdGFydCB0aGUgYXBwIGRvZXNuJ3QgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYGV4aXN0IG9yIGNhbm5vdCBiZSBsYXVuY2hlZCEgTWFrZSBzdXJlIGl0IGV4aXN0cyBhbmQgaXMgYSBsYXVuY2hhYmxlIGFjdGl2aXR5YCk7XG4gICAgfSBlbHNlIGlmIChzdGRvdXQuaW5jbHVkZXMoJ0Vycm9yOiBJbnRlbnQgZG9lcyBub3QgbWF0Y2ggYW55IGFjdGl2aXRpZXMnKSB8fCBzdGRvdXQuaW5jbHVkZXMoJ0Vycm9yOiBBY3Rpdml0eSBub3Qgc3RhcnRlZCwgdW5hYmxlIHRvIHJlc29sdmUgSW50ZW50JykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQWN0aXZpdHkgZm9yIGludGVudCAnJHtpbnRlbnROYW1lfScgdXNlZCB0byBzdGFydCB0aGUgYXBwIGRvZXNuJ3QgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYGV4aXN0IG9yIGNhbm5vdCBiZSBsYXVuY2hlZCEgTWFrZSBzdXJlIGl0IGV4aXN0cyBhbmQgaXMgYSBsYXVuY2hhYmxlIGFjdGl2aXR5YCk7XG4gICAgfSBlbHNlIGlmIChzdGRvdXQuaW5jbHVkZXMoJ2phdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbicpKSB7XG4gICAgICAvLyBpZiB0aGUgYXBwIGlzIGRpc2FibGVkIG9uIGEgcmVhbCBkZXZpY2UgaXQgd2lsbCB0aHJvdyBhIHNlY3VyaXR5IGV4Y2VwdGlvblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcGVybWlzc2lvbiB0byBzdGFydCAnJHtzdGFydEFwcE9wdGlvbnMuYWN0aXZpdHl9JyBhY3Rpdml0eSBoYXMgYmVlbiBkZW5pZWQuYCArXG4gICAgICAgICAgICAgICAgICAgICAgYE1ha2Ugc3VyZSB0aGUgYWN0aXZpdHkvcGFja2FnZSBuYW1lcyBhcmUgY29ycmVjdC5gKTtcbiAgICB9XG4gICAgaWYgKHN0YXJ0QXBwT3B0aW9ucy53YWl0QWN0aXZpdHkpIHtcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvckFjdGl2aXR5KHN0YXJ0QXBwT3B0aW9ucy53YWl0UGtnLCBzdGFydEFwcE9wdGlvbnMud2FpdEFjdGl2aXR5LCBzdGFydEFwcE9wdGlvbnMud2FpdER1cmF0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZG91dDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnN0IGFwcERlc2NyaXB0b3IgPSBzdGFydEFwcE9wdGlvbnMucGtnIHx8IGludGVudE5hbWU7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc3RhcnQgdGhlICcke2FwcERlc2NyaXB0b3J9JyBhcHBsaWNhdGlvbi4gYCArXG4gICAgICBgVmlzaXQgJHtBQ1RJVklUSUVTX1RST1VCTEVTSE9PVElOR19MSU5LfSBmb3IgdHJvdWJsZXNob290aW5nLiBgICtcbiAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCB0byBjYWxsIGBhZGIgZHVtcHN5cyB3aW5kb3cgd2luZG93cy9kaXNwbGF5c2BcbiAqL1xuYXBrVXRpbHNNZXRob2RzLmR1bXBXaW5kb3dzID0gYXN5bmMgZnVuY3Rpb24gZHVtcFdpbmRvd3MgKCkge1xuICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKTtcblxuICAvLyBXaXRoIHZlcnNpb24gMjksIEFuZHJvaWQgY2hhbmdlZCB0aGUgZHVtcHN5cyBzeW50YXhcbiAgY29uc3QgZHVtcHN5c0FyZyA9IGFwaUxldmVsID49IDI5ID8gJ2Rpc3BsYXlzJyA6ICd3aW5kb3dzJztcbiAgY29uc3QgY21kID0gWydkdW1wc3lzJywgJ3dpbmRvdycsIGR1bXBzeXNBcmddO1xuXG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKGNtZCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBhY2thZ2VBY3Rpdml0eUluZm9cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gYXBwUGFja2FnZSAtIFRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uIHBhY2thZ2UsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZXhhbXBsZSAnY29tLmFjbWUuYXBwJy5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gYXBwQWN0aXZpdHkgLSBUaGUgbmFtZSBvZiBtYWluIGFwcGxpY2F0aW9uIGFjdGl2aXR5LlxuICovXG5cbi8qKlxuICogR2V0IHRoZSBuYW1lIG9mIGN1cnJlbnRseSBmb2N1c2VkIHBhY2thZ2UgYW5kIGFjdGl2aXR5LlxuICpcbiAqIEByZXR1cm4ge1BhY2thZ2VBY3Rpdml0eUluZm99IFRoZSBtYXBwaW5nLCB3aGVyZSBwcm9wZXJ0eSBuYW1lcyBhcmUgJ2FwcFBhY2thZ2UnIGFuZCAnYXBwQWN0aXZpdHknLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIGlzIGFuIGVycm9yIHdoaWxlIHBhcnNpbmcgdGhlIGRhdGEuXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5nZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSAoKSB7XG4gIGxvZy5kZWJ1ZygnR2V0dGluZyBmb2N1c2VkIHBhY2thZ2UgYW5kIGFjdGl2aXR5Jyk7XG4gIGNvbnN0IG51bGxGb2N1c2VkQXBwUmUgPSBuZXcgUmVnRXhwKC9eXFxzKm1Gb2N1c2VkQXBwPW51bGwvLCAnbScpO1xuICAvLyBodHRwczovL3JlZ2V4MTAxLmNvbS9yL3haOHZGNy8xXG4gIGNvbnN0IGZvY3VzZWRBcHBSZSA9IG5ldyBSZWdFeHAoJ15cXFxccyptRm9jdXNlZEFwcC4rUmVjb3JkXFxcXHsuKlxcXFxzKFteXFxcXHNcXFxcL1xcXFx9XSspJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcXFwvKFteXFxcXHNcXFxcL1xcXFx9XFxcXCxdKylcXFxcLD8oXFxcXHNbXlxcXFxzXFxcXC9cXFxcfV0rKSpcXFxcfScsICdtJyk7XG4gIGNvbnN0IG51bGxDdXJyZW50Rm9jdXNSZSA9IG5ldyBSZWdFeHAoL15cXHMqbUN1cnJlbnRGb2N1cz1udWxsLywgJ20nKTtcbiAgY29uc3QgY3VycmVudEZvY3VzQXBwUmUgPSBuZXcgUmVnRXhwKCdeXFxcXHMqbUN1cnJlbnRGb2N1cy4rXFxcXHsuK1xcXFxzKFteXFxcXHNcXFxcL10rKVxcXFwvKFteXFxcXHNdKylcXFxcYicsICdtJyk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLmR1bXBXaW5kb3dzKCk7XG4gICAgLy8gVGhlIG9yZGVyIG1hdHRlcnMgaGVyZVxuICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBbZm9jdXNlZEFwcFJlLCBjdXJyZW50Rm9jdXNBcHBSZV0pIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gcGF0dGVybi5leGVjKHN0ZG91dCk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhcHBQYWNrYWdlOiBtYXRjaFsxXS50cmltKCksXG4gICAgICAgICAgYXBwQWN0aXZpdHk6IG1hdGNoWzJdLnRyaW0oKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBbbnVsbEZvY3VzZWRBcHBSZSwgbnVsbEN1cnJlbnRGb2N1c1JlXSkge1xuICAgICAgaWYgKHBhdHRlcm4uZXhlYyhzdGRvdXQpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYXBwUGFja2FnZTogbnVsbCxcbiAgICAgICAgICBhcHBBY3Rpdml0eTogbnVsbFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHBhcnNlIGFjdGl2aXR5IGZyb20gZHVtcHN5cycpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZ2V0IGZvY3VzUGFja2FnZUFuZEFjdGl2aXR5LiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogV2FpdCBmb3IgdGhlIGdpdmVuIGFjdGl2aXR5IHRvIGJlIGZvY3VzZWQvbm9uLWZvY3VzZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIHdhaXQgZm9yLlxuICogQHBhcmFtIHtzdHJpbmd9IGFjdGl2aXR5IC0gVGhlIG5hbWUgb2YgdGhlIGFjdGl2aXR5LCBiZWxvbmdpbmcgdG8gdGhhdCBwYWNrYWdlLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gd2FpdCBmb3IuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHdhaXRGb3JTdG9wIC0gV2hldGhlciB0byB3YWl0IHVudGlsIHRoZSBhY3Rpdml0eSBpcyBmb2N1c2VkICh0cnVlKVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlzIG5vdCBmb2N1c2VkIChmYWxzZSkuXG4gKiBAcGFyYW0ge251bWJlcn0gd2FpdE1zIFsyMDAwMF0gLSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHRpbWVvdXQgb2NjdXJzLlxuICogQHRocm93cyB7ZXJyb3J9IElmIHRpbWVvdXQgaGFwcGVucy5cbiAqL1xuYXBrVXRpbHNNZXRob2RzLndhaXRGb3JBY3Rpdml0eU9yTm90ID0gYXN5bmMgZnVuY3Rpb24gd2FpdEZvckFjdGl2aXR5T3JOb3QgKHBrZywgYWN0aXZpdHksIHdhaXRGb3JTdG9wLCB3YWl0TXMgPSAyMDAwMCkge1xuICBpZiAoIXBrZyB8fCAhYWN0aXZpdHkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhY2thZ2UgYW5kIGFjdGl2aXR5IHJlcXVpcmVkLicpO1xuICB9XG4gIGxvZy5kZWJ1ZyhgV2FpdGluZyB1cCB0byAke3dhaXRNc31tcyBmb3IgYWN0aXZpdHkgbWF0Y2hpbmcgcGtnOiAnJHtwa2d9JyBhbmQgYCArXG4gICAgICAgICAgICBgYWN0aXZpdHk6ICcke2FjdGl2aXR5fScgdG8ke3dhaXRGb3JTdG9wID8gJyBub3QnIDogJyd9IGJlIGZvY3VzZWRgKTtcblxuICBjb25zdCBzcGxpdE5hbWVzID0gKG5hbWVzKSA9PiBuYW1lcy5zcGxpdCgnLCcpLm1hcCgobmFtZSkgPT4gbmFtZS50cmltKCkpO1xuICBjb25zdCBhbGxQYWNrYWdlcyA9IHNwbGl0TmFtZXMocGtnKTtcbiAgY29uc3QgYWxsQWN0aXZpdGllcyA9IHNwbGl0TmFtZXMoYWN0aXZpdHkpO1xuXG4gIGNvbnN0IHBvc3NpYmxlQWN0aXZpdHlOYW1lcyA9IFtdO1xuICBmb3IgKGNvbnN0IG9uZUFjdGl2aXR5IG9mIGFsbEFjdGl2aXRpZXMpIHtcbiAgICBpZiAob25lQWN0aXZpdHkuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAvLyBhZGQgdGhlIHBhY2thZ2UgbmFtZSBpZiBhY3Rpdml0eSBpcyBub3QgZnVsbCBxdWFsaWZpZWRcbiAgICAgIGZvciAoY29uc3QgY3VycmVudFBrZyBvZiBhbGxQYWNrYWdlcykge1xuICAgICAgICBwb3NzaWJsZUFjdGl2aXR5TmFtZXMucHVzaChgJHtjdXJyZW50UGtnfSR7b25lQWN0aXZpdHl9YC5yZXBsYWNlKC9cXC4rL2csICcuJykpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhY2NlcHQgZnVsbHkgcXVhbGlmaWVkIGFjdGl2aXR5IG5hbWUuXG4gICAgICBwb3NzaWJsZUFjdGl2aXR5TmFtZXMucHVzaChvbmVBY3Rpdml0eSk7XG4gICAgICBwb3NzaWJsZUFjdGl2aXR5TmFtZXMucHVzaChgJHtwa2d9LiR7b25lQWN0aXZpdHl9YCk7XG4gICAgfVxuICB9XG4gIGxvZy5kZWJ1ZyhgUG9zc2libGUgYWN0aXZpdGllcywgdG8gYmUgY2hlY2tlZDogJHtwb3NzaWJsZUFjdGl2aXR5TmFtZXMubWFwKChuYW1lKSA9PiBgJyR7bmFtZX0nYCkuam9pbignLCAnKX1gKTtcblxuICBjb25zdCBwb3NzaWJsZUFjdGl2aXR5UGF0dGVybnMgPSBwb3NzaWJsZUFjdGl2aXR5TmFtZXMubWFwKFxuICAgIChhY3ROYW1lKSA9PiBuZXcgUmVnRXhwKGBeJHthY3ROYW1lLnJlcGxhY2UoL1xcLi9nLCAnXFxcXC4nKS5yZXBsYWNlKC9cXCovZywgJy4qPycpLnJlcGxhY2UoL1xcJC9nLCAnXFxcXCQnKX0kYClcbiAgKTtcblxuICBjb25zdCBjb25kaXRpb25GdW5jID0gYXN5bmMgKCkgPT4ge1xuICAgIGxldCBhcHBQYWNrYWdlO1xuICAgIGxldCBhcHBBY3Rpdml0eTtcbiAgICB0cnkge1xuICAgICAgKHthcHBQYWNrYWdlLCBhcHBBY3Rpdml0eX0gPSBhd2FpdCB0aGlzLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmRlYnVnKGUubWVzc2FnZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChhcHBBY3Rpdml0eSAmJiBhcHBQYWNrYWdlKSB7XG4gICAgICBjb25zdCBmdWxseVF1YWxpZmllZEFjdGl2aXR5ID0gYXBwQWN0aXZpdHkuc3RhcnRzV2l0aCgnLicpID8gYCR7YXBwUGFja2FnZX0ke2FwcEFjdGl2aXR5fWAgOiBhcHBBY3Rpdml0eTtcbiAgICAgIGxvZy5kZWJ1ZyhgRm91bmQgcGFja2FnZTogJyR7YXBwUGFja2FnZX0nIGFuZCBmdWxseSBxdWFsaWZpZWQgYWN0aXZpdHkgbmFtZSA6ICcke2Z1bGx5UXVhbGlmaWVkQWN0aXZpdHl9J2ApO1xuICAgICAgY29uc3QgaXNBY3Rpdml0eUZvdW5kID0gXy5pbmNsdWRlcyhhbGxQYWNrYWdlcywgYXBwUGFja2FnZSlcbiAgICAgICAgJiYgcG9zc2libGVBY3Rpdml0eVBhdHRlcm5zLnNvbWUoKHApID0+IHAudGVzdChmdWxseVF1YWxpZmllZEFjdGl2aXR5KSk7XG4gICAgICBpZiAoKCF3YWl0Rm9yU3RvcCAmJiBpc0FjdGl2aXR5Rm91bmQpIHx8ICh3YWl0Rm9yU3RvcCAmJiAhaXNBY3Rpdml0eUZvdW5kKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgbG9nLmRlYnVnKCdJbmNvcnJlY3QgcGFja2FnZSBhbmQgYWN0aXZpdHkuIFJldHJ5aW5nLicpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICB0cnkge1xuICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oY29uZGl0aW9uRnVuYywge1xuICAgICAgd2FpdE1zOiBwYXJzZUludCh3YWl0TXMsIDEwKSxcbiAgICAgIGludGVydmFsTXM6IDUwMCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtwb3NzaWJsZUFjdGl2aXR5TmFtZXMubWFwKChuYW1lKSA9PiBgJyR7bmFtZX0nYCkuam9pbignIG9yICcpfSBuZXZlciAke3dhaXRGb3JTdG9wID8gJ3N0b3BwZWQnIDogJ3N0YXJ0ZWQnfS4gYCArXG4gICAgICBgVmlzaXQgJHtBQ1RJVklUSUVTX1RST1VCTEVTSE9PVElOR19MSU5LfSBmb3IgdHJvdWJsZXNob290aW5nYCk7XG4gIH1cbn07XG5cbi8qKlxuICogV2FpdCBmb3IgdGhlIGdpdmVuIGFjdGl2aXR5IHRvIGJlIGZvY3VzZWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gd2FpdCBmb3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aXZpdHkgLSBUaGUgbmFtZSBvZiB0aGUgYWN0aXZpdHksIGJlbG9uZ2luZyB0byB0aGF0IHBhY2thZ2UsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB3YWl0IGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0TXMgWzIwMDAwXSAtIE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgdGltZW91dCBvY2N1cnMuXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGltZW91dCBoYXBwZW5zLlxuICovXG5hcGtVdGlsc01ldGhvZHMud2FpdEZvckFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gd2FpdEZvckFjdGl2aXR5IChwa2csIGFjdCwgd2FpdE1zID0gMjAwMDApIHtcbiAgYXdhaXQgdGhpcy53YWl0Rm9yQWN0aXZpdHlPck5vdChwa2csIGFjdCwgZmFsc2UsIHdhaXRNcyk7XG59O1xuXG4vKipcbiAqIFdhaXQgZm9yIHRoZSBnaXZlbiBhY3Rpdml0eSB0byBiZSBub24tZm9jdXNlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gd2FpdCBmb3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aXZpdHkgLSBUaGUgbmFtZSBvZiB0aGUgYWN0aXZpdHksIGJlbG9uZ2luZyB0byB0aGF0IHBhY2thZ2UsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB3YWl0IGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0TXMgWzIwMDAwXSAtIE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgdGltZW91dCBvY2N1cnMuXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGltZW91dCBoYXBwZW5zLlxuICovXG5hcGtVdGlsc01ldGhvZHMud2FpdEZvck5vdEFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gd2FpdEZvck5vdEFjdGl2aXR5IChwa2csIGFjdCwgd2FpdE1zID0gMjAwMDApIHtcbiAgYXdhaXQgdGhpcy53YWl0Rm9yQWN0aXZpdHlPck5vdChwa2csIGFjdCwgdHJ1ZSwgd2FpdE1zKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVW5pbnN0YWxsT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXQgW2FkYkV4ZWNUaW1lb3V0XSAtIFRoZSBjb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHAgaXMgdW5pbnN0YWxsZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGtlZXBEYXRhIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBrZWVwIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gZGF0YSBhbmQgY2FjaGUgZm9sZGVycyBhZnRlciB1bmluc3RhbGwuXG4gKi9cblxuLyoqXG4gKiBVbmluc3RhbGwgdGhlIGdpdmVuIHBhY2thZ2UgZnJvbSB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGJlIHVuaW5zdGFsbGVkLlxuICogQHBhcmFtIHs/VW5pbnN0YWxsT3B0aW9uc30gb3B0aW9ucyAtIFRoZSBzZXQgb2YgdW5pbnN0YWxsIG9wdGlvbnMuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwYWNrYWdlIHdhcyBmb3VuZCBvbiB0aGUgZGV2aWNlIGFuZFxuICogICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5IHVuaW5zdGFsbGVkLlxuICovXG5hcGtVdGlsc01ldGhvZHMudW5pbnN0YWxsQXBrID0gYXN5bmMgZnVuY3Rpb24gdW5pbnN0YWxsQXBrIChwa2csIG9wdGlvbnMgPSB7fSkge1xuICBsb2cuZGVidWcoYFVuaW5zdGFsbGluZyAke3BrZ31gKTtcbiAgaWYgKCFhd2FpdCB0aGlzLmlzQXBwSW5zdGFsbGVkKHBrZykpIHtcbiAgICBsb2cuaW5mbyhgJHtwa2d9IHdhcyBub3QgdW5pbnN0YWxsZWQsIGJlY2F1c2UgaXQgd2FzIG5vdCBwcmVzZW50IG9uIHRoZSBkZXZpY2VgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBjbWQgPSBbJ3VuaW5zdGFsbCddO1xuICBpZiAob3B0aW9ucy5rZWVwRGF0YSkge1xuICAgIGNtZC5wdXNoKCctaycpO1xuICB9XG4gIGNtZC5wdXNoKHBrZyk7XG5cbiAgbGV0IHN0ZG91dDtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmZvcmNlU3RvcChwa2cpO1xuICAgIHN0ZG91dCA9IChhd2FpdCB0aGlzLmFkYkV4ZWMoY21kLCB7dGltZW91dDogb3B0aW9ucy50aW1lb3V0fSkpLnRyaW0oKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHVuaW5zdGFsbCBBUEsuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxuICBsb2cuZGVidWcoYCdhZGIgJHtjbWQuam9pbignICcpfScgY29tbWFuZCBvdXRwdXQ6ICR7c3Rkb3V0fWApO1xuICBpZiAoc3Rkb3V0LmluY2x1ZGVzKCdTdWNjZXNzJykpIHtcbiAgICBsb2cuaW5mbyhgJHtwa2d9IHdhcyBzdWNjZXNzZnVsbHkgdW5pbnN0YWxsZWRgKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBsb2cuaW5mbyhgJHtwa2d9IHdhcyBub3QgdW5pbnN0YWxsZWRgKTtcbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBJbnN0YWxsIHRoZSBwYWNrYWdlIGFmdGVyIGl0IHdhcyBwdXNoZWQgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGtQYXRoT25EZXZpY2UgLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBwYWNrYWdlIG9uIHRoZSBkZXZpY2UgZmlsZSBzeXN0ZW0uXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0cyBbe31dIC0gQWRkaXRpb25hbCBleGVjIG9wdGlvbnMuIFNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9ub2RlLXRlZW5fcHJvY2Vzc31cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoaXMgcGFyYW1ldGVyLlxuICogQHRocm93cyB7ZXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgZHVyaW5nIGFwcGxpY2F0aW9uIGluc3RhbGwuXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5pbnN0YWxsRnJvbURldmljZVBhdGggPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsRnJvbURldmljZVBhdGggKGFwa1BhdGhPbkRldmljZSwgb3B0cyA9IHt9KSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsncG0nLCAnaW5zdGFsbCcsICctcicsIGFwa1BhdGhPbkRldmljZV0sIG9wdHMpO1xuICBpZiAoc3Rkb3V0LmluZGV4T2YoJ0ZhaWx1cmUnKSAhPT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJlbW90ZSBpbnN0YWxsIGZhaWxlZDogJHtzdGRvdXR9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ2FjaGluZ09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gdGltZW91dCBbYWRiRXhlY1RpbWVvdXRdIC0gVGhlIGNvdW50IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHAgaXMgdXBsb2FkZWQgdG8gdGhlIHJlbW90ZSBsb2NhdGlvbi5cbiAqL1xuXG4vKipcbiAqIENhY2hlcyB0aGUgZ2l2ZW4gQVBLIGF0IGEgcmVtb3RlIGxvY2F0aW9uIHRvIHNwZWVkIHVwIGZ1cnRoZXIgQVBLIGRlcGxveW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGtQYXRoIC0gRnVsbCBwYXRoIHRvIHRoZSBhcGsgb24gdGhlIGxvY2FsIEZTXG4gKiBAcGFyYW0gez9DYWNoaW5nT3B0aW9uc30gb3B0aW9ucyAtIENhY2hpbmcgb3B0aW9uc1xuICogQHJldHVybnMge3N0cmluZ30gLSBGdWxsIHBhdGggdG8gdGhlIGNhY2hlZCBhcGsgb24gdGhlIHJlbW90ZSBmaWxlIHN5c3RlbVxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgY2FjaGluZyB0aGUgYXBwXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5jYWNoZUFwayA9IGFzeW5jIGZ1bmN0aW9uIGNhY2hlQXBrIChhcGtQYXRoLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgYXBwSGFzaCA9IGF3YWl0IGZzLmhhc2goYXBrUGF0aCk7XG4gIGNvbnN0IHJlbW90ZVBhdGggPSBwYXRoLnBvc2l4LmpvaW4oUkVNT1RFX0NBQ0hFX1JPT1QsIGAke2FwcEhhc2h9LmFwa2ApO1xuICBjb25zdCByZW1vdGVDYWNoZWRGaWxlcyA9IFtdO1xuICAvLyBHZXQgY3VycmVudCBjb250ZW50cyBvZiB0aGUgcmVtb3RlIGNhY2hlIG9yIGNyZWF0ZSBpdCBmb3IgdGhlIGZpcnN0IHRpbWVcbiAgdHJ5IHtcbiAgICBjb25zdCBlcnJvck1hcmtlciA9ICdfRVJST1JfJztcbiAgICBsZXQgbHNPdXRwdXQgPSBudWxsO1xuICAgIGlmICh0aGlzLl9hcmVFeHRlbmRlZExzT3B0aW9uc1N1cHBvcnRlZCA9PT0gdHJ1ZSB8fCAhXy5pc0Jvb2xlYW4odGhpcy5fYXJlRXh0ZW5kZWRMc09wdGlvbnNTdXBwb3J0ZWQpKSB7XG4gICAgICBsc091dHB1dCA9IGF3YWl0IHRoaXMuc2hlbGwoW2BscyAtdCAtMSAke1JFTU9URV9DQUNIRV9ST09UfSAyPiYxIHx8IGVjaG8gJHtlcnJvck1hcmtlcn1gXSk7XG4gICAgfVxuICAgIGlmICghXy5pc1N0cmluZyhsc091dHB1dCkgfHwgKGxzT3V0cHV0LmluY2x1ZGVzKGVycm9yTWFya2VyKSAmJiAhbHNPdXRwdXQuaW5jbHVkZXMoUkVNT1RFX0NBQ0hFX1JPT1QpKSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbih0aGlzLl9hcmVFeHRlbmRlZExzT3B0aW9uc1N1cHBvcnRlZCkpIHtcbiAgICAgICAgbG9nLmRlYnVnKCdUaGUgY3VycmVudCBBbmRyb2lkIEFQSSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuZGVkIGxzIG9wdGlvbnMuICcgK1xuICAgICAgICAgICdEZWZhdWx0aW5nIHRvIG5vLW9wdGlvbnMgY2FsbCcpO1xuICAgICAgfVxuICAgICAgbHNPdXRwdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFtgbHMgJHtSRU1PVEVfQ0FDSEVfUk9PVH0gMj4mMSB8fCBlY2hvICR7ZXJyb3JNYXJrZXJ9YF0pO1xuICAgICAgdGhpcy5fYXJlRXh0ZW5kZWRMc09wdGlvbnNTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fYXJlRXh0ZW5kZWRMc09wdGlvbnNTdXBwb3J0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAobHNPdXRwdXQuaW5jbHVkZXMoZXJyb3JNYXJrZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobHNPdXRwdXQuc3Vic3RyaW5nKDAsIGxzT3V0cHV0LmluZGV4T2YoZXJyb3JNYXJrZXIpKSk7XG4gICAgfVxuICAgIHJlbW90ZUNhY2hlZEZpbGVzLnB1c2goLi4uKFxuICAgICAgbHNPdXRwdXQuc3BsaXQoJ1xcbicpXG4gICAgICAgIC5tYXAoKHgpID0+IHgudHJpbSgpKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuZGVidWcoYEdvdCBhbiBlcnJvciAnJHtlLm1lc3NhZ2UudHJpbSgpfScgd2hpbGUgZ2V0dGluZyB0aGUgbGlzdCBvZiBmaWxlcyBpbiB0aGUgY2FjaGUuIGAgK1xuICAgICAgYEFzc3VtaW5nIHRoZSBjYWNoZSBkb2VzIG5vdCBleGlzdCB5ZXRgKTtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsnbWtkaXInLCAnLXAnLCBSRU1PVEVfQ0FDSEVfUk9PVF0pO1xuICB9XG4gIGxvZy5kZWJ1ZyhgVGhlIGNvdW50IG9mIGFwcGxpY2F0aW9ucyBpbiB0aGUgY2FjaGU6ICR7cmVtb3RlQ2FjaGVkRmlsZXMubGVuZ3RofWApO1xuICBjb25zdCB0b0hhc2ggPSAocmVtb3RlUGF0aCkgPT4gcGF0aC5wb3NpeC5wYXJzZShyZW1vdGVQYXRoKS5uYW1lO1xuICAvLyBQdXNoIHRoZSBhcGsgdG8gdGhlIHJlbW90ZSBjYWNoZSBpZiBuZWVkZWRcbiAgaWYgKHJlbW90ZUNhY2hlZEZpbGVzLnNvbWUoKHgpID0+IHRvSGFzaCh4KSA9PT0gYXBwSGFzaCkpIHtcbiAgICBsb2cuaW5mbyhgVGhlIGFwcGxpY2F0aW9uIGF0ICcke2Fwa1BhdGh9JyBpcyBhbHJlYWR5IGNhY2hlZCB0byAnJHtyZW1vdGVQYXRofSdgKTtcbiAgICAvLyBVcGRhdGUgdGhlIGFwcGxpY2F0aW9uIHRpbWVzdGFtcCBhc3luY2hyb25vdXNseSBpbiBvcmRlciB0byBidW1wIGl0cyBwb3NpdGlvblxuICAgIC8vIGluIHRoZSBzb3J0ZWQgbHMgb3V0cHV0XG4gICAgdGhpcy5zaGVsbChbJ3RvdWNoJywgJy1hbScsIHJlbW90ZVBhdGhdKVxuICAgICAgLmNhdGNoKCgpID0+IHt9KTtcbiAgfSBlbHNlIHtcbiAgICBsb2cuaW5mbyhgQ2FjaGluZyB0aGUgYXBwbGljYXRpb24gYXQgJyR7YXBrUGF0aH0nIHRvICcke3JlbW90ZVBhdGh9J2ApO1xuICAgIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gICAgYXdhaXQgdGhpcy5wdXNoKGFwa1BhdGgsIHJlbW90ZVBhdGgsIHt0aW1lb3V0OiBvcHRpb25zLnRpbWVvdXR9KTtcbiAgICBjb25zdCB7c2l6ZX0gPSBhd2FpdCBmcy5zdGF0KGFwa1BhdGgpO1xuICAgIGxvZy5pbmZvKGBUaGUgdXBsb2FkIG9mICcke3BhdGguYmFzZW5hbWUoYXBrUGF0aCl9JyAoJHt1dGlsLnRvUmVhZGFibGVTaXplU3RyaW5nKHNpemUpfSkgYCArXG4gICAgICBgdG9vayAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xuICB9XG4gIGlmICghdGhpcy5yZW1vdGVBcHBzQ2FjaGUpIHtcbiAgICB0aGlzLnJlbW90ZUFwcHNDYWNoZSA9IG5ldyBMUlUoe1xuICAgICAgbWF4OiB0aGlzLnJlbW90ZUFwcHNDYWNoZUxpbWl0LFxuICAgIH0pO1xuICB9XG4gIC8vIENsZWFudXAgdGhlIGludmFsaWQgZW50cmllcyBmcm9tIHRoZSBjYWNoZVxuICBfLmRpZmZlcmVuY2UodGhpcy5yZW1vdGVBcHBzQ2FjaGUua2V5cygpLCByZW1vdGVDYWNoZWRGaWxlcy5tYXAodG9IYXNoKSlcbiAgICAuZm9yRWFjaCgoaGFzaCkgPT4gdGhpcy5yZW1vdGVBcHBzQ2FjaGUuZGVsKGhhc2gpKTtcbiAgLy8gQnVtcCB0aGUgY2FjaGUgcmVjb3JkIGZvciB0aGUgcmVjZW50bHkgY2FjaGVkIGl0ZW1cbiAgdGhpcy5yZW1vdGVBcHBzQ2FjaGUuc2V0KGFwcEhhc2gsIHJlbW90ZVBhdGgpO1xuICAvLyBJZiB0aGUgcmVtb3RlIGNhY2hlIGV4Y2VlZHMgdGhpcy5yZW1vdGVBcHBzQ2FjaGVMaW1pdCwgcmVtb3ZlIHRoZSBsZWFzdCByZWNlbnRseSB1c2VkIGVudHJpZXNcbiAgY29uc3QgZW50cmllc1RvQ2xlYW51cCA9IHJlbW90ZUNhY2hlZEZpbGVzXG4gICAgLm1hcCgoeCkgPT4gcGF0aC5wb3NpeC5qb2luKFJFTU9URV9DQUNIRV9ST09ULCB4KSlcbiAgICAuZmlsdGVyKCh4KSA9PiAhdGhpcy5yZW1vdGVBcHBzQ2FjaGUuaGFzKHRvSGFzaCh4KSkpXG4gICAgLnNsaWNlKHRoaXMucmVtb3RlQXBwc0NhY2hlTGltaXQgLSB0aGlzLnJlbW90ZUFwcHNDYWNoZS5rZXlzKCkubGVuZ3RoKTtcbiAgaWYgKCFfLmlzRW1wdHkoZW50cmllc1RvQ2xlYW51cCkpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zaGVsbChbJ3JtJywgJy1mJywgLi4uZW50cmllc1RvQ2xlYW51cF0pO1xuICAgICAgbG9nLmRlYnVnKGBEZWxldGVkICR7ZW50cmllc1RvQ2xlYW51cC5sZW5ndGh9IGV4cGlyZWQgYXBwbGljYXRpb24gY2FjaGUgZW50cmllc2ApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy53YXJuKGBDYW5ub3QgZGVsZXRlICR7ZW50cmllc1RvQ2xlYW51cC5sZW5ndGh9IGV4cGlyZWQgYXBwbGljYXRpb24gY2FjaGUgZW50cmllcy4gYCArXG4gICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZW1vdGVQYXRoO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXQgWzYwMDAwXSAtIFRoZSBjb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHAgaXMgaW5zdGFsbGVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpbWVvdXRDYXBOYW1lIFthbmRyb2lkSW5zdGFsbFRpbWVvdXRdIC0gVGhlIHRpbWVvdXQgb3B0aW9uIG5hbWVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJzIGNhbiBpbmNyZWFzZSB0aGUgdGltZW91dC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYWxsb3dUZXN0UGFja2FnZXMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGFsbG93IHRlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzIGluc3RhbGxhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXNlU2RjYXJkIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSB0byBpbnN0YWxsIHRoZSBhcHAgb24gc2RjYXJkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiB0aGUgZGV2aWNlIG1lbW9yeS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ3JhbnRQZXJtaXNzaW9ucyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gZ3JhbnQgYWxsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucyByZXF1ZXN0ZWQgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBhZnRlciB0aGUgaW5zdGFsbGF0aW9uIGlzIGNvbXBsZXRlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlciBBbmRyb2lkIDYrLlxuICogQHByb3BlcnR5IHtib29sZWFufSByZXBsYWNlIFt0cnVlXSAtIFNldCBpdCB0byBmYWxzZSBpZiB5b3UgZG9uJ3Qgd2FudFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiB0byBiZSB1cGdyYWRlZC9yZWluc3RhbGxlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGl0IGlzIGFscmVhZHkgcHJlc2VudCBvbiB0aGUgZGV2aWNlLlxuICogQHByb3BlcnR5IHtib29sZWFufSBub0luY3JlbWVudGFsIFtmYWxzZV0gLSBGb3JjZWZ1bGx5IGRpc2FibGVzIGluY3JlbWVudGFsIGluc3RhbGxzIGlmIHNldCB0byBgdHJ1ZWAuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWQgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcHJldmlldy9mZWF0dXJlcyNpbmNyZW1lbnRhbFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5cbi8qKlxuICogSW5zdGFsbCB0aGUgcGFja2FnZSBmcm9tIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwUGF0aCAtIFRoZSBmdWxsIHBhdGggdG8gdGhlIGxvY2FsIHBhY2thZ2UuXG4gKiBAcGFyYW0gez9JbnN0YWxsT3B0aW9uc30gb3B0aW9ucyAtIFRoZSBzZXQgb2YgaW5zdGFsbGF0aW9uIG9wdGlvbnMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYW4gdW5leHBlY3RlZCBlcnJvciBoYXBwZW5zIGR1cmluZyBpbnN0YWxsLlxuICovXG5hcGtVdGlsc01ldGhvZHMuaW5zdGFsbCA9IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGwgKGFwcFBhdGgsIG9wdGlvbnMgPSB7fSkge1xuICBpZiAoYXBwUGF0aC5lbmRzV2l0aChBUEtTX0VYVEVOU0lPTikpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5pbnN0YWxsQXBrcyhhcHBQYXRoLCBvcHRpb25zKTtcbiAgfVxuXG4gIG9wdGlvbnMgPSBfLmNsb25lRGVlcChvcHRpb25zKTtcbiAgXy5kZWZhdWx0cyhvcHRpb25zLCB7XG4gICAgcmVwbGFjZTogdHJ1ZSxcbiAgICB0aW1lb3V0OiB0aGlzLmFkYkV4ZWNUaW1lb3V0ID09PSBERUZBVUxUX0FEQl9FWEVDX1RJTUVPVVQgPyBBUEtfSU5TVEFMTF9USU1FT1VUIDogdGhpcy5hZGJFeGVjVGltZW91dCxcbiAgICB0aW1lb3V0Q2FwTmFtZTogJ2FuZHJvaWRJbnN0YWxsVGltZW91dCcsXG4gIH0pO1xuXG4gIGNvbnN0IGluc3RhbGxBcmdzID0gYnVpbGRJbnN0YWxsQXJncyhhd2FpdCB0aGlzLmdldEFwaUxldmVsKCksIG9wdGlvbnMpO1xuICBpZiAob3B0aW9ucy5ub0luY3JlbWVudGFsICYmIGF3YWl0IHRoaXMuaXNJbmNyZW1lbnRhbEluc3RhbGxTdXBwb3J0ZWQoKSkge1xuICAgIC8vIEFkYiB0aHJvd3MgYW4gZXJyb3IgaWYgaXQgZG9lcyBub3Qga25vdyBhYm91dCBhbiBhcmcsXG4gICAgLy8gd2hpY2ggaXMgdGhlIGNhc2UgaGVyZSBmb3Igb2xkZXIgYWRiIHZlcnNpb25zLlxuICAgIGluc3RhbGxBcmdzLnB1c2goJy0tbm8taW5jcmVtZW50YWwnKTtcbiAgfVxuICBjb25zdCBpbnN0YWxsT3B0cyA9IHtcbiAgICB0aW1lb3V0OiBvcHRpb25zLnRpbWVvdXQsXG4gICAgdGltZW91dENhcE5hbWU6IG9wdGlvbnMudGltZW91dENhcE5hbWUsXG4gIH07XG4gIGNvbnN0IGluc3RhbGxDbWQgPSBbXG4gICAgJ2luc3RhbGwnLFxuICAgIC4uLmluc3RhbGxBcmdzLFxuICAgIGFwcFBhdGgsXG4gIF07XG4gIGxldCBwZXJmb3JtQXBwSW5zdGFsbCA9IGFzeW5jICgpID0+IGF3YWl0IHRoaXMuYWRiRXhlYyhpbnN0YWxsQ21kLCBpbnN0YWxsT3B0cyk7XG4gIC8vIHRoaXMucmVtb3RlQXBwc0NhY2hlTGltaXQgPD0gMCBtZWFucyBubyBjYWNoaW5nIHNob3VsZCBiZSBhcHBsaWVkXG4gIGxldCBzaG91bGRDYWNoZUFwcCA9IHRoaXMucmVtb3RlQXBwc0NhY2hlTGltaXQgPiAwO1xuICBpZiAoc2hvdWxkQ2FjaGVBcHApIHtcbiAgICBzaG91bGRDYWNoZUFwcCA9ICEoYXdhaXQgdGhpcy5pc1N0cmVhbWVkSW5zdGFsbFN1cHBvcnRlZCgpKTtcbiAgICBpZiAoIXNob3VsZENhY2hlQXBwKSB7XG4gICAgICBsb2cuaW5mbyhgVGhlIGFwcGxpY2F0aW9uIGF0ICcke2FwcFBhdGh9JyB3aWxsIG5vdCBiZSBjYWNoZWQsIGJlY2F1c2UgdGhlIGRldmljZSB1bmRlciB0ZXN0IGhhcyBgICtcbiAgICAgICAgYGNvbmZpcm1lZCB0aGUgc3VwcG9ydCBvZiBzdHJlYW1lZCBpbnN0YWxsc2ApO1xuICAgIH1cbiAgfVxuICBpZiAoc2hvdWxkQ2FjaGVBcHApIHtcbiAgICBjb25zdCBjbGVhckNhY2hlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgbG9nLmluZm8oYENsZWFyaW5nIHRoZSBjYWNoZSBhdCAnJHtSRU1PVEVfQ0FDSEVfUk9PVH0nYCk7XG4gICAgICBhd2FpdCB0aGlzLnNoZWxsKFsncm0nLCAnLXJmJywgYCR7UkVNT1RFX0NBQ0hFX1JPT1R9LypgXSk7XG4gICAgfTtcbiAgICBjb25zdCBjYWNoZUFwcCA9IGFzeW5jICgpID0+IGF3YWl0IHRoaXMuY2FjaGVBcGsoYXBwUGF0aCwge1xuICAgICAgdGltZW91dDogb3B0aW9ucy50aW1lb3V0LFxuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYWNoZWRBcHBQYXRoID0gYXdhaXQgY2FjaGVBcHAoKTtcbiAgICAgIHBlcmZvcm1BcHBJbnN0YWxsID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwbUluc3RhbGxDbWRCeVJlbW90ZVBhdGggPSAocmVtb3RlUGF0aCkgPT4gW1xuICAgICAgICAgICdwbScsICdpbnN0YWxsJyxcbiAgICAgICAgICAuLi5pbnN0YWxsQXJncyxcbiAgICAgICAgICByZW1vdGVQYXRoLFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCB0aGlzLnNoZWxsKHBtSW5zdGFsbENtZEJ5UmVtb3RlUGF0aChjYWNoZWRBcHBQYXRoKSwgaW5zdGFsbE9wdHMpO1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTM5NzBcbiAgICAgICAgaWYgKC9cXGJJTlNUQUxMX0ZBSUxFRF9JTlNVRkZJQ0lFTlRfU1RPUkFHRVxcYi8udGVzdChvdXRwdXQpKSB7XG4gICAgICAgICAgbG9nLndhcm4oYFRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgaW5zdGFsbGluZyAnJHthcHBQYXRofScgYCArXG4gICAgICAgICAgICBgYmVjYXVzZSBvZiB0aGUgaW5zdWZmaWNpZW50IGRldmljZSBzdG9yYWdlIHNwYWNlYCk7XG4gICAgICAgICAgYXdhaXQgY2xlYXJDYWNoZSgpO1xuICAgICAgICAgIGxvZy5pbmZvKGBDb25zaWRlciBkZWNyZWFzaW5nIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBjYWNoZWQgYXBwcyBgICtcbiAgICAgICAgICAgIGAoY3VycmVudGx5ICR7dGhpcy5yZW1vdGVBcHBzQ2FjaGVMaW1pdH0pIHRvIGF2b2lkIHN1Y2ggaXNzdWVzIGluIHRoZSBmdXR1cmVgKTtcbiAgICAgICAgICBjb25zdCBuZXdDYWNoZWRBcHBQYXRoID0gYXdhaXQgY2FjaGVBcHAoKTtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChwbUluc3RhbGxDbWRCeVJlbW90ZVBhdGgobmV3Q2FjaGVkQXBwUGF0aCksIGluc3RhbGxPcHRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZGVidWcoZSk7XG4gICAgICBsb2cud2FybihgVGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSBjYWNoaW5nICcke2FwcFBhdGh9JzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICBsb2cud2FybignRmFsbGluZyBiYWNrIHRvIHRoZSBkZWZhdWx0IGluc3RhbGxhdGlvbiBwcm9jZWR1cmUnKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGUoKTtcbiAgICB9XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHBlcmZvcm1BcHBJbnN0YWxsKCk7XG4gICAgbG9nLmluZm8oYFRoZSBpbnN0YWxsYXRpb24gb2YgJyR7cGF0aC5iYXNlbmFtZShhcHBQYXRoKX0nIHRvb2sgJHt0aW1lci5nZXREdXJhdGlvbigpLmFzTWlsbGlTZWNvbmRzLnRvRml4ZWQoMCl9bXNgKTtcbiAgICBjb25zdCB0cnVuY2F0ZWRPdXRwdXQgPSAoIV8uaXNTdHJpbmcob3V0cHV0KSB8fCBvdXRwdXQubGVuZ3RoIDw9IDMwMCkgP1xuICAgICAgb3V0cHV0IDogYCR7b3V0cHV0LnN1YnN0cigwLCAxNTApfS4uLiR7b3V0cHV0LnN1YnN0cihvdXRwdXQubGVuZ3RoIC0gMTUwKX1gO1xuICAgIGxvZy5kZWJ1ZyhgSW5zdGFsbCBjb21tYW5kIHN0ZG91dDogJHt0cnVuY2F0ZWRPdXRwdXR9YCk7XG4gICAgaWYgKC9cXFtJTlNUQUxMW0EtWl9dK0ZBSUxFRFtBLVpfXStcXF0vLnRlc3Qob3V0cHV0KSkge1xuICAgICAgaWYgKHRoaXMuaXNUZXN0UGFja2FnZU9ubHlFcnJvcihvdXRwdXQpKSB7XG4gICAgICAgIGNvbnN0IG1zZyA9IGBTZXQgJ2FsbG93VGVzdFBhY2thZ2VzJyBjYXBhYmlsaXR5IHRvIHRydWUgaW4gb3JkZXIgdG8gYWxsb3cgdGVzdCBwYWNrYWdlcyBpbnN0YWxsYXRpb24uYDtcbiAgICAgICAgbG9nLndhcm4obXNnKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke291dHB1dH1cXG4ke21zZ31gKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihvdXRwdXQpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gb24gc29tZSBzeXN0ZW1zIHRoaXMgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiB0aGUgYXBwIGFscmVhZHlcbiAgICAvLyBleGlzdHNcbiAgICBpZiAoIWVyci5tZXNzYWdlLmluY2x1ZGVzKCdJTlNUQUxMX0ZBSUxFRF9BTFJFQURZX0VYSVNUUycpKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgQXBwbGljYXRpb24gJyR7YXBwUGF0aH0nIGFscmVhZHkgaW5zdGFsbGVkLiBDb250aW51aW5nLmApO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gc3RhdGUgb2YgdGhlIHBhcnRpY3VsYXIgYXBwbGljYXRpb25cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwUGF0aCAtIEZ1bGwgcGF0aCB0byB0aGUgYXBwbGljYXRpb25cbiAqIEBwYXJhbSB7P3N0cmluZ30gcGtnIC0gUGFja2FnZSBpZGVudGlmaWVyLiBJZiBvbWl0dGVkIHRoZW4gdGhlIHNjcmlwdCB3aWxsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB0byBleHRyYWN0IGl0IG9uIGl0cyBvd25cbiAqIEByZXR1cm5zIHtzdHJpbmd9XU9uZSBvZiBgQVBQX0lOU1RBTExfU1RBVEVgIGNvbnN0YW50c1xuICovXG5hcGtVdGlsc01ldGhvZHMuZ2V0QXBwbGljYXRpb25JbnN0YWxsU3RhdGUgPSBhc3luYyBmdW5jdGlvbiBnZXRBcHBsaWNhdGlvbkluc3RhbGxTdGF0ZSAoYXBwUGF0aCwgcGtnID0gbnVsbCkge1xuICBsZXQgYXBrSW5mbyA9IG51bGw7XG4gIGlmICghcGtnKSB7XG4gICAgYXBrSW5mbyA9IGF3YWl0IHRoaXMuZ2V0QXBrSW5mbyhhcHBQYXRoKTtcbiAgICBwa2cgPSBhcGtJbmZvLm5hbWU7XG4gIH1cbiAgaWYgKCFwa2cpIHtcbiAgICBsb2cud2FybihgQ2Fubm90IHJlYWQgdGhlIHBhY2thZ2UgbmFtZSBvZiAnJHthcHBQYXRofSdgKTtcbiAgICByZXR1cm4gdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5VTktOT1dOO1xuICB9XG5cbiAgaWYgKCFhd2FpdCB0aGlzLmlzQXBwSW5zdGFsbGVkKHBrZykpIHtcbiAgICBsb2cuZGVidWcoYEFwcCAnJHthcHBQYXRofScgaXMgbm90IGluc3RhbGxlZGApO1xuICAgIHJldHVybiB0aGlzLkFQUF9JTlNUQUxMX1NUQVRFLk5PVF9JTlNUQUxMRUQ7XG4gIH1cblxuICBjb25zdCB7dmVyc2lvbkNvZGU6IHBrZ1ZlcnNpb25Db2RlLCB2ZXJzaW9uTmFtZTogcGtnVmVyc2lvbk5hbWVTdHJ9ID0gYXdhaXQgdGhpcy5nZXRQYWNrYWdlSW5mbyhwa2cpO1xuICBjb25zdCBwa2dWZXJzaW9uTmFtZSA9IHNlbXZlci52YWxpZChzZW12ZXIuY29lcmNlKHBrZ1ZlcnNpb25OYW1lU3RyKSk7XG4gIGlmICghYXBrSW5mbykge1xuICAgIGFwa0luZm8gPSBhd2FpdCB0aGlzLmdldEFwa0luZm8oYXBwUGF0aCk7XG4gIH1cbiAgY29uc3Qge3ZlcnNpb25Db2RlOiBhcGtWZXJzaW9uQ29kZSwgdmVyc2lvbk5hbWU6IGFwa1ZlcnNpb25OYW1lU3RyfSA9IGFwa0luZm87XG4gIGNvbnN0IGFwa1ZlcnNpb25OYW1lID0gc2VtdmVyLnZhbGlkKHNlbXZlci5jb2VyY2UoYXBrVmVyc2lvbk5hbWVTdHIpKTtcblxuICBpZiAoIV8uaXNJbnRlZ2VyKGFwa1ZlcnNpb25Db2RlKSB8fCAhXy5pc0ludGVnZXIocGtnVmVyc2lvbkNvZGUpKSB7XG4gICAgbG9nLndhcm4oYENhbm5vdCByZWFkIHZlcnNpb24gY29kZXMgb2YgJyR7YXBwUGF0aH0nIGFuZC9vciAnJHtwa2d9J2ApO1xuICAgIGlmICghXy5pc1N0cmluZyhhcGtWZXJzaW9uTmFtZSkgfHwgIV8uaXNTdHJpbmcocGtnVmVyc2lvbk5hbWUpKSB7XG4gICAgICBsb2cud2FybihgQ2Fubm90IHJlYWQgdmVyc2lvbiBuYW1lcyBvZiAnJHthcHBQYXRofScgYW5kL29yICcke3BrZ30nYCk7XG4gICAgICByZXR1cm4gdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5VTktOT1dOO1xuICAgIH1cbiAgfVxuICBpZiAoXy5pc0ludGVnZXIoYXBrVmVyc2lvbkNvZGUpICYmIF8uaXNJbnRlZ2VyKHBrZ1ZlcnNpb25Db2RlKSkge1xuICAgIGlmIChwa2dWZXJzaW9uQ29kZSA+IGFwa1ZlcnNpb25Db2RlKSB7XG4gICAgICBsb2cuZGVidWcoYFRoZSB2ZXJzaW9uIGNvZGUgb2YgdGhlIGluc3RhbGxlZCAnJHtwa2d9JyBpcyBncmVhdGVyIHRoYW4gdGhlIGFwcGxpY2F0aW9uIHZlcnNpb24gY29kZSAoJHtwa2dWZXJzaW9uQ29kZX0gPiAke2Fwa1ZlcnNpb25Db2RlfSlgKTtcbiAgICAgIHJldHVybiB0aGlzLkFQUF9JTlNUQUxMX1NUQVRFLk5FV0VSX1ZFUlNJT05fSU5TVEFMTEVEO1xuICAgIH1cbiAgICAvLyBWZXJzaW9uIGNvZGVzIG1pZ2h0IG5vdCBiZSBtYWludGFpbmVkLiBDaGVjayB2ZXJzaW9uIG5hbWVzLlxuICAgIGlmIChwa2dWZXJzaW9uQ29kZSA9PT0gYXBrVmVyc2lvbkNvZGUpIHtcbiAgICAgIGlmIChfLmlzU3RyaW5nKGFwa1ZlcnNpb25OYW1lKSAmJiBfLmlzU3RyaW5nKHBrZ1ZlcnNpb25OYW1lKSAmJiBzZW12ZXIuc2F0aXNmaWVzKHBrZ1ZlcnNpb25OYW1lLCBgPj0ke2Fwa1ZlcnNpb25OYW1lfWApKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgVGhlIHZlcnNpb24gbmFtZSBvZiB0aGUgaW5zdGFsbGVkICcke3BrZ30nIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhlIGFwcGxpY2F0aW9uIHZlcnNpb24gbmFtZSAoJyR7cGtnVmVyc2lvbk5hbWV9JyA+PSAnJHthcGtWZXJzaW9uTmFtZX0nKWApO1xuICAgICAgICByZXR1cm4gc2VtdmVyLnNhdGlzZmllcyhwa2dWZXJzaW9uTmFtZSwgYD4ke2Fwa1ZlcnNpb25OYW1lfWApXG4gICAgICAgICAgPyB0aGlzLkFQUF9JTlNUQUxMX1NUQVRFLk5FV0VSX1ZFUlNJT05fSU5TVEFMTEVEXG4gICAgICAgICAgOiB0aGlzLkFQUF9JTlNUQUxMX1NUQVRFLlNBTUVfVkVSU0lPTl9JTlNUQUxMRUQ7XG4gICAgICB9XG4gICAgICBpZiAoIV8uaXNTdHJpbmcoYXBrVmVyc2lvbk5hbWUpIHx8ICFfLmlzU3RyaW5nKHBrZ1ZlcnNpb25OYW1lKSkge1xuICAgICAgICBsb2cuZGVidWcoYFRoZSB2ZXJzaW9uIG5hbWUgb2YgdGhlIGluc3RhbGxlZCAnJHtwa2d9JyBpcyBlcXVhbCB0byBhcHBsaWNhdGlvbiB2ZXJzaW9uIG5hbWUgKCR7cGtnVmVyc2lvbkNvZGV9ID09PSAke2Fwa1ZlcnNpb25Db2RlfSlgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuQVBQX0lOU1RBTExfU1RBVEUuU0FNRV9WRVJTSU9OX0lOU1RBTExFRDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoXy5pc1N0cmluZyhhcGtWZXJzaW9uTmFtZSkgJiYgXy5pc1N0cmluZyhwa2dWZXJzaW9uTmFtZSkgJiYgc2VtdmVyLnNhdGlzZmllcyhwa2dWZXJzaW9uTmFtZSwgYD49JHthcGtWZXJzaW9uTmFtZX1gKSkge1xuICAgIGxvZy5kZWJ1ZyhgVGhlIHZlcnNpb24gbmFtZSBvZiB0aGUgaW5zdGFsbGVkICcke3BrZ30nIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhlIGFwcGxpY2F0aW9uIHZlcnNpb24gbmFtZSAoJyR7cGtnVmVyc2lvbk5hbWV9JyA+PSAnJHthcGtWZXJzaW9uTmFtZX0nKWApO1xuICAgIHJldHVybiBzZW12ZXIuc2F0aXNmaWVzKHBrZ1ZlcnNpb25OYW1lLCBgPiR7YXBrVmVyc2lvbk5hbWV9YClcbiAgICAgID8gdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5ORVdFUl9WRVJTSU9OX0lOU1RBTExFRFxuICAgICAgOiB0aGlzLkFQUF9JTlNUQUxMX1NUQVRFLlNBTUVfVkVSU0lPTl9JTlNUQUxMRUQ7XG4gIH1cblxuICBsb2cuZGVidWcoYFRoZSBpbnN0YWxsZWQgJyR7cGtnfScgcGFja2FnZSBpcyBvbGRlciB0aGFuICcke2FwcFBhdGh9JyAoJHtwa2dWZXJzaW9uQ29kZX0gPCAke2Fwa1ZlcnNpb25Db2RlfSBvciAnJHtwa2dWZXJzaW9uTmFtZX0nIDwgJyR7YXBrVmVyc2lvbk5hbWV9JyknYCk7XG4gIHJldHVybiB0aGlzLkFQUF9JTlNUQUxMX1NUQVRFLk9MREVSX1ZFUlNJT05fSU5TVEFMTEVEO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsT3JVcGdyYWRlT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXQgWzYwMDAwXSAtIFRoZSBjb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHAgaXMgaW5zdGFsbGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBhbGxvd1Rlc3RQYWNrYWdlcyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gYWxsb3cgdGVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMgaW5zdGFsbGF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VTZGNhcmQgW2ZhbHNlXSAtIFNldCB0byB0cnVlIHRvIGluc3RhbGwgdGhlIGFwcCBvbiBTRENhcmRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIHRoZSBkZXZpY2UgbWVtb3J5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBncmFudFBlcm1pc3Npb25zIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBncmFudCBhbGwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zIHJlcXVlc3RlZCBpbiB0aGUgYXBwbGljYXRpb24ncyBtYW5pZmVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGFmdGVyIHRoZSBpbnN0YWxsYXRpb24gaXMgY29tcGxldGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyIEFuZHJvaWQgNisuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGVuZm9yY2VDdXJyZW50QnVpbGQgW2ZhbHNlXSAtIFNldCB0byBgdHJ1ZWAgaW4gb3JkZXIgdG8gYWx3YXlzIHByZWZlclxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBidWlsZCBvdmVyIGFueSBpbnN0YWxsZWQgcGFja2FnZXMgaGF2aW5nXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIGlkZW50aWZpZXJcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEluc3RhbGxPclVwZ3JhZGVSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gd2FzVW5pbnN0YWxsZWQgLSBFcXVhbHMgdG8gYHRydWVgIGlmIHRoZSB0YXJnZXQgYXBwIGhhcyBiZWVuIHVuaW5zdGFsbGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGJlaW5nIGluc3RhbGxlZFxuICogQHByb3BlcnR5IHtBUFBfSU5TVEFMTF9TVEFURX0gYXBwU3RhdGUgLSBPbmUgb2YgYGFkYi5BUFBfSU5TVEFMTF9TVEFURWAgc3RhdGVzLCB3aGljaCByZWZsZWN0c1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3RhdGUgb2YgdGhlIGFwcGxpY2F0aW9uIGJlZm9yZSBiZWluZyBpbnN0YWxsZWQuXG4gKi9cblxuLyoqXG4gKiBJbnN0YWxsIHRoZSBwYWNrYWdlIGZyb20gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIG9yIHVwZ3JhZGUgaXQgaWYgYW4gb2xkZXJcbiAqIHZlcnNpb24gb2YgdGhlIHNhbWUgcGFja2FnZSBpcyBhbHJlYWR5IGluc3RhbGxlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwUGF0aCAtIFRoZSBmdWxsIHBhdGggdG8gdGhlIGxvY2FsIHBhY2thZ2UuXG4gKiBAcGFyYW0gez9zdHJpbmd9IHBrZyAtIFRoZSBuYW1lIG9mIHRoZSBpbnN0YWxsZWQgcGFja2FnZS4gVGhlIG1ldGhvZCB3aWxsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gZmFzdGVyIGlmIGl0IGlzIHNldC5cbiAqIEBwYXJhbSB7P0luc3RhbGxPclVwZ3JhZGVPcHRpb25zfSBvcHRpb25zIC0gU2V0IG9mIGluc3RhbGwgb3B0aW9ucy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBhbiB1bmV4cGVjdGVkIGVycm9yIGhhcHBlbnMgZHVyaW5nIGluc3RhbGwuXG4gKiBAcmV0dXJucyB7SW5zdGFsbE9yVXBncmFkZVJlc3VsdH1cbiAqL1xuYXBrVXRpbHNNZXRob2RzLmluc3RhbGxPclVwZ3JhZGUgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsT3JVcGdyYWRlIChhcHBQYXRoLCBwa2cgPSBudWxsLCBvcHRpb25zID0ge30pIHtcbiAgaWYgKCFwa2cpIHtcbiAgICBjb25zdCBhcGtJbmZvID0gYXdhaXQgdGhpcy5nZXRBcGtJbmZvKGFwcFBhdGgpO1xuICAgIHBrZyA9IGFwa0luZm8ubmFtZTtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBlbmZvcmNlQ3VycmVudEJ1aWxkLFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgYXBwU3RhdGUgPSBhd2FpdCB0aGlzLmdldEFwcGxpY2F0aW9uSW5zdGFsbFN0YXRlKGFwcFBhdGgsIHBrZyk7XG4gIGxldCB3YXNVbmluc3RhbGxlZCA9IGZhbHNlO1xuICBjb25zdCB1bmluc3RhbGxQYWNrYWdlID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghYXdhaXQgdGhpcy51bmluc3RhbGxBcGsocGtnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtwa2d9JyBwYWNrYWdlIGNhbm5vdCBiZSB1bmluc3RhbGxlZGApO1xuICAgIH1cbiAgICB3YXNVbmluc3RhbGxlZCA9IHRydWU7XG4gIH07XG4gIHN3aXRjaCAoYXBwU3RhdGUpIHtcbiAgICBjYXNlIHRoaXMuQVBQX0lOU1RBTExfU1RBVEUuTk9UX0lOU1RBTExFRDpcbiAgICAgIGxvZy5kZWJ1ZyhgSW5zdGFsbGluZyAnJHthcHBQYXRofSdgKTtcbiAgICAgIGF3YWl0IHRoaXMuaW5zdGFsbChhcHBQYXRoLCBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7cmVwbGFjZTogZmFsc2V9KSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgd2FzVW5pbnN0YWxsZWQsXG4gICAgICB9O1xuICAgIGNhc2UgdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5ORVdFUl9WRVJTSU9OX0lOU1RBTExFRDpcbiAgICAgIGlmIChlbmZvcmNlQ3VycmVudEJ1aWxkKSB7XG4gICAgICAgIGxvZy5pbmZvKGBEb3duZ3JhZGluZyAnJHtwa2d9JyBhcyByZXF1ZXN0ZWRgKTtcbiAgICAgICAgYXdhaXQgdW5pbnN0YWxsUGFja2FnZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgVGhlcmUgaXMgbm8gbmVlZCB0byBkb3duZ3JhZGUgJyR7cGtnfSdgKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFwcFN0YXRlLFxuICAgICAgICB3YXNVbmluc3RhbGxlZCxcbiAgICAgIH07XG4gICAgY2FzZSB0aGlzLkFQUF9JTlNUQUxMX1NUQVRFLlNBTUVfVkVSU0lPTl9JTlNUQUxMRUQ6XG4gICAgICBpZiAoZW5mb3JjZUN1cnJlbnRCdWlsZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgVGhlcmUgaXMgbm8gbmVlZCB0byBpbnN0YWxsL3VwZ3JhZGUgJyR7YXBwUGF0aH0nYCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgd2FzVW5pbnN0YWxsZWQsXG4gICAgICB9O1xuICAgIGNhc2UgdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5PTERFUl9WRVJTSU9OX0lOU1RBTExFRDpcbiAgICAgIGxvZy5kZWJ1ZyhgRXhlY3V0aW5nIHVwZ3JhZGUgb2YgJyR7YXBwUGF0aH0nYCk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgbG9nLmRlYnVnKGBUaGUgY3VycmVudCBpbnN0YWxsIHN0YXRlIG9mICcke2FwcFBhdGh9JyBpcyB1bmtub3duLiBJbnN0YWxsaW5nIGFueXdheWApO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuaW5zdGFsbChhcHBQYXRoLCBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7cmVwbGFjZTogdHJ1ZX0pKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oYENhbm5vdCBpbnN0YWxsL3VwZ3JhZGUgJyR7cGtnfScgYmVjYXVzZSBvZiAnJHtlcnIubWVzc2FnZX0nLiBUcnlpbmcgZnVsbCByZWluc3RhbGxgKTtcbiAgICBhd2FpdCB1bmluc3RhbGxQYWNrYWdlKCk7XG4gICAgYXdhaXQgdGhpcy5pbnN0YWxsKGFwcFBhdGgsIE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMsIHtyZXBsYWNlOiBmYWxzZX0pKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGFwcFN0YXRlLFxuICAgIHdhc1VuaW5zdGFsbGVkLFxuICB9O1xufTtcblxuLyoqXG4gKiBFeHRyYWN0IHN0cmluZyByZXNvdXJjZXMgZnJvbSB0aGUgZ2l2ZW4gcGFja2FnZSBvbiBsb2NhbCBmaWxlIHN5c3RlbS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwUGF0aCAtIFRoZSBmdWxsIHBhdGggdG8gdGhlIC5hcGsocykgcGFja2FnZS5cbiAqIEBwYXJhbSB7P3N0cmluZ30gbGFuZ3VhZ2UgLSBUaGUgbmFtZSBvZiB0aGUgbGFuZ3VhZ2UgdG8gZXh0cmFjdCB0aGUgcmVzb3VyY2VzIGZvci5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBsYW5ndWFnZSBpcyB1c2VkIGlmIHRoaXMgZXF1YWxzIHRvIGBudWxsYC9gdW5kZWZpbmVkYFxuICogQHBhcmFtIHtzdHJpbmd9IG91dCAtIFRoZSBuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUgdGhlIGV4dHJhY3RlZCBmaWxlIHRvLlxuICogQHJldHVybiB7T2JqZWN0fSBBIG1hcHBpbmcgb2JqZWN0LCB3aGVyZSBwcm9wZXJ0aWVzIGFyZTogJ2Fwa1N0cmluZ3MnLCBjb250YWluaW5nXG4gKiAgICAgICAgICAgICAgICAgIHBhcnNlZCByZXNvdXJjZSBmaWxlIHJlcHJlc2VudGVkIGFzIEpTT04gb2JqZWN0LCBhbmQgJ2xvY2FsUGF0aCcsXG4gKiAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIHBhdGggdG8gdGhlIGV4dHJhY3RlZCBmaWxlIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS5cbiAqL1xuYXBrVXRpbHNNZXRob2RzLmV4dHJhY3RTdHJpbmdzRnJvbUFwayA9IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RTdHJpbmdzRnJvbUFwayAoYXBwUGF0aCwgbGFuZ3VhZ2UsIG91dCkge1xuICBsb2cuZGVidWcoYEV4dHJhY3Rpbmcgc3RyaW5ncyBmcm9tIGZvciBsYW5ndWFnZTogJHtsYW5ndWFnZSB8fCAnZGVmYXVsdCd9YCk7XG4gIGNvbnN0IG9yaWdpbmFsQXBwUGF0aCA9IGFwcFBhdGg7XG4gIGlmIChhcHBQYXRoLmVuZHNXaXRoKEFQS1NfRVhURU5TSU9OKSkge1xuICAgIGFwcFBhdGggPSBhd2FpdCB0aGlzLmV4dHJhY3RMYW5ndWFnZUFwayhhcHBQYXRoLCBsYW5ndWFnZSk7XG4gIH1cblxuICBsZXQgYXBrU3RyaW5ncyA9IHt9O1xuICBsZXQgY29uZmlnTWFya2VyO1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuaW5pdEFhcHQoKTtcblxuICAgIGNvbmZpZ01hcmtlciA9IGF3YWl0IGZvcm1hdENvbmZpZ01hcmtlcihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWModGhpcy5iaW5hcmllcy5hYXB0LCBbXG4gICAgICAgICdkJywgJ2NvbmZpZ3VyYXRpb25zJywgYXBwUGF0aCxcbiAgICAgIF0pO1xuICAgICAgcmV0dXJuIF8udW5pcShzdGRvdXQuc3BsaXQob3MuRU9MKSk7XG4gICAgfSwgbGFuZ3VhZ2UsICcoZGVmYXVsdCknKTtcblxuICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYyh0aGlzLmJpbmFyaWVzLmFhcHQsIFtcbiAgICAgICdkJywgJy0tdmFsdWVzJywgJ3Jlc291cmNlcycsIGFwcFBhdGgsXG4gICAgXSk7XG4gICAgYXBrU3RyaW5ncyA9IHBhcnNlQWFwdFN0cmluZ3Moc3Rkb3V0LCBjb25maWdNYXJrZXIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmRlYnVnKCdDYW5ub3QgZXh0cmFjdCByZXNvdXJjZXMgdXNpbmcgYWFwdC4gVHJ5aW5nIGFhcHQyLiAnICtcbiAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLnN0ZGVyciB8fCBlLm1lc3NhZ2V9YCk7XG5cbiAgICBhd2FpdCB0aGlzLmluaXRBYXB0MigpO1xuXG4gICAgY29uZmlnTWFya2VyID0gYXdhaXQgZm9ybWF0Q29uZmlnTWFya2VyKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYyh0aGlzLmJpbmFyaWVzLmFhcHQyLCBbXG4gICAgICAgICdkJywgJ2NvbmZpZ3VyYXRpb25zJywgYXBwUGF0aCxcbiAgICAgIF0pO1xuICAgICAgcmV0dXJuIF8udW5pcShzdGRvdXQuc3BsaXQob3MuRU9MKSk7XG4gICAgfSwgbGFuZ3VhZ2UsICcnKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWModGhpcy5iaW5hcmllcy5hYXB0MiwgW1xuICAgICAgICAnZCcsICdyZXNvdXJjZXMnLCBhcHBQYXRoLFxuICAgICAgXSk7XG4gICAgICBhcGtTdHJpbmdzID0gcGFyc2VBYXB0MlN0cmluZ3Moc3Rkb3V0LCBjb25maWdNYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGV4dHJhY3QgcmVzb3VyY2VzIGZyb20gJyR7b3JpZ2luYWxBcHBQYXRofScuIGAgK1xuICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChfLmlzRW1wdHkoYXBrU3RyaW5ncykpIHtcbiAgICBsb2cud2FybihgTm8gc3RyaW5ncyBoYXZlIGJlZW4gZm91bmQgaW4gJyR7b3JpZ2luYWxBcHBQYXRofScgcmVzb3VyY2VzIGAgK1xuICAgICAgYGZvciAnJHtjb25maWdNYXJrZXIgfHwgJ2RlZmF1bHQnfScgY29uZmlndXJhdGlvbmApO1xuICB9IGVsc2Uge1xuICAgIGxvZy5pbmZvKGBTdWNjZXNzZnVsbHkgZXh0cmFjdGVkICR7Xy5rZXlzKGFwa1N0cmluZ3MpLmxlbmd0aH0gc3RyaW5ncyBmcm9tIGAgK1xuICAgICAgYCcke29yaWdpbmFsQXBwUGF0aH0nIHJlc291cmNlcyBmb3IgJyR7Y29uZmlnTWFya2VyIHx8ICdkZWZhdWx0J30nIGNvbmZpZ3VyYXRpb25gKTtcbiAgfVxuXG4gIGNvbnN0IGxvY2FsUGF0aCA9IHBhdGgucmVzb2x2ZShvdXQsICdzdHJpbmdzLmpzb24nKTtcbiAgYXdhaXQgbWtkaXJwKG91dCk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShsb2NhbFBhdGgsIEpTT04uc3RyaW5naWZ5KGFwa1N0cmluZ3MsIG51bGwsIDIpLCAndXRmLTgnKTtcbiAgcmV0dXJuIHthcGtTdHJpbmdzLCBsb2NhbFBhdGh9O1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGxhbmd1YWdlIG5hbWUgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5hbWUgb2YgZGV2aWNlIGxhbmd1YWdlLlxuICovXG5hcGtVdGlsc01ldGhvZHMuZ2V0RGV2aWNlTGFuZ3VhZ2UgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VMYW5ndWFnZSAoKSB7XG4gIGxldCBsYW5ndWFnZTtcbiAgaWYgKGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKSA8IDIzKSB7XG4gICAgbGFuZ3VhZ2UgPSBhd2FpdCB0aGlzLmdldERldmljZVN5c0xhbmd1YWdlKCk7XG4gICAgaWYgKCFsYW5ndWFnZSkge1xuICAgICAgbGFuZ3VhZ2UgPSBhd2FpdCB0aGlzLmdldERldmljZVByb2R1Y3RMYW5ndWFnZSgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsYW5ndWFnZSA9IChhd2FpdCB0aGlzLmdldERldmljZUxvY2FsZSgpKS5zcGxpdCgnLScpWzBdO1xuICB9XG4gIHJldHVybiBsYW5ndWFnZTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBjb3VudHJ5IG5hbWUgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5hbWUgb2YgZGV2aWNlIGNvdW50cnkuXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5nZXREZXZpY2VDb3VudHJ5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlQ291bnRyeSAoKSB7XG4gIC8vIHRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZCBpbiBBUEkgPCAyM1xuICBsZXQgY291bnRyeSA9IGF3YWl0IHRoaXMuZ2V0RGV2aWNlU3lzQ291bnRyeSgpO1xuICBpZiAoIWNvdW50cnkpIHtcbiAgICBjb3VudHJ5ID0gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9kdWN0Q291bnRyeSgpO1xuICB9XG4gIHJldHVybiBjb3VudHJ5O1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGxvY2FsZSBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBuYW1lIG9mIGRldmljZSBsb2NhbGUuXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5nZXREZXZpY2VMb2NhbGUgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VMb2NhbGUgKCkge1xuICAvLyB0aGlzIG1ldGhvZCBpcyBvbmx5IHVzZWQgaW4gQVBJID49IDIzXG4gIGxldCBsb2NhbGUgPSBhd2FpdCB0aGlzLmdldERldmljZVN5c0xvY2FsZSgpO1xuICBpZiAoIWxvY2FsZSkge1xuICAgIGxvY2FsZSA9IGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvZHVjdExvY2FsZSgpO1xuICB9XG4gIHJldHVybiBsb2NhbGU7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgbG9jYWxlIG5hbWUgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0IGFuZCB0aGUgZm9ybWF0IG9mIHRoZSBsb2NhbGUgaXMgZW4tVVMsIGZvciBleGFtcGxlLlxuICogVGhpcyBtZXRob2QgY2FsbCBzZXREZXZpY2VMYW5ndWFnZUNvdW50cnksIHNvLCBwbGVhc2UgdXNlIHNldERldmljZUxhbmd1YWdlQ291bnRyeSBhcyBwb3NzaWJsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxlIC0gTmFtZXMgb2YgdGhlIGRldmljZSBsYW5ndWFnZSBhbmQgdGhlIGNvdW50cnkgY29ubmVjdGVkIHdpdGggYC1gLiBlLmcuIGVuLVVTLlxuICovXG5hcGtVdGlsc01ldGhvZHMuc2V0RGV2aWNlTG9jYWxlID0gYXN5bmMgZnVuY3Rpb24gc2V0RGV2aWNlTG9jYWxlIChsb2NhbGUpIHtcbiAgY29uc3QgdmFsaWRhdGVMb2NhbGUgPSBuZXcgUmVnRXhwKC9bYS16QS1aXSstW2EtekEtWjAtOV0rLyk7XG4gIGlmICghdmFsaWRhdGVMb2NhbGUudGVzdChsb2NhbGUpKSB7XG4gICAgbG9nLndhcm4oYHNldERldmljZUxvY2FsZSByZXF1aXJlcyB0aGUgZm9sbG93aW5nIGZvcm1hdDogZW4tVVMgb3IgamEtSlBgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgc3BsaXRfbG9jYWxlID0gbG9jYWxlLnNwbGl0KCctJyk7XG4gIGF3YWl0IHRoaXMuc2V0RGV2aWNlTGFuZ3VhZ2VDb3VudHJ5KHNwbGl0X2xvY2FsZVswXSwgc3BsaXRfbG9jYWxlWzFdKTtcbn07XG5cbi8qKlxuICogTWFrZSBzdXJlIGN1cnJlbnQgZGV2aWNlIGxvY2FsZSBpcyBleHBlY3RlZCBvciBub3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlIC0gTGFuZ3VhZ2UuIFRoZSBsYW5ndWFnZSBmaWVsZCBpcyBjYXNlIGluc2Vuc2l0aXZlLCBidXQgTG9jYWxlIGFsd2F5cyBjYW5vbmljYWxpemVzIHRvIGxvd2VyIGNhc2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gY291bnRyeSAtIENvdW50cnkuIFRoZSBsYW5ndWFnZSBmaWVsZCBpcyBjYXNlIGluc2Vuc2l0aXZlLCBidXQgTG9jYWxlIGFsd2F5cyBjYW5vbmljYWxpemVzIHRvIGxvd2VyIGNhc2UuXG4gKiBAcGFyYW0gez9zdHJpbmd9IHNjcmlwdCAtIFNjcmlwdC4gVGhlIHNjcmlwdCBmaWVsZCBpcyBjYXNlIGluc2Vuc2l0aXZlIGJ1dCBMb2NhbGUgYWx3YXlzIGNhbm9uaWNhbGl6ZXMgdG8gdGl0bGUgY2FzZS5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBJZiBjdXJyZW50IGxvY2FsZSBpcyBsYW5ndWFnZSBhbmQgY291bnRyeSBhcyBhcmd1bWVudHMsIHJldHVybiB0cnVlLlxuICovXG5hcGtVdGlsc01ldGhvZHMuZW5zdXJlQ3VycmVudExvY2FsZSA9IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUN1cnJlbnRMb2NhbGUgKGxhbmd1YWdlLCBjb3VudHJ5LCBzY3JpcHQgPSBudWxsKSB7XG4gIGNvbnN0IGhhc0xhbmd1YWdlID0gXy5pc1N0cmluZyhsYW5ndWFnZSk7XG4gIGNvbnN0IGhhc0NvdW50cnkgPSBfLmlzU3RyaW5nKGNvdW50cnkpO1xuXG4gIGlmICghaGFzTGFuZ3VhZ2UgJiYgIWhhc0NvdW50cnkpIHtcbiAgICBsb2cud2FybignZW5zdXJlQ3VycmVudExvY2FsZSByZXF1aXJlcyBsYW5ndWFnZSBvciBjb3VudHJ5Jyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gZ2V0IGxvd2VyIGNhc2UgdmVyc2lvbnMgb2YgdGhlIHN0cmluZ3NcbiAgbGFuZ3VhZ2UgPSAobGFuZ3VhZ2UgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gIGNvdW50cnkgPSAoY291bnRyeSB8fCAnJykudG9Mb3dlckNhc2UoKTtcblxuICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKTtcblxuICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbCg1LCAxMDAwLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChhcGlMZXZlbCA8IDIzKSB7XG4gICAgICAgIGxldCBjdXJMYW5ndWFnZSwgY3VyQ291bnRyeTtcbiAgICAgICAgaWYgKGhhc0xhbmd1YWdlKSB7XG4gICAgICAgICAgY3VyTGFuZ3VhZ2UgPSAoYXdhaXQgdGhpcy5nZXREZXZpY2VMYW5ndWFnZSgpKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGlmICghaGFzQ291bnRyeSAmJiBsYW5ndWFnZSA9PT0gY3VyTGFuZ3VhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzQ291bnRyeSkge1xuICAgICAgICAgIGN1ckNvdW50cnkgPSAoYXdhaXQgdGhpcy5nZXREZXZpY2VDb3VudHJ5KCkpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgaWYgKCFoYXNMYW5ndWFnZSAmJiBjb3VudHJ5ID09PSBjdXJDb3VudHJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhbmd1YWdlID09PSBjdXJMYW5ndWFnZSAmJiBjb3VudHJ5ID09PSBjdXJDb3VudHJ5KSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGN1ckxvY2FsZSA9IChhd2FpdCB0aGlzLmdldERldmljZUxvY2FsZSgpKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyB6aC1oYW5zLWNuIDogemgtY25cbiAgICAgICAgY29uc3QgbG9jYWxlQ29kZSA9IHNjcmlwdCA/IGAke2xhbmd1YWdlfS0ke3NjcmlwdC50b0xvd2VyQ2FzZSgpfS0ke2NvdW50cnl9YCA6IGAke2xhbmd1YWdlfS0ke2NvdW50cnl9YDtcblxuICAgICAgICBpZiAobG9jYWxlQ29kZSA9PT0gY3VyTG9jYWxlKSB7XG4gICAgICAgICAgbG9nLmRlYnVnKGBSZXF1ZXN0ZWQgbG9jYWxlIGlzIGVxdWFsIHRvIGN1cnJlbnQgbG9jYWxlOiAnJHtjdXJMb2NhbGV9J2ApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBpZiB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvciwgcmVzdGFydCBhZGIgYW5kIHJldHJ5XG4gICAgICBsb2cuZXJyb3IoYFVuYWJsZSB0byBjaGVjayBkZXZpY2UgbG9jYWxpemF0aW9uOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWNvbm5lY3QoKTtcbiAgICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgICBhd2FpdCB0aGlzLnJlc3RhcnRBZGIoKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGxvY2FsZSBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2UgLSBMYW5ndWFnZS4gVGhlIGxhbmd1YWdlIGZpZWxkIGlzIGNhc2UgaW5zZW5zaXRpdmUsIGJ1dCBMb2NhbGUgYWx3YXlzIGNhbm9uaWNhbGl6ZXMgdG8gbG93ZXIgY2FzZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogW2EtekEtWl17Miw4fS4gZS5nLiBlbiwgamEgOiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvamF2YS91dGlsL0xvY2FsZS5odG1sXG4gKiBAcGFyYW0ge3N0cmluZ30gY291bnRyeSAtIENvdW50cnkuIFRoZSBjb3VudHJ5IChyZWdpb24pIGZpZWxkIGlzIGNhc2UgaW5zZW5zaXRpdmUsIGJ1dCBMb2NhbGUgYWx3YXlzIGNhbm9uaWNhbGl6ZXMgdG8gdXBwZXIgY2FzZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogW2EtekEtWl17Mn0gfCBbMC05XXszfS4gZS5nLiBVUywgSlAgOiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvamF2YS91dGlsL0xvY2FsZS5odG1sXG4gKiBAcGFyYW0gez9zdHJpbmd9IHNjcmlwdCAtIFNjcmlwdC4gVGhlIHNjcmlwdCBmaWVsZCBpcyBjYXNlIGluc2Vuc2l0aXZlIGJ1dCBMb2NhbGUgYWx3YXlzIGNhbm9uaWNhbGl6ZXMgdG8gdGl0bGUgY2FzZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogW2EtekEtWl17NH0uIGUuZy4gSGFucyBpbiB6aC1IYW5zLUNOIDogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2phdmEvdXRpbC9Mb2NhbGUuaHRtbFxuICovXG5hcGtVdGlsc01ldGhvZHMuc2V0RGV2aWNlTGFuZ3VhZ2VDb3VudHJ5ID0gYXN5bmMgZnVuY3Rpb24gc2V0RGV2aWNlTGFuZ3VhZ2VDb3VudHJ5IChsYW5ndWFnZSwgY291bnRyeSwgc2NyaXB0ID0gbnVsbCkge1xuICBsZXQgaGFzTGFuZ3VhZ2UgPSBsYW5ndWFnZSAmJiBfLmlzU3RyaW5nKGxhbmd1YWdlKTtcbiAgbGV0IGhhc0NvdW50cnkgPSBjb3VudHJ5ICYmIF8uaXNTdHJpbmcoY291bnRyeSk7XG4gIGlmICghaGFzTGFuZ3VhZ2UgfHwgIWhhc0NvdW50cnkpIHtcbiAgICBsb2cud2Fybihgc2V0RGV2aWNlTGFuZ3VhZ2VDb3VudHJ5IHJlcXVpcmVzIGxhbmd1YWdlIGFuZCBjb3VudHJ5IGF0IGxlYXN0YCk7XG4gICAgbG9nLndhcm4oYEdvdCBsYW5ndWFnZTogJyR7bGFuZ3VhZ2V9JyBhbmQgY291bnRyeTogJyR7Y291bnRyeX0nYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKTtcblxuICBsYW5ndWFnZSA9IChsYW5ndWFnZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgY291bnRyeSA9IChjb3VudHJ5IHx8ICcnKS50b1VwcGVyQ2FzZSgpO1xuXG4gIGlmIChhcGlMZXZlbCA8IDIzKSB7XG4gICAgbGV0IGN1ckxhbmd1YWdlID0gKGF3YWl0IHRoaXMuZ2V0RGV2aWNlTGFuZ3VhZ2UoKSkudG9Mb3dlckNhc2UoKTtcbiAgICBsZXQgY3VyQ291bnRyeSA9IChhd2FpdCB0aGlzLmdldERldmljZUNvdW50cnkoKSkudG9VcHBlckNhc2UoKTtcblxuICAgIGlmIChsYW5ndWFnZSAhPT0gY3VyTGFuZ3VhZ2UgfHwgY291bnRyeSAhPT0gY3VyQ291bnRyeSkge1xuICAgICAgYXdhaXQgdGhpcy5zZXREZXZpY2VTeXNMb2NhbGVWaWFTZXR0aW5nQXBwKGxhbmd1YWdlLCBjb3VudHJ5KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGN1ckxvY2FsZSA9IGF3YWl0IHRoaXMuZ2V0RGV2aWNlTG9jYWxlKCk7XG5cbiAgICAvLyB6aC1IYW5zLUNOIDogemgtQ05cbiAgICBjb25zdCBsb2NhbGVDb2RlID0gc2NyaXB0ID8gYCR7bGFuZ3VhZ2V9LSR7c2NyaXB0fS0ke2NvdW50cnl9YCA6IGAke2xhbmd1YWdlfS0ke2NvdW50cnl9YDtcbiAgICBsb2cuZGVidWcoYEN1cnJlbnQgbG9jYWxlOiAnJHtjdXJMb2NhbGV9JzsgcmVxdWVzdGVkIGxvY2FsZTogJyR7bG9jYWxlQ29kZX0nYCk7XG4gICAgaWYgKGxvY2FsZUNvZGUudG9Mb3dlckNhc2UoKSAhPT0gY3VyTG9jYWxlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0RGV2aWNlU3lzTG9jYWxlVmlhU2V0dGluZ0FwcChsYW5ndWFnZSwgY291bnRyeSwgc2NyaXB0KTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQXBwSW5mb1xuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBQYWNrYWdlIG5hbWUsIGZvciBleGFtcGxlICdjb20uYWNtZS5hcHAnLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHZlcnNpb25Db2RlIC0gVmVyc2lvbiBjb2RlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb25OYW1lIC0gVmVyc2lvbiBuYW1lLCBmb3IgZXhhbXBsZSAnMS4wJy5cbiAqL1xuXG4vKipcbiAqIEdldCB0aGUgcGFja2FnZSBpbmZvIGZyb20gbG9jYWwgYXBrIGZpbGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggLSBUaGUgZnVsbCBwYXRoIHRvIGV4aXN0aW5nIC5hcGsocykgcGFja2FnZSBvbiB0aGUgbG9jYWxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBzeXN0ZW0uXG4gKiBAcmV0dXJuIHs/QXBwSW5mb30gVGhlIHBhcnNlZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbi5cbiAqL1xuYXBrVXRpbHNNZXRob2RzLmdldEFwa0luZm8gPSBhc3luYyBmdW5jdGlvbiBnZXRBcGtJbmZvIChhcHBQYXRoKSB7XG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKGFwcFBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZmlsZSBhdCBwYXRoICR7YXBwUGF0aH0gZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGFjY2Vzc2libGVgKTtcbiAgfVxuXG4gIGlmIChhcHBQYXRoLmVuZHNXaXRoKEFQS1NfRVhURU5TSU9OKSkge1xuICAgIGFwcFBhdGggPSBhd2FpdCB0aGlzLmV4dHJhY3RCYXNlQXBrKGFwcFBhdGgpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBhcGtSZWFkZXIgPSBhd2FpdCBBcGtSZWFkZXIub3BlbihhcHBQYXRoKTtcbiAgICBjb25zdCBtYW5pZmVzdCA9IGF3YWl0IGFwa1JlYWRlci5yZWFkTWFuaWZlc3QoKTtcbiAgICBjb25zdCB7cGtnLCB2ZXJzaW9uTmFtZSwgdmVyc2lvbkNvZGV9ID0gcGFyc2VNYW5pZmVzdChtYW5pZmVzdCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHBrZyxcbiAgICAgIHZlcnNpb25Db2RlLFxuICAgICAgdmVyc2lvbk5hbWUsXG4gICAgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy53YXJuKGBFcnJvciAnJHtlLm1lc3NhZ2V9JyB3aGlsZSBnZXR0aW5nIGJhZGdpbmcgaW5mb2ApO1xuICB9XG4gIHJldHVybiB7fTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBwYWNrYWdlIGluZm8gZnJvbSB0aGUgaW5zdGFsbGVkIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgbmFtZSBvZiB0aGUgaW5zdGFsbGVkIHBhY2thZ2UuXG4gKiBAcmV0dXJuIHs/QXBwSW5mb30gVGhlIHBhcnNlZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbi5cbiAqL1xuYXBrVXRpbHNNZXRob2RzLmdldFBhY2thZ2VJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUluZm8gKHBrZykge1xuICBsb2cuZGVidWcoYEdldHRpbmcgcGFja2FnZSBpbmZvIGZvciAnJHtwa2d9J2ApO1xuICBsZXQgcmVzdWx0ID0ge25hbWU6IHBrZ307XG4gIHRyeSB7XG4gICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIHBrZ10pO1xuICAgIGNvbnN0IHZlcnNpb25OYW1lTWF0Y2ggPSBuZXcgUmVnRXhwKC92ZXJzaW9uTmFtZT0oW1xcZCsuXSspLykuZXhlYyhzdGRvdXQpO1xuICAgIGlmICh2ZXJzaW9uTmFtZU1hdGNoKSB7XG4gICAgICByZXN1bHQudmVyc2lvbk5hbWUgPSB2ZXJzaW9uTmFtZU1hdGNoWzFdO1xuICAgIH1cbiAgICBjb25zdCB2ZXJzaW9uQ29kZU1hdGNoID0gbmV3IFJlZ0V4cCgvdmVyc2lvbkNvZGU9KFxcZCspLykuZXhlYyhzdGRvdXQpO1xuICAgIGlmICh2ZXJzaW9uQ29kZU1hdGNoKSB7XG4gICAgICByZXN1bHQudmVyc2lvbkNvZGUgPSBwYXJzZUludCh2ZXJzaW9uQ29kZU1hdGNoWzFdLCAxMCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKGBFcnJvciAnJHtlcnIubWVzc2FnZX0nIHdoaWxlIGR1bXBpbmcgcGFja2FnZSBpbmZvYCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmFwa1V0aWxzTWV0aG9kcy5wdWxsQXBrID0gYXN5bmMgZnVuY3Rpb24gcHVsbEFwayAocGtnLCB0bXBEaXIpIHtcbiAgY29uc3QgcGtnUGF0aCA9IChhd2FpdCB0aGlzLmFkYkV4ZWMoWydzaGVsbCcsICdwbScsICdwYXRoJywgcGtnXSkpLnJlcGxhY2UoJ3BhY2thZ2U6JywgJycpO1xuICBjb25zdCB0bXBBcHAgPSBwYXRoLnJlc29sdmUodG1wRGlyLCBgJHtwa2d9LmFwa2ApO1xuICBhd2FpdCB0aGlzLnB1bGwocGtnUGF0aCwgdG1wQXBwKTtcbiAgbG9nLmRlYnVnKGBQdWxsZWQgYXBwIGZvciBwYWNrYWdlICcke3BrZ30nIHRvICcke3RtcEFwcH0nYCk7XG4gIHJldHVybiB0bXBBcHA7XG59O1xuXG5leHBvcnQgeyBSRU1PVEVfQ0FDSEVfUk9PVCB9O1xuZXhwb3J0IGRlZmF1bHQgYXBrVXRpbHNNZXRob2RzO1xuIl0sImZpbGUiOiJsaWIvdG9vbHMvYXBrLXV0aWxzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
966
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9hcGstdXRpbHMuanMiXSwibmFtZXMiOlsiYXBrVXRpbHNNZXRob2RzIiwiQUNUSVZJVElFU19UUk9VQkxFU0hPT1RJTkdfTElOSyIsIkFQUF9JTlNUQUxMX1NUQVRFIiwiVU5LTk9XTiIsIk5PVF9JTlNUQUxMRUQiLCJORVdFUl9WRVJTSU9OX0lOU1RBTExFRCIsIlNBTUVfVkVSU0lPTl9JTlNUQUxMRUQiLCJPTERFUl9WRVJTSU9OX0lOU1RBTExFRCIsIlJFTU9URV9DQUNIRV9ST09UIiwiaXNBcHBJbnN0YWxsZWQiLCJwa2ciLCJsb2ciLCJkZWJ1ZyIsImluc3RhbGxlZFBhdHRlcm4iLCJSZWdFeHAiLCJfIiwiZXNjYXBlUmVnRXhwIiwic3Rkb3V0Iiwic2hlbGwiLCJpc0luc3RhbGxlZCIsInRlc3QiLCJlIiwiRXJyb3IiLCJtZXNzYWdlIiwic3RhcnRVcmkiLCJ1cmkiLCJvcHRzIiwid2FpdEZvckxhdW5jaCIsImFyZ3MiLCJwdXNoIiwicmVzIiwidG9Mb3dlckNhc2UiLCJpbmNsdWRlcyIsInN0YXJ0QXBwIiwic3RhcnRBcHBPcHRpb25zIiwiYWN0aXZpdHkiLCJhY3Rpb24iLCJjbG9uZSIsInJlcGxhY2UiLCJkZWZhdWx0cyIsIndhaXRQa2ciLCJ3YWl0QWN0aXZpdHkiLCJyZXRyeSIsInN0b3BBcHAiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwiY21kIiwiaW50ZW50TmFtZSIsIm9wdGlvbmFsSW50ZW50QXJndW1lbnRzIiwic2hlbGxPcHRzIiwiaXNJbnRlZ2VyIiwid2FpdER1cmF0aW9uIiwidGltZW91dCIsInN0YXJ0c1dpdGgiLCJ3YWl0Rm9yQWN0aXZpdHkiLCJhcHBEZXNjcmlwdG9yIiwiZHVtcFdpbmRvd3MiLCJkdW1wc3lzQXJnIiwiZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSIsIm51bGxGb2N1c2VkQXBwUmUiLCJmb2N1c2VkQXBwUmUiLCJudWxsQ3VycmVudEZvY3VzUmUiLCJjdXJyZW50Rm9jdXNBcHBSZSIsInBhdHRlcm4iLCJtYXRjaCIsImV4ZWMiLCJhcHBQYWNrYWdlIiwidHJpbSIsImFwcEFjdGl2aXR5Iiwid2FpdEZvckFjdGl2aXR5T3JOb3QiLCJ3YWl0Rm9yU3RvcCIsIndhaXRNcyIsInNwbGl0TmFtZXMiLCJuYW1lcyIsInNwbGl0IiwibWFwIiwibmFtZSIsImFsbFBhY2thZ2VzIiwiYWxsQWN0aXZpdGllcyIsInBvc3NpYmxlQWN0aXZpdHlOYW1lcyIsIm9uZUFjdGl2aXR5IiwiY3VycmVudFBrZyIsImpvaW4iLCJwb3NzaWJsZUFjdGl2aXR5UGF0dGVybnMiLCJhY3ROYW1lIiwiY29uZGl0aW9uRnVuYyIsImZ1bGx5UXVhbGlmaWVkQWN0aXZpdHkiLCJpc0FjdGl2aXR5Rm91bmQiLCJzb21lIiwicCIsInBhcnNlSW50IiwiaW50ZXJ2YWxNcyIsImFjdCIsIndhaXRGb3JOb3RBY3Rpdml0eSIsInVuaW5zdGFsbEFwayIsIm9wdGlvbnMiLCJpbmZvIiwia2VlcERhdGEiLCJmb3JjZVN0b3AiLCJhZGJFeGVjIiwiaW5zdGFsbEZyb21EZXZpY2VQYXRoIiwiYXBrUGF0aE9uRGV2aWNlIiwiaW5kZXhPZiIsImNhY2hlQXBrIiwiYXBrUGF0aCIsImFwcEhhc2giLCJmcyIsImhhc2giLCJyZW1vdGVQYXRoIiwicGF0aCIsInBvc2l4IiwicmVtb3RlQ2FjaGVkRmlsZXMiLCJlcnJvck1hcmtlciIsImxzT3V0cHV0IiwiX2FyZUV4dGVuZGVkTHNPcHRpb25zU3VwcG9ydGVkIiwiaXNCb29sZWFuIiwiaXNTdHJpbmciLCJzdWJzdHJpbmciLCJ4IiwiZmlsdGVyIiwiQm9vbGVhbiIsImxlbmd0aCIsInRvSGFzaCIsInBhcnNlIiwiY2F0Y2giLCJ0aW1lciIsInRpbWluZyIsIlRpbWVyIiwic3RhcnQiLCJzaXplIiwic3RhdCIsImJhc2VuYW1lIiwidXRpbCIsInRvUmVhZGFibGVTaXplU3RyaW5nIiwiZ2V0RHVyYXRpb24iLCJhc01pbGxpU2Vjb25kcyIsInRvRml4ZWQiLCJyZW1vdGVBcHBzQ2FjaGUiLCJMUlUiLCJtYXgiLCJyZW1vdGVBcHBzQ2FjaGVMaW1pdCIsImRpZmZlcmVuY2UiLCJrZXlzIiwiZm9yRWFjaCIsImRlbCIsInNldCIsImVudHJpZXNUb0NsZWFudXAiLCJoYXMiLCJzbGljZSIsImlzRW1wdHkiLCJ3YXJuIiwiaW5zdGFsbCIsImFwcFBhdGgiLCJlbmRzV2l0aCIsIkFQS1NfRVhURU5TSU9OIiwiaW5zdGFsbEFwa3MiLCJjbG9uZURlZXAiLCJhZGJFeGVjVGltZW91dCIsIkRFRkFVTFRfQURCX0VYRUNfVElNRU9VVCIsIkFQS19JTlNUQUxMX1RJTUVPVVQiLCJ0aW1lb3V0Q2FwTmFtZSIsImluc3RhbGxBcmdzIiwibm9JbmNyZW1lbnRhbCIsImlzSW5jcmVtZW50YWxJbnN0YWxsU3VwcG9ydGVkIiwiaW5zdGFsbE9wdHMiLCJpbnN0YWxsQ21kIiwicGVyZm9ybUFwcEluc3RhbGwiLCJzaG91bGRDYWNoZUFwcCIsImlzU3RyZWFtZWRJbnN0YWxsU3VwcG9ydGVkIiwiY2xlYXJDYWNoZSIsImNhY2hlQXBwIiwiY2FjaGVkQXBwUGF0aCIsInBtSW5zdGFsbENtZEJ5UmVtb3RlUGF0aCIsIm91dHB1dCIsIm5ld0NhY2hlZEFwcFBhdGgiLCJ0cnVuY2F0ZWRPdXRwdXQiLCJzdWJzdHIiLCJpc1Rlc3RQYWNrYWdlT25seUVycm9yIiwibXNnIiwiZXJyIiwiZ2V0QXBwbGljYXRpb25JbnN0YWxsU3RhdGUiLCJhcGtJbmZvIiwiZ2V0QXBrSW5mbyIsInZlcnNpb25Db2RlIiwicGtnVmVyc2lvbkNvZGUiLCJ2ZXJzaW9uTmFtZSIsInBrZ1ZlcnNpb25OYW1lU3RyIiwiZ2V0UGFja2FnZUluZm8iLCJwa2dWZXJzaW9uTmFtZSIsInNlbXZlciIsInZhbGlkIiwiY29lcmNlIiwiYXBrVmVyc2lvbkNvZGUiLCJhcGtWZXJzaW9uTmFtZVN0ciIsImFwa1ZlcnNpb25OYW1lIiwic2F0aXNmaWVzIiwiaW5zdGFsbE9yVXBncmFkZSIsImVuZm9yY2VDdXJyZW50QnVpbGQiLCJhcHBTdGF0ZSIsIndhc1VuaW5zdGFsbGVkIiwidW5pbnN0YWxsUGFja2FnZSIsIk9iamVjdCIsImFzc2lnbiIsImV4dHJhY3RTdHJpbmdzRnJvbUFwayIsImxhbmd1YWdlIiwib3V0Iiwib3JpZ2luYWxBcHBQYXRoIiwiZXh0cmFjdExhbmd1YWdlQXBrIiwiYXBrU3RyaW5ncyIsImNvbmZpZ01hcmtlciIsImluaXRBYXB0IiwiYmluYXJpZXMiLCJhYXB0IiwidW5pcSIsIm9zIiwiRU9MIiwic3RkZXJyIiwiaW5pdEFhcHQyIiwiYWFwdDIiLCJsb2NhbFBhdGgiLCJyZXNvbHZlIiwid3JpdGVGaWxlIiwiSlNPTiIsInN0cmluZ2lmeSIsImdldERldmljZUxhbmd1YWdlIiwiZ2V0RGV2aWNlU3lzTGFuZ3VhZ2UiLCJnZXREZXZpY2VQcm9kdWN0TGFuZ3VhZ2UiLCJnZXREZXZpY2VMb2NhbGUiLCJnZXREZXZpY2VDb3VudHJ5IiwiY291bnRyeSIsImdldERldmljZVN5c0NvdW50cnkiLCJnZXREZXZpY2VQcm9kdWN0Q291bnRyeSIsImxvY2FsZSIsImdldERldmljZVN5c0xvY2FsZSIsImdldERldmljZVByb2R1Y3RMb2NhbGUiLCJzZXREZXZpY2VMb2NhbGUiLCJ2YWxpZGF0ZUxvY2FsZSIsInNwbGl0X2xvY2FsZSIsInNldERldmljZUxhbmd1YWdlQ291bnRyeSIsImVuc3VyZUN1cnJlbnRMb2NhbGUiLCJzY3JpcHQiLCJoYXNMYW5ndWFnZSIsImhhc0NvdW50cnkiLCJjdXJMYW5ndWFnZSIsImN1ckNvdW50cnkiLCJjdXJMb2NhbGUiLCJsb2NhbGVDb2RlIiwiZXJyb3IiLCJyZWNvbm5lY3QiLCJpZ24iLCJyZXN0YXJ0QWRiIiwidG9VcHBlckNhc2UiLCJzZXREZXZpY2VTeXNMb2NhbGVWaWFTZXR0aW5nQXBwIiwiZXhpc3RzIiwiZXh0cmFjdEJhc2VBcGsiLCJhcGtSZWFkZXIiLCJBcGtSZWFkZXIiLCJvcGVuIiwibWFuaWZlc3QiLCJyZWFkTWFuaWZlc3QiLCJyZXN1bHQiLCJ2ZXJzaW9uTmFtZU1hdGNoIiwidmVyc2lvbkNv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Z0JBQWdCLEdBQUcsSUFBSXhQLE1BQUosQ0FBVyxtQkFBWCxFQUFnQ21ELElBQWhDLENBQXFDaEQsTUFBckMsQ0FBekI7O0FBQ0EsUUFBSXFQLGdCQUFKLEVBQXNCO0FBQ3BCRixNQUFBQSxNQUFNLENBQUM3RSxXQUFQLEdBQXFCN0YsUUFBUSxDQUFDNEssZ0JBQWdCLENBQUMsQ0FBRCxDQUFqQixFQUFzQixFQUF0QixDQUE3QjtBQUNEOztBQUNELFdBQU9GLE1BQVA7QUFDRCxHQVhELENBV0UsT0FBT2pGLEdBQVAsRUFBWTtBQUNaeEssb0JBQUkySSxJQUFKLENBQVUsVUFBUzZCLEdBQUcsQ0FBQzVKLE9BQVEsOEJBQS9CO0FBQ0Q7O0FBQ0QsU0FBTzZPLE1BQVA7QUFDRCxDQWxCRDs7QUFvQkFwUSxlQUFlLENBQUN1USxPQUFoQixHQUEwQixlQUFlQSxPQUFmLENBQXdCN1AsR0FBeEIsRUFBNkI4UCxNQUE3QixFQUFxQztBQUM3RCxRQUFNQyxPQUFPLEdBQUcsQ0FBQyxNQUFNLEtBQUt0SyxPQUFMLENBQWEsQ0FBQyxPQUFELEVBQVUsSUFBVixFQUFnQixNQUFoQixFQUF3QnpGLEdBQXhCLENBQWIsQ0FBUCxFQUFtRDRCLE9BQW5ELENBQTJELFVBQTNELEVBQXVFLEVBQXZFLENBQWhCOztBQUNBLFFBQU1vTyxNQUFNLEdBQUc3SixjQUFLK0csT0FBTCxDQUFhNEMsTUFBYixFQUFzQixHQUFFOVAsR0FBSSxNQUE1QixDQUFmOztBQUNBLFFBQU0sS0FBS2lRLElBQUwsQ0FBVUYsT0FBVixFQUFtQkMsTUFBbkIsQ0FBTjs7QUFDQS9QLGtCQUFJQyxLQUFKLENBQVcsMkJBQTBCRixHQUFJLFNBQVFnUSxNQUFPLEdBQXhEOztBQUNBLFNBQU9BLE1BQVA7QUFDRCxDQU5EOztlQVNlMVEsZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGJ1aWxkU3RhcnRDbWQsIEFQS1NfRVhURU5TSU9OLCBidWlsZEluc3RhbGxBcmdzLFxuICBBUEtfSU5TVEFMTF9USU1FT1VULCBERUZBVUxUX0FEQl9FWEVDX1RJTUVPVVQsXG4gIHBhcnNlTWFuaWZlc3QsIHBhcnNlQWFwdFN0cmluZ3MsIHBhcnNlQWFwdDJTdHJpbmdzLCBmb3JtYXRDb25maWdNYXJrZXIsXG4gIGVzY2FwZVNoZWxsQXJnLFxufSBmcm9tICcuLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCwgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IGZzLCB1dGlsLCBta2RpcnAsIHRpbWluZyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IExSVSBmcm9tICdscnUtY2FjaGUnO1xuaW1wb3J0IEFwa1JlYWRlciBmcm9tICdhZGJraXQtYXBrcmVhZGVyJztcblxuY29uc3QgYXBrVXRpbHNNZXRob2RzID0ge307XG5cbmNvbnN0IEFDVElWSVRJRVNfVFJPVUJMRVNIT09USU5HX0xJTksgPVxuICAnaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vYmxvYi9tYXN0ZXIvZG9jcy9lbi93cml0aW5nLXJ1bm5pbmctYXBwaXVtL2FuZHJvaWQvYWN0aXZpdHktc3RhcnR1cC5tZCc7XG5hcGtVdGlsc01ldGhvZHMuQVBQX0lOU1RBTExfU1RBVEUgPSB7XG4gIFVOS05PV046ICd1bmtub3duJyxcbiAgTk9UX0lOU1RBTExFRDogJ25vdEluc3RhbGxlZCcsXG4gIE5FV0VSX1ZFUlNJT05fSU5TVEFMTEVEOiAnbmV3ZXJWZXJzaW9uSW5zdGFsbGVkJyxcbiAgU0FNRV9WRVJTSU9OX0lOU1RBTExFRDogJ3NhbWVWZXJzaW9uSW5zdGFsbGVkJyxcbiAgT0xERVJfVkVSU0lPTl9JTlNUQUxMRUQ6ICdvbGRlclZlcnNpb25JbnN0YWxsZWQnLFxufTtcbmNvbnN0IFJFTU9URV9DQUNIRV9ST09UID0gJy9kYXRhL2xvY2FsL3RtcC9hcHBpdW1fY2FjaGUnO1xuXG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgcGFydGljdWxhciBwYWNrYWdlIGlzIHByZXNlbnQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBjaGVjay5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBkZXRlY3RpbmcgYXBwbGljYXRpb24gc3RhdGVcbiAqL1xuYXBrVXRpbHNNZXRob2RzLmlzQXBwSW5zdGFsbGVkID0gYXN5bmMgZnVuY3Rpb24gaXNBcHBJbnN0YWxsZWQgKHBrZykge1xuICBsb2cuZGVidWcoYEdldHRpbmcgaW5zdGFsbCBzdGF0dXMgZm9yICR7cGtnfWApO1xuICBjb25zdCBpbnN0YWxsZWRQYXR0ZXJuID0gbmV3IFJlZ0V4cChgXlxcXFxzKlBhY2thZ2VcXFxccytcXFxcWyR7Xy5lc2NhcGVSZWdFeHAocGtnKX1cXFxcXVteOl0rOiRgLCAnbScpO1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgICBjb25zdCBpc0luc3RhbGxlZCA9IGluc3RhbGxlZFBhdHRlcm4udGVzdChzdGRvdXQpO1xuICAgIGxvZy5kZWJ1ZyhgJyR7cGtnfScgaXMkeyFpc0luc3RhbGxlZCA/ICcgbm90JyA6ICcnfSBpbnN0YWxsZWRgKTtcbiAgICByZXR1cm4gaXNJbnN0YWxsZWQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGZpbmRpbmcgaWYgJyR7cGtnfScgaXMgaW5zdGFsbGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3RhcnRVcmlPcHRpb25zXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSB3YWl0Rm9yTGF1bmNoIFt0cnVlXSAtIGlmIGBmYWxzZWAgdGhlbiBhZGIgd29uJ3Qgd2FpdFxuICogZm9yIHRoZSBzdGFydGVkIGFjdGl2aXR5IHRvIHJldHVybiB0aGUgY29udHJvbFxuICovXG5cbi8qKlxuICogU3RhcnQgdGhlIHBhcnRpY3VsYXIgVVJJIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJpIC0gVGhlIG5hbWUgb2YgVVJJIHRvIHN0YXJ0LlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIHN0YXJ0IHRoZSBVUkkgd2l0aC5cbiAqIEBwYXJhbSB7U3RhcnRVcmlPcHRpb25zfSBvcHRzXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5zdGFydFVyaSA9IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0VXJpICh1cmksIHBrZywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB3YWl0Rm9yTGF1bmNoID0gdHJ1ZSxcbiAgfSA9IG9wdHM7XG5cbiAgaWYgKCF1cmkgfHwgIXBrZykge1xuICAgIHRocm93IG5ldyBFcnJvcignVVJJIGFuZCBwYWNrYWdlIGFyZ3VtZW50cyBhcmUgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGNvbnN0IGFyZ3MgPSBbJ2FtJywgJ3N0YXJ0J107XG4gIGlmICh3YWl0Rm9yTGF1bmNoKSB7XG4gICAgYXJncy5wdXNoKCctVycpO1xuICB9XG4gIGFyZ3MucHVzaCgnLWEnLCAnYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlZJRVcnLFxuICAgICctZCcsIGVzY2FwZVNoZWxsQXJnKHVyaSksXG4gICAgcGtnKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2hlbGwoYXJncyk7XG4gICAgaWYgKHJlcy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCd1bmFibGUgdG8gcmVzb2x2ZSBpbnRlbnQnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHJlcyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBhdHRlbXB0aW5nIHRvIHN0YXJ0IFVSSS4gT3JpZ2luYWwgZXJyb3I6ICR7ZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdGFydEFwcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gcGtnIC0gVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2VcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gYWN0aXZpdHkgLSBUaGUgbmFtZSBvZiB0aGUgbWFpbiBhcHBsaWNhdGlvbiBhY3Rpdml0eS5cbiAqIFRoaXMgb3IgYWN0aW9uIGlzIHJlcXVpcmVkIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gbGF1bmNoIGFuIGFwcC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gYWN0aW9uIC0gVGhlIG5hbWUgb2YgdGhlIGludGVudCBhY3Rpb24gdGhhdCB3aWxsIGxhdW5jaCB0aGUgcmVxdWlyZWQgYXBwLlxuICogVGhpcyBvciBhY3Rpdml0eSBpcyByZXF1aXJlZCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGxhdW5jaCBhbiBhcHAuXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSByZXRyeSBbdHJ1ZV0gLSBJZiB0aGlzIHByb3BlcnR5IGlzIHNldCB0byBgdHJ1ZWBcbiAqIGFuZCB0aGUgYWN0aXZpdHkgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoICcuJyB0aGVuIHRoZSBtZXRob2RcbiAqIHdpbGwgdHJ5IHRvIGFkZCB0aGUgbWlzc2luZyBkb3QgYW5kIHN0YXJ0IHRoZSBhY3Rpdml0eSBvbmNlIG1vcmVcbiAqIGlmIHRoZSBmaXJzdCBzdGFydHVwIHRyeSBmYWlscy5cbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IHN0b3BBcHAgW3RydWVdIC0gU2V0IGl0IHRvIGB0cnVlYCBpbiBvcmRlciB0byBmb3JjZWZ1bGx5XG4gKiBzdG9wIHRoZSBhY3Rpdml0eSBpZiBpdCBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHdhaXRQa2cgLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byB3YWl0IHRvIG9uXG4gKiBzdGFydHVwICh0aGlzIG9ubHkgbWFrZXMgc2Vuc2UgaWYgdGhpcyBuYW1lIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUsIHdoaWNoIGlzIHNldCBhcyBgcGtnYClcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gd2FpdEFjdGl2aXR5IC0gVGhlIG5hbWUgb2YgdGhlIGFjdGl2aXR5IHRvIHdhaXQgdG8gb25cbiAqIHN0YXJ0dXAgKHRoaXMgb25seSBtYWtlcyBzZW5zZSBpZiB0aGlzIG5hbWUgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9uZSwgd2hpY2ggaXMgc2V0IGFzIGBhY3Rpdml0eWApXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHdhaXREdXJhdGlvbiAtIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgdGhlXG4gKiBgd2FpdEFjdGl2aXR5YCBpcyBmb2N1c2VkXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8bnVtYmVyfSB1c2VyIC0gVGhlIG51bWJlciBvZiB0aGUgdXNlciBwcm9maWxlIHRvIHN0YXJ0XG4gKiB0aGUgZ2l2ZW4gYWN0aXZpdHkgd2l0aC4gVGhlIGRlZmF1bHQgT1MgdXNlciBwcm9maWxlICh1c3VhbGx5IHplcm8pIGlzIHVzZWRcbiAqIHdoZW4gdGhpcyBwcm9wZXJ0eSBpcyB1bnNldFxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gd2FpdEZvckxhdW5jaCBbdHJ1ZV0gLSBpZiBgZmFsc2VgIHRoZW4gYWRiIHdvbid0IHdhaXRcbiAqIGZvciB0aGUgc3RhcnRlZCBhY3Rpdml0eSB0byByZXR1cm4gdGhlIGNvbnRyb2xcbiAqL1xuXG4vKipcbiAqIFN0YXJ0IHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UvYWN0aXZpdHkgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7U3RhcnRBcHBPcHRpb25zfSBzdGFydEFwcE9wdGlvbnMgW3t9XSAtIFN0YXJ0dXAgb3B0aW9ucyBtYXBwaW5nLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIGlzIGFuIGVycm9yIHdoaWxlIGV4ZWN1dGluZyB0aGUgYWN0aXZpdHlcbiAqL1xuYXBrVXRpbHNNZXRob2RzLnN0YXJ0QXBwID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRBcHAgKHN0YXJ0QXBwT3B0aW9ucyA9IHt9KSB7XG4gIGlmICghc3RhcnRBcHBPcHRpb25zLnBrZyB8fCAhKHN0YXJ0QXBwT3B0aW9ucy5hY3Rpdml0eSB8fCBzdGFydEFwcE9wdGlvbnMuYWN0aW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncGtnLCBhbmQgYWN0aXZpdHkgb3IgaW50ZW50IGFjdGlvbiwgYXJlIHJlcXVpcmVkIHRvIHN0YXJ0IGFuIGFwcGxpY2F0aW9uJyk7XG4gIH1cblxuICBzdGFydEFwcE9wdGlvbnMgPSBfLmNsb25lKHN0YXJ0QXBwT3B0aW9ucyk7XG4gIGlmIChzdGFydEFwcE9wdGlvbnMuYWN0aXZpdHkpIHtcbiAgICBzdGFydEFwcE9wdGlvbnMuYWN0aXZpdHkgPSBzdGFydEFwcE9wdGlvbnMuYWN0aXZpdHkucmVwbGFjZSgnJCcsICdcXFxcJCcpO1xuICB9XG4gIC8vIGluaXRpYWxpemluZyBkZWZhdWx0c1xuICBfLmRlZmF1bHRzKHN0YXJ0QXBwT3B0aW9ucywge1xuICAgIHdhaXRQa2c6IHN0YXJ0QXBwT3B0aW9ucy5wa2csXG4gICAgd2FpdEZvckxhdW5jaDogdHJ1ZSxcbiAgICB3YWl0QWN0aXZpdHk6IGZhbHNlLFxuICAgIHJldHJ5OiB0cnVlLFxuICAgIHN0b3BBcHA6IHRydWVcbiAgfSk7XG4gIC8vIHByZXZlbnRpbmcgbnVsbCB3YWl0cGtnXG4gIHN0YXJ0QXBwT3B0aW9ucy53YWl0UGtnID0gc3RhcnRBcHBPcHRpb25zLndhaXRQa2cgfHwgc3RhcnRBcHBPcHRpb25zLnBrZztcblxuICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKTtcbiAgY29uc3QgY21kID0gYnVpbGRTdGFydENtZChzdGFydEFwcE9wdGlvbnMsIGFwaUxldmVsKTtcbiAgY29uc3QgaW50ZW50TmFtZSA9IGAke3N0YXJ0QXBwT3B0aW9ucy5hY3Rpb259JHtzdGFydEFwcE9wdGlvbnMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgPyAnICcgKyBzdGFydEFwcE9wdGlvbnMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgOiAnJ31gO1xuICB0cnkge1xuICAgIGNvbnN0IHNoZWxsT3B0cyA9IHt9O1xuICAgIGlmIChfLmlzSW50ZWdlcihzdGFydEFwcE9wdGlvbnMud2FpdER1cmF0aW9uKSAmJiBzdGFydEFwcE9wdGlvbnMud2FpdER1cmF0aW9uID49IDApIHtcbiAgICAgIHNoZWxsT3B0cy50aW1lb3V0ID0gc3RhcnRBcHBPcHRpb25zLndhaXREdXJhdGlvbjtcbiAgICB9XG4gICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChjbWQsIHNoZWxsT3B0cyk7XG4gICAgaWYgKHN0ZG91dC5pbmNsdWRlcygnRXJyb3I6IEFjdGl2aXR5IGNsYXNzJykgJiYgc3Rkb3V0LmluY2x1ZGVzKCdkb2VzIG5vdCBleGlzdCcpKSB7XG4gICAgICBpZiAoc3RhcnRBcHBPcHRpb25zLnJldHJ5ICYmICFzdGFydEFwcE9wdGlvbnMuYWN0aXZpdHkuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgV2UgdHJpZWQgdG8gc3RhcnQgYW4gYWN0aXZpdHkgdGhhdCBkb2Vzbid0IGV4aXN0LCBgICtcbiAgICAgICAgICAgICAgICAgIGByZXRyeWluZyB3aXRoICcuJHtzdGFydEFwcE9wdGlvbnMuYWN0aXZpdHl9JyBhY3Rpdml0eSBuYW1lYCk7XG4gICAgICAgIHN0YXJ0QXBwT3B0aW9ucy5hY3Rpdml0eSA9IGAuJHtzdGFydEFwcE9wdGlvbnMuYWN0aXZpdHl9YDtcbiAgICAgICAgc3RhcnRBcHBPcHRpb25zLnJldHJ5ID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN0YXJ0QXBwKHN0YXJ0QXBwT3B0aW9ucyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFjdGl2aXR5IG5hbWUgJyR7c3RhcnRBcHBPcHRpb25zLmFjdGl2aXR5fScgdXNlZCB0byBzdGFydCB0aGUgYXBwIGRvZXNuJ3QgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYGV4aXN0IG9yIGNhbm5vdCBiZSBsYXVuY2hlZCEgTWFrZSBzdXJlIGl0IGV4aXN0cyBhbmQgaXMgYSBsYXVuY2hhYmxlIGFjdGl2aXR5YCk7XG4gICAgfSBlbHNlIGlmIChzdGRvdXQuaW5jbHVkZXMoJ0Vycm9yOiBJbnRlbnQgZG9lcyBub3QgbWF0Y2ggYW55IGFjdGl2aXRpZXMnKSB8fCBzdGRvdXQuaW5jbHVkZXMoJ0Vycm9yOiBBY3Rpdml0eSBub3Qgc3RhcnRlZCwgdW5hYmxlIHRvIHJlc29sdmUgSW50ZW50JykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQWN0aXZpdHkgZm9yIGludGVudCAnJHtpbnRlbnROYW1lfScgdXNlZCB0byBzdGFydCB0aGUgYXBwIGRvZXNuJ3QgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYGV4aXN0IG9yIGNhbm5vdCBiZSBsYXVuY2hlZCEgTWFrZSBzdXJlIGl0IGV4aXN0cyBhbmQgaXMgYSBsYXVuY2hhYmxlIGFjdGl2aXR5YCk7XG4gICAgfSBlbHNlIGlmIChzdGRvdXQuaW5jbHVkZXMoJ2phdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbicpKSB7XG4gICAgICAvLyBpZiB0aGUgYXBwIGlzIGRpc2FibGVkIG9uIGEgcmVhbCBkZXZpY2UgaXQgd2lsbCB0aHJvdyBhIHNlY3VyaXR5IGV4Y2VwdGlvblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcGVybWlzc2lvbiB0byBzdGFydCAnJHtzdGFydEFwcE9wdGlvbnMuYWN0aXZpdHl9JyBhY3Rpdml0eSBoYXMgYmVlbiBkZW5pZWQuYCArXG4gICAgICAgICAgICAgICAgICAgICAgYE1ha2Ugc3VyZSB0aGUgYWN0aXZpdHkvcGFja2FnZSBuYW1lcyBhcmUgY29ycmVjdC5gKTtcbiAgICB9XG4gICAgaWYgKHN0YXJ0QXBwT3B0aW9ucy53YWl0QWN0aXZpdHkpIHtcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvckFjdGl2aXR5KHN0YXJ0QXBwT3B0aW9ucy53YWl0UGtnLCBzdGFydEFwcE9wdGlvbnMud2FpdEFjdGl2aXR5LCBzdGFydEFwcE9wdGlvbnMud2FpdER1cmF0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZG91dDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnN0IGFwcERlc2NyaXB0b3IgPSBzdGFydEFwcE9wdGlvbnMucGtnIHx8IGludGVudE5hbWU7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc3RhcnQgdGhlICcke2FwcERlc2NyaXB0b3J9JyBhcHBsaWNhdGlvbi4gYCArXG4gICAgICBgVmlzaXQgJHtBQ1RJVklUSUVTX1RST1VCTEVTSE9PVElOR19MSU5LfSBmb3IgdHJvdWJsZXNob290aW5nLiBgICtcbiAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCB0byBjYWxsIGBhZGIgZHVtcHN5cyB3aW5kb3cgd2luZG93cy9kaXNwbGF5c2BcbiAqL1xuYXBrVXRpbHNNZXRob2RzLmR1bXBXaW5kb3dzID0gYXN5bmMgZnVuY3Rpb24gZHVtcFdpbmRvd3MgKCkge1xuICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKTtcblxuICAvLyBXaXRoIHZlcnNpb24gMjksIEFuZHJvaWQgY2hhbmdlZCB0aGUgZHVtcHN5cyBzeW50YXhcbiAgY29uc3QgZHVtcHN5c0FyZyA9IGFwaUxldmVsID49IDI5ID8gJ2Rpc3BsYXlzJyA6ICd3aW5kb3dzJztcbiAgY29uc3QgY21kID0gWydkdW1wc3lzJywgJ3dpbmRvdycsIGR1bXBzeXNBcmddO1xuXG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKGNtZCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBhY2thZ2VBY3Rpdml0eUluZm9cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gYXBwUGFja2FnZSAtIFRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uIHBhY2thZ2UsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZXhhbXBsZSAnY29tLmFjbWUuYXBwJy5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gYXBwQWN0aXZpdHkgLSBUaGUgbmFtZSBvZiBtYWluIGFwcGxpY2F0aW9uIGFjdGl2aXR5LlxuICovXG5cbi8qKlxuICogR2V0IHRoZSBuYW1lIG9mIGN1cnJlbnRseSBmb2N1c2VkIHBhY2thZ2UgYW5kIGFjdGl2aXR5LlxuICpcbiAqIEByZXR1cm4ge1BhY2thZ2VBY3Rpdml0eUluZm99IFRoZSBtYXBwaW5nLCB3aGVyZSBwcm9wZXJ0eSBuYW1lcyBhcmUgJ2FwcFBhY2thZ2UnIGFuZCAnYXBwQWN0aXZpdHknLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIGlzIGFuIGVycm9yIHdoaWxlIHBhcnNpbmcgdGhlIGRhdGEuXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5nZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSAoKSB7XG4gIGxvZy5kZWJ1ZygnR2V0dGluZyBmb2N1c2VkIHBhY2thZ2UgYW5kIGFjdGl2aXR5Jyk7XG4gIGNvbnN0IG51bGxGb2N1c2VkQXBwUmUgPSBuZXcgUmVnRXhwKC9eXFxzKm1Gb2N1c2VkQXBwPW51bGwvLCAnbScpO1xuICAvLyBodHRwczovL3JlZ2V4MTAxLmNvbS9yL3haOHZGNy8xXG4gIGNvbnN0IGZvY3VzZWRBcHBSZSA9IG5ldyBSZWdFeHAoJ15cXFxccyptRm9jdXNlZEFwcC4rUmVjb3JkXFxcXHsuKlxcXFxzKFteXFxcXHNcXFxcL1xcXFx9XSspJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcXFwvKFteXFxcXHNcXFxcL1xcXFx9XFxcXCxdKylcXFxcLD8oXFxcXHNbXlxcXFxzXFxcXC9cXFxcfV0rKSpcXFxcfScsICdtJyk7XG4gIGNvbnN0IG51bGxDdXJyZW50Rm9jdXNSZSA9IG5ldyBSZWdFeHAoL15cXHMqbUN1cnJlbnRGb2N1cz1udWxsLywgJ20nKTtcbiAgY29uc3QgY3VycmVudEZvY3VzQXBwUmUgPSBuZXcgUmVnRXhwKCdeXFxcXHMqbUN1cnJlbnRGb2N1cy4rXFxcXHsuK1xcXFxzKFteXFxcXHNcXFxcL10rKVxcXFwvKFteXFxcXHNdKylcXFxcYicsICdtJyk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLmR1bXBXaW5kb3dzKCk7XG4gICAgLy8gVGhlIG9yZGVyIG1hdHRlcnMgaGVyZVxuICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBbZm9jdXNlZEFwcFJlLCBjdXJyZW50Rm9jdXNBcHBSZV0pIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gcGF0dGVybi5leGVjKHN0ZG91dCk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhcHBQYWNrYWdlOiBtYXRjaFsxXS50cmltKCksXG4gICAgICAgICAgYXBwQWN0aXZpdHk6IG1hdGNoWzJdLnRyaW0oKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBbbnVsbEZvY3VzZWRBcHBSZSwgbnVsbEN1cnJlbnRGb2N1c1JlXSkge1xuICAgICAgaWYgKHBhdHRlcm4uZXhlYyhzdGRvdXQpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYXBwUGFja2FnZTogbnVsbCxcbiAgICAgICAgICBhcHBBY3Rpdml0eTogbnVsbFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHBhcnNlIGFjdGl2aXR5IGZyb20gZHVtcHN5cycpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZ2V0IGZvY3VzUGFja2FnZUFuZEFjdGl2aXR5LiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogV2FpdCBmb3IgdGhlIGdpdmVuIGFjdGl2aXR5IHRvIGJlIGZvY3VzZWQvbm9uLWZvY3VzZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIHdhaXQgZm9yLlxuICogQHBhcmFtIHtzdHJpbmd9IGFjdGl2aXR5IC0gVGhlIG5hbWUgb2YgdGhlIGFjdGl2aXR5LCBiZWxvbmdpbmcgdG8gdGhhdCBwYWNrYWdlLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gd2FpdCBmb3IuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHdhaXRGb3JTdG9wIC0gV2hldGhlciB0byB3YWl0IHVudGlsIHRoZSBhY3Rpdml0eSBpcyBmb2N1c2VkICh0cnVlKVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlzIG5vdCBmb2N1c2VkIChmYWxzZSkuXG4gKiBAcGFyYW0ge251bWJlcn0gd2FpdE1zIFsyMDAwMF0gLSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHRpbWVvdXQgb2NjdXJzLlxuICogQHRocm93cyB7ZXJyb3J9IElmIHRpbWVvdXQgaGFwcGVucy5cbiAqL1xuYXBrVXRpbHNNZXRob2RzLndhaXRGb3JBY3Rpdml0eU9yTm90ID0gYXN5bmMgZnVuY3Rpb24gd2FpdEZvckFjdGl2aXR5T3JOb3QgKHBrZywgYWN0aXZpdHksIHdhaXRGb3JTdG9wLCB3YWl0TXMgPSAyMDAwMCkge1xuICBpZiAoIXBrZyB8fCAhYWN0aXZpdHkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhY2thZ2UgYW5kIGFjdGl2aXR5IHJlcXVpcmVkLicpO1xuICB9XG4gIGxvZy5kZWJ1ZyhgV2FpdGluZyB1cCB0byAke3dhaXRNc31tcyBmb3IgYWN0aXZpdHkgbWF0Y2hpbmcgcGtnOiAnJHtwa2d9JyBhbmQgYCArXG4gICAgICAgICAgICBgYWN0aXZpdHk6ICcke2FjdGl2aXR5fScgdG8ke3dhaXRGb3JTdG9wID8gJyBub3QnIDogJyd9IGJlIGZvY3VzZWRgKTtcblxuICBjb25zdCBzcGxpdE5hbWVzID0gKG5hbWVzKSA9PiBuYW1lcy5zcGxpdCgnLCcpLm1hcCgobmFtZSkgPT4gbmFtZS50cmltKCkpO1xuICBjb25zdCBhbGxQYWNrYWdlcyA9IHNwbGl0TmFtZXMocGtnKTtcbiAgY29uc3QgYWxsQWN0aXZpdGllcyA9IHNwbGl0TmFtZXMoYWN0aXZpdHkpO1xuXG4gIGNvbnN0IHBvc3NpYmxlQWN0aXZpdHlOYW1lcyA9IFtdO1xuICBmb3IgKGNvbnN0IG9uZUFjdGl2aXR5IG9mIGFsbEFjdGl2aXRpZXMpIHtcbiAgICBpZiAob25lQWN0aXZpdHkuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAvLyBhZGQgdGhlIHBhY2thZ2UgbmFtZSBpZiBhY3Rpdml0eSBpcyBub3QgZnVsbCBxdWFsaWZpZWRcbiAgICAgIGZvciAoY29uc3QgY3VycmVudFBrZyBvZiBhbGxQYWNrYWdlcykge1xuICAgICAgICBwb3NzaWJsZUFjdGl2aXR5TmFtZXMucHVzaChgJHtjdXJyZW50UGtnfSR7b25lQWN0aXZpdHl9YC5yZXBsYWNlKC9cXC4rL2csICcuJykpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhY2NlcHQgZnVsbHkgcXVhbGlmaWVkIGFjdGl2aXR5IG5hbWUuXG4gICAgICBwb3NzaWJsZUFjdGl2aXR5TmFtZXMucHVzaChvbmVBY3Rpdml0eSk7XG4gICAgICBwb3NzaWJsZUFjdGl2aXR5TmFtZXMucHVzaChgJHtwa2d9LiR7b25lQWN0aXZpdHl9YCk7XG4gICAgfVxuICB9XG4gIGxvZy5kZWJ1ZyhgUG9zc2libGUgYWN0aXZpdGllcywgdG8gYmUgY2hlY2tlZDogJHtwb3NzaWJsZUFjdGl2aXR5TmFtZXMubWFwKChuYW1lKSA9PiBgJyR7bmFtZX0nYCkuam9pbignLCAnKX1gKTtcblxuICBjb25zdCBwb3NzaWJsZUFjdGl2aXR5UGF0dGVybnMgPSBwb3NzaWJsZUFjdGl2aXR5TmFtZXMubWFwKFxuICAgIChhY3ROYW1lKSA9PiBuZXcgUmVnRXhwKGBeJHthY3ROYW1lLnJlcGxhY2UoL1xcLi9nLCAnXFxcXC4nKS5yZXBsYWNlKC9cXCovZywgJy4qPycpLnJlcGxhY2UoL1xcJC9nLCAnXFxcXCQnKX0kYClcbiAgKTtcblxuICBjb25zdCBjb25kaXRpb25GdW5jID0gYXN5bmMgKCkgPT4ge1xuICAgIGxldCBhcHBQYWNrYWdlO1xuICAgIGxldCBhcHBBY3Rpdml0eTtcbiAgICB0cnkge1xuICAgICAgKHthcHBQYWNrYWdlLCBhcHBBY3Rpdml0eX0gPSBhd2FpdCB0aGlzLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmRlYnVnKGUubWVzc2FnZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChhcHBBY3Rpdml0eSAmJiBhcHBQYWNrYWdlKSB7XG4gICAgICBjb25zdCBmdWxseVF1YWxpZmllZEFjdGl2aXR5ID0gYXBwQWN0aXZpdHkuc3RhcnRzV2l0aCgnLicpID8gYCR7YXBwUGFja2FnZX0ke2FwcEFjdGl2aXR5fWAgOiBhcHBBY3Rpdml0eTtcbiAgICAgIGxvZy5kZWJ1ZyhgRm91bmQgcGFja2FnZTogJyR7YXBwUGFja2FnZX0nIGFuZCBmdWxseSBxdWFsaWZpZWQgYWN0aXZpdHkgbmFtZSA6ICcke2Z1bGx5UXVhbGlmaWVkQWN0aXZpdHl9J2ApO1xuICAgICAgY29uc3QgaXNBY3Rpdml0eUZvdW5kID0gXy5pbmNsdWRlcyhhbGxQYWNrYWdlcywgYXBwUGFja2FnZSlcbiAgICAgICAgJiYgcG9zc2libGVBY3Rpdml0eVBhdHRlcm5zLnNvbWUoKHApID0+IHAudGVzdChmdWxseVF1YWxpZmllZEFjdGl2aXR5KSk7XG4gICAgICBpZiAoKCF3YWl0Rm9yU3RvcCAmJiBpc0FjdGl2aXR5Rm91bmQpIHx8ICh3YWl0Rm9yU3RvcCAmJiAhaXNBY3Rpdml0eUZvdW5kKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgbG9nLmRlYnVnKCdJbmNvcnJlY3QgcGFja2FnZSBhbmQgYWN0aXZpdHkuIFJldHJ5aW5nLicpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICB0cnkge1xuICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oY29uZGl0aW9uRnVuYywge1xuICAgICAgd2FpdE1zOiBwYXJzZUludCh3YWl0TXMsIDEwKSxcbiAgICAgIGludGVydmFsTXM6IDUwMCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtwb3NzaWJsZUFjdGl2aXR5TmFtZXMubWFwKChuYW1lKSA9PiBgJyR7bmFtZX0nYCkuam9pbignIG9yICcpfSBuZXZlciAke3dhaXRGb3JTdG9wID8gJ3N0b3BwZWQnIDogJ3N0YXJ0ZWQnfS4gYCArXG4gICAgICBgVmlzaXQgJHtBQ1RJVklUSUVTX1RST1VCTEVTSE9PVElOR19MSU5LfSBmb3IgdHJvdWJsZXNob290aW5nYCk7XG4gIH1cbn07XG5cbi8qKlxuICogV2FpdCBmb3IgdGhlIGdpdmVuIGFjdGl2aXR5IHRvIGJlIGZvY3VzZWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gd2FpdCBmb3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aXZpdHkgLSBUaGUgbmFtZSBvZiB0aGUgYWN0aXZpdHksIGJlbG9uZ2luZyB0byB0aGF0IHBhY2thZ2UsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB3YWl0IGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0TXMgWzIwMDAwXSAtIE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgdGltZW91dCBvY2N1cnMuXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGltZW91dCBoYXBwZW5zLlxuICovXG5hcGtVdGlsc01ldGhvZHMud2FpdEZvckFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gd2FpdEZvckFjdGl2aXR5IChwa2csIGFjdCwgd2FpdE1zID0gMjAwMDApIHtcbiAgYXdhaXQgdGhpcy53YWl0Rm9yQWN0aXZpdHlPck5vdChwa2csIGFjdCwgZmFsc2UsIHdhaXRNcyk7XG59O1xuXG4vKipcbiAqIFdhaXQgZm9yIHRoZSBnaXZlbiBhY3Rpdml0eSB0byBiZSBub24tZm9jdXNlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gd2FpdCBmb3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aXZpdHkgLSBUaGUgbmFtZSBvZiB0aGUgYWN0aXZpdHksIGJlbG9uZ2luZyB0byB0aGF0IHBhY2thZ2UsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB3YWl0IGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0TXMgWzIwMDAwXSAtIE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgdGltZW91dCBvY2N1cnMuXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGltZW91dCBoYXBwZW5zLlxuICovXG5hcGtVdGlsc01ldGhvZHMud2FpdEZvck5vdEFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gd2FpdEZvck5vdEFjdGl2aXR5IChwa2csIGFjdCwgd2FpdE1zID0gMjAwMDApIHtcbiAgYXdhaXQgdGhpcy53YWl0Rm9yQWN0aXZpdHlPck5vdChwa2csIGFjdCwgdHJ1ZSwgd2FpdE1zKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVW5pbnN0YWxsT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXQgW2FkYkV4ZWNUaW1lb3V0XSAtIFRoZSBjb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHAgaXMgdW5pbnN0YWxsZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGtlZXBEYXRhIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBrZWVwIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gZGF0YSBhbmQgY2FjaGUgZm9sZGVycyBhZnRlciB1bmluc3RhbGwuXG4gKi9cblxuLyoqXG4gKiBVbmluc3RhbGwgdGhlIGdpdmVuIHBhY2thZ2UgZnJvbSB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGJlIHVuaW5zdGFsbGVkLlxuICogQHBhcmFtIHs/VW5pbnN0YWxsT3B0aW9uc30gb3B0aW9ucyAtIFRoZSBzZXQgb2YgdW5pbnN0YWxsIG9wdGlvbnMuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwYWNrYWdlIHdhcyBmb3VuZCBvbiB0aGUgZGV2aWNlIGFuZFxuICogICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5IHVuaW5zdGFsbGVkLlxuICovXG5hcGtVdGlsc01ldGhvZHMudW5pbnN0YWxsQXBrID0gYXN5bmMgZnVuY3Rpb24gdW5pbnN0YWxsQXBrIChwa2csIG9wdGlvbnMgPSB7fSkge1xuICBsb2cuZGVidWcoYFVuaW5zdGFsbGluZyAke3BrZ31gKTtcbiAgaWYgKCFhd2FpdCB0aGlzLmlzQXBwSW5zdGFsbGVkKHBrZykpIHtcbiAgICBsb2cuaW5mbyhgJHtwa2d9IHdhcyBub3QgdW5pbnN0YWxsZWQsIGJlY2F1c2UgaXQgd2FzIG5vdCBwcmVzZW50IG9uIHRoZSBkZXZpY2VgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBjbWQgPSBbJ3VuaW5zdGFsbCddO1xuICBpZiAob3B0aW9ucy5rZWVwRGF0YSkge1xuICAgIGNtZC5wdXNoKCctaycpO1xuICB9XG4gIGNtZC5wdXNoKHBrZyk7XG5cbiAgbGV0IHN0ZG91dDtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmZvcmNlU3RvcChwa2cpO1xuICAgIHN0ZG91dCA9IChhd2FpdCB0aGlzLmFkYkV4ZWMoY21kLCB7dGltZW91dDogb3B0aW9ucy50aW1lb3V0fSkpLnRyaW0oKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHVuaW5zdGFsbCBBUEsuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxuICBsb2cuZGVidWcoYCdhZGIgJHtjbWQuam9pbignICcpfScgY29tbWFuZCBvdXRwdXQ6ICR7c3Rkb3V0fWApO1xuICBpZiAoc3Rkb3V0LmluY2x1ZGVzKCdTdWNjZXNzJykpIHtcbiAgICBsb2cuaW5mbyhgJHtwa2d9IHdhcyBzdWNjZXNzZnVsbHkgdW5pbnN0YWxsZWRgKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBsb2cuaW5mbyhgJHtwa2d9IHdhcyBub3QgdW5pbnN0YWxsZWRgKTtcbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBJbnN0YWxsIHRoZSBwYWNrYWdlIGFmdGVyIGl0IHdhcyBwdXNoZWQgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGtQYXRoT25EZXZpY2UgLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBwYWNrYWdlIG9uIHRoZSBkZXZpY2UgZmlsZSBzeXN0ZW0uXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0cyBbe31dIC0gQWRkaXRpb25hbCBleGVjIG9wdGlvbnMuIFNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9ub2RlLXRlZW5fcHJvY2Vzc31cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoaXMgcGFyYW1ldGVyLlxuICogQHRocm93cyB7ZXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgZHVyaW5nIGFwcGxpY2F0aW9uIGluc3RhbGwuXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5pbnN0YWxsRnJvbURldmljZVBhdGggPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsRnJvbURldmljZVBhdGggKGFwa1BhdGhPbkRldmljZSwgb3B0cyA9IHt9KSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsncG0nLCAnaW5zdGFsbCcsICctcicsIGFwa1BhdGhPbkRldmljZV0sIG9wdHMpO1xuICBpZiAoc3Rkb3V0LmluZGV4T2YoJ0ZhaWx1cmUnKSAhPT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJlbW90ZSBpbnN0YWxsIGZhaWxlZDogJHtzdGRvdXR9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ2FjaGluZ09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gdGltZW91dCBbYWRiRXhlY1RpbWVvdXRdIC0gVGhlIGNvdW50IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHAgaXMgdXBsb2FkZWQgdG8gdGhlIHJlbW90ZSBsb2NhdGlvbi5cbiAqL1xuXG4vKipcbiAqIENhY2hlcyB0aGUgZ2l2ZW4gQVBLIGF0IGEgcmVtb3RlIGxvY2F0aW9uIHRvIHNwZWVkIHVwIGZ1cnRoZXIgQVBLIGRlcGxveW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGtQYXRoIC0gRnVsbCBwYXRoIHRvIHRoZSBhcGsgb24gdGhlIGxvY2FsIEZTXG4gKiBAcGFyYW0gez9DYWNoaW5nT3B0aW9uc30gb3B0aW9ucyAtIENhY2hpbmcgb3B0aW9uc1xuICogQHJldHVybnMge3N0cmluZ30gLSBGdWxsIHBhdGggdG8gdGhlIGNhY2hlZCBhcGsgb24gdGhlIHJlbW90ZSBmaWxlIHN5c3RlbVxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgY2FjaGluZyB0aGUgYXBwXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5jYWNoZUFwayA9IGFzeW5jIGZ1bmN0aW9uIGNhY2hlQXBrIChhcGtQYXRoLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgYXBwSGFzaCA9IGF3YWl0IGZzLmhhc2goYXBrUGF0aCk7XG4gIGNvbnN0IHJlbW90ZVBhdGggPSBwYXRoLnBvc2l4LmpvaW4oUkVNT1RFX0NBQ0hFX1JPT1QsIGAke2FwcEhhc2h9LmFwa2ApO1xuICBjb25zdCByZW1vdGVDYWNoZWRGaWxlcyA9IFtdO1xuICAvLyBHZXQgY3VycmVudCBjb250ZW50cyBvZiB0aGUgcmVtb3RlIGNhY2hlIG9yIGNyZWF0ZSBpdCBmb3IgdGhlIGZpcnN0IHRpbWVcbiAgdHJ5IHtcbiAgICBjb25zdCBlcnJvck1hcmtlciA9ICdfRVJST1JfJztcbiAgICBsZXQgbHNPdXRwdXQgPSBudWxsO1xuICAgIGlmICh0aGlzLl9hcmVFeHRlbmRlZExzT3B0aW9uc1N1cHBvcnRlZCA9PT0gdHJ1ZSB8fCAhXy5pc0Jvb2xlYW4odGhpcy5fYXJlRXh0ZW5kZWRMc09wdGlvbnNTdXBwb3J0ZWQpKSB7XG4gICAgICBsc091dHB1dCA9IGF3YWl0IHRoaXMuc2hlbGwoW2BscyAtdCAtMSAke1JFTU9URV9DQUNIRV9ST09UfSAyPiYxIHx8IGVjaG8gJHtlcnJvck1hcmtlcn1gXSk7XG4gICAgfVxuICAgIGlmICghXy5pc1N0cmluZyhsc091dHB1dCkgfHwgKGxzT3V0cHV0LmluY2x1ZGVzKGVycm9yTWFya2VyKSAmJiAhbHNPdXRwdXQuaW5jbHVkZXMoUkVNT1RFX0NBQ0hFX1JPT1QpKSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbih0aGlzLl9hcmVFeHRlbmRlZExzT3B0aW9uc1N1cHBvcnRlZCkpIHtcbiAgICAgICAgbG9nLmRlYnVnKCdUaGUgY3VycmVudCBBbmRyb2lkIEFQSSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuZGVkIGxzIG9wdGlvbnMuICcgK1xuICAgICAgICAgICdEZWZhdWx0aW5nIHRvIG5vLW9wdGlvbnMgY2FsbCcpO1xuICAgICAgfVxuICAgICAgbHNPdXRwdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFtgbHMgJHtSRU1PVEVfQ0FDSEVfUk9PVH0gMj4mMSB8fCBlY2hvICR7ZXJyb3JNYXJrZXJ9YF0pO1xuICAgICAgdGhpcy5fYXJlRXh0ZW5kZWRMc09wdGlvbnNTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fYXJlRXh0ZW5kZWRMc09wdGlvbnNTdXBwb3J0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAobHNPdXRwdXQuaW5jbHVkZXMoZXJyb3JNYXJrZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobHNPdXRwdXQuc3Vic3RyaW5nKDAsIGxzT3V0cHV0LmluZGV4T2YoZXJyb3JNYXJrZXIpKSk7XG4gICAgfVxuICAgIHJlbW90ZUNhY2hlZEZpbGVzLnB1c2goLi4uKFxuICAgICAgbHNPdXRwdXQuc3BsaXQoJ1xcbicpXG4gICAgICAgIC5tYXAoKHgpID0+IHgudHJpbSgpKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuZGVidWcoYEdvdCBhbiBlcnJvciAnJHtlLm1lc3NhZ2UudHJpbSgpfScgd2hpbGUgZ2V0dGluZyB0aGUgbGlzdCBvZiBmaWxlcyBpbiB0aGUgY2FjaGUuIGAgK1xuICAgICAgYEFzc3VtaW5nIHRoZSBjYWNoZSBkb2VzIG5vdCBleGlzdCB5ZXRgKTtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsnbWtkaXInLCAnLXAnLCBSRU1PVEVfQ0FDSEVfUk9PVF0pO1xuICB9XG4gIGxvZy5kZWJ1ZyhgVGhlIGNvdW50IG9mIGFwcGxpY2F0aW9ucyBpbiB0aGUgY2FjaGU6ICR7cmVtb3RlQ2FjaGVkRmlsZXMubGVuZ3RofWApO1xuICBjb25zdCB0b0hhc2ggPSAocmVtb3RlUGF0aCkgPT4gcGF0aC5wb3NpeC5wYXJzZShyZW1vdGVQYXRoKS5uYW1lO1xuICAvLyBQdXNoIHRoZSBhcGsgdG8gdGhlIHJlbW90ZSBjYWNoZSBpZiBuZWVkZWRcbiAgaWYgKHJlbW90ZUNhY2hlZEZpbGVzLnNvbWUoKHgpID0+IHRvSGFzaCh4KSA9PT0gYXBwSGFzaCkpIHtcbiAgICBsb2cuaW5mbyhgVGhlIGFwcGxpY2F0aW9uIGF0ICcke2Fwa1BhdGh9JyBpcyBhbHJlYWR5IGNhY2hlZCB0byAnJHtyZW1vdGVQYXRofSdgKTtcbiAgICAvLyBVcGRhdGUgdGhlIGFwcGxpY2F0aW9uIHRpbWVzdGFtcCBhc3luY2hyb25vdXNseSBpbiBvcmRlciB0byBidW1wIGl0cyBwb3NpdGlvblxuICAgIC8vIGluIHRoZSBzb3J0ZWQgbHMgb3V0cHV0XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLXRoZW5cbiAgICB0aGlzLnNoZWxsKFsndG91Y2gnLCAnLWFtJywgcmVtb3RlUGF0aF0pLmNhdGNoKCgpID0+IHt9KTtcbiAgfSBlbHNlIHtcbiAgICBsb2cuaW5mbyhgQ2FjaGluZyB0aGUgYXBwbGljYXRpb24gYXQgJyR7YXBrUGF0aH0nIHRvICcke3JlbW90ZVBhdGh9J2ApO1xuICAgIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gICAgYXdhaXQgdGhpcy5wdXNoKGFwa1BhdGgsIHJlbW90ZVBhdGgsIHt0aW1lb3V0OiBvcHRpb25zLnRpbWVvdXR9KTtcbiAgICBjb25zdCB7c2l6ZX0gPSBhd2FpdCBmcy5zdGF0KGFwa1BhdGgpO1xuICAgIGxvZy5pbmZvKGBUaGUgdXBsb2FkIG9mICcke3BhdGguYmFzZW5hbWUoYXBrUGF0aCl9JyAoJHt1dGlsLnRvUmVhZGFibGVTaXplU3RyaW5nKHNpemUpfSkgYCArXG4gICAgICBgdG9vayAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xuICB9XG4gIGlmICghdGhpcy5yZW1vdGVBcHBzQ2FjaGUpIHtcbiAgICB0aGlzLnJlbW90ZUFwcHNDYWNoZSA9IG5ldyBMUlUoe1xuICAgICAgbWF4OiB0aGlzLnJlbW90ZUFwcHNDYWNoZUxpbWl0LFxuICAgIH0pO1xuICB9XG4gIC8vIENsZWFudXAgdGhlIGludmFsaWQgZW50cmllcyBmcm9tIHRoZSBjYWNoZVxuICBfLmRpZmZlcmVuY2UoWy4uLnRoaXMucmVtb3RlQXBwc0NhY2hlLmtleXMoKV0sIHJlbW90ZUNhY2hlZEZpbGVzLm1hcCh0b0hhc2gpKVxuICAgIC5mb3JFYWNoKChoYXNoKSA9PiB0aGlzLnJlbW90ZUFwcHNDYWNoZS5kZWwoaGFzaCkpO1xuICAvLyBCdW1wIHRoZSBjYWNoZSByZWNvcmQgZm9yIHRoZSByZWNlbnRseSBjYWNoZWQgaXRlbVxuICB0aGlzLnJlbW90ZUFwcHNDYWNoZS5zZXQoYXBwSGFzaCwgcmVtb3RlUGF0aCk7XG4gIC8vIElmIHRoZSByZW1vdGUgY2FjaGUgZXhjZWVkcyB0aGlzLnJlbW90ZUFwcHNDYWNoZUxpbWl0LCByZW1vdmUgdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgZW50cmllc1xuICBjb25zdCBlbnRyaWVzVG9DbGVhbnVwID0gcmVtb3RlQ2FjaGVkRmlsZXNcbiAgICAubWFwKCh4KSA9PiBwYXRoLnBvc2l4LmpvaW4oUkVNT1RFX0NBQ0hFX1JPT1QsIHgpKVxuICAgIC5maWx0ZXIoKHgpID0+ICF0aGlzLnJlbW90ZUFwcHNDYWNoZS5oYXModG9IYXNoKHgpKSlcbiAgICAuc2xpY2UodGhpcy5yZW1vdGVBcHBzQ2FjaGVMaW1pdCAtIFsuLi50aGlzLnJlbW90ZUFwcHNDYWNoZS5rZXlzKCldLmxlbmd0aCk7XG4gIGlmICghXy5pc0VtcHR5KGVudHJpZXNUb0NsZWFudXApKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2hlbGwoWydybScsICctZicsIC4uLmVudHJpZXNUb0NsZWFudXBdKTtcbiAgICAgIGxvZy5kZWJ1ZyhgRGVsZXRlZCAke2VudHJpZXNUb0NsZWFudXAubGVuZ3RofSBleHBpcmVkIGFwcGxpY2F0aW9uIGNhY2hlIGVudHJpZXNgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cud2FybihgQ2Fubm90IGRlbGV0ZSAke2VudHJpZXNUb0NsZWFudXAubGVuZ3RofSBleHBpcmVkIGFwcGxpY2F0aW9uIGNhY2hlIGVudHJpZXMuIGAgK1xuICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVtb3RlUGF0aDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5zdGFsbE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0IFs2MDAwMF0gLSBUaGUgY291bnQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwIGlzIGluc3RhbGxlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aW1lb3V0Q2FwTmFtZSBbYW5kcm9pZEluc3RhbGxUaW1lb3V0XSAtIFRoZSB0aW1lb3V0IG9wdGlvbiBuYW1lXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VycyBjYW4gaW5jcmVhc2UgdGhlIHRpbWVvdXQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93VGVzdFBhY2thZ2VzIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBhbGxvdyB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcyBpbnN0YWxsYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVNkY2FyZCBbZmFsc2VdIC0gU2V0IHRvIHRydWUgdG8gaW5zdGFsbCB0aGUgYXBwIG9uIHNkY2FyZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgdGhlIGRldmljZSBtZW1vcnkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGdyYW50UGVybWlzc2lvbnMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGdyYW50IGFsbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXIgQW5kcm9pZCA2Ky5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVwbGFjZSBbdHJ1ZV0gLSBTZXQgaXQgdG8gZmFsc2UgaWYgeW91IGRvbid0IHdhbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gdG8gYmUgdXBncmFkZWQvcmVpbnN0YWxsZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQgb24gdGhlIGRldmljZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbm9JbmNyZW1lbnRhbCBbZmFsc2VdIC0gRm9yY2VmdWxseSBkaXNhYmxlcyBpbmNyZW1lbnRhbCBpbnN0YWxscyBpZiBzZXQgdG8gYHRydWVgLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3ByZXZpZXcvZmVhdHVyZXMjaW5jcmVtZW50YWxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xuXG4vKipcbiAqIEluc3RhbGwgdGhlIHBhY2thZ2UgZnJvbSB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBsb2NhbCBwYWNrYWdlLlxuICogQHBhcmFtIHs/SW5zdGFsbE9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgc2V0IG9mIGluc3RhbGxhdGlvbiBvcHRpb25zLlxuICogQHRocm93cyB7RXJyb3J9IElmIGFuIHVuZXhwZWN0ZWQgZXJyb3IgaGFwcGVucyBkdXJpbmcgaW5zdGFsbC5cbiAqL1xuYXBrVXRpbHNNZXRob2RzLmluc3RhbGwgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsIChhcHBQYXRoLCBvcHRpb25zID0ge30pIHtcbiAgaWYgKGFwcFBhdGguZW5kc1dpdGgoQVBLU19FWFRFTlNJT04pKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaW5zdGFsbEFwa3MoYXBwUGF0aCwgb3B0aW9ucyk7XG4gIH1cblxuICBvcHRpb25zID0gXy5jbG9uZURlZXAob3B0aW9ucyk7XG4gIF8uZGVmYXVsdHMob3B0aW9ucywge1xuICAgIHJlcGxhY2U6IHRydWUsXG4gICAgdGltZW91dDogdGhpcy5hZGJFeGVjVGltZW91dCA9PT0gREVGQVVMVF9BREJfRVhFQ19USU1FT1VUID8gQVBLX0lOU1RBTExfVElNRU9VVCA6IHRoaXMuYWRiRXhlY1RpbWVvdXQsXG4gICAgdGltZW91dENhcE5hbWU6ICdhbmRyb2lkSW5zdGFsbFRpbWVvdXQnLFxuICB9KTtcblxuICBjb25zdCBpbnN0YWxsQXJncyA9IGJ1aWxkSW5zdGFsbEFyZ3MoYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpLCBvcHRpb25zKTtcbiAgaWYgKG9wdGlvbnMubm9JbmNyZW1lbnRhbCAmJiBhd2FpdCB0aGlzLmlzSW5jcmVtZW50YWxJbnN0YWxsU3VwcG9ydGVkKCkpIHtcbiAgICAvLyBBZGIgdGhyb3dzIGFuIGVycm9yIGlmIGl0IGRvZXMgbm90IGtub3cgYWJvdXQgYW4gYXJnLFxuICAgIC8vIHdoaWNoIGlzIHRoZSBjYXNlIGhlcmUgZm9yIG9sZGVyIGFkYiB2ZXJzaW9ucy5cbiAgICBpbnN0YWxsQXJncy5wdXNoKCctLW5vLWluY3JlbWVudGFsJyk7XG4gIH1cbiAgY29uc3QgaW5zdGFsbE9wdHMgPSB7XG4gICAgdGltZW91dDogb3B0aW9ucy50aW1lb3V0LFxuICAgIHRpbWVvdXRDYXBOYW1lOiBvcHRpb25zLnRpbWVvdXRDYXBOYW1lLFxuICB9O1xuICBjb25zdCBpbnN0YWxsQ21kID0gW1xuICAgICdpbnN0YWxsJyxcbiAgICAuLi5pbnN0YWxsQXJncyxcbiAgICBhcHBQYXRoLFxuICBdO1xuICBsZXQgcGVyZm9ybUFwcEluc3RhbGwgPSBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmFkYkV4ZWMoaW5zdGFsbENtZCwgaW5zdGFsbE9wdHMpO1xuICAvLyB0aGlzLnJlbW90ZUFwcHNDYWNoZUxpbWl0IDw9IDAgbWVhbnMgbm8gY2FjaGluZyBzaG91bGQgYmUgYXBwbGllZFxuICBsZXQgc2hvdWxkQ2FjaGVBcHAgPSB0aGlzLnJlbW90ZUFwcHNDYWNoZUxpbWl0ID4gMDtcbiAgaWYgKHNob3VsZENhY2hlQXBwKSB7XG4gICAgc2hvdWxkQ2FjaGVBcHAgPSAhKGF3YWl0IHRoaXMuaXNTdHJlYW1lZEluc3RhbGxTdXBwb3J0ZWQoKSk7XG4gICAgaWYgKCFzaG91bGRDYWNoZUFwcCkge1xuICAgICAgbG9nLmluZm8oYFRoZSBhcHBsaWNhdGlvbiBhdCAnJHthcHBQYXRofScgd2lsbCBub3QgYmUgY2FjaGVkLCBiZWNhdXNlIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBoYXMgYCArXG4gICAgICAgIGBjb25maXJtZWQgdGhlIHN1cHBvcnQgb2Ygc3RyZWFtZWQgaW5zdGFsbHNgKTtcbiAgICB9XG4gIH1cbiAgaWYgKHNob3VsZENhY2hlQXBwKSB7XG4gICAgY29uc3QgY2xlYXJDYWNoZSA9IGFzeW5jICgpID0+IHtcbiAgICAgIGxvZy5pbmZvKGBDbGVhcmluZyB0aGUgY2FjaGUgYXQgJyR7UkVNT1RFX0NBQ0hFX1JPT1R9J2ApO1xuICAgICAgYXdhaXQgdGhpcy5zaGVsbChbJ3JtJywgJy1yZicsIGAke1JFTU9URV9DQUNIRV9ST09UfS8qYF0pO1xuICAgIH07XG4gICAgY29uc3QgY2FjaGVBcHAgPSBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmNhY2hlQXBrKGFwcFBhdGgsIHtcbiAgICAgIHRpbWVvdXQ6IG9wdGlvbnMudGltZW91dCxcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2FjaGVkQXBwUGF0aCA9IGF3YWl0IGNhY2hlQXBwKCk7XG4gICAgICBwZXJmb3JtQXBwSW5zdGFsbCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcG1JbnN0YWxsQ21kQnlSZW1vdGVQYXRoID0gKHJlbW90ZVBhdGgpID0+IFtcbiAgICAgICAgICAncG0nLCAnaW5zdGFsbCcsXG4gICAgICAgICAgLi4uaW5zdGFsbEFyZ3MsXG4gICAgICAgICAgcmVtb3RlUGF0aCxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgdGhpcy5zaGVsbChwbUluc3RhbGxDbWRCeVJlbW90ZVBhdGgoY2FjaGVkQXBwUGF0aCksIGluc3RhbGxPcHRzKTtcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzEzOTcwXG4gICAgICAgIGlmICgvXFxiSU5TVEFMTF9GQUlMRURfSU5TVUZGSUNJRU5UX1NUT1JBR0VcXGIvLnRlc3Qob3V0cHV0KSkge1xuICAgICAgICAgIGxvZy53YXJuKGBUaGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIGluc3RhbGxpbmcgJyR7YXBwUGF0aH0nIGAgK1xuICAgICAgICAgICAgYGJlY2F1c2Ugb2YgdGhlIGluc3VmZmljaWVudCBkZXZpY2Ugc3RvcmFnZSBzcGFjZWApO1xuICAgICAgICAgIGF3YWl0IGNsZWFyQ2FjaGUoKTtcbiAgICAgICAgICBsb2cuaW5mbyhgQ29uc2lkZXIgZGVjcmVhc2luZyB0aGUgbWF4aW11bSBhbW91bnQgb2YgY2FjaGVkIGFwcHMgYCArXG4gICAgICAgICAgICBgKGN1cnJlbnRseSAke3RoaXMucmVtb3RlQXBwc0NhY2hlTGltaXR9KSB0byBhdm9pZCBzdWNoIGlzc3VlcyBpbiB0aGUgZnV0dXJlYCk7XG4gICAgICAgICAgY29uc3QgbmV3Q2FjaGVkQXBwUGF0aCA9IGF3YWl0IGNhY2hlQXBwKCk7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwocG1JbnN0YWxsQ21kQnlSZW1vdGVQYXRoKG5ld0NhY2hlZEFwcFBhdGgpLCBpbnN0YWxsT3B0cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmRlYnVnKGUpO1xuICAgICAgbG9nLndhcm4oYFRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgY2FjaGluZyAnJHthcHBQYXRofSc6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgbG9nLndhcm4oJ0ZhbGxpbmcgYmFjayB0byB0aGUgZGVmYXVsdCBpbnN0YWxsYXRpb24gcHJvY2VkdXJlJyk7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlKCk7XG4gICAgfVxuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcbiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBwZXJmb3JtQXBwSW5zdGFsbCgpO1xuICAgIGxvZy5pbmZvKGBUaGUgaW5zdGFsbGF0aW9uIG9mICcke3BhdGguYmFzZW5hbWUoYXBwUGF0aCl9JyB0b29rICR7dGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcy50b0ZpeGVkKDApfW1zYCk7XG4gICAgY29uc3QgdHJ1bmNhdGVkT3V0cHV0ID0gKCFfLmlzU3RyaW5nKG91dHB1dCkgfHwgb3V0cHV0Lmxlbmd0aCA8PSAzMDApID9cbiAgICAgIG91dHB1dCA6IGAke291dHB1dC5zdWJzdHIoMCwgMTUwKX0uLi4ke291dHB1dC5zdWJzdHIob3V0cHV0Lmxlbmd0aCAtIDE1MCl9YDtcbiAgICBsb2cuZGVidWcoYEluc3RhbGwgY29tbWFuZCBzdGRvdXQ6ICR7dHJ1bmNhdGVkT3V0cHV0fWApO1xuICAgIGlmICgvXFxbSU5TVEFMTFtBLVpfXStGQUlMRURbQS1aX10rXFxdLy50ZXN0KG91dHB1dCkpIHtcbiAgICAgIGlmICh0aGlzLmlzVGVzdFBhY2thZ2VPbmx5RXJyb3Iob3V0cHV0KSkge1xuICAgICAgICBjb25zdCBtc2cgPSBgU2V0ICdhbGxvd1Rlc3RQYWNrYWdlcycgY2FwYWJpbGl0eSB0byB0cnVlIGluIG9yZGVyIHRvIGFsbG93IHRlc3QgcGFja2FnZXMgaW5zdGFsbGF0aW9uLmA7XG4gICAgICAgIGxvZy53YXJuKG1zZyk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvdXRwdXR9XFxuJHttc2d9YCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3Iob3V0cHV0KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIG9uIHNvbWUgc3lzdGVtcyB0aGlzIHdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGFwcCBhbHJlYWR5XG4gICAgLy8gZXhpc3RzXG4gICAgaWYgKCFlcnIubWVzc2FnZS5pbmNsdWRlcygnSU5TVEFMTF9GQUlMRURfQUxSRUFEWV9FWElTVFMnKSkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYEFwcGxpY2F0aW9uICcke2FwcFBhdGh9JyBhbHJlYWR5IGluc3RhbGxlZC4gQ29udGludWluZy5gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgaW5zdGFsbGF0aW9uIHN0YXRlIG9mIHRoZSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggLSBGdWxsIHBhdGggdG8gdGhlIGFwcGxpY2F0aW9uXG4gKiBAcGFyYW0gez9zdHJpbmd9IHBrZyAtIFBhY2thZ2UgaWRlbnRpZmllci4gSWYgb21pdHRlZCB0aGVuIHRoZSBzY3JpcHQgd2lsbFxuICogICAgICAgICAgICAgICAgICAgICAgICB0cnkgdG8gZXh0cmFjdCBpdCBvbiBpdHMgb3duXG4gKiBAcmV0dXJucyB7c3RyaW5nfV1PbmUgb2YgYEFQUF9JTlNUQUxMX1NUQVRFYCBjb25zdGFudHNcbiAqL1xuYXBrVXRpbHNNZXRob2RzLmdldEFwcGxpY2F0aW9uSW5zdGFsbFN0YXRlID0gYXN5bmMgZnVuY3Rpb24gZ2V0QXBwbGljYXRpb25JbnN0YWxsU3RhdGUgKGFwcFBhdGgsIHBrZyA9IG51bGwpIHtcbiAgbGV0IGFwa0luZm8gPSBudWxsO1xuICBpZiAoIXBrZykge1xuICAgIGFwa0luZm8gPSBhd2FpdCB0aGlzLmdldEFwa0luZm8oYXBwUGF0aCk7XG4gICAgcGtnID0gYXBrSW5mby5uYW1lO1xuICB9XG4gIGlmICghcGtnKSB7XG4gICAgbG9nLndhcm4oYENhbm5vdCByZWFkIHRoZSBwYWNrYWdlIG5hbWUgb2YgJyR7YXBwUGF0aH0nYCk7XG4gICAgcmV0dXJuIHRoaXMuQVBQX0lOU1RBTExfU1RBVEUuVU5LTk9XTjtcbiAgfVxuXG4gIGlmICghYXdhaXQgdGhpcy5pc0FwcEluc3RhbGxlZChwa2cpKSB7XG4gICAgbG9nLmRlYnVnKGBBcHAgJyR7YXBwUGF0aH0nIGlzIG5vdCBpbnN0YWxsZWRgKTtcbiAgICByZXR1cm4gdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5OT1RfSU5TVEFMTEVEO1xuICB9XG5cbiAgY29uc3Qge3ZlcnNpb25Db2RlOiBwa2dWZXJzaW9uQ29kZSwgdmVyc2lvbk5hbWU6IHBrZ1ZlcnNpb25OYW1lU3RyfSA9IGF3YWl0IHRoaXMuZ2V0UGFja2FnZUluZm8ocGtnKTtcbiAgY29uc3QgcGtnVmVyc2lvbk5hbWUgPSBzZW12ZXIudmFsaWQoc2VtdmVyLmNvZXJjZShwa2dWZXJzaW9uTmFtZVN0cikpO1xuICBpZiAoIWFwa0luZm8pIHtcbiAgICBhcGtJbmZvID0gYXdhaXQgdGhpcy5nZXRBcGtJbmZvKGFwcFBhdGgpO1xuICB9XG4gIGNvbnN0IHt2ZXJzaW9uQ29kZTogYXBrVmVyc2lvbkNvZGUsIHZlcnNpb25OYW1lOiBhcGtWZXJzaW9uTmFtZVN0cn0gPSBhcGtJbmZvO1xuICBjb25zdCBhcGtWZXJzaW9uTmFtZSA9IHNlbXZlci52YWxpZChzZW12ZXIuY29lcmNlKGFwa1ZlcnNpb25OYW1lU3RyKSk7XG5cbiAgaWYgKCFfLmlzSW50ZWdlcihhcGtWZXJzaW9uQ29kZSkgfHwgIV8uaXNJbnRlZ2VyKHBrZ1ZlcnNpb25Db2RlKSkge1xuICAgIGxvZy53YXJuKGBDYW5ub3QgcmVhZCB2ZXJzaW9uIGNvZGVzIG9mICcke2FwcFBhdGh9JyBhbmQvb3IgJyR7cGtnfSdgKTtcbiAgICBpZiAoIV8uaXNTdHJpbmcoYXBrVmVyc2lvbk5hbWUpIHx8ICFfLmlzU3RyaW5nKHBrZ1ZlcnNpb25OYW1lKSkge1xuICAgICAgbG9nLndhcm4oYENhbm5vdCByZWFkIHZlcnNpb24gbmFtZXMgb2YgJyR7YXBwUGF0aH0nIGFuZC9vciAnJHtwa2d9J2ApO1xuICAgICAgcmV0dXJuIHRoaXMuQVBQX0lOU1RBTExfU1RBVEUuVU5LTk9XTjtcbiAgICB9XG4gIH1cbiAgaWYgKF8uaXNJbnRlZ2VyKGFwa1ZlcnNpb25Db2RlKSAmJiBfLmlzSW50ZWdlcihwa2dWZXJzaW9uQ29kZSkpIHtcbiAgICBpZiAocGtnVmVyc2lvbkNvZGUgPiBhcGtWZXJzaW9uQ29kZSkge1xuICAgICAgbG9nLmRlYnVnKGBUaGUgdmVyc2lvbiBjb2RlIG9mIHRoZSBpbnN0YWxsZWQgJyR7cGtnfScgaXMgZ3JlYXRlciB0aGFuIHRoZSBhcHBsaWNhdGlvbiB2ZXJzaW9uIGNvZGUgKCR7cGtnVmVyc2lvbkNvZGV9ID4gJHthcGtWZXJzaW9uQ29kZX0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5ORVdFUl9WRVJTSU9OX0lOU1RBTExFRDtcbiAgICB9XG4gICAgLy8gVmVyc2lvbiBjb2RlcyBtaWdodCBub3QgYmUgbWFpbnRhaW5lZC4gQ2hlY2sgdmVyc2lvbiBuYW1lcy5cbiAgICBpZiAocGtnVmVyc2lvbkNvZGUgPT09IGFwa1ZlcnNpb25Db2RlKSB7XG4gICAgICBpZiAoXy5pc1N0cmluZyhhcGtWZXJzaW9uTmFtZSkgJiYgXy5pc1N0cmluZyhwa2dWZXJzaW9uTmFtZSkgJiYgc2VtdmVyLnNhdGlzZmllcyhwa2dWZXJzaW9uTmFtZSwgYD49JHthcGtWZXJzaW9uTmFtZX1gKSkge1xuICAgICAgICBsb2cuZGVidWcoYFRoZSB2ZXJzaW9uIG5hbWUgb2YgdGhlIGluc3RhbGxlZCAnJHtwa2d9JyBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBhcHBsaWNhdGlvbiB2ZXJzaW9uIG5hbWUgKCcke3BrZ1ZlcnNpb25OYW1lfScgPj0gJyR7YXBrVmVyc2lvbk5hbWV9JylgKTtcbiAgICAgICAgcmV0dXJuIHNlbXZlci5zYXRpc2ZpZXMocGtnVmVyc2lvbk5hbWUsIGA+JHthcGtWZXJzaW9uTmFtZX1gKVxuICAgICAgICAgID8gdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5ORVdFUl9WRVJTSU9OX0lOU1RBTExFRFxuICAgICAgICAgIDogdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5TQU1FX1ZFUlNJT05fSU5TVEFMTEVEO1xuICAgICAgfVxuICAgICAgaWYgKCFfLmlzU3RyaW5nKGFwa1ZlcnNpb25OYW1lKSB8fCAhXy5pc1N0cmluZyhwa2dWZXJzaW9uTmFtZSkpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBUaGUgdmVyc2lvbiBuYW1lIG9mIHRoZSBpbnN0YWxsZWQgJyR7cGtnfScgaXMgZXF1YWwgdG8gYXBwbGljYXRpb24gdmVyc2lvbiBuYW1lICgke3BrZ1ZlcnNpb25Db2RlfSA9PT0gJHthcGtWZXJzaW9uQ29kZX0pYCk7XG4gICAgICAgIHJldHVybiB0aGlzLkFQUF9JTlNUQUxMX1NUQVRFLlNBTUVfVkVSU0lPTl9JTlNUQUxMRUQ7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKF8uaXNTdHJpbmcoYXBrVmVyc2lvbk5hbWUpICYmIF8uaXNTdHJpbmcocGtnVmVyc2lvbk5hbWUpICYmIHNlbXZlci5zYXRpc2ZpZXMocGtnVmVyc2lvbk5hbWUsIGA+PSR7YXBrVmVyc2lvbk5hbWV9YCkpIHtcbiAgICBsb2cuZGVidWcoYFRoZSB2ZXJzaW9uIG5hbWUgb2YgdGhlIGluc3RhbGxlZCAnJHtwa2d9JyBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBhcHBsaWNhdGlvbiB2ZXJzaW9uIG5hbWUgKCcke3BrZ1ZlcnNpb25OYW1lfScgPj0gJyR7YXBrVmVyc2lvbk5hbWV9JylgKTtcbiAgICByZXR1cm4gc2VtdmVyLnNhdGlzZmllcyhwa2dWZXJzaW9uTmFtZSwgYD4ke2Fwa1ZlcnNpb25OYW1lfWApXG4gICAgICA/IHRoaXMuQVBQX0lOU1RBTExfU1RBVEUuTkVXRVJfVkVSU0lPTl9JTlNUQUxMRURcbiAgICAgIDogdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5TQU1FX1ZFUlNJT05fSU5TVEFMTEVEO1xuICB9XG5cbiAgbG9nLmRlYnVnKGBUaGUgaW5zdGFsbGVkICcke3BrZ30nIHBhY2thZ2UgaXMgb2xkZXIgdGhhbiAnJHthcHBQYXRofScgKCR7cGtnVmVyc2lvbkNvZGV9IDwgJHthcGtWZXJzaW9uQ29kZX0gb3IgJyR7cGtnVmVyc2lvbk5hbWV9JyA8ICcke2Fwa1ZlcnNpb25OYW1lfScpJ2ApO1xuICByZXR1cm4gdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5PTERFUl9WRVJTSU9OX0lOU1RBTExFRDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5zdGFsbE9yVXBncmFkZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0IFs2MDAwMF0gLSBUaGUgY291bnQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwIGlzIGluc3RhbGxlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYWxsb3dUZXN0UGFja2FnZXMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGFsbG93IHRlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzIGluc3RhbGxhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXNlU2RjYXJkIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSB0byBpbnN0YWxsIHRoZSBhcHAgb24gU0RDYXJkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiB0aGUgZGV2aWNlIG1lbW9yeS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ3JhbnRQZXJtaXNzaW9ucyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gZ3JhbnQgYWxsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucyByZXF1ZXN0ZWQgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBhZnRlciB0aGUgaW5zdGFsbGF0aW9uIGlzIGNvbXBsZXRlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlciBBbmRyb2lkIDYrLlxuICogQHByb3BlcnR5IHtib29sZWFufSBlbmZvcmNlQ3VycmVudEJ1aWxkIFtmYWxzZV0gLSBTZXQgdG8gYHRydWVgIGluIG9yZGVyIHRvIGFsd2F5cyBwcmVmZXJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgYnVpbGQgb3ZlciBhbnkgaW5zdGFsbGVkIHBhY2thZ2VzIGhhdmluZ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2FtZSBpZGVudGlmaWVyXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsT3JVcGdyYWRlUmVzdWx0XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHdhc1VuaW5zdGFsbGVkIC0gRXF1YWxzIHRvIGB0cnVlYCBpZiB0aGUgdGFyZ2V0IGFwcCBoYXMgYmVlbiB1bmluc3RhbGxlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSBiZWluZyBpbnN0YWxsZWRcbiAqIEBwcm9wZXJ0eSB7QVBQX0lOU1RBTExfU1RBVEV9IGFwcFN0YXRlIC0gT25lIG9mIGBhZGIuQVBQX0lOU1RBTExfU1RBVEVgIHN0YXRlcywgd2hpY2ggcmVmbGVjdHNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0YXRlIG9mIHRoZSBhcHBsaWNhdGlvbiBiZWZvcmUgYmVpbmcgaW5zdGFsbGVkLlxuICovXG5cbi8qKlxuICogSW5zdGFsbCB0aGUgcGFja2FnZSBmcm9tIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSBvciB1cGdyYWRlIGl0IGlmIGFuIG9sZGVyXG4gKiB2ZXJzaW9uIG9mIHRoZSBzYW1lIHBhY2thZ2UgaXMgYWxyZWFkeSBpbnN0YWxsZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBsb2NhbCBwYWNrYWdlLlxuICogQHBhcmFtIHs/c3RyaW5nfSBwa2cgLSBUaGUgbmFtZSBvZiB0aGUgaW5zdGFsbGVkIHBhY2thZ2UuIFRoZSBtZXRob2Qgd2lsbFxuICogICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGZhc3RlciBpZiBpdCBpcyBzZXQuXG4gKiBAcGFyYW0gez9JbnN0YWxsT3JVcGdyYWRlT3B0aW9uc30gb3B0aW9ucyAtIFNldCBvZiBpbnN0YWxsIG9wdGlvbnMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYW4gdW5leHBlY3RlZCBlcnJvciBoYXBwZW5zIGR1cmluZyBpbnN0YWxsLlxuICogQHJldHVybnMge0luc3RhbGxPclVwZ3JhZGVSZXN1bHR9XG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5pbnN0YWxsT3JVcGdyYWRlID0gYXN5bmMgZnVuY3Rpb24gaW5zdGFsbE9yVXBncmFkZSAoYXBwUGF0aCwgcGtnID0gbnVsbCwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmICghcGtnKSB7XG4gICAgY29uc3QgYXBrSW5mbyA9IGF3YWl0IHRoaXMuZ2V0QXBrSW5mbyhhcHBQYXRoKTtcbiAgICBwa2cgPSBhcGtJbmZvLm5hbWU7XG4gIH1cblxuICBjb25zdCB7XG4gICAgZW5mb3JjZUN1cnJlbnRCdWlsZCxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGFwcFN0YXRlID0gYXdhaXQgdGhpcy5nZXRBcHBsaWNhdGlvbkluc3RhbGxTdGF0ZShhcHBQYXRoLCBwa2cpO1xuICBsZXQgd2FzVW5pbnN0YWxsZWQgPSBmYWxzZTtcbiAgY29uc3QgdW5pbnN0YWxsUGFja2FnZSA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWF3YWl0IHRoaXMudW5pbnN0YWxsQXBrKHBrZykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7cGtnfScgcGFja2FnZSBjYW5ub3QgYmUgdW5pbnN0YWxsZWRgKTtcbiAgICB9XG4gICAgd2FzVW5pbnN0YWxsZWQgPSB0cnVlO1xuICB9O1xuICBzd2l0Y2ggKGFwcFN0YXRlKSB7XG4gICAgY2FzZSB0aGlzLkFQUF9JTlNUQUxMX1NUQVRFLk5PVF9JTlNUQUxMRUQ6XG4gICAgICBsb2cuZGVidWcoYEluc3RhbGxpbmcgJyR7YXBwUGF0aH0nYCk7XG4gICAgICBhd2FpdCB0aGlzLmluc3RhbGwoYXBwUGF0aCwgT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge3JlcGxhY2U6IGZhbHNlfSkpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgIHdhc1VuaW5zdGFsbGVkLFxuICAgICAgfTtcbiAgICBjYXNlIHRoaXMuQVBQX0lOU1RBTExfU1RBVEUuTkVXRVJfVkVSU0lPTl9JTlNUQUxMRUQ6XG4gICAgICBpZiAoZW5mb3JjZUN1cnJlbnRCdWlsZCkge1xuICAgICAgICBsb2cuaW5mbyhgRG93bmdyYWRpbmcgJyR7cGtnfScgYXMgcmVxdWVzdGVkYCk7XG4gICAgICAgIGF3YWl0IHVuaW5zdGFsbFBhY2thZ2UoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYFRoZXJlIGlzIG5vIG5lZWQgdG8gZG93bmdyYWRlICcke3BrZ30nYCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgd2FzVW5pbnN0YWxsZWQsXG4gICAgICB9O1xuICAgIGNhc2UgdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5TQU1FX1ZFUlNJT05fSU5TVEFMTEVEOlxuICAgICAgaWYgKGVuZm9yY2VDdXJyZW50QnVpbGQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYFRoZXJlIGlzIG5vIG5lZWQgdG8gaW5zdGFsbC91cGdyYWRlICcke2FwcFBhdGh9J2ApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgIHdhc1VuaW5zdGFsbGVkLFxuICAgICAgfTtcbiAgICBjYXNlIHRoaXMuQVBQX0lOU1RBTExfU1RBVEUuT0xERVJfVkVSU0lPTl9JTlNUQUxMRUQ6XG4gICAgICBsb2cuZGVidWcoYEV4ZWN1dGluZyB1cGdyYWRlIG9mICcke2FwcFBhdGh9J2ApO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGxvZy5kZWJ1ZyhgVGhlIGN1cnJlbnQgaW5zdGFsbCBzdGF0ZSBvZiAnJHthcHBQYXRofScgaXMgdW5rbm93bi4gSW5zdGFsbGluZyBhbnl3YXlgKTtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmluc3RhbGwoYXBwUGF0aCwgT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge3JlcGxhY2U6IHRydWV9KSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKGBDYW5ub3QgaW5zdGFsbC91cGdyYWRlICcke3BrZ30nIGJlY2F1c2Ugb2YgJyR7ZXJyLm1lc3NhZ2V9Jy4gVHJ5aW5nIGZ1bGwgcmVpbnN0YWxsYCk7XG4gICAgYXdhaXQgdW5pbnN0YWxsUGFja2FnZSgpO1xuICAgIGF3YWl0IHRoaXMuaW5zdGFsbChhcHBQYXRoLCBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7cmVwbGFjZTogZmFsc2V9KSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBhcHBTdGF0ZSxcbiAgICB3YXNVbmluc3RhbGxlZCxcbiAgfTtcbn07XG5cbi8qKlxuICogRXh0cmFjdCBzdHJpbmcgcmVzb3VyY2VzIGZyb20gdGhlIGdpdmVuIHBhY2thZ2Ugb24gbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSAuYXBrKHMpIHBhY2thZ2UuXG4gKiBAcGFyYW0gez9zdHJpbmd9IGxhbmd1YWdlIC0gVGhlIG5hbWUgb2YgdGhlIGxhbmd1YWdlIHRvIGV4dHJhY3QgdGhlIHJlc291cmNlcyBmb3IuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgbGFuZ3VhZ2UgaXMgdXNlZCBpZiB0aGlzIGVxdWFscyB0byBgbnVsbGAvYHVuZGVmaW5lZGBcbiAqIEBwYXJhbSB7c3RyaW5nfSBvdXQgLSBUaGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24gZm9sZGVyIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSB0b1xuICogICAgICAgICAgICAgICAgICAgICAgIHN0b3JlIHRoZSBleHRyYWN0ZWQgZmlsZSB0by5cbiAqIEByZXR1cm4ge09iamVjdH0gQSBtYXBwaW5nIG9iamVjdCwgd2hlcmUgcHJvcGVydGllcyBhcmU6ICdhcGtTdHJpbmdzJywgY29udGFpbmluZ1xuICogICAgICAgICAgICAgICAgICBwYXJzZWQgcmVzb3VyY2UgZmlsZSByZXByZXNlbnRlZCBhcyBKU09OIG9iamVjdCwgYW5kICdsb2NhbFBhdGgnLFxuICogICAgICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSBwYXRoIHRvIHRoZSBleHRyYWN0ZWQgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5leHRyYWN0U3RyaW5nc0Zyb21BcGsgPSBhc3luYyBmdW5jdGlvbiBleHRyYWN0U3RyaW5nc0Zyb21BcGsgKGFwcFBhdGgsIGxhbmd1YWdlLCBvdXQpIHtcbiAgbG9nLmRlYnVnKGBFeHRyYWN0aW5nIHN0cmluZ3MgZnJvbSBmb3IgbGFuZ3VhZ2U6ICR7bGFuZ3VhZ2UgfHwgJ2RlZmF1bHQnfWApO1xuICBjb25zdCBvcmlnaW5hbEFwcFBhdGggPSBhcHBQYXRoO1xuICBpZiAoYXBwUGF0aC5lbmRzV2l0aChBUEtTX0VYVEVOU0lPTikpIHtcbiAgICBhcHBQYXRoID0gYXdhaXQgdGhpcy5leHRyYWN0TGFuZ3VhZ2VBcGsoYXBwUGF0aCwgbGFuZ3VhZ2UpO1xuICB9XG5cbiAgbGV0IGFwa1N0cmluZ3MgPSB7fTtcbiAgbGV0IGNvbmZpZ01hcmtlcjtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmluaXRBYXB0KCk7XG5cbiAgICBjb25maWdNYXJrZXIgPSBhd2FpdCBmb3JtYXRDb25maWdNYXJrZXIoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKHRoaXMuYmluYXJpZXMuYWFwdCwgW1xuICAgICAgICAnZCcsICdjb25maWd1cmF0aW9ucycsIGFwcFBhdGgsXG4gICAgICBdKTtcbiAgICAgIHJldHVybiBfLnVuaXEoc3Rkb3V0LnNwbGl0KG9zLkVPTCkpO1xuICAgIH0sIGxhbmd1YWdlLCAnKGRlZmF1bHQpJyk7XG5cbiAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWModGhpcy5iaW5hcmllcy5hYXB0LCBbXG4gICAgICAnZCcsICctLXZhbHVlcycsICdyZXNvdXJjZXMnLCBhcHBQYXRoLFxuICAgIF0pO1xuICAgIGFwa1N0cmluZ3MgPSBwYXJzZUFhcHRTdHJpbmdzKHN0ZG91dCwgY29uZmlnTWFya2VyKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5kZWJ1ZygnQ2Fubm90IGV4dHJhY3QgcmVzb3VyY2VzIHVzaW5nIGFhcHQuIFRyeWluZyBhYXB0Mi4gJyArXG4gICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5zdGRlcnIgfHwgZS5tZXNzYWdlfWApO1xuXG4gICAgYXdhaXQgdGhpcy5pbml0QWFwdDIoKTtcblxuICAgIGNvbmZpZ01hcmtlciA9IGF3YWl0IGZvcm1hdENvbmZpZ01hcmtlcihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWModGhpcy5iaW5hcmllcy5hYXB0MiwgW1xuICAgICAgICAnZCcsICdjb25maWd1cmF0aW9ucycsIGFwcFBhdGgsXG4gICAgICBdKTtcbiAgICAgIHJldHVybiBfLnVuaXEoc3Rkb3V0LnNwbGl0KG9zLkVPTCkpO1xuICAgIH0sIGxhbmd1YWdlLCAnJyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKHRoaXMuYmluYXJpZXMuYWFwdDIsIFtcbiAgICAgICAgJ2QnLCAncmVzb3VyY2VzJywgYXBwUGF0aCxcbiAgICAgIF0pO1xuICAgICAgYXBrU3RyaW5ncyA9IHBhcnNlQWFwdDJTdHJpbmdzKHN0ZG91dCwgY29uZmlnTWFya2VyKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBleHRyYWN0IHJlc291cmNlcyBmcm9tICcke29yaWdpbmFsQXBwUGF0aH0nLiBgICtcbiAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoXy5pc0VtcHR5KGFwa1N0cmluZ3MpKSB7XG4gICAgbG9nLndhcm4oYE5vIHN0cmluZ3MgaGF2ZSBiZWVuIGZvdW5kIGluICcke29yaWdpbmFsQXBwUGF0aH0nIHJlc291cmNlcyBgICtcbiAgICAgIGBmb3IgJyR7Y29uZmlnTWFya2VyIHx8ICdkZWZhdWx0J30nIGNvbmZpZ3VyYXRpb25gKTtcbiAgfSBlbHNlIHtcbiAgICBsb2cuaW5mbyhgU3VjY2Vzc2Z1bGx5IGV4dHJhY3RlZCAke18ua2V5cyhhcGtTdHJpbmdzKS5sZW5ndGh9IHN0cmluZ3MgZnJvbSBgICtcbiAgICAgIGAnJHtvcmlnaW5hbEFwcFBhdGh9JyByZXNvdXJjZXMgZm9yICcke2NvbmZpZ01hcmtlciB8fCAnZGVmYXVsdCd9JyBjb25maWd1cmF0aW9uYCk7XG4gIH1cblxuICBjb25zdCBsb2NhbFBhdGggPSBwYXRoLnJlc29sdmUob3V0LCAnc3RyaW5ncy5qc29uJyk7XG4gIGF3YWl0IG1rZGlycChvdXQpO1xuICBhd2FpdCBmcy53cml0ZUZpbGUobG9jYWxQYXRoLCBKU09OLnN0cmluZ2lmeShhcGtTdHJpbmdzLCBudWxsLCAyKSwgJ3V0Zi04Jyk7XG4gIHJldHVybiB7YXBrU3RyaW5ncywgbG9jYWxQYXRofTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBsYW5ndWFnZSBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBuYW1lIG9mIGRldmljZSBsYW5ndWFnZS5cbiAqL1xuYXBrVXRpbHNNZXRob2RzLmdldERldmljZUxhbmd1YWdlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlTGFuZ3VhZ2UgKCkge1xuICBsZXQgbGFuZ3VhZ2U7XG4gIGlmIChhd2FpdCB0aGlzLmdldEFwaUxldmVsKCkgPCAyMykge1xuICAgIGxhbmd1YWdlID0gYXdhaXQgdGhpcy5nZXREZXZpY2VTeXNMYW5ndWFnZSgpO1xuICAgIGlmICghbGFuZ3VhZ2UpIHtcbiAgICAgIGxhbmd1YWdlID0gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9kdWN0TGFuZ3VhZ2UoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGFuZ3VhZ2UgPSAoYXdhaXQgdGhpcy5nZXREZXZpY2VMb2NhbGUoKSkuc3BsaXQoJy0nKVswXTtcbiAgfVxuICByZXR1cm4gbGFuZ3VhZ2U7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgY291bnRyeSBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBuYW1lIG9mIGRldmljZSBjb3VudHJ5LlxuICovXG5hcGtVdGlsc01ldGhvZHMuZ2V0RGV2aWNlQ291bnRyeSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZUNvdW50cnkgKCkge1xuICAvLyB0aGlzIG1ldGhvZCBpcyBvbmx5IHVzZWQgaW4gQVBJIDwgMjNcbiAgbGV0IGNvdW50cnkgPSBhd2FpdCB0aGlzLmdldERldmljZVN5c0NvdW50cnkoKTtcbiAgaWYgKCFjb3VudHJ5KSB7XG4gICAgY291bnRyeSA9IGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvZHVjdENvdW50cnkoKTtcbiAgfVxuICByZXR1cm4gY291bnRyeTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBsb2NhbGUgbmFtZSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgbmFtZSBvZiBkZXZpY2UgbG9jYWxlLlxuICovXG5hcGtVdGlsc01ldGhvZHMuZ2V0RGV2aWNlTG9jYWxlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlTG9jYWxlICgpIHtcbiAgLy8gdGhpcyBtZXRob2QgaXMgb25seSB1c2VkIGluIEFQSSA+PSAyM1xuICBsZXQgbG9jYWxlID0gYXdhaXQgdGhpcy5nZXREZXZpY2VTeXNMb2NhbGUoKTtcbiAgaWYgKCFsb2NhbGUpIHtcbiAgICBsb2NhbGUgPSBhd2FpdCB0aGlzLmdldERldmljZVByb2R1Y3RMb2NhbGUoKTtcbiAgfVxuICByZXR1cm4gbG9jYWxlO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGxvY2FsZSBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBhbmQgdGhlIGZvcm1hdCBvZiB0aGUgbG9jYWxlIGlzIGVuLVVTLCBmb3IgZXhhbXBsZS5cbiAqIFRoaXMgbWV0aG9kIGNhbGwgc2V0RGV2aWNlTGFuZ3VhZ2VDb3VudHJ5LCBzbywgcGxlYXNlIHVzZSBzZXREZXZpY2VMYW5ndWFnZUNvdW50cnkgYXMgcG9zc2libGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsZSAtIE5hbWVzIG9mIHRoZSBkZXZpY2UgbGFuZ3VhZ2UgYW5kIHRoZSBjb3VudHJ5IGNvbm5lY3RlZCB3aXRoIGAtYC4gZS5nLiBlbi1VUy5cbiAqL1xuYXBrVXRpbHNNZXRob2RzLnNldERldmljZUxvY2FsZSA9IGFzeW5jIGZ1bmN0aW9uIHNldERldmljZUxvY2FsZSAobG9jYWxlKSB7XG4gIGNvbnN0IHZhbGlkYXRlTG9jYWxlID0gbmV3IFJlZ0V4cCgvW2EtekEtWl0rLVthLXpBLVowLTldKy8pO1xuICBpZiAoIXZhbGlkYXRlTG9jYWxlLnRlc3QobG9jYWxlKSkge1xuICAgIGxvZy53YXJuKGBzZXREZXZpY2VMb2NhbGUgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6IGVuLVVTIG9yIGphLUpQYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHNwbGl0X2xvY2FsZSA9IGxvY2FsZS5zcGxpdCgnLScpO1xuICBhd2FpdCB0aGlzLnNldERldmljZUxhbmd1YWdlQ291bnRyeShzcGxpdF9sb2NhbGVbMF0sIHNwbGl0X2xvY2FsZVsxXSk7XG59O1xuXG4vKipcbiAqIE1ha2Ugc3VyZSBjdXJyZW50IGRldmljZSBsb2NhbGUgaXMgZXhwZWN0ZWQgb3Igbm90LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZSAtIExhbmd1YWdlLiBUaGUgbGFuZ3VhZ2UgZmllbGQgaXMgY2FzZSBpbnNlbnNpdGl2ZSwgYnV0IExvY2FsZSBhbHdheXMgY2Fub25pY2FsaXplcyB0byBsb3dlciBjYXNlLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvdW50cnkgLSBDb3VudHJ5LiBUaGUgbGFuZ3VhZ2UgZmllbGQgaXMgY2FzZSBpbnNlbnNpdGl2ZSwgYnV0IExvY2FsZSBhbHdheXMgY2Fub25pY2FsaXplcyB0byBsb3dlciBjYXNlLlxuICogQHBhcmFtIHs/c3RyaW5nfSBzY3JpcHQgLSBTY3JpcHQuIFRoZSBzY3JpcHQgZmllbGQgaXMgY2FzZSBpbnNlbnNpdGl2ZSBidXQgTG9jYWxlIGFsd2F5cyBjYW5vbmljYWxpemVzIHRvIHRpdGxlIGNhc2UuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gSWYgY3VycmVudCBsb2NhbGUgaXMgbGFuZ3VhZ2UgYW5kIGNvdW50cnkgYXMgYXJndW1lbnRzLCByZXR1cm4gdHJ1ZS5cbiAqL1xuYXBrVXRpbHNNZXRob2RzLmVuc3VyZUN1cnJlbnRMb2NhbGUgPSBhc3luYyBmdW5jdGlvbiBlbnN1cmVDdXJyZW50TG9jYWxlIChsYW5ndWFnZSwgY291bnRyeSwgc2NyaXB0ID0gbnVsbCkge1xuICBjb25zdCBoYXNMYW5ndWFnZSA9IF8uaXNTdHJpbmcobGFuZ3VhZ2UpO1xuICBjb25zdCBoYXNDb3VudHJ5ID0gXy5pc1N0cmluZyhjb3VudHJ5KTtcblxuICBpZiAoIWhhc0xhbmd1YWdlICYmICFoYXNDb3VudHJ5KSB7XG4gICAgbG9nLndhcm4oJ2Vuc3VyZUN1cnJlbnRMb2NhbGUgcmVxdWlyZXMgbGFuZ3VhZ2Ugb3IgY291bnRyeScpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGdldCBsb3dlciBjYXNlIHZlcnNpb25zIG9mIHRoZSBzdHJpbmdzXG4gIGxhbmd1YWdlID0gKGxhbmd1YWdlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICBjb3VudHJ5ID0gKGNvdW50cnkgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmdldEFwaUxldmVsKCk7XG5cbiAgcmV0dXJuIGF3YWl0IHJldHJ5SW50ZXJ2YWwoNSwgMTAwMCwgYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoYXBpTGV2ZWwgPCAyMykge1xuICAgICAgICBsZXQgY3VyTGFuZ3VhZ2UsIGN1ckNvdW50cnk7XG4gICAgICAgIGlmIChoYXNMYW5ndWFnZSkge1xuICAgICAgICAgIGN1ckxhbmd1YWdlID0gKGF3YWl0IHRoaXMuZ2V0RGV2aWNlTGFuZ3VhZ2UoKSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBpZiAoIWhhc0NvdW50cnkgJiYgbGFuZ3VhZ2UgPT09IGN1ckxhbmd1YWdlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0NvdW50cnkpIHtcbiAgICAgICAgICBjdXJDb3VudHJ5ID0gKGF3YWl0IHRoaXMuZ2V0RGV2aWNlQ291bnRyeSgpKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGlmICghaGFzTGFuZ3VhZ2UgJiYgY291bnRyeSA9PT0gY3VyQ291bnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChsYW5ndWFnZSA9PT0gY3VyTGFuZ3VhZ2UgJiYgY291bnRyeSA9PT0gY3VyQ291bnRyeSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjdXJMb2NhbGUgPSAoYXdhaXQgdGhpcy5nZXREZXZpY2VMb2NhbGUoKSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gemgtaGFucy1jbiA6IHpoLWNuXG4gICAgICAgIGNvbnN0IGxvY2FsZUNvZGUgPSBzY3JpcHQgPyBgJHtsYW5ndWFnZX0tJHtzY3JpcHQudG9Mb3dlckNhc2UoKX0tJHtjb3VudHJ5fWAgOiBgJHtsYW5ndWFnZX0tJHtjb3VudHJ5fWA7XG5cbiAgICAgICAgaWYgKGxvY2FsZUNvZGUgPT09IGN1ckxvY2FsZSkge1xuICAgICAgICAgIGxvZy5kZWJ1ZyhgUmVxdWVzdGVkIGxvY2FsZSBpcyBlcXVhbCB0byBjdXJyZW50IGxvY2FsZTogJyR7Y3VyTG9jYWxlfSdgKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gaWYgdGhlcmUgaGFzIGJlZW4gYW4gZXJyb3IsIHJlc3RhcnQgYWRiIGFuZCByZXRyeVxuICAgICAgbG9nLmVycm9yKGBVbmFibGUgdG8gY2hlY2sgZGV2aWNlIGxvY2FsaXphdGlvbjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVjb25uZWN0KCk7XG4gICAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXN0YXJ0QWRiKCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9KTtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBsb2NhbGUgbmFtZSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlIC0gTGFuZ3VhZ2UuIFRoZSBsYW5ndWFnZSBmaWVsZCBpcyBjYXNlIGluc2Vuc2l0aXZlLCBidXQgTG9jYWxlIGFsd2F5cyBjYW5vbmljYWxpemVzIHRvIGxvd2VyIGNhc2UuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IFthLXpBLVpdezIsOH0uIGUuZy4gZW4sIGphIDogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2phdmEvdXRpbC9Mb2NhbGUuaHRtbFxuICogQHBhcmFtIHtzdHJpbmd9IGNvdW50cnkgLSBDb3VudHJ5LiBUaGUgY291bnRyeSAocmVnaW9uKSBmaWVsZCBpcyBjYXNlIGluc2Vuc2l0aXZlLCBidXQgTG9jYWxlIGFsd2F5cyBjYW5vbmljYWxpemVzIHRvIHVwcGVyIGNhc2UuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IFthLXpBLVpdezJ9IHwgWzAtOV17M30uIGUuZy4gVVMsIEpQIDogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2phdmEvdXRpbC9Mb2NhbGUuaHRtbFxuICogQHBhcmFtIHs/c3RyaW5nfSBzY3JpcHQgLSBTY3JpcHQuIFRoZSBzY3JpcHQgZmllbGQgaXMgY2FzZSBpbnNlbnNpdGl2ZSBidXQgTG9jYWxlIGFsd2F5cyBjYW5vbmljYWxpemVzIHRvIHRpdGxlIGNhc2UuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IFthLXpBLVpdezR9LiBlLmcuIEhhbnMgaW4gemgtSGFucy1DTiA6IGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9qYXZhL3V0aWwvTG9jYWxlLmh0bWxcbiAqL1xuYXBrVXRpbHNNZXRob2RzLnNldERldmljZUxhbmd1YWdlQ291bnRyeSA9IGFzeW5jIGZ1bmN0aW9uIHNldERldmljZUxhbmd1YWdlQ291bnRyeSAobGFuZ3VhZ2UsIGNvdW50cnksIHNjcmlwdCA9IG51bGwpIHtcbiAgbGV0IGhhc0xhbmd1YWdlID0gbGFuZ3VhZ2UgJiYgXy5pc1N0cmluZyhsYW5ndWFnZSk7XG4gIGxldCBoYXNDb3VudHJ5ID0gY291bnRyeSAmJiBfLmlzU3RyaW5nKGNvdW50cnkpO1xuICBpZiAoIWhhc0xhbmd1YWdlIHx8ICFoYXNDb3VudHJ5KSB7XG4gICAgbG9nLndhcm4oYHNldERldmljZUxhbmd1YWdlQ291bnRyeSByZXF1aXJlcyBsYW5ndWFnZSBhbmQgY291bnRyeSBhdCBsZWFzdGApO1xuICAgIGxvZy53YXJuKGBHb3QgbGFuZ3VhZ2U6ICcke2xhbmd1YWdlfScgYW5kIGNvdW50cnk6ICcke2NvdW50cnl9J2ApO1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmdldEFwaUxldmVsKCk7XG5cbiAgbGFuZ3VhZ2UgPSAobGFuZ3VhZ2UgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gIGNvdW50cnkgPSAoY291bnRyeSB8fCAnJykudG9VcHBlckNhc2UoKTtcblxuICBpZiAoYXBpTGV2ZWwgPCAyMykge1xuICAgIGxldCBjdXJMYW5ndWFnZSA9IChhd2FpdCB0aGlzLmdldERldmljZUxhbmd1YWdlKCkpLnRvTG93ZXJDYXNlKCk7XG4gICAgbGV0IGN1ckNvdW50cnkgPSAoYXdhaXQgdGhpcy5nZXREZXZpY2VDb3VudHJ5KCkpLnRvVXBwZXJDYXNlKCk7XG5cbiAgICBpZiAobGFuZ3VhZ2UgIT09IGN1ckxhbmd1YWdlIHx8IGNvdW50cnkgIT09IGN1ckNvdW50cnkpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0RGV2aWNlU3lzTG9jYWxlVmlhU2V0dGluZ0FwcChsYW5ndWFnZSwgY291bnRyeSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBjdXJMb2NhbGUgPSBhd2FpdCB0aGlzLmdldERldmljZUxvY2FsZSgpO1xuXG4gICAgLy8gemgtSGFucy1DTiA6IHpoLUNOXG4gICAgY29uc3QgbG9jYWxlQ29kZSA9IHNjcmlwdCA/IGAke2xhbmd1YWdlfS0ke3NjcmlwdH0tJHtjb3VudHJ5fWAgOiBgJHtsYW5ndWFnZX0tJHtjb3VudHJ5fWA7XG4gICAgbG9nLmRlYnVnKGBDdXJyZW50IGxvY2FsZTogJyR7Y3VyTG9jYWxlfSc7IHJlcXVlc3RlZCBsb2NhbGU6ICcke2xvY2FsZUNvZGV9J2ApO1xuICAgIGlmIChsb2NhbGVDb2RlLnRvTG93ZXJDYXNlKCkgIT09IGN1ckxvY2FsZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBhd2FpdCB0aGlzLnNldERldmljZVN5c0xvY2FsZVZpYVNldHRpbmdBcHAobGFuZ3VhZ2UsIGNvdW50cnksIHNjcmlwdCk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEFwcEluZm9cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gUGFja2FnZSBuYW1lLCBmb3IgZXhhbXBsZSAnY29tLmFjbWUuYXBwJy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2ZXJzaW9uQ29kZSAtIFZlcnNpb24gY29kZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uTmFtZSAtIFZlcnNpb24gbmFtZSwgZm9yIGV4YW1wbGUgJzEuMCcuXG4gKi9cblxuLyoqXG4gKiBHZXQgdGhlIHBhY2thZ2UgaW5mbyBmcm9tIGxvY2FsIGFwayBmaWxlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBQYXRoIC0gVGhlIGZ1bGwgcGF0aCB0byBleGlzdGluZyAuYXBrKHMpIHBhY2thZ2Ugb24gdGhlIGxvY2FsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgc3lzdGVtLlxuICogQHJldHVybiB7P0FwcEluZm99IFRoZSBwYXJzZWQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24uXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5nZXRBcGtJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0QXBrSW5mbyAoYXBwUGF0aCkge1xuICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhhcHBQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGZpbGUgYXQgcGF0aCAke2FwcFBhdGh9IGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhY2Nlc3NpYmxlYCk7XG4gIH1cblxuICBpZiAoYXBwUGF0aC5lbmRzV2l0aChBUEtTX0VYVEVOU0lPTikpIHtcbiAgICBhcHBQYXRoID0gYXdhaXQgdGhpcy5leHRyYWN0QmFzZUFwayhhcHBQYXRoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgYXBrUmVhZGVyID0gYXdhaXQgQXBrUmVhZGVyLm9wZW4oYXBwUGF0aCk7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBhd2FpdCBhcGtSZWFkZXIucmVhZE1hbmlmZXN0KCk7XG4gICAgY29uc3Qge3BrZywgdmVyc2lvbk5hbWUsIHZlcnNpb25Db2RlfSA9IHBhcnNlTWFuaWZlc3QobWFuaWZlc3QpO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBwa2csXG4gICAgICB2ZXJzaW9uQ29kZSxcbiAgICAgIHZlcnNpb25OYW1lLFxuICAgIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cud2FybihgRXJyb3IgJyR7ZS5tZXNzYWdlfScgd2hpbGUgZ2V0dGluZyBiYWRnaW5nIGluZm9gKTtcbiAgfVxuICByZXR1cm4ge307XG59O1xuXG4vKipcbiAqIEdldCB0aGUgcGFja2FnZSBpbmZvIGZyb20gdGhlIGluc3RhbGxlZCBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIG5hbWUgb2YgdGhlIGluc3RhbGxlZCBwYWNrYWdlLlxuICogQHJldHVybiB7P0FwcEluZm99IFRoZSBwYXJzZWQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24uXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5nZXRQYWNrYWdlSW5mbyA9IGFzeW5jIGZ1bmN0aW9uIGdldFBhY2thZ2VJbmZvIChwa2cpIHtcbiAgbG9nLmRlYnVnKGBHZXR0aW5nIHBhY2thZ2UgaW5mbyBmb3IgJyR7cGtnfSdgKTtcbiAgbGV0IHJlc3VsdCA9IHtuYW1lOiBwa2d9O1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgICBjb25zdCB2ZXJzaW9uTmFtZU1hdGNoID0gbmV3IFJlZ0V4cCgvdmVyc2lvbk5hbWU9KFtcXGQrLl0rKS8pLmV4ZWMoc3Rkb3V0KTtcbiAgICBpZiAodmVyc2lvbk5hbWVNYXRjaCkge1xuICAgICAgcmVzdWx0LnZlcnNpb25OYW1lID0gdmVyc2lvbk5hbWVNYXRjaFsxXTtcbiAgICB9XG4gICAgY29uc3QgdmVyc2lvbkNvZGVNYXRjaCA9IG5ldyBSZWdFeHAoL3ZlcnNpb25Db2RlPShcXGQrKS8pLmV4ZWMoc3Rkb3V0KTtcbiAgICBpZiAodmVyc2lvbkNvZGVNYXRjaCkge1xuICAgICAgcmVzdWx0LnZlcnNpb25Db2RlID0gcGFyc2VJbnQodmVyc2lvbkNvZGVNYXRjaFsxXSwgMTApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybihgRXJyb3IgJyR7ZXJyLm1lc3NhZ2V9JyB3aGlsZSBkdW1waW5nIHBhY2thZ2UgaW5mb2ApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5hcGtVdGlsc01ldGhvZHMucHVsbEFwayA9IGFzeW5jIGZ1bmN0aW9uIHB1bGxBcGsgKHBrZywgdG1wRGlyKSB7XG4gIGNvbnN0IHBrZ1BhdGggPSAoYXdhaXQgdGhpcy5hZGJFeGVjKFsnc2hlbGwnLCAncG0nLCAncGF0aCcsIHBrZ10pKS5yZXBsYWNlKCdwYWNrYWdlOicsICcnKTtcbiAgY29uc3QgdG1wQXBwID0gcGF0aC5yZXNvbHZlKHRtcERpciwgYCR7cGtnfS5hcGtgKTtcbiAgYXdhaXQgdGhpcy5wdWxsKHBrZ1BhdGgsIHRtcEFwcCk7XG4gIGxvZy5kZWJ1ZyhgUHVsbGVkIGFwcCBmb3IgcGFja2FnZSAnJHtwa2d9JyB0byAnJHt0bXBBcHB9J2ApO1xuICByZXR1cm4gdG1wQXBwO1xufTtcblxuZXhwb3J0IHsgUkVNT1RFX0NBQ0hFX1JPT1QgfTtcbmV4cG9ydCBkZWZhdWx0IGFwa1V0aWxzTWV0aG9kcztcbiJdLCJmaWxlIjoibGliL3Rvb2xzL2Fway11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
@@ -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.itemCount === 0) {
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9hcGtzLXV0aWxzLmpzIl0sIm5hbWVzIjpbIkJBU0VfQVBLIiwiTEFOR1VBR0VfQVBLIiwibGFuZyIsIkFQS1NfQ0FDSEUiLCJMUlUiLCJtYXgiLCJkaXNwb3NlIiwiYXBrc0hhc2giLCJleHRyYWN0ZWRGaWxlc1Jvb3QiLCJmcyIsInJpbXJhZiIsIkFQS1NfQ0FDSEVfR1VBUkQiLCJBc3luY0xvY2siLCJCVU5ETEVUT09MX1RJTUVPVVRfTVMiLCJhcGtzVXRpbHNNZXRob2RzIiwicHJvY2VzcyIsIm9uIiwic2l6ZSIsInBhdGhzIiwidmFsdWVzIiwibG9nIiwiZGVidWciLCJsZW5ndGgiLCJ1dGlsIiwicGx1cmFsaXplIiwiYXBwUGF0aCIsInJpbXJhZlN5bmMiLCJlIiwid2FybiIsIm1lc3NhZ2UiLCJleHRyYWN0RnJvbUFwa3MiLCJhcGtzIiwiZHN0UGF0aCIsIl8iLCJpc0FycmF5IiwiYWNxdWlyZSIsImhhc2giLCJoYXMiLCJyZXN1bHRQYXRoIiwicGF0aCIsInJlc29sdmUiLCJnZXQiLCJleGlzdHMiLCJkZWwiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJFcnJvciIsImpvaW4iLCJzZXAiLCJzZXQiLCJleGVjQnVuZGxldG9vbCIsImFyZ3MiLCJlcnJvck1zZyIsImluaXRCdW5kbGV0b29sIiwiYmluYXJpZXMiLCJidW5kbGV0b29sIiwiZW52IiwiYWRiUG9ydCIsIkFORFJPSURfQURCX1NFUlZFUl9QT1JUIiwiYWRiSG9zdCIsIkFORFJPSURfQURCX1NFUlZFUl9IT1NUIiwiSlNPTiIsInN0cmluZ2lmeSIsInN0ZG91dCIsInRpbWVvdXQiLCJ0cnVuY2F0ZSIsInN0ZGVyciIsImdldERldmljZVNwZWMiLCJzcGVjTG9jYXRpb24iLCJleGVjdXRhYmxlIiwiY3VyRGV2aWNlSWQiLCJpbnN0YWxsTXVsdGlwbGVBcGtzIiwiYXBrUGF0aHNUb0luc3RhbGwiLCJvcHRpb25zIiwiaW5zdGFsbEFyZ3MiLCJnZXRBcGlMZXZlbCIsImFkYkV4ZWMiLCJ0aW1lb3V0Q2FwTmFtZSIsImluc3RhbGxBcGtzIiwiZ3JhbnRQZXJtaXNzaW9ucyIsImFsbG93VGVzdFBhY2thZ2VzIiwiQVBLU19JTlNUQUxMX1RJTUVPVVQiLCJwdXNoIiwidGFza3MiLCJiYXNlbmFtZSIsImdldEFwa0luZm8iLCJhcGtJbmZvIiwiQiIsImFsbCIsImdyYW50QWxsUGVybWlzc2lvbnMiLCJuYW1lIiwiZXh0cmFjdEJhc2VBcGsiLCJleHRyYWN0TGFuZ3VhZ2VBcGsiLCJsYW5ndWFnZSIsImluZm8iLCJkZWZhdWx0TGFuZ3VhZ2VzIiwiaWduIiwiaXNUZXN0UGFja2FnZU9ubHlFcnJvciIsIm91dHB1dCIsInRlc3QiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0E7O0FBQ0E7O0FBRUEsTUFBTUEsUUFBUSxHQUFHLGlCQUFqQjs7QUFDQSxNQUFNQyxZQUFZLEdBQUlDLElBQUQsSUFBVyxRQUFPQSxJQUFLLE1BQTVDOztBQUNBLE1BQU1DLFVBQVUsR0FBRyxJQUFJQyxpQkFBSixDQUFRO0FBQ3pCQyxFQUFBQSxHQUFHLEVBQUUsRUFEb0I7QUFFekJDLEVBQUFBLE9BQU8sRUFBRSxDQUFDQyxRQUFELEVBQVdDLGtCQUFYLEtBQWtDQyxZQUFHQyxNQUFILENBQVVGLGtCQUFWO0FBRmxCLENBQVIsQ0FBbkI7QUFJQSxNQUFNRyxnQkFBZ0IsR0FBRyxJQUFJQyxrQkFBSixFQUF6QjtBQUNBLE1BQU1DLHFCQUFxQixHQUFHLElBQUksRUFBSixHQUFTLElBQXZDO0FBRUEsTUFBTUMsZ0JBQWdCLEdBQUcsRUFBekI7QUFFQUMsT0FBTyxDQUFDQyxFQUFSLENBQVcsTUFBWCxFQUFtQixNQUFNO0FBQ3ZCLE1BQUksQ0FBQ2IsVUFBVSxDQUFDYyxJQUFoQixFQUFzQjtBQUNwQjtBQUNEOztBQUVELFFBQU1DLEtBQUssR0FBRyxDQUFDLEdBQUdmLFVBQVUsQ0FBQ2dCLE1BQVgsRUFBSixDQUFk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T0FBSyxNQUFNOUYsSUFBWCxJQUFtQjhGLGdCQUFuQixFQUFxQztBQUNuQyxRQUFJO0FBQ0YsYUFBTyxNQUFNbEUsZUFBZSxDQUFDQyxJQUFELEVBQU8sQ0FBQyxRQUFELEVBQVc5QixZQUFZLENBQUNDLElBQUQsQ0FBdkIsQ0FBUCxDQUE1QjtBQUNELEtBRkQsQ0FFRSxPQUFPK0YsR0FBUCxFQUFZLENBQUU7QUFDakI7O0FBRUQ3RSxrQkFBSTJFLElBQUosQ0FBVSx1REFBc0RqQyxJQUFJLENBQUNDLFNBQUwsQ0FBZWlDLGdCQUFmLENBQWlDLElBQXhGLEdBQ04saUNBREg7O0FBRUEsU0FBTyxNQUFNLEtBQUtKLGNBQUwsQ0FBb0I3RCxJQUFwQixDQUFiO0FBQ0QsQ0F0QkQ7O0FBd0JBakIsZ0JBQWdCLENBQUNvRixzQkFBakIsR0FBMEMsU0FBU0Esc0JBQVQsQ0FBaUNDLE1BQWpDLEVBQXlDO0FBQ2pGLFNBQU8sK0JBQStCQyxJQUEvQixDQUFvQ0QsTUFBcEMsQ0FBUDtBQUNELENBRkQ7O2VBSWVyRixnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IExSVSBmcm9tICdscnUtY2FjaGUnO1xuaW1wb3J0IHtcbiAgZ2V0SmF2YUZvck9zLCB1bnppcEZpbGUsIGJ1aWxkSW5zdGFsbEFyZ3MsIEFQS1NfSU5TVEFMTF9USU1FT1VUXG59IGZyb20gJy4uL2hlbHBlcnMuanMnO1xuaW1wb3J0IEFzeW5jTG9jayBmcm9tICdhc3luYy1sb2NrJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxuY29uc3QgQkFTRV9BUEsgPSAnYmFzZS1tYXN0ZXIuYXBrJztcbmNvbnN0IExBTkdVQUdFX0FQSyA9IChsYW5nKSA9PiBgYmFzZS0ke2xhbmd9LmFwa2A7XG5jb25zdCBBUEtTX0NBQ0hFID0gbmV3IExSVSh7XG4gIG1heDogMTAsXG4gIGRpc3Bvc2U6IChhcGtzSGFzaCwgZXh0cmFjdGVkRmlsZXNSb290KSA9PiBmcy5yaW1yYWYoZXh0cmFjdGVkRmlsZXNSb290KSxcbn0pO1xuY29uc3QgQVBLU19DQUNIRV9HVUFSRCA9IG5ldyBBc3luY0xvY2soKTtcbmNvbnN0IEJVTkRMRVRPT0xfVElNRU9VVF9NUyA9IDQgKiA2MCAqIDEwMDA7XG5cbmNvbnN0IGFwa3NVdGlsc01ldGhvZHMgPSB7fTtcblxucHJvY2Vzcy5vbignZXhpdCcsICgpID0+IHtcbiAgaWYgKCFBUEtTX0NBQ0hFLnNpemUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYXRocyA9IFsuLi5BUEtTX0NBQ0hFLnZhbHVlcygpXTtcbiAgbG9nLmRlYnVnKGBQZXJmb3JtaW5nIGNsZWFudXAgb2YgJHtwYXRocy5sZW5ndGh9IGNhY2hlZCAuYXBrcyBgICtcbiAgICB1dGlsLnBsdXJhbGl6ZSgncGFja2FnZScsIHBhdGhzLmxlbmd0aCkpO1xuICBmb3IgKGNvbnN0IGFwcFBhdGggb2YgcGF0aHMpIHtcbiAgICB0cnkge1xuICAgICAgLy8gQXN5bmNocm9ub3VzIGNhbGxzIGFyZSBub3Qgc3VwcG9ydGVkIGluIG9uRXhpdCBoYW5kbGVyXG4gICAgICBmcy5yaW1yYWZTeW5jKGFwcFBhdGgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy53YXJuKGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG59KTtcblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgcGFydGljdWxhciBhcGtzIHBhY2thZ2UgaW50byBhIHRlbXBvcmFyeSBmb2xkZXIsXG4gKiBmaW5kcyBhbmQgcmV0dXJucyB0aGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlIGNvbnRhaW5lZCBpbiB0aGlzIGFway5cbiAqIFRoZSByZXN1bHRpbmcgdGVtcG9yYXJ5IHBhdGgsIHdoZXJlIHRoZSAuYXBrcyBmaWxlIGhhcyBiZWVuIGV4dHJhY3RlZCxcbiAqIHdpbGwgYmUgc3RvcmVkIGludG8gdGhlIGludGVybmFsIExSVSBjYWNoZSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGtzIC0gVGhlIGZ1bGwgcGF0aCB0byB0aGUgLmFwa3MgZmlsZVxuICogQHBhcmFtIHtzdHJpbmd8QXJyYXk8U3RyaW5nPn0gZHN0UGF0aCAtIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBkZXN0aW5hdGlvbiBmaWxlLFxuICogd2hpY2ggaXMgZ29pbmcgdG8gYmUgZXh0cmFjdGVkLCB3aGVyZSBlYWNoIHBhdGggY29tcG9uZW50IGlzIGFuIGFycmF5IGl0ZW1cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEZ1bGwgcGF0aCB0byB0aGUgZXh0cmFjdGVkIGZpbGVcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcmVxdWVzdGVkIGl0ZW0gZG9lcyBub3QgZXhpc3QgaW4gdGhlIGV4dHJhY3RlZCBhcmNoaXZlIG9yIHRoZSBwcm92aWRlc1xuICogYXBrcyBmaWxlIGlzIG5vdCBhIHZhbGlkIGJ1bmRsZVxuICovXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0RnJvbUFwa3MgKGFwa3MsIGRzdFBhdGgpIHtcbiAgaWYgKCFfLmlzQXJyYXkoZHN0UGF0aCkpIHtcbiAgICBkc3RQYXRoID0gW2RzdFBhdGhdO1xuICB9XG5cbiAgcmV0dXJuIGF3YWl0IEFQS1NfQ0FDSEVfR1VBUkQuYWNxdWlyZShhcGtzLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gSXQgbWlnaHQgYmUgdGhhdCB0aGUgb3JpZ2luYWwgZmlsZSBoYXMgYmVlbiByZXBsYWNlZCxcbiAgICAvLyBzbyB3ZSBuZWVkIHRvIGtlZXAgdGhlIGhhc2ggc3VtcyBpbnN0ZWFkIG9mIHRoZSBhY3R1YWwgZmlsZSBwYXRoc1xuICAgIC8vIGFzIGNhY2hpbmcga2V5c1xuICAgIGNvbnN0IGFwa3NIYXNoID0gYXdhaXQgZnMuaGFzaChhcGtzKTtcbiAgICBsb2cuZGVidWcoYENhbGN1bGF0ZWQgJyR7YXBrc30nIGhhc2g6ICR7YXBrc0hhc2h9YCk7XG5cbiAgICBpZiAoQVBLU19DQUNIRS5oYXMoYXBrc0hhc2gpKSB7XG4gICAgICBjb25zdCByZXN1bHRQYXRoID0gcGF0aC5yZXNvbHZlKEFQS1NfQ0FDSEUuZ2V0KGFwa3NIYXNoKSwgLi4uZHN0UGF0aCk7XG4gICAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKHJlc3VsdFBhdGgpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHRQYXRoO1xuICAgICAgfVxuICAgICAgQVBLU19DQUNIRS5kZWwoYXBrc0hhc2gpO1xuICAgIH1cblxuICAgIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICBsb2cuZGVidWcoYFVucGFja2luZyBhcHBsaWNhdGlvbiBidW5kbGUgYXQgJyR7YXBrc30nIHRvICcke3RtcFJvb3R9J2ApO1xuICAgIGF3YWl0IHVuemlwRmlsZShhcGtzLCB0bXBSb290KTtcbiAgICBjb25zdCByZXN1bHRQYXRoID0gcGF0aC5yZXNvbHZlKHRtcFJvb3QsIC4uLmRzdFBhdGgpO1xuICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKHJlc3VsdFBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZHN0UGF0aC5qb2luKHBhdGguc2VwKX0gY2Fubm90IGJlIGZvdW5kIGluICcke2Fwa3N9JyBidW5kbGUuIGAgK1xuICAgICAgICBgRG9lcyB0aGUgYXJjaGl2ZSBjb250YWluIGEgdmFsaWQgYXBwbGljYXRpb24gYnVuZGxlP2ApO1xuICAgIH1cbiAgICBBUEtTX0NBQ0hFLnNldChhcGtzSGFzaCwgdG1wUm9vdCk7XG4gICAgcmV0dXJuIHJlc3VsdFBhdGg7XG4gIH0pO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGJ1bmRsZXRvb2wgdXRpbGl0eSB3aXRoIGdpdmVuIGFyZ3VtZW50cyBhbmQgcmV0dXJucyB0aGUgYWN0dWFsIHN0ZG91dFxuICpcbiAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0gYXJncyAtIHRoZSBsaXN0IG9mIGJ1bmRsZXRvb2wgYXJndW1lbnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gZXJyb3JNc2cgLSBUaGUgY3VzdG9taXplZCBlcnJvciBtZXNzYWdlIHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gdGhlIGFjdHVhbCBjb21tYW5kIHN0ZG91dFxuICogQHRocm93cyB7RXJyb3J9IElmIGJ1bmRsZXRvb2wgamFyIGRvZXMgbm90IGV4aXN0IGluIFBBVEggb3IgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlXG4gKiBleGVjdXRpbmcgaXRcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5leGVjQnVuZGxldG9vbCA9IGFzeW5jIGZ1bmN0aW9uIGV4ZWNCdW5kbGV0b29sIChhcmdzLCBlcnJvck1zZykge1xuICBhd2FpdCB0aGlzLmluaXRCdW5kbGV0b29sKCk7XG4gIGFyZ3MgPSBbXG4gICAgJy1qYXInLCB0aGlzLmJpbmFyaWVzLmJ1bmRsZXRvb2wsXG4gICAgLi4uYXJnc1xuICBdO1xuICBjb25zdCBlbnYgPSBwcm9jZXNzLmVudjtcbiAgaWYgKHRoaXMuYWRiUG9ydCkge1xuICAgIGVudi5BTkRST0lEX0FEQl9TRVJWRVJfUE9SVCA9IGAke3RoaXMuYWRiUG9ydH1gO1xuICB9XG4gIGlmICh0aGlzLmFkYkhvc3QpIHtcbiAgICBlbnYuQU5EUk9JRF9BREJfU0VSVkVSX0hPU1QgPSB0aGlzLmFkYkhvc3Q7XG4gIH1cbiAgbG9nLmRlYnVnKGBFeGVjdXRpbmcgYnVuZGxldG9vbCB3aXRoIGFyZ3VtZW50czogJHtKU09OLnN0cmluZ2lmeShhcmdzKX1gKTtcbiAgbGV0IHN0ZG91dDtcbiAgdHJ5IHtcbiAgICAoe3N0ZG91dH0gPSBhd2FpdCBleGVjKGF3YWl0IGdldEphdmFGb3JPcygpLCBhcmdzLCB7XG4gICAgICBlbnYsXG4gICAgICB0aW1lb3V0OiBCVU5ETEVUT09MX1RJTUVPVVRfTVMsXG4gICAgfSkpO1xuICAgIGxvZy5kZWJ1ZyhgQ29tbWFuZCBzdGRvdXQ6ICR7Xy50cnVuY2F0ZShzdGRvdXQsIHtsZW5ndGg6IDMwMH0pfWApO1xuICAgIHJldHVybiBzdGRvdXQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZS5zdGRvdXQpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgQ29tbWFuZCBzdGRvdXQ6ICR7ZS5zdGRvdXR9YCk7XG4gICAgfVxuICAgIGlmIChlLnN0ZGVycikge1xuICAgICAgbG9nLmRlYnVnKGBDb21tYW5kIHN0ZGVycjogJHtlLnN0ZGVycn1gKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2Vycm9yTXNnfS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcGVjTG9jYXRpb24gLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBnZW5lcmF0ZWQgZGV2aWNlIHNwZWMgbG9jYXRpb25cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzYW1lIGBzcGVjTG9jYXRpb25gIHZhbHVlXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIHRoZSBzcGVjIGZvciB0aGUgY3VycmVudCBkZXZpY2VcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5nZXREZXZpY2VTcGVjID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlU3BlYyAoc3BlY0xvY2F0aW9uKSB7XG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgJ2dldC1kZXZpY2Utc3BlYycsXG4gICAgJy0tYWRiJywgdGhpcy5leGVjdXRhYmxlLnBhdGgsXG4gICAgJy0tZGV2aWNlLWlkJywgdGhpcy5jdXJEZXZpY2VJZCxcbiAgICAnLS1vdXRwdXQnLCBzcGVjTG9jYXRpb24sXG4gIF07XG4gIGxvZy5kZWJ1ZyhgR2V0dGluZyB0aGUgc3BlYyBmb3IgdGhlIGRldmljZSAnJHt0aGlzLmN1ckRldmljZUlkfSdgKTtcbiAgYXdhaXQgdGhpcy5leGVjQnVuZGxldG9vbChhcmdzLCAnQ2Fubm90IHJldHJpZXZlIHRoZSBkZXZpY2Ugc3BlYycpO1xuICByZXR1cm4gc3BlY0xvY2F0aW9uO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsTXVsdGlwbGVBcGtzT3B0aW9uc1xuICogQHByb3BlcnR5IHs/bnVtYmVyfHN0cmluZ30gdGltZW91dCBbMjAwMDBdIC0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbFxuICogdGhlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aW1lb3V0Q2FwTmFtZSBbYW5kcm9pZEluc3RhbGxUaW1lb3V0XSAtIFRoZSB0aW1lb3V0IG9wdGlvbiBuYW1lXG4gKiB1c2VycyBjYW4gaW5jcmVhc2UgdGhlIHRpbWVvdXQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93VGVzdFBhY2thZ2VzIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBhbGxvdyB0ZXN0XG4gKiBwYWNrYWdlcyBpbnN0YWxsYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVNkY2FyZCBbZmFsc2VdIC0gU2V0IHRvIHRydWUgdG8gaW5zdGFsbCB0aGUgYXBwIG9uIHNkY2FyZFxuICogaW5zdGVhZCBvZiB0aGUgZGV2aWNlIG1lbW9yeS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ3JhbnRQZXJtaXNzaW9ucyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gZ3JhbnQgYWxsIHRoZVxuICogcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvblxuICogaXMgY29tcGxldGVkIHVuZGVyIEFuZHJvaWQgNisuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHBhcnRpYWxJbnN0YWxsIFtmYWxzZV0gLSBJbnN0YWxsIGFwa3MgcGFydGlhbGx5LiBJdCBpcyB1c2VkIGZvciAnaW5zdGFsbC1tdWx0aXBsZScuXG4gKiBodHRwczovL2FuZHJvaWQuc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzExMTA2NC93aGF0LWlzLWEtcGFydGlhbC1hcHBsaWNhdGlvbi1pbnN0YWxsLXZpYS1hZGJcbiAqL1xuXG4vKipcbiAqIEluc3RhbGxzIHRoZSBnaXZlbiBhcGtzIGludG8gdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBhcGtQYXRoc1RvSW5zdGFsbCAtIFRoZSBmdWxsIHBhdGhzIHRvIGluc3RhbGwgYXBrc1xuICogQHBhcmFtIHs/aW5zdGFsbE11bHRpcGxlQXBrc09wdGlvbnN9IG9wdGlvbnMgLSBJbnN0YWxsYXRpb24gb3B0aW9uc1xuICovXG5hcGtzVXRpbHNNZXRob2RzLmluc3RhbGxNdWx0aXBsZUFwa3MgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsTXVsdGlwbGVBcGtzIChhcGtQYXRoc1RvSW5zdGFsbCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGluc3RhbGxBcmdzID0gYnVpbGRJbnN0YWxsQXJncyhhd2FpdCB0aGlzLmdldEFwaUxldmVsKCksIG9wdGlvbnMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGJFeGVjKFsnaW5zdGFsbC1tdWx0aXBsZScsIC4uLmluc3RhbGxBcmdzLCAuLi5hcGtQYXRoc1RvSW5zdGFsbF0sIHtcbiAgICB0aW1lb3V0OiBvcHRpb25zLnRpbWVvdXQsXG4gICAgdGltZW91dENhcE5hbWU6IG9wdGlvbnMudGltZW91dENhcE5hbWUsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsQXBrc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P251bWJlcnxzdHJpbmd9IHRpbWVvdXQgWzEyMDAwMF0gLSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsXG4gKiB0aGUgaW5zdGFsbGF0aW9uIGlzIGNvbXBsZXRlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpbWVvdXRDYXBOYW1lIFthbmRyb2lkSW5zdGFsbFRpbWVvdXRdIC0gVGhlIHRpbWVvdXQgb3B0aW9uIG5hbWVcbiAqIHVzZXJzIGNhbiBpbmNyZWFzZSB0aGUgdGltZW91dC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYWxsb3dUZXN0UGFja2FnZXMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGFsbG93IHRlc3RcbiAqIHBhY2thZ2VzIGluc3RhbGxhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ3JhbnRQZXJtaXNzaW9ucyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gZ3JhbnQgYWxsIHRoZVxuICogcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvblxuICogaXMgY29tcGxldGVkIHVuZGVyIEFuZHJvaWQgNisuXG4gKi9cblxuLyoqXG4gKiBJbnN0YWxscyB0aGUgZ2l2ZW4gLmFwa3MgcGFja2FnZSBpbnRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGtzIC0gVGhlIGZ1bGwgcGF0aCB0byB0aGUgLmFwa3MgZmlsZVxuICogQHBhcmFtIHs/SW5zdGFsbEFwa3NPcHRpb25zfSBvcHRpb25zIC0gSW5zdGFsbGF0aW9uIG9wdGlvbnNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgLmFwa3MgYnVuZGxlIGNhbm5vdCBiZSBpbnN0YWxsZWRcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5pbnN0YWxsQXBrcyA9IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBcGtzIChhcGtzLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGdyYW50UGVybWlzc2lvbnMsXG4gICAgYWxsb3dUZXN0UGFja2FnZXMsXG4gICAgdGltZW91dCxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgYXJncyA9IFtcbiAgICAnaW5zdGFsbC1hcGtzJyxcbiAgICAnLS1hZGInLCB0aGlzLmV4ZWN1dGFibGUucGF0aCxcbiAgICAnLS1hcGtzJywgYXBrcyxcbiAgICAnLS10aW1lb3V0LW1pbGxpcycsIHRpbWVvdXQgfHwgQVBLU19JTlNUQUxMX1RJTUVPVVQsXG4gICAgJy0tZGV2aWNlLWlkJywgdGhpcy5jdXJEZXZpY2VJZCxcbiAgXTtcbiAgaWYgKGFsbG93VGVzdFBhY2thZ2VzKSB7XG4gICAgYXJncy5wdXNoKCctLWFsbG93LXRlc3Qtb25seScpO1xuICB9XG4gIGNvbnN0IHRhc2tzID0gW1xuICAgIHRoaXMuZXhlY0J1bmRsZXRvb2woYXJncywgYENhbm5vdCBpbnN0YWxsICcke3BhdGguYmFzZW5hbWUoYXBrcyl9JyB0byB0aGUgZGV2aWNlICR7dGhpcy5jdXJEZXZpY2VJZH1gKVxuICBdO1xuICBpZiAoZ3JhbnRQZXJtaXNzaW9ucykge1xuICAgIHRhc2tzLnB1c2godGhpcy5nZXRBcGtJbmZvKGFwa3MpKTtcbiAgfVxuICBjb25zdCBbLCBhcGtJbmZvXSA9IGF3YWl0IEIuYWxsKHRhc2tzKTtcbiAgaWYgKGdyYW50UGVybWlzc2lvbnMgJiYgYXBrSW5mbykge1xuICAgIC8vIFRPRE86IFNpbXBsaWZ5IGl0IGFmdGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvYnVuZGxldG9vbC9pc3N1ZXMvMjQ2IGlzIGltcGxlbWVudGVkXG4gICAgYXdhaXQgdGhpcy5ncmFudEFsbFBlcm1pc3Npb25zKGFwa0luZm8ubmFtZSk7XG4gIH1cbn07XG5cbi8qKlxuICogRXh0cmFjdHMgYW5kIHJldHVybnMgdGhlIGZ1bGwgcGF0aCB0byB0aGUgbWFzdGVyIC5hcGsgZmlsZSBpbnNpZGUgdGhlIGJ1bmRsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBrcyAtIFRoZSBmdWxsIHBhdGggdG8gdGhlIC5hcGtzIGZpbGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmdWxsIHBhdGggdG8gdGhlIG1hc3RlciBidW5kbGUgLmFwa1xuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBleHRyYWN0aW5nL2ZpbmRpbmcgdGhlIGZpbGVcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5leHRyYWN0QmFzZUFwayA9IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RCYXNlQXBrIChhcGtzKSB7XG4gIHJldHVybiBhd2FpdCBleHRyYWN0RnJvbUFwa3MoYXBrcywgWydzcGxpdHMnLCBCQVNFX0FQS10pO1xufTtcblxuLyoqXG4gKiBFeHRyYWN0cyBhbmQgcmV0dXJucyB0aGUgZnVsbCBwYXRoIHRvIHRoZSAuYXBrLCB3aGljaCBjb250YWlucyB0aGUgY29ycmVzcG9uZGluZ1xuICogcmVzb3VyY2VzIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgaW4gdGhlIC5hcGtzIGJ1bmRsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBrcyAtIFRoZSBmdWxsIHBhdGggdG8gdGhlIC5hcGtzIGZpbGVcbiAqIEBwYXJhbSB7P3N0cmluZ30gbGFuZ3VhZ2UgLSBUaGUgbGFuZ3VhZ2UgYWJicmV2aWF0aW9uLiBUaGUgZGVmYXVsdCBsYW5ndWFnZSBpc1xuICogZ29pbmcgdG8gYmUgc2VsZWN0ZWQgaWYgaXQgaXMgbm90IHNldC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmdWxsIHBhdGggdG8gdGhlIGNvcnJlc3BvbmRpbmcgbGFuZ3VhZ2UgLmFwayBvciB0aGUgbWFzdGVyIC5hcGtcbiAqIGlmIGxhbmd1YWdlIHNwbGl0IGlzIG5vdCBlbmFibGVkIGZvciB0aGUgYnVuZGxlLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBleHRyYWN0aW5nL2ZpbmRpbmcgdGhlIGZpbGVcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5leHRyYWN0TGFuZ3VhZ2VBcGsgPSBhc3luYyBmdW5jdGlvbiBleHRyYWN0TGFuZ3VhZ2VBcGsgKGFwa3MsIGxhbmd1YWdlID0gbnVsbCkge1xuICBpZiAobGFuZ3VhZ2UpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGV4dHJhY3RGcm9tQXBrcyhhcGtzLCBbJ3NwbGl0cycsIExBTkdVQUdFX0FQSyhsYW5ndWFnZSldKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZGVidWcoZS5tZXNzYWdlKTtcbiAgICAgIGxvZy5pbmZvKGBBc3N1bWluZyB0aGF0IHNwbGl0dGluZyBieSBsYW5ndWFnZSBpcyBub3QgZW5hYmxlZCBmb3IgdGhlICcke2Fwa3N9JyBidW5kbGUgYCArXG4gICAgICAgIGBhbmQgcmV0dXJuaW5nIHRoZSBtYWluIGFwayBpbnN0ZWFkYCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRyYWN0QmFzZUFwayhhcGtzKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZWZhdWx0TGFuZ3VhZ2VzID0gWydlbicsICdlbl91cyddO1xuICBmb3IgKGNvbnN0IGxhbmcgb2YgZGVmYXVsdExhbmd1YWdlcykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZXh0cmFjdEZyb21BcGtzKGFwa3MsIFsnc3BsaXRzJywgTEFOR1VBR0VfQVBLKGxhbmcpXSk7XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICB9XG5cbiAgbG9nLmluZm8oYENhbm5vdCBmaW5kIGFueSBzcGxpdCBhcGsgZm9yIHRoZSBkZWZhdWx0IGxhbmd1YWdlcyAke0pTT04uc3RyaW5naWZ5KGRlZmF1bHRMYW5ndWFnZXMpfS4gYCArXG4gICAgYFJldHVybmluZyB0aGUgbWFpbiBhcGsgaW5zdGVhZC5gKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0cmFjdEJhc2VBcGsoYXBrcyk7XG59O1xuXG5hcGtzVXRpbHNNZXRob2RzLmlzVGVzdFBhY2thZ2VPbmx5RXJyb3IgPSBmdW5jdGlvbiBpc1Rlc3RQYWNrYWdlT25seUVycm9yIChvdXRwdXQpIHtcbiAgcmV0dXJuIC9cXFtJTlNUQUxMX0ZBSUxFRF9URVNUX09OTFlcXF0vLnRlc3Qob3V0cHV0KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGFwa3NVdGlsc01ldGhvZHM7XG4iXSwiZmlsZSI6ImxpYi90b29scy9hcGtzLXV0aWxzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
@@ -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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9pbmRleC5qcyJdLCJuYW1lcyI6WyJPYmplY3QiLCJhc3NpZ24iLCJtZXRob2RzIiwibWFuaWZlc3RNZXRob2RzIiwic3lzdGVtQ2FsbE1ldGhvZHMiLCJlbXVNZXRob2RzIiwiYXBrU2lnbmluZ01ldGhvZHMiLCJhcGtVdGlsc01ldGhvZHMiLCJhcGtzVXRpbHNNZXRob2RzIiwic2V0dGluZ3NDbGllbnRDb21tYW5kcyIsImxvY2tNYW5hZ2VtZW50Q29tbWFuZHMiLCJrZXlib2FyZENvbW1hbmRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7QUFFQUEsTUFBTSxDQUFDQyxNQUFQLENBQ0lDLG9CQURKLEVBRUlDLHdCQUZKLEVBR0lDLG9CQUhKLEVBSUlDLHVCQUpKLEVBS0lDLG1CQUxKLEVBTUlDLGlCQU5KLEVBT0lDLGtCQVBKLEVBUUlDLCtCQVJKLEVBU0lDLGlCQVRKLEVBVUlDLHlCQVZKO2VBYWVULG9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1ldGhvZHMgZnJvbSAnLi9hZGItY29tbWFuZHMuanMnO1xuaW1wb3J0IG1hbmlmZXN0TWV0aG9kcyBmcm9tICcuL2FuZHJvaWQtbWFuaWZlc3QuanMnO1xuaW1wb3J0IHN5c3RlbUNhbGxNZXRob2RzLCB7IGdldEFuZHJvaWRCaW5hcnlQYXRoIH0gZnJvbSAnLi9zeXN0ZW0tY2FsbHMuanMnO1xuaW1wb3J0IGFwa1NpZ25pbmdNZXRob2RzIGZyb20gJy4vYXBrLXNpZ25pbmcuanMnO1xuaW1wb3J0IGFwa1V0aWxzTWV0aG9kcyBmcm9tICcuL2Fway11dGlscy5qcyc7XG5pbXBvcnQgYXBrc1V0aWxzTWV0aG9kcyBmcm9tICcuL2Fwa3MtdXRpbHMuanMnO1xuaW1wb3J0IGVtdU1ldGhvZHMgZnJvbSAnLi9hZGItZW11LWNvbW1hbmRzLmpzJztcbmltcG9ydCBzZXR0aW5nc0NsaWVudENvbW1hbmRzIGZyb20gJy4vc2V0dGluZ3MtY2xpZW50LWNvbW1hbmRzJztcbmltcG9ydCBsb2NrTWFuYWdlbWVudENvbW1hbmRzIGZyb20gJy4vbG9ja21nbXQnO1xuaW1wb3J0IGtleWJvYXJkQ29tbWFuZHMgZnJvbSAnLi9rZXlib2FyZC1jb21tYW5kcyc7XG5cbk9iamVjdC5hc3NpZ24oXG4gICAgbWV0aG9kcyxcbiAgICBtYW5pZmVzdE1ldGhvZHMsXG4gICAgc3lzdGVtQ2FsbE1ldGhvZHMsXG4gICAgZW11TWV0aG9kcyxcbiAgICBhcGtTaWduaW5nTWV0aG9kcyxcbiAgICBhcGtVdGlsc01ldGhvZHMsXG4gICAgYXBrc1V0aWxzTWV0aG9kcyxcbiAgICBzZXR0aW5nc0NsaWVudENvbW1hbmRzLFxuICAgIGxvY2tNYW5hZ2VtZW50Q29tbWFuZHMsXG4gICAga2V5Ym9hcmRDb21tYW5kcyxcbik7XG5cbmV4cG9ydCBkZWZhdWx0IG1ldGhvZHM7XG5leHBvcnQgeyBnZXRBbmRyb2lkQmluYXJ5UGF0aCB9O1xuIl0sImZpbGUiOiJsaWIvdG9vbHMvaW5kZXguanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
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;
@@ -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
- this.shell(['touch', '-am', remotePath])
464
- .catch(() => {});
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]);
@@ -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.itemCount === 0) {
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
 
@@ -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.0.0",
3
+ "version": "9.1.0",
4
4
  "description": "Android Debug Bridge interface",
5
5
  "main": "./build/index.js",
6
6
  "scripts": {
@@ -51,7 +51,7 @@
51
51
  "bluebird": "^3.4.7",
52
52
  "ini": "^2.0.0",
53
53
  "lodash": "^4.0.0",
54
- "lru-cache": "^6.0.0",
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",
@@ -78,7 +78,7 @@
78
78
  "mocha-junit-reporter": "^2.0.0",
79
79
  "mocha-multi-reporters": "^1.1.7",
80
80
  "pre-commit": "^1.1.3",
81
- "sinon": "^12.0.0",
81
+ "sinon": "^13.0.0",
82
82
  "temp": "^0.x"
83
83
  }
84
84
  }
package/lib/.DS_Store DELETED
Binary file