appium-ios-simulator 4.1.8 → 4.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,24 @@
1
+ ## [4.2.1](https://github.com/appium/appium-ios-simulator/compare/v4.2.0...v4.2.1) (2022-12-12)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * Update Simulator preferences configuration ([#347](https://github.com/appium/appium-ios-simulator/issues/347)) ([355c5da](https://github.com/appium/appium-ios-simulator/commit/355c5dabea80330952705570cd0e48ef1633a3fc))
7
+
8
+
9
+ ### Code Refactoring
10
+
11
+ * do not launch in setReduceMotion ([#343](https://github.com/appium/appium-ios-simulator/issues/343)) ([cc35e3e](https://github.com/appium/appium-ios-simulator/commit/cc35e3e7b10585fd127630c1ca01b6de14a2cf63))
12
+ * Drop usage of fs-extra module ([#344](https://github.com/appium/appium-ios-simulator/issues/344)) ([4c1a63e](https://github.com/appium/appium-ios-simulator/commit/4c1a63e0672534b2f401e416b3face095fec639f))
13
+ * Streamline settings helpers for the simulator ([#346](https://github.com/appium/appium-ios-simulator/issues/346)) ([bcf4753](https://github.com/appium/appium-ios-simulator/commit/bcf475318d707b3ac8531b72dbc0d1db9bff4578))
14
+
15
+ ## [4.2.0](https://github.com/appium/appium-ios-simulator/compare/v4.1.8...v4.2.0) (2022-12-09)
16
+
17
+
18
+ ### Features
19
+
20
+ * add setReduceTransparency ([#342](https://github.com/appium/appium-ios-simulator/issues/342)) ([ef57f51](https://github.com/appium/appium-ios-simulator/commit/ef57f51570a756b999bf1b0739b8d7149e1a1b0d))
21
+
1
22
  ## [4.1.8](https://github.com/appium/appium-ios-simulator/compare/v4.1.7...v4.1.8) (2022-12-09)
2
23
 
3
24
 
package/README.md CHANGED
@@ -3,11 +3,13 @@
3
3
  [![NPM version](http://img.shields.io/npm/v/appium-ios-simulator.svg)](https://npmjs.org/package/appium-ios-simulator)
4
4
  [![Downloads](http://img.shields.io/npm/dm/appium-ios-simulator.svg)](https://npmjs.org/package/appium-ios-simulator)
5
5
 
6
- [![Build Status](https://api.travis-ci.org/appium/appium-ios-simulator.png?branch=master)](https://travis-ci.org/appium/appium-ios-simulator)
7
6
 
8
- Appium API for dealing with iOS simulators. Allows the user to find locations of directories and applications, gives access to settings in order to read from and write to simulator plists, and allows control over starting and stopping simulators.
7
+ Appium API for dealing with iOS simulators. The API enables you to use the following features:
9
8
 
10
- *Note*: Issue tracking for this repo has been disabled. Please use the [main Appium issue tracker](https://github.com/appium/appium/issues) instead.
9
+ - query locations of Simulator-specific directories and applications
10
+ - read/write access to Simulator settings
11
+ - full control over starting and stopping simulators
12
+ - deal with biometric auth, geolocation settings, application permissions, and others
11
13
 
12
14
  ### Usage
13
15
 
@@ -20,84 +22,41 @@ If you want to create a new simulator, you can use the `createDevice()` method o
20
22
 
21
23
  ```js
22
24
  import { getSimulator } from 'appium-ios-simulator';
25
+ import assert from 'node:assert/strict';
23
26
 
24
- let sim = await getSimulator('DAE95172-0788-4A85-8D0D-5C85509109E1');
27
+ const sim = await getSimulator('DAE95172-0788-4A85-8D0D-5C85509109E1');
28
+ await sim.run();
29
+ assert.equal('Booted', (await sim.stat()).state);
30
+ await sim.shutdown();
31
+ assert.equal('Shutdown', (await sim.stat()).state);
25
32
  ```
26
33
 
34
+ ### Third-party tools
35
+
36
+ The following tools and utilities are not mandatory, but could be used by the appium-ios-simulator, if installed locally, to extend its functionality:
37
+
38
+ - [Lyft](https://github.com/lyft)
39
+ - [IDB](https://github.com/facebook/idb)
40
+ - [AppleSimulatorUtils](https://github.com/wix/AppleSimulatorUtils)
41
+
27
42
  ### Xcode and iOS versions
28
43
 
29
- See [wikipedia](https://en.wikipedia.org/wiki/Xcode#Xcode_5.0_-_7.x_.28with_arm64_support.29) for details of builds for Xcode versions.
30
-
31
- | iOS | Xcode 7.1 beta 3 | Xcode 7.0.1 | Xcode 6.4 | Xcode 6.3.2 | Xcode 6.2 | Xcode 6.1.1 | Xcode 6.0.1 |
32
- |-----|------------------|----------------|-----------|-------------|-----------|-------------|-------------|
33
- | 7.1 | 11D167 | n/a | 11D167 | 11D167 | 11D167 | 11D167 | 11D167 |
34
- | 8.0 | n/a | n/a | n/a | n/a | n/a | n/a | 12A365 |
35
- | 8.1 | 12B411 | 12B411 | 12B411 | 12B411 | 12B411 | 12B411 | 12B411 |
36
- | 8.2 | 12D508 | 12D508 | 12D508 | 12D508 | 12D508 | n/a | n/a |
37
- | 8.3 | 12F70 | 12F70 | 12F70 | 12F69 | 12F70 | n/a | n/a |
38
- | 8.4 | 12H141 | 12H141 | 12H141 | 12H141 | 12H141 | n/a | n/a |
39
- | 9.0 | 13A344 | 13A340 | n/a | n/a | n/a | n/a | n/a |
40
- | 9.1 | 13B134 | n/a | n/a | n/a | n/a | n/a | n/a |
41
-
42
-
43
- #### file locations
44
-
45
- iOS 9.3
46
- - base
47
- - ~/Library/Developer/CoreSimulator/Devices/[identifier]/data/
48
- - safari plists
49
- - [base]/Containers/Containers/Data/Application/[identifier]/<.com.apple.mobile_container_manager.metadata.plist, com.apple.mobilesafari>
50
- - locationd cache plists
51
- - [base]/Library/Caches/locationd/cache.plist
52
- - [base]/Library/Preferences/com.apple.locationd.plist
53
- - locationd clients plists
54
- - [base]/Library/Caches/locationd/clients.plist
55
- - user settings plists
56
- - [base]/Library/UserConfigurationProfiles/UserSettings.plist
57
- - [base]/Library/UserConfigurationProfiles/EffectiveUserSettings.plist
58
- - [base]/Library/UserConfigurationProfiles/PublicInfo/PublicEffectiveUserSettings.plist
59
- - other plists
60
- - [base]/Library/Preferences
61
- - logs
62
- - ~/Library/Logs/CoreSimulator/[identifier]/
63
- - sym linked to [base]/Library/Logs
64
-
65
- iOS 9.2, 9.1, 9.0, 8.4, 8.3
66
- - base
67
- - ~/Library/Developer/CoreSimulator/Devices/[identifier]/data/
68
- - safari plists
69
- - [base]/Containers/Data/Application/[identifier]/<.com.apple.mobile_container_manager.metadata.plist, com.apple.mobilesafari>
70
- - locationd cache plists
71
- - [base]/Library/Caches/locationd/cache.plist
72
- - [base]/Library/Preferences/com.apple.locationd.plist
73
- - locationd clients plists
74
- - [base]/Library/Caches/locationd/clients.plist
75
- - user settings plists
76
- - [base]/Library/ConfigurationProfiles/UserSettings.plist
77
- - [base]/Library/ConfigurationProfiles/EffectiveUserSettings.plist
78
- - [base]/Library/ConfigurationProfiles/PublicInfo/PublicEffectiveUserSettings.plist
79
- - other plists
80
- - [base]/Library/Preferences
81
- - logs
82
- - ~/Library/Logs/CoreSimulator/[identifier]/
83
- - sym linked to [base]/Library/Logs
84
-
85
- iOS 7.1
86
- - base
87
- - ~/Library/Developer/CoreSimulator/Devices/[identifier]/data/
88
- - safari
89
- - [base]/Applications/[identifier]/Library/Preferences/com.apple.mobilesafari.plist
90
- - locationCache
91
- - [base]/Library/Caches/locationd/cache.plist
92
- - [base]/Library/Preferences/com.apple.locationd.plist
93
- - locationClients
94
- - [base]/Library/Caches/locationd/clients.plist
95
- - userSettings
96
- - [base]/Library/ConfigurationProfiles/UserSettings.plist
97
- - [base]/Library/ConfigurationProfiles/EffectiveUserSettings.plist
98
- - [base]/Library/ConfigurationProfiles/PublicInfo/PublicEffectiveUserSettings.plist
99
- - other plists
100
- - [base]/Library/Preferences
101
- - logs
102
- - ~/Library/Logs/CoreSimulator/[identifier]/
103
- - sym linked to [base]/Library/Logs
44
+ Check [Xcode wikipedia](https://en.wikipedia.org/wiki/Xcode) for more details about Xcode version to iOS version mapping.
45
+
46
+ ### Development
47
+
48
+ Checkout the repository and run
49
+
50
+ ```bash
51
+ npm install
52
+ npm run dev
53
+ ```
54
+
55
+ Use the following commands to run tests:
56
+
57
+ ```bash
58
+ # unit tests
59
+ npm run test
60
+ # integration tests
61
+ npm run e2e-test
62
+ ```
@@ -4,10 +4,11 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
+ exports.PLIST_IDENTIFIER = void 0;
7
8
  exports.read = read;
8
9
  exports.readSettings = readSettings;
9
10
  exports.setReduceMotion = setReduceMotion;
10
- exports.stub = stub;
11
+ exports.setReduceTransparency = setReduceTransparency;
11
12
  exports.update = update;
12
13
  exports.updateLocale = updateLocale;
13
14
  exports.updateLocationSettings = updateLocationSettings;
@@ -21,66 +22,68 @@ var _path = _interopRequireDefault(require("path"));
21
22
  var _logger = _interopRequireDefault(require("./logger"));
22
23
  var _semver = _interopRequireDefault(require("semver"));
23
24
  var _bluebird = _interopRequireDefault(require("bluebird"));
25
+ const PLIST_IDENTIFIER = Object.freeze({
26
+ WEB_INSPECTOR: 'webInspector',
27
+ MOBILE_SAFARI: 'mobileSafari',
28
+ GLOBAL_MOBILE_SAFARI: 'globalMobileSafari',
29
+ WEB_UI: 'webUI',
30
+ WEB_FOUNDATION: 'webFoundation',
31
+ PREFERENCES: 'preferences',
32
+ GLOBAL_PREFERENCES: 'globalPreferences',
33
+ LOCATION_SERVICES: 'locationServices',
34
+ LOCATION_CLIENTS: 'locationClients',
35
+ LOCATION_CACHE: 'locationCache',
36
+ USER_SETTINGS: 'userSettings',
37
+ EFFECTIVE_USER_SETTINGS: 'effectiveUserSettings',
38
+ ACCESSIBLITY_SETTINGS: 'accessibilitySettings',
39
+ UI_STYLE_SETTINGS: 'uiStyleSettings'
40
+ });
41
+ exports.PLIST_IDENTIFIER = PLIST_IDENTIFIER;
24
42
  async function plistPaths(sim, identifier) {
25
- let paths = [];
26
- let simDirectory = sim.getDir();
43
+ const simDirectory = sim.getDir();
27
44
  switch (identifier) {
28
- case 'webInspector':
29
- paths.push(_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.webInspector.plist'));
30
- break;
31
- case 'mobileSafari':
32
- paths.push(_path.default.resolve(await sim.getAppDir('com.apple.mobilesafari'), 'Library', 'Preferences', 'com.apple.mobilesafari.plist'));
33
- break;
34
- case 'globalMobileSafari':
35
- paths.push(_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.mobilesafari.plist'));
36
- break;
37
- case 'webUI':
38
- paths.push(_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.WebUI.plist'));
39
- break;
40
- case 'webFoundation':
41
- paths.push(_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.WebFoundation.plist'));
42
- break;
43
- case 'preferences':
44
- paths.push(_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.Preferences.plist'));
45
- break;
46
- case 'locationServices':
47
- paths.push(_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.locationd.plist'));
48
- break;
49
- case 'locationClients':
50
- paths.push(_path.default.resolve(simDirectory, 'Library', 'Caches', 'locationd', 'clients.plist'));
51
- break;
52
- case 'locationCache':
53
- paths.push(_path.default.resolve(simDirectory, 'Library', 'Caches', 'locationd', 'cache.plist'));
54
- paths.push(_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.locationd.plist'));
55
- break;
56
- case 'userSettings':
57
- if (_semver.default.lt(_semver.default.coerce(sim.xcodeVersion.versionString), _semver.default.coerce('7.3'))) {
58
- paths.push(_path.default.resolve(simDirectory, 'Library', 'ConfigurationProfiles', 'UserSettings.plist'));
59
- paths.push(_path.default.resolve(simDirectory, 'Library', 'ConfigurationProfiles', 'EffectiveUserSettings.plist'));
60
- paths.push(_path.default.resolve(simDirectory, 'Library', 'ConfigurationProfiles', 'PublicInfo', 'PublicEffectiveUserSettings.plist'));
61
- } else {
62
- paths.push(_path.default.resolve(simDirectory, 'Library', 'UserConfigurationProfiles', 'UserSettings.plist'));
63
- paths.push(_path.default.resolve(simDirectory, 'Library', 'UserConfigurationProfiles', 'EffectiveUserSettings.plist'));
64
- paths.push(_path.default.resolve(simDirectory, 'Library', 'UserConfigurationProfiles', 'PublicInfo', 'PublicEffectiveUserSettings.plist'));
45
+ case PLIST_IDENTIFIER.WEB_INSPECTOR:
46
+ return [_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.webInspector.plist')];
47
+ case PLIST_IDENTIFIER.MOBILE_SAFARI:
48
+ return [_path.default.resolve(await sim.getAppDir('com.apple.mobilesafari'), 'Library', 'Preferences', 'com.apple.mobilesafari.plist')];
49
+ case PLIST_IDENTIFIER.GLOBAL_MOBILE_SAFARI:
50
+ return [_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.mobilesafari.plist')];
51
+ case PLIST_IDENTIFIER.WEB_UI:
52
+ return [_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.WebUI.plist')];
53
+ case PLIST_IDENTIFIER.WEB_FOUNDATION:
54
+ return [_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.WebFoundation.plist')];
55
+ case PLIST_IDENTIFIER.PREFERENCES:
56
+ return [_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.Preferences.plist')];
57
+ case PLIST_IDENTIFIER.GLOBAL_PREFERENCES:
58
+ return [_path.default.resolve(simDirectory, 'Library', 'Preferences', '.GlobalPreferences.plist')];
59
+ case PLIST_IDENTIFIER.LOCATION_SERVICES:
60
+ return [_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.locationd.plist')];
61
+ case PLIST_IDENTIFIER.LOCATION_CLIENTS:
62
+ return [_path.default.resolve(simDirectory, 'Library', 'Caches', 'locationd', 'clients.plist')];
63
+ case PLIST_IDENTIFIER.LOCATION_CACHE:
64
+ return [['Caches', 'locationd', 'cache.plist'], ['Preferences', 'com.apple.locationd.plist']].map(x => _path.default.resolve(simDirectory, 'Library', ...x));
65
+ case PLIST_IDENTIFIER.USER_SETTINGS:
66
+ {
67
+ const profilesDirName = _semver.default.lt(_semver.default.coerce(sim.xcodeVersion.versionString), _semver.default.coerce('7.3')) ? 'ConfigurationProfiles' : 'UserConfigurationProfiles';
68
+ return [['UserSettings.plist'], ['EffectiveUserSettings.plist'], ['PublicInfo', 'PublicEffectiveUserSettings.plist']].map(x => _path.default.resolve(simDirectory, 'Library', profilesDirName, ...x));
65
69
  }
66
- break;
67
- case 'effectiveUserSettings':
68
- paths.push(_path.default.resolve(simDirectory, 'Library', 'ConfigurationProfiles', 'EffectiveUserSettings.plist'));
69
- paths.push(_path.default.resolve(simDirectory, 'Library', 'ConfigurationProfiles', 'PublicInfo', 'PublicEffectiveUserSettings.plist'));
70
- break;
71
- case 'accessibilitySettings':
72
- paths.push(_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.Accessibility.plist'));
73
- break;
74
- case 'uiStyleSettings':
75
- paths.push(_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.uikitservices.userInterfaceStyleMode.plist'));
76
- break;
77
- }
78
- return paths;
70
+ case PLIST_IDENTIFIER.EFFECTIVE_USER_SETTINGS:
71
+ return [['EffectiveUserSettings.plist'], ['PublicInfo', 'PublicEffectiveUserSettings.plist']].map(x => _path.default.resolve(simDirectory, 'Library', 'ConfigurationProfiles', ...x));
72
+ case PLIST_IDENTIFIER.ACCESSIBLITY_SETTINGS:
73
+ return [_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.Accessibility.plist')];
74
+ case PLIST_IDENTIFIER.UI_STYLE_SETTINGS:
75
+ return [_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.uikitservices.userInterfaceStyleMode.plist')];
76
+ default:
77
+ return [];
78
+ }
79
79
  }
80
80
  async function updateSettings(sim, plist, updates) {
81
- return await _bluebird.default.reduce(await plistPaths(sim, plist), async function reducer(updated, path) {
82
- return (await update(path, updates)) || updated;
83
- }, false);
81
+ const paths = await plistPaths(sim, plist);
82
+ if (_lodash.default.isEmpty(paths)) {
83
+ return false;
84
+ }
85
+ const results = await _bluebird.default.all(paths.map(p => update(p, updates)));
86
+ return _lodash.default.some(results, Boolean);
84
87
  }
85
88
  async function update(pathToPlist, updates) {
86
89
  const currentSettings = await read(pathToPlist);
@@ -92,11 +95,12 @@ async function update(pathToPlist, updates) {
92
95
  return true;
93
96
  }
94
97
  async function readSettings(sim, plist) {
95
- let settings = {};
96
- for (let path of await plistPaths(sim, plist)) {
97
- settings[path] = await read(path);
98
+ const paths = await plistPaths(sim, plist);
99
+ if (_lodash.default.isEmpty(paths)) {
100
+ return {};
98
101
  }
99
- return settings;
102
+ const settings = await _bluebird.default.all(paths.map(read));
103
+ return _lodash.default.fromPairs(_lodash.default.zip(paths, settings));
100
104
  }
101
105
  async function read(pathToPlist) {
102
106
  return await _support.plist.parsePlistFile(pathToPlist, false);
@@ -106,7 +110,7 @@ async function updateLocationSettings(sim, bundleId, authorized) {
106
110
  LastFenceActivityTimestamp: 412122103.232983,
107
111
  CleanShutdown: true
108
112
  };
109
- let updated = await updateSettings(sim, 'locationCache', {
113
+ const updated = await updateSettings(sim, PLIST_IDENTIFIER.LOCATION_CACHE, {
110
114
  [bundleId]: newCachePrefs
111
115
  });
112
116
  const newClientPrefs = {
@@ -114,12 +118,17 @@ async function updateLocationSettings(sim, bundleId, authorized) {
114
118
  Authorized: !!authorized,
115
119
  Whitelisted: false
116
120
  };
117
- for (const file of await plistPaths(sim, 'locationClients')) {
121
+ const paths = await plistPaths(sim, PLIST_IDENTIFIER.LOCATION_CLIENTS);
122
+ if (_lodash.default.isEmpty(paths)) {
123
+ return false;
124
+ }
125
+ const contents = await _bluebird.default.all(paths.map(read));
126
+ const promises = [];
127
+ for (const [file, content] of _lodash.default.zip(paths, contents)) {
118
128
  _logger.default.debug(`Updating location client file: ${file}`);
119
- let updates = {};
120
- const plist = await read(file);
129
+ const updates = {};
121
130
  const weirdLocKey = 'com.apple.locationd.bundle-/System/Library/' + 'PrivateFrameworks/AOSNotification.framework';
122
- if (!_lodash.default.has(plist, weirdLocKey)) {
131
+ if (!_lodash.default.has(content, weirdLocKey)) {
123
132
  updates[weirdLocKey] = {
124
133
  BundlePath: '/System/Library/PrivateFrameworks/AOSNotification.framework',
125
134
  Whitelisted: false,
@@ -127,28 +136,31 @@ async function updateLocationSettings(sim, bundleId, authorized) {
127
136
  Registered: ''
128
137
  };
129
138
  }
130
- const baseSetting = _lodash.default.has(plist, bundleId) ? plist[bundleId] : {};
139
+ const baseSetting = _lodash.default.has(content, bundleId) ? content[bundleId] : {};
131
140
  updates[bundleId] = _lodash.default.defaults(newClientPrefs, baseSetting);
132
141
  updates[bundleId].Executable = updates[bundleId].Executable || '';
133
142
  updates[bundleId].Registered = updates[bundleId].Registered || '';
134
- updated = (await update(file, updates)) || updated;
143
+ promises.push(update(file, updates));
135
144
  }
136
- return updated;
145
+ return (_lodash.default.isEmpty(promises) ? false : _lodash.default.some(await _bluebird.default.all(promises), Boolean)) || updated;
137
146
  }
138
147
  async function setReduceMotion(sim, reduceMotion = true) {
139
148
  _logger.default.debug(`Updating reduce motion. Setting to ${reduceMotion}.`);
140
- const paths = await plistPaths(sim, 'accessibilitySettings');
141
- for (const file of paths) {
142
- await update(file, {
143
- ReduceMotionEnabled: reduceMotion ? 1 : 0
144
- });
145
- }
149
+ await updateSettings(sim, PLIST_IDENTIFIER.ACCESSIBLITY_SETTINGS, {
150
+ ReduceMotionEnabled: reduceMotion ? 1 : 0
151
+ });
152
+ }
153
+ async function setReduceTransparency(sim, reduceTransparency) {
154
+ _logger.default.debug(`Updating reduce tranceparency. Setting to ${reduceTransparency}.`);
155
+ await updateSettings(sim, PLIST_IDENTIFIER.ACCESSIBLITY_SETTINGS, {
156
+ EnhancedBackgroundContrastEnabled: reduceTransparency ? 1 : 0
157
+ });
146
158
  }
147
159
  async function updateSafariGlobalSettings(sim, settingSet) {
148
160
  _logger.default.debug('Updating Safari global settings');
149
- let updated = false;
150
- for (const [file, safariSettingSet] of _lodash.default.toPairs(await readSettings(sim, 'globalMobileSafari'))) {
151
- let newSettings = {};
161
+ const promises = [];
162
+ for (const [file, safariSettingSet] of _lodash.default.toPairs(await readSettings(sim, PLIST_IDENTIFIER.GLOBAL_MOBILE_SAFARI))) {
163
+ const newSettings = {};
152
164
  for (const [key, value] of _lodash.default.toPairs(settingSet)) {
153
165
  if (safariSettingSet[key] !== value) {
154
166
  newSettings[key] = value;
@@ -157,13 +169,13 @@ async function updateSafariGlobalSettings(sim, settingSet) {
157
169
  if (_lodash.default.isEmpty(newSettings)) {
158
170
  continue;
159
171
  }
160
- updated = (await update(file, newSettings)) || updated;
172
+ promises.push(update(file, newSettings));
161
173
  }
162
- return updated;
174
+ return _lodash.default.isEmpty(promises) ? false : _lodash.default.some(await _bluebird.default.all(promises), Boolean);
163
175
  }
164
176
  async function updateSafariUserSettings(sim, settingSet) {
165
177
  _logger.default.debug('Updating Safari user settings');
166
- let newUserSettings = {};
178
+ const newUserSettings = {};
167
179
  if (_lodash.default.has(settingSet, 'WebKitJavaScriptEnabled')) {
168
180
  newUserSettings.safariAllowJavaScript = settingSet.WebKitJavaScriptEnabled;
169
181
  }
@@ -176,22 +188,25 @@ async function updateSafariUserSettings(sim, settingSet) {
176
188
  if (_lodash.default.isEmpty(newUserSettings)) {
177
189
  return false;
178
190
  }
179
- let updated = false;
180
- for (const [file, userSettingSet] of _lodash.default.toPairs(await readSettings(sim, 'userSettings'))) {
191
+ const promises = [];
192
+ for (const [file, userSettingSet] of _lodash.default.toPairs(await readSettings(sim, PLIST_IDENTIFIER.USER_SETTINGS))) {
181
193
  if (!_lodash.default.has(userSettingSet, 'restrictedBool')) {
182
194
  userSettingSet.restrictedBool = {};
183
195
  }
184
- for (let [key, value] of _lodash.default.toPairs(newUserSettings)) {
196
+ for (const [key, value] of _lodash.default.toPairs(newUserSettings)) {
185
197
  userSettingSet.restrictedBool[key] = {
186
198
  value
187
199
  };
188
200
  }
189
- updated = (await update(file, userSettingSet)) || updated;
201
+ promises.push(update(file, userSettingSet));
190
202
  }
191
- return updated;
203
+ return _lodash.default.isEmpty(promises) ? false : _lodash.default.some(await _bluebird.default.all(promises), Boolean);
192
204
  }
193
205
  async function updateLocale(sim, language, locale, calendarFormat) {
194
- let globalPrefs = _path.default.resolve(sim.getDir(), 'Library', 'Preferences', '.GlobalPreferences.plist');
206
+ const globalPrefs = (await plistPaths(sim, PLIST_IDENTIFIER.GLOBAL_PREFERENCES))[0];
207
+ if (!globalPrefs) {
208
+ throw new Error('Global preferences folder path cannot be retrieved');
209
+ }
195
210
  let data = await read(globalPrefs);
196
211
  let updates = {};
197
212
  if (language) {
@@ -227,7 +242,4 @@ async function updateLocale(sim, language, locale, calendarFormat) {
227
242
  await update(globalPrefs, updates);
228
243
  return true;
229
244
  }
230
- async function stub() {
231
- return await plistPaths;
232
- }
233
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwbGlzdFBhdGhzIiwic2ltIiwiaWRlbnRpZmllciIsInBhdGhzIiwic2ltRGlyZWN0b3J5IiwiZ2V0RGlyIiwicHVzaCIsInBhdGgiLCJyZXNvbHZlIiwiZ2V0QXBwRGlyIiwic2VtdmVyIiwibHQiLCJjb2VyY2UiLCJ4Y29kZVZlcnNpb24iLCJ2ZXJzaW9uU3RyaW5nIiwidXBkYXRlU2V0dGluZ3MiLCJwbGlzdCIsInVwZGF0ZXMiLCJCIiwicmVkdWNlIiwicmVkdWNlciIsInVwZGF0ZWQiLCJ1cGRhdGUiLCJwYXRoVG9QbGlzdCIsImN1cnJlbnRTZXR0aW5ncyIsInJlYWQiLCJuZXdTZXR0aW5ncyIsIk9iamVjdCIsImFzc2lnbiIsIl8iLCJpc0VxdWFsIiwidXBkYXRlUGxpc3RGaWxlIiwicmVhZFNldHRpbmdzIiwic2V0dGluZ3MiLCJwYXJzZVBsaXN0RmlsZSIsInVwZGF0ZUxvY2F0aW9uU2V0dGluZ3MiLCJidW5kbGVJZCIsImF1dGhvcml6ZWQiLCJuZXdDYWNoZVByZWZzIiwiTGFzdEZlbmNlQWN0aXZpdHlUaW1lc3RhbXAiLCJDbGVhblNodXRkb3duIiwibmV3Q2xpZW50UHJlZnMiLCJCdW5kbGVJZCIsIkF1dGhvcml6ZWQiLCJXaGl0ZWxpc3RlZCIsImZpbGUiLCJsb2ciLCJkZWJ1ZyIsIndlaXJkTG9jS2V5IiwiaGFzIiwiQnVuZGxlUGF0aCIsIkV4ZWN1dGFibGUiLCJSZWdpc3RlcmVkIiwiYmFzZVNldHRpbmciLCJkZWZhdWx0cyIsInNldFJlZHVjZU1vdGlvbiIsInJlZHVjZU1vdGlvbiIsIlJlZHVjZU1vdGlvbkVuYWJsZWQiLCJ1cGRhdGVTYWZhcmlHbG9iYWxTZXR0aW5ncyIsInNldHRpbmdTZXQiLCJzYWZhcmlTZXR0aW5nU2V0IiwidG9QYWlycyIsImtleSIsInZhbHVlIiwiaXNFbXB0eSIsInVwZGF0ZVNhZmFyaVVzZXJTZXR0aW5ncyIsIm5ld1VzZXJTZXR0aW5ncyIsInNhZmFyaUFsbG93SmF2YVNjcmlwdCIsIldlYktpdEphdmFTY3JpcHRFbmFibGVkIiwic2FmYXJpQWxsb3dQb3B1cHMiLCJXZWJLaXRKYXZhU2NyaXB0Q2FuT3BlbldpbmRvd3NBdXRvbWF0aWNhbGx5Iiwic2FmYXJpRm9yY2VGcmF1ZFdhcm5pbmciLCJXYXJuQWJvdXRGcmF1ZHVsZW50V2Vic2l0ZXMiLCJ1c2VyU2V0dGluZ1NldCIsInJlc3RyaWN0ZWRCb29sIiwidXBkYXRlTG9jYWxlIiwibGFuZ3VhZ2UiLCJsb2NhbGUiLCJjYWxlbmRhckZvcm1hdCIsImdsb2JhbFByZWZzIiwiZGF0YSIsInN1cHBvcnRlZExhbmdzIiwiQXBwbGVMYW5ndWFnZXMiLCJpbmRleE9mIiwiY29uY2F0Iiwid2l0aG91dCIsImNhbFNwbGl0IiwiY3VyTG9jYWxlQW5kQ2FsIiwiQXBwbGVMb2NhbGUiLCJzcGxpdCIsImN1ckxvYyIsIm5ld0xvY2FsZUFuZENhbCIsInNpemUiLCJzdHViIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3NldHRpbmdzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBwbGlzdCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5cbi8vIHJldHVybnMgcGF0aCB0byBwbGlzdCBiYXNlZCBvbiBpZCBmb3IgcGxpc3QuXG4vLyB0aGVzZSBpZHMgYXJlIGFwcGl1bSB0ZXJtc1xuYXN5bmMgZnVuY3Rpb24gcGxpc3RQYXRocyAoc2ltLCBpZGVudGlmaWVyKSB7XG4gIGxldCBwYXRocyA9IFtdO1xuICBsZXQgc2ltRGlyZWN0b3J5ID0gc2ltLmdldERpcigpO1xuXG4gIHN3aXRjaCAoaWRlbnRpZmllcikge1xuICAgIGNhc2UgJ3dlYkluc3BlY3Rvcic6XG4gICAgICBwYXRocy5wdXNoKHBhdGgucmVzb2x2ZShzaW1EaXJlY3RvcnksICdMaWJyYXJ5JywgJ1ByZWZlcmVuY2VzJywgJ2NvbS5hcHBsZS53ZWJJbnNwZWN0b3IucGxpc3QnKSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdtb2JpbGVTYWZhcmknOlxuICAgICAgcGF0aHMucHVzaChwYXRoLnJlc29sdmUoYXdhaXQgc2ltLmdldEFwcERpcignY29tLmFwcGxlLm1vYmlsZXNhZmFyaScpLCAnTGlicmFyeScsICdQcmVmZXJlbmNlcycsICdjb20uYXBwbGUubW9iaWxlc2FmYXJpLnBsaXN0JykpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZ2xvYmFsTW9iaWxlU2FmYXJpJzpcbiAgICAgIHBhdGhzLnB1c2gocGF0aC5yZXNvbHZlKHNpbURpcmVjdG9yeSwgJ0xpYnJhcnknLCAnUHJlZmVyZW5jZXMnLCAnY29tLmFwcGxlLm1vYmlsZXNhZmFyaS5wbGlzdCcpKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3dlYlVJJzpcbiAgICAgIHBhdGhzLnB1c2gocGF0aC5yZXNvbHZlKHNpbURpcmVjdG9yeSwgJ0xpYnJhcnknLCAnUHJlZmVyZW5jZXMnLCAnY29tLmFwcGxlLldlYlVJLnBsaXN0JykpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnd2ViRm91bmRhdGlvbic6XG4gICAgICBwYXRocy5wdXNoKHBhdGgucmVzb2x2ZShzaW1EaXJlY3RvcnksICdMaWJyYXJ5JywgJ1ByZWZlcmVuY2VzJywgJ2NvbS5hcHBsZS5XZWJGb3VuZGF0aW9uLnBsaXN0JykpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncHJlZmVyZW5jZXMnOlxuICAgICAgcGF0aHMucHVzaChwYXRoLnJlc29sdmUoc2ltRGlyZWN0b3J5LCAnTGlicmFyeScsICdQcmVmZXJlbmNlcycsICdjb20uYXBwbGUuUHJlZmVyZW5jZXMucGxpc3QnKSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdsb2NhdGlvblNlcnZpY2VzJzpcbiAgICAgIHBhdGhzLnB1c2gocGF0aC5yZXNvbHZlKHNpbURpcmVjdG9yeSwgJ0xpYnJhcnknLCAnUHJlZmVyZW5jZXMnLCAnY29tLmFwcGxlLmxvY2F0aW9uZC5wbGlzdCcpKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2xvY2F0aW9uQ2xpZW50cyc6XG4gICAgICBwYXRocy5wdXNoKHBhdGgucmVzb2x2ZShzaW1EaXJlY3RvcnksICdMaWJyYXJ5JywgJ0NhY2hlcycsICdsb2NhdGlvbmQnLCAnY2xpZW50cy5wbGlzdCcpKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2xvY2F0aW9uQ2FjaGUnOlxuICAgICAgcGF0aHMucHVzaChwYXRoLnJlc29sdmUoc2ltRGlyZWN0b3J5LCAnTGlicmFyeScsICdDYWNoZXMnLCAnbG9jYXRpb25kJywgJ2NhY2hlLnBsaXN0JykpO1xuICAgICAgcGF0aHMucHVzaChwYXRoLnJlc29sdmUoc2ltRGlyZWN0b3J5LCAnTGlicmFyeScsICdQcmVmZXJlbmNlcycsICdjb20uYXBwbGUubG9jYXRpb25kLnBsaXN0JykpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndXNlclNldHRpbmdzJzpcbiAgICAgIGlmIChzZW12ZXIubHQoc2VtdmVyLmNvZXJjZShzaW0ueGNvZGVWZXJzaW9uLnZlcnNpb25TdHJpbmcpLCBzZW12ZXIuY29lcmNlKCc3LjMnKSkpIHtcbiAgICAgICAgcGF0aHMucHVzaChwYXRoLnJlc29sdmUoc2ltRGlyZWN0b3J5LCAnTGlicmFyeScsICdDb25maWd1cmF0aW9uUHJvZmlsZXMnLCAnVXNlclNldHRpbmdzLnBsaXN0JykpO1xuICAgICAgICBwYXRocy5wdXNoKHBhdGgucmVzb2x2ZShzaW1EaXJlY3RvcnksICdMaWJyYXJ5JywgJ0NvbmZpZ3VyYXRpb25Qcm9maWxlcycsICdFZmZlY3RpdmVVc2VyU2V0dGluZ3MucGxpc3QnKSk7XG4gICAgICAgIHBhdGhzLnB1c2gocGF0aC5yZXNvbHZlKHNpbURpcmVjdG9yeSwgJ0xpYnJhcnknLCAnQ29uZmlndXJhdGlvblByb2ZpbGVzJywgJ1B1YmxpY0luZm8nLCAnUHVibGljRWZmZWN0aXZlVXNlclNldHRpbmdzLnBsaXN0JykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF0aHMucHVzaChwYXRoLnJlc29sdmUoc2ltRGlyZWN0b3J5LCAnTGlicmFyeScsICdVc2VyQ29uZmlndXJhdGlvblByb2ZpbGVzJywgJ1VzZXJTZXR0aW5ncy5wbGlzdCcpKTtcbiAgICAgICAgcGF0aHMucHVzaChwYXRoLnJlc29sdmUoc2ltRGlyZWN0b3J5LCAnTGlicmFyeScsICdVc2VyQ29uZmlndXJhdGlvblByb2ZpbGVzJywgJ0VmZmVjdGl2ZVVzZXJTZXR0aW5ncy5wbGlzdCcpKTtcbiAgICAgICAgcGF0aHMucHVzaChwYXRoLnJlc29sdmUoc2ltRGlyZWN0b3J5LCAnTGlicmFyeScsICdVc2VyQ29uZmlndXJhdGlvblByb2ZpbGVzJywgJ1B1YmxpY0luZm8nLCAnUHVibGljRWZmZWN0aXZlVXNlclNldHRpbmdzLnBsaXN0JykpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZWZmZWN0aXZlVXNlclNldHRpbmdzJzpcbiAgICAgIHBhdGhzLnB1c2gocGF0aC5yZXNvbHZlKHNpbURpcmVjdG9yeSwgJ0xpYnJhcnknLCAnQ29uZmlndXJhdGlvblByb2ZpbGVzJywgJ0VmZmVjdGl2ZVVzZXJTZXR0aW5ncy5wbGlzdCcpKTtcbiAgICAgIHBhdGhzLnB1c2gocGF0aC5yZXNvbHZlKHNpbURpcmVjdG9yeSwgJ0xpYnJhcnknLCAnQ29uZmlndXJhdGlvblByb2ZpbGVzJywgJ1B1YmxpY0luZm8nLCAnUHVibGljRWZmZWN0aXZlVXNlclNldHRpbmdzLnBsaXN0JykpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYWNjZXNzaWJpbGl0eVNldHRpbmdzJzpcbiAgICAgIHBhdGhzLnB1c2gocGF0aC5yZXNvbHZlKHNpbURpcmVjdG9yeSwgJ0xpYnJhcnknLCAnUHJlZmVyZW5jZXMnLCAnY29tLmFwcGxlLkFjY2Vzc2liaWxpdHkucGxpc3QnKSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd1aVN0eWxlU2V0dGluZ3MnOlxuICAgICAgcGF0aHMucHVzaChwYXRoLnJlc29sdmUoc2ltRGlyZWN0b3J5LCAnTGlicmFyeScsICdQcmVmZXJlbmNlcycsICdjb20uYXBwbGUudWlraXRzZXJ2aWNlcy51c2VySW50ZXJmYWNlU3R5bGVNb2RlLnBsaXN0JykpO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gcGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVNldHRpbmdzIChzaW0sIHBsaXN0LCB1cGRhdGVzKSB7XG4gIHJldHVybiBhd2FpdCBCLnJlZHVjZShhd2FpdCBwbGlzdFBhdGhzKHNpbSwgcGxpc3QpLCBhc3luYyBmdW5jdGlvbiByZWR1Y2VyICh1cGRhdGVkLCBwYXRoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHVwZGF0ZShwYXRoLCB1cGRhdGVzKSB8fCB1cGRhdGVkO1xuICB9LCBmYWxzZSk7XG59XG5cbi8vIHVwZGF0ZSBhIHBsaXN0IGZpbGUsIGxvY2F0ZWQgYXQgcGF0aFRvUGxpc3Rcbi8vIHBhc3MgaW4gYW4gb2JqZWN0LCBhbGwgc2V0dGluZ3Mgc3BlY2lmaWVkIGluIHRoZSBvYmplY3Qgd2lsbCBiZVxuLy8gdXBkYXRlZCBvbiB0aGUgcGxpc3QsIGFsbCBvdGhlcnMgbGVmdCBhcy1pc1xuYXN5bmMgZnVuY3Rpb24gdXBkYXRlIChwYXRoVG9QbGlzdCwgdXBkYXRlcykge1xuICBjb25zdCBjdXJyZW50U2V0dGluZ3MgPSBhd2FpdCByZWFkKHBhdGhUb1BsaXN0KTtcbiAgY29uc3QgbmV3U2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBjdXJyZW50U2V0dGluZ3MsIHVwZGF0ZXMpO1xuXG4gIGlmIChfLmlzRXF1YWwoY3VycmVudFNldHRpbmdzLCBuZXdTZXR0aW5ncykpIHtcbiAgICAvLyBubyBzZXR0aW5nIGNoYW5nZXMsIHNvIGRvIG5vdGhpbmdcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBhd2FpdCBwbGlzdC51cGRhdGVQbGlzdEZpbGUocGF0aFRvUGxpc3QsIG5ld1NldHRpbmdzLCB0cnVlLCBmYWxzZSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkU2V0dGluZ3MgKHNpbSwgcGxpc3QpIHtcbiAgbGV0IHNldHRpbmdzID0ge307XG4gIGZvciAobGV0IHBhdGggb2YgYXdhaXQgcGxpc3RQYXRocyhzaW0sIHBsaXN0KSkge1xuICAgIHNldHRpbmdzW3BhdGhdID0gYXdhaXQgcmVhZChwYXRoKTtcbiAgfVxuICByZXR1cm4gc2V0dGluZ3M7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWQgKHBhdGhUb1BsaXN0KSB7XG4gIHJldHVybiBhd2FpdCBwbGlzdC5wYXJzZVBsaXN0RmlsZShwYXRoVG9QbGlzdCwgZmFsc2UpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVMb2NhdGlvblNldHRpbmdzIChzaW0sIGJ1bmRsZUlkLCBhdXRob3JpemVkKSB7XG4gIC8vIHVwZGF0ZSBsb2NhdGlvbiBjYWNoZVxuICBjb25zdCBuZXdDYWNoZVByZWZzID0ge1xuICAgIExhc3RGZW5jZUFjdGl2aXR5VGltZXN0YW1wOiA0MTIxMjIxMDMuMjMyOTgzLFxuICAgIENsZWFuU2h1dGRvd246IHRydWVcbiAgfTtcbiAgbGV0IHVwZGF0ZWQgPSBhd2FpdCB1cGRhdGVTZXR0aW5ncyhzaW0sICdsb2NhdGlvbkNhY2hlJywge1tidW5kbGVJZF06IG5ld0NhY2hlUHJlZnN9KTtcblxuICAvLyB1cGRhdGUgbG9jYXRpb24gY2xpZW50c1xuICBjb25zdCBuZXdDbGllbnRQcmVmcyA9IHtcbiAgICBCdW5kbGVJZDogYnVuZGxlSWQsXG4gICAgQXV0aG9yaXplZDogISFhdXRob3JpemVkLFxuICAgIFdoaXRlbGlzdGVkOiBmYWxzZSxcbiAgfTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IHBsaXN0UGF0aHMoc2ltLCAnbG9jYXRpb25DbGllbnRzJykpIHtcbiAgICBsb2cuZGVidWcoYFVwZGF0aW5nIGxvY2F0aW9uIGNsaWVudCBmaWxlOiAke2ZpbGV9YCk7XG5cbiAgICBsZXQgdXBkYXRlcyA9IHt9O1xuXG4gICAgLy8gc2VlIGlmIHRoZSBidW5kbGUgaXMgYWxyZWFkeSB0aGVyZVxuICAgIGNvbnN0IHBsaXN0ID0gYXdhaXQgcmVhZChmaWxlKTtcblxuICAgIC8vIHJhbmRvbSBkYXRhIHRoYXQgYWx3YXlzIHNlZW1zIHRvIGJlIGluIHRoZSBjbGllbnRzLnBsaXN0XG4gICAgY29uc3Qgd2VpcmRMb2NLZXkgPSAnY29tLmFwcGxlLmxvY2F0aW9uZC5idW5kbGUtL1N5c3RlbS9MaWJyYXJ5LycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1ByaXZhdGVGcmFtZXdvcmtzL0FPU05vdGlmaWNhdGlvbi5mcmFtZXdvcmsnO1xuICAgIGlmICghXy5oYXMocGxpc3QsIHdlaXJkTG9jS2V5KSkge1xuICAgICAgdXBkYXRlc1t3ZWlyZExvY0tleV0gPSB7XG4gICAgICAgIEJ1bmRsZVBhdGg6ICcvU3lzdGVtL0xpYnJhcnkvUHJpdmF0ZUZyYW1ld29ya3MvQU9TTm90aWZpY2F0aW9uLmZyYW1ld29yaycsXG4gICAgICAgIFdoaXRlbGlzdGVkOiBmYWxzZSxcbiAgICAgICAgRXhlY3V0YWJsZTogJycsXG4gICAgICAgIFJlZ2lzdGVyZWQ6ICcnXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSB0aGUgdXBkYXRlLCBhbmQgbWFrZSBzdXJlIGl0IGhhcyBzZW5zaWJsZSB2YWx1ZXNcbiAgICBjb25zdCBiYXNlU2V0dGluZyA9IF8uaGFzKHBsaXN0LCBidW5kbGVJZCkgPyBwbGlzdFtidW5kbGVJZF0gOiB7fTtcbiAgICB1cGRhdGVzW2J1bmRsZUlkXSA9IF8uZGVmYXVsdHMobmV3Q2xpZW50UHJlZnMsIGJhc2VTZXR0aW5nKTtcbiAgICB1cGRhdGVzW2J1bmRsZUlkXS5FeGVjdXRhYmxlID0gdXBkYXRlc1tidW5kbGVJZF0uRXhlY3V0YWJsZSB8fCAnJztcbiAgICB1cGRhdGVzW2J1bmRsZUlkXS5SZWdpc3RlcmVkID0gdXBkYXRlc1tidW5kbGVJZF0uUmVnaXN0ZXJlZCB8fCAnJztcblxuICAgIHVwZGF0ZWQgPSBhd2FpdCB1cGRhdGUoZmlsZSwgdXBkYXRlcykgfHwgdXBkYXRlZDtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXRSZWR1Y2VNb3Rpb24gKHNpbSwgcmVkdWNlTW90aW9uID0gdHJ1ZSkge1xuICBsb2cuZGVidWcoYFVwZGF0aW5nIHJlZHVjZSBtb3Rpb24uIFNldHRpbmcgdG8gJHtyZWR1Y2VNb3Rpb259LmApO1xuICBjb25zdCBwYXRocyA9IGF3YWl0IHBsaXN0UGF0aHMoc2ltLCAnYWNjZXNzaWJpbGl0eVNldHRpbmdzJyk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBwYXRocykge1xuICAgIGF3YWl0IHVwZGF0ZShmaWxlLCB7XG4gICAgICBSZWR1Y2VNb3Rpb25FbmFibGVkOiByZWR1Y2VNb3Rpb24gPyAxIDogMFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVNhZmFyaUdsb2JhbFNldHRpbmdzIChzaW0sIHNldHRpbmdTZXQpIHtcbiAgbG9nLmRlYnVnKCdVcGRhdGluZyBTYWZhcmkgZ2xvYmFsIHNldHRpbmdzJyk7XG5cbiAgbGV0IHVwZGF0ZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBbZmlsZSwgc2FmYXJpU2V0dGluZ1NldF0gb2YgXy50b1BhaXJzKGF3YWl0IHJlYWRTZXR0aW5ncyhzaW0sICdnbG9iYWxNb2JpbGVTYWZhcmknKSkpIHtcbiAgICBsZXQgbmV3U2V0dGluZ3MgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBfLnRvUGFpcnMoc2V0dGluZ1NldCkpIHtcbiAgICAgIGlmIChzYWZhcmlTZXR0aW5nU2V0W2tleV0gIT09IHZhbHVlKSB7XG4gICAgICAgIG5ld1NldHRpbmdzW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKF8uaXNFbXB0eShuZXdTZXR0aW5ncykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHVwZGF0ZWQgPSBhd2FpdCB1cGRhdGUoZmlsZSwgbmV3U2V0dGluZ3MpIHx8IHVwZGF0ZWQ7XG4gIH1cbiAgcmV0dXJuIHVwZGF0ZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVNhZmFyaVVzZXJTZXR0aW5ncyAoc2ltLCBzZXR0aW5nU2V0KSB7XG4gIGxvZy5kZWJ1ZygnVXBkYXRpbmcgU2FmYXJpIHVzZXIgc2V0dGluZ3MnKTtcblxuICAvLyBhZGQgZXh0cmEgc3R1ZmYgdG8gVXNlclNldHRpbmdzLnBsaXN0IGFuZCBFZmZlY3RpdmVVc2VyU2V0dGluZ3MucGxpc3RcbiAgbGV0IG5ld1VzZXJTZXR0aW5ncyA9IHt9O1xuICBpZiAoXy5oYXMoc2V0dGluZ1NldCwgJ1dlYktpdEphdmFTY3JpcHRFbmFibGVkJykpIHtcbiAgICBuZXdVc2VyU2V0dGluZ3Muc2FmYXJpQWxsb3dKYXZhU2NyaXB0ID0gc2V0dGluZ1NldC5XZWJLaXRKYXZhU2NyaXB0RW5hYmxlZDtcbiAgfVxuICBpZiAoXy5oYXMoc2V0dGluZ1NldCwgJ1dlYktpdEphdmFTY3JpcHRDYW5PcGVuV2luZG93c0F1dG9tYXRpY2FsbHknKSkge1xuICAgIG5ld1VzZXJTZXR0aW5ncy5zYWZhcmlBbGxvd1BvcHVwcyA9IHNldHRpbmdTZXQuV2ViS2l0SmF2YVNjcmlwdENhbk9wZW5XaW5kb3dzQXV0b21hdGljYWxseTtcbiAgfVxuICBpZiAoXy5oYXMoc2V0dGluZ1NldCwgJ1dhcm5BYm91dEZyYXVkdWxlbnRXZWJzaXRlcycpKSB7XG4gICAgbmV3VXNlclNldHRpbmdzLnNhZmFyaUZvcmNlRnJhdWRXYXJuaW5nID0gIXNldHRpbmdTZXQuV2FybkFib3V0RnJhdWR1bGVudFdlYnNpdGVzO1xuICB9XG5cbiAgaWYgKF8uaXNFbXB0eShuZXdVc2VyU2V0dGluZ3MpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IHVwZGF0ZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBbZmlsZSwgdXNlclNldHRpbmdTZXRdIG9mIF8udG9QYWlycyhhd2FpdCByZWFkU2V0dGluZ3Moc2ltLCAndXNlclNldHRpbmdzJykpKSB7XG4gICAgLy8gdGhlIHVzZXIgc2V0dGluZ3MgcGxpc3QgaGFzIHR3byBidWNrZXRzLCBvbmUgZm9yXG4gICAgLy8gYm9vbGVhbiBzZXR0aW5ncyAoYHJlc3RyaWN0ZWRCb29sYCkgYW5kIG9uZSBmb3JcbiAgICAvLyBvdGhlciB2YWx1ZSBzZXR0aW5ncyAoYHJlc3RyaWN0ZWRWYWx1ZWApLiBJbiBlYWNoLCB0aGUgdmFsdWVcbiAgICAvLyBpcyBpbiBhIGB2YWx1ZWAgc3ViLWZpZWxkLlxuICAgIGlmICghXy5oYXModXNlclNldHRpbmdTZXQsICdyZXN0cmljdGVkQm9vbCcpKSB7XG4gICAgICB1c2VyU2V0dGluZ1NldC5yZXN0cmljdGVkQm9vbCA9IHt9O1xuICAgIH1cbiAgICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgXy50b1BhaXJzKG5ld1VzZXJTZXR0aW5ncykpIHtcbiAgICAgIHVzZXJTZXR0aW5nU2V0LnJlc3RyaWN0ZWRCb29sW2tleV0gPSB7dmFsdWV9O1xuICAgIH1cblxuICAgIC8vIGFjdHVhbGx5IGRvIHRoZSB1cGRhdGVcbiAgICB1cGRhdGVkID0gYXdhaXQgdXBkYXRlKGZpbGUsIHVzZXJTZXR0aW5nU2V0KSB8fCB1cGRhdGVkO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUxvY2FsZSAoc2ltLCBsYW5ndWFnZSwgbG9jYWxlLCBjYWxlbmRhckZvcm1hdCkge1xuICBsZXQgZ2xvYmFsUHJlZnMgPSBwYXRoLnJlc29sdmUoc2ltLmdldERpcigpLCAnTGlicmFyeScsICdQcmVmZXJlbmNlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLkdsb2JhbFByZWZlcmVuY2VzLnBsaXN0Jyk7XG5cbiAgLy8gZ2V0IHRoZSBjdXJyZW50IGRhdGFcbiAgbGV0IGRhdGEgPSBhd2FpdCByZWFkKGdsb2JhbFByZWZzKTtcbiAgbGV0IHVwZGF0ZXMgPSB7fTtcblxuICAvLyBpZiB3ZSBhcmUgc2V0dGluZyB0aGUgbGFuZ3VhZ2UsIGFkZCBpdCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0IG9mIGxhbmd1YWdlc1xuICBpZiAobGFuZ3VhZ2UpIHtcbiAgICBsb2cuZGVidWcoYE5ldyBsYW5ndWFnZTogJHtsYW5ndWFnZX1gKTtcbiAgICBsZXQgc3VwcG9ydGVkTGFuZ3MgPSBkYXRhLkFwcGxlTGFuZ3VhZ2VzIHx8IFtdO1xuICAgIC8vIGlmIHRoZSBsYW5ndWFnZSBpcyBmaXJzdCwgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZ1xuICAgIGlmIChzdXBwb3J0ZWRMYW5ncy5pbmRleE9mKGxhbmd1YWdlKSAhPT0gMCkge1xuICAgICAgdXBkYXRlcy5BcHBsZUxhbmd1YWdlcyA9IFtsYW5ndWFnZV0uY29uY2F0KF8ud2l0aG91dChzdXBwb3J0ZWRMYW5ncywgbGFuZ3VhZ2UpKTtcbiAgICB9XG4gIH1cbiAgLy8gaWYgd2UgYXJlIHNldHRpbmcgdGhlIGxvY2FsZSBvciBjYWxlbmRhciBmb3JtYXQsIHNldCB0aGVtIGFzIGFwcHJvcHJpYXRlXG4gIGlmIChsb2NhbGUgfHwgY2FsZW5kYXJGb3JtYXQpIHtcbiAgICBsZXQgY2FsU3BsaXQgPSAnQGNhbGVuZGFyPSc7XG4gICAgbGV0IGN1ckxvY2FsZUFuZENhbCA9IGRhdGEuQXBwbGVMb2NhbGUgfHwgbGFuZ3VhZ2UgfHwgJ2VuJztcblxuICAgIGxldCBzcGxpdCA9IGN1ckxvY2FsZUFuZENhbC5zcGxpdChjYWxTcGxpdCk7XG4gICAgbGV0IGN1ckxvYyA9IHNwbGl0WzBdO1xuICAgIGlmIChjYWxlbmRhckZvcm1hdCB8fCBzcGxpdFsxXSkge1xuICAgICAgY2FsZW5kYXJGb3JtYXQgPSBgJHtjYWxTcGxpdH0ke2NhbGVuZGFyRm9ybWF0IHx8IHNwbGl0WzFdIHx8ICcnfWA7XG4gICAgfVxuICAgIGNhbGVuZGFyRm9ybWF0ID0gY2FsZW5kYXJGb3JtYXQgfHwgJyc7XG4gICAgbGV0IG5ld0xvY2FsZUFuZENhbCA9IGxvY2FsZSA/IGxvY2FsZSA6IGN1ckxvYztcbiAgICBpZiAoY2FsZW5kYXJGb3JtYXQpIHtcbiAgICAgIG5ld0xvY2FsZUFuZENhbCA9IGAke25ld0xvY2FsZUFuZENhbH0ke2NhbGVuZGFyRm9ybWF0fWA7XG4gICAgfVxuICAgIC8vIG9ubHkgbmVlZCB0byB1cGRhdGUgaWYgaXQgaGFzIGNoYW5nZWRcbiAgICBpZiAobmV3TG9jYWxlQW5kQ2FsICE9PSBjdXJMb2NhbGVBbmRDYWwpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgTmV3IGxvY2FsZTogJHtuZXdMb2NhbGVBbmRDYWx9YCk7XG4gICAgICB1cGRhdGVzLkFwcGxlTG9jYWxlID0gbmV3TG9jYWxlQW5kQ2FsO1xuICAgIH1cbiAgfVxuXG4gIGlmIChfLnNpemUodXBkYXRlcykgPT09IDApIHtcbiAgICBsb2cuZGVidWcoJ05vIGxvY2FsZSB1cGRhdGVzIG5lY2Vzc2FyeS4nKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsb2cuZGVidWcoJ1dyaXRpbmcgbmV3IGxvY2FsZSBwbGlzdCBkYXRhJyk7XG4gIGF3YWl0IHVwZGF0ZShnbG9iYWxQcmVmcywgdXBkYXRlcyk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdHViICgpIHtcbiAgcmV0dXJuIGF3YWl0IHBsaXN0UGF0aHM7XG59XG5cbmV4cG9ydCB7XG4gIHVwZGF0ZSwgdXBkYXRlU2V0dGluZ3MsIHVwZGF0ZUxvY2F0aW9uU2V0dGluZ3MsIHNldFJlZHVjZU1vdGlvbixcbiAgdXBkYXRlU2FmYXJpVXNlclNldHRpbmdzLCB1cGRhdGVTYWZhcmlHbG9iYWxTZXR0aW5ncywgdXBkYXRlTG9jYWxlLCByZWFkLFxuICByZWFkU2V0dGluZ3MsIHN0dWIsXG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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
245
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQTElTVF9JREVOVElGSUVSIiwiT2JqZWN0IiwiZnJlZXplIiwiV0VCX0lOU1BFQ1RPUiIsIk1PQklMRV9TQUZBUkkiLCJHTE9CQUxfTU9CSUxFX1NBRkFSSSIsIldFQl9VSSIsIldFQl9GT1VOREFUSU9OIiwiUFJFRkVSRU5DRVMiLCJHTE9CQUxfUFJFRkVSRU5DRVMiLCJMT0NBVElPTl9TRVJWSUNFUyIsIkxPQ0FUSU9OX0NMSUVOVFMiLCJMT0NBVElPTl9DQUNIRSIsIlVTRVJfU0VUVElOR1MiLCJFRkZFQ1RJVkVfVVNFUl9TRVRUSU5HUyIsIkFDQ0VTU0lCTElUWV9TRVRUSU5HUyIsIlVJX1NUWUxFX1NFVFRJTkdTIiwicGxpc3RQYXRocyIsInNpbSIsImlkZW50aWZpZXIiLCJzaW1EaXJlY3RvcnkiLCJnZXREaXIiLCJwYXRoIiwicmVzb2x2ZSIsImdldEFwcERpciIsIm1hcCIsIngiLCJwcm9maWxlc0Rpck5hbWUiLCJzZW12ZXIiLCJsdCIsImNvZXJjZSIsInhjb2RlVmVyc2lvbiIsInZlcnNpb25TdHJpbmciLCJ1cGRhdGVTZXR0aW5ncyIsInBsaXN0IiwidXBkYXRlcyIsInBhdGhzIiwiXyIsImlzRW1wdHkiLCJyZXN1bHRzIiwiQiIsImFsbCIsInAiLCJ1cGRhdGUiLCJzb21lIiwiQm9vbGVhbiIsInBhdGhUb1BsaXN0IiwiY3VycmVudFNldHRpbmdzIiwicmVhZCIsIm5ld1NldHRpbmdzIiwiYXNzaWduIiwiaXNFcXVhbCIsInVwZGF0ZVBsaXN0RmlsZSIsInJlYWRTZXR0aW5ncyIsInNldHRpbmdzIiwiZnJvbVBhaXJzIiwiemlwIiwicGFyc2VQbGlzdEZpbGUiLCJ1cGRhdGVMb2NhdGlvblNldHRpbmdzIiwiYnVuZGxlSWQiLCJhdXRob3JpemVkIiwibmV3Q2FjaGVQcmVmcyIsIkxhc3RGZW5jZUFjdGl2aXR5VGltZXN0YW1wIiwiQ2xlYW5TaHV0ZG93biIsInVwZGF0ZWQiLCJuZXdDbGllbnRQcmVmcyIsIkJ1bmRsZUlkIiwiQXV0aG9yaXplZCIsIldoaXRlbGlzdGVkIiwiY29udGVudHMiLCJwcm9taXNlcyIsImZpbGUiLCJjb250ZW50IiwibG9nIiwiZGVidWciLCJ3ZWlyZExvY0tleSIsImhhcyIsIkJ1bmRsZVBhdGgiLCJFeGVjdXRhYmxlIiwiUmVnaXN0ZXJlZCIsImJhc2VTZXR0aW5nIiwiZGVmYXVsdHMiLCJwdXNoIiwic2V0UmVkdWNlTW90aW9uIiwicmVkdWNlTW90aW9uIiwiUmVkdWNlTW90aW9uRW5hYmxlZCIsInNldFJlZHVjZVRyYW5zcGFyZW5jeSIsInJlZHVjZVRyYW5zcGFyZW5jeSIsIkVuaGFuY2VkQmFja2dyb3VuZENvbnRyYXN0RW5hYmxlZCIsInVwZGF0ZVNhZmFyaUdsb2JhbFNldHRpbmdzIiwic2V0dGluZ1NldCIsInNhZmFyaVNldHRpbmdTZXQiLCJ0b1BhaXJzIiwia2V5IiwidmFsdWUiLCJ1cGRhdGVTYWZhcmlVc2VyU2V0dGluZ3MiLCJuZXdVc2VyU2V0dGluZ3MiLCJzYWZhcmlBbGxvd0phdmFTY3JpcHQiLCJXZWJLaXRKYXZhU2NyaXB0RW5hYmxlZCIsInNhZmFyaUFsbG93UG9wdXBzIiwiV2ViS2l0SmF2YVNjcmlwdENhbk9wZW5XaW5kb3dzQXV0b21hdGljYWxseSIsInNhZmFyaUZvcmNlRnJhdWRXYXJuaW5nIiwiV2FybkFib3V0RnJhdWR1bGVudFdlYnNpdGVzIiwidXNlclNldHRpbmdTZXQiLCJyZXN0cmljdGVkQm9vbCIsInVwZGF0ZUxvY2FsZSIsImxhbmd1YWdlIiwibG9jYWxlIiwiY2FsZW5kYXJGb3JtYXQiLCJnbG9iYWxQcmVmcyIsIkVycm9yIiwiZGF0YSIsInN1cHBvcnRlZExhbmdzIiwiQXBwbGVMYW5ndWFnZXMiLCJpbmRleE9mIiwiY29uY2F0Iiwid2l0aG91dCIsImNhbFNwbGl0IiwiY3VyTG9jYWxlQW5kQ2FsIiwiQXBwbGVMb2NhbGUiLCJzcGxpdCIsImN1ckxvYyIsIm5ld0xvY2FsZUFuZENhbCIsInNpemUiXSwic291cmNlcyI6WyIuLi8uLi9saWIvc2V0dGluZ3MuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHBsaXN0IH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5cbmNvbnN0IFBMSVNUX0lERU5USUZJRVIgPSBPYmplY3QuZnJlZXplKHtcbiAgV0VCX0lOU1BFQ1RPUjogJ3dlYkluc3BlY3RvcicsXG4gIE1PQklMRV9TQUZBUkk6ICdtb2JpbGVTYWZhcmknLFxuICBHTE9CQUxfTU9CSUxFX1NBRkFSSTogJ2dsb2JhbE1vYmlsZVNhZmFyaScsXG4gIFdFQl9VSTogJ3dlYlVJJyxcbiAgV0VCX0ZPVU5EQVRJT046ICd3ZWJGb3VuZGF0aW9uJyxcbiAgUFJFRkVSRU5DRVM6ICdwcmVmZXJlbmNlcycsXG4gIEdMT0JBTF9QUkVGRVJFTkNFUzogJ2dsb2JhbFByZWZlcmVuY2VzJyxcbiAgTE9DQVRJT05fU0VSVklDRVM6ICdsb2NhdGlvblNlcnZpY2VzJyxcbiAgTE9DQVRJT05fQ0xJRU5UUzogJ2xvY2F0aW9uQ2xpZW50cycsXG4gIExPQ0FUSU9OX0NBQ0hFOiAnbG9jYXRpb25DYWNoZScsXG4gIFVTRVJfU0VUVElOR1M6ICd1c2VyU2V0dGluZ3MnLFxuICBFRkZFQ1RJVkVfVVNFUl9TRVRUSU5HUzogJ2VmZmVjdGl2ZVVzZXJTZXR0aW5ncycsXG4gIEFDQ0VTU0lCTElUWV9TRVRUSU5HUzogJ2FjY2Vzc2liaWxpdHlTZXR0aW5ncycsXG4gIFVJX1NUWUxFX1NFVFRJTkdTOiAndWlTdHlsZVNldHRpbmdzJyxcbn0pO1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBtYXRjaGluZyBkaXJlY3RvcnkgcGF0aHMgZm9yIHRoZSBnaXZlbiBpZGVudGlmaWVyXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHNpbSBTaW11bGF0b3IgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBpZGVudGlmaWVyIE9uZSBvZiBzdXBwb3J0ZWQgcGF0aCBpZGVudGlmaWVyc1xuICogQHJldHVybnMge3N0cmluZ1tdfSBUaGUgbGlzdCBvZiBtYXRjaGVkIHBhdGhzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBsaXN0UGF0aHMgKHNpbSwgaWRlbnRpZmllcikge1xuICBjb25zdCBzaW1EaXJlY3RvcnkgPSBzaW0uZ2V0RGlyKCk7XG5cbiAgc3dpdGNoIChpZGVudGlmaWVyKSB7XG4gICAgY2FzZSBQTElTVF9JREVOVElGSUVSLldFQl9JTlNQRUNUT1I6XG4gICAgICByZXR1cm4gW3BhdGgucmVzb2x2ZShzaW1EaXJlY3RvcnksICdMaWJyYXJ5JywgJ1ByZWZlcmVuY2VzJywgJ2NvbS5hcHBsZS53ZWJJbnNwZWN0b3IucGxpc3QnKV07XG4gICAgY2FzZSBQTElTVF9JREVOVElGSUVSLk1PQklMRV9TQUZBUkk6XG4gICAgICByZXR1cm4gW1xuICAgICAgICBwYXRoLnJlc29sdmUoYXdhaXQgc2ltLmdldEFwcERpcignY29tLmFwcGxlLm1vYmlsZXNhZmFyaScpLCAnTGlicmFyeScsICdQcmVmZXJlbmNlcycsICdjb20uYXBwbGUubW9iaWxlc2FmYXJpLnBsaXN0JylcbiAgICAgIF07XG4gICAgY2FzZSBQTElTVF9JREVOVElGSUVSLkdMT0JBTF9NT0JJTEVfU0FGQVJJOlxuICAgICAgcmV0dXJuIFtwYXRoLnJlc29sdmUoc2ltRGlyZWN0b3J5LCAnTGlicmFyeScsICdQcmVmZXJlbmNlcycsICdjb20uYXBwbGUubW9iaWxlc2FmYXJpLnBsaXN0JyldO1xuICAgIGNhc2UgUExJU1RfSURFTlRJRklFUi5XRUJfVUk6XG4gICAgICByZXR1cm4gW3BhdGgucmVzb2x2ZShzaW1EaXJlY3RvcnksICdMaWJyYXJ5JywgJ1ByZWZlcmVuY2VzJywgJ2NvbS5hcHBsZS5XZWJVSS5wbGlzdCcpXTtcbiAgICBjYXNlIFBMSVNUX0lERU5USUZJRVIuV0VCX0ZPVU5EQVRJT046XG4gICAgICByZXR1cm4gW3BhdGgucmVzb2x2ZShzaW1EaXJlY3RvcnksICdMaWJyYXJ5JywgJ1ByZWZlcmVuY2VzJywgJ2NvbS5hcHBsZS5XZWJGb3VuZGF0aW9uLnBsaXN0JyldO1xuICAgIGNhc2UgUExJU1RfSURFTlRJRklFUi5QUkVGRVJFTkNFUzpcbiAgICAgIHJldHVybiBbcGF0aC5yZXNvbHZlKHNpbURpcmVjdG9yeSwgJ0xpYnJhcnknLCAnUHJlZmVyZW5jZXMnLCAnY29tLmFwcGxlLlByZWZlcmVuY2VzLnBsaXN0JyldO1xuICAgIGNhc2UgUExJU1RfSURFTlRJRklFUi5HTE9CQUxfUFJFRkVSRU5DRVM6XG4gICAgICByZXR1cm4gW3BhdGgucmVzb2x2ZShzaW1EaXJlY3RvcnksICdMaWJyYXJ5JywgJ1ByZWZlcmVuY2VzJywgJy5HbG9iYWxQcmVmZXJlbmNlcy5wbGlzdCcpXTtcbiAgICBjYXNlIFBMSVNUX0lERU5USUZJRVIuTE9DQVRJT05fU0VSVklDRVM6XG4gICAgICByZXR1cm4gW3BhdGgucmVzb2x2ZShzaW1EaXJlY3RvcnksICdMaWJyYXJ5JywgJ1ByZWZlcmVuY2VzJywgJ2NvbS5hcHBsZS5sb2NhdGlvbmQucGxpc3QnKV07XG4gICAgY2FzZSBQTElTVF9JREVOVElGSUVSLkxPQ0FUSU9OX0NMSUVOVFM6XG4gICAgICByZXR1cm4gW3BhdGgucmVzb2x2ZShzaW1EaXJlY3RvcnksICdMaWJyYXJ5JywgJ0NhY2hlcycsICdsb2NhdGlvbmQnLCAnY2xpZW50cy5wbGlzdCcpXTtcbiAgICBjYXNlIFBMSVNUX0lERU5USUZJRVIuTE9DQVRJT05fQ0FDSEU6XG4gICAgICByZXR1cm4gW1xuICAgICAgICBbJ0NhY2hlcycsICdsb2NhdGlvbmQnLCAnY2FjaGUucGxpc3QnXSxcbiAgICAgICAgWydQcmVmZXJlbmNlcycsICdjb20uYXBwbGUubG9jYXRpb25kLnBsaXN0J11cbiAgICAgIF0ubWFwKCh4KSA9PiBwYXRoLnJlc29sdmUoc2ltRGlyZWN0b3J5LCAnTGlicmFyeScsIC4uLngpKTtcbiAgICBjYXNlIFBMSVNUX0lERU5USUZJRVIuVVNFUl9TRVRUSU5HUzoge1xuICAgICAgY29uc3QgcHJvZmlsZXNEaXJOYW1lID0gc2VtdmVyLmx0KHNlbXZlci5jb2VyY2Uoc2ltLnhjb2RlVmVyc2lvbi52ZXJzaW9uU3RyaW5nKSwgc2VtdmVyLmNvZXJjZSgnNy4zJykpXG4gICAgICAgID8gJ0NvbmZpZ3VyYXRpb25Qcm9maWxlcydcbiAgICAgICAgOiAnVXNlckNvbmZpZ3VyYXRpb25Qcm9maWxlcyc7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBbJ1VzZXJTZXR0aW5ncy5wbGlzdCddLFxuICAgICAgICBbJ0VmZmVjdGl2ZVVzZXJTZXR0aW5ncy5wbGlzdCddLFxuICAgICAgICBbJ1B1YmxpY0luZm8nLCAnUHVibGljRWZmZWN0aXZlVXNlclNldHRpbmdzLnBsaXN0J10sXG4gICAgICBdLm1hcCgoeCkgPT4gcGF0aC5yZXNvbHZlKHNpbURpcmVjdG9yeSwgJ0xpYnJhcnknLCBwcm9maWxlc0Rpck5hbWUsIC4uLngpKTtcbiAgICB9XG4gICAgY2FzZSBQTElTVF9JREVOVElGSUVSLkVGRkVDVElWRV9VU0VSX1NFVFRJTkdTOlxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgWydFZmZlY3RpdmVVc2VyU2V0dGluZ3MucGxpc3QnXSxcbiAgICAgICAgWydQdWJsaWNJbmZvJywgJ1B1YmxpY0VmZmVjdGl2ZVVzZXJTZXR0aW5ncy5wbGlzdCddXG4gICAgICBdLm1hcCgoeCkgPT4gcGF0aC5yZXNvbHZlKHNpbURpcmVjdG9yeSwgJ0xpYnJhcnknLCAnQ29uZmlndXJhdGlvblByb2ZpbGVzJywgLi4ueCkpO1xuICAgIGNhc2UgUExJU1RfSURFTlRJRklFUi5BQ0NFU1NJQkxJVFlfU0VUVElOR1M6XG4gICAgICByZXR1cm4gW3BhdGgucmVzb2x2ZShzaW1EaXJlY3RvcnksICdMaWJyYXJ5JywgJ1ByZWZlcmVuY2VzJywgJ2NvbS5hcHBsZS5BY2Nlc3NpYmlsaXR5LnBsaXN0JyldO1xuICAgIGNhc2UgUExJU1RfSURFTlRJRklFUi5VSV9TVFlMRV9TRVRUSU5HUzpcbiAgICAgIHJldHVybiBbcGF0aC5yZXNvbHZlKHNpbURpcmVjdG9yeSwgJ0xpYnJhcnknLCAnUHJlZmVyZW5jZXMnLCAnY29tLmFwcGxlLnVpa2l0c2VydmljZXMudXNlckludGVyZmFjZVN0eWxlTW9kZS5wbGlzdCcpXTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbi8qKlxuICogVXBkYXRlcyBwbGlzdCBmaWxlcyB3aXRoIHRoZSBnaXZlbiBQTElTVF9JREVOVElGSUVSXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHNpbSBTaW11bGF0b3IgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBwbGlzdCBPbmUgb2YgUExJU1RfSURFTlRJRklFUiBjb25zdGFudHNcbiAqIEBwYXJhbSB7b2JqZWN0fSB1cGRhdGVzIFBsaXN0IHVwZGF0ZXMgdG8gYXBwbHlcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGF0IGxlYXN0IG9uZSAucGxpc3QgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVNldHRpbmdzIChzaW0sIHBsaXN0LCB1cGRhdGVzKSB7XG4gIGNvbnN0IHBhdGhzID0gYXdhaXQgcGxpc3RQYXRocyhzaW0sIHBsaXN0KTtcbiAgaWYgKF8uaXNFbXB0eShwYXRocykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IEIuYWxsKHBhdGhzLm1hcCgocCkgPT4gdXBkYXRlKHAsIHVwZGF0ZXMpKSk7XG4gIHJldHVybiBfLnNvbWUocmVzdWx0cywgQm9vbGVhbik7XG59XG5cbi8qKlxuICogVXBkYXRlIGEgcGxpc3QgZmlsZSwgbG9jYXRlZCBhdCBwYXRoVG9QbGlzdFxuICogcGFzcyBpbiBhbiBvYmplY3QsIGFsbCBzZXR0aW5ncyBzcGVjaWZpZWQgaW4gdGhlIG9iamVjdCB3aWxsIGJlXG4gKiB1cGRhdGVkIG9uIHRoZSBwbGlzdCwgYWxsIG90aGVycyBsZWZ0IGFzLWlzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhUb1BsaXN0IFRoZSBmdWxsIHBhdGggdG8gLnBsaXN0IGZpbGVcbiAqIEBwYXJhbSB7b2JqZWN0fSB1cGRhdGVzIEFjdHVhbCB1cGRhdGVzIG9iamVjdCB0byBhcHBseVxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdXBkYXRlcyB3ZXJlIGFwcGxpZWQgYW5kIGNoYW5nZWQgdGhlIGFjdHVhbCBwbGlzdFxuICovXG5hc3luYyBmdW5jdGlvbiB1cGRhdGUgKHBhdGhUb1BsaXN0LCB1cGRhdGVzKSB7XG4gIGNvbnN0IGN1cnJlbnRTZXR0aW5ncyA9IGF3YWl0IHJlYWQocGF0aFRvUGxpc3QpO1xuICBjb25zdCBuZXdTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIGN1cnJlbnRTZXR0aW5ncywgdXBkYXRlcyk7XG5cbiAgaWYgKF8uaXNFcXVhbChjdXJyZW50U2V0dGluZ3MsIG5ld1NldHRpbmdzKSkge1xuICAgIC8vIG5vIHNldHRpbmcgY2hhbmdlcywgc28gZG8gbm90aGluZ1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGF3YWl0IHBsaXN0LnVwZGF0ZVBsaXN0RmlsZShwYXRoVG9QbGlzdCwgbmV3U2V0dGluZ3MsIHRydWUsIGZhbHNlKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gLnBsaXN0IGZpbGVzXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHNpbSBTaW11bGF0b3IgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBwbGlzdCBPbmUgb2YgUExJU1RfSURFTlRJRklFUiBjb25zdGFudHNcbiAqIEByZXR1cm5zIHtvYmplY3R9IE1hcHBpbmcgd2hlcmUga2V5cyBhcmUgZmlsZSBwYXRocyBhbmQgdmFsdWVzIGFyZSB0aGVpciBjb250ZW50c1xuICovXG5hc3luYyBmdW5jdGlvbiByZWFkU2V0dGluZ3MgKHNpbSwgcGxpc3QpIHtcbiAgY29uc3QgcGF0aHMgPSBhd2FpdCBwbGlzdFBhdGhzKHNpbSwgcGxpc3QpO1xuICBpZiAoXy5pc0VtcHR5KHBhdGhzKSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBjb25zdCBzZXR0aW5ncyA9IGF3YWl0IEIuYWxsKHBhdGhzLm1hcChyZWFkKSk7XG4gIHJldHVybiBfLmZyb21QYWlycyhfLnppcChwYXRocywgc2V0dGluZ3MpKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgZGF0YSBmcm9tIHRoZSBnaXZlbiAucGxpc3QgZmlsZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoVG9QbGlzdCBGdWxsIHBhdGggdG8gYSAuc3BsaXN0IGZpbGVcbiAqIEByZXR1cm5zIHsqfSBQbGlzdCBjb250ZW50XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWQgKHBhdGhUb1BsaXN0KSB7XG4gIHJldHVybiBhd2FpdCBwbGlzdC5wYXJzZVBsaXN0RmlsZShwYXRoVG9QbGlzdCwgZmFsc2UpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVMb2NhdGlvblNldHRpbmdzIChzaW0sIGJ1bmRsZUlkLCBhdXRob3JpemVkKSB7XG4gIC8vIHVwZGF0ZSBsb2NhdGlvbiBjYWNoZVxuICBjb25zdCBuZXdDYWNoZVByZWZzID0ge1xuICAgIExhc3RGZW5jZUFjdGl2aXR5VGltZXN0YW1wOiA0MTIxMjIxMDMuMjMyOTgzLFxuICAgIENsZWFuU2h1dGRvd246IHRydWVcbiAgfTtcbiAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IHVwZGF0ZVNldHRpbmdzKHNpbSwgUExJU1RfSURFTlRJRklFUi5MT0NBVElPTl9DQUNIRSwge1xuICAgIFtidW5kbGVJZF06IG5ld0NhY2hlUHJlZnNcbiAgfSk7XG5cbiAgLy8gdXBkYXRlIGxvY2F0aW9uIGNsaWVudHNcbiAgY29uc3QgbmV3Q2xpZW50UHJlZnMgPSB7XG4gICAgQnVuZGxlSWQ6IGJ1bmRsZUlkLFxuICAgIEF1dGhvcml6ZWQ6ICEhYXV0aG9yaXplZCxcbiAgICBXaGl0ZWxpc3RlZDogZmFsc2UsXG4gIH07XG5cbiAgY29uc3QgcGF0aHMgPSBhd2FpdCBwbGlzdFBhdGhzKHNpbSwgUExJU1RfSURFTlRJRklFUi5MT0NBVElPTl9DTElFTlRTKTtcbiAgaWYgKF8uaXNFbXB0eShwYXRocykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgY29udGVudHMgPSBhd2FpdCBCLmFsbChwYXRocy5tYXAocmVhZCkpO1xuICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICBmb3IgKGNvbnN0IFtmaWxlLCBjb250ZW50XSBvZiBfLnppcChwYXRocywgY29udGVudHMpKSB7XG4gICAgbG9nLmRlYnVnKGBVcGRhdGluZyBsb2NhdGlvbiBjbGllbnQgZmlsZTogJHtmaWxlfWApO1xuXG4gICAgY29uc3QgdXBkYXRlcyA9IHt9O1xuICAgIC8vIHJhbmRvbSBkYXRhIHRoYXQgYWx3YXlzIHNlZW1zIHRvIGJlIGluIHRoZSBjbGllbnRzLnBsaXN0XG4gICAgY29uc3Qgd2VpcmRMb2NLZXkgPSAnY29tLmFwcGxlLmxvY2F0aW9uZC5idW5kbGUtL1N5c3RlbS9MaWJyYXJ5LycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1ByaXZhdGVGcmFtZXdvcmtzL0FPU05vdGlmaWNhdGlvbi5mcmFtZXdvcmsnO1xuICAgIGlmICghXy5oYXMoY29udGVudCwgd2VpcmRMb2NLZXkpKSB7XG4gICAgICB1cGRhdGVzW3dlaXJkTG9jS2V5XSA9IHtcbiAgICAgICAgQnVuZGxlUGF0aDogJy9TeXN0ZW0vTGlicmFyeS9Qcml2YXRlRnJhbWV3b3Jrcy9BT1NOb3RpZmljYXRpb24uZnJhbWV3b3JrJyxcbiAgICAgICAgV2hpdGVsaXN0ZWQ6IGZhbHNlLFxuICAgICAgICBFeGVjdXRhYmxlOiAnJyxcbiAgICAgICAgUmVnaXN0ZXJlZDogJydcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIGNyZWF0ZSB0aGUgdXBkYXRlLCBhbmQgbWFrZSBzdXJlIGl0IGhhcyBzZW5zaWJsZSB2YWx1ZXNcbiAgICBjb25zdCBiYXNlU2V0dGluZyA9IF8uaGFzKGNvbnRlbnQsIGJ1bmRsZUlkKSA/IGNvbnRlbnRbYnVuZGxlSWRdIDoge307XG4gICAgdXBkYXRlc1tidW5kbGVJZF0gPSBfLmRlZmF1bHRzKG5ld0NsaWVudFByZWZzLCBiYXNlU2V0dGluZyk7XG4gICAgdXBkYXRlc1tidW5kbGVJZF0uRXhlY3V0YWJsZSA9IHVwZGF0ZXNbYnVuZGxlSWRdLkV4ZWN1dGFibGUgfHwgJyc7XG4gICAgdXBkYXRlc1tidW5kbGVJZF0uUmVnaXN0ZXJlZCA9IHVwZGF0ZXNbYnVuZGxlSWRdLlJlZ2lzdGVyZWQgfHwgJyc7XG5cbiAgICBwcm9taXNlcy5wdXNoKHVwZGF0ZShmaWxlLCB1cGRhdGVzKSk7XG4gIH1cbiAgcmV0dXJuIChfLmlzRW1wdHkocHJvbWlzZXMpID8gZmFsc2UgOiBfLnNvbWUoYXdhaXQgQi5hbGwocHJvbWlzZXMpLCBCb29sZWFuKSkgfHwgdXBkYXRlZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0UmVkdWNlTW90aW9uIChzaW0sIHJlZHVjZU1vdGlvbiA9IHRydWUpIHtcbiAgbG9nLmRlYnVnKGBVcGRhdGluZyByZWR1Y2UgbW90aW9uLiBTZXR0aW5nIHRvICR7cmVkdWNlTW90aW9ufS5gKTtcbiAgYXdhaXQgdXBkYXRlU2V0dGluZ3Moc2ltLCBQTElTVF9JREVOVElGSUVSLkFDQ0VTU0lCTElUWV9TRVRUSU5HUywge1xuICAgIFJlZHVjZU1vdGlvbkVuYWJsZWQ6IHJlZHVjZU1vdGlvbiA/IDEgOiAwXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXRSZWR1Y2VUcmFuc3BhcmVuY3kgKHNpbSwgcmVkdWNlVHJhbnNwYXJlbmN5KSB7XG4gIGxvZy5kZWJ1ZyhgVXBkYXRpbmcgcmVkdWNlIHRyYW5jZXBhcmVuY3kuIFNldHRpbmcgdG8gJHtyZWR1Y2VUcmFuc3BhcmVuY3l9LmApO1xuICBhd2FpdCB1cGRhdGVTZXR0aW5ncyhzaW0sIFBMSVNUX0lERU5USUZJRVIuQUNDRVNTSUJMSVRZX1NFVFRJTkdTLCB7XG4gICAgRW5oYW5jZWRCYWNrZ3JvdW5kQ29udHJhc3RFbmFibGVkOiByZWR1Y2VUcmFuc3BhcmVuY3kgPyAxIDogMFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlU2FmYXJpR2xvYmFsU2V0dGluZ3MgKHNpbSwgc2V0dGluZ1NldCkge1xuICBsb2cuZGVidWcoJ1VwZGF0aW5nIFNhZmFyaSBnbG9iYWwgc2V0dGluZ3MnKTtcblxuICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICBmb3IgKGNvbnN0IFtmaWxlLCBzYWZhcmlTZXR0aW5nU2V0XSBvZiBfLnRvUGFpcnMoYXdhaXQgcmVhZFNldHRpbmdzKHNpbSwgUExJU1RfSURFTlRJRklFUi5HTE9CQUxfTU9CSUxFX1NBRkFSSSkpKSB7XG4gICAgY29uc3QgbmV3U2V0dGluZ3MgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBfLnRvUGFpcnMoc2V0dGluZ1NldCkpIHtcbiAgICAgIGlmIChzYWZhcmlTZXR0aW5nU2V0W2tleV0gIT09IHZhbHVlKSB7XG4gICAgICAgIG5ld1NldHRpbmdzW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKF8uaXNFbXB0eShuZXdTZXR0aW5ncykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBwcm9taXNlcy5wdXNoKHVwZGF0ZShmaWxlLCBuZXdTZXR0aW5ncykpO1xuICB9XG4gIHJldHVybiBfLmlzRW1wdHkocHJvbWlzZXMpID8gZmFsc2UgOiBfLnNvbWUoYXdhaXQgQi5hbGwocHJvbWlzZXMpLCBCb29sZWFuKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlU2FmYXJpVXNlclNldHRpbmdzIChzaW0sIHNldHRpbmdTZXQpIHtcbiAgbG9nLmRlYnVnKCdVcGRhdGluZyBTYWZhcmkgdXNlciBzZXR0aW5ncycpO1xuXG4gIC8vIGFkZCBleHRyYSBzdHVmZiB0byBVc2VyU2V0dGluZ3MucGxpc3QgYW5kIEVmZmVjdGl2ZVVzZXJTZXR0aW5ncy5wbGlzdFxuICBjb25zdCBuZXdVc2VyU2V0dGluZ3MgPSB7fTtcbiAgaWYgKF8uaGFzKHNldHRpbmdTZXQsICdXZWJLaXRKYXZhU2NyaXB0RW5hYmxlZCcpKSB7XG4gICAgbmV3VXNlclNldHRpbmdzLnNhZmFyaUFsbG93SmF2YVNjcmlwdCA9IHNldHRpbmdTZXQuV2ViS2l0SmF2YVNjcmlwdEVuYWJsZWQ7XG4gIH1cbiAgaWYgKF8uaGFzKHNldHRpbmdTZXQsICdXZWJLaXRKYXZhU2NyaXB0Q2FuT3BlbldpbmRvd3NBdXRvbWF0aWNhbGx5JykpIHtcbiAgICBuZXdVc2VyU2V0dGluZ3Muc2FmYXJpQWxsb3dQb3B1cHMgPSBzZXR0aW5nU2V0LldlYktpdEphdmFTY3JpcHRDYW5PcGVuV2luZG93c0F1dG9tYXRpY2FsbHk7XG4gIH1cbiAgaWYgKF8uaGFzKHNldHRpbmdTZXQsICdXYXJuQWJvdXRGcmF1ZHVsZW50V2Vic2l0ZXMnKSkge1xuICAgIG5ld1VzZXJTZXR0aW5ncy5zYWZhcmlGb3JjZUZyYXVkV2FybmluZyA9ICFzZXR0aW5nU2V0Lldhcm5BYm91dEZyYXVkdWxlbnRXZWJzaXRlcztcbiAgfVxuICBpZiAoXy5pc0VtcHR5KG5ld1VzZXJTZXR0aW5ncykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICBmb3IgKGNvbnN0IFtmaWxlLCB1c2VyU2V0dGluZ1NldF0gb2YgXy50b1BhaXJzKGF3YWl0IHJlYWRTZXR0aW5ncyhzaW0sIFBMSVNUX0lERU5USUZJRVIuVVNFUl9TRVRUSU5HUykpKSB7XG4gICAgLy8gdGhlIHVzZXIgc2V0dGluZ3MgcGxpc3QgaGFzIHR3byBidWNrZXRzLCBvbmUgZm9yXG4gICAgLy8gYm9vbGVhbiBzZXR0aW5ncyAoYHJlc3RyaWN0ZWRCb29sYCkgYW5kIG9uZSBmb3JcbiAgICAvLyBvdGhlciB2YWx1ZSBzZXR0aW5ncyAoYHJlc3RyaWN0ZWRWYWx1ZWApLiBJbiBlYWNoLCB0aGUgdmFsdWVcbiAgICAvLyBpcyBpbiBhIGB2YWx1ZWAgc3ViLWZpZWxkLlxuICAgIGlmICghXy5oYXModXNlclNldHRpbmdTZXQsICdyZXN0cmljdGVkQm9vbCcpKSB7XG4gICAgICB1c2VyU2V0dGluZ1NldC5yZXN0cmljdGVkQm9vbCA9IHt9O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBfLnRvUGFpcnMobmV3VXNlclNldHRpbmdzKSkge1xuICAgICAgdXNlclNldHRpbmdTZXQucmVzdHJpY3RlZEJvb2xba2V5XSA9IHt2YWx1ZX07XG4gICAgfVxuXG4gICAgcHJvbWlzZXMucHVzaCh1cGRhdGUoZmlsZSwgdXNlclNldHRpbmdTZXQpKTtcbiAgfVxuICByZXR1cm4gXy5pc0VtcHR5KHByb21pc2VzKSA/IGZhbHNlIDogXy5zb21lKGF3YWl0IEIuYWxsKHByb21pc2VzKSwgQm9vbGVhbik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUxvY2FsZSAoc2ltLCBsYW5ndWFnZSwgbG9jYWxlLCBjYWxlbmRhckZvcm1hdCkge1xuICBjb25zdCBnbG9iYWxQcmVmcyA9IChhd2FpdCBwbGlzdFBhdGhzKHNpbSwgUExJU1RfSURFTlRJRklFUi5HTE9CQUxfUFJFRkVSRU5DRVMpKVswXTtcbiAgaWYgKCFnbG9iYWxQcmVmcykge1xuICAgIHRocm93IG5ldyBFcnJvcignR2xvYmFsIHByZWZlcmVuY2VzIGZvbGRlciBwYXRoIGNhbm5vdCBiZSByZXRyaWV2ZWQnKTtcbiAgfVxuXG4gIC8vIGdldCB0aGUgY3VycmVudCBkYXRhXG4gIGxldCBkYXRhID0gYXdhaXQgcmVhZChnbG9iYWxQcmVmcyk7XG4gIGxldCB1cGRhdGVzID0ge307XG5cbiAgLy8gaWYgd2UgYXJlIHNldHRpbmcgdGhlIGxhbmd1YWdlLCBhZGQgaXQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdCBvZiBsYW5ndWFnZXNcbiAgaWYgKGxhbmd1YWdlKSB7XG4gICAgbG9nLmRlYnVnKGBOZXcgbGFuZ3VhZ2U6ICR7bGFuZ3VhZ2V9YCk7XG4gICAgbGV0IHN1cHBvcnRlZExhbmdzID0gZGF0YS5BcHBsZUxhbmd1YWdlcyB8fCBbXTtcbiAgICAvLyBpZiB0aGUgbGFuZ3VhZ2UgaXMgZmlyc3QsIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmdcbiAgICBpZiAoc3VwcG9ydGVkTGFuZ3MuaW5kZXhPZihsYW5ndWFnZSkgIT09IDApIHtcbiAgICAgIHVwZGF0ZXMuQXBwbGVMYW5ndWFnZXMgPSBbbGFuZ3VhZ2VdLmNvbmNhdChfLndpdGhvdXQoc3VwcG9ydGVkTGFuZ3MsIGxhbmd1YWdlKSk7XG4gICAgfVxuICB9XG4gIC8vIGlmIHdlIGFyZSBzZXR0aW5nIHRoZSBsb2NhbGUgb3IgY2FsZW5kYXIgZm9ybWF0LCBzZXQgdGhlbSBhcyBhcHByb3ByaWF0ZVxuICBpZiAobG9jYWxlIHx8IGNhbGVuZGFyRm9ybWF0KSB7XG4gICAgbGV0IGNhbFNwbGl0ID0gJ0BjYWxlbmRhcj0nO1xuICAgIGxldCBjdXJMb2NhbGVBbmRDYWwgPSBkYXRhLkFwcGxlTG9jYWxlIHx8IGxhbmd1YWdlIHx8ICdlbic7XG5cbiAgICBsZXQgc3BsaXQgPSBjdXJMb2NhbGVBbmRDYWwuc3BsaXQoY2FsU3BsaXQpO1xuICAgIGxldCBjdXJMb2MgPSBzcGxpdFswXTtcbiAgICBpZiAoY2FsZW5kYXJGb3JtYXQgfHwgc3BsaXRbMV0pIHtcbiAgICAgIGNhbGVuZGFyRm9ybWF0ID0gYCR7Y2FsU3BsaXR9JHtjYWxlbmRhckZvcm1hdCB8fCBzcGxpdFsxXSB8fCAnJ31gO1xuICAgIH1cbiAgICBjYWxlbmRhckZvcm1hdCA9IGNhbGVuZGFyRm9ybWF0IHx8ICcnO1xuICAgIGxldCBuZXdMb2NhbGVBbmRDYWwgPSBsb2NhbGUgPyBsb2NhbGUgOiBjdXJMb2M7XG4gICAgaWYgKGNhbGVuZGFyRm9ybWF0KSB7XG4gICAgICBuZXdMb2NhbGVBbmRDYWwgPSBgJHtuZXdMb2NhbGVBbmRDYWx9JHtjYWxlbmRhckZvcm1hdH1gO1xuICAgIH1cbiAgICAvLyBvbmx5IG5lZWQgdG8gdXBkYXRlIGlmIGl0IGhhcyBjaGFuZ2VkXG4gICAgaWYgKG5ld0xvY2FsZUFuZENhbCAhPT0gY3VyTG9jYWxlQW5kQ2FsKSB7XG4gICAgICBsb2cuZGVidWcoYE5ldyBsb2NhbGU6ICR7bmV3TG9jYWxlQW5kQ2FsfWApO1xuICAgICAgdXBkYXRlcy5BcHBsZUxvY2FsZSA9IG5ld0xvY2FsZUFuZENhbDtcbiAgICB9XG4gIH1cblxuICBpZiAoXy5zaXplKHVwZGF0ZXMpID09PSAwKSB7XG4gICAgbG9nLmRlYnVnKCdObyBsb2NhbGUgdXBkYXRlcyBuZWNlc3NhcnkuJyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbG9nLmRlYnVnKCdXcml0aW5nIG5ldyBsb2NhbGUgcGxpc3QgZGF0YScpO1xuICBhd2FpdCB1cGRhdGUoZ2xvYmFsUHJlZnMsIHVwZGF0ZXMpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IHtcbiAgdXBkYXRlLCB1cGRhdGVTZXR0aW5ncywgdXBkYXRlTG9jYXRpb25TZXR0aW5ncywgc2V0UmVkdWNlTW90aW9uLCBzZXRSZWR1Y2VUcmFuc3BhcmVuY3ksXG4gIHVwZGF0ZVNhZmFyaVVzZXJTZXR0aW5ncywgdXBkYXRlU2FmYXJpR2xvYmFsU2V0dGluZ3MsIHVwZGF0ZUxvY2FsZSwgcmVhZCxcbiAgcmVhZFNldHRpbmdzLCBQTElTVF9JREVOVElGSUVSXG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxNQUFNQSxnQkFBZ0IsR0FBR0MsTUFBTSxDQUFDQyxNQUFNLENBQUM7RUFDckNDLGFBQWEsRUFBRSxjQUFjO0VBQzdCQyxhQUFhLEVBQUUsY0FBYztFQUM3QkMsb0JBQW9CLEVBQUUsb0JBQW9CO0VBQzFDQyxNQUFNLEVBQUUsT0FBTztFQUNmQyxjQUFjLEVBQUUsZUFBZTtFQUMvQkMsV0FBVyxFQUFFLGFBQWE7RUFDMUJDLGtCQUFrQixFQUFFLG1CQUFt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