appium-ios-simulator 3.28.1 → 3.28.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/simulator-xcode-9.js +22 -17
- package/lib/simulator-xcode-9.js +28 -19
- package/package.json +2 -2
|
@@ -29,6 +29,8 @@ var _defaultsUtils = require("./defaults-utils");
|
|
|
29
29
|
|
|
30
30
|
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
31
31
|
|
|
32
|
+
var _events = require("events");
|
|
33
|
+
|
|
32
34
|
const SIMULATOR_SHUTDOWN_TIMEOUT = 15 * 1000;
|
|
33
35
|
const startupLock = new _asyncLock.default();
|
|
34
36
|
const preferencesPlistGuard = new _asyncLock.default();
|
|
@@ -160,25 +162,28 @@ class SimulatorXcode9 extends _simulatorXcode.default {
|
|
|
160
162
|
}
|
|
161
163
|
|
|
162
164
|
async boot() {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
_logger.default.info(`Booting Simulator '${this.udid}'`);
|
|
165
|
+
const bootEventsEmitter = new _events.EventEmitter();
|
|
166
|
+
await this.simctl.startBootMonitor({
|
|
167
|
+
onError: err => bootEventsEmitter.emit('failure', err),
|
|
168
|
+
onFinished: () => bootEventsEmitter.emit('finish'),
|
|
169
|
+
shouldPreboot: true
|
|
170
|
+
});
|
|
170
171
|
|
|
171
172
|
try {
|
|
172
|
-
await
|
|
173
|
-
|
|
174
|
-
|
|
173
|
+
await new _bluebird.default((resolve, reject) => {
|
|
174
|
+
setTimeout(resolve, 3000);
|
|
175
|
+
bootEventsEmitter.once('failure', err => {
|
|
176
|
+
if (_lodash.default.includes(err === null || err === void 0 ? void 0 : err.message, 'state: Booted')) {
|
|
177
|
+
resolve();
|
|
178
|
+
} else {
|
|
179
|
+
reject(err);
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
bootEventsEmitter.once('finish', resolve);
|
|
183
|
+
});
|
|
184
|
+
} finally {
|
|
185
|
+
bootEventsEmitter.removeAllListeners();
|
|
175
186
|
}
|
|
176
|
-
|
|
177
|
-
await (0, _asyncbox.retryInterval)(5, 1000, async () => {
|
|
178
|
-
if (!(await this.isRunning())) {
|
|
179
|
-
throw new Error(`Simulator '${this.udid}' is not running after being booted. ` + `Check the Appium log for more details.`);
|
|
180
|
-
}
|
|
181
|
-
});
|
|
182
187
|
}
|
|
183
188
|
|
|
184
189
|
verifyDevicePreferences(prefs = {}) {
|
|
@@ -451,4 +456,4 @@ var _default = SimulatorXcode9;
|
|
|
451
456
|
exports.default = _default;require('source-map-support').install();
|
|
452
457
|
|
|
453
458
|
|
|
454
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zaW11bGF0b3IteGNvZGUtOS5qcyJdLCJuYW1lcyI6WyJTSU1VTEFUT1JfU0hVVERPV05fVElNRU9VVCIsInN0YXJ0dXBMb2NrIiwiQXN5bmNMb2NrIiwicHJlZmVyZW5jZXNQbGlzdEd1YXJkIiwiRU5ST0xMTUVOVF9OT1RJRklDQVRJT05fUkVDRUlWRVIiLCJTaW11bGF0b3JYY29kZTkiLCJTaW11bGF0b3JYY29kZTgiLCJjb25zdHJ1Y3RvciIsInVkaWQiLCJ4Y29kZVZlcnNpb24iLCJydW4iLCJvcHRzIiwiXyIsImNsb25lRGVlcCIsImRlZmF1bHRzRGVlcCIsImRldmljZVByZWZlcmVuY2VzIiwiaXNIZWFkbGVzcyIsInN0YXJ0dXBUaW1lb3V0Iiwic2NhbGVGYWN0b3IiLCJTaW11bGF0b3JXaW5kb3dMYXN0U2NhbGUiLCJwYXJzZUZsb2F0IiwiY29tbW9uUHJlZmVyZW5jZXMiLCJSb3RhdGVXaW5kb3dXaGVuU2lnbmFsZWRCeUd1ZXN0IiwiaXNCb29sZWFuIiwiY29ubmVjdEhhcmR3YXJlS2V5Ym9hcmQiLCJpc05pbCIsIkNvbm5lY3RIYXJkd2FyZUtleWJvYXJkIiwidHJhY2VQb2ludGVyIiwiU2hvd1NpbmdsZVRvdWNoZXMiLCJTaG93UGluY2hlcyIsIlNob3dQaW5jaFBpdm90UG9pbnQiLCJIaWdobGlnaHRFZGdlR2VzdHVyZXMiLCJsb3dlckNhc2UiLCJwYXN0ZWJvYXJkQXV0b21hdGljU3luYyIsIlBhc3RlYm9hcmRBdXRvbWF0aWNTeW5jIiwibG9nIiwiaW5mbyIsInVwZGF0ZVByZWZlcmVuY2VzIiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsInN0YXJ0Iiwic2hvdWxkV2FpdEZvckJvb3QiLCJhY3F1aXJlIiwidWlDbGllbnRCdW5kbGVJZCIsImlzU2VydmVyUnVubmluZyIsImlzUnVubmluZyIsInVpQ2xpZW50UGlkIiwiZ2V0VUlDbGllbnRQaWQiLCJraWxsVUlDbGllbnQiLCJwaWQiLCJpc1NodXRkb3duIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImUiLCJFcnJvciIsImJvb3QiLCJzaHV0ZG93biIsInRpbWVvdXQiLCJsYXVuY2hXaW5kb3ciLCJ3YWl0Rm9yQm9vdCIsImdldER1cmF0aW9uIiwiYXNTZWNvbmRzIiwidG9GaXhlZCIsImlzVWlDbGllbnRSdW5uaW5nIiwic3RhcnRVSUNsaWVudCIsInNpbWN0bCIsImJvb3REZXZpY2UiLCJ3YXJuIiwic3RkZXJyIiwibWVzc2FnZSIsInZlcmlmeURldmljZVByZWZlcmVuY2VzIiwicHJlZnMiLCJpc0VtcHR5IiwiaXNVbmRlZmluZWQiLCJpc051bWJlciIsImVycm9yQW5kVGhyb3ciLCJTaW11bGF0b3JXaW5kb3dDZW50ZXIiLCJ2ZXJpZmljYXRpb25QYXR0ZXJuIiwiaXNTdHJpbmciLCJ0ZXN0IiwiU2ltdWxhdG9yV2luZG93T3JpZW50YXRpb24iLCJhY2NlcHRhYmxlVmFsdWVzIiwiaW5kZXhPZiIsIlNpbXVsYXRvcldpbmRvd1JvdGF0aW9uQW5nbGUiLCJkZXZpY2VQcmVmcyIsImNvbW1vblByZWZzIiwiZGVidWciLCJKU09OIiwic3RyaW5naWZ5IiwiaG9tZUZvbGRlclBhdGgiLCJwcm9jZXNzIiwiZW52IiwiSE9NRSIsInBsaXN0UGF0aCIsInBhdGgiLCJyZXNvbHZlIiwibmFtZSIsImRlZmF1bHRzIiwiTlNVc2VyRGVmYXVsdHMiLCJwcmVmc1RvVXBkYXRlIiwiY2xvbmUiLCJleGlzdGluZ0RldmljZVByZWZzIiwidWRpZEtleSIsInRvVXBwZXJDYXNlIiwiZnMiLCJleGlzdHMiLCJjdXJyZW50UGxpc3RDb250ZW50IiwiYXNKc29uIiwiaXNQbGFpbk9iamVjdCIsIkRldmljZVByZWZlcmVuY2VzIiwiT2JqZWN0IiwiYXNzaWduIiwidXBkYXRlIiwiY2xlYW4iLCJlcmFzZURldmljZSIsIl9hY3RpdmF0ZVdpbmRvdyIsInNlbGZOYW1lIiwic2VsZlNkayIsImJvb3RlZERldmljZXNDb3VudCIsInNkayIsImRldmljZUFyciIsInRvUGFpcnMiLCJnZXREZXZpY2VzIiwic3RhdGUiLCJpc0Jpb21ldHJpY0Vucm9sbGVkIiwic3Rkb3V0Iiwic3Bhd25Qcm9jZXNzIiwibWF0Y2giLCJSZWdFeHAiLCJlc2NhcGVSZWdFeHAiLCJleGVjIiwiZW5yb2xsQmlvbWV0cmljIiwiaXNFbmFibGVkIiwic2VuZEJpb21ldHJpY01hdGNoIiwic2hvdWxkTWF0Y2giLCJiaW9tZXRyaWNOYW1lIiwiZG9tYWluQ29tcG9uZW50IiwiZG9tYWluIiwiZ2V0TGF1bmNoRGFlbW9uc1Jvb3QiLCJkZXZSb290IiwiY29uZmlndXJlTG9jYWxpemF0aW9uIiwibGFuZ3VhZ2UiLCJsb2NhbGUiLCJrZXlib2FyZCIsImdsb2JhbFByZWZzIiwia2V5Ym9hcmRJZCIsImxheW91dCIsImhhcmR3YXJlIiwiQXBwbGVLZXlib2FyZHMiLCJBcHBsZUxhbmd1YWdlcyIsImNhbGVuZGFyIiwibG9jYWxlSWQiLCJBcHBsZUxvY2FsZSIsImFyZ0NodW5rcyIsIkIiLCJhbGwiLCJtYXAiLCJhcmdzIiwiS2V5Ym9hcmRzQ3VycmVudEFuZE5leHQiLCJLZXlib2FyZExhc3RVc2VkIiwiS2V5Ym9hcmRMYXN0VXNlZEZvckxhbmd1YWdlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLDBCQUEwQixHQUFHLEtBQUssSUFBeEM7QUFDQSxNQUFNQyxXQUFXLEdBQUcsSUFBSUMsa0JBQUosRUFBcEI7QUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxJQUFJRCxrQkFBSixFQUE5QjtBQUNBLE1BQU1FLGdDQUFnQyxHQUFHLDBDQUF6Qzs7QUFFQSxNQUFNQyxlQUFOLFNBQThCQyx1QkFBOUIsQ0FBOEM7QUFDNUNDLEVBQUFBLFdBQVcsQ0FBRUMsSUFBRixFQUFRQyxZQUFSLEVBQXNCO0FBQy9CLFVBQU1ELElBQU4sRUFBWUMsWUFBWjtBQUNEOztBQXNERCxRQUFNQyxHQUFOLENBQVdDLElBQUksR0FBRyxFQUFsQixF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TyxLQUFQO0FBQ0Q7O0FBRUQsVUFBTVMsU0FBUyxHQUFHLGdEQUE0QlQsV0FBNUIsRUFBeUMsSUFBekMsQ0FBbEI7QUFDQSxVQUFNVSxrQkFBRUMsR0FBRixDQUFNRixTQUFTLENBQUNHLEdBQVYsQ0FBZUMsSUFBRCxJQUFVLEtBQUs1RixNQUFMLENBQVk2RCxZQUFaLENBQXlCLENBQzNELFVBRDJELEVBQy9DLE9BRCtDLEVBQ3RDLDBCQURzQyxFQUNWLEdBQUcrQixJQURPLENBQXpCLENBQXhCLENBQU4sQ0FBTjs7QUFJQSxRQUFJWixVQUFKLEVBQWdCO0FBQ2QsWUFBTVEsU0FBUyxHQUFHLGdEQUE0QjtBQUM1Q0ssUUFBQUEsdUJBQXVCLEVBQUUsQ0FBQ2IsVUFBRCxDQURtQjtBQUU1Q2MsUUFBQUEsZ0JBQWdCLEVBQUVkLFVBRjBCO0FBRzVDZSxRQUFBQSwyQkFBMkIsRUFBRTtBQUFFLFdBQUNqQixRQUFRLENBQUMvQyxJQUFWLEdBQWlCaUQ7QUFBbkI7QUFIZSxPQUE1QixFQUlmLElBSmUsQ0FBbEI7QUFLQSxZQUFNUyxrQkFBRUMsR0FBRixDQUFNRixTQUFTLENBQUNHLEdBQVYsQ0FBZUMsSUFBRCxJQUFVLEtBQUs1RixNQUFMLENBQVk2RCxZQUFaLENBQXlCLENBQzNELFVBRDJELEVBQy9DLE9BRCtDLEVBQ3RDLHVCQURzQyxFQUNiLEdBQUcrQixJQURVLENBQXpCLENBQXhCLENBQU4sQ0FBTjtBQUdEOztBQUVELFdBQU8sSUFBUDtBQUNEOztBQTllMkM7O2VBa2YvQnpKLGUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU2ltdWxhdG9yWGNvZGU4IGZyb20gJy4vc2ltdWxhdG9yLXhjb2RlLTgnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZnMsIHRpbWluZyB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCBBc3luY0xvY2sgZnJvbSAnYXN5bmMtbG9jayc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24sIHJldHJ5SW50ZXJ2YWwgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyB0b0Jpb21ldHJpY0RvbWFpbkNvbXBvbmVudCwgZ2V0RGV2ZWxvcGVyUm9vdCB9IGZyb20gJy4vdXRpbHMuanMnO1xuaW1wb3J0IHsgTlNVc2VyRGVmYXVsdHMsIGdlbmVyYXRlRGVmYXVsdHNDb21tYW5kQXJncyB9IGZyb20gJy4vZGVmYXVsdHMtdXRpbHMnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5jb25zdCBTSU1VTEFUT1JfU0hVVERPV05fVElNRU9VVCA9IDE1ICogMTAwMDtcbmNvbnN0IHN0YXJ0dXBMb2NrID0gbmV3IEFzeW5jTG9jaygpO1xuY29uc3QgcHJlZmVyZW5jZXNQbGlzdEd1YXJkID0gbmV3IEFzeW5jTG9jaygpO1xuY29uc3QgRU5ST0xMTUVOVF9OT1RJRklDQVRJT05fUkVDRUlWRVIgPSAnY29tLmFwcGxlLkJpb21ldHJpY0tpdC5lbnJvbGxtZW50Q2hhbmdlZCc7XG5cbmNsYXNzIFNpbXVsYXRvclhjb2RlOSBleHRlbmRzIFNpbXVsYXRvclhjb2RlOCB7XG4gIGNvbnN0cnVjdG9yICh1ZGlkLCB4Y29kZVZlcnNpb24pIHtcbiAgICBzdXBlcih1ZGlkLCB4Y29kZVZlcnNpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IERldmljZVByZWZlcmVuY2VzXG4gICAqIEBwcm9wZXJ0eSB7P251bWJlcn0gU2ltdWxhdG9yRXh0ZXJuYWxEaXNwbGF5IC0gVEJELiBFeGFtcGxlIHZhbHVlOiAyLjExNFxuICAgKiBAcHJvcGVydHkgez9zdHJpbmd9IENocm9tZVRpbnQgLSBUQkQuIEV4YW1wbGUgdmFsdWU6ICcnXG4gICAqIEBwcm9wZXJ0eSB7P251bWJlcn0gU2ltdWxhdG9yV2luZG93TGFzdFNjYWxlIC0gU2NhbGUgdmFsdWUgZm9yIHRoZSBwYXJ0aWN1bGFyIFNpbXVsYXRvciB3aW5kb3cuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wIG1lYW5zIDEwMCUgc2NhbGUuXG4gICAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gU2ltdWxhdG9yV2luZG93T3JpZW50YXRpb24gLSBTaW11bGF0b3Igd2luZG93IG9yaWVudGF0aW9uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BvcnRyYWl0JywgJ0xhbmRzY2FwZUxlZnQnLCAnUG9ydHJhaXRVcHNpZGVEb3duJyBhbmQgJ0xhbmRzY2FwZVJpZ2h0Jy5cbiAgICogQHByb3BlcnR5IHs/bnVtYmVyfSBTaW11bGF0b3JXaW5kb3dSb3RhdGlvbkFuZ2xlIC0gV2luZG93IHJvdGF0aW9uIGFuZ2xlLiBUaGlzIHZhbHVlIGlzIGV4cGVjdGVkIHRvIGJlIGluIHN5bmNcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBfU2ltdWxhdG9yV2luZG93T3JpZW50YXRpb25fLiBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgYXJlOlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCA5MCwgMTgwIGFuZCAyNzAuXG4gICAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gU2ltdWxhdG9yV2luZG93Q2VudGVyIC0gVGhlIGNvb3JkaW5hdGVzIG9mIFNpbXVsYXRvcidzIHdpbmRvdyBjZW50ZXIgaW4gcGl4ZWxzLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBleGFtcGxlICd7LTEyOTQuNSwgNzc1LjV9Jy5cbiAgICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gQ29ubmVjdEhhcmR3YXJlS2V5Ym9hcmQgLSBFcXVhbHMgdG8gMSBpZiBoYXJkd2FyZSBrZXlib2FyZCBzaG91bGQgYmUgY29ubmVjdGVkLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSAwLlxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gQ29tbW9uUHJlZmVyZW5jZXNcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBDb25uZWN0SGFyZHdhcmVLZXlib2FyZCAtIFdoZXRoZXIgdG8gY29ubmVjdCBoYXJkd2FyZSBrZXlib2FyZFxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gUnVuT3B0aW9uc1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gc2NhbGVGYWN0b3I6IEFueSBwb3NpdGl2ZSBmbG9hdCB2YWx1ZS4gMS4wIG1lYW5zIDE6MSBzY2FsZS5cbiAgICogRGVmaW5lcyB0aGUgd2luZG93IHNjYWxlIHZhbHVlIGZvciB0aGUgVUkgY2xpZW50IHdpbmRvdyBmb3IgdGhlIGN1cnJlbnQgU2ltdWxhdG9yLlxuICAgKiBFcXVhbHMgdG8gYG51bGxgIGJ5IGRlZmF1bHQsIHdoaWNoIGtlZXBzIHRoZSBjdXJyZW50IHNjYWxlIHVuY2hhbmdlZC5cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBjb25uZWN0SGFyZHdhcmVLZXlib2FyZDogd2hldGhlciB0byBjb25uZWN0IHRoZSBoYXJkd2FyZSBrZXlib2FyZCB0byB0aGVcbiAgICogU2ltdWxhdG9yIFVJIGNsaWVudC4gRXF1YWxzIHRvIGBmYWxzZWAgYnkgZGVmYXVsdC5cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHN0YXJ0dXBUaW1lb3V0OiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgU2ltdWxhdG9yIGJvb3RpbmdcbiAgICogcHJvY2VzcyBpcyBjb21wbGV0ZWQuIFRoZSBkZWZhdWx0IHRpbWVvdXQgd2lsbCBiZSB1c2VkIGlmIG5vdCBzZXQgZXhwbGljaXRseS5cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBpc0hlYWRsZXNzOiB3aGV0aGVyIHRvIHN0YXJ0IHRoZSBTaW11bGF0b3IgaW4gaGVhZGxlc3MgbW9kZSAod2l0aCBVSVxuICAgKiBjbGllbnQgaW52aXNpYmxlKS4gYGZhbHNlYCBieSBkZWZhdWx0LlxuICAgKiBAcHJvcGVydHkgez9ib29sZWFufSB0cmFjZVBvaW50ZXIgW2ZhbHNlXSAtIFdoZXRoZXIgdG8gaGlnaGxpZ2h0IHRvdWNoZXMgb24gU2ltdWxhdG9yXG4gICAqIHNjcmVlbi4gVGhpcyBpcyBoZWxwZnVsIHdoaWxlIGRlYnVnZ2luZyBhdXRvbWF0ZWQgdGVzdHMgb3Igd2hpbGUgb2JzZXJ2aW5nIHRoZSBhdXRvbWF0aW9uXG4gICAqIHJlY29yZGluZ3MuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXN0ZWJvYXJkQXV0b21hdGljU3luYyBbJ29mZiddIC0gV2hldGhlciB0byBkaXNhYmxlIHBhc3RlYm9hcmQgc3luYyB3aXRoIHRoZVxuICAgKiBTaW11bGF0b3IgVUkgY2xpZW50IG9yIHJlc3BlY3QgdGhlIHN5c3RlbSB3aWRlIHByZWZlcmVuY2UuICdvbicsICdvZmYnLCBvciAnc3lzdGVtJyBpcyBhdmFpbGFibGUuXG4gICAqIFRoZSBzeW5jIGluY3JlYXNlcyBsYXVuY2hpbmcgc2ltdWxhdG9yIHByb2Nlc3MgdGltZSwgYnV0IGl0IGFsbG93cyBzeXN0ZW0gdG8gc3luYyBwYXN0ZWJvYXJkXG4gICAqIHdpdGggc2ltdWxhdG9ycy4gRm9sbG93cyBzeXN0ZW0td2lkZSBwcmVmZXJlbmNlIGlmIHRoZSB2YWx1ZSBpcyAnc3lzdGVtJy5cbiAgICogRGVmYXVsdHMgdG8gJ29mZicuXG4gICAqIEBwcm9wZXJ0eSB7RGV2aWNlUHJlZmVyZW5jZXN9IGRldmljZVByZWZlcmVuY2VzOiBwcmVmZXJlbmNlcyBvZiB0aGUgbmV3bHkgY3JlYXRlZCBTaW11bGF0b3JcbiAgICogZGV2aWNlXG4gICAqL1xuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBnaXZlbiBTaW11bGF0b3Igd2l0aCBvcHRpb25zLiBUaGUgU2ltdWxhdG9yIHdpbGwgbm90IGJlIHJlc3RhcnRlZCBpZlxuICAgKiBpdCBpcyBhbHJlYWR5IHJ1bm5pbmcgYW5kIHRoZSBjdXJyZW50IFVJIHN0YXRlIG1hdGNoZXMgdG8gYGlzSGVhZGxlc3NgIG9wdGlvbi5cbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBwYXJhbSB7UnVuT3B0aW9uc30gb3B0cyAtIE9uZSBvciBtb3JlIG9mIGF2YWlsYWJsZSBTaW11bGF0b3Igb3B0aW9uc1xuICAgKi9cbiAgYXN5bmMgcnVuIChvcHRzID0ge30pIHtcbiAgICBvcHRzID0gXy5jbG9uZURlZXAob3B0cyk7XG4gICAgXy5kZWZhdWx0c0RlZXAob3B0cywge1xuICAgICAgZGV2aWNlUHJlZmVyZW5jZXM6IHt9LFxuICAgICAgaXNIZWFkbGVzczogZmFsc2UsXG4gICAgICBzdGFydHVwVGltZW91dDogdGhpcy5zdGFydHVwVGltZW91dCxcbiAgICB9KTtcblxuICAgIGlmIChvcHRzLnNjYWxlRmFjdG9yKSB7XG4gICAgICBvcHRzLmRldmljZVByZWZlcmVuY2VzLlNpbXVsYXRvcldpbmRvd0xhc3RTY2FsZSA9IHBhcnNlRmxvYXQob3B0cy5zY2FsZUZhY3Rvcik7XG4gICAgfVxuICAgIC8vIFRoaXMgb3B0aW9uIGlzIG5lY2Vzc2FyeSB0byBtYWtlIHRoZSBTaW11bGF0b3Igd2luZG93IGZvbGxvd1xuICAgIC8vIHRoZSBhY3R1YWwgWENVSURldmljZSBvcmllbnRhdGlvblxuICAgIGNvbnN0IGNvbW1vblByZWZlcmVuY2VzID0ge1xuICAgICAgUm90YXRlV2luZG93V2hlblNpZ25hbGVkQnlHdWVzdDogdHJ1ZVxuICAgIH07XG4gICAgaWYgKF8uaXNCb29sZWFuKG9wdHMuY29ubmVjdEhhcmR3YXJlS2V5Ym9hcmQpIHx8IF8uaXNOaWwob3B0cy5jb25uZWN0SGFyZHdhcmVLZXlib2FyZCkpIHtcbiAgICAgIG9wdHMuZGV2aWNlUHJlZmVyZW5jZXMuQ29ubmVjdEhhcmR3YXJlS2V5Ym9hcmQgPSBvcHRzLmNvbm5lY3RIYXJkd2FyZUtleWJvYXJkID8/IGZhbHNlO1xuICAgICAgY29tbW9uUHJlZmVyZW5jZXMuQ29ubmVjdEhhcmR3YXJlS2V5Ym9hcmQgPSBvcHRzLmNvbm5lY3RIYXJkd2FyZUtleWJvYXJkID8/IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXy5pc0Jvb2xlYW4ob3B0cy50cmFjZVBvaW50ZXIpKSB7XG4gICAgICBjb21tb25QcmVmZXJlbmNlcy5TaG93U2luZ2xlVG91Y2hlcyA9IG9wdHMudHJhY2VQb2ludGVyO1xuICAgICAgY29tbW9uUHJlZmVyZW5jZXMuU2hvd1BpbmNoZXMgPSBvcHRzLnRyYWNlUG9pbnRlcjtcbiAgICAgIGNvbW1vblByZWZlcmVuY2VzLlNob3dQaW5jaFBpdm90UG9pbnQgPSBvcHRzLnRyYWNlUG9pbnRlcjtcbiAgICAgIGNvbW1vblByZWZlcmVuY2VzLkhpZ2hsaWdodEVkZ2VHZXN0dXJlcyA9IG9wdHMudHJhY2VQb2ludGVyO1xuICAgIH1cbiAgICBzd2l0Y2ggKF8ubG93ZXJDYXNlKG9wdHMucGFzdGVib2FyZEF1dG9tYXRpY1N5bmMpKSB7XG4gICAgICBjYXNlICdvbic6XG4gICAgICAgIGNvbW1vblByZWZlcmVuY2VzLlBhc3RlYm9hcmRBdXRvbWF0aWNTeW5jID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdvZmYnOlxuICAgICAgICAvLyBJbXByb3ZlIGxhdW5jaGluZyBzaW11bGF0b3IgcGVyZm9ybWFuY2VcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL1dlYktpdC93ZWJraXQvYmxvYi9tYXN0ZXIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS94Y29kZS9zaW11bGF0ZWRfZGV2aWNlLnB5I0w0MTNcbiAgICAgICAgY29tbW9uUHJlZmVyZW5jZXMuUGFzdGVib2FyZEF1dG9tYXRpY1N5bmMgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzeXN0ZW0nOlxuICAgICAgICAvLyBEbyBub3QgYWRkIC1QYXN0ZWJvYXJkQXV0b21hdGljU3luY1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGxvZy5pbmZvKGBbJ29uJywgJ29mZicgb3IgJ3N5c3RlbSddIGFyZSBhdmFpbGFibGUgYXMgdGhlIHBhc3RlYm9hcmQgYXV0b21hdGljIHN5bmMgb3B0aW9uLiBEZWZhdWx0aW5nIHRvICdvZmYnYCk7XG4gICAgICAgIGNvbW1vblByZWZlcmVuY2VzLlBhc3RlYm9hcmRBdXRvbWF0aWNTeW5jID0gZmFsc2U7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMudXBkYXRlUHJlZmVyZW5jZXMob3B0cy5kZXZpY2VQcmVmZXJlbmNlcywgY29tbW9uUHJlZmVyZW5jZXMpO1xuXG4gICAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcbiAgICBjb25zdCBzaG91bGRXYWl0Rm9yQm9vdCA9IGF3YWl0IHN0YXJ0dXBMb2NrLmFjcXVpcmUodGhpcy51aUNsaWVudEJ1bmRsZUlkLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBpc1NlcnZlclJ1bm5pbmcgPSBhd2FpdCB0aGlzLmlzUnVubmluZygpO1xuICAgICAgY29uc3QgdWlDbGllbnRQaWQgPSBhd2FpdCB0aGlzLmdldFVJQ2xpZW50UGlkKCk7XG4gICAgICBpZiAob3B0cy5pc0hlYWRsZXNzKSB7XG4gICAgICAgIGlmIChpc1NlcnZlclJ1bm5pbmcgJiYgIXVpQ2xpZW50UGlkKSB7XG4gICAgICAgICAgbG9nLmluZm8oYFNpbXVsYXRvciB3aXRoIFVESUQgJyR7dGhpcy51ZGlkfScgaXMgYWxyZWFkeSBib290ZWQgaW4gaGVhZGxlc3MgbW9kZS5gKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF3YWl0IHRoaXMua2lsbFVJQ2xpZW50KHtwaWQ6IHVpQ2xpZW50UGlkfSkpIHtcbiAgICAgICAgICBsb2cuaW5mbyhgRGV0ZWN0ZWQgdGhlIFNpbXVsYXRvciBVSSBjbGllbnQgd2FzIHJ1bm5pbmcgYW5kIGtpbGxlZCBpdC4gVmVyaWZ5aW5nIHRoZSBjdXJyZW50IFNpbXVsYXRvciBzdGF0ZWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gU3RvcHBpbmcgdGhlIFVJIGNsaWVudCBraWxscyBhbGwgcnVubmluZyBzZXJ2ZXJzIGZvciBzb21lIGVhcmx5IFhDb2RlIHZlcnNpb25zLiBUaGlzIGlzIGEga25vd24gYnVnXG4gICAgICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmlzU2h1dGRvd24oKSwge1xuICAgICAgICAgICAgd2FpdE1zOiA1MDAwLFxuICAgICAgICAgICAgaW50ZXJ2YWxNczogMTAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKCFhd2FpdCB0aGlzLmlzUnVubmluZygpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNpbXVsYXRvciB3aXRoIFVESUQgJyR7dGhpcy51ZGlkfScgY2Fubm90IGJlIHRyYW5zaXRpb25lZCB0byBoZWFkbGVzcyBtb2RlYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsb2cuaW5mbyhgQm9vdGluZyBTaW11bGF0b3Igd2l0aCBVRElEICcke3RoaXMudWRpZH0nIGluIGhlYWRsZXNzIG1vZGUuIGAgK1xuICAgICAgICAgIGBBbGwgVUktcmVsYXRlZCBjYXBhYmlsaXRpZXMgYXJlIGdvaW5nIHRvIGJlIGlnbm9yZWRgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5ib290KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNTZXJ2ZXJSdW5uaW5nICYmIHVpQ2xpZW50UGlkKSB7XG4gICAgICAgICAgbG9nLmluZm8oYEJvdGggU2ltdWxhdG9yIHdpdGggVURJRCAnJHt0aGlzLnVkaWR9JyBhbmQgdGhlIFVJIGNsaWVudCBhcmUgY3VycmVudGx5IHJ1bm5pbmdgKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzU2VydmVyUnVubmluZykge1xuICAgICAgICAgIGxvZy5pbmZvKGBTaW11bGF0b3IgJyR7dGhpcy51ZGlkfScgaXMgYm9vdGVkIHdoaWxlIGl0cyBVSSBpcyBub3QgdmlzaWJsZS4gYCArXG4gICAgICAgICAgICBgVHJ5aW5nIHRvIHJlc3RhcnQgaXQgd2l0aCB0aGUgU2ltdWxhdG9yIHdpbmRvdyB2aXNpYmxlYCk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zaHV0ZG93bih7dGltZW91dDogU0lNVUxBVE9SX1NIVVRET1dOX1RJTUVPVVR9KTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmxhdW5jaFdpbmRvdyh1aUNsaWVudFBpZCwgb3B0cyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcblxuICAgIGlmIChzaG91bGRXYWl0Rm9yQm9vdCkge1xuICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yQm9vdChvcHRzLnN0YXJ0dXBUaW1lb3V0KTtcbiAgICAgIGxvZy5pbmZvKGBTaW11bGF0b3Igd2l0aCBVRElEICR7dGhpcy51ZGlkfSBib290ZWQgaW4gJHt0aW1lci5nZXREdXJhdGlvbigpLmFzU2Vjb25kcy50b0ZpeGVkKDMpfXNgKTtcbiAgICB9XG4gIH1cblxuICAvKioqXG4gICAqIEJvb3RzIHNpbXVsYXRvciBhbmQgb3BlbnMgc2ltdWxhdG9ycyBVSSBDbGllbnQgaWYgbm90IGFscmVhZHkgb3BlbmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzVWlDbGllbnRSdW5uaW5nIC0gcHJvY2VzcyBpZCBvZiBzaW11bGF0b3IgVUkgY2xpZW50LlxuICAgKiBAcGFyYW0ge1J1bk9wdGlvbnN9IG9wdHMgLSBhcmd1bWVudHMgdG8gc3RhcnQgc2ltdWxhdG9yIFVJIGNsaWVudCB3aXRoLlxuICAgKi9cbiAgYXN5bmMgbGF1bmNoV2luZG93IChpc1VpQ2xpZW50UnVubmluZywgb3B0cyA9IHt9KSB7XG4gICAgYXdhaXQgdGhpcy5ib290KCk7XG4gICAgaWYgKCFpc1VpQ2xpZW50UnVubmluZykge1xuICAgICAgYXdhaXQgdGhpcy5zdGFydFVJQ2xpZW50KG9wdHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCb290cyBzaW11bGF0b3IgaWYgbm90IGFscmVhZHkgYm9vdGVkLlxuICAgKiBEb2VzIG5vdGhpbmcgaWYgaXQgaXMgYWxyZWFkeSBydW5uaW5nLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgU2ltdWxhdG9yIGlzIHN0aWxsIG5vdCBydW5uaW5nIGFmdGVyIGJlaW5nIGJvb3RlZFxuICAgKi9cbiAgYXN5bmMgYm9vdCAoKSB7XG4gICAgaWYgKGF3YWl0IHRoaXMuaXNSdW5uaW5nKCkpIHtcbiAgICAgIGxvZy5pbmZvKGBTaW11bGF0b3IgJyR7dGhpcy51ZGlkfScgaXMgYWxyZWFkeSBydW5uaW5nYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nLmluZm8oYEJvb3RpbmcgU2ltdWxhdG9yICcke3RoaXMudWRpZH0nYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2ltY3RsLmJvb3REZXZpY2UoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cud2FybihlLnN0ZGVyciB8fCBlLm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGF3YWl0IHJldHJ5SW50ZXJ2YWwoNSwgMTAwMCwgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFhd2FpdCB0aGlzLmlzUnVubmluZygpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2ltdWxhdG9yICcke3RoaXMudWRpZH0nIGlzIG5vdCBydW5uaW5nIGFmdGVyIGJlaW5nIGJvb3RlZC4gYCArXG4gICAgICAgICAgYENoZWNrIHRoZSBBcHBpdW0gbG9nIGZvciBtb3JlIGRldGFpbHMuYCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSB2ZXJpZmljYXRpb24gb2YgZGV2aWNlIHByZWZlcmVuY2VzIGNvcnJlY3RuZXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge0RldmljZVByZWZlcmVuY2VzfSBwcmVmcyBbe31dIC0gVGhlIHByZWZlcmVuY2VzIHRvIGJlIHZlcmlmaWVkXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBhbnkgb2YgdGhlIGdpdmVuIHByZWZlcmVuY2UgdmFsdWVzIGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZFxuICAgKiBmb3JtYXQuXG4gICAqL1xuICB2ZXJpZnlEZXZpY2VQcmVmZXJlbmNlcyAocHJlZnMgPSB7fSkge1xuICAgIGlmIChfLmlzRW1wdHkocHJlZnMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHByZWZzLlNpbXVsYXRvcldpbmRvd0xhc3RTY2FsZSkpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwcmVmcy5TaW11bGF0b3JXaW5kb3dMYXN0U2NhbGUpIHx8IHByZWZzLlNpbXVsYXRvcldpbmRvd0xhc3RTY2FsZSA8PSAwKSB7XG4gICAgICAgIGxvZy5lcnJvckFuZFRocm93KGBTaW11bGF0b3JXaW5kb3dMYXN0U2NhbGUgaXMgZXhwZWN0ZWQgdG8gYmUgYSBwb3NpdGl2ZSBmbG9hdCB2YWx1ZS4gYCArXG4gICAgICAgICAgYCcke3ByZWZzLlNpbXVsYXRvcldpbmRvd0xhc3RTY2FsZX0nIGlzIGFzc2lnbmVkIGluc3RlYWQuYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHByZWZzLlNpbXVsYXRvcldpbmRvd0NlbnRlcikpIHtcbiAgICAgIC8vIGh0dHBzOi8vcmVnZXgxMDEuY29tL3IvMlpYT2lqLzJcbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvblBhdHRlcm4gPSAvey0/XFxkKyhcXC5cXGQrKT8sLT9cXGQrKFxcLlxcZCspP30vO1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHByZWZzLlNpbXVsYXRvcldpbmRvd0NlbnRlcikgfHwgIXZlcmlmaWNhdGlvblBhdHRlcm4udGVzdChwcmVmcy5TaW11bGF0b3JXaW5kb3dDZW50ZXIpKSB7XG4gICAgICAgIGxvZy5lcnJvckFuZFRocm93KGBTaW11bGF0b3JXaW5kb3dDZW50ZXIgaXMgZXhwZWN0ZWQgdG8gbWF0Y2ggXCJ7ZmxvYXRYUG9zaXRpb24sZmxvYXRZUG9zaXRpb259XCIgZm9ybWF0ICh3aXRob3V0IHNwYWNlcykuIGAgK1xuICAgICAgICAgIGAnJHtwcmVmcy5TaW11bGF0b3JXaW5kb3dDZW50ZXJ9JyBpcyBhc3NpZ25lZCBpbnN0ZWFkLmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwcmVmcy5TaW11bGF0b3JXaW5kb3dPcmllbnRhdGlvbikpIHtcbiAgICAgIGNvbnN0IGFjY2VwdGFibGVWYWx1ZXMgPSBbJ1BvcnRyYWl0JywgJ0xhbmRzY2FwZUxlZnQnLCAnUG9ydHJhaXRVcHNpZGVEb3duJywgJ0xhbmRzY2FwZVJpZ2h0J107XG4gICAgICBpZiAoYWNjZXB0YWJsZVZhbHVlcy5pbmRleE9mKHByZWZzLlNpbXVsYXRvcldpbmRvd09yaWVudGF0aW9uKSA9PT0gLTEpIHtcbiAgICAgICAgbG9nLmVycm9yQW5kVGhyb3coYFNpbXVsYXRvcldpbmRvd09yaWVudGF0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIG9uZSBvZiAke2FjY2VwdGFibGVWYWx1ZXN9LiBgICtcbiAgICAgICAgICBgJyR7cHJlZnMuU2ltdWxhdG9yV2luZG93T3JpZW50YXRpb259JyBpcyBhc3NpZ25lZCBpbnN0ZWFkLmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwcmVmcy5TaW11bGF0b3JXaW5kb3dSb3RhdGlvbkFuZ2xlKSkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHByZWZzLlNpbXVsYXRvcldpbmRvd1JvdGF0aW9uQW5nbGUpKSB7XG4gICAgICAgIGxvZy5lcnJvckFuZFRocm93KGBTaW11bGF0b3JXaW5kb3dSb3RhdGlvbkFuZ2xlIGlzIGV4cGVjdGVkIHRvIGJlIGEgdmFsaWQgbnVtYmVyLiBgICtcbiAgICAgICAgICBgJyR7cHJlZnMuU2ltdWxhdG9yV2luZG93Um90YXRpb25BbmdsZX0nIGlzIGFzc2lnbmVkIGluc3RlYWQuYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgY29tbW9uIGlPUyBTaW11bGF0b3IgcHJlZmVyZW5jZXMgZmlsZSB3aXRoIG5ldyB2YWx1ZXMuXG4gICAqIEl0IGlzIG5lY2Vzc2FyeSB0byByZXN0YXJ0IHRoZSBjb3JyZXNwb25kaW5nIFNpbXVsYXRvciBiZWZvcmVcbiAgICogdGhlc2UgY2hhbmdlcyBhcmUgYXBwbGllZC5cbiAgICpcbiAgICogQHBhcmFtIHtEZXZpY2VQcmVmZXJlbmNlc30gZGV2aWNlUHJlZnMgW3t9XSAtIFRoZSBtYXBwaW5nLCB3aGljaCByZXByZXNlbnRzIG5ldyBkZXZpY2UgcHJlZmVyZW5jZSB2YWx1ZXNcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgZ2l2ZW4gU2ltdWxhdG9yLlxuICAgKiBAcGFyYW0ge0NvbW1vblByZWZlcmVuY2VzfSBjb21tb25QcmVmcyBbe31dIC0gVGhlIG1hcHBpbmcsIHdoaWNoIHJlcHJlc2VudHMgbmV3IGNvbW1vbiBwcmVmZXJlbmNlIHZhbHVlc1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFsbCBTaW11bGF0b3JzLlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwcmVmZXJlbmNlcyB3ZXJlIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlUHJlZmVyZW5jZXMgKGRldmljZVByZWZzID0ge30sIGNvbW1vblByZWZzID0ge30pIHtcbiAgICBpZiAoIV8uaXNFbXB0eShkZXZpY2VQcmVmcykpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgU2V0dGluZyBwcmVmZXJlbmNlcyBvZiAke3RoaXMudWRpZH0gU2ltdWxhdG9yIHRvICR7SlNPTi5zdHJpbmdpZnkoZGV2aWNlUHJlZnMpfWApO1xuICAgIH1cbiAgICBpZiAoIV8uaXNFbXB0eShjb21tb25QcmVmcykpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgU2V0dGluZyBjb21tb24gU2ltdWxhdG9yIHByZWZlcmVuY2VzIHRvICR7SlNPTi5zdHJpbmdpZnkoY29tbW9uUHJlZnMpfWApO1xuICAgIH1cbiAgICBjb25zdCBob21lRm9sZGVyUGF0aCA9IHByb2Nlc3MuZW52LkhPTUU7XG4gICAgaWYgKCFob21lRm9sZGVyUGF0aCkge1xuICAgICAgbG9nLndhcm4oYENhbm5vdCBnZXQgdGhlIHBhdGggdG8gSE9NRSBmb2xkZXIgZnJvbSB0aGUgcHJvY2VzcyBlbnZpcm9ubWVudC4gYCArXG4gICAgICAgIGBJZ25vcmluZyBTaW11bGF0b3IgcHJlZmVyZW5jZXMgdXBkYXRlLmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnZlcmlmeURldmljZVByZWZlcmVuY2VzKGRldmljZVByZWZzKTtcbiAgICBjb25zdCBwbGlzdFBhdGggPSBwYXRoLnJlc29sdmUoaG9tZUZvbGRlclBhdGgsICdMaWJyYXJ5JywgJ1ByZWZlcmVuY2VzJywgJ2NvbS5hcHBsZS5pcGhvbmVzaW11bGF0b3IucGxpc3QnKTtcbiAgICByZXR1cm4gYXdhaXQgcHJlZmVyZW5jZXNQbGlzdEd1YXJkLmFjcXVpcmUoU2ltdWxhdG9yWGNvZGU5Lm5hbWUsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGRlZmF1bHRzID0gbmV3IE5TVXNlckRlZmF1bHRzKHBsaXN0UGF0aCk7XG4gICAgICBjb25zdCBwcmVmc1RvVXBkYXRlID0gXy5jbG9uZShjb21tb25QcmVmcyk7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIV8uaXNFbXB0eShkZXZpY2VQcmVmcykpIHtcbiAgICAgICAgICBsZXQgZXhpc3RpbmdEZXZpY2VQcmVmcztcbiAgICAgICAgICBjb25zdCB1ZGlkS2V5ID0gdGhpcy51ZGlkLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhwbGlzdFBhdGgpKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UGxpc3RDb250ZW50ID0gYXdhaXQgZGVmYXVsdHMuYXNKc29uKCk7XG4gICAgICAgICAgICBpZiAoXy5pc1BsYWluT2JqZWN0KGN1cnJlbnRQbGlzdENvbnRlbnQuRGV2aWNlUHJlZmVyZW5jZXMpXG4gICAgICAgICAgICAgICAgJiYgXy5pc1BsYWluT2JqZWN0KGN1cnJlbnRQbGlzdENvbnRlbnQuRGV2aWNlUHJlZmVyZW5jZXNbdWRpZEtleV0pKSB7XG4gICAgICAgICAgICAgIGV4aXN0aW5nRGV2aWNlUHJlZnMgPSBjdXJyZW50UGxpc3RDb250ZW50LkRldmljZVByZWZlcmVuY2VzW3VkaWRLZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBPYmplY3QuYXNzaWduKHByZWZzVG9VcGRhdGUsIHtcbiAgICAgICAgICAgIERldmljZVByZWZlcmVuY2VzOiB7XG4gICAgICAgICAgICAgIFt1ZGlkS2V5XTogT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmdEZXZpY2VQcmVmcyB8fCB7fSwgZGV2aWNlUHJlZnMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgZGVmYXVsdHMudXBkYXRlKHByZWZzVG9VcGRhdGUpO1xuICAgICAgICBsb2cuZGVidWcoYFVwZGF0ZWQgJHt0aGlzLnVkaWR9IFNpbXVsYXRvciBwcmVmZXJlbmNlcyBhdCAnJHtwbGlzdFBhdGh9JyB3aXRoIGAgK1xuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHByZWZzVG9VcGRhdGUpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy53YXJuKGBDYW5ub3QgdXBkYXRlICR7dGhpcy51ZGlkfSBTaW11bGF0b3IgcHJlZmVyZW5jZXMgYXQgJyR7cGxpc3RQYXRofScuIGAgK1xuICAgICAgICAgIGBUcnkgdG8gZGVsZXRlIHRoZSBmaWxlIG1hbnVhbGx5IGluIG9yZGVyIHRvIHJlc2V0IGl0LiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgY3VycmVudCBTaW11bGF0b3IgdG8gdGhlIGNsZWFuIHN0YXRlLlxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIGFzeW5jIGNsZWFuICgpIHtcbiAgICBsb2cuaW5mbyhgQ2xlYW5pbmcgc2ltdWxhdG9yICR7dGhpcy51ZGlkfWApO1xuICAgIGF3YWl0IHRoaXMuc2ltY3RsLmVyYXNlRGV2aWNlKDEwMDAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdGRvY1xuICAgKiBAb3ZlcnJpZGVcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGFzeW5jIF9hY3RpdmF0ZVdpbmRvdyAoKSB7XG4gICAgbGV0IHNlbGZOYW1lO1xuICAgIGxldCBzZWxmU2RrO1xuICAgIGxldCBib290ZWREZXZpY2VzQ291bnQgPSAwO1xuICAgIGZvciAoY29uc3QgW3NkaywgZGV2aWNlQXJyXSBvZiBfLnRvUGFpcnMoYXdhaXQgdGhpcy5zaW1jdGwuZ2V0RGV2aWNlcygpKSkge1xuICAgICAgZm9yIChjb25zdCB7c3RhdGUsIHVkaWQsIG5hbWV9IG9mIGRldmljZUFycikge1xuICAgICAgICBpZiAoc3RhdGUgPT09ICdCb290ZWQnKSB7XG4gICAgICAgICAgYm9vdGVkRGV2aWNlc0NvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWxmTmFtZSAmJiB1ZGlkID09PSB0aGlzLnVkaWQpIHtcbiAgICAgICAgICBzZWxmU2RrID0gc2RrO1xuICAgICAgICAgIHNlbGZOYW1lID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYm9vdGVkRGV2aWNlc0NvdW50IDwgMikge1xuICAgICAgcmV0dXJuIGF3YWl0IHN1cGVyLl9hY3RpdmF0ZVdpbmRvdygpO1xuICAgIH1cblxuICAgIC8vIFRoZXJlIGFyZSBwb3RlbnRpYWxseSBtb3JlIHRoYXQgb25lIFNpbXVsYXRvciB3aW5kb3dcbiAgICByZXR1cm4gYFxuICAgICAgdGVsbCBhcHBsaWNhdGlvbiBcIlN5c3RlbSBFdmVudHNcIlxuICAgICAgICB0ZWxsIHByb2Nlc3MgXCJTaW11bGF0b3JcIlxuICAgICAgICAgIHNldCBmcm9udG1vc3QgdG8gZmFsc2VcbiAgICAgICAgICBzZXQgZnJvbnRtb3N0IHRvIHRydWVcbiAgICAgICAgICBjbGljayAobWVudSBpdGVtIDEgd2hlcmUgKGl0cyBuYW1lIGNvbnRhaW5zIFwiJHtzZWxmTmFtZX0gXCIgYW5kIGl0cyBuYW1lIGNvbnRhaW5zIFwiJHtzZWxmU2RrfVwiKSkgb2YgbWVudSAxIG9mIG1lbnUgYmFyIGl0ZW0gXCJXaW5kb3dcIiBvZiBtZW51IGJhciAxXG4gICAgICAgIGVuZCB0ZWxsXG4gICAgICBlbmQgdGVsbFxuICAgIGA7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICBhc3luYyBpc0Jpb21ldHJpY0Vucm9sbGVkICgpIHtcbiAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IHRoaXMuc2ltY3RsLnNwYXduUHJvY2VzcyhbXG4gICAgICAnbm90aWZ5dXRpbCcsXG4gICAgICAnLWcnLCBFTlJPTExNRU5UX05PVElGSUNBVElPTl9SRUNFSVZFUlxuICAgIF0pO1xuICAgIGNvbnN0IG1hdGNoID0gKG5ldyBSZWdFeHAoYCR7Xy5lc2NhcGVSZWdFeHAoRU5ST0xMTUVOVF9OT1RJRklDQVRJT05fUkVDRUlWRVIpfVxcXFxzKyhbMDFdKWApKVxuICAgICAgLmV4ZWMoc3Rkb3V0KTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSBiaW9tZXRyaWMgZW5yb2xsbWVudCBzdGF0ZSBmcm9tICcke3N0ZG91dH0nYCk7XG4gICAgfVxuICAgIGxvZy5pbmZvKGBDdXJyZW50IGJpb21ldHJpYyBlbnJvbGxlZCBzdGF0ZSBmb3IgJHt0aGlzLnVkaWR9IFNpbXVsYXRvcjogJHttYXRjaFsxXX1gKTtcbiAgICByZXR1cm4gbWF0Y2hbMV0gPT09ICcxJztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdGRvY1xuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIGFzeW5jIGVucm9sbEJpb21ldHJpYyAoaXNFbmFibGVkID0gdHJ1ZSkge1xuICAgIGxvZy5kZWJ1ZyhgU2V0dGluZyBiaW9tZXRyaWMgZW5yb2xsZWQgc3RhdGUgZm9yICR7dGhpcy51ZGlkfSBTaW11bGF0b3IgdG8gJyR7aXNFbmFibGVkID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJ30nYCk7XG4gICAgYXdhaXQgdGhpcy5zaW1jdGwuc3Bhd25Qcm9jZXNzKFtcbiAgICAgICdub3RpZnl1dGlsJyxcbiAgICAgICctcycsIEVOUk9MTE1FTlRfTk9USUZJQ0FUSU9OX1JFQ0VJVkVSLCBpc0VuYWJsZWQgPyAnMScgOiAnMCdcbiAgICBdKTtcbiAgICBhd2FpdCB0aGlzLnNpbWN0bC5zcGF3blByb2Nlc3MoW1xuICAgICAgJ25vdGlmeXV0aWwnLFxuICAgICAgJy1wJywgRU5ST0xMTUVOVF9OT1RJRklDQVRJT05fUkVDRUlWRVJcbiAgICBdKTtcbiAgICBpZiAoYXdhaXQgdGhpcy5pc0Jpb21ldHJpY0Vucm9sbGVkKCkgIT09IGlzRW5hYmxlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc2V0IGJpb21ldHJpYyBlbnJvbGxlZCBzdGF0ZSBmb3IgJHt0aGlzLnVkaWR9IFNpbXVsYXRvciB0byAnJHtpc0VuYWJsZWQgPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfSdgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBub3RpZmljYXRpb24gdG8gbWF0Y2gvbm90IG1hdGNoIHRoZSBwYXJ0aWN1bGFyIGJpb21ldHJpYy5cbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBwYXJhbSB7P2Jvb2xlYW59IHNob3VsZE1hdGNoIFt0cnVlXSAtIFNldCBpdCB0byB0cnVlIG9yIGZhbHNlIGluIG9yZGVyIHRvIGVtdWxhdGVcbiAgICogbWF0Y2hpbmcvbm90IG1hdGNoaW5nIHRoZSBjb3JyZXNwb25kaW5nIGJpb21ldHJpY1xuICAgKiBAcGFyYW0gez9zdHJpbmd9IGJpb21ldHJpY05hbWUgW3RvdWNoSWRdIC0gRWl0aGVyIHRvdWNoSWQgb3IgZmFjZUlkIChmYWNlSWQgaXMgb25seSBhdmFpbGFibGUgc2luY2UgaU9TIDExKVxuICAgKi9cbiAgYXN5bmMgc2VuZEJpb21ldHJpY01hdGNoIChzaG91bGRNYXRjaCA9IHRydWUsIGJpb21ldHJpY05hbWUgPSAndG91Y2hJZCcpIHtcbiAgICBjb25zdCBkb21haW5Db21wb25lbnQgPSB0b0Jpb21ldHJpY0RvbWFpbkNvbXBvbmVudChiaW9tZXRyaWNOYW1lKTtcbiAgICBjb25zdCBkb21haW4gPSBgY29tLmFwcGxlLkJpb21ldHJpY0tpdF9TaW0uJHtkb21haW5Db21wb25lbnR9LiR7c2hvdWxkTWF0Y2ggPyAnJyA6ICdubyd9bWF0Y2hgO1xuICAgIGF3YWl0IHRoaXMuc2ltY3RsLnNwYXduUHJvY2VzcyhbXG4gICAgICAnbm90aWZ5dXRpbCcsXG4gICAgICAnLXAnLCBkb21haW5cbiAgICBdKTtcbiAgICBsb2cuaW5mbyhgU2VudCBub3RpZmljYXRpb24gJHtkb21haW59IHRvICR7c2hvdWxkTWF0Y2ggPyAnbWF0Y2gnIDogJ25vdCBtYXRjaCd9ICR7YmlvbWV0cmljTmFtZX0gYmlvbWV0cmljIGAgK1xuICAgICAgYGZvciAke3RoaXMudWRpZH0gU2ltdWxhdG9yYCk7XG4gIH1cblxuICAvKipcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICBhc3luYyBnZXRMYXVuY2hEYWVtb25zUm9vdCAoKSB7XG4gICAgY29uc3QgZGV2Um9vdCA9IGF3YWl0IGdldERldmVsb3BlclJvb3QoKTtcbiAgICByZXR1cm4gcGF0aC5yZXNvbHZlKGRldlJvb3QsXG4gICAgICAnUGxhdGZvcm1zL2lQaG9uZU9TLnBsYXRmb3JtL0RldmVsb3Blci9MaWJyYXJ5L0NvcmVTaW11bGF0b3IvUHJvZmlsZXMvUnVudGltZXMvaU9TLnNpbXJ1bnRpbWUvQ29udGVudHMvUmVzb3VyY2VzL1J1bnRpbWVSb290L1N5c3RlbS9MaWJyYXJ5L0xhdW5jaERhZW1vbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBLZXlib2FyZE9wdGlvbnNcbiAgICogQHByb3BlcnR5IHshc3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBrZXlib2FyZCBsb2NhbGUsIGZvciBleGFtcGxlIGBlbl9VU2Agb3IgYGRlX0NIYFxuICAgKiBAcHJvcGVydHkgeyFzdHJpbmd9IGxheW91dCBUaGUga2V5Ym9hcmQgbGF5b3V0LCBmb3IgZXhhbXBsZSBgUVVFUlRZYCBvciBgVWtyYWluaWFuYFxuICAgKiBAcHJvcGVydHkgez9zdHJpbmd9IGhhcmR3YXJlIENvdWxkIGVpdGhlciBiZSBgQXV0b21hdGljYCBvciBgbnVsbGBcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IExhbmd1YWdlT3B0aW9uc1xuICAgKiBAcHJvcGVydHkgeyFzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGxhbmd1YWdlLCBmb3IgZXhhbXBsZSBgZGVgIG9yIGB6aC1IYW50LUNOYFxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gTG9jYWxlT3B0aW9uc1xuICAgKiBAcHJvcGVydHkgeyFzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5c3RlbSBsb2NhbGUsIGZvciBleGFtcGxlIGBkZV9DSGAgb3IgYHpoX0NOYFxuICAgKiBAcHJvcGVydHkgez9zdHJpbmd9IGNhbGVuZGFyIE9wdGlvbmFsIGNhbGVuZGFyIGZvcm1hdCwgZm9yIGV4YW1wbGUgYGdyZWdvcmlhbmAgb3IgYHBlcnNpYW5gXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMb2NhbGl6YXRpb25PcHRpb25zXG4gICAqIEBwcm9wZXJ0eSB7P0tleWJvYXJkT3B0aW9uc30ga2V5Ym9hcmRcbiAgICogQHByb3BlcnR5IHs/TGFuZ3VhZ2VPcHRpb25zfSBsYW5ndWFnZVxuICAgKiBAcHJvcGVydHkgez9Mb2NhbGVPcHRpb25zfSBsb2NhbGVcbiAgICovXG5cbiAgLyoqXG4gICAqIENoYW5nZSBsb2NhbGl6YXRpb24gc2V0dGluZ3Mgb24gdGhlIGN1cnJlbnRseSBib290ZWQgc2ltdWxhdG9yXG4gICAqXG4gICAqIEBwYXJhbSB7P0xvY2FsaXphdGlvbk9wdGlvbnN9IG9wdHNcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgc2V0dGluZyB0aGUgcHJlZmVyZW5jZXNcbiAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBhbnkgb2Ygc2V0dGluZ3MgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNoYW5nZWRcbiAgICovXG4gIGFzeW5jIGNvbmZpZ3VyZUxvY2FsaXphdGlvbiAob3B0cyA9IHt9KSB7XG4gICAgaWYgKF8uaXNFbXB0eShvcHRzKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHsgbGFuZ3VhZ2UsIGxvY2FsZSwga2V5Ym9hcmQgfSA9IG9wdHM7XG4gICAgY29uc3QgZ2xvYmFsUHJlZnMgPSB7fTtcbiAgICBsZXQga2V5Ym9hcmRJZCA9IG51bGw7XG4gICAgaWYgKF8uaXNQbGFpbk9iamVjdChrZXlib2FyZCkpIHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgbGF5b3V0LCBoYXJkd2FyZSB9ID0ga2V5Ym9hcmQ7XG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJ2tleWJvYXJkJyBmaWVsZCBtdXN0IGhhdmUgYSB2YWxpZCBuYW1lIHNldGApO1xuICAgICAgfVxuICAgICAgaWYgKCFsYXlvdXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJ2tleWJvYXJkJyBmaWVsZCBtdXN0IGhhdmUgYSB2YWxpZCBsYXlvdXQgc2V0YCk7XG4gICAgICB9XG4gICAgICBrZXlib2FyZElkID0gYCR7bmFtZX1Ac3c9JHtsYXlvdXR9YDtcbiAgICAgIGlmIChoYXJkd2FyZSkge1xuICAgICAgICBrZXlib2FyZElkICs9IGA7QGh3PSR7aGFyZHdhcmV9YDtcbiAgICAgIH1cbiAgICAgIGdsb2JhbFByZWZzLkFwcGxlS2V5Ym9hcmRzID0gW2tleWJvYXJkSWRdO1xuICAgIH1cbiAgICBpZiAoXy5pc1BsYWluT2JqZWN0KGxhbmd1YWdlKSkge1xuICAgICAgY29uc3QgeyBuYW1lIH0gPSBsYW5ndWFnZTtcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAnbGFuZ3VhZ2UnIGZpZWxkIG11c3QgaGF2ZSBhIHZhbGlkIG5hbWUgc2V0YCk7XG4gICAgICB9XG4gICAgICBnbG9iYWxQcmVmcy5BcHBsZUxhbmd1YWdlcyA9IFtuYW1lXTtcbiAgICB9XG4gICAgaWYgKF8uaXNQbGFpbk9iamVjdChsb2NhbGUpKSB7XG4gICAgICBjb25zdCB7IG5hbWUsIGNhbGVuZGFyIH0gPSBsb2NhbGU7XG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJ2xvY2FsZScgZmllbGQgbXVzdCBoYXZlIGEgdmFsaWQgbmFtZSBzZXRgKTtcbiAgICAgIH1cbiAgICAgIGxldCBsb2NhbGVJZCA9IG5hbWU7XG4gICAgICBpZiAoY2FsZW5kYXIpIHtcbiAgICAgICAgbG9jYWxlSWQgKz0gYEBjYWxlbmRhcj0ke2NhbGVuZGFyfWA7XG4gICAgICB9XG4gICAgICBnbG9iYWxQcmVmcy5BcHBsZUxvY2FsZSA9IGxvY2FsZUlkO1xuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KGdsb2JhbFByZWZzKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGFyZ0NodW5rcyA9IGdlbmVyYXRlRGVmYXVsdHNDb21tYW5kQXJncyhnbG9iYWxQcmVmcywgdHJ1ZSk7XG4gICAgYXdhaXQgQi5hbGwoYXJnQ2h1bmtzLm1hcCgoYXJncykgPT4gdGhpcy5zaW1jdGwuc3Bhd25Qcm9jZXNzKFtcbiAgICAgICdkZWZhdWx0cycsICd3cml0ZScsICcuR2xvYmFsUHJlZmVyZW5jZXMucGxpc3QnLCAuLi5hcmdzXG4gICAgXSkpKTtcblxuICAgIGlmIChrZXlib2FyZElkKSB7XG4gICAgICBjb25zdCBhcmdDaHVua3MgPSBnZW5lcmF0ZURlZmF1bHRzQ29tbWFuZEFyZ3Moe1xuICAgICAgICBLZXlib2FyZHNDdXJyZW50QW5kTmV4dDogW2tleWJvYXJkSWRdLFxuICAgICAgICBLZXlib2FyZExhc3RVc2VkOiBrZXlib2FyZElkLFxuICAgICAgICBLZXlib2FyZExhc3RVc2VkRm9yTGFuZ3VhZ2U6IHsgW2tleWJvYXJkLm5hbWVdOiBrZXlib2FyZElkIH1cbiAgICAgIH0sIHRydWUpO1xuICAgICAgYXdhaXQgQi5hbGwoYXJnQ2h1bmtzLm1hcCgoYXJncykgPT4gdGhpcy5zaW1jdGwuc3Bhd25Qcm9jZXNzKFtcbiAgICAgICAgJ2RlZmF1bHRzJywgJ3dyaXRlJywgJ2NvbS5hcHBsZS5QcmVmZXJlbmNlcycsIC4uLmFyZ3NcbiAgICAgIF0pKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBTaW11bGF0b3JYY29kZTk7XG4iXSwiZmlsZSI6ImxpYi9zaW11bGF0b3IteGNvZGUtOS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|
|
459
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zaW11bGF0b3IteGNvZGUtOS5qcyJdLCJuYW1lcyI6WyJTSU1VTEFUT1JfU0hVVERPV05fVElNRU9VVCIsInN0YXJ0dXBMb2NrIiwiQXN5bmNMb2NrIiwicHJlZmVyZW5jZXNQbGlzdEd1YXJkIiwiRU5ST0xMTUVOVF9OT1RJRklDQVRJT05fUkVDRUlWRVIiLCJTaW11bGF0b3JYY29kZTkiLCJTaW11bGF0b3JYY29kZTgiLCJjb25zdHJ1Y3RvciIsInVkaWQiLCJ4Y29kZVZlcnNpb24iLCJydW4iLCJvcHRzIiwiXyIsImNsb25lRGVlcCIsImRlZmF1bHRzRGVlcCIsImRldmljZVByZWZlcmVuY2VzIiwiaXNIZWFkbGVzcyIsInN0YXJ0dXBUaW1lb3V0Iiwic2NhbGVGYWN0b3IiLCJTaW11bGF0b3JXaW5kb3dMYXN0U2NhbGUiLCJwYXJzZUZsb2F0IiwiY29tbW9uUHJlZmVyZW5jZXMiLCJSb3RhdGVXaW5kb3dXaGVuU2lnbmFsZWRCeUd1ZXN0IiwiaXNCb29sZWFuIiwiY29ubmVjdEhhcmR3YXJlS2V5Ym9hcmQiLCJpc05pbCIsIkNvbm5lY3RIYXJkd2FyZUtleWJvYXJkIiwidHJhY2VQb2ludGVyIiwiU2hvd1NpbmdsZVRvdWNoZXMiLCJTaG93UGluY2hlcyIsIlNob3dQaW5jaFBpdm90UG9pbnQiLCJIaWdobGlnaHRFZGdlR2VzdHVyZXMiLCJsb3dlckNhc2UiLCJwYXN0ZWJvYXJkQXV0b21hdGljU3luYyIsIlBhc3RlYm9hcmRBdXRvbWF0aWNTeW5jIiwibG9nIiwiaW5mbyIsInVwZGF0ZVByZWZlcmVuY2VzIiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsInN0YXJ0Iiwic2hvdWxkV2FpdEZvckJvb3QiLCJhY3F1aXJlIiwidWlDbGllbnRCdW5kbGVJZCIsImlzU2VydmVyUnVubmluZyIsImlzUnVubmluZyIsInVpQ2xpZW50UGlkIiwiZ2V0VUlDbGllbnRQaWQiLCJraWxsVUlDbGllbnQiLCJwaWQiLCJpc1NodXRkb3duIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImUiLCJFcnJvciIsImJvb3QiLCJzaHV0ZG93biIsInRpbWVvdXQiLCJsYXVuY2hXaW5kb3ciLCJ3YWl0Rm9yQm9vdCIsImdldER1cmF0aW9uIiwiYXNTZWNvbmRzIiwidG9GaXhlZCIsImlzVWlDbGllbnRSdW5uaW5nIiwic3RhcnRVSUNsaWVudCIsImJvb3RFdmVudHNFbWl0dGVyIiwiRXZlbnRFbWl0dGVyIiwic2ltY3RsIiwic3RhcnRCb290TW9uaXRvciIsIm9uRXJyb3IiLCJlcnIiLCJlbWl0Iiwib25GaW5pc2hlZCIsInNob3VsZFByZWJvb3QiLCJCIiwicmVzb2x2ZSIsInJlamVjdCIsInNldFRpbWVvdXQiLCJvbmNlIiwiaW5jbHVkZXMiLCJtZXNzYWdlIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwidmVyaWZ5RGV2aWNlUHJlZmVyZW5jZXMiLCJwcmVmcyIsImlzRW1wdHkiLCJpc1VuZGVmaW5lZCIsImlzTnVtYmVyIiwiZXJyb3JBbmRUaHJvdyIsIlNpbXVsYXRvcldpbmRvd0NlbnRlciIsInZlcmlmaWNhdGlvblBhdHRlcm4iLCJpc1N0cmluZyIsInRlc3QiLCJTaW11bGF0b3JXaW5kb3dPcmllbnRhdGlvbiIsImFjY2VwdGFibGVWYWx1ZXMiLCJpbmRleE9mIiwiU2ltdWxhdG9yV2luZG93Um90YXRpb25BbmdsZSIsImRldmljZVByZWZzIiwiY29tbW9uUHJlZnMiLCJkZWJ1ZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJob21lRm9sZGVyUGF0aCIsInByb2Nlc3MiLCJlbnYiLCJIT01FIiwid2FybiIsInBsaXN0UGF0aCIsInBhdGgiLCJuYW1lIiwiZGVmYXVsdHMiLCJOU1VzZXJEZWZhdWx0cyIsInByZWZzVG9VcGRhdGUiLCJjbG9uZSIsImV4aXN0aW5nRGV2aWNlUHJlZnMiLCJ1ZGlkS2V5IiwidG9VcHBlckNhc2UiLCJmcyIsImV4aXN0cyIsImN1cnJlbnRQbGlzdENvbnRlbnQiLCJhc0pzb24iLCJpc1BsYWluT2JqZWN0IiwiRGV2aWNlUHJlZmVyZW5jZXMiLCJPYmplY3QiLCJhc3NpZ24iLCJ1cGRhdGUiLCJjbGVhbiIsImVyYXNlRGV2aWNlIiwiX2FjdGl2YXRlV2luZG93Iiwic2VsZk5hbWUiLCJzZWxmU2RrIiwiYm9vdGVkRGV2aWNlc0NvdW50Iiwic2RrIiwiZGV2aWNlQXJyIiwidG9QYWlycyIsImdldERldmljZXMiLCJzdGF0ZSIsImlzQmlvbWV0cmljRW5yb2xsZWQiLCJzdGRvdXQiLCJzcGF3blByb2Nlc3MiLCJtYXRjaCIsIlJlZ0V4cCIsImVzY2FwZVJlZ0V4cCIsImV4ZWMiLCJlbnJvbGxCaW9tZXRyaWMiLCJpc0VuYWJsZWQiLCJzZW5kQmlvbWV0cmljTWF0Y2giLCJzaG91bGRNYXRjaCIsImJpb21ldHJpY05hbWUiLCJkb21haW5Db21wb25lbnQiLCJkb21haW4iLCJnZXRMYXVuY2hEYWVtb25zUm9vdCIsImRldlJvb3QiLCJjb25maWd1cmVMb2NhbGl6YXRpb24iLCJsYW5ndWFnZSIsImxvY2FsZSIsImtleWJvYXJkIiwiZ2xvYmFsUHJlZnMiLCJrZXlib2FyZElkIiwibGF5b3V0IiwiaGFyZHdhcmUiLCJBcHBsZUtleWJvYXJkcyIsIkFwcGxlTGFuZ3VhZ2VzIiwiY2FsZW5kYXIiLCJsb2NhbGVJZCIsIkFwcGxlTG9jYWxlIiwiYXJnQ2h1bmtzIiwiYWxsIiwibWFwIiwiYXJncyIsIktleWJvYXJkc0N1cnJlbnRBbmROZXh0IiwiS2V5Ym9hcmRMYXN0VXNlZCIsIktleWJvYXJkTGFzdFVzZWRGb3JMYW5ndWFnZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSwwQkFBMEIsR0FBRyxLQUFLLElBQXhDO0FBQ0EsTUFBTUMsV0FBVyxHQUFHLElBQUlDLGtCQUFKLEVBQXBCO0FBQ0EsTUFBTUMscUJBQXFCLEdBQUcsSUFBSUQsa0JBQUosRUFBOUI7QUFDQSxNQUFNRSxnQ0FBZ0MsR0FBRywwQ0FBekM7O0FBRUEs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TUQsU0FBUyxDQUFDRSxHQUFWLENBQWVDLElBQUQsSUFBVSxLQUFLckcsTUFBTCxDQUFZdUUsWUFBWixDQUF5QixDQUMzRCxVQUQyRCxFQUMvQyxPQUQrQyxFQUN0Qyx1QkFEc0MsRUFDYixHQUFHOEIsSUFEVSxDQUF6QixDQUF4QixDQUFOLENBQU47QUFHRDs7QUFFRCxXQUFPLElBQVA7QUFDRDs7QUF0ZjJDOztlQTBmL0JwSyxlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNpbXVsYXRvclhjb2RlOCBmcm9tICcuL3NpbXVsYXRvci14Y29kZS04JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGZzLCB0aW1pbmcgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgQXN5bmNMb2NrIGZyb20gJ2FzeW5jLWxvY2snO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgdG9CaW9tZXRyaWNEb21haW5Db21wb25lbnQsIGdldERldmVsb3BlclJvb3QgfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7IE5TVXNlckRlZmF1bHRzLCBnZW5lcmF0ZURlZmF1bHRzQ29tbWFuZEFyZ3MgfSBmcm9tICcuL2RlZmF1bHRzLXV0aWxzJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XG5cbmNvbnN0IFNJTVVMQVRPUl9TSFVURE9XTl9USU1FT1VUID0gMTUgKiAxMDAwO1xuY29uc3Qgc3RhcnR1cExvY2sgPSBuZXcgQXN5bmNMb2NrKCk7XG5jb25zdCBwcmVmZXJlbmNlc1BsaXN0R3VhcmQgPSBuZXcgQXN5bmNMb2NrKCk7XG5jb25zdCBFTlJPTExNRU5UX05PVElGSUNBVElPTl9SRUNFSVZFUiA9ICdjb20uYXBwbGUuQmlvbWV0cmljS2l0LmVucm9sbG1lbnRDaGFuZ2VkJztcblxuY2xhc3MgU2ltdWxhdG9yWGNvZGU5IGV4dGVuZHMgU2ltdWxhdG9yWGNvZGU4IHtcbiAgY29uc3RydWN0b3IgKHVkaWQsIHhjb2RlVmVyc2lvbikge1xuICAgIHN1cGVyKHVkaWQsIHhjb2RlVmVyc2lvbik7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRGV2aWNlUHJlZmVyZW5jZXNcbiAgICogQHByb3BlcnR5IHs/bnVtYmVyfSBTaW11bGF0b3JFeHRlcm5hbERpc3BsYXkgLSBUQkQuIEV4YW1wbGUgdmFsdWU6IDIuMTE0XG4gICAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gQ2hyb21lVGludCAtIFRCRC4gRXhhbXBsZSB2YWx1ZTogJydcbiAgICogQHByb3BlcnR5IHs/bnVtYmVyfSBTaW11bGF0b3JXaW5kb3dMYXN0U2NhbGUgLSBTY2FsZSB2YWx1ZSBmb3IgdGhlIHBhcnRpY3VsYXIgU2ltdWxhdG9yIHdpbmRvdy5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAgbWVhbnMgMTAwJSBzY2FsZS5cbiAgICogQHByb3BlcnR5IHs/c3RyaW5nfSBTaW11bGF0b3JXaW5kb3dPcmllbnRhdGlvbiAtIFNpbXVsYXRvciB3aW5kb3cgb3JpZW50YXRpb24uIFBvc3NpYmxlIHZhbHVlcyBhcmU6XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUG9ydHJhaXQnLCAnTGFuZHNjYXBlTGVmdCcsICdQb3J0cmFpdFVwc2lkZURvd24nIGFuZCAnTGFuZHNjYXBlUmlnaHQnLlxuICAgKiBAcHJvcGVydHkgez9udW1iZXJ9IFNpbXVsYXRvcldpbmRvd1JvdGF0aW9uQW5nbGUgLSBXaW5kb3cgcm90YXRpb24gYW5nbGUuIFRoaXMgdmFsdWUgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gc3luY1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIF9TaW11bGF0b3JXaW5kb3dPcmllbnRhdGlvbl8uIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBhcmU6XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDkwLCAxODAgYW5kIDI3MC5cbiAgICogQHByb3BlcnR5IHs/c3RyaW5nfSBTaW11bGF0b3JXaW5kb3dDZW50ZXIgLSBUaGUgY29vcmRpbmF0ZXMgb2YgU2ltdWxhdG9yJ3Mgd2luZG93IGNlbnRlciBpbiBwaXhlbHMsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUgJ3stMTI5NC41LCA3NzUuNX0nLlxuICAgKiBAcHJvcGVydHkgez9ib29sZWFufSBDb25uZWN0SGFyZHdhcmVLZXlib2FyZCAtIEVxdWFscyB0byAxIGlmIGhhcmR3YXJlIGtleWJvYXJkIHNob3VsZCBiZSBjb25uZWN0ZWQuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIDAuXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBDb21tb25QcmVmZXJlbmNlc1xuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IENvbm5lY3RIYXJkd2FyZUtleWJvYXJkIC0gV2hldGhlciB0byBjb25uZWN0IGhhcmR3YXJlIGtleWJvYXJkXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBSdW5PcHRpb25zXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzY2FsZUZhY3RvcjogQW55IHBvc2l0aXZlIGZsb2F0IHZhbHVlLiAxLjAgbWVhbnMgMToxIHNjYWxlLlxuICAgKiBEZWZpbmVzIHRoZSB3aW5kb3cgc2NhbGUgdmFsdWUgZm9yIHRoZSBVSSBjbGllbnQgd2luZG93IGZvciB0aGUgY3VycmVudCBTaW11bGF0b3IuXG4gICAqIEVxdWFscyB0byBgbnVsbGAgYnkgZGVmYXVsdCwgd2hpY2gga2VlcHMgdGhlIGN1cnJlbnQgc2NhbGUgdW5jaGFuZ2VkLlxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGNvbm5lY3RIYXJkd2FyZUtleWJvYXJkOiB3aGV0aGVyIHRvIGNvbm5lY3QgdGhlIGhhcmR3YXJlIGtleWJvYXJkIHRvIHRoZVxuICAgKiBTaW11bGF0b3IgVUkgY2xpZW50LiBFcXVhbHMgdG8gYGZhbHNlYCBieSBkZWZhdWx0LlxuICAgKiBAcHJvcGVydHkge251bWJlcn0gc3RhcnR1cFRpbWVvdXQ6IG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbCBTaW11bGF0b3IgYm9vdGluZ1xuICAgKiBwcm9jZXNzIGlzIGNvbXBsZXRlZC4gVGhlIGRlZmF1bHQgdGltZW91dCB3aWxsIGJlIHVzZWQgaWYgbm90IHNldCBleHBsaWNpdGx5LlxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzSGVhZGxlc3M6IHdoZXRoZXIgdG8gc3RhcnQgdGhlIFNpbXVsYXRvciBpbiBoZWFkbGVzcyBtb2RlICh3aXRoIFVJXG4gICAqIGNsaWVudCBpbnZpc2libGUpLiBgZmFsc2VgIGJ5IGRlZmF1bHQuXG4gICAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IHRyYWNlUG9pbnRlciBbZmFsc2VdIC0gV2hldGhlciB0byBoaWdobGlnaHQgdG91Y2hlcyBvbiBTaW11bGF0b3JcbiAgICogc2NyZWVuLiBUaGlzIGlzIGhlbHBmdWwgd2hpbGUgZGVidWdnaW5nIGF1dG9tYXRlZCB0ZXN0cyBvciB3aGlsZSBvYnNlcnZpbmcgdGhlIGF1dG9tYXRpb25cbiAgICogcmVjb3JkaW5ncy5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHBhc3RlYm9hcmRBdXRvbWF0aWNTeW5jIFsnb2ZmJ10gLSBXaGV0aGVyIHRvIGRpc2FibGUgcGFzdGVib2FyZCBzeW5jIHdpdGggdGhlXG4gICAqIFNpbXVsYXRvciBVSSBjbGllbnQgb3IgcmVzcGVjdCB0aGUgc3lzdGVtIHdpZGUgcHJlZmVyZW5jZS4gJ29uJywgJ29mZicsIG9yICdzeXN0ZW0nIGlzIGF2YWlsYWJsZS5cbiAgICogVGhlIHN5bmMgaW5jcmVhc2VzIGxhdW5jaGluZyBzaW11bGF0b3IgcHJvY2VzcyB0aW1lLCBidXQgaXQgYWxsb3dzIHN5c3RlbSB0byBzeW5jIHBhc3RlYm9hcmRcbiAgICogd2l0aCBzaW11bGF0b3JzLiBGb2xsb3dzIHN5c3RlbS13aWRlIHByZWZlcmVuY2UgaWYgdGhlIHZhbHVlIGlzICdzeXN0ZW0nLlxuICAgKiBEZWZhdWx0cyB0byAnb2ZmJy5cbiAgICogQHByb3BlcnR5IHtEZXZpY2VQcmVmZXJlbmNlc30gZGV2aWNlUHJlZmVyZW5jZXM6IHByZWZlcmVuY2VzIG9mIHRoZSBuZXdseSBjcmVhdGVkIFNpbXVsYXRvclxuICAgKiBkZXZpY2VcbiAgICovXG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGdpdmVuIFNpbXVsYXRvciB3aXRoIG9wdGlvbnMuIFRoZSBTaW11bGF0b3Igd2lsbCBub3QgYmUgcmVzdGFydGVkIGlmXG4gICAqIGl0IGlzIGFscmVhZHkgcnVubmluZyBhbmQgdGhlIGN1cnJlbnQgVUkgc3RhdGUgbWF0Y2hlcyB0byBgaXNIZWFkbGVzc2Agb3B0aW9uLlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHBhcmFtIHtSdW5PcHRpb25zfSBvcHRzIC0gT25lIG9yIG1vcmUgb2YgYXZhaWxhYmxlIFNpbXVsYXRvciBvcHRpb25zXG4gICAqL1xuICBhc3luYyBydW4gKG9wdHMgPSB7fSkge1xuICAgIG9wdHMgPSBfLmNsb25lRGVlcChvcHRzKTtcbiAgICBfLmRlZmF1bHRzRGVlcChvcHRzLCB7XG4gICAgICBkZXZpY2VQcmVmZXJlbmNlczoge30sXG4gICAgICBpc0hlYWRsZXNzOiBmYWxzZSxcbiAgICAgIHN0YXJ0dXBUaW1lb3V0OiB0aGlzLnN0YXJ0dXBUaW1lb3V0LFxuICAgIH0pO1xuXG4gICAgaWYgKG9wdHMuc2NhbGVGYWN0b3IpIHtcbiAgICAgIG9wdHMuZGV2aWNlUHJlZmVyZW5jZXMuU2ltdWxhdG9yV2luZG93TGFzdFNjYWxlID0gcGFyc2VGbG9hdChvcHRzLnNjYWxlRmFjdG9yKTtcbiAgICB9XG4gICAgLy8gVGhpcyBvcHRpb24gaXMgbmVjZXNzYXJ5IHRvIG1ha2UgdGhlIFNpbXVsYXRvciB3aW5kb3cgZm9sbG93XG4gICAgLy8gdGhlIGFjdHVhbCBYQ1VJRGV2aWNlIG9yaWVudGF0aW9uXG4gICAgY29uc3QgY29tbW9uUHJlZmVyZW5jZXMgPSB7XG4gICAgICBSb3RhdGVXaW5kb3dXaGVuU2lnbmFsZWRCeUd1ZXN0OiB0cnVlXG4gICAgfTtcbiAgICBpZiAoXy5pc0Jvb2xlYW4ob3B0cy5jb25uZWN0SGFyZHdhcmVLZXlib2FyZCkgfHwgXy5pc05pbChvcHRzLmNvbm5lY3RIYXJkd2FyZUtleWJvYXJkKSkge1xuICAgICAgb3B0cy5kZXZpY2VQcmVmZXJlbmNlcy5Db25uZWN0SGFyZHdhcmVLZXlib2FyZCA9IG9wdHMuY29ubmVjdEhhcmR3YXJlS2V5Ym9hcmQgPz8gZmFsc2U7XG4gICAgICBjb21tb25QcmVmZXJlbmNlcy5Db25uZWN0SGFyZHdhcmVLZXlib2FyZCA9IG9wdHMuY29ubmVjdEhhcmR3YXJlS2V5Ym9hcmQgPz8gZmFsc2U7XG4gICAgfVxuICAgIGlmIChfLmlzQm9vbGVhbihvcHRzLnRyYWNlUG9pbnRlcikpIHtcbiAgICAgIGNvbW1vblByZWZlcmVuY2VzLlNob3dTaW5nbGVUb3VjaGVzID0gb3B0cy50cmFjZVBvaW50ZXI7XG4gICAgICBjb21tb25QcmVmZXJlbmNlcy5TaG93UGluY2hlcyA9IG9wdHMudHJhY2VQb2ludGVyO1xuICAgICAgY29tbW9uUHJlZmVyZW5jZXMuU2hvd1BpbmNoUGl2b3RQb2ludCA9IG9wdHMudHJhY2VQb2ludGVyO1xuICAgICAgY29tbW9uUHJlZmVyZW5jZXMuSGlnaGxpZ2h0RWRnZUdlc3R1cmVzID0gb3B0cy50cmFjZVBvaW50ZXI7XG4gICAgfVxuICAgIHN3aXRjaCAoXy5sb3dlckNhc2Uob3B0cy5wYXN0ZWJvYXJkQXV0b21hdGljU3luYykpIHtcbiAgICAgIGNhc2UgJ29uJzpcbiAgICAgICAgY29tbW9uUHJlZmVyZW5jZXMuUGFzdGVib2FyZEF1dG9tYXRpY1N5bmMgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ29mZic6XG4gICAgICAgIC8vIEltcHJvdmUgbGF1bmNoaW5nIHNpbXVsYXRvciBwZXJmb3JtYW5jZVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vV2ViS2l0L3dlYmtpdC9ibG9iL21hc3Rlci9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3hjb2RlL3NpbXVsYXRlZF9kZXZpY2UucHkjTDQxM1xuICAgICAgICBjb21tb25QcmVmZXJlbmNlcy5QYXN0ZWJvYXJkQXV0b21hdGljU3luYyA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3N5c3RlbSc6XG4gICAgICAgIC8vIERvIG5vdCBhZGQgLVBhc3RlYm9hcmRBdXRvbWF0aWNTeW5jXG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbG9nLmluZm8oYFsnb24nLCAnb2ZmJyBvciAnc3lzdGVtJ10gYXJlIGF2YWlsYWJsZSBhcyB0aGUgcGFzdGVib2FyZCBhdXRvbWF0aWMgc3luYyBvcHRpb24uIERlZmF1bHRpbmcgdG8gJ29mZidgKTtcbiAgICAgICAgY29tbW9uUHJlZmVyZW5jZXMuUGFzdGVib2FyZEF1dG9tYXRpY1N5bmMgPSBmYWxzZTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy51cGRhdGVQcmVmZXJlbmNlcyhvcHRzLmRldmljZVByZWZlcmVuY2VzLCBjb21tb25QcmVmZXJlbmNlcyk7XG5cbiAgICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuICAgIGNvbnN0IHNob3VsZFdhaXRGb3JCb290ID0gYXdhaXQgc3RhcnR1cExvY2suYWNxdWlyZSh0aGlzLnVpQ2xpZW50QnVuZGxlSWQsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGlzU2VydmVyUnVubmluZyA9IGF3YWl0IHRoaXMuaXNSdW5uaW5nKCk7XG4gICAgICBjb25zdCB1aUNsaWVudFBpZCA9IGF3YWl0IHRoaXMuZ2V0VUlDbGllbnRQaWQoKTtcbiAgICAgIGlmIChvcHRzLmlzSGVhZGxlc3MpIHtcbiAgICAgICAgaWYgKGlzU2VydmVyUnVubmluZyAmJiAhdWlDbGllbnRQaWQpIHtcbiAgICAgICAgICBsb2cuaW5mbyhgU2ltdWxhdG9yIHdpdGggVURJRCAnJHt0aGlzLnVkaWR9JyBpcyBhbHJlYWR5IGJvb3RlZCBpbiBoZWFkbGVzcyBtb2RlLmApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXdhaXQgdGhpcy5raWxsVUlDbGllbnQoe3BpZDogdWlDbGllbnRQaWR9KSkge1xuICAgICAgICAgIGxvZy5pbmZvKGBEZXRlY3RlZCB0aGUgU2ltdWxhdG9yIFVJIGNsaWVudCB3YXMgcnVubmluZyBhbmQga2lsbGVkIGl0LiBWZXJpZnlpbmcgdGhlIGN1cnJlbnQgU2ltdWxhdG9yIHN0YXRlYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBTdG9wcGluZyB0aGUgVUkgY2xpZW50IGtpbGxzIGFsbCBydW5uaW5nIHNlcnZlcnMgZm9yIHNvbWUgZWFybHkgWENvZGUgdmVyc2lvbnMuIFRoaXMgaXMgYSBrbm93biBidWdcbiAgICAgICAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IGF3YWl0IHRoaXMuaXNTaHV0ZG93bigpLCB7XG4gICAgICAgICAgICB3YWl0TXM6IDUwMDAsXG4gICAgICAgICAgICBpbnRlcnZhbE1zOiAxMDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoIWF3YWl0IHRoaXMuaXNSdW5uaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2ltdWxhdG9yIHdpdGggVURJRCAnJHt0aGlzLnVkaWR9JyBjYW5ub3QgYmUgdHJhbnNpdGlvbmVkIHRvIGhlYWRsZXNzIG1vZGVgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxvZy5pbmZvKGBCb290aW5nIFNpbXVsYXRvciB3aXRoIFVESUQgJyR7dGhpcy51ZGlkfScgaW4gaGVhZGxlc3MgbW9kZS4gYCArXG4gICAgICAgICAgYEFsbCBVSS1yZWxhdGVkIGNhcGFiaWxpdGllcyBhcmUgZ29pbmcgdG8gYmUgaWdub3JlZGApO1xuICAgICAgICBhd2FpdCB0aGlzLmJvb3QoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc1NlcnZlclJ1bm5pbmcgJiYgdWlDbGllbnRQaWQpIHtcbiAgICAgICAgICBsb2cuaW5mbyhgQm90aCBTaW11bGF0b3Igd2l0aCBVRElEICcke3RoaXMudWRpZH0nIGFuZCB0aGUgVUkgY2xpZW50IGFyZSBjdXJyZW50bHkgcnVubmluZ2ApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNTZXJ2ZXJSdW5uaW5nKSB7XG4gICAgICAgICAgbG9nLmluZm8oYFNpbXVsYXRvciAnJHt0aGlzLnVkaWR9JyBpcyBib290ZWQgd2hpbGUgaXRzIFVJIGlzIG5vdCB2aXNpYmxlLiBgICtcbiAgICAgICAgICAgIGBUcnlpbmcgdG8gcmVzdGFydCBpdCB3aXRoIHRoZSBTaW11bGF0b3Igd2luZG93IHZpc2libGVgKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNodXRkb3duKHt0aW1lb3V0OiBTSU1VTEFUT1JfU0hVVERPV05fVElNRU9VVH0pO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMubGF1bmNoV2luZG93KHVpQ2xpZW50UGlkLCBvcHRzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgaWYgKHNob3VsZFdhaXRGb3JCb290KSB7XG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JCb290KG9wdHMuc3RhcnR1cFRpbWVvdXQpO1xuICAgICAgbG9nLmluZm8oYFNpbXVsYXRvciB3aXRoIFVESUQgJHt0aGlzLnVkaWR9IGJvb3RlZCBpbiAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNTZWNvbmRzLnRvRml4ZWQoMyl9c2ApO1xuICAgIH1cbiAgfVxuXG4gIC8qKipcbiAgICogQm9vdHMgc2ltdWxhdG9yIGFuZCBvcGVucyBzaW11bGF0b3JzIFVJIENsaWVudCBpZiBub3QgYWxyZWFkeSBvcGVuZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNVaUNsaWVudFJ1bm5pbmcgLSBwcm9jZXNzIGlkIG9mIHNpbXVsYXRvciBVSSBjbGllbnQuXG4gICAqIEBwYXJhbSB7UnVuT3B0aW9uc30gb3B0cyAtIGFyZ3VtZW50cyB0byBzdGFydCBzaW11bGF0b3IgVUkgY2xpZW50IHdpdGguXG4gICAqL1xuICBhc3luYyBsYXVuY2hXaW5kb3cgKGlzVWlDbGllbnRSdW5uaW5nLCBvcHRzID0ge30pIHtcbiAgICBhd2FpdCB0aGlzLmJvb3QoKTtcbiAgICBpZiAoIWlzVWlDbGllbnRSdW5uaW5nKSB7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0VUlDbGllbnQob3B0cyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJvb3RzIFNpbXVsYXRvciBpZiBub3QgYWxyZWFkeSBib290ZWQuXG4gICAqIERvZXMgbm90aGluZyBpZiBpdCBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4gICAqIFRoaXMgQVBJIGRvZXMgTk9UIHdhaXQgdW50aWwgU2ltdWxhdG9yIGlzIGZ1bGx5IGJvb3RlZC5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgYm9vdGluZyB0aGUgU2ltdWxhdG9yLlxuICAgKi9cbiAgYXN5bmMgYm9vdCAoKSB7XG4gICAgY29uc3QgYm9vdEV2ZW50c0VtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgYXdhaXQgdGhpcy5zaW1jdGwuc3RhcnRCb290TW9uaXRvcih7XG4gICAgICBvbkVycm9yOiAoZXJyKSA9PiBib290RXZlbnRzRW1pdHRlci5lbWl0KCdmYWlsdXJlJywgZXJyKSxcbiAgICAgIG9uRmluaXNoZWQ6ICgpID0+IGJvb3RFdmVudHNFbWl0dGVyLmVtaXQoJ2ZpbmlzaCcpLFxuICAgICAgc2hvdWxkUHJlYm9vdDogdHJ1ZSxcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAvLyBIaXN0b3JpY2FsbHkgdGhpcyBjYWxsIHdhcyBhbHdheXMgYXN5bmNocm9ub3VzLFxuICAgICAgICAvLyBlLmcuIGl0IHdhcyBub3Qgd2FpdGluZyB1bnRpbCBTaW11bGF0b3IgaXMgZnVsbHkgYm9vdGVkLlxuICAgICAgICAvLyBTbyB3ZSBwcmVzZXJ2ZSB0aGF0IGJlaGF2aW9yLCBhbmQgaWYgbm8gZXJyb3JzIGFyZSByZWNlaXZlZCBmb3IgYSB3aGlsZVxuICAgICAgICAvLyB0aGVuIHdlIGFzc3VtZSB0aGUgU2ltdWxhdG9yIGJvb3RpbmcgaXMgc3RpbGwgaW4gcHJvZ3Jlc3MuXG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgMzAwMCk7XG4gICAgICAgIGJvb3RFdmVudHNFbWl0dGVyLm9uY2UoJ2ZhaWx1cmUnLCAoZXJyKSA9PiB7XG4gICAgICAgICAgaWYgKF8uaW5jbHVkZXMoZXJyPy5tZXNzYWdlLCAnc3RhdGU6IEJvb3RlZCcpKSB7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJvb3RFdmVudHNFbWl0dGVyLm9uY2UoJ2ZpbmlzaCcsIHJlc29sdmUpO1xuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGJvb3RFdmVudHNFbWl0dGVyLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIHZlcmlmaWNhdGlvbiBvZiBkZXZpY2UgcHJlZmVyZW5jZXMgY29ycmVjdG5lc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7RGV2aWNlUHJlZmVyZW5jZXN9IHByZWZzIFt7fV0gLSBUaGUgcHJlZmVyZW5jZXMgdG8gYmUgdmVyaWZpZWRcbiAgICogQHRocm93cyB7RXJyb3J9IElmIGFueSBvZiB0aGUgZ2l2ZW4gcHJlZmVyZW5jZSB2YWx1ZXMgZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkXG4gICAqIGZvcm1hdC5cbiAgICovXG4gIHZlcmlmeURldmljZVByZWZlcmVuY2VzIChwcmVmcyA9IHt9KSB7XG4gICAgaWYgKF8uaXNFbXB0eShwcmVmcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocHJlZnMuU2ltdWxhdG9yV2luZG93TGFzdFNjYWxlKSkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHByZWZzLlNpbXVsYXRvcldpbmRvd0xhc3RTY2FsZSkgfHwgcHJlZnMuU2ltdWxhdG9yV2luZG93TGFzdFNjYWxlIDw9IDApIHtcbiAgICAgICAgbG9nLmVycm9yQW5kVGhyb3coYFNpbXVsYXRvcldpbmRvd0xhc3RTY2FsZSBpcyBleHBlY3RlZCB0byBiZSBhIHBvc2l0aXZlIGZsb2F0IHZhbHVlLiBgICtcbiAgICAgICAgICBgJyR7cHJlZnMuU2ltdWxhdG9yV2luZG93TGFzdFNjYWxlfScgaXMgYXNzaWduZWQgaW5zdGVhZC5gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocHJlZnMuU2ltdWxhdG9yV2luZG93Q2VudGVyKSkge1xuICAgICAgLy8gaHR0cHM6Ly9yZWdleDEwMS5jb20vci8yWlhPaWovMlxuICAgICAgY29uc3QgdmVyaWZpY2F0aW9uUGF0dGVybiA9IC97LT9cXGQrKFxcLlxcZCspPywtP1xcZCsoXFwuXFxkKyk/fS87XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocHJlZnMuU2ltdWxhdG9yV2luZG93Q2VudGVyKSB8fCAhdmVyaWZpY2F0aW9uUGF0dGVybi50ZXN0KHByZWZzLlNpbXVsYXRvcldpbmRvd0NlbnRlcikpIHtcbiAgICAgICAgbG9nLmVycm9yQW5kVGhyb3coYFNpbXVsYXRvcldpbmRvd0NlbnRlciBpcyBleHBlY3RlZCB0byBtYXRjaCBcIntmbG9hdFhQb3NpdGlvbixmbG9hdFlQb3NpdGlvbn1cIiBmb3JtYXQgKHdpdGhvdXQgc3BhY2VzKS4gYCArXG4gICAgICAgICAgYCcke3ByZWZzLlNpbXVsYXRvcldpbmRvd0NlbnRlcn0nIGlzIGFzc2lnbmVkIGluc3RlYWQuYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHByZWZzLlNpbXVsYXRvcldpbmRvd09yaWVudGF0aW9uKSkge1xuICAgICAgY29uc3QgYWNjZXB0YWJsZVZhbHVlcyA9IFsnUG9ydHJhaXQnLCAnTGFuZHNjYXBlTGVmdCcsICdQb3J0cmFpdFVwc2lkZURvd24nLCAnTGFuZHNjYXBlUmlnaHQnXTtcbiAgICAgIGlmIChhY2NlcHRhYmxlVmFsdWVzLmluZGV4T2YocHJlZnMuU2ltdWxhdG9yV2luZG93T3JpZW50YXRpb24pID09PSAtMSkge1xuICAgICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgU2ltdWxhdG9yV2luZG93T3JpZW50YXRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgb25lIG9mICR7YWNjZXB0YWJsZVZhbHVlc30uIGAgK1xuICAgICAgICAgIGAnJHtwcmVmcy5TaW11bGF0b3JXaW5kb3dPcmllbnRhdGlvbn0nIGlzIGFzc2lnbmVkIGluc3RlYWQuYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHByZWZzLlNpbXVsYXRvcldpbmRvd1JvdGF0aW9uQW5nbGUpKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocHJlZnMuU2ltdWxhdG9yV2luZG93Um90YXRpb25BbmdsZSkpIHtcbiAgICAgICAgbG9nLmVycm9yQW5kVGhyb3coYFNpbXVsYXRvcldpbmRvd1JvdGF0aW9uQW5nbGUgaXMgZXhwZWN0ZWQgdG8gYmUgYSB2YWxpZCBudW1iZXIuIGAgK1xuICAgICAgICAgIGAnJHtwcmVmcy5TaW11bGF0b3JXaW5kb3dSb3RhdGlvbkFuZ2xlfScgaXMgYXNzaWduZWQgaW5zdGVhZC5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBjb21tb24gaU9TIFNpbXVsYXRvciBwcmVmZXJlbmNlcyBmaWxlIHdpdGggbmV3IHZhbHVlcy5cbiAgICogSXQgaXMgbmVjZXNzYXJ5IHRvIHJlc3RhcnQgdGhlIGNvcnJlc3BvbmRpbmcgU2ltdWxhdG9yIGJlZm9yZVxuICAgKiB0aGVzZSBjaGFuZ2VzIGFyZSBhcHBsaWVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0RldmljZVByZWZlcmVuY2VzfSBkZXZpY2VQcmVmcyBbe31dIC0gVGhlIG1hcHBpbmcsIHdoaWNoIHJlcHJlc2VudHMgbmV3IGRldmljZSBwcmVmZXJlbmNlIHZhbHVlc1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBnaXZlbiBTaW11bGF0b3IuXG4gICAqIEBwYXJhbSB7Q29tbW9uUHJlZmVyZW5jZXN9IGNvbW1vblByZWZzIFt7fV0gLSBUaGUgbWFwcGluZywgd2hpY2ggcmVwcmVzZW50cyBuZXcgY29tbW9uIHByZWZlcmVuY2UgdmFsdWVzXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYWxsIFNpbXVsYXRvcnMuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHByZWZlcmVuY2VzIHdlcmUgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQuXG4gICAqL1xuICBhc3luYyB1cGRhdGVQcmVmZXJlbmNlcyAoZGV2aWNlUHJlZnMgPSB7fSwgY29tbW9uUHJlZnMgPSB7fSkge1xuICAgIGlmICghXy5pc0VtcHR5KGRldmljZVByZWZzKSkge1xuICAgICAgbG9nLmRlYnVnKGBTZXR0aW5nIHByZWZlcmVuY2VzIG9mICR7dGhpcy51ZGlkfSBTaW11bGF0b3IgdG8gJHtKU09OLnN0cmluZ2lmeShkZXZpY2VQcmVmcyl9YCk7XG4gICAgfVxuICAgIGlmICghXy5pc0VtcHR5KGNvbW1vblByZWZzKSkge1xuICAgICAgbG9nLmRlYnVnKGBTZXR0aW5nIGNvbW1vbiBTaW11bGF0b3IgcHJlZmVyZW5jZXMgdG8gJHtKU09OLnN0cmluZ2lmeShjb21tb25QcmVmcyl9YCk7XG4gICAgfVxuICAgIGNvbnN0IGhvbWVGb2xkZXJQYXRoID0gcHJvY2Vzcy5lbnYuSE9NRTtcbiAgICBpZiAoIWhvbWVGb2xkZXJQYXRoKSB7XG4gICAgICBsb2cud2FybihgQ2Fubm90IGdldCB0aGUgcGF0aCB0byBIT01FIGZvbGRlciBmcm9tIHRoZSBwcm9jZXNzIGVudmlyb25tZW50LiBgICtcbiAgICAgICAgYElnbm9yaW5nIFNpbXVsYXRvciBwcmVmZXJlbmNlcyB1cGRhdGUuYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMudmVyaWZ5RGV2aWNlUHJlZmVyZW5jZXMoZGV2aWNlUHJlZnMpO1xuICAgIGNvbnN0IHBsaXN0UGF0aCA9IHBhdGgucmVzb2x2ZShob21lRm9sZGVyUGF0aCwgJ0xpYnJhcnknLCAnUHJlZmVyZW5jZXMnLCAnY29tLmFwcGxlLmlwaG9uZXNpbXVsYXRvci5wbGlzdCcpO1xuICAgIHJldHVybiBhd2FpdCBwcmVmZXJlbmNlc1BsaXN0R3VhcmQuYWNxdWlyZShTaW11bGF0b3JYY29kZTkubmFtZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGVmYXVsdHMgPSBuZXcgTlNVc2VyRGVmYXVsdHMocGxpc3RQYXRoKTtcbiAgICAgIGNvbnN0IHByZWZzVG9VcGRhdGUgPSBfLmNsb25lKGNvbW1vblByZWZzKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghXy5pc0VtcHR5KGRldmljZVByZWZzKSkge1xuICAgICAgICAgIGxldCBleGlzdGluZ0RldmljZVByZWZzO1xuICAgICAgICAgIGNvbnN0IHVkaWRLZXkgPSB0aGlzLnVkaWQudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKHBsaXN0UGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQbGlzdENvbnRlbnQgPSBhd2FpdCBkZWZhdWx0cy5hc0pzb24oKTtcbiAgICAgICAgICAgIGlmIChfLmlzUGxhaW5PYmplY3QoY3VycmVudFBsaXN0Q29udGVudC5EZXZpY2VQcmVmZXJlbmNlcylcbiAgICAgICAgICAgICAgICAmJiBfLmlzUGxhaW5PYmplY3QoY3VycmVudFBsaXN0Q29udGVudC5EZXZpY2VQcmVmZXJlbmNlc1t1ZGlkS2V5XSkpIHtcbiAgICAgICAgICAgICAgZXhpc3RpbmdEZXZpY2VQcmVmcyA9IGN1cnJlbnRQbGlzdENvbnRlbnQuRGV2aWNlUHJlZmVyZW5jZXNbdWRpZEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIE9iamVjdC5hc3NpZ24ocHJlZnNUb1VwZGF0ZSwge1xuICAgICAgICAgICAgRGV2aWNlUHJlZmVyZW5jZXM6IHtcbiAgICAgICAgICAgICAgW3VkaWRLZXldOiBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZ0RldmljZVByZWZzIHx8IHt9LCBkZXZpY2VQcmVmcylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBkZWZhdWx0cy51cGRhdGUocHJlZnNUb1VwZGF0ZSk7XG4gICAgICAgIGxvZy5kZWJ1ZyhgVXBkYXRlZCAke3RoaXMudWRpZH0gU2ltdWxhdG9yIHByZWZlcmVuY2VzIGF0ICcke3BsaXN0UGF0aH0nIHdpdGggYCArXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkocHJlZnNUb1VwZGF0ZSkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nLndhcm4oYENhbm5vdCB1cGRhdGUgJHt0aGlzLnVkaWR9IFNpbXVsYXRvciBwcmVmZXJlbmNlcyBhdCAnJHtwbGlzdFBhdGh9Jy4gYCArXG4gICAgICAgICAgYFRyeSB0byBkZWxldGUgdGhlIGZpbGUgbWFudWFsbHkgaW4gb3JkZXIgdG8gcmVzZXQgaXQuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoZSBjdXJyZW50IFNpbXVsYXRvciB0byB0aGUgY2xlYW4gc3RhdGUuXG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgYXN5bmMgY2xlYW4gKCkge1xuICAgIGxvZy5pbmZvKGBDbGVhbmluZyBzaW11bGF0b3IgJHt0aGlzLnVkaWR9YCk7XG4gICAgYXdhaXQgdGhpcy5zaW1jdGwuZXJhc2VEZXZpY2UoMTAwMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqIEBvdmVycmlkZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYXN5bmMgX2FjdGl2YXRlV2luZG93ICgpIHtcbiAgICBsZXQgc2VsZk5hbWU7XG4gICAgbGV0IHNlbGZTZGs7XG4gICAgbGV0IGJvb3RlZERldmljZXNDb3VudCA9IDA7XG4gICAgZm9yIChjb25zdCBbc2RrLCBkZXZpY2VBcnJdIG9mIF8udG9QYWlycyhhd2FpdCB0aGlzLnNpbWN0bC5nZXREZXZpY2VzKCkpKSB7XG4gICAgICBmb3IgKGNvbnN0IHtzdGF0ZSwgdWRpZCwgbmFtZX0gb2YgZGV2aWNlQXJyKSB7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gJ0Jvb3RlZCcpIHtcbiAgICAgICAgICBib290ZWREZXZpY2VzQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNlbGZOYW1lICYmIHVkaWQgPT09IHRoaXMudWRpZCkge1xuICAgICAgICAgIHNlbGZTZGsgPSBzZGs7XG4gICAgICAgICAgc2VsZk5hbWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChib290ZWREZXZpY2VzQ291bnQgPCAyKSB7XG4gICAgICByZXR1cm4gYXdhaXQgc3VwZXIuX2FjdGl2YXRlV2luZG93KCk7XG4gICAgfVxuXG4gICAgLy8gVGhlcmUgYXJlIHBvdGVudGlhbGx5IG1vcmUgdGhhdCBvbmUgU2ltdWxhdG9yIHdpbmRvd1xuICAgIHJldHVybiBgXG4gICAgICB0ZWxsIGFwcGxpY2F0aW9uIFwiU3lzdGVtIEV2ZW50c1wiXG4gICAgICAgIHRlbGwgcHJvY2VzcyBcIlNpbXVsYXRvclwiXG4gICAgICAgICAgc2V0IGZyb250bW9zdCB0byBmYWxzZVxuICAgICAgICAgIHNldCBmcm9udG1vc3QgdG8gdHJ1ZVxuICAgICAgICAgIGNsaWNrIChtZW51IGl0ZW0gMSB3aGVyZSAoaXRzIG5hbWUgY29udGFpbnMgXCIke3NlbGZOYW1lfSBcIiBhbmQgaXRzIG5hbWUgY29udGFpbnMgXCIke3NlbGZTZGt9XCIpKSBvZiBtZW51IDEgb2YgbWVudSBiYXIgaXRlbSBcIldpbmRvd1wiIG9mIG1lbnUgYmFyIDFcbiAgICAgICAgZW5kIHRlbGxcbiAgICAgIGVuZCB0ZWxsXG4gICAgYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdGRvY1xuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIGFzeW5jIGlzQmlvbWV0cmljRW5yb2xsZWQgKCkge1xuICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgdGhpcy5zaW1jdGwuc3Bhd25Qcm9jZXNzKFtcbiAgICAgICdub3RpZnl1dGlsJyxcbiAgICAgICctZycsIEVOUk9MTE1FTlRfTk9USUZJQ0FUSU9OX1JFQ0VJVkVSXG4gICAgXSk7XG4gICAgY29uc3QgbWF0Y2ggPSAobmV3IFJlZ0V4cChgJHtfLmVzY2FwZVJlZ0V4cChFTlJPTExNRU5UX05PVElGSUNBVElPTl9SRUNFSVZFUil9XFxcXHMrKFswMV0pYCkpXG4gICAgICAuZXhlYyhzdGRvdXQpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlIGJpb21ldHJpYyBlbnJvbGxtZW50IHN0YXRlIGZyb20gJyR7c3Rkb3V0fSdgKTtcbiAgICB9XG4gICAgbG9nLmluZm8oYEN1cnJlbnQgYmlvbWV0cmljIGVucm9sbGVkIHN0YXRlIGZvciAke3RoaXMudWRpZH0gU2ltdWxhdG9yOiAke21hdGNoWzFdfWApO1xuICAgIHJldHVybiBtYXRjaFsxXSA9PT0gJzEnO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgYXN5bmMgZW5yb2xsQmlvbWV0cmljIChpc0VuYWJsZWQgPSB0cnVlKSB7XG4gICAgbG9nLmRlYnVnKGBTZXR0aW5nIGJpb21ldHJpYyBlbnJvbGxlZCBzdGF0ZSBmb3IgJHt0aGlzLnVkaWR9IFNpbXVsYXRvciB0byAnJHtpc0VuYWJsZWQgPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfSdgKTtcbiAgICBhd2FpdCB0aGlzLnNpbWN0bC5zcGF3blByb2Nlc3MoW1xuICAgICAgJ25vdGlmeXV0aWwnLFxuICAgICAgJy1zJywgRU5ST0xMTUVOVF9OT1RJRklDQVRJT05fUkVDRUlWRVIsIGlzRW5hYmxlZCA/ICcxJyA6ICcwJ1xuICAgIF0pO1xuICAgIGF3YWl0IHRoaXMuc2ltY3RsLnNwYXduUHJvY2VzcyhbXG4gICAgICAnbm90aWZ5dXRpbCcsXG4gICAgICAnLXAnLCBFTlJPTExNRU5UX05PVElGSUNBVElPTl9SRUNFSVZFUlxuICAgIF0pO1xuICAgIGlmIChhd2FpdCB0aGlzLmlzQmlvbWV0cmljRW5yb2xsZWQoKSAhPT0gaXNFbmFibGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzZXQgYmlvbWV0cmljIGVucm9sbGVkIHN0YXRlIGZvciAke3RoaXMudWRpZH0gU2ltdWxhdG9yIHRvICcke2lzRW5hYmxlZCA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCd9J2ApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIG5vdGlmaWNhdGlvbiB0byBtYXRjaC9ub3QgbWF0Y2ggdGhlIHBhcnRpY3VsYXIgYmlvbWV0cmljLlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHBhcmFtIHs/Ym9vbGVhbn0gc2hvdWxkTWF0Y2ggW3RydWVdIC0gU2V0IGl0IHRvIHRydWUgb3IgZmFsc2UgaW4gb3JkZXIgdG8gZW11bGF0ZVxuICAgKiBtYXRjaGluZy9ub3QgbWF0Y2hpbmcgdGhlIGNvcnJlc3BvbmRpbmcgYmlvbWV0cmljXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gYmlvbWV0cmljTmFtZSBbdG91Y2hJZF0gLSBFaXRoZXIgdG91Y2hJZCBvciBmYWNlSWQgKGZhY2VJZCBpcyBvbmx5IGF2YWlsYWJsZSBzaW5jZSBpT1MgMTEpXG4gICAqL1xuICBhc3luYyBzZW5kQmlvbWV0cmljTWF0Y2ggKHNob3VsZE1hdGNoID0gdHJ1ZSwgYmlvbWV0cmljTmFtZSA9ICd0b3VjaElkJykge1xuICAgIGNvbnN0IGRvbWFpbkNvbXBvbmVudCA9IHRvQmlvbWV0cmljRG9tYWluQ29tcG9uZW50KGJpb21ldHJpY05hbWUpO1xuICAgIGNvbnN0IGRvbWFpbiA9IGBjb20uYXBwbGUuQmlvbWV0cmljS2l0X1NpbS4ke2RvbWFpbkNvbXBvbmVudH0uJHtzaG91bGRNYXRjaCA/ICcnIDogJ25vJ31tYXRjaGA7XG4gICAgYXdhaXQgdGhpcy5zaW1jdGwuc3Bhd25Qcm9jZXNzKFtcbiAgICAgICdub3RpZnl1dGlsJyxcbiAgICAgICctcCcsIGRvbWFpblxuICAgIF0pO1xuICAgIGxvZy5pbmZvKGBTZW50IG5vdGlmaWNhdGlvbiAke2RvbWFpbn0gdG8gJHtzaG91bGRNYXRjaCA/ICdtYXRjaCcgOiAnbm90IG1hdGNoJ30gJHtiaW9tZXRyaWNOYW1lfSBiaW9tZXRyaWMgYCArXG4gICAgICBgZm9yICR7dGhpcy51ZGlkfSBTaW11bGF0b3JgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIGFzeW5jIGdldExhdW5jaERhZW1vbnNSb290ICgpIHtcbiAgICBjb25zdCBkZXZSb290ID0gYXdhaXQgZ2V0RGV2ZWxvcGVyUm9vdCgpO1xuICAgIHJldHVybiBwYXRoLnJlc29sdmUoZGV2Um9vdCxcbiAgICAgICdQbGF0Zm9ybXMvaVBob25lT1MucGxhdGZvcm0vRGV2ZWxvcGVyL0xpYnJhcnkvQ29yZVNpbXVsYXRvci9Qcm9maWxlcy9SdW50aW1lcy9pT1Muc2ltcnVudGltZS9Db250ZW50cy9SZXNvdXJjZXMvUnVudGltZVJvb3QvU3lzdGVtL0xpYnJhcnkvTGF1bmNoRGFlbW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEtleWJvYXJkT3B0aW9uc1xuICAgKiBAcHJvcGVydHkgeyFzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGtleWJvYXJkIGxvY2FsZSwgZm9yIGV4YW1wbGUgYGVuX1VTYCBvciBgZGVfQ0hgXG4gICAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gbGF5b3V0IFRoZSBrZXlib2FyZCBsYXlvdXQsIGZvciBleGFtcGxlIGBRVUVSVFlgIG9yIGBVa3JhaW5pYW5gXG4gICAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaGFyZHdhcmUgQ291bGQgZWl0aGVyIGJlIGBBdXRvbWF0aWNgIG9yIGBudWxsYFxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gTGFuZ3VhZ2VPcHRpb25zXG4gICAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgbGFuZ3VhZ2UsIGZvciBleGFtcGxlIGBkZWAgb3IgYHpoLUhhbnQtQ05gXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMb2NhbGVPcHRpb25zXG4gICAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3lzdGVtIGxvY2FsZSwgZm9yIGV4YW1wbGUgYGRlX0NIYCBvciBgemhfQ05gXG4gICAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gY2FsZW5kYXIgT3B0aW9uYWwgY2FsZW5kYXIgZm9ybWF0LCBmb3IgZXhhbXBsZSBgZ3JlZ29yaWFuYCBvciBgcGVyc2lhbmBcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IExvY2FsaXphdGlvbk9wdGlvbnNcbiAgICogQHByb3BlcnR5IHs/S2V5Ym9hcmRPcHRpb25zfSBrZXlib2FyZFxuICAgKiBAcHJvcGVydHkgez9MYW5ndWFnZU9wdGlvbnN9IGxhbmd1YWdlXG4gICAqIEBwcm9wZXJ0eSB7P0xvY2FsZU9wdGlvbnN9IGxvY2FsZVxuICAgKi9cblxuICAvKipcbiAgICogQ2hhbmdlIGxvY2FsaXphdGlvbiBzZXR0aW5ncyBvbiB0aGUgY3VycmVudGx5IGJvb3RlZCBzaW11bGF0b3JcbiAgICpcbiAgICogQHBhcmFtIHs/TG9jYWxpemF0aW9uT3B0aW9uc30gb3B0c1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSBzZXR0aW5nIHRoZSBwcmVmZXJlbmNlc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIGFueSBvZiBzZXR0aW5ncyBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgY2hhbmdlZFxuICAgKi9cbiAgYXN5bmMgY29uZmlndXJlTG9jYWxpemF0aW9uIChvcHRzID0ge30pIHtcbiAgICBpZiAoXy5pc0VtcHR5KG9wdHMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgeyBsYW5ndWFnZSwgbG9jYWxlLCBrZXlib2FyZCB9ID0gb3B0cztcbiAgICBjb25zdCBnbG9iYWxQcmVmcyA9IHt9O1xuICAgIGxldCBrZXlib2FyZElkID0gbnVsbDtcbiAgICBpZiAoXy5pc1BsYWluT2JqZWN0KGtleWJvYXJkKSkge1xuICAgICAgY29uc3QgeyBuYW1lLCBsYXlvdXQsIGhhcmR3YXJlIH0gPSBrZXlib2FyZDtcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAna2V5Ym9hcmQnIGZpZWxkIG11c3QgaGF2ZSBhIHZhbGlkIG5hbWUgc2V0YCk7XG4gICAgICB9XG4gICAgICBpZiAoIWxheW91dCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAna2V5Ym9hcmQnIGZpZWxkIG11c3QgaGF2ZSBhIHZhbGlkIGxheW91dCBzZXRgKTtcbiAgICAgIH1cbiAgICAgIGtleWJvYXJkSWQgPSBgJHtuYW1lfUBzdz0ke2xheW91dH1gO1xuICAgICAgaWYgKGhhcmR3YXJlKSB7XG4gICAgICAgIGtleWJvYXJkSWQgKz0gYDtAaHc9JHtoYXJkd2FyZX1gO1xuICAgICAgfVxuICAgICAgZ2xvYmFsUHJlZnMuQXBwbGVLZXlib2FyZHMgPSBba2V5Ym9hcmRJZF07XG4gICAgfVxuICAgIGlmIChfLmlzUGxhaW5PYmplY3QobGFuZ3VhZ2UpKSB7XG4gICAgICBjb25zdCB7IG5hbWUgfSA9IGxhbmd1YWdlO1xuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICdsYW5ndWFnZScgZmllbGQgbXVzdCBoYXZlIGEgdmFsaWQgbmFtZSBzZXRgKTtcbiAgICAgIH1cbiAgICAgIGdsb2JhbFByZWZzLkFwcGxlTGFuZ3VhZ2VzID0gW25hbWVdO1xuICAgIH1cbiAgICBpZiAoXy5pc1BsYWluT2JqZWN0KGxvY2FsZSkpIHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgY2FsZW5kYXIgfSA9IGxvY2FsZTtcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAnbG9jYWxlJyBmaWVsZCBtdXN0IGhhdmUgYSB2YWxpZCBuYW1lIHNldGApO1xuICAgICAgfVxuICAgICAgbGV0IGxvY2FsZUlkID0gbmFtZTtcbiAgICAgIGlmIChjYWxlbmRhcikge1xuICAgICAgICBsb2NhbGVJZCArPSBgQGNhbGVuZGFyPSR7Y2FsZW5kYXJ9YDtcbiAgICAgIH1cbiAgICAgIGdsb2JhbFByZWZzLkFwcGxlTG9jYWxlID0gbG9jYWxlSWQ7XG4gICAgfVxuICAgIGlmIChfLmlzRW1wdHkoZ2xvYmFsUHJlZnMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgYXJnQ2h1bmtzID0gZ2VuZXJhdGVEZWZhdWx0c0NvbW1hbmRBcmdzKGdsb2JhbFByZWZzLCB0cnVlKTtcbiAgICBhd2FpdCBCLmFsbChhcmdDaHVua3MubWFwKChhcmdzKSA9PiB0aGlzLnNpbWN0bC5zcGF3blByb2Nlc3MoW1xuICAgICAgJ2RlZmF1bHRzJywgJ3dyaXRlJywgJy5HbG9iYWxQcmVmZXJlbmNlcy5wbGlzdCcsIC4uLmFyZ3NcbiAgICBdKSkpO1xuXG4gICAgaWYgKGtleWJvYXJkSWQpIHtcbiAgICAgIGNvbnN0IGFyZ0NodW5rcyA9IGdlbmVyYXRlRGVmYXVsdHNDb21tYW5kQXJncyh7XG4gICAgICAgIEtleWJvYXJkc0N1cnJlbnRBbmROZXh0OiBba2V5Ym9hcmRJZF0sXG4gICAgICAgIEtleWJvYXJkTGFzdFVzZWQ6IGtleWJvYXJkSWQsXG4gICAgICAgIEtleWJvYXJkTGFzdFVzZWRGb3JMYW5ndWFnZTogeyBba2V5Ym9hcmQubmFtZV06IGtleWJvYXJkSWQgfVxuICAgICAgfSwgdHJ1ZSk7XG4gICAgICBhd2FpdCBCLmFsbChhcmdDaHVua3MubWFwKChhcmdzKSA9PiB0aGlzLnNpbWN0bC5zcGF3blByb2Nlc3MoW1xuICAgICAgICAnZGVmYXVsdHMnLCAnd3JpdGUnLCAnY29tLmFwcGxlLlByZWZlcmVuY2VzJywgLi4uYXJnc1xuICAgICAgXSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IFNpbXVsYXRvclhjb2RlOTtcbiJdLCJmaWxlIjoibGliL3NpbXVsYXRvci14Y29kZS05LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
|
package/lib/simulator-xcode-9.js
CHANGED
|
@@ -4,10 +4,11 @@ import path from 'path';
|
|
|
4
4
|
import { fs, timing } from 'appium-support';
|
|
5
5
|
import AsyncLock from 'async-lock';
|
|
6
6
|
import log from './logger';
|
|
7
|
-
import { waitForCondition
|
|
7
|
+
import { waitForCondition } from 'asyncbox';
|
|
8
8
|
import { toBiometricDomainComponent, getDeveloperRoot } from './utils.js';
|
|
9
9
|
import { NSUserDefaults, generateDefaultsCommandArgs } from './defaults-utils';
|
|
10
10
|
import B from 'bluebird';
|
|
11
|
+
import { EventEmitter } from 'events';
|
|
11
12
|
|
|
12
13
|
const SIMULATOR_SHUTDOWN_TIMEOUT = 15 * 1000;
|
|
13
14
|
const startupLock = new AsyncLock();
|
|
@@ -177,30 +178,38 @@ class SimulatorXcode9 extends SimulatorXcode8 {
|
|
|
177
178
|
}
|
|
178
179
|
|
|
179
180
|
/**
|
|
180
|
-
* Boots
|
|
181
|
+
* Boots Simulator if not already booted.
|
|
181
182
|
* Does nothing if it is already running.
|
|
183
|
+
* This API does NOT wait until Simulator is fully booted.
|
|
182
184
|
*
|
|
183
|
-
* @throws {Error} If
|
|
185
|
+
* @throws {Error} If there was a failure while booting the Simulator.
|
|
184
186
|
*/
|
|
185
187
|
async boot () {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
188
|
+
const bootEventsEmitter = new EventEmitter();
|
|
189
|
+
await this.simctl.startBootMonitor({
|
|
190
|
+
onError: (err) => bootEventsEmitter.emit('failure', err),
|
|
191
|
+
onFinished: () => bootEventsEmitter.emit('finish'),
|
|
192
|
+
shouldPreboot: true,
|
|
193
|
+
});
|
|
192
194
|
try {
|
|
193
|
-
await
|
|
194
|
-
|
|
195
|
-
|
|
195
|
+
await new B((resolve, reject) => {
|
|
196
|
+
// Historically this call was always asynchronous,
|
|
197
|
+
// e.g. it was not waiting until Simulator is fully booted.
|
|
198
|
+
// So we preserve that behavior, and if no errors are received for a while
|
|
199
|
+
// then we assume the Simulator booting is still in progress.
|
|
200
|
+
setTimeout(resolve, 3000);
|
|
201
|
+
bootEventsEmitter.once('failure', (err) => {
|
|
202
|
+
if (_.includes(err?.message, 'state: Booted')) {
|
|
203
|
+
resolve();
|
|
204
|
+
} else {
|
|
205
|
+
reject(err);
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
bootEventsEmitter.once('finish', resolve);
|
|
209
|
+
});
|
|
210
|
+
} finally {
|
|
211
|
+
bootEventsEmitter.removeAllListeners();
|
|
196
212
|
}
|
|
197
|
-
|
|
198
|
-
await retryInterval(5, 1000, async () => {
|
|
199
|
-
if (!await this.isRunning()) {
|
|
200
|
-
throw new Error(`Simulator '${this.udid}' is not running after being booted. ` +
|
|
201
|
-
`Check the Appium log for more details.`);
|
|
202
|
-
}
|
|
203
|
-
});
|
|
204
213
|
}
|
|
205
214
|
|
|
206
215
|
/**
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"keywords": [
|
|
5
5
|
"appium"
|
|
6
6
|
],
|
|
7
|
-
"version": "3.28.
|
|
7
|
+
"version": "3.28.2",
|
|
8
8
|
"author": "appium",
|
|
9
9
|
"license": "Apache-2.0",
|
|
10
10
|
"repository": {
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"asyncbox": "^2.3.1",
|
|
37
37
|
"bluebird": "^3.5.1",
|
|
38
38
|
"lodash": "^4.2.1",
|
|
39
|
-
"node-simctl": "^6.
|
|
39
|
+
"node-simctl": "^6.6.0",
|
|
40
40
|
"semver": "^7.0.0",
|
|
41
41
|
"source-map-support": "^0.5.3",
|
|
42
42
|
"teen_process": "^1.3.0",
|