appium-xcode 4.0.4 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [4.0.5](https://github.com/appium/appium-xcode/compare/v4.0.4...v4.0.5) (2022-12-14)
2
+
3
+
4
+ ### Miscellaneous Chores
5
+
6
+ * **deps:** bump @appium/support from 2.61.1 to 3.0.0 ([#75](https://github.com/appium/appium-xcode/issues/75)) ([ea818d4](https://github.com/appium/appium-xcode/commit/ea818d4b2505e5921b8e9b526e47174d0cca50e7))
7
+
1
8
  ## [4.0.4](https://github.com/appium/appium-xcode/compare/v4.0.3...v4.0.4) (2022-12-01)
2
9
 
3
10
 
package/README.md CHANGED
@@ -6,7 +6,7 @@ appium-xcode
6
6
  [![Release](https://github.com/appium/appium-xcode/actions/workflows/publish.js.yml/badge.svg?branch=master)](https://github.com/appium/appium-xcode/actions/workflows/publish.js.yml)
7
7
 
8
8
  ES7 module for interacting with Xcode and Xcode-related functions.
9
- Used by [Appium](github.com/appium/appium)
9
+ Used by various [Appium](github.com/appium/appium) drivers.
10
10
 
11
11
  API
12
12
  ===
@@ -17,50 +17,28 @@ Most functions are memoized, so after they are called once, they will simply ret
17
17
 
18
18
  Some functions have an auto-retry built into them, they will retry silently a number of times. This is because the Xcode commands sometimes just flake and return bad values (or don't return).
19
19
 
20
- To clear the memoized values, call `clearInternalCache`
21
-
22
- ### getPath()
20
+ ### getPath([timeout=15000])
23
21
  *memoized*
24
22
 
25
- gets path to Xcode
23
+ gets path to Xcode Developer root.
26
24
 
27
- ### getVersion([num_retries])
25
+ ### getVersion([parse=false], [retries], [timeout])
28
26
  *memoized*, *retry*
29
27
 
30
- returns the version of Xcode. Returns strings like `'6.3.1'`
31
-
32
- ### getAutomationTraceTemplatePath([num_retries])
33
- *memoized, *retry*
34
-
35
- returns a path to the default AutomationTraceTemplate
36
-
37
- ### getAutomationTraceTemplatePathWithoutRetry()
38
-
39
- same as `getAutomationTraceTemplatePath()` but without retry or memoization.
28
+ returns the version of Xcode formatted as a string, for example `6.3.1`, or a version object if `parse` is `true`
40
29
 
41
30
  ### getMaxIOSSDK([num_retries])
42
31
  *memoized*, *retry*
43
32
 
44
- returns largest IOS SDK version supported by Xcode.
33
+ returns the highest IOS SDK version supported by Xcode.
45
34
  eg: `'8.3'`
46
35
 
47
- ### getMaxIOSSDKWithoutRetry()
48
-
49
- same as `getMaxIOSDK()` but without retry or memoization
50
-
51
36
  ### getMaxTVOSSDK([num_retries])
52
37
  *memoized*, *retry*
53
38
 
54
- returns largest tvOS SDK version supported by Xcode.
39
+ returns highest tvOS SDK version supported by Xcode.
55
40
  eg: `'10.1'`
56
41
 
57
- ### getMaxTVOSSDKWithoutRetry()
58
-
59
- same as `getMaxTVOSSDK()` but without retry or memoization
60
-
61
- ### clearInternalCache()
62
- clears the internal cache used for memoizing functions.
63
-
64
42
  Develop
65
43
  =======
66
44
 
package/build/index.js CHANGED
@@ -3,39 +3,49 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.getVersion = exports.getPath = exports.getMaxTVOSSDKWithoutRetry = exports.getMaxTVOSSDK = exports.getMaxIOSSDKWithoutRetry = exports.getMaxIOSSDK = exports.getInstrumentsPath = exports.getConnectedDevices = exports.getCommandLineToolsVersion = exports.getClangVersion = exports.getAutomationTraceTemplatePathWithoutRetry = exports.getAutomationTraceTemplatePath = exports.default = exports.clearInternalCache = void 0;
6
+ exports.default = void 0;
7
+ Object.defineProperty(exports, "getClangVersion", {
8
+ enumerable: true,
9
+ get: function () {
10
+ return _xcode.getClangVersion;
11
+ }
12
+ });
13
+ Object.defineProperty(exports, "getMaxIOSSDK", {
14
+ enumerable: true,
15
+ get: function () {
16
+ return _xcode.getMaxIOSSDK;
17
+ }
18
+ });
19
+ Object.defineProperty(exports, "getMaxTVOSSDK", {
20
+ enumerable: true,
21
+ get: function () {
22
+ return _xcode.getMaxTVOSSDK;
23
+ }
24
+ });
25
+ Object.defineProperty(exports, "getPath", {
26
+ enumerable: true,
27
+ get: function () {
28
+ return _xcode.getPath;
29
+ }
30
+ });
31
+ Object.defineProperty(exports, "getVersion", {
32
+ enumerable: true,
33
+ get: function () {
34
+ return _xcode.getVersion;
35
+ }
36
+ });
37
+
7
38
  require("source-map-support/register");
8
- var xcode = _interopRequireWildcard(require("./lib/xcode"));
9
- 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); }
10
- 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; }
11
- const {
12
- getPath,
13
- getVersion,
14
- getAutomationTraceTemplatePath,
15
- getMaxIOSSDK,
16
- getAutomationTraceTemplatePathWithoutRetry,
17
- getMaxIOSSDKWithoutRetry,
18
- getConnectedDevices,
19
- clearInternalCache,
20
- getInstrumentsPath,
21
- getCommandLineToolsVersion,
22
- getMaxTVOSSDK,
23
- getMaxTVOSSDKWithoutRetry,
24
- getClangVersion
25
- } = xcode;
26
- exports.getClangVersion = getClangVersion;
27
- exports.getMaxTVOSSDKWithoutRetry = getMaxTVOSSDKWithoutRetry;
28
- exports.getMaxTVOSSDK = getMaxTVOSSDK;
29
- exports.getCommandLineToolsVersion = getCommandLineToolsVersion;
30
- exports.getInstrumentsPath = getInstrumentsPath;
31
- exports.clearInternalCache = clearInternalCache;
32
- exports.getConnectedDevices = getConnectedDevices;
33
- exports.getMaxIOSSDKWithoutRetry = getMaxIOSSDKWithoutRetry;
34
- exports.getAutomationTraceTemplatePathWithoutRetry = getAutomationTraceTemplatePathWithoutRetry;
35
- exports.getMaxIOSSDK = getMaxIOSSDK;
36
- exports.getAutomationTraceTemplatePath = getAutomationTraceTemplatePath;
37
- exports.getVersion = getVersion;
38
- exports.getPath = getPath;
39
+
40
+ var _xcode = require("./lib/xcode");
41
+
42
+ const xcode = {
43
+ getPath: _xcode.getPath,
44
+ getVersion: _xcode.getVersion,
45
+ getMaxIOSSDK: _xcode.getMaxIOSSDK,
46
+ getMaxTVOSSDK: _xcode.getMaxTVOSSDK,
47
+ getClangVersion: _xcode.getClangVersion
48
+ };
39
49
  var _default = xcode;
40
50
  exports.default = _default;
41
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRQYXRoIiwiZ2V0VmVyc2lvbiIsImdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aCIsImdldE1heElPU1NESyIsImdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aFdpdGhvdXRSZXRyeSIsImdldE1heElPU1NES1dpdGhvdXRSZXRyeSIsImdldENvbm5lY3RlZERldmljZXMiLCJjbGVhckludGVybmFsQ2FjaGUiLCJnZXRJbnN0cnVtZW50c1BhdGgiLCJnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiIsImdldE1heFRWT1NTREsiLCJnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5IiwiZ2V0Q2xhbmdWZXJzaW9uIiwieGNvZGUiXSwic291cmNlcyI6WyIuLi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0cmFuc3BpbGU6bWFpblxuXG5pbXBvcnQgKiBhcyB4Y29kZSBmcm9tICcuL2xpYi94Y29kZSc7XG5cblxuY29uc3Qge1xuICBnZXRQYXRoLCBnZXRWZXJzaW9uLCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgsIGdldE1heElPU1NESyxcbiAgZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5LCBnZXRNYXhJT1NTREtXaXRob3V0UmV0cnksXG4gIGdldENvbm5lY3RlZERldmljZXMsIGNsZWFySW50ZXJuYWxDYWNoZSwgZ2V0SW5zdHJ1bWVudHNQYXRoLFxuICBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiwgZ2V0TWF4VFZPU1NESywgZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q2xhbmdWZXJzaW9uLFxufSA9IHhjb2RlO1xuXG5leHBvcnQge1xuICBnZXRQYXRoLCBnZXRWZXJzaW9uLCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgsIGdldE1heElPU1NESyxcbiAgZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5LCBnZXRNYXhJT1NTREtXaXRob3V0UmV0cnksXG4gIGdldENvbm5lY3RlZERldmljZXMsIGNsZWFySW50ZXJuYWxDYWNoZSwgZ2V0SW5zdHJ1bWVudHNQYXRoLFxuICBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiwgZ2V0TWF4VFZPU1NESywgZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q2xhbmdWZXJzaW9uLFxufTtcbmV4cG9ydCBkZWZhdWx0IHhjb2RlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBRUE7QUFBcUM7QUFBQTtBQUdyQyxNQUFNO0VBQ0pBLE9BQU87RUFBRUMsVUFBVTtFQUFFQyw4QkFBOEI7RUFBRUMsWUFBWTtFQUNqRUMsMENBQTBDO0VBQUVDLHdCQUF3QjtFQUNwRUMsbUJBQW1CO0VBQUVDLGtCQUFrQjtFQUFFQyxrQkFBa0I7RUFDM0RDLDBCQUEwQjtFQUFFQyxhQUFhO0VBQUVDLHlCQUF5QjtFQUNwRUM7QUFDRixDQUFDLEdBQUdDLEtBQUs7QUFBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGVBU0tBLEtBQUs7QUFBQSJ9
51
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ4Y29kZSIsImdldFBhdGgiLCJnZXRWZXJzaW9uIiwiZ2V0TWF4SU9TU0RLIiwiZ2V0TWF4VFZPU1NESyIsImdldENsYW5nVmVyc2lvbiJdLCJzb3VyY2VzIjpbIi4uL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHRyYW5zcGlsZTptYWluXG5pbXBvcnQge1xuICBnZXRQYXRoLFxuICBnZXRWZXJzaW9uLFxuICBnZXRNYXhJT1NTREssXG4gIGdldE1heFRWT1NTREssXG4gIGdldENsYW5nVmVyc2lvbixcbn0gZnJvbSAnLi9saWIveGNvZGUnO1xuXG5jb25zdCB4Y29kZSA9IHtcbiAgZ2V0UGF0aCxcbiAgZ2V0VmVyc2lvbixcbiAgZ2V0TWF4SU9TU0RLLFxuICBnZXRNYXhUVk9TU0RLLFxuICBnZXRDbGFuZ1ZlcnNpb25cbn07XG5cbmV4cG9ydCB7XG4gIGdldFBhdGgsXG4gIGdldFZlcnNpb24sXG4gIGdldE1heElPU1NESyxcbiAgZ2V0TWF4VFZPU1NESyxcbiAgZ2V0Q2xhbmdWZXJzaW9uXG59O1xuZXhwb3J0IGRlZmF1bHQgeGNvZGU7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBOztBQVFBLE1BQU1BLEtBQUssR0FBRztFQUNaQyxPQUFPLEVBQVBBLGNBRFk7RUFFWkMsVUFBVSxFQUFWQSxpQkFGWTtFQUdaQyxZQUFZLEVBQVpBLG1CQUhZO0VBSVpDLGFBQWEsRUFBYkEsb0JBSlk7RUFLWkMsZUFBZSxFQUFmQTtBQUxZLENBQWQ7ZUFlZUwsSyJ9
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.XCRUN_TIMEOUT = void 0;
9
+ exports.findAppPaths = findAppPaths;
10
+ exports.readXcodePlist = readXcodePlist;
11
+ exports.runXcrunCommand = runXcrunCommand;
12
+
13
+ require("source-map-support/register");
14
+
15
+ var _lodash = _interopRequireDefault(require("lodash"));
16
+
17
+ var _bluebird = _interopRequireDefault(require("bluebird"));
18
+
19
+ var _teen_process = require("teen_process");
20
+
21
+ var _support = require("@appium/support");
22
+
23
+ var _path = _interopRequireDefault(require("path"));
24
+
25
+ const XCRUN_TIMEOUT = 15000;
26
+ exports.XCRUN_TIMEOUT = XCRUN_TIMEOUT;
27
+
28
+ async function runXcrunCommand(args, timeout = XCRUN_TIMEOUT) {
29
+ try {
30
+ return await (0, _teen_process.exec)('xcrun', args, {
31
+ timeout
32
+ });
33
+ } catch (err) {
34
+ if (err.stderr) {
35
+ err.message = `${err.message}: ${err.stderr}`;
36
+ }
37
+
38
+ throw err;
39
+ }
40
+ }
41
+
42
+ async function findAppPaths(bundleId) {
43
+ let stdout;
44
+
45
+ try {
46
+ ({
47
+ stdout
48
+ } = await (0, _teen_process.exec)('/usr/bin/mdfind', [`kMDItemCFBundleIdentifier=${bundleId}`]));
49
+ } catch (e) {
50
+ return [];
51
+ }
52
+
53
+ const matchedPaths = _lodash.default.trim(stdout).split('\n').map(_lodash.default.trim).filter(Boolean);
54
+
55
+ if (_lodash.default.isEmpty(matchedPaths)) {
56
+ return [];
57
+ }
58
+
59
+ const results = matchedPaths.map(p => (async () => {
60
+ if (await _support.fs.exists(p)) {
61
+ return p;
62
+ }
63
+ })());
64
+ return (await _bluebird.default.all(results)).filter(Boolean);
65
+ }
66
+
67
+ async function readXcodePlist(developerRoot) {
68
+ const plistPath = _path.default.resolve(developerRoot, '..', 'Info.plist');
69
+
70
+ return (await _support.fs.exists(plistPath)) ? await _support.plist.parsePlistFile(plistPath) : {};
71
+ }
72
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJYQ1JVTl9USU1FT1VUIiwicnVuWGNydW5Db21tYW5kIiwiYXJncyIsInRpbWVvdXQiLCJleGVjIiwiZXJyIiwic3RkZXJyIiwibWVzc2FnZSIsImZpbmRBcHBQYXRocyIsImJ1bmRsZUlkIiwic3Rkb3V0IiwiZSIsIm1hdGNoZWRQYXRocyIsIl8iLCJ0cmltIiwic3BsaXQiLCJtYXAiLCJmaWx0ZXIiLCJCb29sZWFuIiwiaXNFbXB0eSIsInJlc3VsdHMiLCJwIiwiZnMiLCJleGlzdHMiLCJCIiwiYWxsIiwicmVhZFhjb2RlUGxpc3QiLCJkZXZlbG9wZXJSb290IiwicGxpc3RQYXRoIiwicGF0aCIsInJlc29sdmUiLCJwbGlzdCIsInBhcnNlUGxpc3RGaWxlIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2hlbHBlcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgZnMsIHBsaXN0IH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG5leHBvcnQgY29uc3QgWENSVU5fVElNRU9VVCA9IDE1MDAwO1xuXG4vKipcbiAqIEV4ZWN1dGVzICd4Y3J1bicgY29tbWFuZCBsaW5lIHV0aWxpdHlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzIHhjcnVuIGFyZ3VtZW50c1xuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgWzE1MDAwXSBUaGUgbWF4aW11bSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgeGNydW4gZXhpc3RzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJ0ZWVuX3Byb2Nlc3NcIikuRXhlY1Jlc3VsdD59IFRoZSByZXN1bHQgb2YgeGNydW4gZXhlY3V0aW9uXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgeGNydW4gcmV0dXJuZWQgbm9uLXplcm8gZXhpdCBjb2RlIG9yIHRpbWVkIG91dFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuWGNydW5Db21tYW5kIChhcmdzLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBleGVjKCd4Y3J1bicsIGFyZ3MsIHt0aW1lb3V0fSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIHRoZSB0cnVlIGVycm9yIGNhbiBiZSBoaWRkZW4gd2l0aGluIHRoZSBzdGRlcnJcbiAgICBpZiAoZXJyLnN0ZGVycikge1xuICAgICAgZXJyLm1lc3NhZ2UgPSBgJHtlcnIubWVzc2FnZX06ICR7ZXJyLnN0ZGVycn1gO1xuICAgIH1cblxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG4vKipcbiAqIFVzZXMgbWFjT1MgU3BvdGxpZ2h0IHNlcnZpY2UgdG8gZGV0ZWN0IHdoZXJlIHRoZSBnaXZlbiBhcHAgaXMgaW5zdGFsbGVkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJ1bmRsZUlkIEJ1bmRsZSBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgYXBwXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IEZ1bGwgcGF0aHMgdG8gd2hlcmUgdGhlIGFwcCB3aXRoIHRoZSBnaXZlbiBidW5kbGUgaWQgaXMgcHJlc2VudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRBcHBQYXRocyAoYnVuZGxlSWQpIHtcbiAgbGV0IHN0ZG91dDtcbiAgdHJ5IHtcbiAgICAoe3N0ZG91dH0gPSBhd2FpdCBleGVjKCcvdXNyL2Jpbi9tZGZpbmQnLCBbXG4gICAgICBga01ESXRlbUNGQnVuZGxlSWRlbnRpZmllcj0ke2J1bmRsZUlkfWBcbiAgICBdKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBtYXRjaGVkUGF0aHMgPSBfLnRyaW0oc3Rkb3V0KVxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKF8udHJpbSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICBpZiAoXy5pc0VtcHR5KG1hdGNoZWRQYXRocykpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgcmVzdWx0cyA9IG1hdGNoZWRQYXRocy5tYXAoKHApID0+IChhc3luYyAoKSA9PiB7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhwKSkge1xuICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICB9KSgpKTtcbiAgcmV0dXJuIChhd2FpdCBCLmFsbChyZXN1bHRzKSkuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG4vKipcbiAqIEZpbmRzIGFuZCByZXRyaWV2ZXMgdGhlIGNvbnRlbnQgb2YgdGhlIFhjb2RlJ3MgSW5mby5wbGlzdCBmaWxlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRldmVsb3BlclJvb3QgRnVsbCBwYXRoIHRvIHRoZSBDb250ZW50cy9EZXZlbG9wZXIgZm9sZGVyIHVuZGVyIFhjb2RlLmFwcCByb290XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3Q+fSBBbGwgcGxpc3QgZW50cmllcyBhcyBhbiBvYmplY3Qgb3IgYW4gZW1wdHkgb2JqZWN0IGlmIG5vIHBsaXN0IHdhcyBmb3VuZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFhjb2RlUGxpc3QgKGRldmVsb3BlclJvb3QpIHtcbiAgY29uc3QgcGxpc3RQYXRoID0gcGF0aC5yZXNvbHZlKGRldmVsb3BlclJvb3QsICcuLicsICdJbmZvLnBsaXN0Jyk7XG4gIHJldHVybiBhd2FpdCBmcy5leGlzdHMocGxpc3RQYXRoKVxuICAgID8gYXdhaXQgcGxpc3QucGFyc2VQbGlzdEZpbGUocGxpc3RQYXRoKVxuICAgIDoge307XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRU8sTUFBTUEsYUFBYSxHQUFHLEtBQXRCOzs7QUFVQSxlQUFlQyxlQUFmLENBQWdDQyxJQUFoQyxFQUFzQ0MsT0FBTyxHQUFHSCxhQUFoRCxFQUErRDtFQUNwRSxJQUFJO0lBQ0YsT0FBTyxNQUFNLElBQUFJLGtCQUFBLEVBQUssT0FBTCxFQUFjRixJQUFkLEVBQW9CO01BQUNDO0lBQUQsQ0FBcEIsQ0FBYjtFQUNELENBRkQsQ0FFRSxPQUFPRSxHQUFQLEVBQVk7SUFFWixJQUFJQSxHQUFHLENBQUNDLE1BQVIsRUFBZ0I7TUFDZEQsR0FBRyxDQUFDRSxPQUFKLEdBQWUsR0FBRUYsR0FBRyxDQUFDRSxPQUFRLEtBQUlGLEdBQUcsQ0FBQ0MsTUFBTyxFQUE1QztJQUNEOztJQUVELE1BQU1ELEdBQU47RUFDRDtBQUNGOztBQVFNLGVBQWVHLFlBQWYsQ0FBNkJDLFFBQTdCLEVBQXVDO0VBQzVDLElBQUlDLE1BQUo7O0VBQ0EsSUFBSTtJQUNGLENBQUM7TUFBQ0E7SUFBRCxJQUFXLE1BQU0sSUFBQU4sa0JBQUEsRUFBSyxpQkFBTCxFQUF3QixDQUN2Qyw2QkFBNEJLLFFBQVMsRUFERSxDQUF4QixDQUFsQjtFQUdELENBSkQsQ0FJRSxPQUFPRSxDQUFQLEVBQVU7SUFDVixPQUFPLEVBQVA7RUFDRDs7RUFFRCxNQUFNQyxZQUFZLEdBQUdDLGVBQUEsQ0FBRUMsSUFBRixDQUFPSixNQUFQLEVBQ2xCSyxLQURrQixDQUNaLElBRFksRUFFbEJDLEdBRmtCLENBRWRILGVBQUEsQ0FBRUMsSUFGWSxFQUdsQkcsTUFIa0IsQ0FHWEMsT0FIVyxDQUFyQjs7RUFJQSxJQUFJTCxlQUFBLENBQUVNLE9BQUYsQ0FBVVAsWUFBVixDQUFKLEVBQTZCO0lBQzNCLE9BQU8sRUFBUDtFQUNEOztFQUNELE1BQU1RLE9BQU8sR0FBR1IsWUFBWSxDQUFDSSxHQUFiLENBQWtCSyxDQUFELElBQU8sQ0FBQyxZQUFZO0lBQ25ELElBQUksTUFBTUMsV0FBQSxDQUFHQyxNQUFILENBQVVGLENBQVYsQ0FBVixFQUF3QjtNQUN0QixPQUFPQSxDQUFQO0lBQ0Q7RUFDRixDQUp1QyxHQUF4QixDQUFoQjtFQUtBLE9BQU8sQ0FBQyxNQUFNRyxpQkFBQSxDQUFFQyxHQUFGLENBQU1MLE9BQU4sQ0FBUCxFQUF1QkgsTUFBdkIsQ0FBOEJDLE9BQTlCLENBQVA7QUFDRDs7QUFRTSxlQUFlUSxjQUFmLENBQStCQyxhQUEvQixFQUE4QztFQUNuRCxNQUFNQyxTQUFTLEdBQUdDLGFBQUEsQ0FBS0MsT0FBTCxDQUFhSCxhQUFiLEVBQTRCLElBQTVCLEVBQWtDLFlBQWxDLENBQWxCOztFQUNBLE9BQU8sT0FBTUwsV0FBQSxDQUFHQyxNQUFILENBQVVLLFNBQVYsQ0FBTixJQUNILE1BQU1HLGNBQUEsQ0FBTUMsY0FBTixDQUFxQkosU0FBckIsQ0FESCxHQUVILEVBRko7QUFHRCJ9