appium-xcuitest-driver 4.12.0 → 4.12.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.
Files changed (131) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/README.md +33 -12
  3. package/build/index.js +1 -4
  4. package/build/lib/app-utils.js +1 -56
  5. package/build/lib/app-utils.js.map +1 -1
  6. package/build/lib/build-wda.js +1 -9
  7. package/build/lib/build-wda.js.map +1 -1
  8. package/build/lib/cert-utils.js +1 -7
  9. package/build/lib/cert-utils.js.map +1 -1
  10. package/build/lib/commands/activeAppInfo.js +3 -6
  11. package/build/lib/commands/activeAppInfo.js.map +1 -1
  12. package/build/lib/commands/alert.js +1 -16
  13. package/build/lib/commands/alert.js.map +1 -1
  14. package/build/lib/commands/app-management.js +3 -32
  15. package/build/lib/commands/app-management.js.map +1 -1
  16. package/build/lib/commands/appearance.js +2 -16
  17. package/build/lib/commands/appearance.js.map +1 -1
  18. package/build/lib/commands/battery.js +3 -5
  19. package/build/lib/commands/battery.js.map +1 -1
  20. package/build/lib/commands/biometric.js +3 -7
  21. package/build/lib/commands/biometric.js.map +1 -1
  22. package/build/lib/commands/certificate.js +2 -57
  23. package/build/lib/commands/certificate.js.map +1 -1
  24. package/build/lib/commands/clipboard.js +3 -6
  25. package/build/lib/commands/clipboard.js.map +1 -1
  26. package/build/lib/commands/condition.js +1 -20
  27. package/build/lib/commands/condition.js.map +1 -1
  28. package/build/lib/commands/context.js +8 -104
  29. package/build/lib/commands/context.js.map +1 -1
  30. package/build/lib/commands/cookies.js +5 -19
  31. package/build/lib/commands/cookies.js.map +1 -1
  32. package/build/lib/commands/deviceInfo.js +5 -10
  33. package/build/lib/commands/deviceInfo.js.map +1 -1
  34. package/build/lib/commands/element.js +4 -71
  35. package/build/lib/commands/element.js.map +1 -1
  36. package/build/lib/commands/execute.js +2 -19
  37. package/build/lib/commands/execute.js.map +1 -1
  38. package/build/lib/commands/file-movement.js +1 -66
  39. package/build/lib/commands/file-movement.js.map +1 -1
  40. package/build/lib/commands/find.js +5 -36
  41. package/build/lib/commands/find.js.map +1 -1
  42. package/build/lib/commands/general.js +4 -61
  43. package/build/lib/commands/general.js.map +1 -1
  44. package/build/lib/commands/gesture.js +7 -92
  45. package/build/lib/commands/gesture.js.map +1 -1
  46. package/build/lib/commands/index.js +1 -42
  47. package/build/lib/commands/index.js.map +1 -1
  48. package/build/lib/commands/iohid.js +2 -11
  49. package/build/lib/commands/iohid.js.map +1 -1
  50. package/build/lib/commands/keychains.js +3 -7
  51. package/build/lib/commands/keychains.js.map +1 -1
  52. package/build/lib/commands/localization.js +2 -5
  53. package/build/lib/commands/localization.js.map +1 -1
  54. package/build/lib/commands/location.js +2 -15
  55. package/build/lib/commands/location.js.map +1 -1
  56. package/build/lib/commands/lock.js +1 -13
  57. package/build/lib/commands/lock.js.map +1 -1
  58. package/build/lib/commands/log.js +1 -44
  59. package/build/lib/commands/log.js.map +1 -1
  60. package/build/lib/commands/navigation.js +4 -20
  61. package/build/lib/commands/navigation.js.map +1 -1
  62. package/build/lib/commands/notifications.js +3 -13
  63. package/build/lib/commands/notifications.js.map +1 -1
  64. package/build/lib/commands/pasteboard.js +1 -10
  65. package/build/lib/commands/pasteboard.js.map +1 -1
  66. package/build/lib/commands/pcap.js +1 -34
  67. package/build/lib/commands/pcap.js.map +1 -1
  68. package/build/lib/commands/performance.js +5 -78
  69. package/build/lib/commands/performance.js.map +1 -1
  70. package/build/lib/commands/permissions.js +4 -20
  71. package/build/lib/commands/permissions.js.map +1 -1
  72. package/build/lib/commands/proxy-helper.js +2 -21
  73. package/build/lib/commands/proxy-helper.js.map +1 -1
  74. package/build/lib/commands/record-audio.js +1 -37
  75. package/build/lib/commands/record-audio.js.map +1 -1
  76. package/build/lib/commands/recordscreen.js +3 -58
  77. package/build/lib/commands/recordscreen.js.map +1 -1
  78. package/build/lib/commands/screenshots.js +1 -21
  79. package/build/lib/commands/screenshots.js.map +1 -1
  80. package/build/lib/commands/source.js +3 -25
  81. package/build/lib/commands/source.js.map +1 -1
  82. package/build/lib/commands/timeouts.js +4 -14
  83. package/build/lib/commands/timeouts.js.map +1 -1
  84. package/build/lib/commands/web.js +18 -138
  85. package/build/lib/commands/web.js.map +1 -1
  86. package/build/lib/commands/xctest.js +2 -38
  87. package/build/lib/commands/xctest.js.map +1 -1
  88. package/build/lib/cookies.js +3 -10
  89. package/build/lib/cookies.js.map +1 -1
  90. package/build/lib/css-converter.js +1 -46
  91. package/build/lib/css-converter.js.map +1 -1
  92. package/build/lib/desired-caps.js +7 -6
  93. package/build/lib/desired-caps.js.map +1 -1
  94. package/build/lib/device-connections-factory.js +1 -64
  95. package/build/lib/device-connections-factory.js.map +1 -1
  96. package/build/lib/device-log/ios-crash-log.js +3 -39
  97. package/build/lib/device-log/ios-crash-log.js.map +1 -1
  98. package/build/lib/device-log/ios-device-log.js +1 -16
  99. package/build/lib/device-log/ios-device-log.js.map +1 -1
  100. package/build/lib/device-log/ios-log.js +1 -18
  101. package/build/lib/device-log/ios-log.js.map +1 -1
  102. package/build/lib/device-log/ios-performance-log.js +2 -15
  103. package/build/lib/device-log/ios-performance-log.js.map +1 -1
  104. package/build/lib/device-log/ios-simulator-log.js +1 -36
  105. package/build/lib/device-log/ios-simulator-log.js.map +1 -1
  106. package/build/lib/device-log/rotating-log.js +1 -19
  107. package/build/lib/device-log/rotating-log.js.map +1 -1
  108. package/build/lib/device-log/safari-console-log.js +2 -15
  109. package/build/lib/device-log/safari-console-log.js.map +1 -1
  110. package/build/lib/device-log/safari-network-log.js +2 -36
  111. package/build/lib/device-log/safari-network-log.js.map +1 -1
  112. package/build/lib/driver.js +15 -236
  113. package/build/lib/driver.js.map +1 -1
  114. package/build/lib/ios-deploy.js +1 -54
  115. package/build/lib/ios-deploy.js.map +1 -1
  116. package/build/lib/ios-fs-helpers.js +1 -52
  117. package/build/lib/ios-fs-helpers.js.map +1 -1
  118. package/build/lib/ios-generic-simulators.js +1 -3
  119. package/build/lib/ios-generic-simulators.js.map +1 -1
  120. package/build/lib/logger.js +1 -5
  121. package/build/lib/logger.js.map +1 -1
  122. package/build/lib/py-ios-device-client.js +1 -30
  123. package/build/lib/py-ios-device-client.js.map +1 -1
  124. package/build/lib/real-device-management.js +1 -34
  125. package/build/lib/real-device-management.js.map +1 -1
  126. package/build/lib/simulator-management.js +2 -96
  127. package/build/lib/simulator-management.js.map +1 -1
  128. package/build/lib/utils.js +2 -100
  129. package/build/lib/utils.js.map +1 -1
  130. package/npm-shrinkwrap.json +331 -301
  131. package/package.json +5 -3
package/CHANGELOG.md ADDED
@@ -0,0 +1 @@
1
+ ## [4.12.2](https://github.com/appium/appium-xcuitest-driver/compare/v4.12.1...v4.12.2) (2022-11-06)
package/README.md CHANGED
@@ -5,14 +5,17 @@
5
5
 
