UNPKG

appium-webdriveragent-driver

Version:
430 lines (344 loc) 27 kB
'use strict'; var _regeneratorRuntime = require('babel-runtime/regenerator')['default']; var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default']; var _this = this; var _ = require('../..'); var _libSimulatorManagementJs = require('../../lib/simulatorManagement.js'); var _chai = require('chai'); var _chai2 = _interopRequireDefault(_chai); var _chaiAsPromised = require('chai-as-promised'); var _chaiAsPromised2 = _interopRequireDefault(_chaiAsPromised); var _iosTestApp = require('ios-test-app'); var _wd = require('wd'); var _wd2 = _interopRequireDefault(_wd); var _appiumIosSimulator = require('appium-ios-simulator'); var _nodeSimctl = require('node-simctl'); _chai2['default'].should(); _chai2['default'].use(_chaiAsPromised2['default']); var HOST = "localhost", PORT = 4994, APP = _iosTestApp.absolute.iphonesimulator, BUNDLE_ID = 'io.appium.TestApp', PLATFORM_VERSION = '9.1'; var DEFAULT_CAPS = { platformName: 'iOS', platformVersion: PLATFORM_VERSION, app: APP, bundleId: BUNDLE_ID, deviceName: "iPhone 6", automationName: "WebDriverAgent" }; var getNumSims = function getNumSims() { return _regeneratorRuntime.async(function getNumSims$(context$1$0) { while (1) switch (context$1$0.prev = context$1$0.next) { case 0: context$1$0.next = 2; return _regeneratorRuntime.awrap((0, _nodeSimctl.getDevices)()); case 2: context$1$0.t0 = PLATFORM_VERSION; return context$1$0.abrupt('return', context$1$0.sent[context$1$0.t0].length); case 4: case 'end': return context$1$0.stop(); } }, null, _this); }; describe('WebDriverAgentDriver', function () { var server = undefined; var driver = _wd2['default'].promiseChainRemote(HOST, PORT); before(function callee$1$0() { return _regeneratorRuntime.async(function callee$1$0$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: context$2$0.next = 2; return _regeneratorRuntime.awrap((0, _.startServer)(PORT, HOST)); case 2: server = context$2$0.sent; case 3: case 'end': return context$2$0.stop(); } }, null, _this); }); after(function () { // TODO I don't think this is actually shutting the server down, figure // that out server.close(); }); it('should start and stop a session', function callee$1$0() { var els; return _regeneratorRuntime.async(function callee$1$0$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: this.timeout(120 * 1000); context$2$0.next = 3; return _regeneratorRuntime.awrap(driver.init(DEFAULT_CAPS)); case 3: context$2$0.next = 5; return _regeneratorRuntime.awrap(driver.elementsByClassName("UIAButton")); case 5: els = context$2$0.sent; els.length.should.equal(7); context$2$0.next = 9; return _regeneratorRuntime.awrap(driver.quit()); case 9: case 'end': return context$2$0.stop(); } }, null, this); }); describe('reset', function () { it('default: creates sim and deletes it afterwards', function callee$2$0() { var caps, simsBefore, simsDuring, simsAfter; return _regeneratorRuntime.async(function callee$2$0$(context$3$0) { while (1) switch (context$3$0.prev = context$3$0.next) { case 0: this.timeout(120 * 1000); caps = { platformName: 'iOS', platformVersion: PLATFORM_VERSION, app: APP, bundleId: BUNDLE_ID, deviceName: "iPhone 6", automationName: "WebDriverAgent" }; context$3$0.next = 4; return _regeneratorRuntime.awrap((0, _appiumIosSimulator.killAllSimulators)()); case 4: context$3$0.next = 6; return _regeneratorRuntime.awrap(getNumSims()); case 6: simsBefore = context$3$0.sent; context$3$0.next = 9; return _regeneratorRuntime.awrap(driver.init(caps)); case 9: context$3$0.next = 11; return _regeneratorRuntime.awrap(getNumSims()); case 11: simsDuring = context$3$0.sent; context$3$0.next = 14; return _regeneratorRuntime.awrap(driver.quit()); case 14: context$3$0.next = 16; return _regeneratorRuntime.awrap(getNumSims()); case 16: simsAfter = context$3$0.sent; simsDuring.should.equal(simsBefore + 1); simsAfter.should.equal(simsBefore); case 19: case 'end': return context$3$0.stop(); } }, null, this); }); it('with udid: uses sim and shuts it down afterwards', function callee$2$0() { var udid, caps, simsBefore, simsDuring, simsAfter; return _regeneratorRuntime.async(function callee$2$0$(context$3$0) { while (1) switch (context$3$0.prev = context$3$0.next) { case 0: this.timeout(120 * 1000); // before context$3$0.next = 3; return _regeneratorRuntime.awrap((0, _nodeSimctl.createDevice)('webDriverAgentTest', 'iPhone 6', PLATFORM_VERSION)); case 3: udid = context$3$0.sent; caps = { platformName: 'iOS', platformVersion: PLATFORM_VERSION, app: APP, bundleId: BUNDLE_ID, deviceName: "iPhone 6", automationName: "WebDriverAgent", udid: udid }; context$3$0.next = 7; return _regeneratorRuntime.awrap(getNumSims()); case 7: simsBefore = context$3$0.sent; context$3$0.next = 10; return _regeneratorRuntime.awrap(driver.init(caps)); case 10: context$3$0.next = 12; return _regeneratorRuntime.awrap(getNumSims()); case 12: simsDuring = context$3$0.sent; context$3$0.next = 15; return _regeneratorRuntime.awrap(driver.quit()); case 15: context$3$0.next = 17; return _regeneratorRuntime.awrap(getNumSims()); case 17: simsAfter = context$3$0.sent; context$3$0.next = 20; return _regeneratorRuntime.awrap((0, _libSimulatorManagementJs.simBooted)(udid)); case 20: context$3$0.sent.should.be['false']; simsDuring.should.equal(simsBefore); simsAfter.should.equal(simsBefore); // cleanup context$3$0.next = 25; return _regeneratorRuntime.awrap((0, _nodeSimctl.deleteDevice)(udid)); case 25: case 'end': return context$3$0.stop(); } }, null, this); }); it('with udid booted: uses sim and leaves it afterwards', function callee$2$0() { var udid, sim, caps, simsBefore, simsDuring, simsAfter; return _regeneratorRuntime.async(function callee$2$0$(context$3$0) { while (1) switch (context$3$0.prev = context$3$0.next) { case 0: this.timeout(120 * 1000); // before context$3$0.next = 3; return _regeneratorRuntime.awrap((0, _nodeSimctl.createDevice)('webDriverAgentTest', 'iPhone 6', PLATFORM_VERSION)); case 3: udid = context$3$0.sent; context$3$0.next = 6; return _regeneratorRuntime.awrap((0, _appiumIosSimulator.getSimulator)(udid)); case 6: sim = context$3$0.sent; context$3$0.next = 9; return _regeneratorRuntime.awrap(sim.run()); case 9: caps = { platformName: 'iOS', platformVersion: PLATFORM_VERSION, app: APP, bundleId: BUNDLE_ID, deviceName: "iPhone 6", automationName: "WebDriverAgent", udid: udid }; context$3$0.next = 12; return _regeneratorRuntime.awrap((0, _libSimulatorManagementJs.simBooted)(udid)); case 12: context$3$0.sent.should.be['true']; context$3$0.next = 15; return _regeneratorRuntime.awrap(getNumSims()); case 15: simsBefore = context$3$0.sent; context$3$0.next = 18; return _regeneratorRuntime.awrap(driver.init(caps)); case 18: context$3$0.next = 20; return _regeneratorRuntime.awrap(getNumSims()); case 20: simsDuring = context$3$0.sent; context$3$0.next = 23; return _regeneratorRuntime.awrap(driver.quit()); case 23: context$3$0.next = 25; return _regeneratorRuntime.awrap(getNumSims()); case 25: simsAfter = context$3$0.sent; context$3$0.next = 28; return _regeneratorRuntime.awrap((0, _libSimulatorManagementJs.simBooted)(udid)); case 28: context$3$0.sent.should.be['true']; simsDuring.should.equal(simsBefore); simsAfter.should.equal(simsBefore); // cleanup context$3$0.next = 33; return _regeneratorRuntime.awrap(sim.shutdown()); case 33: context$3$0.next = 35; return _regeneratorRuntime.awrap((0, _nodeSimctl.deleteDevice)(udid)); case 35: case 'end': return context$3$0.stop(); } }, null, this); }); it('with invalid udid: throws an error', function callee$2$0() { var caps; return _regeneratorRuntime.async(function callee$2$0$(context$3$0) { while (1) switch (context$3$0.prev = context$3$0.next) { case 0: this.timeout(120 * 1000); // test caps = { platformName: 'iOS', platformVersion: PLATFORM_VERSION, app: APP, bundleId: BUNDLE_ID, deviceName: "iPhone 6", automationName: "WebDriverAgent", udid: 'some-random-udid' }; context$3$0.next = 4; return _regeneratorRuntime.awrap(driver.init(caps).should.be.rejectedWith('environment you requested was unavailable')); case 4: case 'end': return context$3$0.stop(); } }, null, this); }); it('with noReset set to true: leaves sim booted', function callee$2$0() { var udid, sim, caps, simsBefore, simsDuring, simsAfter; return _regeneratorRuntime.async(function callee$2$0$(context$3$0) { while (1) switch (context$3$0.prev = context$3$0.next) { case 0: this.timeout(120 * 1000); // before context$3$0.next = 3; return _regeneratorRuntime.awrap((0, _nodeSimctl.createDevice)('webDriverAgentTest', 'iPhone 6', PLATFORM_VERSION)); case 3: udid = context$3$0.sent; context$3$0.next = 6; return _regeneratorRuntime.awrap((0, _appiumIosSimulator.getSimulator)(udid)); case 6: sim = context$3$0.sent; caps = { platformName: 'iOS', platformVersion: PLATFORM_VERSION, app: APP, bundleId: BUNDLE_ID, deviceName: "iPhone 6", automationName: "WebDriverAgent", udid: udid, noReset: true }; context$3$0.next = 10; return _regeneratorRuntime.awrap(getNumSims()); case 10: simsBefore = context$3$0.sent; context$3$0.next = 13; return _regeneratorRuntime.awrap(driver.init(caps)); case 13: context$3$0.next = 15; return _regeneratorRuntime.awrap(getNumSims()); case 15: simsDuring = context$3$0.sent; context$3$0.next = 18; return _regeneratorRuntime.awrap(driver.quit()); case 18: context$3$0.next = 20; return _regeneratorRuntime.awrap(getNumSims()); case 20: simsAfter = context$3$0.sent; context$3$0.next = 23; return _regeneratorRuntime.awrap((0, _libSimulatorManagementJs.simBooted)(udid)); case 23: context$3$0.sent.should.be['true']; simsDuring.should.equal(simsBefore); simsAfter.should.equal(simsBefore); // cleanup context$3$0.next = 28; return _regeneratorRuntime.awrap(sim.shutdown()); case 28: context$3$0.next = 30; return _regeneratorRuntime.awrap((0, _nodeSimctl.deleteDevice)(udid)); case 30: case 'end': return context$3$0.stop(); } }, null, this); }); }); }); // test // test // test //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvZnVuY3Rpb25hbC9kcml2ZXItZTJlLXNwZWNzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O2dCQUE0QixPQUFPOzt3Q0FDVCxrQ0FBa0M7O29CQUMzQyxNQUFNOzs7OzhCQUNJLGtCQUFrQjs7OzswQkFDcEIsY0FBYzs7a0JBQ3hCLElBQUk7Ozs7a0NBQzZCLHNCQUFzQjs7MEJBQ2YsYUFBYTs7QUFFcEUsa0JBQUssTUFBTSxFQUFFLENBQUM7QUFDZCxrQkFBSyxHQUFHLDZCQUFnQixDQUFDOztBQUV6QixJQUFNLElBQUksR0FBRyxXQUFXO0lBQ2xCLElBQUksR0FBRyxJQUFJO0lBQ1gsR0FBRyxHQUFHLHFCQUFTLGVBQWU7SUFDOUIsU0FBUyxHQUFHLG1CQUFtQjtJQUMvQixnQkFBZ0IsR0FBRyxLQUFLLENBQUM7O0FBRS9CLElBQU0sWUFBWSxHQUFHO0FBQ25CLGNBQVksRUFBRSxLQUFLO0FBQ25CLGlCQUFlLEVBQUUsZ0JBQWdCO0FBQ2pDLEtBQUcsRUFBRSxHQUFHO0FBQ1IsVUFBUSxFQUFFLFNBQVM7QUFDbkIsWUFBVSxFQUFFLFVBQVU7QUFDdEIsZ0JBQWMsRUFBRSxnQkFBZ0I7Q0FDakMsQ0FBQzs7QUFFRixJQUFJLFVBQVUsR0FBRyxTQUFiLFVBQVU7Ozs7O3lDQUNFLDZCQUFZOzs7eUJBQUUsZ0JBQWdCOzZFQUFFLE1BQU07Ozs7Ozs7Q0FDckQsQ0FBQzs7QUFFRixRQUFRLENBQUMsc0JBQXNCLEVBQUUsWUFBTTtBQUNyQyxNQUFJLE1BQU0sWUFBQSxDQUFDO0FBQ1gsTUFBSSxNQUFNLEdBQUcsZ0JBQUcsa0JBQWtCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQy9DLFFBQU0sQ0FBQzs7Ozs7MkNBQ1UsbUJBQVksSUFBSSxFQUFFLElBQUksQ0FBQzs7O0FBQXRDLGdCQUFNOzs7Ozs7O0dBQ1AsQ0FBQyxDQUFDOztBQUVILE9BQUssQ0FBQyxZQUFNOzs7QUFHVixVQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7R0FDaEIsQ0FBQyxDQUFDOztBQUVILElBQUUsQ0FBQyxpQ0FBaUMsRUFBRTtRQUdoQyxHQUFHOzs7O0FBRlAsY0FBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUM7OzJDQUNuQixNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQzs7OzsyQ0FDZixNQUFNLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDOzs7QUFBbkQsYUFBRzs7QUFDUCxhQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7OzJDQUNyQixNQUFNLENBQUMsSUFBSSxFQUFFOzs7Ozs7O0dBQ3BCLENBQUMsQ0FBQzs7QUFFSCxVQUFRLENBQUMsT0FBTyxFQUFFLFlBQU07QUFDdEIsTUFBRSxDQUFDLGdEQUFnRCxFQUFFO1VBRS9DLElBQUksRUFVSixVQUFVLEVBRVYsVUFBVSxFQUVWLFNBQVM7Ozs7QUFmYixnQkFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDckIsZ0JBQUksR0FBRztBQUNULDBCQUFZLEVBQUUsS0FBSztBQUNuQiw2QkFBZSxFQUFFLGdCQUFnQjtBQUNqQyxpQkFBRyxFQUFFLEdBQUc7QUFDUixzQkFBUSxFQUFFLFNBQVM7QUFDbkIsd0JBQVUsRUFBRSxVQUFVO0FBQ3RCLDRCQUFjLEVBQUUsZ0JBQWdCO2FBQ2pDOzs2Q0FFSyw0Q0FBbUI7Ozs7NkNBQ0YsVUFBVSxFQUFFOzs7QUFBL0Isc0JBQVU7OzZDQUNSLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDOzs7OzZDQUNBLFVBQVUsRUFBRTs7O0FBQS9CLHNCQUFVOzs2Q0FDUixNQUFNLENBQUMsSUFBSSxFQUFFOzs7OzZDQUNHLFVBQVUsRUFBRTs7O0FBQTlCLHFCQUFTOztBQUViLHNCQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEMscUJBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDOzs7Ozs7O0tBQ3BDLENBQUMsQ0FBQzs7QUFFSCxNQUFFLENBQUMsa0RBQWtELEVBQUU7VUFJakQsSUFBSSxFQUdKLElBQUksRUFVSixVQUFVLEVBRVYsVUFBVSxFQUVWLFNBQVM7Ozs7QUFwQmIsZ0JBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDOzs7OzZDQUdSLDhCQUFhLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQzs7O0FBQTdFLGdCQUFJO0FBR0osZ0JBQUksR0FBRztBQUNULDBCQUFZLEVBQUUsS0FBSztBQUNuQiw2QkFBZSxFQUFFLGdCQUFnQjtBQUNqQyxpQkFBRyxFQUFFLEdBQUc7QUFDUixzQkFBUSxFQUFFLFNBQVM7QUFDbkIsd0JBQVUsRUFBRSxVQUFVO0FBQ3RCLDRCQUFjLEVBQUUsZ0JBQWdCO0FBQ2hDLGtCQUFJLEVBQUUsSUFBSTthQUNYOzs2Q0FFc0IsVUFBVSxFQUFFOzs7QUFBL0Isc0JBQVU7OzZDQUNSLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDOzs7OzZDQUNBLFVBQVUsRUFBRTs7O0FBQS9CLHNCQUFVOzs2Q0FDUixNQUFNLENBQUMsSUFBSSxFQUFFOzs7OzZDQUNHLFVBQVUsRUFBRTs7O0FBQTlCLHFCQUFTOzs2Q0FDTix5Q0FBVSxJQUFJLENBQUM7Ozs2QkFBRSxNQUFNLENBQUMsRUFBRTs7QUFFakMsc0JBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ3BDLHFCQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQzs7Ozs2Q0FHN0IsOEJBQWEsSUFBSSxDQUFDOzs7Ozs7O0tBQ3pCLENBQUMsQ0FBQzs7QUFFSCxNQUFFLENBQUMscURBQXFELEVBQUU7VUFJcEQsSUFBSSxFQUNKLEdBQUcsRUFJSCxJQUFJLEVBV0osVUFBVSxFQUVWLFVBQVUsRUFFVixTQUFTOzs7O0FBdkJiLGdCQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQzs7Ozs2Q0FHUiw4QkFBYSxvQkFBb0IsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLENBQUM7OztBQUE3RSxnQkFBSTs7NkNBQ1Esc0NBQWEsSUFBSSxDQUFDOzs7QUFBOUIsZUFBRzs7NkNBQ0QsR0FBRyxDQUFDLEdBQUcsRUFBRTs7O0FBR1gsZ0JBQUksR0FBRztBQUNULDBCQUFZLEVBQUUsS0FBSztBQUNuQiw2QkFBZSxFQUFFLGdCQUFnQjtBQUNqQyxpQkFBRyxFQUFFLEdBQUc7QUFDUixzQkFBUSxFQUFFLFNBQVM7QUFDbkIsd0JBQVUsRUFBRSxVQUFVO0FBQ3RCLDRCQUFjLEVBQUUsZ0JBQWdCO0FBQ2hDLGtCQUFJLEVBQUUsSUFBSTthQUNYOzs2Q0FFTSx5Q0FBVSxJQUFJLENBQUM7Ozs2QkFBRSxNQUFNLENBQUMsRUFBRTs7NkNBQ1YsVUFBVSxFQUFFOzs7QUFBL0Isc0JBQVU7OzZDQUNSLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDOzs7OzZDQUNBLFVBQVUsRUFBRTs7O0FBQS9CLHNCQUFVOzs2Q0FDUixNQUFNLENBQUMsSUFBSSxFQUFFOzs7OzZDQUNHLFVBQVUsRUFBRTs7O0FBQTlCLHFCQUFTOzs2Q0FDTix5Q0FBVSxJQUFJLENBQUM7Ozs2QkFBRSxNQUFNLENBQUMsRUFBRTs7QUFFakMsc0JBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ3BDLHFCQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQzs7Ozs2Q0FHN0IsR0FBRyxDQUFDLFFBQVEsRUFBRTs7Ozs2Q0FDZCw4QkFBYSxJQUFJLENBQUM7Ozs7Ozs7S0FDekIsQ0FBQyxDQUFDOztBQUVILE1BQUUsQ0FBQyxvQ0FBb0MsRUFBRTtVQUluQyxJQUFJOzs7O0FBSFIsZ0JBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDOzs7QUFHckIsZ0JBQUksR0FBRztBQUNULDBCQUFZLEVBQUUsS0FBSztBQUNuQiw2QkFBZSxFQUFFLGdCQUFnQjtBQUNqQyxpQkFBRyxFQUFFLEdBQUc7QUFDUixzQkFBUSxFQUFFLFNBQVM7QUFDbkIsd0JBQVUsRUFBRSxVQUFVO0FBQ3RCLDRCQUFjLEVBQUUsZ0JBQWdCO0FBQ2hDLGtCQUFJLEVBQUUsa0JBQWtCO2FBQ3pCOzs2Q0FFSyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLDJDQUEyQyxDQUFDOzs7Ozs7O0tBQzVGLENBQUMsQ0FBQzs7QUFFSCxNQUFFLENBQUMsNkNBQTZDLEVBQUU7VUFJNUMsSUFBSSxFQUNKLEdBQUcsRUFHSCxJQUFJLEVBV0osVUFBVSxFQUVWLFVBQVUsRUFFVixTQUFTOzs7O0FBdEJiLGdCQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQzs7Ozs2Q0FHUiw4QkFBYSxvQkFBb0IsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLENBQUM7OztBQUE3RSxnQkFBSTs7NkNBQ1Esc0NBQWEsSUFBSSxDQUFDOzs7QUFBOUIsZUFBRztBQUdILGdCQUFJLEdBQUc7QUFDVCwwQkFBWSxFQUFFLEtBQUs7QUFDbkIsNkJBQWUsRUFBRSxnQkFBZ0I7QUFDakMsaUJBQUcsRUFBRSxHQUFHO0FBQ1Isc0JBQVEsRUFBRSxTQUFTO0FBQ25CLHdCQUFVLEVBQUUsVUFBVTtBQUN0Qiw0QkFBYyxFQUFFLGdCQUFnQjtBQUNoQyxrQkFBSSxFQUFFLElBQUk7QUFDVixxQkFBTyxFQUFFLElBQUk7YUFDZDs7NkNBRXNCLFVBQVUsRUFBRTs7O0FBQS9CLHNCQUFVOzs2Q0FDUixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzs7Ozs2Q0FDQSxVQUFVLEVBQUU7OztBQUEvQixzQkFBVTs7NkNBQ1IsTUFBTSxDQUFDLElBQUksRUFBRTs7Ozs2Q0FDRyxVQUFVLEVBQUU7OztBQUE5QixxQkFBUzs7NkNBQ04seUNBQVUsSUFBSSxDQUFDOzs7NkJBQUUsTUFBTSxDQUFDLEVBQUU7O0FBRWpDLHNCQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNwQyxxQkFBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7Ozs7NkNBRzdCLEdBQUcsQ0FBQyxRQUFRLEVBQUU7Ozs7NkNBQ2QsOEJBQWEsSUFBSSxDQUFDOzs7Ozs7O0tBQ3pCLENBQUMsQ0FBQztHQUVKLENBQUMsQ0FBQztDQUVKLENBQUMsQ0FBQyIsImZpbGUiOiJ0ZXN0L2Z1bmN0aW9uYWwvZHJpdmVyLWUyZS1zcGVjcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHN0YXJ0U2VydmVyIH0gZnJvbSAnLi4vLi4nO1xuaW1wb3J0IHsgc2ltQm9vdGVkIH0gZnJvbSAnLi4vLi4vbGliL3NpbXVsYXRvck1hbmFnZW1lbnQuanMnO1xuaW1wb3J0IGNoYWkgZnJvbSAnY2hhaSc7XG5pbXBvcnQgY2hhaUFzUHJvbWlzZWQgZnJvbSAnY2hhaS1hcy1wcm9taXNlZCc7XG5pbXBvcnQgeyBhYnNvbHV0ZSB9IGZyb20gJ2lvcy10ZXN0LWFwcCc7XG5pbXBvcnQgd2QgZnJvbSAnd2QnO1xuaW1wb3J0IHsga2lsbEFsbFNpbXVsYXRvcnMsIGdldFNpbXVsYXRvciB9IGZyb20gJ2FwcGl1bS1pb3Mtc2ltdWxhdG9yJztcbmltcG9ydCB7IGdldERldmljZXMsIGNyZWF0ZURldmljZSwgZGVsZXRlRGV2aWNlIH0gZnJvbSAnbm9kZS1zaW1jdGwnO1xuXG5jaGFpLnNob3VsZCgpO1xuY2hhaS51c2UoY2hhaUFzUHJvbWlzZWQpO1xuXG5jb25zdCBIT1NUID0gXCJsb2NhbGhvc3RcIixcbiAgICAgIFBPUlQgPSA0OTk0LFxuICAgICAgQVBQID0gYWJzb2x1dGUuaXBob25lc2ltdWxhdG9yLFxuICAgICAgQlVORExFX0lEID0gJ2lvLmFwcGl1bS5UZXN0QXBwJyxcbiAgICAgIFBMQVRGT1JNX1ZFUlNJT04gPSAnOS4xJztcblxuY29uc3QgREVGQVVMVF9DQVBTID0ge1xuICBwbGF0Zm9ybU5hbWU6ICdpT1MnLFxuICBwbGF0Zm9ybVZlcnNpb246IFBMQVRGT1JNX1ZFUlNJT04sXG4gIGFwcDogQVBQLFxuICBidW5kbGVJZDogQlVORExFX0lELFxuICBkZXZpY2VOYW1lOiBcImlQaG9uZSA2XCIsXG4gIGF1dG9tYXRpb25OYW1lOiBcIldlYkRyaXZlckFnZW50XCIsXG59O1xuXG5sZXQgZ2V0TnVtU2ltcyA9IGFzeW5jICgpID0+IHtcbiAgcmV0dXJuIChhd2FpdCBnZXREZXZpY2VzKCkpW1BMQVRGT1JNX1ZFUlNJT05dLmxlbmd0aDtcbn07XG5cbmRlc2NyaWJlKCdXZWJEcml2ZXJBZ2VudERyaXZlcicsICgpID0+IHtcbiAgbGV0IHNlcnZlcjtcbiAgbGV0IGRyaXZlciA9IHdkLnByb21pc2VDaGFpblJlbW90ZShIT1NULCBQT1JUKTtcbiAgYmVmb3JlKGFzeW5jICgpID0+IHtcbiAgICBzZXJ2ZXIgPSBhd2FpdCBzdGFydFNlcnZlcihQT1JULCBIT1NUKTtcbiAgfSk7XG5cbiAgYWZ0ZXIoKCkgPT4ge1xuICAgIC8vIFRPRE8gSSBkb24ndCB0aGluayB0aGlzIGlzIGFjdHVhbGx5IHNodXR0aW5nIHRoZSBzZXJ2ZXIgZG93biwgZmlndXJlXG4gICAgLy8gdGhhdCBvdXRcbiAgICBzZXJ2ZXIuY2xvc2UoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzdGFydCBhbmQgc3RvcCBhIHNlc3Npb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy50aW1lb3V0KDEyMCAqIDEwMDApO1xuICAgIGF3YWl0IGRyaXZlci5pbml0KERFRkFVTFRfQ0FQUyk7XG4gICAgbGV0IGVscyA9IGF3YWl0IGRyaXZlci5lbGVtZW50c0J5Q2xhc3NOYW1lKFwiVUlBQnV0dG9uXCIpO1xuICAgIGVscy5sZW5ndGguc2hvdWxkLmVxdWFsKDcpO1xuICAgIGF3YWl0IGRyaXZlci5xdWl0KCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZXNldCcsICgpID0+IHtcbiAgICBpdCgnZGVmYXVsdDogY3JlYXRlcyBzaW0gYW5kIGRlbGV0ZXMgaXQgYWZ0ZXJ3YXJkcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMudGltZW91dCgxMjAgKiAxMDAwKTtcbiAgICAgIGxldCBjYXBzID0ge1xuICAgICAgICBwbGF0Zm9ybU5hbWU6ICdpT1MnLFxuICAgICAgICBwbGF0Zm9ybVZlcnNpb246IFBMQVRGT1JNX1ZFUlNJT04sXG4gICAgICAgIGFwcDogQVBQLFxuICAgICAgICBidW5kbGVJZDogQlVORExFX0lELFxuICAgICAgICBkZXZpY2VOYW1lOiBcImlQaG9uZSA2XCIsXG4gICAgICAgIGF1dG9tYXRpb25OYW1lOiBcIldlYkRyaXZlckFnZW50XCIsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBraWxsQWxsU2ltdWxhdG9ycygpO1xuICAgICAgbGV0IHNpbXNCZWZvcmUgPSBhd2FpdCBnZXROdW1TaW1zKCk7XG4gICAgICBhd2FpdCBkcml2ZXIuaW5pdChjYXBzKTtcbiAgICAgIGxldCBzaW1zRHVyaW5nID0gYXdhaXQgZ2V0TnVtU2ltcygpO1xuICAgICAgYXdhaXQgZHJpdmVyLnF1aXQoKTtcbiAgICAgIGxldCBzaW1zQWZ0ZXIgPSBhd2FpdCBnZXROdW1TaW1zKCk7XG5cbiAgICAgIHNpbXNEdXJpbmcuc2hvdWxkLmVxdWFsKHNpbXNCZWZvcmUgKyAxKTtcbiAgICAgIHNpbXNBZnRlci5zaG91bGQuZXF1YWwoc2ltc0JlZm9yZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnd2l0aCB1ZGlkOiB1c2VzIHNpbSBhbmQgc2h1dHMgaXQgZG93biBhZnRlcndhcmRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy50aW1lb3V0KDEyMCAqIDEwMDApO1xuXG4gICAgICAvLyBiZWZvcmVcbiAgICAgIGxldCB1ZGlkID0gYXdhaXQgY3JlYXRlRGV2aWNlKCd3ZWJEcml2ZXJBZ2VudFRlc3QnLCAnaVBob25lIDYnLCBQTEFURk9STV9WRVJTSU9OKTtcblxuICAgICAgLy8gdGVzdFxuICAgICAgbGV0IGNhcHMgPSB7XG4gICAgICAgIHBsYXRmb3JtTmFtZTogJ2lPUycsXG4gICAgICAgIHBsYXRmb3JtVmVyc2lvbjogUExBVEZPUk1fVkVSU0lPTixcbiAgICAgICAgYXBwOiBBUFAsXG4gICAgICAgIGJ1bmRsZUlkOiBCVU5ETEVfSUQsXG4gICAgICAgIGRldmljZU5hbWU6IFwiaVBob25lIDZcIixcbiAgICAgICAgYXV0b21hdGlvbk5hbWU6IFwiV2ViRHJpdmVyQWdlbnRcIixcbiAgICAgICAgdWRpZDogdWRpZFxuICAgICAgfTtcblxuICAgICAgbGV0IHNpbXNCZWZvcmUgPSBhd2FpdCBnZXROdW1TaW1zKCk7XG4gICAgICBhd2FpdCBkcml2ZXIuaW5pdChjYXBzKTtcbiAgICAgIGxldCBzaW1zRHVyaW5nID0gYXdhaXQgZ2V0TnVtU2ltcygpO1xuICAgICAgYXdhaXQgZHJpdmVyLnF1aXQoKTtcbiAgICAgIGxldCBzaW1zQWZ0ZXIgPSBhd2FpdCBnZXROdW1TaW1zKCk7XG4gICAgICAoYXdhaXQgc2ltQm9vdGVkKHVkaWQpKS5zaG91bGQuYmUuZmFsc2U7XG5cbiAgICAgIHNpbXNEdXJpbmcuc2hvdWxkLmVxdWFsKHNpbXNCZWZvcmUpO1xuICAgICAgc2ltc0FmdGVyLnNob3VsZC5lcXVhbChzaW1zQmVmb3JlKTtcblxuICAgICAgLy8gY2xlYW51cFxuICAgICAgYXdhaXQgZGVsZXRlRGV2aWNlKHVkaWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3dpdGggdWRpZCBib290ZWQ6IHVzZXMgc2ltIGFuZCBsZWF2ZXMgaXQgYWZ0ZXJ3YXJkcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMudGltZW91dCgxMjAgKiAxMDAwKTtcblxuICAgICAgLy8gYmVmb3JlXG4gICAgICBsZXQgdWRpZCA9IGF3YWl0IGNyZWF0ZURldmljZSgnd2ViRHJpdmVyQWdlbnRUZXN0JywgJ2lQaG9uZSA2JywgUExBVEZPUk1fVkVSU0lPTik7XG4gICAgICBsZXQgc2ltID0gYXdhaXQgZ2V0U2ltdWxhdG9yKHVkaWQpO1xuICAgICAgYXdhaXQgc2ltLnJ1bigpO1xuXG4gICAgICAvLyB0ZXN0XG4gICAgICBsZXQgY2FwcyA9IHtcbiAgICAgICAgcGxhdGZvcm1OYW1lOiAnaU9TJyxcbiAgICAgICAgcGxhdGZvcm1WZXJzaW9uOiBQTEFURk9STV9WRVJTSU9OLFxuICAgICAgICBhcHA6IEFQUCxcbiAgICAgICAgYnVuZGxlSWQ6IEJVTkRMRV9JRCxcbiAgICAgICAgZGV2aWNlTmFtZTogXCJpUGhvbmUgNlwiLFxuICAgICAgICBhdXRvbWF0aW9uTmFtZTogXCJXZWJEcml2ZXJBZ2VudFwiLFxuICAgICAgICB1ZGlkOiB1ZGlkXG4gICAgICB9O1xuXG4gICAgICAoYXdhaXQgc2ltQm9vdGVkKHVkaWQpKS5zaG91bGQuYmUudHJ1ZTtcbiAgICAgIGxldCBzaW1zQmVmb3JlID0gYXdhaXQgZ2V0TnVtU2ltcygpO1xuICAgICAgYXdhaXQgZHJpdmVyLmluaXQoY2Fwcyk7XG4gICAgICBsZXQgc2ltc0R1cmluZyA9IGF3YWl0IGdldE51bVNpbXMoKTtcbiAgICAgIGF3YWl0IGRyaXZlci5xdWl0KCk7XG4gICAgICBsZXQgc2ltc0FmdGVyID0gYXdhaXQgZ2V0TnVtU2ltcygpO1xuICAgICAgKGF3YWl0IHNpbUJvb3RlZCh1ZGlkKSkuc2hvdWxkLmJlLnRydWU7XG5cbiAgICAgIHNpbXNEdXJpbmcuc2hvdWxkLmVxdWFsKHNpbXNCZWZvcmUpO1xuICAgICAgc2ltc0FmdGVyLnNob3VsZC5lcXVhbChzaW1zQmVmb3JlKTtcblxuICAgICAgLy8gY2xlYW51cFxuICAgICAgYXdhaXQgc2ltLnNodXRkb3duKCk7XG4gICAgICBhd2FpdCBkZWxldGVEZXZpY2UodWRpZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnd2l0aCBpbnZhbGlkIHVkaWQ6IHRocm93cyBhbiBlcnJvcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMudGltZW91dCgxMjAgKiAxMDAwKTtcblxuICAgICAgLy8gdGVzdFxuICAgICAgbGV0IGNhcHMgPSB7XG4gICAgICAgIHBsYXRmb3JtTmFtZTogJ2lPUycsXG4gICAgICAgIHBsYXRmb3JtVmVyc2lvbjogUExBVEZPUk1fVkVSU0lPTixcbiAgICAgICAgYXBwOiBBUFAsXG4gICAgICAgIGJ1bmRsZUlkOiBCVU5ETEVfSUQsXG4gICAgICAgIGRldmljZU5hbWU6IFwiaVBob25lIDZcIixcbiAgICAgICAgYXV0b21hdGlvbk5hbWU6IFwiV2ViRHJpdmVyQWdlbnRcIixcbiAgICAgICAgdWRpZDogJ3NvbWUtcmFuZG9tLXVkaWQnXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBkcml2ZXIuaW5pdChjYXBzKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdlbnZpcm9ubWVudCB5b3UgcmVxdWVzdGVkIHdhcyB1bmF2YWlsYWJsZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3dpdGggbm9SZXNldCBzZXQgdG8gdHJ1ZTogbGVhdmVzIHNpbSBib290ZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnRpbWVvdXQoMTIwICogMTAwMCk7XG5cbiAgICAgIC8vIGJlZm9yZVxuICAgICAgbGV0IHVkaWQgPSBhd2FpdCBjcmVhdGVEZXZpY2UoJ3dlYkRyaXZlckFnZW50VGVzdCcsICdpUGhvbmUgNicsIFBMQVRGT1JNX1ZFUlNJT04pO1xuICAgICAgbGV0IHNpbSA9IGF3YWl0IGdldFNpbXVsYXRvcih1ZGlkKTtcblxuICAgICAgLy8gdGVzdFxuICAgICAgbGV0IGNhcHMgPSB7XG4gICAgICAgIHBsYXRmb3JtTmFtZTogJ2lPUycsXG4gICAgICAgIHBsYXRmb3JtVmVyc2lvbjogUExBVEZPUk1fVkVSU0lPTixcbiAgICAgICAgYXBwOiBBUFAsXG4gICAgICAgIGJ1bmRsZUlkOiBCVU5ETEVfSUQsXG4gICAgICAgIGRldmljZU5hbWU6IFwiaVBob25lIDZcIixcbiAgICAgICAgYXV0b21hdGlvbk5hbWU6IFwiV2ViRHJpdmVyQWdlbnRcIixcbiAgICAgICAgdWRpZDogdWRpZCxcbiAgICAgICAgbm9SZXNldDogdHJ1ZVxuICAgICAgfTtcblxuICAgICAgbGV0IHNpbXNCZWZvcmUgPSBhd2FpdCBnZXROdW1TaW1zKCk7XG4gICAgICBhd2FpdCBkcml2ZXIuaW5pdChjYXBzKTtcbiAgICAgIGxldCBzaW1zRHVyaW5nID0gYXdhaXQgZ2V0TnVtU2ltcygpO1xuICAgICAgYXdhaXQgZHJpdmVyLnF1aXQoKTtcbiAgICAgIGxldCBzaW1zQWZ0ZXIgPSBhd2FpdCBnZXROdW1TaW1zKCk7XG4gICAgICAoYXdhaXQgc2ltQm9vdGVkKHVkaWQpKS5zaG91bGQuYmUudHJ1ZTtcblxuICAgICAgc2ltc0R1cmluZy5zaG91bGQuZXF1YWwoc2ltc0JlZm9yZSk7XG4gICAgICBzaW1zQWZ0ZXIuc2hvdWxkLmVxdWFsKHNpbXNCZWZvcmUpO1xuXG4gICAgICAvLyBjbGVhbnVwXG4gICAgICBhd2FpdCBzaW0uc2h1dGRvd24oKTtcbiAgICAgIGF3YWl0IGRlbGV0ZURldmljZSh1ZGlkKTtcbiAgICB9KTtcblxuICB9KTtcblxufSk7XG4iXX0=