@appium/fake-driver 3.1.0 → 3.2.3

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.
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.WD_OPTS = exports.W3C_PREFIXED_CAPS = exports.W3C_CAPS = exports.TEST_PORT = exports.TEST_HOST = exports.TEST_APP = exports.BASE_CAPS = void 0;
9
+ exports.deleteSession = deleteSession;
10
+ exports.initSession = initSession;
11
+
12
+ require("source-map-support/register");
13
+
14
+ var _path = _interopRequireDefault(require("path"));
15
+
16
+ var _webdriverio = require("webdriverio");
17
+
18
+ const TEST_HOST = '127.0.0.1';
19
+ exports.TEST_HOST = TEST_HOST;
20
+ const TEST_PORT = 4774;
21
+ exports.TEST_PORT = TEST_PORT;
22
+
23
+ const TEST_APP = _path.default.join(__dirname, 'fixtures', 'app.xml');
24
+
25
+ exports.TEST_APP = TEST_APP;
26
+ const BASE_CAPS = {
27
+ platformName: 'Fake',
28
+ deviceName: 'Commodore 64',
29
+ app: TEST_APP,
30
+ address: TEST_HOST,
31
+ port: 8181
32
+ };
33
+ exports.BASE_CAPS = BASE_CAPS;
34
+ const W3C_PREFIXED_CAPS = {
35
+ 'appium:deviceName': BASE_CAPS.deviceName,
36
+ 'appium:app': BASE_CAPS.app,
37
+ 'appium:address': BASE_CAPS.address,
38
+ 'appium:port': BASE_CAPS.port,
39
+ platformName: BASE_CAPS.platformName
40
+ };
41
+ exports.W3C_PREFIXED_CAPS = W3C_PREFIXED_CAPS;
42
+ const W3C_CAPS = {
43
+ alwaysMatch: { ...W3C_PREFIXED_CAPS
44
+ },
45
+ firstMatch: [{}]
46
+ };
47
+ exports.W3C_CAPS = W3C_CAPS;
48
+ const WD_OPTS = {
49
+ hostname: TEST_HOST,
50
+ port: TEST_PORT,
51
+ connectionRetryCount: 0,
52
+ logLevel: 'error'
53
+ };
54
+ exports.WD_OPTS = WD_OPTS;
55
+
56
+ async function initSession(w3cPrefixedCaps) {
57
+ return await (0, _webdriverio.remote)({ ...WD_OPTS,
58
+ capabilities: w3cPrefixedCaps
59
+ });
60
+ }
61
+
62
+ async function deleteSession(driver) {
63
+ try {
64
+ await driver.deleteSession();
65
+ } catch (ign) {}
66
+ }require('source-map-support').install();
67
+
68
+
69
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvaGVscGVycy5qcyJdLCJuYW1lcyI6WyJURVNUX0hPU1QiLCJURVNUX1BPUlQiLCJURVNUX0FQUCIsInBhdGgiLCJqb2luIiwiX19kaXJuYW1lIiwiQkFTRV9DQVBTIiwicGxhdGZvcm1OYW1lIiwiZGV2aWNlTmFtZSIsImFwcCIsImFkZHJlc3MiLCJwb3J0IiwiVzNDX1BSRUZJWEVEX0NBUFMiLCJXM0NfQ0FQUyIsImFsd2F5c01hdGNoIiwiZmlyc3RNYXRjaCIsIldEX09QVFMiLCJob3N0bmFtZSIsImNvbm5lY3Rpb25SZXRyeUNvdW50IiwibG9nTGV2ZWwiLCJpbml0U2Vzc2lvbiIsInczY1ByZWZpeGVkQ2FwcyIsImNhcGFiaWxpdGllcyIsImRlbGV0ZVNlc3Npb24iLCJkcml2ZXIiLCJpZ24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFFQSxNQUFNQSxTQUFTLEdBQUcsV0FBbEI7O0FBQ0EsTUFBTUMsU0FBUyxHQUFHLElBQWxCOzs7QUFFQSxNQUFNQyxRQUFRLEdBQUdDLGNBQUtDLElBQUwsQ0FBVUMsU0FBVixFQUFxQixVQUFyQixFQUFpQyxTQUFqQyxDQUFqQjs7O0FBRUEsTUFBTUMsU0FBUyxHQUFHO0FBQ2hCQyxFQUFBQSxZQUFZLEVBQUUsTUFERTtBQUVoQkMsRUFBQUEsVUFBVSxFQUFFLGNBRkk7QUFHaEJDLEVBQUFBLEdBQUcsRUFBRVAsUUFIVztBQUloQlEsRUFBQUEsT0FBTyxFQUFFVixTQUpPO0FBS2hCVyxFQUFBQSxJQUFJLEVBQUU7QUFMVSxDQUFsQjs7QUFRQSxNQUFNQyxpQkFBaUIsR0FBRztBQUN4Qix1QkFBcUJOLFNBQVMsQ0FBQ0UsVUFEUDtBQUV4QixnQkFBY0YsU0FBUyxDQUFDRyxHQUZBO0FBR3hCLG9CQUFrQkgsU0FBUyxDQUFDSSxPQUhKO0FBSXhCLGlCQUFlSixTQUFTLENBQUNLLElBSkQ7QUFLeEJKLEVBQUFBLFlBQVksRUFBRUQsU0FBUyxDQUFDQztBQUxBLENBQTFCOztBQVFBLE1BQU1NLFFBQVEsR0FBRztBQUNmQyxFQUFBQSxXQUFXLEVBQUUsRUFBQyxHQUFHRjtBQUFKLEdBREU7QUFFZkcsRUFBQUEsVUFBVSxFQUFFLENBQUMsRUFBRDtBQUZHLENBQWpCOztBQUtBLE1BQU1DLE9BQU8sR0FBRztBQUNkQyxFQUFBQSxRQUFRLEVBQUVqQixTQURJO0FBRWRXLEVBQUFBLElBQUksRUFBRVYsU0FGUTtBQUdkaUIsRUFBQUEsb0JBQW9CLEVBQUUsQ0FIUjtBQUlkQyxFQUFBQSxRQUFRLEVBQUU7QUFKSSxDQUFoQjs7O0FBT0EsZUFBZUMsV0FBZixDQUE0QkMsZUFBNUIsRUFBNkM7QUFDM0MsU0FBTyxNQUFNLHlCQUFLLEVBQUMsR0FBR0wsT0FBSjtBQUFhTSxJQUFBQSxZQUFZLEVBQUVEO0FBQTNCLEdBQUwsQ0FBYjtBQUNEOztBQUVELGVBQWVFLGFBQWYsQ0FBOEJDLE1BQTlCLEVBQXNDO0FBQ3BDLE1BQUk7QUFDRixVQUFNQSxNQUFNLENBQUNELGFBQVAsRUFBTjtBQUNELEdBRkQsQ0FFRSxPQUFPRSxHQUFQLEVBQVksQ0FBRTtBQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcmVtb3RlIGFzIHdkaW8gfSBmcm9tICd3ZWJkcml2ZXJpbyc7XG5cbmNvbnN0IFRFU1RfSE9TVCA9ICcxMjcuMC4wLjEnO1xuY29uc3QgVEVTVF9QT1JUID0gNDc3NDtcblxuY29uc3QgVEVTVF9BUFAgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnZml4dHVyZXMnLCAnYXBwLnhtbCcpO1xuXG5jb25zdCBCQVNFX0NBUFMgPSB7XG4gIHBsYXRmb3JtTmFtZTogJ0Zha2UnLFxuICBkZXZpY2VOYW1lOiAnQ29tbW9kb3JlIDY0JyxcbiAgYXBwOiBURVNUX0FQUCxcbiAgYWRkcmVzczogVEVTVF9IT1NULFxuICBwb3J0OiA4MTgxLFxufTtcblxuY29uc3QgVzNDX1BSRUZJWEVEX0NBUFMgPSB7XG4gICdhcHBpdW06ZGV2aWNlTmFtZSc6IEJBU0VfQ0FQUy5kZXZpY2VOYW1lLFxuICAnYXBwaXVtOmFwcCc6IEJBU0VfQ0FQUy5hcHAsXG4gICdhcHBpdW06YWRkcmVzcyc6IEJBU0VfQ0FQUy5hZGRyZXNzLFxuICAnYXBwaXVtOnBvcnQnOiBCQVNFX0NBUFMucG9ydCxcbiAgcGxhdGZvcm1OYW1lOiBCQVNFX0NBUFMucGxhdGZvcm1OYW1lXG59O1xuXG5jb25zdCBXM0NfQ0FQUyA9IHtcbiAgYWx3YXlzTWF0Y2g6IHsuLi5XM0NfUFJFRklYRURfQ0FQU30sXG4gIGZpcnN0TWF0Y2g6IFt7fV0sXG59O1xuXG5jb25zdCBXRF9PUFRTID0ge1xuICBob3N0bmFtZTogVEVTVF9IT1NULFxuICBwb3J0OiBURVNUX1BPUlQsXG4gIGNvbm5lY3Rpb25SZXRyeUNvdW50OiAwLFxuICBsb2dMZXZlbDogJ2Vycm9yJ1xufTtcblxuYXN5bmMgZnVuY3Rpb24gaW5pdFNlc3Npb24gKHczY1ByZWZpeGVkQ2Fwcykge1xuICByZXR1cm4gYXdhaXQgd2Rpbyh7Li4uV0RfT1BUUywgY2FwYWJpbGl0aWVzOiB3M2NQcmVmaXhlZENhcHN9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlU2Vzc2lvbiAoZHJpdmVyKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZHJpdmVyLmRlbGV0ZVNlc3Npb24oKTtcbiAgfSBjYXRjaCAoaWduKSB7fVxufVxuXG5leHBvcnQgeyBpbml0U2Vzc2lvbiwgZGVsZXRlU2Vzc2lvbiwgVEVTVF9BUFAsIFRFU1RfSE9TVCwgVEVTVF9QT1JULCBCQVNFX0NBUFMsIFczQ19DQVBTLCBXM0NfUFJFRklYRURfQ0FQUywgV0RfT1BUUyB9O1xuIl0sImZpbGUiOiJ0ZXN0L2hlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
package/index.js CHANGED
@@ -1,29 +1,3 @@
1
1
  #!/usr/bin/env node