6
6
  [![Release](https://github.com/appium/appium-xcuitest-driver/actions/workflows/publish.js.yml/badge.svg)](https://github.com/appium/appium-xcuitest-driver/actions/workflows/publish.js.yml)
7
7
 
8
- Appium XCUITest Driver is a combined solution, which allows to perform automated black-box testing of iOS and tvOS native applications and WebKit web views.
8
+ Appium XCUITest Driver is a combined solution, which allows performing automated black-box testing of iOS and tvOS native applications and WebKit web views.
9
9
  The native testing is based on Apple's [XCTest](https://developer.apple.com/documentation/xctest) framework and the fork of Facebook's [WebDriverAgent](https://github.com/appium/WebDriverAgent) server (the [original](https://github.com/facebookarchive/WebDriverAgent) project is not supported anymore).
10
10
  Web views communication is done via [Webkit remote debugger protocol](https://github.com/appium/appium-remote-debugger). Real devices communication is ensured by [appium-ios-device](https://github.com/appium/appium-ios-device) library.
11
11
  Simulators communication is ensured by [appium-ios-simulator](https://github.com/appium/appium-ios-simulator) library.
12
12
 
13
13
  In the native mode the driver operates in scope of [WebDriver W3C protocol](https://w3c.github.io/webdriver) with several platform-specific extensions. Web views communication only supports the obsolete [JWP protocol](https://webdriver.io/docs/api/jsonwp.html).
14
14
 
15
- *Note*: Issue tracking for this repo has been disabled. Please use the [main Appium issue tracker](https://github.com/appium/appium/issues) instead.
15
+ > **Note**
16
+ >
17
+ > Since version 4.0.0 XCUITest driver has dropped the support of Appium 1, and is only compatible to Appium 2.
18
+ > Use the `appium driver install xcuitest` command to add it to your Appium 2 dist.
16
19
 
17
20
 
18
21
  ## Requirements
@@ -20,27 +23,45 @@ In the native mode the driver operates in scope of [WebDriver W3C protocol](http
20
23
  On top of standard Appium requirements XCUITest driver also expects the following prerequisites:
21
24
 
22
25
  - Only macOS is supported as the host platform
23
- - Xcode and developer tools must be installed. Note, that usually some time is needed for the Appium team to pick up with the support of the most recent Xcode versions, especially beta ones.
26
+ - Xcode and developer tools must be installed. Note, that usually some time is needed for the Appium team to pick up with the support of the most recent Xcode versions, especially beta ones (check [Xcode version support](#xcode-version-support) section below).
24
27
  - Connected real devices must be trusted, added to your developer profile and configured properly along with WebDriverAgent signing. Read [Real devices](#real-devices) section _carefully_ to set them up properly before running your tests.
25
- - Starting from iOS/iPadOS version iOS/iPadOS 16 real devices require enabling of _Developer Mode_ option in _Settings -> Privacy & Security_
26
- - The minimum supported Xcode SDK version for the current driver snapshot is *10.2 (iOS 12.2)*. Consider using earlier releases of the driver (see [Xcode version support](#xcode-version-support) section below) if it is necessary to test older iOS versions on real devices. Also, it is highly recommended to always use the same major version of Xcode SDK, which was used to build the particular iOS/tvOS version on your real device under test (for example Xcode 11 for iOS 13, Xcode 12 for iOS 14, etc).
28
+ - iOS/iPadOS 16 real devices require enabling developer mode. Please read [Enabling Developer Mode on a device](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device) for more details. `devmodectl streaming` CLI on macOS 13+ and installing development signed apps also help enabling the mode.
29
+ - Consider using earlier releases of the driver (check [Xcode version support](#xcode-version-support) section below) if it is necessary to test iOS versions older than the current iOS major version minus one on real devices. Also, it is highly recommended to always use the same major version of Xcode SDK, which was used to build the particular iOS/tvOS version on your real device under test (for example Xcode 11 for iOS 13, Xcode 12 for iOS 14, etc).
27
30
  - Web views must be debuggable in order to test them. If it is not possible to connect to your web view(s) using [Safari remote debugger](https://appletoolbox.com/use-web-inspector-debug-mobile-safari/) then XCUITest won't be able to connect to them as well.
28
31
  - Since version 3.33.0 (included into Appium 1.20.0+) of XCUITest driver the [Carthage](https://github.com/Carthage/Carthage) dependency *is not needed anymore*. Prior to that version it was required and could be installed using [brew](https://brew.sh/): `brew install carthage`.
29
32
 
33
+
30
34
  ## Optional dependencies
31
35
 
32
36
  - [xcpretty](https://github.com/supermarin/xcpretty) tool could be used to make Xcode output easier to read. It could be installed using `gem install xcpretty` command.
33
37
  - For test video recording we use [ffmpeg](https://ffmpeg.org/). It could be installed using [brew](https://brew.sh/): `brew install ffmpeg`
34
38
  - [IDB](https://github.com/facebook/idb), [go-ios](https://github.com/danielpaulus/go-ios) and [tidevice](https://github.com/alibaba/taobao-iphone-device) could be used to improve some real device/Simulator interactions
35
39
  - [WIX AppleSimulatorUtils](https://github.com/wix/AppleSimulatorUtils) could be used to improve some Simulator interactions
40
+ - [py-ios-device](https://github.com/YueChen-C/py-ios-device) is required in several `mobile:` extensions and to improve the general testing experience for _real_ iOS devices
36
41
 
37
42
 
38
43
  ## Xcode version support
39
44
 
40
- * module versions below `2.96.0` only supports XCode 8 and newer
41
- * module version `2.96.0` and above only supports XCode 9 and newer
42
- * module version `3.0.0` and above only supports Xcode 10 and newer
43
- * module version `3.32.0` and above only supports Xcode 10.2 and newer
45
+ Apple constantly works on various updates/improvements to XCTest framework. Thus, some major and even minor iOS releases might partially break the backward compatibility, so we need to implement multiple branches to support the legacy and the current implementations in [WebDriverAgent](https://github.com/appium/WebDriverAgent). Eventually we just drop the support of legacy XCTest implementations in order to simplify the client code and to have access to the recent platform features. The general aim is to support the _current major_ platform version and the _previous major_ one.
46
+
47
+ Minimum XCUITest driver version | Minimum required Xcode version
48
+ --- | ---
49
+ 2.96.0 | Xcode 9
50
+ 3.0.0 | Xcode 10
51
+ 3.32.0 | Xcode 10.2
52
+ 3.56.0 | Xcode 11
53
+ 4.2.0 | Xcode 12
54
+
55
+ It could be that after a new Xcode SDK is released we figure out a part or even the whole functionality that [WebDriverAgent](https://github.com/appium/WebDriverAgent) currently provides does not work anymore and needs to be updated. The below table contains the driver versions mapping for the cases where we had known compatibility issues with newly released SDKs and addressed them. Basically, version numbers in this table mean that all XCUITest driver versions _below_ the one in the first column _won't support_ Xcode SDK equal or above the version in the second column and the only way to make your test working after Xcode update would be to also *bump the driver version*.
56
+
57
+ Minimum XCUITest driver version | Tested for compatibility with Xcode version
58
+ --- | ---
59
+ 4.7.4 | Xcode 14-beta.3
60
+
61
+
62
+ ## tvOS Support
63
+
64
+ Read the [tvOS support](docs/ios/ios-tvos.md) article to get more details on how to automate testing for this platform.
44
65
 
45
66
 
46
67
  ## Real devices
@@ -54,7 +75,7 @@ See [real device configuration documentation](docs/real-device-config.md).
54
75
  - After many failures on real devices it could transition to a state where connections are no longer being accepted. To possibly remedy this issue reboot the device. Read https://github.com/facebook/WebDriverAgent/issues/507 for more details.
55
76
  - iPhone/iPad real devices show overlay, which has `Automation Running Hold both volume buttons to stop` text, since iOS/iPadOS 15. This is a known limitation of XCTest framework. This limitation does not affect screenshooting APIs though (e.g. the overlay is not visible on taken screenshots).
56
77
  - iPhone/iPad real devices [require passcode or touch id](https://github.com/appium/appium/issues/15898#issuecomment-927340411) when they start a XCTest session since iOS/iPadOS 15. Disabling passcode/touch id in the device preference allows to workaround the behaviour above.
57
- - OpenSSL v3 breaks secured communication with real devices. It can cause a [Failed to receive any data within the timeout](https://github.com/appium/appium/issues/16399) error in [appium-ios-device](https://github.com/appium/appium-ios-device). Please read [this issue](https://github.com/appium/appium-ios-device/pull/88#discussion_r825315862) for more details.
78
+ - OpenSSL v3 breaks secure communication with real devices. It can cause a [Failed to receive any data within the timeout](https://github.com/appium/appium/issues/16399) error in [appium-ios-device](https://github.com/appium/appium-ios-device). Please read [this issue](https://github.com/appium/appium-ios-device/pull/88#discussion_r825315862) for more details.
58
79
  - Please make sure your environment has Open SSL v1 for NodeJS environment, or prepare an OpenSSL v3 build by patching `OPENSSL_TLS_SECURITY_LEVEL=1`. (e.g. [an article](https://www.feistyduck.com/library/openssl-cookbook/online/ch-openssl.html))
59
80
  - This configuration is only necessary for XCUITest driver v4.3.0 or lower.
60
81
 
@@ -98,7 +119,7 @@ Usage: `appium --driver-args='{"xcuitest": {[argName]: [argValue]}}'`
98
119
 
99
120
  |Argument|Default|Description|Example|
100
121
  |----|-------|-----------|-------|
101
- |`"wdaLocalPort"`|8100| Local port used for communication with ios-web-driver-agent|`--driver-args='{"xcuitest": {"wdaLocalPort": 8100}}'`|
122
+ | wdaLocalPort | 8100 | Local port used for communication with ios-web-driver-agent | `--driver-args='{"xcuitest": {"wdaLocalPort": 8100}}'` |
102
123
 
103
124
  ## Capabilities
104
125
 
@@ -248,7 +269,7 @@ XCUITest driver supports the following element attributes:
248
269
  Name | Description | Example
249
270
  --- | --- | ---
250
271
  name | Could contain either element's [identifier](https://developer.apple.com/documentation/xctest/xcuielementattributes/1500981-identifier?language=objc) or its [label](https://developer.apple.com/documentation/xctest/xcuielementattributes/1500692-label?language=objc), depending on which one is available first. Could also be `null`. It is recommended to prefer the usage of [accessibilityIdentifier](https://developer.apple.com/documentation/uikit/uiaccessibilityidentification/1623132-accessibilityidentifier) over [accessibilityLabel](https://developer.apple.com/documentation/objectivec/nsobject/1615181-accessibilitylabel) for automation purposes, since the `identifier` property is supposed to stay constant under different locales and does not affect accessibility services such as VoiceOver. | 'hello'
251
- label | Element's [label](https://developer.apple.com/documentation/xctest/xcuielementattributes/1500692-label?language=objc) value. Could be `null` | 'hello'
272
+ label | Element's [label](https://developer.apple.com/documentation/xctest/xcuielementattributes/1500692-label?language=objc) value. Could be `null`. Since XCUITest driver 4.7.3 (WebDriverAgent 4.8.0), the behavior of this value was better aligned with XCTest, so it could include line breaks (`\n`). Before this version, line breaks were replaced by spaces. | 'hello', 'hello\nworld'
252
273
  type | Element's [type](https://developer.apple.com/documentation/xctest/xcuielementattributes/1500614-elementtype?language=objc) name | 'XCUIElementTypeButton'
253
274
  visible | Whether the element is visible. This value is not available in the "vanilla" XCTest and is read directly from the accessibility layer | 'false'
254
275
  focused | Whether the element is [focused](https://developer.apple.com/documentation/xctest/xcuielementattributes/1627636-hasfocus?language=objc). *Only available for tvOS* | 'true'
package/build/index.js CHANGED
@@ -10,11 +10,8 @@ Object.defineProperty(exports, "XCUITestDriver", {
10
10
  }
11
11
  });
12
12
  exports.default = void 0;
13
-
14
13
  require("source-map-support/register");
15
-
16
14
  var _driver = require("./lib/driver");
17
-
18
15
  var _default = _driver.XCUITestDriver;
19
16
  exports.default = _default;
20
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJYQ1VJVGVzdERyaXZlciJdLCJzb3VyY2VzIjpbIi4uL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHRyYW5zcGlsZTptYWluXG5pbXBvcnQgeyBYQ1VJVGVzdERyaXZlciB9IGZyb20gJy4vbGliL2RyaXZlcic7XG5cbmV4cG9ydCB7IFhDVUlUZXN0RHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBYQ1VJVGVzdERyaXZlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQ0E7O2VBR2VBLHNCIn0=
17
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJYQ1VJVGVzdERyaXZlciJdLCJzb3VyY2VzIjpbIi4uL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHRyYW5zcGlsZTptYWluXG5pbXBvcnQgeyBYQ1VJVGVzdERyaXZlciB9IGZyb20gJy4vbGliL2RyaXZlcic7XG5cbmV4cG9ydCB7IFhDVUlUZXN0RHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBYQ1VJVGVzdERyaXZlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUNBO0FBQThDLGVBRy9CQSxzQkFBYztBQUFBIn0=
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
@@ -13,17 +12,11 @@ exports.isAppBundle = isAppBundle;
13
12
  exports.isolateAppBundle = isolateAppBundle;
14
13
  exports.parseLocalizableStrings = parseLocalizableStrings;
15
14
  exports.verifyApplicationPlatform = verifyApplicationPlatform;
16
-
17
15
  require("source-map-support/register");
18
-
19
16
  var _lodash = _interopRequireDefault(require("lodash"));
20
-
21
17
  var _path = _interopRequireDefault(require("path"));
22
-
23
18
  var _support = require("appium/support");
24
-
25
19
  var _logger = _interopRequireDefault(require("./logger.js"));
26
-
27
20
  const STRINGSDICT_RESOURCE = '.stringsdict';
28
21
  const STRINGS_RESOURCE = '.strings';
29
22
  const SAFARI_BUNDLE_ID = 'com.apple.mobilesafari';
@@ -32,50 +25,37 @@ const APP_EXT = '.app';
32
25
  exports.APP_EXT = APP_EXT;
33
26
  const IPA_EXT = '.ipa';
34
27
  exports.IPA_EXT = IPA_EXT;
35
-
36
28
  async function extractPlistEntry(app, entryName) {
37
29
  const plistPath = _path.default.resolve(app, 'Info.plist');
38
-
39
30
  try {
40
31
  return (await _support.plist.parsePlistFile(plistPath))[entryName];
41
32
  } catch (err) {
42
33
  throw new Error(`Could not extract Info.plist from '${_path.default.basename(app)}': ${err.message}`);
43
34
  }
44
35
  }
45
-
46
36
  async function extractBundleId(app) {
47
37
  const bundleId = await extractPlistEntry(app, 'CFBundleIdentifier');
48
-
49
38
  _logger.default.debug(`Getting bundle ID from app '${app}': '${bundleId}'`);
50
-
51
39
  return bundleId;
52
40
  }
53
-
54
41
  async function fetchSupportedAppPlatforms(app) {
55
42
  try {
56
43
  const result = await extractPlistEntry(app, 'CFBundleSupportedPlatforms');
57
-
58
44
  if (!_lodash.default.isArray(result)) {
59
45
  _logger.default.warn(`${_path.default.basename(app)}': CFBundleSupportedPlatforms is not a valid list`);
60
-
61
46
  return [];
62
47
  }
63
-
64
48
  return result;
65
49
  } catch (err) {
66
50
  _logger.default.warn(`Cannot extract the list of supported platforms from '${_path.default.basename(app)}': ${err.message}`);
67
-
68
51
  return [];
69
52
  }
70
53
  }
71
54
 
72
55
  async function verifyApplicationPlatform(app, expectedPlatform) {
73
56
  _logger.default.debug('Verifying application platform');
74
-
75
57
  const supportedPlatforms = await fetchSupportedAppPlatforms(app);
76
-
77
58
  _logger.default.debug(`CFBundleSupportedPlatforms: ${JSON.stringify(supportedPlatforms)}`);
78
-
79
59
  const {
80
60
  isSimulator,
81
61
  isTvOS
@@ -83,23 +63,18 @@ async function verifyApplicationPlatform(app, expectedPlatform) {
83
63
  const prefix = isTvOS ? 'AppleTV' : 'iPhone';
84
64
  const suffix = isSimulator ? 'Simulator' : 'OS';
85
65
  const dstPlatform = `${prefix}${suffix}`;
86
-
87
66
  if (!supportedPlatforms.includes(dstPlatform)) {
88
67
  throw new Error(`${isSimulator ? 'Simulator' : 'Real device'} architecture is unsupported by the '${app}' application. ` + `Make sure the correct deployment target has been selected for its compilation in Xcode.`);
89
68
  }
90
69
  }
91
-
92
70
  async function readResource(resourcePath) {
93
71
  const data = await _support.plist.parsePlistFile(resourcePath);
94
72
  const result = {};
95
-
96
73
  for (const [key, value] of _lodash.default.toPairs(data)) {
97
74
  result[key] = _lodash.default.isString(value) ? value : JSON.stringify(value);
98
75
  }
99
-
100
76
  return result;
101
77
  }
102
-
103
78
  async function parseLocalizableStrings(opts) {
104
79
  const {
105
80
  app,
@@ -108,94 +83,66 @@ async function parseLocalizableStrings(opts) {
108
83
  stringFile,
109
84
  strictMode
110
85
  } = opts;
111
-
112
86
  if (!app) {
113
87
  const message = `Strings extraction is not supported if 'app' capability is not set`;
114
-
115
88
  if (strictMode) {
116
89
  throw new Error(message);
117
90
  }
118
-
119
91
  _logger.default.info(message);
120
-
121
92
  return {};
122
93
  }
123
-
124
94
  let lprojRoot;
125
-
126
95
  for (const subfolder of [`${language}.lproj`, localizableStringsDir, '']) {
127
96
  lprojRoot = _path.default.resolve(app, subfolder);
128
-
129
97
  if (await _support.fs.exists(lprojRoot)) {
130
98
  break;
131
99
  }
132
-
133
100
  const message = `No '${lprojRoot}' resources folder has been found`;
134
-
135
101
  if (strictMode) {
136
102
  throw new Error(message);
137
103
  }
138
-
139
104
  _logger.default.debug(message);
140
105
  }
141
-
142
106
  _logger.default.info(`Will extract resource strings from '${lprojRoot}'`);
143
-
144
107
  const resourcePaths = [];
145
-
146
108
  if (stringFile) {
147
109
  const dstPath = _path.default.resolve(lprojRoot, stringFile);
148
-
149
110
  if (await _support.fs.exists(dstPath)) {
150
111
  resourcePaths.push(dstPath);
151
112
  } else {
152
113
  const message = `No '${dstPath}' resource file has been found for '${app}'`;
153
-
154
114
  if (strictMode) {
155
115
  throw new Error(message);
156
116
  }
157
-
158
117
  _logger.default.info(message);
159
-
160
118
  _logger.default.info(`Getting all the available strings from '${lprojRoot}'`);
161
119
  }
162
120
  }
163
-
164
121
  if (_lodash.default.isEmpty(resourcePaths) && (await _support.fs.exists(lprojRoot))) {
165
122
  const resourceFiles = (await _support.fs.readdir(lprojRoot)).filter(name => _lodash.default.some([STRINGS_RESOURCE, STRINGSDICT_RESOURCE], x => name.endsWith(x))).map(name => _path.default.resolve(lprojRoot, name));
166
123
  resourcePaths.push(...resourceFiles);
167
124
  }
168
-
169
125
  _logger.default.info(`Got ${resourcePaths.length} resource file(s) in '${lprojRoot}'`);
170
-
171
126
  if (_lodash.default.isEmpty(resourcePaths)) {
172
127
  return {};
173
128
  }
174
-
175
129
  const resultStrings = {};
176
-
177
130
  const toAbsolutePath = function (p) {
178
131
  return _path.default.isAbsolute(p) ? p : _path.default.resolve(process.cwd(), p);
179
132
  };
180
-
181
133
  for (const resourcePath of resourcePaths) {
182
134
  if (!_support.util.isSubPath(toAbsolutePath(resourcePath), toAbsolutePath(app))) {
183
135
  throw new Error(`'${resourcePath}' is expected to be located under '${app}'`);
184
136
  }
185
-
186
137
  try {
187
138
  const data = await readResource(resourcePath);
188
-
189
139
  _logger.default.debug(`Parsed ${_lodash.default.keys(data).length} string(s) from '${resourcePath}'`);
190
-
191
140
  _lodash.default.merge(resultStrings, data);
192
141
  } catch (e) {
193
142
  _logger.default.warn(`Cannot parse '${resourcePath}' resource. Original error: ${e.message}`);
194
143
  }
195
144
  }
196
-
197
145
  _logger.default.info(`Got ${_lodash.default.keys(resultStrings).length} string(s) from '${lprojRoot}'`);
198
-
199
146
  return resultStrings;
200
147
  }
201
148
 
@@ -220,12 +167,10 @@ async function findApps(archivePath, appExtensions) {
220
167
 
221
168
  async function isolateAppBundle(appRoot) {
222
169
  const tmpRoot = await _support.tempDir.openDir();
223
-
224
170
  const dstRoot = _path.default.join(tmpRoot, _path.default.basename(appRoot));
225
-
226
171
  await _support.fs.mv(appRoot, dstRoot, {
227
172
  mkdirp: true
228
173
  });
229
174
  return dstRoot;
230
175
  }
231
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTVFJJTkdTRElDVF9SRVNPVVJDRSIsIlNUUklOR1NfUkVTT1VSQ0UiLCJTQUZBUklfQlVORExFX0lEIiwiQVBQX0VYVCIsIklQQV9FWFQiLCJleHRyYWN0UGxpc3RFbnRyeSIsImFwcCIsImVudHJ5TmFtZSIsInBsaXN0UGF0aCIsInBhdGgiLCJyZXNvbHZlIiwicGxpc3QiLCJwYXJzZVBsaXN0RmlsZSIsImVyciIsIkVycm9yIiwiYmFzZW5hbWUiLCJtZXNzYWdlIiwiZXh0cmFjdEJ1bmRsZUlkIiwiYnVuZGxlSWQiLCJsb2ciLCJkZWJ1ZyIsImZldGNoU3VwcG9ydGVkQXBwUGxhdGZvcm1zIiwicmVzdWx0IiwiXyIsImlzQXJyYXkiLCJ3YXJuIiwidmVyaWZ5QXBwbGljYXRpb25QbGF0Zm9ybSIsImV4cGVjdGVkUGxhdGZvcm0iLCJzdXBwb3J0ZWRQbGF0Zm9ybXMiLCJKU09OIiwic3RyaW5naWZ5IiwiaXNTaW11bGF0b3IiLCJpc1R2T1MiLCJwcmVmaXgiLCJzdWZmaXgiLCJkc3RQbGF0Zm9ybSIsImluY2x1ZGVzIiwicmVhZFJlc291cmNlIiwicmVzb3VyY2VQYXRoIiwiZGF0YSIsImtleSIsInZhbHVlIiwidG9QYWlycyIsImlzU3RyaW5nIiwicGFyc2VMb2NhbGl6YWJsZVN0cmluZ3MiLCJvcHRzIiwibGFuZ3VhZ2UiLCJsb2NhbGl6YWJsZVN0cmluZ3NEaXIiLCJzdHJpbmdGaWxlIiwic3RyaWN0TW9kZSIsImluZm8iLCJscHJvalJvb3QiLCJzdWJmb2xkZXIiLCJmcyIsImV4aXN0cyIsInJlc291cmNlUGF0aHMiLCJkc3RQYXRoIiwicHVzaCIsImlzRW1wdHkiLCJyZXNvdXJjZUZpbGVzIiwicmVhZGRpciIsImZpbHRlciIsIm5hbWUiLCJzb21lIiwieCIsImVuZHNXaXRoIiwibWFwIiwibGVuZ3RoIiwicmVzdWx0U3RyaW5ncyIsInRvQWJzb2x1dGVQYXRoIiwicCIsImlzQWJzb2x1dGUiLCJwcm9jZXNzIiwiY3dkIiwidXRpbCIsImlzU3ViUGF0aCIsImtleXMiLCJtZXJnZSIsImUiLCJpc0FwcEJ1bmRsZSIsImFwcFBhdGgiLCJ0b0xvd2VyIiwic3RhdCIsImlzRGlyZWN0b3J5Iiwiam9pbiIsImZpbmRBcHBzIiwiYXJjaGl2ZVBhdGgiLCJhcHBFeHRlbnNpb25zIiwidXNlU3lzdGVtVW56aXBFbnYiLCJlbnYiLCJBUFBJVU1fUFJFRkVSX1NZU1RFTV9VTlpJUCIsInVzZVN5c3RlbVVuemlwIiwidG1wUm9vdCIsInRlbXBEaXIiLCJvcGVuRGlyIiwiemlwIiwiZXh0cmFjdEFsbFRvIiwiZ2xvYlBhdHRlcm4iLCJleHQiLCJyZXBsYWNlIiwic29ydGVkQnVuZGxlSXRlbXMiLCJnbG9iIiwic3RyaWN0Iiwic29ydCIsImEiLCJiIiwic3BsaXQiLCJzZXAiLCJpc29sYXRlQXBwQnVuZGxlIiwiYXBwUm9vdCIsImRzdFJvb3QiLCJtdiIsIm1rZGlycCJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9hcHAtdXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcGxpc3QsIGZzLCB1dGlsLCB0ZW1wRGlyLCB6aXAgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyLmpzJztcblxuY29uc3QgU1RSSU5HU0RJQ1RfUkVTT1VSQ0UgPSAnLnN0cmluZ3NkaWN0JztcbmNvbnN0IFNUUklOR1NfUkVTT1VSQ0UgPSAnLnN0cmluZ3MnO1xuY29uc3QgU0FGQVJJX0JVTkRMRV9JRCA9ICdjb20uYXBwbGUubW9iaWxlc2FmYXJpJztcbmNvbnN0IEFQUF9FWFQgPSAnLmFwcCc7XG5jb25zdCBJUEFfRVhUID0gJy5pcGEnO1xuXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0UGxpc3RFbnRyeSAoYXBwLCBlbnRyeU5hbWUpIHtcbiAgY29uc3QgcGxpc3RQYXRoID0gcGF0aC5yZXNvbHZlKGFwcCwgJ0luZm8ucGxpc3QnKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKGF3YWl0IHBsaXN0LnBhcnNlUGxpc3RGaWxlKHBsaXN0UGF0aCkpW2VudHJ5TmFtZV07XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGV4dHJhY3QgSW5mby5wbGlzdCBmcm9tICcke3BhdGguYmFzZW5hbWUoYXBwKX0nOiAke2Vyci5tZXNzYWdlfWApO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RCdW5kbGVJZCAoYXBwKSB7XG4gIGNvbnN0IGJ1bmRsZUlkID0gYXdhaXQgZXh0cmFjdFBsaXN0RW50cnkoYXBwLCAnQ0ZCdW5kbGVJZGVudGlmaWVyJyk7XG4gIGxvZy5kZWJ1ZyhgR2V0dGluZyBidW5kbGUgSUQgZnJvbSBhcHAgJyR7YXBwfSc6ICcke2J1bmRsZUlkfSdgKTtcbiAgcmV0dXJuIGJ1bmRsZUlkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFN1cHBvcnRlZEFwcFBsYXRmb3JtcyAoYXBwKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXh0cmFjdFBsaXN0RW50cnkoYXBwLCAnQ0ZCdW5kbGVTdXBwb3J0ZWRQbGF0Zm9ybXMnKTtcbiAgICBpZiAoIV8uaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICBsb2cud2FybihgJHtwYXRoLmJhc2VuYW1lKGFwcCl9JzogQ0ZCdW5kbGVTdXBwb3J0ZWRQbGF0Zm9ybXMgaXMgbm90IGEgdmFsaWQgbGlzdGApO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybihcbiAgICAgIGBDYW5ub3QgZXh0cmFjdCB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgcGxhdGZvcm1zIGZyb20gJyR7cGF0aC5iYXNlbmFtZShhcHApfSc6ICR7ZXJyLm1lc3NhZ2V9YFxuICAgICk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUGxhdGZvcm1PcHRzXG4gKlxuICogQHByb3BlcnR5IHtib29sZWFufSBpc1NpbXVsYXRvciAtIFdoZXRoZXIgdGhlIGRlc3RpbmF0aW9uIHBsYXRmb3JtIGlzIGEgU2ltdWxhdG9yXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzVHZPUyAtIFdoZXRoZXIgdGhlIGRlc3RpbmF0aW9uIHBsYXRmb3JtIGlzIGEgU2ltdWxhdG9yXG4gKi9cblxuLyoqXG4gKiBWZXJpZnkgd2hldGhlciB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gaXMgY29tcGF0aWJsZSB0byB0aGVcbiAqIHBsYXRmb3JtIHdoZXJlIGl0IGlzIGdvaW5nIHRvIGJlIGluc3RhbGxlZCBhbmQgdGVzdGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHAgLSBUaGUgYWN0dWFsIHBhdGggdG8gdGhlIGFwcGxpY2F0aW9uIGJ1bmRsZVxuICogQHBhcmFtIHtQbGF0Zm9ybU9wdHN9IGV4cGVjdGVkUGxhdGZvcm1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBidW5kbGUgYXJjaGl0ZWN0dXJlIGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCBkZXZpY2UgYXJjaGl0ZWN0dXJlLlxuICovXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlBcHBsaWNhdGlvblBsYXRmb3JtIChhcHAsIGV4cGVjdGVkUGxhdGZvcm0pIHtcbiAgbG9nLmRlYnVnKCdWZXJpZnlpbmcgYXBwbGljYXRpb24gcGxhdGZvcm0nKTtcblxuICBjb25zdCBzdXBwb3J0ZWRQbGF0Zm9ybXMgPSBhd2FpdCBmZXRjaFN1cHBvcnRlZEFwcFBsYXRmb3JtcyhhcHApO1xuICBsb2cuZGVidWcoYENGQnVuZGxlU3VwcG9ydGVkUGxhdGZvcm1zOiAke0pTT04uc3RyaW5naWZ5KHN1cHBvcnRlZFBsYXRmb3Jtcyl9YCk7XG5cbiAgY29uc3Qge1xuICAgIGlzU2ltdWxhdG9yLFxuICAgIGlzVHZPUyxcbiAgfSA9IGV4cGVjdGVkUGxhdGZvcm07XG4gIGNvbnN0IHByZWZpeCA9IGlzVHZPUyA/ICdBcHBsZVRWJyA6ICdpUGhvbmUnO1xuICBjb25zdCBzdWZmaXggPSBpc1NpbXVsYXRvciA/ICdTaW11bGF0b3InIDogJ09TJztcbiAgY29uc3QgZHN0UGxhdGZvcm0gPSBgJHtwcmVmaXh9JHtzdWZmaXh9YDtcbiAgaWYgKCFzdXBwb3J0ZWRQbGF0Zm9ybXMuaW5jbHVkZXMoZHN0UGxhdGZvcm0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2lzU2ltdWxhdG9yID8gJ1NpbXVsYXRvcicgOiAnUmVhbCBkZXZpY2UnfSBhcmNoaXRlY3R1cmUgaXMgdW5zdXBwb3J0ZWQgYnkgdGhlICcke2FwcH0nIGFwcGxpY2F0aW9uLiBgICtcbiAgICAgIGBNYWtlIHN1cmUgdGhlIGNvcnJlY3QgZGVwbG95bWVudCB0YXJnZXQgaGFzIGJlZW4gc2VsZWN0ZWQgZm9yIGl0cyBjb21waWxhdGlvbiBpbiBYY29kZS5gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUmVzb3VyY2UgKHJlc291cmNlUGF0aCkge1xuICBjb25zdCBkYXRhID0gYXdhaXQgcGxpc3QucGFyc2VQbGlzdEZpbGUocmVzb3VyY2VQYXRoKTtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIF8udG9QYWlycyhkYXRhKSkge1xuICAgIHJlc3VsdFtrZXldID0gXy5pc1N0cmluZyh2YWx1ZSkgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBwYXJzZUxvY2FsaXphYmxlU3RyaW5ncyAob3B0cykge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxhbmd1YWdlID0gJ2VuJyxcbiAgICBsb2NhbGl6YWJsZVN0cmluZ3NEaXIsXG4gICAgc3RyaW5nRmlsZSxcbiAgICBzdHJpY3RNb2RlLFxuICB9ID0gb3B0cztcblxuICBpZiAoIWFwcCkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBgU3RyaW5ncyBleHRyYWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaWYgJ2FwcCcgY2FwYWJpbGl0eSBpcyBub3Qgc2V0YDtcbiAgICBpZiAoc3RyaWN0TW9kZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICBsb2cuaW5mbyhtZXNzYWdlKTtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBsZXQgbHByb2pSb290O1xuICBmb3IgKGNvbnN0IHN1YmZvbGRlciBvZiBbYCR7bGFuZ3VhZ2V9Lmxwcm9qYCwgbG9jYWxpemFibGVTdHJpbmdzRGlyLCAnJ10pIHtcbiAgICBscHJvalJvb3QgPSBwYXRoLnJlc29sdmUoYXBwLCBzdWJmb2xkZXIpO1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMobHByb2pSb290KSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgTm8gJyR7bHByb2pSb290fScgcmVzb3VyY2VzIGZvbGRlciBoYXMgYmVlbiBmb3VuZGA7XG4gICAgaWYgKHN0cmljdE1vZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKG1lc3NhZ2UpO1xuICB9XG4gIGxvZy5pbmZvKGBXaWxsIGV4dHJhY3QgcmVzb3VyY2Ugc3RyaW5ncyBmcm9tICcke2xwcm9qUm9vdH0nYCk7XG5cbiAgY29uc3QgcmVzb3VyY2VQYXRocyA9IFtdO1xuICBpZiAoc3RyaW5nRmlsZSkge1xuICAgIGNvbnN0IGRzdFBhdGggPSBwYXRoLnJlc29sdmUobHByb2pSb290LCBzdHJpbmdGaWxlKTtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGRzdFBhdGgpKSB7XG4gICAgICByZXNvdXJjZVBhdGhzLnB1c2goZHN0UGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgTm8gJyR7ZHN0UGF0aH0nIHJlc291cmNlIGZpbGUgaGFzIGJlZW4gZm91bmQgZm9yICcke2FwcH0nYDtcbiAgICAgIGlmIChzdHJpY3RNb2RlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKG1lc3NhZ2UpO1xuICAgICAgbG9nLmluZm8oYEdldHRpbmcgYWxsIHRoZSBhdmFpbGFibGUgc3RyaW5ncyBmcm9tICcke2xwcm9qUm9vdH0nYCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKF8uaXNFbXB0eShyZXNvdXJjZVBhdGhzKSAmJiBhd2FpdCBmcy5leGlzdHMobHByb2pSb290KSkge1xuICAgIGNvbnN0IHJlc291cmNlRmlsZXMgPSAoYXdhaXQgZnMucmVhZGRpcihscHJvalJvb3QpKVxuICAgICAgLmZpbHRlcigobmFtZSkgPT4gXy5zb21lKFtTVFJJTkdTX1JFU09VUkNFLCBTVFJJTkdTRElDVF9SRVNPVVJDRV0sICh4KSA9PiBuYW1lLmVuZHNXaXRoKHgpKSlcbiAgICAgIC5tYXAoKG5hbWUpID0+IHBhdGgucmVzb2x2ZShscHJvalJvb3QsIG5hbWUpKTtcbiAgICByZXNvdXJjZVBhdGhzLnB1c2goLi4ucmVzb3VyY2VGaWxlcyk7XG4gIH1cbiAgbG9nLmluZm8oYEdvdCAke3Jlc291cmNlUGF0aHMubGVuZ3RofSByZXNvdXJjZSBmaWxlKHMpIGluICcke2xwcm9qUm9vdH0nYCk7XG5cbiAgaWYgKF8uaXNFbXB0eShyZXNvdXJjZVBhdGhzKSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdFN0cmluZ3MgPSB7fTtcbiAgY29uc3QgdG9BYnNvbHV0ZVBhdGggPSBmdW5jdGlvbiAocCkge1xuICAgIHJldHVybiBwYXRoLmlzQWJzb2x1dGUocCkgPyBwIDogcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHApO1xuICB9O1xuICBmb3IgKGNvbnN0IHJlc291cmNlUGF0aCBvZiByZXNvdXJjZVBhdGhzKSB7XG4gICAgaWYgKCF1dGlsLmlzU3ViUGF0aCh0b0Fic29sdXRlUGF0aChyZXNvdXJjZVBhdGgpLCB0b0Fic29sdXRlUGF0aChhcHApKSkge1xuICAgICAgLy8gc2VjdXJpdHkgcHJlY2F1dGlvblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtyZXNvdXJjZVBhdGh9JyBpcyBleHBlY3RlZCB0byBiZSBsb2NhdGVkIHVuZGVyICcke2FwcH0nYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVhZFJlc291cmNlKHJlc291cmNlUGF0aCk7XG4gICAgICBsb2cuZGVidWcoYFBhcnNlZCAke18ua2V5cyhkYXRhKS5sZW5ndGh9IHN0cmluZyhzKSBmcm9tICcke3Jlc291cmNlUGF0aH0nYCk7XG4gICAgICBfLm1lcmdlKHJlc3VsdFN0cmluZ3MsIGRhdGEpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy53YXJuKGBDYW5ub3QgcGFyc2UgJyR7cmVzb3VyY2VQYXRofScgcmVzb3VyY2UuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBsb2cuaW5mbyhgR290ICR7Xy5rZXlzKHJlc3VsdFN0cmluZ3MpLmxlbmd0aH0gc3RyaW5nKHMpIGZyb20gJyR7bHByb2pSb290fSdgKTtcbiAgcmV0dXJuIHJlc3VsdFN0cmluZ3M7XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gcGF0aCBvbiB0aGUgZmlsZSBzeXN0ZW0gcG9pbnRzIHRvIHRoZSAuYXBwIGJ1bmRsZSByb290XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggUG9zc2libGUgLmFwcCBidW5kbGUgcm9vdFxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIHBhdGggcG9pbnRzIHRvIGFuIC5hcHAgYnVuZGxlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzQXBwQnVuZGxlIChhcHBQYXRoKSB7XG4gIHJldHVybiBfLmVuZHNXaXRoKF8udG9Mb3dlcihhcHBQYXRoKSwgQVBQX0VYVClcbiAgICAmJiAoYXdhaXQgZnMuc3RhdChhcHBQYXRoKSkuaXNEaXJlY3RvcnkoKVxuICAgICYmIGF3YWl0IGZzLmV4aXN0cyhwYXRoLmpvaW4oYXBwUGF0aCwgJ0luZm8ucGxpc3QnKSk7XG59XG5cbi8qKlxuICogRXh0cmFjdCB0aGUgZ2l2ZW4gYXJjaGl2ZSBhbmQgbG9va3MgZm9yIGl0ZW1zIHdpdGggZ2l2ZW4gZXh0ZW5zaW9ucyBpbiBpdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmNoaXZlUGF0aCBGdWxsIHBhdGggdG8gYSAuemlwIGFyY2hpdmVcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gYXBwRXh0ZW5zaW9ucyBMaXN0IG9mIG1hdGNoaW5nIGl0ZW0gZXh0ZW5zaW9uc1xuICogQHJldHVybnMge1tzdHJpbmcsIEFycmF5PFN0cmluZz5dfSBUdXBsZSwgd2hlcmUgdGhlIGZpcnN0IGVsZW1lbnQgcG9pbnRzIHRvXG4gKiBhIHRlbXBvcmFyeSBmb2xkZXIgcm9vdCB3aGVyZSB0aGUgYXJjaGl2ZSBoYXMgYmVlbiBleHRyYWN0ZWQgYW5kIHRoZSBzZWNvbmQgaXRlbVxuICogY29udGFpbnMgYSBsaXN0IG9mIHJlbGF0aXZlIHBhdGhzIHRvIG1hdGNoZWQgaXRlbXNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmluZEFwcHMgKGFyY2hpdmVQYXRoLCBhcHBFeHRlbnNpb25zKSB7XG4gIGNvbnN0IHVzZVN5c3RlbVVuemlwRW52ID0gcHJvY2Vzcy5lbnYuQVBQSVVNX1BSRUZFUl9TWVNURU1fVU5aSVA7XG4gIGNvbnN0IHVzZVN5c3RlbVVuemlwID0gXy5pc0VtcHR5KHVzZVN5c3RlbVVuemlwRW52KVxuICAgIHx8ICFbJzAnLCAnZmFsc2UnXS5pbmNsdWRlcyhfLnRvTG93ZXIodXNlU3lzdGVtVW56aXBFbnYpKTtcbiAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICBhd2FpdCB6aXAuZXh0cmFjdEFsbFRvKGFyY2hpdmVQYXRoLCB0bXBSb290LCB7dXNlU3lzdGVtVW56aXB9KTtcbiAgY29uc3QgZ2xvYlBhdHRlcm4gPSBgKiovKi4rKCR7YXBwRXh0ZW5zaW9ucy5tYXAoKGV4dCkgPT4gZXh0LnJlcGxhY2UoL15cXC4vLCAnJykpLmpvaW4oJ3wnKX0pYDtcbiAgY29uc3Qgc29ydGVkQnVuZGxlSXRlbXMgPSAoYXdhaXQgZnMuZ2xvYihnbG9iUGF0dGVybiwge1xuICAgIGN3ZDogdG1wUm9vdCxcbiAgICBzdHJpY3Q6IGZhbHNlLFxuICB9KSkuc29ydCgoYSwgYikgPT4gYS5zcGxpdChwYXRoLnNlcCkubGVuZ3RoIC0gYi5zcGxpdChwYXRoLnNlcCkubGVuZ3RoKTtcbiAgcmV0dXJuIFt0bXBSb290LCBzb3J0ZWRCdW5kbGVJdGVtc107XG59XG5cbi8qKlxuICogTW92ZXMgdGhlIGFwcGxpY2F0aW9uIGJ1bmRsZSB0byBhIG5ld2x5IGNyZWF0ZWQgdGVtcG9yYXJ5IGZvbGRlclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBSb290IEZ1bGwgcGF0aCB0byB0aGUgLmFwcCBidW5kbGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBuZXcgcGF0aCB0byB0aGUgYXBwIGJ1bmRsZS5cbiAqIFRoZSBuYW1lIG9mIHRoZSBhcHAgYnVuZGxlIHJlbWFpbnMgdGhvdWdoXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzb2xhdGVBcHBCdW5kbGUgKGFwcFJvb3QpIHtcbiAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICBjb25zdCBkc3RSb290ID0gcGF0aC5qb2luKHRtcFJvb3QsIHBhdGguYmFzZW5hbWUoYXBwUm9vdCkpO1xuICBhd2FpdCBmcy5tdihhcHBSb290LCBkc3RSb290LCB7bWtkaXJwOiB0cnVlfSk7XG4gIHJldHVybiBkc3RSb290O1xufVxuXG5leHBvcnQge1xuICBleHRyYWN0QnVuZGxlSWQsIHZlcmlmeUFwcGxpY2F0aW9uUGxhdGZvcm0sIHBhcnNlTG9jYWxpemFibGVTdHJpbmdzLFxuICBTQUZBUklfQlVORExFX0lELCBmZXRjaFN1cHBvcnRlZEFwcFBsYXRmb3JtcywgQVBQX0VYVCwgSVBBX0VY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
176
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTVFJJTkdTRElDVF9SRVNPVVJDRSIsIlNUUklOR1NfUkVTT1VSQ0UiLCJTQUZBUklfQlVORExFX0lEIiwiQVBQX0VYVCIsIklQQV9FWFQiLCJleHRyYWN0UGxpc3RFbnRyeSIsImFwcCIsImVudHJ5TmFtZSIsInBsaXN0UGF0aCIsInBhdGgiLCJyZXNvbHZlIiwicGxpc3QiLCJwYXJzZVBsaXN0RmlsZSIsImVyciIsIkVycm9yIiwiYmFzZW5hbWUiLCJtZXNzYWdlIiwiZXh0cmFjdEJ1bmRsZUlkIiwiYnVuZGxlSWQiLCJsb2ciLCJkZWJ1ZyIsImZldGNoU3VwcG9ydGVkQXBwUGxhdGZvcm1zIiwicmVzdWx0IiwiXyIsImlzQXJyYXkiLCJ3YXJuIiwidmVyaWZ5QXBwbGljYXRpb25QbGF0Zm9ybSIsImV4cGVjdGVkUGxhdGZvcm0iLCJzdXBwb3J0ZWRQbGF0Zm9ybXMiLCJKU09OIiwic3RyaW5naWZ5IiwiaXNTaW11bGF0b3IiLCJpc1R2T1MiLCJwcmVmaXgiLCJzdWZmaXgiLCJkc3RQbGF0Zm9ybSIsImluY2x1ZGVzIiwicmVhZFJlc291cmNlIiwicmVzb3VyY2VQYXRoIiwiZGF0YSIsImtleSIsInZhbHVlIiwidG9QYWlycyIsImlzU3RyaW5nIiwicGFyc2VMb2NhbGl6YWJsZVN0cmluZ3MiLCJvcHRzIiwibGFuZ3VhZ2UiLCJsb2NhbGl6YWJsZVN0cmluZ3NEaXIiLCJzdHJpbmdGaWxlIiwic3RyaWN0TW9kZSIsImluZm8iLCJscHJvalJvb3QiLCJzdWJmb2xkZXIiLCJmcyIsImV4aXN0cyIsInJlc291cmNlUGF0aHMiLCJkc3RQYXRoIiwicHVzaCIsImlzRW1wdHkiLCJyZXNvdXJjZUZpbGVzIiwicmVhZGRpciIsImZpbHRlciIsIm5hbWUiLCJzb21lIiwieCIsImVuZHNXaXRoIiwibWFwIiwibGVuZ3RoIiwicmVzdWx0U3RyaW5ncyIsInRvQWJzb2x1dGVQYXRoIiwicCIsImlzQWJzb2x1dGUiLCJwcm9jZXNzIiwiY3dkIiwidXRpbCIsImlzU3ViUGF0aCIsImtleXMiLCJtZXJnZSIsImUiLCJpc0FwcEJ1bmRsZSIsImFwcFBhdGgiLCJ0b0xvd2VyIiwic3RhdCIsImlzRGlyZWN0b3J5Iiwiam9pbiIsImZpbmRBcHBzIiwiYXJjaGl2ZVBhdGgiLCJhcHBFeHRlbnNpb25zIiwidXNlU3lzdGVtVW56aXBFbnYiLCJlbnYiLCJBUFBJVU1fUFJFRkVSX1NZU1RFTV9VTlpJUCIsInVzZVN5c3RlbVVuemlwIiwidG1wUm9vdCIsInRlbXBEaXIiLCJvcGVuRGlyIiwiemlwIiwiZXh0cmFjdEFsbFRvIiwiZ2xvYlBhdHRlcm4iLCJleHQiLCJyZXBsYWNlIiwic29ydGVkQnVuZGxlSXRlbXMiLCJnbG9iIiwic3RyaWN0Iiwic29ydCIsImEiLCJiIiwic3BsaXQiLCJzZXAiLCJpc29sYXRlQXBwQnVuZGxlIiwiYXBwUm9vdCIsImRzdFJvb3QiLCJtdiIsIm1rZGlycCJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9hcHAtdXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcGxpc3QsIGZzLCB1dGlsLCB0ZW1wRGlyLCB6aXAgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyLmpzJztcblxuY29uc3QgU1RSSU5HU0RJQ1RfUkVTT1VSQ0UgPSAnLnN0cmluZ3NkaWN0JztcbmNvbnN0IFNUUklOR1NfUkVTT1VSQ0UgPSAnLnN0cmluZ3MnO1xuY29uc3QgU0FGQVJJX0JVTkRMRV9JRCA9ICdjb20uYXBwbGUubW9iaWxlc2FmYXJpJztcbmNvbnN0IEFQUF9FWFQgPSAnLmFwcCc7XG5jb25zdCBJUEFfRVhUID0gJy5pcGEnO1xuXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0UGxpc3RFbnRyeSAoYXBwLCBlbnRyeU5hbWUpIHtcbiAgY29uc3QgcGxpc3RQYXRoID0gcGF0aC5yZXNvbHZlKGFwcCwgJ0luZm8ucGxpc3QnKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKGF3YWl0IHBsaXN0LnBhcnNlUGxpc3RGaWxlKHBsaXN0UGF0aCkpW2VudHJ5TmFtZV07XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGV4dHJhY3QgSW5mby5wbGlzdCBmcm9tICcke3BhdGguYmFzZW5hbWUoYXBwKX0nOiAke2Vyci5tZXNzYWdlfWApO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RCdW5kbGVJZCAoYXBwKSB7XG4gIGNvbnN0IGJ1bmRsZUlkID0gYXdhaXQgZXh0cmFjdFBsaXN0RW50cnkoYXBwLCAnQ0ZCdW5kbGVJZGVudGlmaWVyJyk7XG4gIGxvZy5kZWJ1ZyhgR2V0dGluZyBidW5kbGUgSUQgZnJvbSBhcHAgJyR7YXBwfSc6ICcke2J1bmRsZUlkfSdgKTtcbiAgcmV0dXJuIGJ1bmRsZUlkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFN1cHBvcnRlZEFwcFBsYXRmb3JtcyAoYXBwKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXh0cmFjdFBsaXN0RW50cnkoYXBwLCAnQ0ZCdW5kbGVTdXBwb3J0ZWRQbGF0Zm9ybXMnKTtcbiAgICBpZiAoIV8uaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICBsb2cud2FybihgJHtwYXRoLmJhc2VuYW1lKGFwcCl9JzogQ0ZCdW5kbGVTdXBwb3J0ZWRQbGF0Zm9ybXMgaXMgbm90IGEgdmFsaWQgbGlzdGApO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybihcbiAgICAgIGBDYW5ub3QgZXh0cmFjdCB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgcGxhdGZvcm1zIGZyb20gJyR7cGF0aC5iYXNlbmFtZShhcHApfSc6ICR7ZXJyLm1lc3NhZ2V9YFxuICAgICk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUGxhdGZvcm1PcHRzXG4gKlxuICogQHByb3BlcnR5IHtib29sZWFufSBpc1NpbXVsYXRvciAtIFdoZXRoZXIgdGhlIGRlc3RpbmF0aW9uIHBsYXRmb3JtIGlzIGEgU2ltdWxhdG9yXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzVHZPUyAtIFdoZXRoZXIgdGhlIGRlc3RpbmF0aW9uIHBsYXRmb3JtIGlzIGEgU2ltdWxhdG9yXG4gKi9cblxuLyoqXG4gKiBWZXJpZnkgd2hldGhlciB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gaXMgY29tcGF0aWJsZSB0byB0aGVcbiAqIHBsYXRmb3JtIHdoZXJlIGl0IGlzIGdvaW5nIHRvIGJlIGluc3RhbGxlZCBhbmQgdGVzdGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHAgLSBUaGUgYWN0dWFsIHBhdGggdG8gdGhlIGFwcGxpY2F0aW9uIGJ1bmRsZVxuICogQHBhcmFtIHtQbGF0Zm9ybU9wdHN9IGV4cGVjdGVkUGxhdGZvcm1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBidW5kbGUgYXJjaGl0ZWN0dXJlIGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCBkZXZpY2UgYXJjaGl0ZWN0dXJlLlxuICovXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlBcHBsaWNhdGlvblBsYXRmb3JtIChhcHAsIGV4cGVjdGVkUGxhdGZvcm0pIHtcbiAgbG9nLmRlYnVnKCdWZXJpZnlpbmcgYXBwbGljYXRpb24gcGxhdGZvcm0nKTtcblxuICBjb25zdCBzdXBwb3J0ZWRQbGF0Zm9ybXMgPSBhd2FpdCBmZXRjaFN1cHBvcnRlZEFwcFBsYXRmb3JtcyhhcHApO1xuICBsb2cuZGVidWcoYENGQnVuZGxlU3VwcG9ydGVkUGxhdGZvcm1zOiAke0pTT04uc3RyaW5naWZ5KHN1cHBvcnRlZFBsYXRmb3Jtcyl9YCk7XG5cbiAgY29uc3Qge1xuICAgIGlzU2ltdWxhdG9yLFxuICAgIGlzVHZPUyxcbiAgfSA9IGV4cGVjdGVkUGxhdGZvcm07XG4gIGNvbnN0IHByZWZpeCA9IGlzVHZPUyA/ICdBcHBsZVRWJyA6ICdpUGhvbmUnO1xuICBjb25zdCBzdWZmaXggPSBpc1NpbXVsYXRvciA/ICdTaW11bGF0b3InIDogJ09TJztcbiAgY29uc3QgZHN0UGxhdGZvcm0gPSBgJHtwcmVmaXh9JHtzdWZmaXh9YDtcbiAgaWYgKCFzdXBwb3J0ZWRQbGF0Zm9ybXMuaW5jbHVkZXMoZHN0UGxhdGZvcm0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2lzU2ltdWxhdG9yID8gJ1NpbXVsYXRvcicgOiAnUmVhbCBkZXZpY2UnfSBhcmNoaXRlY3R1cmUgaXMgdW5zdXBwb3J0ZWQgYnkgdGhlICcke2FwcH0nIGFwcGxpY2F0aW9uLiBgICtcbiAgICAgIGBNYWtlIHN1cmUgdGhlIGNvcnJlY3QgZGVwbG95bWVudCB0YXJnZXQgaGFzIGJlZW4gc2VsZWN0ZWQgZm9yIGl0cyBjb21waWxhdGlvbiBpbiBYY29kZS5gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUmVzb3VyY2UgKHJlc291cmNlUGF0aCkge1xuICBjb25zdCBkYXRhID0gYXdhaXQgcGxpc3QucGFyc2VQbGlzdEZpbGUocmVzb3VyY2VQYXRoKTtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIF8udG9QYWlycyhkYXRhKSkge1xuICAgIHJlc3VsdFtrZXldID0gXy5pc1N0cmluZyh2YWx1ZSkgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBwYXJzZUxvY2FsaXphYmxlU3RyaW5ncyAob3B0cykge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxhbmd1YWdlID0gJ2VuJyxcbiAgICBsb2NhbGl6YWJsZVN0cmluZ3NEaXIsXG4gICAgc3RyaW5nRmlsZSxcbiAgICBzdHJpY3RNb2RlLFxuICB9ID0gb3B0cztcblxuICBpZiAoIWFwcCkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBgU3RyaW5ncyBleHRyYWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaWYgJ2FwcCcgY2FwYWJpbGl0eSBpcyBub3Qgc2V0YDtcbiAgICBpZiAoc3RyaWN0TW9kZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICBsb2cuaW5mbyhtZXNzYWdlKTtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBsZXQgbHByb2pSb290O1xuICBmb3IgKGNvbnN0IHN1YmZvbGRlciBvZiBbYCR7bGFuZ3VhZ2V9Lmxwcm9qYCwgbG9jYWxpemFibGVTdHJpbmdzRGlyLCAnJ10pIHtcbiAgICBscHJvalJvb3QgPSBwYXRoLnJlc29sdmUoYXBwLCBzdWJmb2xkZXIpO1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMobHByb2pSb290KSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgTm8gJyR7bHByb2pSb290fScgcmVzb3VyY2VzIGZvbGRlciBoYXMgYmVlbiBmb3VuZGA7XG4gICAgaWYgKHN0cmljdE1vZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKG1lc3NhZ2UpO1xuICB9XG4gIGxvZy5pbmZvKGBXaWxsIGV4dHJhY3QgcmVzb3VyY2Ugc3RyaW5ncyBmcm9tICcke2xwcm9qUm9vdH0nYCk7XG5cbiAgY29uc3QgcmVzb3VyY2VQYXRocyA9IFtdO1xuICBpZiAoc3RyaW5nRmlsZSkge1xuICAgIGNvbnN0IGRzdFBhdGggPSBwYXRoLnJlc29sdmUobHByb2pSb290LCBzdHJpbmdGaWxlKTtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGRzdFBhdGgpKSB7XG4gICAgICByZXNvdXJjZVBhdGhzLnB1c2goZHN0UGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgTm8gJyR7ZHN0UGF0aH0nIHJlc291cmNlIGZpbGUgaGFzIGJlZW4gZm91bmQgZm9yICcke2FwcH0nYDtcbiAgICAgIGlmIChzdHJpY3RNb2RlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKG1lc3NhZ2UpO1xuICAgICAgbG9nLmluZm8oYEdldHRpbmcgYWxsIHRoZSBhdmFpbGFibGUgc3RyaW5ncyBmcm9tICcke2xwcm9qUm9vdH0nYCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKF8uaXNFbXB0eShyZXNvdXJjZVBhdGhzKSAmJiBhd2FpdCBmcy5leGlzdHMobHByb2pSb290KSkge1xuICAgIGNvbnN0IHJlc291cmNlRmlsZXMgPSAoYXdhaXQgZnMucmVhZGRpcihscHJvalJvb3QpKVxuICAgICAgLmZpbHRlcigobmFtZSkgPT4gXy5zb21lKFtTVFJJTkdTX1JFU09VUkNFLCBTVFJJTkdTRElDVF9SRVNPVVJDRV0sICh4KSA9PiBuYW1lLmVuZHNXaXRoKHgpKSlcbiAgICAgIC5tYXAoKG5hbWUpID0+IHBhdGgucmVzb2x2ZShscHJvalJvb3QsIG5hbWUpKTtcbiAgICByZXNvdXJjZVBhdGhzLnB1c2goLi4ucmVzb3VyY2VGaWxlcyk7XG4gIH1cbiAgbG9nLmluZm8oYEdvdCAke3Jlc291cmNlUGF0aHMubGVuZ3RofSByZXNvdXJjZSBmaWxlKHMpIGluICcke2xwcm9qUm9vdH0nYCk7XG5cbiAgaWYgKF8uaXNFbXB0eShyZXNvdXJjZVBhdGhzKSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdFN0cmluZ3MgPSB7fTtcbiAgY29uc3QgdG9BYnNvbHV0ZVBhdGggPSBmdW5jdGlvbiAocCkge1xuICAgIHJldHVybiBwYXRoLmlzQWJzb2x1dGUocCkgPyBwIDogcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHApO1xuICB9O1xuICBmb3IgKGNvbnN0IHJlc291cmNlUGF0aCBvZiByZXNvdXJjZVBhdGhzKSB7XG4gICAgaWYgKCF1dGlsLmlzU3ViUGF0aCh0b0Fic29sdXRlUGF0aChyZXNvdXJjZVBhdGgpLCB0b0Fic29sdXRlUGF0aChhcHApKSkge1xuICAgICAgLy8gc2VjdXJpdHkgcHJlY2F1dGlvblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtyZXNvdXJjZVBhdGh9JyBpcyBleHBlY3RlZCB0byBiZSBsb2NhdGVkIHVuZGVyICcke2FwcH0nYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVhZFJlc291cmNlKHJlc291cmNlUGF0aCk7XG4gICAgICBsb2cuZGVidWcoYFBhcnNlZCAke18ua2V5cyhkYXRhKS5sZW5ndGh9IHN0cmluZyhzKSBmcm9tICcke3Jlc291cmNlUGF0aH0nYCk7XG4gICAgICBfLm1lcmdlKHJlc3VsdFN0cmluZ3MsIGRhdGEpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy53YXJuKGBDYW5ub3QgcGFyc2UgJyR7cmVzb3VyY2VQYXRofScgcmVzb3VyY2UuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBsb2cuaW5mbyhgR290ICR7Xy5rZXlzKHJlc3VsdFN0cmluZ3MpLmxlbmd0aH0gc3RyaW5nKHMpIGZyb20gJyR7bHByb2pSb290fSdgKTtcbiAgcmV0dXJuIHJlc3VsdFN0cmluZ3M7XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gcGF0aCBvbiB0aGUgZmlsZSBzeXN0ZW0gcG9pbnRzIHRvIHRoZSAuYXBwIGJ1bmRsZSByb290XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggUG9zc2libGUgLmFwcCBidW5kbGUgcm9vdFxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIHBhdGggcG9pbnRzIHRvIGFuIC5hcHAgYnVuZGxlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzQXBwQnVuZGxlIChhcHBQYXRoKSB7XG4gIHJldHVybiBfLmVuZHNXaXRoKF8udG9Mb3dlcihhcHBQYXRoKSwgQVBQX0VYVClcbiAgICAmJiAoYXdhaXQgZnMuc3RhdChhcHBQYXRoKSkuaXNEaXJlY3RvcnkoKVxuICAgICYmIGF3YWl0IGZzLmV4aXN0cyhwYXRoLmpvaW4oYXBwUGF0aCwgJ0luZm8ucGxpc3QnKSk7XG59XG5cbi8qKlxuICogRXh0cmFjdCB0aGUgZ2l2ZW4gYXJjaGl2ZSBhbmQgbG9va3MgZm9yIGl0ZW1zIHdpdGggZ2l2ZW4gZXh0ZW5zaW9ucyBpbiBpdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmNoaXZlUGF0aCBGdWxsIHBhdGggdG8gYSAuemlwIGFyY2hpdmVcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gYXBwRXh0ZW5zaW9ucyBMaXN0IG9mIG1hdGNoaW5nIGl0ZW0gZXh0ZW5zaW9uc1xuICogQHJldHVybnMge1tzdHJpbmcsIEFycmF5PFN0cmluZz5dfSBUdXBsZSwgd2hlcmUgdGhlIGZpcnN0IGVsZW1lbnQgcG9pbnRzIHRvXG4gKiBhIHRlbXBvcmFyeSBmb2xkZXIgcm9vdCB3aGVyZSB0aGUgYXJjaGl2ZSBoYXMgYmVlbiBleHRyYWN0ZWQgYW5kIHRoZSBzZWNvbmQgaXRlbVxuICogY29udGFpbnMgYSBsaXN0IG9mIHJlbGF0aXZlIHBhdGhzIHRvIG1hdGNoZWQgaXRlbXNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmluZEFwcHMgKGFyY2hpdmVQYXRoLCBhcHBFeHRlbnNpb25zKSB7XG4gIGNvbnN0IHVzZVN5c3RlbVVuemlwRW52ID0gcHJvY2Vzcy5lbnYuQVBQSVVNX1BSRUZFUl9TWVNURU1fVU5aSVA7XG4gIGNvbnN0IHVzZVN5c3RlbVVuemlwID0gXy5pc0VtcHR5KHVzZVN5c3RlbVVuemlwRW52KVxuICAgIHx8ICFbJzAnLCAnZmFsc2UnXS5pbmNsdWRlcyhfLnRvTG93ZXIodXNlU3lzdGVtVW56aXBFbnYpKTtcbiAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICBhd2FpdCB6aXAuZXh0cmFjdEFsbFRvKGFyY2hpdmVQYXRoLCB0bXBSb290LCB7dXNlU3lzdGVtVW56aXB9KTtcbiAgY29uc3QgZ2xvYlBhdHRlcm4gPSBgKiovKi4rKCR7YXBwRXh0ZW5zaW9ucy5tYXAoKGV4dCkgPT4gZXh0LnJlcGxhY2UoL15cXC4vLCAnJykpLmpvaW4oJ3wnKX0pYDtcbiAgY29uc3Qgc29ydGVkQnVuZGxlSXRlbXMgPSAoYXdhaXQgZnMuZ2xvYihnbG9iUGF0dGVybiwge1xuICAgIGN3ZDogdG1wUm9vdCxcbiAgICBzdHJpY3Q6IGZhbHNlLFxuICB9KSkuc29ydCgoYSwgYikgPT4gYS5zcGxpdChwYXRoLnNlcCkubGVuZ3RoIC0gYi5zcGxpdChwYXRoLnNlcCkubGVuZ3RoKTtcbiAgcmV0dXJuIFt0bXBSb290LCBzb3J0ZWRCdW5kbGVJdGVtc107XG59XG5cbi8qKlxuICogTW92ZXMgdGhlIGFwcGxpY2F0aW9uIGJ1bmRsZSB0byBhIG5ld2x5IGNyZWF0ZWQgdGVtcG9yYXJ5IGZvbGRlclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBSb290IEZ1bGwgcGF0aCB0byB0aGUgLmFwcCBidW5kbGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBuZXcgcGF0aCB0byB0aGUgYXBwIGJ1bmRsZS5cbiAqIFRoZSBuYW1lIG9mIHRoZSBhcHAgYnVuZGxlIHJlbWFpbnMgdGhvdWdoXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzb2xhdGVBcHBCdW5kbGUgKGFwcFJvb3QpIHtcbiAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICBjb25zdCBkc3RSb290ID0gcGF0aC5qb2luKHRtcFJvb3QsIHBhdGguYmFzZW5hbWUoYXBwUm9vdCkpO1xuICBhd2FpdCBmcy5tdihhcHBSb290LCBkc3RSb290LCB7bWtkaXJwOiB0cnVlfSk7XG4gIHJldHVybiBkc3RSb290O1xufVxuXG5leHBvcnQge1xuICBleHRyYWN0QnVuZGxlSWQsIHZlcmlmeUFwcGxpY2F0aW9uUGxhdGZvcm0sIHBhcnNlTG9jYWxpemFibGVTdHJpbmdzLFxuICBTQUZBUklfQlVORExFX0lELCBmZXRjaFN1cHBvcnRlZEFwcFBsYXRmb3JtcywgQVBQX0VYVCwgSVBBX0VYVCxcbiAgaXNBcHBCdW5kbGUsIGZpbmRBcHBzLCBpc29sYXRlQXBwQnVuZGxlLFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQSxNQUFNQSxvQkFBb0IsR0FBRyxjQUFjO0FBQzNDLE1BQU1DLGdCQUFnQixHQUFHLFVBQVU7QUFDbkMsTUFBTUMsZ0JBQWdCLEdBQUcsd0JBQXdCO0FBQUM7QUFDbEQsTUFBTUMsT0FBTyxHQUFHLE1BQU07QUFBQztBQUN2QixNQUFNQyxPQUFPLEdBQUcsTUFBTTtBQUFDO0FBRXZCLGVBQWVDLGlCQUFpQixDQUFFQyxHQUFHLEVBQUVDLFNBQVMsRUFBRTtFQUNoRCxNQUFNQyxTQUFTLEdBQUdDLGFBQUksQ0FBQ0MsT0FBTyxDQUFDSixHQUFHLEVBQUUsWUFBWSxDQUFDO0VBQ2pELElBQUk7SUFDRixPQUFPLENBQUMsTUFBTUssY0FBSyxDQUFDQyxjQUFjLENBQUNKLFNBQVMsQ0FBQyxFQUFFRCxTQUFTLENBQUM7RUFDM0QsQ0FBQyxDQUFDLE9BQU9NLEdBQUcsRUFBRTtJQUNaLE1BQU0sSUFBSUMsS0FBSyxDQUFFLHNDQUFxQ0wsYUFBSSxDQUFDTSxRQUFRLENBQUNULEdBQUcsQ0FBRSxNQUFLTyxHQUFHLENBQUNHLE9BQVEsRUFBQyxDQUFDO0VBQzlGO0FBQ0Y7QUFFQSxlQUFlQyxlQUFlLENBQUVYLEdBQUcsRUFBRTtFQUNuQyxNQUFNWSxRQUFRLEdBQUcsTUFBTWIsaUJBQWlCLENBQUNDLEdBQUcsRUFBRSxvQkFBb0IsQ0FBQztFQUNuRWEsZUFBRyxDQUFDQyxLQUFLLENBQUUsK0JBQThCZCxHQUFJLE9BQU1ZLFFBQVMsR0FBRSxDQUFDO0VBQy9ELE9BQU9BLFFBQVE7QUFDakI7QUFFQSxlQUFlRywwQkFBMEIsQ0FBRWYsR0FBRyxFQUFFO0VBQzlDLElBQUk7SUFDRixNQUFNZ0IsTUFBTSxHQUFHLE1BQU1qQixpQkFBaUIsQ0FBQ0MsR0FBRyxFQUFFLDRCQUE0QixDQUFDO0lBQ3pFLElBQUksQ0FBQ2lCLGVBQUMsQ0FBQ0MsT0FBTyxDQUFDRixNQUFNLENBQUMsRUFBRTtNQUN0QkgsZUFBRyxDQUFDTSxJQUFJLENBQUUsR0FBRWhCLGFBQUksQ0FBQ00sUUFBUSxDQUFDVCxHQUFHLENBQUUsbURBQWtELENBQUM7TUFDbEYsT0FBTyxFQUFFO0lBQ1g7SUFDQSxPQUFPZ0IsTUFBTTtFQUNmLENBQUMsQ0FBQyxPQUFPVCxHQUFHLEVBQUU7SUFDWk0sZUFBRyxDQUFDTSxJQUFJLENBQ0wsd0RBQXVEaEIsYUFBSSxDQUFDTSxRQUFRLENBQUNULEdBQUcsQ0FBRSxNQUFLTyxHQUFHLENBQUNHLE9BQVEsRUFBQyxDQUM5RjtJQUNELE9BQU8sRUFBRTtFQUNYO0FBQ0Y7O0FBaUJBLGVBQWVVLHlCQUF5QixDQUFFcEIsR0FBRyxFQUFFcUIsZ0JBQWdCLEVBQUU7RUFDL0RSLGVBQUcsQ0FBQ0MsS0FBSyxDQUFDLGdDQUFnQyxDQUFDO0VBRTNDLE1BQU1RLGtCQUFrQixHQUFHLE1BQU1QLDBCQUEwQixDQUFDZixHQUFHLENBQUM7RUFDaEVhLGVBQUcsQ0FBQ0MsS0FBSyxDQUFFLCtCQUE4QlMsSUFBSSxDQUFDQyxTQUFTLENBQUNGLGtCQUFrQixDQUFFLEVBQUMsQ0FBQztFQUU5RSxNQUFNO0lBQ0pHLFdBQVc7SUFDWEM7RUFDRixDQUFDLEdBQUdMLGdCQUFnQjtFQUNwQixNQUFNTSxNQUFNLEdBQUdELE1BQU0sR0FBRyxTQUFTLEdBQUcsUUFBUTtFQUM1QyxNQUFNRSxNQUFNLEdBQUdILFdBQVcsR0FBRyxXQUFXLEdBQUcsSUFBSTtFQUMvQyxNQUFNSSxXQUFXLEdBQUksR0FBRUYsTUFBTyxHQUFFQyxNQUFPLEVBQUM7RUFDeEMsSUFBSSxDQUFDTixrQkFBa0IsQ0FBQ1EsUUFBUSxDQUFDRCxXQUFXLENBQUMsRUFBRTtJQUM3QyxNQUFNLElBQUlyQixLQUFLLENBQUUsR0FBRWlCLFdBQVcsR0FBRyxXQUFXLEdBQUcsYUFBYyx3Q0FBdUN6QixHQUFJLGlCQUFnQixHQUNySCx5RkFBd0YsQ0FBQztFQUM5RjtBQUNGO0FBRUEsZUFBZStCLFlBQVksQ0FBRUMsWUFBWSxFQUFFO0VBQ3pDLE1BQU1DLElBQUksR0FBRyxNQUFNNUIsY0FBSyxDQUFDQyxjQUFjLENBQUMwQixZQUFZLENBQUM7RUFDckQsTUFBTWhCLE1BQU0sR0FBRyxDQUFDLENBQUM7RUFDakIsS0FBSyxNQUFNLENBQUNrQixHQUFHLEVBQUVDLEtBQUssQ0FBQyxJQUFJbEIsZUFBQyxDQUFDbUIsT0FBTyxDQUFDSCxJQUFJLENBQUMsRUFBRTtJQUMxQ2pCLE1BQU0sQ0FBQ2tCLEdBQUcsQ0FBQyxHQUFHakIsZUFBQyxDQUFDb0IsUUFBUSxDQUFDRixLQUFLLENBQUMsR0FBR0EsS0FBSyxHQUFHWixJQUFJLENBQUNDLFNBQVMsQ0FBQ1csS0FBSyxDQUFDO0VBQ2pFO0VBQ0EsT0FBT25CLE1BQU07QUFDZjtBQUVBLGVBQWVzQix1QkFBdUIsQ0FBRUMsSUFBSSxFQUFFO0VBQzVDLE1BQU07SUFDSnZDLEdBQUc7SUFDSHdDLFFBQVEsR0FBRyxJQUFJO0lBQ2ZDLHFCQUFxQjtJQUNyQkMsVUFBVTtJQUNWQztFQUNGLENBQUMsR0FBR0osSUFBSTtFQUVSLElBQUksQ0FBQ3ZDLEdBQUcsRUFBRTtJQUNSLE1BQU1VLE9BQU8sR0FBSSxvRUFBbUU7SUFDcEYsSUFBSWlDLFVBQVUsRUFBRTtNQUNkLE1BQU0sSUFBSW5DLEtBQUssQ0FBQ0UsT0FBTyxDQUFDO0lBQzFCO0lBQ0FHLGVBQUcsQ0FBQytCLElBQUksQ0FBQ2xDLE9BQU8sQ0FBQztJQUNqQixPQUFPLENBQUMsQ0FBQztFQUNYO0VBRUEsSUFBSW1DLFNBQVM7RUFDYixLQUFLLE1BQU1DLFNBQVMsSUFBSSxDQUFFLEdBQUVOLFFBQVMsUUFBTyxFQUFFQyxxQkFBcUIsRUFBRSxFQUFFLENBQUMsRUFBRTtJQUN4RUksU0FBUyxHQUFHMUMsYUFBSSxDQUFDQyxPQUFPLENBQUNKLEdBQUcsRUFBRThDLFNBQVMsQ0FBQztJQUN4QyxJQUFJLE1BQU1DLFdBQUUsQ0FBQ0MsTUFBTSxDQUFDSCxTQUFTLENBQUMsRUFBRTtNQUM5QjtJQUNGO0lBQ0EsTUFBTW5DLE9BQU8sR0FBSSxPQUFNbUMsU0FBVSxtQ0FBa0M7SUFDbkUsSUFBSUYsVUFBVSxFQUFFO01BQ2QsTUFBTSxJQUFJbkMsS0FBSyxDQUFDRSxPQUFPLENBQUM7SUFDMUI7SUFDQUcsZUFBRyxDQUFDQyxLQUFLLENBQUNKLE9BQU8sQ0FBQztFQUNwQjtFQUNBRyxlQUFHLENBQUMrQixJQUFJLENBQUUsdUNBQXNDQyxTQUFVLEdBQUUsQ0FBQztFQUU3RCxNQUFNSSxhQUFhLEdBQUcsRUFBRTtFQUN4QixJQUFJUCxVQUFVLEVBQUU7SUFDZCxNQUFNUSxPQUFPLEdBQUcvQyxhQUFJLENBQUNDLE9BQU8sQ0FBQ3lDLFNBQVMsRUFBRUgsVUFBVSxDQUFDO0lBQ25ELElBQUksTUFBTUssV0FBRSxDQUFDQyxNQUFNLENBQUNFLE9BQU8sQ0FBQyxFQUFFO01BQzVCRCxhQUFhLENBQUNFLElBQUksQ0FBQ0QsT0FBTyxDQUFDO0lBQzdCLENBQUMsTUFBTTtNQUNMLE1BQU14QyxPQUFPLEdBQUksT0FBTXdDLE9BQVEsdUNBQXNDbEQsR0FBSSxHQUFFO01BQzNFLElBQUkyQyxVQUFVLEVBQUU7UUFDZCxNQUFNLElBQUluQyxLQUFLLENBQUNFLE9BQU8sQ0FBQztNQUMxQjtNQUNBRyxlQUFHLENBQUMrQixJQUFJLENBQUNsQyxPQUFPLENBQUM7TUFDakJHLGVBQUcsQ0FBQytCLElBQUksQ0FBRSwyQ0FBMENDLFNBQVUsR0FBRSxDQUFDO0lBQ25FO0VBQ0Y7RUFFQSxJQUFJNUIsZUFBQyxDQUFDbUMsT0FBTyxDQUFDSCxhQUFhLENBQUMsS0FBSSxNQUFNRixXQUFFLENBQUNDLE1BQU0sQ0FBQ0gsU0FBUyxDQUFDLEdBQUU7SUFDMUQsTUFBTVEsYUFBYSxHQUFHLENBQUMsTUFBTU4sV0FBRSxDQUFDTyxPQUFPLENBQUNULFNBQVMsQ0FBQyxFQUMvQ1UsTUFBTSxDQUFFQyxJQUFJLElBQUt2QyxlQUFDLENBQUN3QyxJQUFJLENBQUMsQ0FBQzlELGdCQUFnQixFQUFFRCxvQkFBb0IsQ0FBQyxFQUFHZ0UsQ0FBQyxJQUFLRixJQUFJLENBQUNHLFFBQVEsQ0FBQ0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUMzRkUsR0FBRyxDQUFFSixJQUFJLElBQUtyRCxhQUFJLENBQUNDLE9BQU8sQ0FBQ3lDLFNBQVMsRUFBRVcsSUFBSSxDQUFDLENBQUM7SUFDL0NQLGFBQWEsQ0FBQ0UsSUFBSSxDQUFDLEdBQUdFLGFBQWEsQ0FBQztFQUN0QztFQUNBeEMsZUFBRyxDQUFDK0IsSUFBSSxDQUFFLE9BQU1LLGFBQWEsQ0FBQ1ksTUFBTyx5QkFBd0JoQixTQUFVLEdBQUUsQ0FBQztFQUUxRSxJQUFJNUIsZUFBQyxDQUFDbUMsT0FBTyxDQUFDSCxhQUFhLENBQUMsRUFBRTtJQUM1QixPQUFPLENBQUMsQ0FBQztFQUNYO0VBRUEsTUFBTWEsYUFBYSxHQUFHLENBQUMsQ0FBQztFQUN4QixNQUFNQyxjQUFjLEdBQUcsVUFBVUMsQ0FBQyxFQUFFO0lBQ2xDLE9BQU83RCxhQUFJLENBQUM4RCxVQUFVLENBQUNELENBQUMsQ0FBQyxHQUFHQSxDQUFDLEdBQUc3RCxhQUFJLENBQUNDLE9BQU8sQ0FBQzhELE9BQU8sQ0FBQ0MsR0FBRyxFQUFFLEVBQUVILENBQUMsQ0FBQztFQUNoRSxDQUFDO0VBQ0QsS0FBSyxNQUFNaEMsWUFBWSxJQUFJaUIsYUFBYSxFQUFFO0lBQ3hDLElBQUksQ0FBQ21CLGFBQUksQ0FBQ0MsU0FBUyxDQUFDTixjQUFjLENBQUMvQixZQUFZLENBQUMsRUFBRStCLGNBQWMsQ0FBQy9ELEdBQUcsQ0FBQyxDQUFDLEVBQUU7TUFFdEUsTUFBTSxJQUFJUSxLQUFLLENBQUUsSUFBR3dCLFlBQWEsc0NBQXFDaEMsR0FBSSxHQUFFLENBQUM7SUFDL0U7SUFDQSxJQUFJO01BQ0YsTUFBTWlDLElBQUksR0FBRyxNQUFNRixZQUFZLENBQUNDLFlBQVksQ0FBQztNQUM3Q25CLGVBQUcsQ0FBQ0MsS0FBSyxDQUFFLFVBQVNHLGVBQUMsQ0FBQ3FELElBQUksQ0FBQ3JDLElBQUksQ0FBQyxDQUFDNEIsTUFBTyxvQkFBbUI3QixZQUFhLEdBQUUsQ0FBQztNQUMzRWYsZUFBQyxDQUFDc0QsS0FBSyxDQUFDVCxhQUFhLEVBQUU3QixJQUFJLENBQUM7SUFDOUIsQ0FBQyxDQUFDLE9BQU91QyxDQUFDLEVBQUU7TUFDVjNELGVBQUcsQ0FBQ00sSUFBSSxDQUFFLGlCQUFnQmEsWUFBYSwrQkFBOEJ3QyxDQUFDLENBQUM5RCxPQUFRLEVBQUMsQ0FBQztJQUNuRjtFQUNGO0VBRUFHLGVBQUcsQ0FBQytCLElBQUksQ0FBRSxPQUFNM0IsZUFBQyxDQUFDcUQsSUFBSSxDQUFDUixhQUFhLENBQUMsQ0FBQ0QsTUFBTyxvQkFBbUJoQixTQUFVLEdBQUUsQ0FBQztFQUM3RSxPQUFPaUIsYUFBYTtBQUN0Qjs7QUFRQSxlQUFlVyxXQUFXLENBQUVDLE9BQU8sRUFBRTtFQUNuQyxPQUFPekQsZUFBQyxDQUFDMEMsUUFBUSxDQUFDMUMsZUFBQyxDQUFDMEQsT0FBTyxDQUFDRCxPQUFPLENBQUMsRUFBRTdFLE9BQU8sQ0FBQyxJQUN6QyxDQUFDLE1BQU1rRCxXQUFFLENBQUM2QixJQUFJLENBQUNGLE9BQU8sQ0FBQyxFQUFFRyxXQUFXLEVBQUUsS0FDdEMsTUFBTTlCLFdBQUUsQ0FBQ0MsTUFBTSxDQUFDN0MsYUFBSSxDQUFDMkUsSUFBSSxDQUFDSixPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDeEQ7O0FBV0EsZUFBZUssUUFBUSxDQUFFQyxXQUFXLEVBQUVDLGFBQWEsRUFBRTtFQUNuRCxNQUFNQyxpQkFBaUIsR0FBR2hCLE9BQU8sQ0FBQ2lCLEdBQUcsQ0FBQ0MsMEJBQTBCO0VBQ2hFLE1BQU1DLGNBQWMsR0FBR3BFLGVBQUMsQ0FBQ21DLE9BQU8sQ0FBQzhCLGlCQUFpQixDQUFDLElBQzlDLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUNwRCxRQUFRLENBQUNiLGVBQUMsQ0FBQzBELE9BQU8sQ0FBQ08saUJBQWlCLENBQUMsQ0FBQztFQUMzRCxNQUFNSSxPQUFPLEdBQUcsTUFBTUMsZ0JBQU8sQ0FBQ0MsT0FBTyxFQUFFO0VBQ3ZDLE1BQU1DLFlBQUcsQ0FBQ0MsWUFBWSxDQUFDVixXQUFXLEVBQUVNLE9BQU8sRUFBRTtJQUFDRDtFQUFjLENBQUMsQ0FBQztFQUM5RCxNQUFNTSxXQUFXLEdBQUksVUFBU1YsYUFBYSxDQUFDckIsR0FBRyxDQUFFZ0MsR0FBRyxJQUFLQSxHQUFHLENBQUNDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQ2YsSUFBSSxDQUFDLEdBQUcsQ0FBRSxHQUFFO0VBQzdGLE1BQU1nQixpQkFBaUIsR0FBRyxDQUFDLE1BQU0vQyxXQUFFLENBQUNnRCxJQUFJLENBQUNKLFdBQVcsRUFBRTtJQUNwRHhCLEdBQUcsRUFBRW1CLE9BQU87SUFDWlUsTUFBTSxFQUFFO0VBQ1YsQ0FBQyxDQUFDLEVBQUVDLElBQUksQ0FBQyxDQUFDQyxDQUFDLEVBQUVDLENBQUMsS0FBS0QsQ0FBQyxDQUFDRSxLQUFLLENBQUNqRyxhQUFJLENBQUNrRyxHQUFHLENBQUMsQ0FBQ3hDLE1BQU0sR0FBR3NDLENBQUMsQ0FBQ0MsS0FBSyxDQUFDakcsYUFBSSxDQUFDa0csR0FBRyxDQUFDLENBQUN4QyxNQUFNLENBQUM7RUFDdkUsT0FBTyxDQUFDeUIsT0FBTyxFQUFFUSxpQkFBaUIsQ0FBQztBQUNyQzs7QUFTQSxlQUFlUSxnQkFBZ0IsQ0FBRUMsT0FBTyxFQUFFO0VBQ3hDLE1BQU1qQixPQUFPLEdBQUcsTUFBTUMsZ0JBQU8sQ0FBQ0MsT0FBTyxFQUFFO0VBQ3ZDLE1BQU1nQixPQUFPLEdBQUdyRyxhQUFJLENBQUMyRSxJQUFJLENBQUNRLE9BQU8sRUFBRW5GLGFBQUksQ0FBQ00sUUFBUSxDQUFDOEYsT0FBTyxDQUFDLENBQUM7RUFDMUQsTUFBTXhELFdBQUUsQ0FBQzBELEVBQUUsQ0FBQ0YsT0FBTyxFQUFFQyxPQUFPLEVBQUU7SUFBQ0UsTUFBTSxFQUFFO0VBQUksQ0FBQyxDQUFDO0VBQzdDLE9BQU9GLE9BQU87QUFDaEIifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"app-utils.js","names":["STRINGSDICT_RESOURCE","STRINGS_RESOURCE","SAFARI_BUNDLE_ID","APP_EXT","IPA_EXT","extractPlistEntry","app","entryName","plistPath","path","resolve","plist","parsePlistFile","err","Error","basename","message","extractBundleId","bundleId","log","debug","fetchSupportedAppPlatforms","result","_","isArray","warn","verifyApplicationPlatform","expectedPlatform","supportedPlatforms","JSON","stringify","isSimulator","isTvOS","prefix","suffix","dstPlatform","includes","readResource","resourcePath","data","key","value","toPairs","isString","parseLocalizableStrings","opts","language","localizableStringsDir","stringFile","strictMode","info","lprojRoot","subfolder","fs","exists","resourcePaths","dstPath","push","isEmpty","resourceFiles","readdir","filter","name","some","x","endsWith","map","length","resultStrings","toAbsolutePath","p","isAbsolute","process","cwd","util","isSubPath","keys","merge","e","isAppBundle","appPath","toLower","stat","isDirectory","join","findApps","archivePath","appExtensions","useSystemUnzipEnv","env","APPIUM_PREFER_SYSTEM_UNZIP","useSystemUnzip","tmpRoot","tempDir","openDir","zip","extractAllTo","globPattern","ext","replace","sortedBundleItems","glob","strict","sort","a","b","split","sep","isolateAppBundle","appRoot","dstRoot","mv","mkdirp"],"sources":["../../lib/app-utils.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport { plist, fs, util, tempDir, zip } from 'appium/support';\nimport log from './logger.js';\n\nconst STRINGSDICT_RESOURCE = '.stringsdict';\nconst STRINGS_RESOURCE = '.strings';\nconst SAFARI_BUNDLE_ID = 'com.apple.mobilesafari';\nconst APP_EXT = '.app';\nconst IPA_EXT = '.ipa';\n\nasync function extractPlistEntry (app, entryName) {\n const plistPath = path.resolve(app, 'Info.plist');\n try {\n return (await plist.parsePlistFile(plistPath))[entryName];\n } catch (err) {\n throw new Error(`Could not extract Info.plist from '${path.basename(app)}': ${err.message}`);\n }\n}\n\nasync function extractBundleId (app) {\n const bundleId = await extractPlistEntry(app, 'CFBundleIdentifier');\n log.debug(`Getting bundle ID from app '${app}': '${bundleId}'`);\n return bundleId;\n}\n\nasync function fetchSupportedAppPlatforms (app) {\n try {\n const result = await extractPlistEntry(app, 'CFBundleSupportedPlatforms');\n if (!_.isArray(result)) {\n log.warn(`${path.basename(app)}': CFBundleSupportedPlatforms is not a valid list`);\n return [];\n }\n return result;\n } catch (err) {\n log.warn(\n `Cannot extract the list of supported platforms from '${path.basename(app)}': ${err.message}`\n );\n return [];\n }\n}\n\n/**\n * @typedef {Object} PlatformOpts\n *\n * @property {boolean} isSimulator - Whether the destination platform is a Simulator\n * @property {boolean} isTvOS - Whether the destination platform is a Simulator\n */\n\n/**\n * Verify whether the given application is compatible to the\n * platform where it is going to be installed and tested.\n *\n * @param {string} app - The actual path to the application bundle\n * @param {PlatformOpts} expectedPlatform\n * @throws {Error} If bundle architecture does not match the expected device architecture.\n */\nasync function verifyApplicationPlatform (app, expectedPlatform) {\n log.debug('Verifying application platform');\n\n const supportedPlatforms = await fetchSupportedAppPlatforms(app);\n log.debug(`CFBundleSupportedPlatforms: ${JSON.stringify(supportedPlatforms)}`);\n\n const {\n isSimulator,\n isTvOS,\n } = expectedPlatform;\n const prefix = isTvOS ? 'AppleTV' : 'iPhone';\n const suffix = isSimulator ? 'Simulator' : 'OS';\n const dstPlatform = `${prefix}${suffix}`;\n if (!supportedPlatforms.includes(dstPlatform)) {\n throw new Error(`${isSimulator ? 'Simulator' : 'Real device'} architecture is unsupported by the '${app}' application. ` +\n `Make sure the correct deployment target has been selected for its compilation in Xcode.`);\n }\n}\n\nasync function readResource (resourcePath) {\n const data = await plist.parsePlistFile(resourcePath);\n const result = {};\n for (const [key, value] of _.toPairs(data)) {\n result[key] = _.isString(value) ? value : JSON.stringify(value);\n }\n return result;\n}\n\nasync function parseLocalizableStrings (opts) {\n const {\n app,\n language = 'en',\n localizableStringsDir,\n stringFile,\n strictMode,\n } = opts;\n\n if (!app) {\n const message = `Strings extraction is not supported if 'app' capability is not set`;\n if (strictMode) {\n throw new Error(message);\n }\n log.info(message);\n return {};\n }\n\n let lprojRoot;\n for (const subfolder of [`${language}.lproj`, localizableStringsDir, '']) {\n lprojRoot = path.resolve(app, subfolder);\n if (await fs.exists(lprojRoot)) {\n break;\n }\n const message = `No '${lprojRoot}' resources folder has been found`;\n if (strictMode) {\n throw new Error(message);\n }\n log.debug(message);\n }\n log.info(`Will extract resource strings from '${lprojRoot}'`);\n\n const resourcePaths = [];\n if (stringFile) {\n const dstPath = path.resolve(lprojRoot, stringFile);\n if (await fs.exists(dstPath)) {\n resourcePaths.push(dstPath);\n } else {\n const message = `No '${dstPath}' resource file has been found for '${app}'`;\n if (strictMode) {\n throw new Error(message);\n }\n log.info(message);\n log.info(`Getting all the available strings from '${lprojRoot}'`);\n }\n }\n\n if (_.isEmpty(resourcePaths) && await fs.exists(lprojRoot)) {\n const resourceFiles = (await fs.readdir(lprojRoot))\n .filter((name) => _.some([STRINGS_RESOURCE, STRINGSDICT_RESOURCE], (x) => name.endsWith(x)))\n .map((name) => path.resolve(lprojRoot, name));\n resourcePaths.push(...resourceFiles);\n }\n log.info(`Got ${resourcePaths.length} resource file(s) in '${lprojRoot}'`);\n\n if (_.isEmpty(resourcePaths)) {\n return {};\n }\n\n const resultStrings = {};\n const toAbsolutePath = function (p) {\n return path.isAbsolute(p) ? p : path.resolve(process.cwd(), p);\n };\n for (const resourcePath of resourcePaths) {\n if (!util.isSubPath(toAbsolutePath(resourcePath), toAbsolutePath(app))) {\n // security precaution\n throw new Error(`'${resourcePath}' is expected to be located under '${app}'`);\n }\n try {\n const data = await readResource(resourcePath);\n log.debug(`Parsed ${_.keys(data).length} string(s) from '${resourcePath}'`);\n _.merge(resultStrings, data);\n } catch (e) {\n log.warn(`Cannot parse '${resourcePath}' resource. Original error: ${e.message}`);\n }\n }\n\n log.info(`Got ${_.keys(resultStrings).length} string(s) from '${lprojRoot}'`);\n return resultStrings;\n}\n\n/**\n * Check whether the given path on the file system points to the .app bundle root\n *\n * @param {string} appPath Possible .app bundle root\n * @returns {boolean} Whether the given path points to an .app bundle\n */\nasync function isAppBundle (appPath) {\n return _.endsWith(_.toLower(appPath), APP_EXT)\n && (await fs.stat(appPath)).isDirectory()\n && await fs.exists(path.join(appPath, 'Info.plist'));\n}\n\n/**\n * Extract the given archive and looks for items with given extensions in it\n *\n * @param {string} archivePath Full path to a .zip archive\n * @param {Array<string>} appExtensions List of matching item extensions\n * @returns {[string, Array<String>]} Tuple, where the first element points to\n * a temporary folder root where the archive has been extracted and the second item\n * contains a list of relative paths to matched items\n */\nasync function findApps (archivePath, appExtensions) {\n const useSystemUnzipEnv = process.env.APPIUM_PREFER_SYSTEM_UNZIP;\n const useSystemUnzip = _.isEmpty(useSystemUnzipEnv)\n || !['0', 'false'].includes(_.toLower(useSystemUnzipEnv));\n const tmpRoot = await tempDir.openDir();\n await zip.extractAllTo(archivePath, tmpRoot, {useSystemUnzip});\n const globPattern = `**/*.+(${appExtensions.map((ext) => ext.replace(/^\\./, '')).join('|')})`;\n const sortedBundleItems = (await fs.glob(globPattern, {\n cwd: tmpRoot,\n strict: false,\n })).sort((a, b) => a.split(path.sep).length - b.split(path.sep).length);\n return [tmpRoot, sortedBundleItems];\n}\n\n/**\n * Moves the application bundle to a newly created temporary folder\n *\n * @param {string} appRoot Full path to the .app bundle\n * @returns {string} The new path to the app bundle.\n * The name of the app bundle remains though\n */\nasync function isolateAppBundle (appRoot) {\n const tmpRoot = await tempDir.openDir();\n const dstRoot = path.join(tmpRoot, path.basename(appRoot));\n await fs.mv(appRoot, dstRoot, {mkdirp: true});\n return dstRoot;\n}\n\nexport {\n extractBundleId, verifyApplicationPlatform, parseLocalizableStrings,\n SAFARI_BUNDLE_ID, fetchSupportedAppPlatforms, APP_EXT, IPA_EXT,\n isAppBundle, findApps, isolateAppBundle,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"app-utils.js","names":["STRINGSDICT_RESOURCE","STRINGS_RESOURCE","SAFARI_BUNDLE_ID","APP_EXT","IPA_EXT","extractPlistEntry","app","entryName","plistPath","path","resolve","plist","parsePlistFile","err","Error","basename","message","extractBundleId","bundleId","log","debug","fetchSupportedAppPlatforms","result","_","isArray","warn","verifyApplicationPlatform","expectedPlatform","supportedPlatforms","JSON","stringify","isSimulator","isTvOS","prefix","suffix","dstPlatform","includes","readResource","resourcePath","data","key","value","toPairs","isString","parseLocalizableStrings","opts","language","localizableStringsDir","stringFile","strictMode","info","lprojRoot","subfolder","fs","exists","resourcePaths","dstPath","push","isEmpty","resourceFiles","readdir","filter","name","some","x","endsWith","map","length","resultStrings","toAbsolutePath","p","isAbsolute","process","cwd","util","isSubPath","keys","merge","e","isAppBundle","appPath","toLower","stat","isDirectory","join","findApps","archivePath","appExtensions","useSystemUnzipEnv","env","APPIUM_PREFER_SYSTEM_UNZIP","useSystemUnzip","tmpRoot","tempDir","openDir","zip","extractAllTo","globPattern","ext","replace","sortedBundleItems","glob","strict","sort","a","b","split","sep","isolateAppBundle","appRoot","dstRoot","mv","mkdirp"],"sources":["../../lib/app-utils.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport { plist, fs, util, tempDir, zip } from 'appium/support';\nimport log from './logger.js';\n\nconst STRINGSDICT_RESOURCE = '.stringsdict';\nconst STRINGS_RESOURCE = '.strings';\nconst SAFARI_BUNDLE_ID = 'com.apple.mobilesafari';\nconst APP_EXT = '.app';\nconst IPA_EXT = '.ipa';\n\nasync function extractPlistEntry (app, entryName) {\n const plistPath = path.resolve(app, 'Info.plist');\n try {\n return (await plist.parsePlistFile(plistPath))[entryName];\n } catch (err) {\n throw new Error(`Could not extract Info.plist from '${path.basename(app)}': ${err.message}`);\n }\n}\n\nasync function extractBundleId (app) {\n const bundleId = await extractPlistEntry(app, 'CFBundleIdentifier');\n log.debug(`Getting bundle ID from app '${app}': '${bundleId}'`);\n return bundleId;\n}\n\nasync function fetchSupportedAppPlatforms (app) {\n try {\n const result = await extractPlistEntry(app, 'CFBundleSupportedPlatforms');\n if (!_.isArray(result)) {\n log.warn(`${path.basename(app)}': CFBundleSupportedPlatforms is not a valid list`);\n return [];\n }\n return result;\n } catch (err) {\n log.warn(\n `Cannot extract the list of supported platforms from '${path.basename(app)}': ${err.message}`\n );\n return [];\n }\n}\n\n/**\n * @typedef {Object} PlatformOpts\n *\n * @property {boolean} isSimulator - Whether the destination platform is a Simulator\n * @property {boolean} isTvOS - Whether the destination platform is a Simulator\n */\n\n/**\n * Verify whether the given application is compatible to the\n * platform where it is going to be installed and tested.\n *\n * @param {string} app - The actual path to the application bundle\n * @param {PlatformOpts} expectedPlatform\n * @throws {Error} If bundle architecture does not match the expected device architecture.\n */\nasync function verifyApplicationPlatform (app, expectedPlatform) {\n log.debug('Verifying application platform');\n\n const supportedPlatforms = await fetchSupportedAppPlatforms(app);\n log.debug(`CFBundleSupportedPlatforms: ${JSON.stringify(supportedPlatforms)}`);\n\n const {\n isSimulator,\n isTvOS,\n } = expectedPlatform;\n const prefix = isTvOS ? 'AppleTV' : 'iPhone';\n const suffix = isSimulator ? 'Simulator' : 'OS';\n const dstPlatform = `${prefix}${suffix}`;\n if (!supportedPlatforms.includes(dstPlatform)) {\n throw new Error(`${isSimulator ? 'Simulator' : 'Real device'} architecture is unsupported by the '${app}' application. ` +\n `Make sure the correct deployment target has been selected for its compilation in Xcode.`);\n }\n}\n\nasync function readResource (resourcePath) {\n const data = await plist.parsePlistFile(resourcePath);\n const result = {};\n for (const [key, value] of _.toPairs(data)) {\n result[key] = _.isString(value) ? value : JSON.stringify(value);\n }\n return result;\n}\n\nasync function parseLocalizableStrings (opts) {\n const {\n app,\n language = 'en',\n localizableStringsDir,\n stringFile,\n strictMode,\n } = opts;\n\n if (!app) {\n const message = `Strings extraction is not supported if 'app' capability is not set`;\n if (strictMode) {\n throw new Error(message);\n }\n log.info(message);\n return {};\n }\n\n let lprojRoot;\n for (const subfolder of [`${language}.lproj`, localizableStringsDir, '']) {\n lprojRoot = path.resolve(app, subfolder);\n if (await fs.exists(lprojRoot)) {\n break;\n }\n const message = `No '${lprojRoot}' resources folder has been found`;\n if (strictMode) {\n throw new Error(message);\n }\n log.debug(message);\n }\n log.info(`Will extract resource strings from '${lprojRoot}'`);\n\n const resourcePaths = [];\n if (stringFile) {\n const dstPath = path.resolve(lprojRoot, stringFile);\n if (await fs.exists(dstPath)) {\n resourcePaths.push(dstPath);\n } else {\n const message = `No '${dstPath}' resource file has been found for '${app}'`;\n if (strictMode) {\n throw new Error(message);\n }\n log.info(message);\n log.info(`Getting all the available strings from '${lprojRoot}'`);\n }\n }\n\n if (_.isEmpty(resourcePaths) && await fs.exists(lprojRoot)) {\n const resourceFiles = (await fs.readdir(lprojRoot))\n .filter((name) => _.some([STRINGS_RESOURCE, STRINGSDICT_RESOURCE], (x) => name.endsWith(x)))\n .map((name) => path.resolve(lprojRoot, name));\n resourcePaths.push(...resourceFiles);\n }\n log.info(`Got ${resourcePaths.length} resource file(s) in '${lprojRoot}'`);\n\n if (_.isEmpty(resourcePaths)) {\n return {};\n }\n\n const resultStrings = {};\n const toAbsolutePath = function (p) {\n return path.isAbsolute(p) ? p : path.resolve(process.cwd(), p);\n };\n for (const resourcePath of resourcePaths) {\n if (!util.isSubPath(toAbsolutePath(resourcePath), toAbsolutePath(app))) {\n // security precaution\n throw new Error(`'${resourcePath}' is expected to be located under '${app}'`);\n }\n try {\n const data = await readResource(resourcePath);\n log.debug(`Parsed ${_.keys(data).length} string(s) from '${resourcePath}'`);\n _.merge(resultStrings, data);\n } catch (e) {\n log.warn(`Cannot parse '${resourcePath}' resource. Original error: ${e.message}`);\n }\n }\n\n log.info(`Got ${_.keys(resultStrings).length} string(s) from '${lprojRoot}'`);\n return resultStrings;\n}\n\n/**\n * Check whether the given path on the file system points to the .app bundle root\n *\n * @param {string} appPath Possible .app bundle root\n * @returns {boolean} Whether the given path points to an .app bundle\n */\nasync function isAppBundle (appPath) {\n return _.endsWith(_.toLower(appPath), APP_EXT)\n && (await fs.stat(appPath)).isDirectory()\n && await fs.exists(path.join(appPath, 'Info.plist'));\n}\n\n/**\n * Extract the given archive and looks for items with given extensions in it\n *\n * @param {string} archivePath Full path to a .zip archive\n * @param {Array<string>} appExtensions List of matching item extensions\n * @returns {[string, Array<String>]} Tuple, where the first element points to\n * a temporary folder root where the archive has been extracted and the second item\n * contains a list of relative paths to matched items\n */\nasync function findApps (archivePath, appExtensions) {\n const useSystemUnzipEnv = process.env.APPIUM_PREFER_SYSTEM_UNZIP;\n const useSystemUnzip = _.isEmpty(useSystemUnzipEnv)\n || !['0', 'false'].includes(_.toLower(useSystemUnzipEnv));\n const tmpRoot = await tempDir.openDir();\n await zip.extractAllTo(archivePath, tmpRoot, {useSystemUnzip});\n const globPattern = `**/*.+(${appExtensions.map((ext) => ext.replace(/^\\./, '')).join('|')})`;\n const sortedBundleItems = (await fs.glob(globPattern, {\n cwd: tmpRoot,\n strict: false,\n })).sort((a, b) => a.split(path.sep).length - b.split(path.sep).length);\n return [tmpRoot, sortedBundleItems];\n}\n\n/**\n * Moves the application bundle to a newly created temporary folder\n *\n * @param {string} appRoot Full path to the .app bundle\n * @returns {string} The new path to the app bundle.\n * The name of the app bundle remains though\n */\nasync function isolateAppBundle (appRoot) {\n const tmpRoot = await tempDir.openDir();\n const dstRoot = path.join(tmpRoot, path.basename(appRoot));\n await fs.mv(appRoot, dstRoot, {mkdirp: true});\n return dstRoot;\n}\n\nexport {\n extractBundleId, verifyApplicationPlatform, parseLocalizableStrings,\n SAFARI_BUNDLE_ID, fetchSupportedAppPlatforms, APP_EXT, IPA_EXT,\n isAppBundle, findApps, isolateAppBundle,\n};\n"],"mappings":"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"}
@@ -4,17 +4,11 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  require("source-map-support/register");
9
-
10
8
  var _appiumWebdriveragent = require("appium-webdriveragent");
11
-
12
9
  var _utils = require("./utils");
13
-
14
10
  var _simulatorManagement = require("./simulator-management");
15
-
16
11
  var _asyncbox = require("asyncbox");
17
-
18
12
  const DEFAULT_SIM_NAME = 'iPhone 12';
19
13
 
20
14
  async function build() {
@@ -33,11 +27,9 @@ async function build() {
33
27
  });
34
28
  await wda.xcodebuild.start(true);
35
29
  }
36
-
37
30
  if (require.main === module) {
38
31
  (0, _asyncbox.asyncify)(build);
39
32
  }
40
-
41
33
  var _default = build;
42
34
  exports.default = _default;
43
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJERUZBVUxUX1NJTV9OQU1FIiwiYnVpbGQiLCJ4Y29kZVZlcnNpb24iLCJnZXRBbmRDaGVja1hjb2RlVmVyc2lvbiIsImlvc1ZlcnNpb24iLCJnZXRBbmRDaGVja0lvc1Nka1ZlcnNpb24iLCJkZXZpY2VOYW1lIiwidHJhbnNsYXRlRGV2aWNlTmFtZSIsImRldmljZSIsImdldEV4aXN0aW5nU2ltIiwicGxhdGZvcm1WZXJzaW9uIiwid2RhIiwiV2ViRHJpdmVyQWdlbnQiLCJpb3NTZGtWZXJzaW9uIiwic2hvd1hjb2RlTG9nIiwieGNvZGVidWlsZCIsInN0YXJ0IiwicmVxdWlyZSIsIm1haW4iLCJtb2R1bGUiLCJhc3luY2lmeSJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9idWlsZC13ZGEuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV2ViRHJpdmVyQWdlbnQgfSBmcm9tICdhcHBpdW0td2ViZHJpdmVyYWdlbnQnO1xuaW1wb3J0IHsgdHJhbnNsYXRlRGV2aWNlTmFtZSwgZ2V0QW5kQ2hlY2tYY29kZVZlcnNpb24sIGdldEFuZENoZWNrSW9zU2RrVmVyc2lvbiB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgZ2V0RXhpc3RpbmdTaW0gfSBmcm9tICcuL3NpbXVsYXRvci1tYW5hZ2VtZW50JztcbmltcG9ydCB7IGFzeW5jaWZ5IH0gZnJvbSAnYXN5bmNib3gnO1xuXG5jb25zdCBERUZBVUxUX1NJTV9OQU1FID0gJ2lQaG9uZSAxMic7XG5cbi8vIFRPRE86IGFsbG93IHBhc3NpbmcgaW4gYWxsIHRoZSB2YXJpb3VzIGJ1aWxkIHBhcmFtcyBhcyBDTEkgYXJnc1xuYXN5bmMgZnVuY3Rpb24gYnVpbGQgKCkge1xuICBjb25zdCB4Y29kZVZlcnNpb24gPSBhd2FpdCBnZXRBbmRDaGVja1hjb2RlVmVyc2lvbigpO1xuICBjb25zdCBpb3NWZXJzaW9uID0gYXdhaXQgZ2V0QW5kQ2hlY2tJb3NTZGtWZXJzaW9uKCk7XG4gIGNvbnN0IGRldmljZU5hbWUgPSB0cmFuc2xhdGVEZXZpY2VOYW1lKGlvc1ZlcnNpb24sIERFRkFVTFRfU0lNX05BTUUpO1xuICBjb25zdCBkZXZpY2UgPSBhd2FpdCBnZXRFeGlzdGluZ1NpbSh7XG4gICAgcGxhdGZvcm1WZXJzaW9uOiBpb3NWZXJzaW9uLFxuICAgIGRldmljZU5hbWVcbiAgfSk7XG4gIGNvbnN0IHdkYSA9IG5ldyBXZWJEcml2ZXJBZ2VudCh4Y29kZVZlcnNpb24sIHtcbiAgICBpb3NTZGtWZXJzaW9uOiBpb3NWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbjogaW9zVmVyc2lvbixcbiAgICBzaG93WGNvZGVMb2c6IHRydWUsXG4gICAgZGV2aWNlLFxuICB9KTtcbiAgYXdhaXQgd2RhLnhjb2RlYnVpbGQuc3RhcnQodHJ1ZSk7XG59XG5cbmlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xuICBhc3luY2lmeShidWlsZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJ1aWxkO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxnQkFBZ0IsR0FBRyxXQUF6Qjs7QUFHQSxlQUFlQyxLQUFmLEdBQXdCO0VBQ3RCLE1BQU1DLFlBQVksR0FBRyxNQUFNLElBQUFDLDhCQUFBLEdBQTNCO0VBQ0EsTUFBTUMsVUFBVSxHQUFHLE1BQU0sSUFBQUMsK0JBQUEsR0FBekI7RUFDQSxNQUFNQyxVQUFVLEdBQUcsSUFBQUMsMEJBQUEsRUFBb0JILFVBQXBCLEVBQWdDSixnQkFBaEMsQ0FBbkI7RUFDQSxNQUFNUSxNQUFNLEdBQUcsTUFBTSxJQUFBQyxtQ0FBQSxFQUFlO0lBQ2xDQyxlQUFlLEVBQUVOLFVBRGlCO0lBRWxDRTtFQUZrQyxDQUFmLENBQXJCO0VBSUEsTUFBTUssR0FBRyxHQUFHLElBQUlDLG9DQUFKLENBQW1CVixZQUFuQixFQUFpQztJQUMzQ1csYUFBYSxFQUFFVCxVQUQ0QjtJQUUzQ00sZUFBZSxFQUFFTixVQUYwQjtJQUczQ1UsWUFBWSxFQUFFLElBSDZCO0lBSTNDTjtFQUoyQyxDQUFqQyxDQUFaO0VBTUEsTUFBTUcsR0FBRyxDQUFDSSxVQUFKLENBQWVDLEtBQWYsQ0FBcUIsSUFBckIsQ0FBTjtBQUNEOztBQUVELElBQUlDLE9BQU8sQ0FBQ0MsSUFBUixLQUFpQkMsTUFBckIsRUFBNkI7RUFDM0IsSUFBQUMsa0JBQUEsRUFBU25CLEtBQVQ7QUFDRDs7ZUFFY0EsSyJ9
35
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJERUZBVUxUX1NJTV9OQU1FIiwiYnVpbGQiLCJ4Y29kZVZlcnNpb24iLCJnZXRBbmRDaGVja1hjb2RlVmVyc2lvbiIsImlvc1ZlcnNpb24iLCJnZXRBbmRDaGVja0lvc1Nka1ZlcnNpb24iLCJkZXZpY2VOYW1lIiwidHJhbnNsYXRlRGV2aWNlTmFtZSIsImRldmljZSIsImdldEV4aXN0aW5nU2ltIiwicGxhdGZvcm1WZXJzaW9uIiwid2RhIiwiV2ViRHJpdmVyQWdlbnQiLCJpb3NTZGtWZXJzaW9uIiwic2hvd1hjb2RlTG9nIiwieGNvZGVidWlsZCIsInN0YXJ0IiwicmVxdWlyZSIsIm1haW4iLCJtb2R1bGUiLCJhc3luY2lmeSJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9idWlsZC13ZGEuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV2ViRHJpdmVyQWdlbnQgfSBmcm9tICdhcHBpdW0td2ViZHJpdmVyYWdlbnQnO1xuaW1wb3J0IHsgdHJhbnNsYXRlRGV2aWNlTmFtZSwgZ2V0QW5kQ2hlY2tYY29kZVZlcnNpb24sIGdldEFuZENoZWNrSW9zU2RrVmVyc2lvbiB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgZ2V0RXhpc3RpbmdTaW0gfSBmcm9tICcuL3NpbXVsYXRvci1tYW5hZ2VtZW50JztcbmltcG9ydCB7IGFzeW5jaWZ5IH0gZnJvbSAnYXN5bmNib3gnO1xuXG5jb25zdCBERUZBVUxUX1NJTV9OQU1FID0gJ2lQaG9uZSAxMic7XG5cbi8vIFRPRE86IGFsbG93IHBhc3NpbmcgaW4gYWxsIHRoZSB2YXJpb3VzIGJ1aWxkIHBhcmFtcyBhcyBDTEkgYXJnc1xuYXN5bmMgZnVuY3Rpb24gYnVpbGQgKCkge1xuICBjb25zdCB4Y29kZVZlcnNpb24gPSBhd2FpdCBnZXRBbmRDaGVja1hjb2RlVmVyc2lvbigpO1xuICBjb25zdCBpb3NWZXJzaW9uID0gYXdhaXQgZ2V0QW5kQ2hlY2tJb3NTZGtWZXJzaW9uKCk7XG4gIGNvbnN0IGRldmljZU5hbWUgPSB0cmFuc2xhdGVEZXZpY2VOYW1lKGlvc1ZlcnNpb24sIERFRkFVTFRfU0lNX05BTUUpO1xuICBjb25zdCBkZXZpY2UgPSBhd2FpdCBnZXRFeGlzdGluZ1NpbSh7XG4gICAgcGxhdGZvcm1WZXJzaW9uOiBpb3NWZXJzaW9uLFxuICAgIGRldmljZU5hbWVcbiAgfSk7XG4gIGNvbnN0IHdkYSA9IG5ldyBXZWJEcml2ZXJBZ2VudCh4Y29kZVZlcnNpb24sIHtcbiAgICBpb3NTZGtWZXJzaW9uOiBpb3NWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbjogaW9zVmVyc2lvbixcbiAgICBzaG93WGNvZGVMb2c6IHRydWUsXG4gICAgZGV2aWNlLFxuICB9KTtcbiAgYXdhaXQgd2RhLnhjb2RlYnVpbGQuc3RhcnQodHJ1ZSk7XG59XG5cbmlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xuICBhc3luY2lmeShidWlsZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJ1aWxkO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQSxNQUFNQSxnQkFBZ0IsR0FBRyxXQUFXOztBQUdwQyxlQUFlQyxLQUFLLEdBQUk7RUFDdEIsTUFBTUMsWUFBWSxHQUFHLE1BQU0sSUFBQUMsOEJBQXVCLEdBQUU7RUFDcEQsTUFBTUMsVUFBVSxHQUFHLE1BQU0sSUFBQUMsK0JBQXdCLEdBQUU7RUFDbkQsTUFBTUMsVUFBVSxHQUFHLElBQUFDLDBCQUFtQixFQUFDSCxVQUFVLEVBQUVKLGdCQUFnQixDQUFDO0VBQ3BFLE1BQU1RLE1BQU0sR0FBRyxNQUFNLElBQUFDLG1DQUFjLEVBQUM7SUFDbENDLGVBQWUsRUFBRU4sVUFBVTtJQUMzQkU7RUFDRixDQUFDLENBQUM7RUFDRixNQUFNSyxHQUFHLEdBQUcsSUFBSUMsb0NBQWMsQ0FBQ1YsWUFBWSxFQUFFO0lBQzNDVyxhQUFhLEVBQUVULFVBQVU7SUFDekJNLGVBQWUsRUFBRU4sVUFBVTtJQUMzQlUsWUFBWSxFQUFFLElBQUk7SUFDbEJOO0VBQ0YsQ0FBQyxDQUFDO0VBQ0YsTUFBTUcsR0FBRyxDQUFDSSxVQUFVLENBQUNDLEtBQUssQ0FBQyxJQUFJLENBQUM7QUFDbEM7QUFFQSxJQUFJQyxPQUFPLENBQUNDLElBQUksS0FBS0MsTUFBTSxFQUFFO0VBQzNCLElBQUFDLGtCQUFRLEVBQUNuQixLQUFLLENBQUM7QUFDakI7QUFBQyxlQUVjQSxLQUFLO0FBQUEifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"build-wda.js","names":["DEFAULT_SIM_NAME","build","xcodeVersion","getAndCheckXcodeVersion","iosVersion","getAndCheckIosSdkVersion","deviceName","translateDeviceName","device","getExistingSim","platformVersion","wda","WebDriverAgent","iosSdkVersion","showXcodeLog","xcodebuild","start","require","main","module","asyncify"],"sources":["../../lib/build-wda.js"],"sourcesContent":["import { WebDriverAgent } from 'appium-webdriveragent';\nimport { translateDeviceName, getAndCheckXcodeVersion, getAndCheckIosSdkVersion } from './utils';\nimport { getExistingSim } from './simulator-management';\nimport { asyncify } from 'asyncbox';\n\nconst DEFAULT_SIM_NAME = 'iPhone 12';\n\n// TODO: allow passing in all the various build params as CLI args\nasync function build () {\n const xcodeVersion = await getAndCheckXcodeVersion();\n const iosVersion = await getAndCheckIosSdkVersion();\n const deviceName = translateDeviceName(iosVersion, DEFAULT_SIM_NAME);\n const device = await getExistingSim({\n platformVersion: iosVersion,\n deviceName\n });\n const wda = new WebDriverAgent(xcodeVersion, {\n iosSdkVersion: iosVersion,\n platformVersion: iosVersion,\n showXcodeLog: true,\n device,\n });\n await wda.xcodebuild.start(true);\n}\n\nif (require.main === module) {\n asyncify(build);\n}\n\nexport default build;\n"],"mappings":";;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AAEA,MAAMA,gBAAgB,GAAG,WAAzB;;AAGA,eAAeC,KAAf,GAAwB;EACtB,MAAMC,YAAY,GAAG,MAAM,IAAAC,8BAAA,GAA3B;EACA,MAAMC,UAAU,GAAG,MAAM,IAAAC,+BAAA,GAAzB;EACA,MAAMC,UAAU,GAAG,IAAAC,0BAAA,EAAoBH,UAApB,EAAgCJ,gBAAhC,CAAnB;EACA,MAAMQ,MAAM,GAAG,MAAM,IAAAC,mCAAA,EAAe;IAClCC,eAAe,EAAEN,UADiB;IAElCE;EAFkC,CAAf,CAArB;EAIA,MAAMK,GAAG,GAAG,IAAIC,oCAAJ,CAAmBV,YAAnB,EAAiC;IAC3CW,aAAa,EAAET,UAD4B;IAE3CM,eAAe,EAAEN,UAF0B;IAG3CU,YAAY,EAAE,IAH6B;IAI3CN;EAJ2C,CAAjC,CAAZ;EAMA,MAAMG,GAAG,CAACI,UAAJ,CAAeC,KAAf,CAAqB,IAArB,CAAN;AACD;;AAED,IAAIC,OAAO,CAACC,IAAR,KAAiBC,MAArB,EAA6B;EAC3B,IAAAC,kBAAA,EAASnB,KAAT;AACD;;eAEcA,K"}
1
+ {"version":3,"file":"build-wda.js","names":["DEFAULT_SIM_NAME","build","xcodeVersion","getAndCheckXcodeVersion","iosVersion","getAndCheckIosSdkVersion","deviceName","translateDeviceName","device","getExistingSim","platformVersion","wda","WebDriverAgent","iosSdkVersion","showXcodeLog","xcodebuild","start","require","main","module","asyncify"],"sources":["../../lib/build-wda.js"],"sourcesContent":["import { WebDriverAgent } from 'appium-webdriveragent';\nimport { translateDeviceName, getAndCheckXcodeVersion, getAndCheckIosSdkVersion } from './utils';\nimport { getExistingSim } from './simulator-management';\nimport { asyncify } from 'asyncbox';\n\nconst DEFAULT_SIM_NAME = 'iPhone 12';\n\n// TODO: allow passing in all the various build params as CLI args\nasync function build () {\n const xcodeVersion = await getAndCheckXcodeVersion();\n const iosVersion = await getAndCheckIosSdkVersion();\n const deviceName = translateDeviceName(iosVersion, DEFAULT_SIM_NAME);\n const device = await getExistingSim({\n platformVersion: iosVersion,\n deviceName\n });\n const wda = new WebDriverAgent(xcodeVersion, {\n iosSdkVersion: iosVersion,\n platformVersion: iosVersion,\n showXcodeLog: true,\n device,\n });\n await wda.xcodebuild.start(true);\n}\n\nif (require.main === module) {\n asyncify(build);\n}\n\nexport default build;\n"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AAEA,MAAMA,gBAAgB,GAAG,WAAW;;AAGpC,eAAeC,KAAK,GAAI;EACtB,MAAMC,YAAY,GAAG,MAAM,IAAAC,8BAAuB,GAAE;EACpD,MAAMC,UAAU,GAAG,MAAM,IAAAC,+BAAwB,GAAE;EACnD,MAAMC,UAAU,GAAG,IAAAC,0BAAmB,EAACH,UAAU,EAAEJ,gBAAgB,CAAC;EACpE,MAAMQ,MAAM,GAAG,MAAM,IAAAC,mCAAc,EAAC;IAClCC,eAAe,EAAEN,UAAU;IAC3BE;EACF,CAAC,CAAC;EACF,MAAMK,GAAG,GAAG,IAAIC,oCAAc,CAACV,YAAY,EAAE;IAC3CW,aAAa,EAAET,UAAU;IACzBM,eAAe,EAAEN,UAAU;IAC3BU,YAAY,EAAE,IAAI;IAClBN;EACF,CAAC,CAAC;EACF,MAAMG,GAAG,CAACI,UAAU,CAACC,KAAK,CAAC,IAAI,CAAC;AAClC;AAEA,IAAIC,OAAO,CAACC,IAAI,KAAKC,MAAM,EAAE;EAC3B,IAAAC,kBAAQ,EAACnB,KAAK,CAAC;AACjB;AAAC,eAEcA,KAAK;AAAA"}
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
@@ -9,13 +8,9 @@ exports.doesSupportKeychainApi = void 0;
9
8
  exports.hasCertificateLegacy = hasCertificateLegacy;
10
9
  exports.installCertificate = installCertificate;
11
10
  exports.installCertificateLegacy = installCertificateLegacy;
12
-
13
11
  require("source-map-support/register");
14
-
15
12
  var _lodash = _interopRequireDefault(require("lodash"));
16
-
17
13
  var _appiumIosSimulator = require("appium-ios-simulator");
18
-
19
14
  const doesSupportKeychainApi = _lodash.default.memoize(async function doesSupportKeychainApi(device) {
20
15
  try {
21
16
  await device.simctl.exec('help', {
@@ -28,7 +23,6 @@ const doesSupportKeychainApi = _lodash.default.memoize(async function doesSuppor
28
23
  });
29
24
 
30
25
  exports.doesSupportKeychainApi = doesSupportKeychainApi;
31
-
32
26
  async function installCertificate(device, payload) {
33
27
  await device.simctl.addRootCertificate(payload, {
34
28
  raw: true
@@ -42,4 +36,4 @@ async function hasCertificateLegacy(device, payload) {
42
36
  async function installCertificateLegacy(device, payload) {
43
37
  await (0, _appiumIosSimulator.installSSLCert)(payload, device.udid);
44
38
  }
45
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkb2VzU3VwcG9ydEtleWNoYWluQXBpIiwiXyIsIm1lbW9pemUiLCJkZXZpY2UiLCJzaW1jdGwiLCJleGVjIiwiYXJncyIsImUiLCJpbnN0YWxsQ2VydGlmaWNhdGUiLCJwYXlsb2FkIiwiYWRkUm9vdENlcnRpZmljYXRlIiwicmF3IiwiaGFzQ2VydGlmaWNhdGVMZWdhY3kiLCJoYXNTU0xDZXJ0IiwidWRpZCIsImluc3RhbGxDZXJ0aWZpY2F0ZUxlZ2FjeSIsImluc3RhbGxTU0xDZXJ0Il0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2NlcnQtdXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGluc3RhbGxTU0xDZXJ0LCBoYXNTU0xDZXJ0IH0gZnJvbSAnYXBwaXVtLWlvcy1zaW11bGF0b3InO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIFNpbXVsYXRvciBkZXZpY2Ugc3VwcG9ydHMgc2ltY3RsIGtleWNoYWluIEFQSS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZGV2aWNlIFNpbXVsYXRvciBpbnN0YW5jZSBjcmVhdGVkIGJ5IGFwcGl1bS1pb3Mtc2ltdWxhdG9yIG1vZHVsZVxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgY3VycmVudCBTaW11bGF0b3IgU0RLIHN1cHBvcnRzIGtleWNoYWluIGNvbW1hbmRzLlxuICovXG5jb25zdCBkb2VzU3VwcG9ydEtleWNoYWluQXBpID0gXy5tZW1vaXplKGFzeW5jIGZ1bmN0aW9uIGRvZXNTdXBwb3J0S2V5Y2hhaW5BcGkgKGRldmljZSkge1xuICB0cnkge1xuICAgIGF3YWl0IGRldmljZS5zaW1jdGwuZXhlYygnaGVscCcsIHtcbiAgICAgIGFyZ3M6IFsna2V5Y2hhaW4nXVxuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59KTtcblxuLyoqXG4gKiBBZGRzIGEgY2VydGlmaWNhdGUgdG8gdGhlIHRydXN0ZWQgcm9vdCBzdG9yZS5cbiAqIFNpbXVsYXRvciBtdXN0IGJlIGluIEJPT1RFRCBzdGF0ZSBmb3IgdGhpcyBBUEkgdG8gd29yay5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZGV2aWNlIFNpbXVsYXRvciBpbnN0YW5jZSBjcmVhdGVkIGJ5IGFwcGl1bS1pb3Mtc2ltdWxhdG9yIG1vZHVsZVxuICogQHBhcmFtIHtzdHJpbmd9IHBheWxvYWQgQ2VydGlmaWNhdGUgcGF5bG9hZFxuICovXG5hc3luYyBmdW5jdGlvbiBpbnN0YWxsQ2VydGlmaWNhdGUgKGRldmljZSwgcGF5bG9hZCkge1xuICBhd2FpdCBkZXZpY2Uuc2ltY3RsLmFkZFJvb3RDZXJ0aWZpY2F0ZShwYXlsb2FkLCB7cmF3OiB0cnVlfSk7XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gY2VydGlmaWNhdGUgaXMgYWxyZWFkeSBpbnN0YWxsZWQuXG4gKiBUaGUgZnVuY3Rpb24gaXMgdXNpbmcgaGFja3kgY2FsbHMgdG8gbWFrZSBjZXJ0aWZpY2F0ZSBzdHVmZiB3b3JraW5nIGZvciBvbGRlciBTREtzLlxuICogU2ltdWxhdG9yIG11c3QgYmUgaW4gU0hVVERPV04gc3RhdGUgZm9yIHRoaXMgQVBJIHRvIHdvcmsuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGRldmljZSBTaW11bGF0b3IgaW5zdGFuY2UgY3JlYXRlZCBieSBhcHBpdW0taW9zLXNpbXVsYXRvciBtb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXlsb2FkIENlcnRpZmljYXRlIHBheWxvYWRcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGNlcnRpZmljYXRlIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgcm9vdCBzdG9yZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaGFzQ2VydGlmaWNhdGVMZWdhY3kgKGRldmljZSwgcGF5bG9hZCkge1xuICByZXR1cm4gYXdhaXQgaGFzU1NMQ2VydChwYXlsb2FkLCBkZXZpY2UudWRpZCk7XG59XG5cbi8qKlxuICogQWRkcyBhIGNlcnRpZmljYXRlIHRvIHRoZSB0cnVzdGVkIHJvb3Qgc3RvcmUuXG4gKiBUaGUgZnVuY3Rpb24gaXMgdXNpbmcgaGFja3kgY2FsbHMgdG8gbWFrZSBjZXJ0aWZpY2F0ZSBzdHVmZiB3b3JraW5nIGZvciBvbGRlciBTREtzLlxuICogU2ltdWxhdG9yIG11c3QgYmUgaW4gU0hVVERPV04gc3RhdGUgZm9yIHRoaXMgQVBJIHRvIHdvcmsuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGRldmljZSBTaW11bGF0b3IgaW5zdGFuY2UgY3JlYXRlZCBieSBhcHBpdW0taW9zLXNpbXVsYXRvciBtb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXlsb2FkIENlcnRpZmljYXRlIHBheWxvYWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbENlcnRpZmljYXRlTGVnYWN5IChkZXZpY2UsIHBheWxvYWQpIHtcbiAgYXdhaXQgaW5zdGFsbFNTTENlcnQocGF5bG9hZCwgZGV2aWNlLnVkaWQpO1xufVxuXG5cbmV4cG9ydCB7XG4gIGRvZXNTdXBwb3J0S2V5Y2hhaW5BcGksIGluc3RhbGxDZXJ0aWZpY2F0ZSwgaW5zdGFsbENlcnRpZmljYXRlTGVnYWN5LFxuICBoYXNDZXJ0aWZpY2F0ZUxlZ2FjeVxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFRQSxNQUFNQSxzQkFBc0IsR0FBR0MsZUFBQSxDQUFFQyxPQUFGLENBQVUsZUFBZUYsc0JBQWYsQ0FBdUNHLE1BQXZDLEVBQStDO0VBQ3RGLElBQUk7SUFDRixNQUFNQSxNQUFNLENBQUNDLE1BQVAsQ0FBY0MsSUFBZCxDQUFtQixNQUFuQixFQUEyQjtNQUMvQkMsSUFBSSxFQUFFLENBQUMsVUFBRDtJQUR5QixDQUEzQixDQUFOO0lBR0EsT0FBTyxJQUFQO0VBQ0QsQ0FMRCxDQUtFLE9BQU9DLENBQVAsRUFBVTtJQUNWLE9BQU8sS0FBUDtFQUNEO0FBQ0YsQ0FUOEIsQ0FBL0I7Ozs7QUFrQkEsZUFBZUMsa0JBQWYsQ0FBbUNMLE1BQW5DLEVBQTJDTSxPQUEzQyxFQUFvRDtFQUNsRCxNQUFNTixNQUFNLENBQUNDLE1BQVAsQ0FBY00sa0JBQWQsQ0FBaUNELE9BQWpDLEVBQTBDO0lBQUNFLEdBQUcsRUFBRTtFQUFOLENBQTFDLENBQU47QUFDRDs7QUFXRCxlQUFlQyxvQkFBZixDQUFxQ1QsTUFBckMsRUFBNkNNLE9BQTdDLEVBQXNEO0VBQ3BELE9BQU8sTUFBTSxJQUFBSSw4QkFBQSxFQUFXSixPQUFYLEVBQW9CTixNQUFNLENBQUNXLElBQTNCLENBQWI7QUFDRDs7QUFVRCxlQUFlQyx3QkFBZixDQUF5Q1osTUFBekMsRUFBaURNLE9BQWpELEVBQTBEO0VBQ3hELE1BQU0sSUFBQU8sa0NBQUEsRUFBZVAsT0FBZixFQUF3Qk4sTUFBTSxDQUFDVyxJQUEvQixDQUFOO0FBQ0QifQ==
39
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkb2VzU3VwcG9ydEtleWNoYWluQXBpIiwiXyIsIm1lbW9pemUiLCJkZXZpY2UiLCJzaW1jdGwiLCJleGVjIiwiYXJncyIsImUiLCJpbnN0YWxsQ2VydGlmaWNhdGUiLCJwYXlsb2FkIiwiYWRkUm9vdENlcnRpZmljYXRlIiwicmF3IiwiaGFzQ2VydGlmaWNhdGVMZWdhY3kiLCJoYXNTU0xDZXJ0IiwidWRpZCIsImluc3RhbGxDZXJ0aWZpY2F0ZUxlZ2FjeSIsImluc3RhbGxTU0xDZXJ0Il0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2NlcnQtdXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGluc3RhbGxTU0xDZXJ0LCBoYXNTU0xDZXJ0IH0gZnJvbSAnYXBwaXVtLWlvcy1zaW11bGF0b3InO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIFNpbXVsYXRvciBkZXZpY2Ugc3VwcG9ydHMgc2ltY3RsIGtleWNoYWluIEFQSS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZGV2aWNlIFNpbXVsYXRvciBpbnN0YW5jZSBjcmVhdGVkIGJ5IGFwcGl1bS1pb3Mtc2ltdWxhdG9yIG1vZHVsZVxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgY3VycmVudCBTaW11bGF0b3IgU0RLIHN1cHBvcnRzIGtleWNoYWluIGNvbW1hbmRzLlxuICovXG5jb25zdCBkb2VzU3VwcG9ydEtleWNoYWluQXBpID0gXy5tZW1vaXplKGFzeW5jIGZ1bmN0aW9uIGRvZXNTdXBwb3J0S2V5Y2hhaW5BcGkgKGRldmljZSkge1xuICB0cnkge1xuICAgIGF3YWl0IGRldmljZS5zaW1jdGwuZXhlYygnaGVscCcsIHtcbiAgICAgIGFyZ3M6IFsna2V5Y2hhaW4nXVxuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59KTtcblxuLyoqXG4gKiBBZGRzIGEgY2VydGlmaWNhdGUgdG8gdGhlIHRydXN0ZWQgcm9vdCBzdG9yZS5cbiAqIFNpbXVsYXRvciBtdXN0IGJlIGluIEJPT1RFRCBzdGF0ZSBmb3IgdGhpcyBBUEkgdG8gd29yay5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZGV2aWNlIFNpbXVsYXRvciBpbnN0YW5jZSBjcmVhdGVkIGJ5IGFwcGl1bS1pb3Mtc2ltdWxhdG9yIG1vZHVsZVxuICogQHBhcmFtIHtzdHJpbmd9IHBheWxvYWQgQ2VydGlmaWNhdGUgcGF5bG9hZFxuICovXG5hc3luYyBmdW5jdGlvbiBpbnN0YWxsQ2VydGlmaWNhdGUgKGRldmljZSwgcGF5bG9hZCkge1xuICBhd2FpdCBkZXZpY2Uuc2ltY3RsLmFkZFJvb3RDZXJ0aWZpY2F0ZShwYXlsb2FkLCB7cmF3OiB0cnVlfSk7XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gY2VydGlmaWNhdGUgaXMgYWxyZWFkeSBpbnN0YWxsZWQuXG4gKiBUaGUgZnVuY3Rpb24gaXMgdXNpbmcgaGFja3kgY2FsbHMgdG8gbWFrZSBjZXJ0aWZpY2F0ZSBzdHVmZiB3b3JraW5nIGZvciBvbGRlciBTREtzLlxuICogU2ltdWxhdG9yIG11c3QgYmUgaW4gU0hVVERPV04gc3RhdGUgZm9yIHRoaXMgQVBJIHRvIHdvcmsuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGRldmljZSBTaW11bGF0b3IgaW5zdGFuY2UgY3JlYXRlZCBieSBhcHBpdW0taW9zLXNpbXVsYXRvciBtb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXlsb2FkIENlcnRpZmljYXRlIHBheWxvYWRcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGNlcnRpZmljYXRlIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgcm9vdCBzdG9yZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaGFzQ2VydGlmaWNhdGVMZWdhY3kgKGRldmljZSwgcGF5bG9hZCkge1xuICByZXR1cm4gYXdhaXQgaGFzU1NMQ2VydChwYXlsb2FkLCBkZXZpY2UudWRpZCk7XG59XG5cbi8qKlxuICogQWRkcyBhIGNlcnRpZmljYXRlIHRvIHRoZSB0cnVzdGVkIHJvb3Qgc3RvcmUuXG4gKiBUaGUgZnVuY3Rpb24gaXMgdXNpbmcgaGFja3kgY2FsbHMgdG8gbWFrZSBjZXJ0aWZpY2F0ZSBzdHVmZiB3b3JraW5nIGZvciBvbGRlciBTREtzLlxuICogU2ltdWxhdG9yIG11c3QgYmUgaW4gU0hVVERPV04gc3RhdGUgZm9yIHRoaXMgQVBJIHRvIHdvcmsuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGRldmljZSBTaW11bGF0b3IgaW5zdGFuY2UgY3JlYXRlZCBieSBhcHBpdW0taW9zLXNpbXVsYXRvciBtb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXlsb2FkIENlcnRpZmljYXRlIHBheWxvYWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbENlcnRpZmljYXRlTGVnYWN5IChkZXZpY2UsIHBheWxvYWQpIHtcbiAgYXdhaXQgaW5zdGFsbFNTTENlcnQocGF5bG9hZCwgZGV2aWNlLnVkaWQpO1xufVxuXG5cbmV4cG9ydCB7XG4gIGRvZXNTdXBwb3J0S2V5Y2hhaW5BcGksIGluc3RhbGxDZXJ0aWZpY2F0ZSwgaW5zdGFsbENlcnRpZmljYXRlTGVnYWN5LFxuICBoYXNDZXJ0aWZpY2F0ZUxlZ2FjeVxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBUUEsTUFBTUEsc0JBQXNCLEdBQUdDLGVBQUMsQ0FBQ0MsT0FBTyxDQUFDLGVBQWVGLHNCQUFzQixDQUFFRyxNQUFNLEVBQUU7RUFDdEYsSUFBSTtJQUNGLE1BQU1BLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDQyxJQUFJLENBQUMsTUFBTSxFQUFFO01BQy9CQyxJQUFJLEVBQUUsQ0FBQyxVQUFVO0lBQ25CLENBQUMsQ0FBQztJQUNGLE9BQU8sSUFBSTtFQUNiLENBQUMsQ0FBQyxPQUFPQyxDQUFDLEVBQUU7SUFDVixPQUFPLEtBQUs7RUFDZDtBQUNGLENBQUMsQ0FBQzs7QUFBQztBQVNILGVBQWVDLGtCQUFrQixDQUFFTCxNQUFNLEVBQUVNLE9BQU8sRUFBRTtFQUNsRCxNQUFNTixNQUFNLENBQUNDLE1BQU0sQ0FBQ00sa0JBQWtCLENBQUNELE9BQU8sRUFBRTtJQUFDRSxHQUFHLEVBQUU7RUFBSSxDQUFDLENBQUM7QUFDOUQ7O0FBV0EsZUFBZUMsb0JBQW9CLENBQUVULE1BQU0sRUFBRU0sT0FBTyxFQUFFO0VBQ3BELE9BQU8sTUFBTSxJQUFBSSw4QkFBVSxFQUFDSixPQUFPLEVBQUVOLE1BQU0sQ0FBQ1csSUFBSSxDQUFDO0FBQy9DOztBQVVBLGVBQWVDLHdCQUF3QixDQUFFWixNQUFNLEVBQUVNLE9BQU8sRUFBRTtFQUN4RCxNQUFNLElBQUFPLGtDQUFjLEVBQUNQLE9BQU8sRUFBRU4sTUFBTSxDQUFDVyxJQUFJLENBQUM7QUFDNUMifQ==