2
- // transpile:main
3
2
 
4
- import { asyncify } from 'asyncbox';
5
- import * as driver from './lib/driver';
6
- import * as server from './lib/server';
7
-
8
-
9
- const { FakeDriver } = driver;
10
- const { startServer } = server;
11
-
12
- const DEFAULT_HOST = 'localhost';
13
- const DEFAULT_PORT = 4774;
14
-
15
- async function main () {
16
- const getArgValue = (argName) => {
17
- const argIndex = process.argv.indexOf(argName);
18
- return argIndex > 0 ? process.argv[argIndex + 1] : null;
19
- };
20
- const port = parseInt(getArgValue('--port'), 10) || DEFAULT_PORT;
21
- const host = getArgValue('--host') || DEFAULT_HOST;
22
- return await startServer(port, host);
23
- }
24
-
25
- if (require.main === module) {
26
- asyncify(main);
27
- }
28
-
29
- export { FakeDriver, startServer };
3
+ module.exports = require('./build/lib');
@@ -4,7 +4,7 @@ import { errors } from '@appium/base-driver';
4
4
  let commands = {}, helpers = {}, extensions = {};
5
5
 
6
6
  helpers.getRawContexts = function getRawContexts () {
7
- let contexts = {'NATIVE_APP': null};
7
+ let contexts = {NATIVE_APP: null, PROXY: null};
8
8
  let wvs = this.appModel.getWebviews();
9
9
  for (let i = 1; i < wvs.length + 1; i++) {
10
10
  contexts[`WEBVIEW_${i}`] = wvs[i - 1];
@@ -32,8 +32,12 @@ commands.setContext = async function setContext (context) {
32
32
  this.curContext = context;
33
33
  if (context === 'NATIVE_APP') {
34
34
  this.appModel.deactivateWebview();
35
+ this._proxyActive = false;
36
+ } else if (context === 'PROXY') {
37
+ this._proxyActive = true;
35
38
  } else {
36
39
  this.appModel.activateWebview(contexts[context]);
40
+ this._proxyActive = false;
37
41
  }
38
42
  } else {
39
43
  throw new errors.NoSuchContextError();
package/lib/driver.js CHANGED
@@ -5,17 +5,6 @@ import { FakeApp } from './fake-app';
5
5
  import commands from './commands';
6
6
 
7
7
  class FakeDriver extends BaseDriver {
8
- static get argsConstraints () {
9
- return {
10
- sillyWebServerPort: {
11
- isNumber: true
12
- },
13
- sillyWebServerHost: {
14
- isString: true
15
- }
16
- };
17
- }
18
-
19
8
  constructor (opts = {}, shouldValidateCaps = true) {
20
9
  super(opts, shouldValidateCaps);
21
10
  this.appModel = null;
@@ -26,6 +15,7 @@ class FakeDriver extends BaseDriver {
26
15
  this.caps = {};
27
16
  this.fakeThing = null;
28
17
  this.cliArgs = {};
18
+ this._proxyActive = false;
29
19
 
30
20
  this.desiredCapConstraints = {
31
21
  'app': {
@@ -35,6 +25,27 @@ class FakeDriver extends BaseDriver {
35
25
  };
36
26
  }
37
27
 
28
+ proxyActive () {
29
+ return this._proxyActive;
30
+ }
31
+
32
+ canProxy () {
33
+ return true;
34
+ }
35
+
36
+ proxyReqRes (req, res) {
37
+ // fake implementation of jwp proxy req res
38
+ res.set('content-type', 'application/json');
39
+ const resBodyObj = {value: 'proxied via proxyReqRes'};
40
+ const match = req.originalUrl.match(/\/session\/([^/]+)/);
41
+ resBodyObj.sessionId = match ? match[1] : null;
42
+ res.status(200).send(JSON.stringify(resBodyObj));
43
+ }
44
+
45
+ proxyCommand (/*url, method, body*/) {
46
+ return 'proxied via proxyCommand';
47
+ }
48
+
38
49
  async createSession (jsonwpDesiredCapabilities, jsonwpRequiredCaps, w3cCapabilities, otherSessionData = []) {
39
50
 
40
51
  // TODO add validation on caps.app that we will get for free from
package/lib/fake-app.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { fs } from '@appium/support';
2
2
  import { readFileSync } from 'fs';
3
3
  import path from 'path';
4
- import XMLDom from 'xmldom';
4
+ import XMLDom from '@xmldom/xmldom';
5
5
  import xpath from 'xpath';
6
6
  import log from './logger';
7
7
  import { FakeElement } from './fake-element';
@@ -1,5 +1,5 @@
1
1
  import _ from 'lodash';
2
- import XMLDom from 'xmldom';
2
+ import XMLDom from '@xmldom/xmldom';
3
3
 
4
4
  class FakeElement {
5
5
  constructor (xmlNode, app) {
package/lib/index.js ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env node
2
+ // transpile:main
3
+
4
+ import { asyncify } from 'asyncbox';
5
+ import * as driver from './driver';
6
+ import * as server from './server';
7
+
8
+
9
+ const { FakeDriver } = driver;
10
+ const { startServer } = server;
11
+
12
+ const DEFAULT_HOST = 'localhost';
13
+ const DEFAULT_PORT = 4774;
14
+
15
+ async function main () {
16
+ const getArgValue = (argName) => {
17
+ const argIndex = process.argv.indexOf(argName);
18
+ return argIndex > 0 ? process.argv[argIndex + 1] : null;
19
+ };
20
+ const port = parseInt(getArgValue('--port'), 10) || DEFAULT_PORT;
21
+ const host = getArgValue('--host') || DEFAULT_HOST;
22
+ return await startServer(port, host);
23
+ }
24
+
25
+ if (require.main === module) {
26
+ asyncify(main);
27
+ }
28
+
29
+ export { FakeDriver, startServer };
@@ -1 +1 @@
1
- throw Error('Unsuccessfuly ran the script');
1
+ throw Error('Unsuccessfully ran the script');
@@ -1,3 +1,3 @@
1
1
  import log from '../logger';
2
2
 
3
- log.info('Successfuly ran the script');
3
+ log.info('Successfully ran the script');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appium/fake-driver",
3
- "version": "3.1.0",
3
+ "version": "3.2.3",
4
4
  "description": "Description goes here.",
5
5
  "keywords": [
6
6
  "automation",
@@ -21,9 +21,8 @@
21
21
  },
22
22
  "license": "Apache-2.0",
23
23
  "author": "https://github.com/appium",
24
- "main": "./build/index.js",
25
24
  "bin": {
26
- "appium-fake-driver": "./build/index.js"
25
+ "appium-fake-driver": "index.js"
27
26
  },
28
27
  "directories": {
29
28
  "lib": "lib"
@@ -31,25 +30,21 @@
31
30
  "files": [
32
31
  "index.js",
33
32
  "lib",
34
- "build/index.js",
35
- "build/lib",
33
+ "build",
36
34
  "test/fixtures",
37
35
  "screen.png"
38
36
  ],
39
37
  "dependencies": {
40
- "@appium/base-driver": "^8.1.2",
41
- "@appium/support": "^2.55.0",
42
- "@babel/runtime": "7.16.0",
38
+ "@appium/base-driver": "^8.2.3",
39
+ "@appium/support": "^2.55.3",
40
+ "@babel/runtime": "7.16.3",
41
+ "@xmldom/xmldom": "0.7.5",
43
42
  "asyncbox": "2.9.2",
44
43
  "bluebird": "3.7.2",
45
44
  "lodash": "4.17.21",
46
- "source-map-support": "0.5.20",
47
- "xmldom": "0.6.0",
45
+ "source-map-support": "0.5.21",
48
46
  "xpath": "0.0.32"
49
47
  },
50
- "devDependencies": {
51
- "@appium/gulp-plugins": "^5.5.4"
52
- },
53
48
  "engines": {
54
49
  "node": ">=12",
55
50
  "npm": ">=6"
@@ -68,12 +63,9 @@
68
63
  "fake-success": "./build/lib/scripts/fake-success.js"
69
64
  }
70
65
  },
71
- "greenkeeper": {
72
- "ignore": []
73
- },
74
66
  "publishConfig": {
75
67
  "access": "public"
76
68
  },
77
69
  "homepage": "https://appium.io",
78
- "gitHead": "71357e52e1b6211241975ca349411f2df92628fc"
70
+ "gitHead": "ca90a11813546ab4851e5b1f0406f420a53227e6"
79
71
  }
package/build/index.js DELETED
@@ -1,48 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
-
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.startServer = exports.FakeDriver = void 0;
8
-
9
- require("source-map-support/register");
10
-
11
- var _asyncbox = require("asyncbox");
12
-
13
- var driver = _interopRequireWildcard(require("./lib/driver"));
14
-
15
- var server = _interopRequireWildcard(require("./lib/server"));
16
-
17
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
18
-
19
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
20
-
21
- const {
22
- FakeDriver
23
- } = driver;
24
- exports.FakeDriver = FakeDriver;
25
- const {
26
- startServer
27
- } = server;
28
- exports.startServer = startServer;
29
- const DEFAULT_HOST = 'localhost';
30
- const DEFAULT_PORT = 4774;
31
-
32
- async function main() {
33
- const getArgValue = argName => {
34
- const argIndex = process.argv.indexOf(argName);
35
- return argIndex > 0 ? process.argv[argIndex + 1] : null;
36
- };
37
-
38
- const port = parseInt(getArgValue('--port'), 10) || DEFAULT_PORT;
39
- const host = getArgValue('--host') || DEFAULT_HOST;
40
- return await startServer(port, host);
41
- }
42
-
43
- if (require.main === module) {
44
- (0, _asyncbox.asyncify)(main);
45
- }require('source-map-support').install();
46
-
47
-
48
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbIkZha2VEcml2ZXIiLCJkcml2ZXIiLCJzdGFydFNlcnZlciIsInNlcnZlciIsIkRFRkFVTFRfSE9TVCIsIkRFRkFVTFRfUE9SVCIsIm1haW4iLCJnZXRBcmdWYWx1ZSIsImFyZ05hbWUiLCJhcmdJbmRleCIsInByb2Nlc3MiLCJhcmd2IiwiaW5kZXhPZiIsInBvcnQiLCJwYXJzZUludCIsImhvc3QiLCJyZXF1aXJlIiwibW9kdWxlIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztBQUdBOztBQUNBOztBQUNBOzs7Ozs7QUFHQSxNQUFNO0FBQUVBLEVBQUFBO0FBQUYsSUFBaUJDLE1BQXZCOztBQUNBLE1BQU07QUFBRUMsRUFBQUE7QUFBRixJQUFrQkMsTUFBeEI7O0FBRUEsTUFBTUMsWUFBWSxHQUFHLFdBQXJCO0FBQ0EsTUFBTUMsWUFBWSxHQUFHLElBQXJCOztBQUVBLGVBQWVDLElBQWYsR0FBdUI7QUFDckIsUUFBTUMsV0FBVyxHQUFJQyxPQUFELElBQWE7QUFDL0IsVUFBTUMsUUFBUSxHQUFHQyxPQUFPLENBQUNDLElBQVIsQ0FBYUMsT0FBYixDQUFxQkosT0FBckIsQ0FBakI7QUFDQSxXQUFPQyxRQUFRLEdBQUcsQ0FBWCxHQUFlQyxPQUFPLENBQUNDLElBQVIsQ0FBYUYsUUFBUSxHQUFHLENBQXhCLENBQWYsR0FBNEMsSUFBbkQ7QUFDRCxHQUhEOztBQUlBLFFBQU1JLElBQUksR0FBR0MsUUFBUSxDQUFDUCxXQUFXLENBQUMsUUFBRCxDQUFaLEVBQXdCLEVBQXhCLENBQVIsSUFBdUNGLFlBQXBEO0FBQ0EsUUFBTVUsSUFBSSxHQUFHUixXQUFXLENBQUMsUUFBRCxDQUFYLElBQXlCSCxZQUF0QztBQUNBLFNBQU8sTUFBTUYsV0FBVyxDQUFDVyxJQUFELEVBQU9FLElBQVAsQ0FBeEI7QUFDRDs7QUFFRCxJQUFJQyxPQUFPLENBQUNWLElBQVIsS0FBaUJXLE1BQXJCLEVBQTZCO0FBQzNCLDBCQUFTWCxJQUFUO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG4vLyB0cmFuc3BpbGU6bWFpblxuXG5pbXBvcnQgeyBhc3luY2lmeSB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCAqIGFzIGRyaXZlciBmcm9tICcuL2xpYi9kcml2ZXInO1xuaW1wb3J0ICogYXMgc2VydmVyIGZyb20gJy4vbGliL3NlcnZlcic7XG5cblxuY29uc3QgeyBGYWtlRHJpdmVyIH0gPSBkcml2ZXI7XG5jb25zdCB7IHN0YXJ0U2VydmVyIH0gPSBzZXJ2ZXI7XG5cbmNvbnN0IERFRkFVTFRfSE9TVCA9ICdsb2NhbGhvc3QnO1xuY29uc3QgREVGQVVMVF9QT1JUID0gNDc3NDtcblxuYXN5bmMgZnVuY3Rpb24gbWFpbiAoKSB7XG4gIGNvbnN0IGdldEFyZ1ZhbHVlID0gKGFyZ05hbWUpID0+IHtcbiAgICBjb25zdCBhcmdJbmRleCA9IHByb2Nlc3MuYXJndi5pbmRleE9mKGFyZ05hbWUpO1xuICAgIHJldHVybiBhcmdJbmRleCA+IDAgPyBwcm9jZXNzLmFyZ3ZbYXJnSW5kZXggKyAxXSA6IG51bGw7XG4gIH07XG4gIGNvbnN0IHBvcnQgPSBwYXJzZUludChnZXRBcmdWYWx1ZSgnLS1wb3J0JyksIDEwKSB8fCBERUZBVUxUX1BPUlQ7XG4gIGNvbnN0IGhvc3QgPSBnZXRBcmdWYWx1ZSgnLS1ob3N0JykgfHwgREVGQVVMVF9IT1NUO1xuICByZXR1cm4gYXdhaXQgc3RhcnRTZXJ2ZXIocG9ydCwgaG9zdCk7XG59XG5cbmlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xuICBhc3luY2lmeShtYWluKTtcbn1cblxuZXhwb3J0IHsgRmFrZURyaXZlciwgc3RhcnRTZXJ2ZXIgfTtcbiJdLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiLi4ifQ==