appium 2.0.0-beta.2 → 2.0.0-beta.23

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 (122) hide show
  1. package/README.md +9 -9
  2. package/build/check-npm-pack-files.js +23 -0
  3. package/build/commands-yml/parse.js +319 -0
  4. package/build/commands-yml/validator.js +130 -0
  5. package/build/index.js +19 -0
  6. package/build/lib/appium-config.schema.json +0 -0
  7. package/build/lib/appium.js +160 -53
  8. package/build/lib/cli/args.js +115 -279
  9. package/build/lib/cli/driver-command.js +11 -1
  10. package/build/lib/cli/extension-command.js +60 -8
  11. package/build/lib/cli/extension.js +30 -7
  12. package/build/lib/cli/npm.js +43 -29
  13. package/build/lib/cli/parser.js +156 -89
  14. package/build/lib/cli/plugin-command.js +11 -1
  15. package/build/lib/cli/utils.js +29 -3
  16. package/build/lib/config-file.js +141 -0
  17. package/build/lib/config.js +53 -65
  18. package/build/lib/driver-config.js +42 -19
  19. package/build/lib/drivers.js +8 -4
  20. package/build/lib/ext-config-io.js +165 -0
  21. package/build/lib/extension-config.js +130 -61
  22. package/build/lib/grid-register.js +22 -24
  23. package/build/lib/logger.js +3 -3
  24. package/build/lib/logsink.js +11 -13
  25. package/build/lib/main.js +197 -77
  26. package/build/lib/plugin-config.js +21 -11
  27. package/build/lib/plugins.js +4 -2
  28. package/build/lib/schema/appium-config-schema.js +253 -0
  29. package/build/lib/schema/arg-spec.js +120 -0
  30. package/build/lib/schema/cli-args.js +188 -0
  31. package/build/lib/schema/cli-transformers.js +76 -0
  32. package/build/lib/schema/index.js +36 -0
  33. package/build/lib/schema/keywords.js +72 -0
  34. package/build/lib/schema/schema.js +357 -0
  35. package/build/lib/utils.js +44 -99
  36. package/build/postinstall.js +90 -0
  37. package/build/test/cli/cli-e2e-specs.js +221 -0
  38. package/build/test/cli/cli-helpers.js +86 -0
  39. package/build/test/cli/cli-specs.js +71 -0
  40. package/build/test/cli/fixtures/test-driver/package.json +27 -0
  41. package/build/test/cli/schema-args-specs.js +48 -0
  42. package/build/test/cli/schema-e2e-specs.js +47 -0
  43. package/build/test/config-e2e-specs.js +112 -0
  44. package/build/test/config-file-e2e-specs.js +209 -0
  45. package/build/test/config-file-specs.js +281 -0
  46. package/build/test/config-specs.js +159 -0
  47. package/build/test/driver-e2e-specs.js +435 -0
  48. package/build/test/driver-specs.js +321 -0
  49. package/build/test/ext-config-io-specs.js +181 -0
  50. package/build/test/extension-config-specs.js +365 -0
  51. package/build/test/fixtures/allow-feat.txt +5 -0
  52. package/build/test/fixtures/caps.json +3 -0
  53. package/build/test/fixtures/config/allow-insecure.txt +3 -0
  54. package/build/test/fixtures/config/appium.config.bad-nodeconfig.json +5 -0
  55. package/build/test/fixtures/config/appium.config.bad.json +32 -0
  56. package/build/test/fixtures/config/appium.config.ext-good.json +9 -0
  57. package/build/test/fixtures/config/appium.config.ext-unknown-props.json +10 -0
  58. package/build/test/fixtures/config/appium.config.good.js +40 -0
  59. package/build/test/fixtures/config/appium.config.good.json +33 -0
  60. package/build/test/fixtures/config/appium.config.good.yaml +30 -0
  61. package/build/test/fixtures/config/appium.config.invalid.json +31 -0
  62. package/build/test/fixtures/config/appium.config.security-array.json +5 -0
  63. package/build/test/fixtures/config/appium.config.security-delimited.json +5 -0
  64. package/build/test/fixtures/config/appium.config.security-path.json +5 -0
  65. package/build/test/fixtures/config/driver-fake.config.json +8 -0
  66. package/build/test/fixtures/config/nodeconfig.json +3 -0
  67. package/build/test/fixtures/config/plugin-fake.config.json +0 -0
  68. package/build/test/fixtures/default-args.js +35 -0
  69. package/build/test/fixtures/deny-feat.txt +5 -0
  70. package/build/test/fixtures/driver.schema.js +20 -0
  71. package/build/test/fixtures/extensions.yaml +27 -0
  72. package/build/test/fixtures/flattened-schema.js +504 -0
  73. package/build/test/fixtures/plugin.schema.js +20 -0
  74. package/build/test/fixtures/schema-with-extensions.js +28 -0
  75. package/build/test/grid-register-specs.js +74 -0
  76. package/build/test/helpers.js +75 -0
  77. package/build/test/logger-specs.js +76 -0
  78. package/build/test/npm-specs.js +20 -0
  79. package/build/test/parser-specs.js +314 -0
  80. package/build/test/plugin-e2e-specs.js +316 -0
  81. package/build/test/schema/arg-spec-specs.js +70 -0
  82. package/build/test/schema/cli-args-specs.js +431 -0
  83. package/build/test/schema/schema-specs.js +389 -0
  84. package/build/test/utils-specs.js +266 -0
  85. package/index.js +11 -0
  86. package/lib/appium-config.schema.json +278 -0
  87. package/lib/appium.js +207 -65
  88. package/lib/cli/args.js +174 -375
  89. package/lib/cli/driver-command.js +4 -0
  90. package/lib/cli/extension-command.js +70 -5
  91. package/lib/cli/extension.js +25 -5
  92. package/lib/cli/npm.js +86 -18
  93. package/lib/cli/parser.js +257 -79
  94. package/lib/cli/plugin-command.js +4 -0
  95. package/lib/cli/utils.js +21 -1
  96. package/lib/config-file.js +227 -0
  97. package/lib/config.js +84 -63
  98. package/lib/driver-config.js +66 -11
  99. package/lib/drivers.js +4 -1
  100. package/lib/ext-config-io.js +287 -0
  101. package/lib/extension-config.js +225 -67
  102. package/lib/grid-register.js +27 -24
  103. package/lib/logger.js +1 -1
  104. package/lib/logsink.js +10 -7
  105. package/lib/main.js +214 -77
  106. package/lib/plugin-config.js +35 -6
  107. package/lib/plugins.js +1 -0
  108. package/lib/schema/appium-config-schema.js +287 -0
  109. package/lib/schema/arg-spec.js +222 -0
  110. package/lib/schema/cli-args.js +285 -0
  111. package/lib/schema/cli-transformers.js +123 -0
  112. package/lib/schema/index.js +2 -0
  113. package/lib/schema/keywords.js +135 -0
  114. package/lib/schema/schema.js +577 -0
  115. package/lib/utils.js +42 -88
  116. package/package.json +55 -84
  117. package/postinstall.js +71 -0
  118. package/types/appium-config.d.ts +197 -0
  119. package/types/types.d.ts +201 -0
  120. package/CHANGELOG.md +0 -3515
  121. package/build/lib/cli/parser-helpers.js +0 -82
  122. package/lib/cli/parser-helpers.js +0 -79
package/build/lib/main.js CHANGED
@@ -1,56 +1,83 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
3
 
4
- var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
5
-
6
4
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
7
5
 
8
6
  Object.defineProperty(exports, "__esModule", {
9
7
  value: true
10
8
  });
9
+ Object.defineProperty(exports, "APPIUM_HOME", {
10
+ enumerable: true,
11
+ get: function () {
12
+ return _extensionConfig.APPIUM_HOME;
13
+ }
14
+ });
15
+ Object.defineProperty(exports, "finalizeSchema", {
16
+ enumerable: true,
17
+ get: function () {
18
+ return _schema.finalizeSchema;
19
+ }
20
+ });
21
+ Object.defineProperty(exports, "getSchema", {
22
+ enumerable: true,
23
+ get: function () {
24
+ return _schema.getSchema;
25
+ }
26
+ });
27
+ exports.init = init;
11
28
  exports.main = main;
29
+ Object.defineProperty(exports, "readConfigFile", {
30
+ enumerable: true,
31
+ get: function () {
32
+ return _configFile.readConfigFile;
33
+ }
34
+ });
35
+ Object.defineProperty(exports, "validate", {
36
+ enumerable: true,
37
+ get: function () {
38
+ return _schema.validate;
39
+ }
40
+ });
12
41
 
13
42
  require("source-map-support/register");
14
43
 
15
- var _logsink = require("./logsink");
16
-
17
- var _logger = _interopRequireDefault(require("./logger"));
18
-
19
- var _lodash = _interopRequireDefault(require("lodash"));
44
+ var _baseDriver = require("@appium/base-driver");
20
45
 
21
- var _appiumBaseDriver = require("appium-base-driver");
46
+ var _support = require("@appium/support");
22
47
 
23
48
  var _asyncbox = require("asyncbox");
24
49
 
25
- var _parser = _interopRequireWildcard(require("./cli/parser"));
50
+ var _lodash = _interopRequireDefault(require("lodash"));
51
+
52
+ var _appium = require("./appium");
26
53
 
27
54
  var _args = require("./cli/args");
28
55
 
29
- var _appiumSupport = require("appium-support");
56
+ var _extension = require("./cli/extension");
57
+
58
+ var _parser = _interopRequireWildcard(require("./cli/parser"));
30
59
 
31
60
  var _config = require("./config");
32
61
 
33
- var _driverConfig = _interopRequireDefault(require("./driver-config"));
34
-
35
- var _pluginConfig = _interopRequireDefault(require("./plugin-config"));
62
+ var _configFile = require("./config-file");
36
63
 
37
64
  var _extensionConfig = require("./extension-config");
38
65
 
39
- var _extension = require("./cli/extension");
66
+ var _gridRegister = _interopRequireDefault(require("./grid-register"));
40
67
 
41
- var _appium = require("./appium");
68
+ var _logger = _interopRequireDefault(require("./logger"));
42
69
 
43
- var _gridRegister = _interopRequireDefault(require("./grid-register"));
70
+ var _logsink = require("./logsink");
71
+
72
+ var _schema = require("./schema/schema");
44
73
 
45
74
  var _utils = require("./utils");
46
75
 
47
- async function preflightChecks({
48
- parser,
49
- args,
50
- driverConfig,
51
- pluginConfig,
52
- throwInsteadOfExit = false
53
- }) {
76
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
77
+
78
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
79
+
80
+ async function preflightChecks(args, throwInsteadOfExit = false) {
54
81
  try {
55
82
  (0, _config.checkNodeOk)();
56
83
 
@@ -64,9 +91,7 @@ async function preflightChecks({
64
91
  }
65
92
 
66
93
  (0, _config.warnNodeDeprecations)();
67
- (0, _config.validateServerArgs)(parser, args);
68
- await driverConfig.read();
69
- await pluginConfig.read();
94
+ (0, _schema.validate)(args);
70
95
 
71
96
  if (args.tmpDir) {
72
97
  await (0, _config.validateTmpDir)(args.tmpDir);
@@ -104,7 +129,7 @@ async function logStartupInfo(parser, args) {
104
129
 
105
130
  _logger.default.info(welcome);
106
131
 
107
- let showArgs = (0, _config.getNonDefaultArgs)(parser, args);
132
+ let showArgs = (0, _config.getNonDefaultServerArgs)(parser, args);
108
133
 
109
134
  if (_lodash.default.size(showArgs)) {
110
135
  logNonDefaultArgsWarning(showArgs);
@@ -121,88 +146,180 @@ function logServerPort(address, port) {
121
146
  _logger.default.info(logMessage);
122
147
  }
123
148
 
124
- async function main(args = null) {
125
- let parser = (0, _parser.default)();
149
+ function getActivePlugins(args, pluginConfig) {
150
+ return _lodash.default.compact(Object.keys(pluginConfig.installedExtensions).filter(pluginName => _lodash.default.includes(args.usePlugins, pluginName) || args.usePlugins.length === 1 && args.usePlugins[0] === _args.USE_ALL_PLUGINS).map(pluginName => {
151
+ try {
152
+ _logger.default.info(`Attempting to load plugin ${pluginName}...`);
153
+
154
+ const PluginClass = pluginConfig.require(pluginName);
155
+
156
+ PluginClass.pluginName = pluginName;
157
+ return PluginClass;
158
+ } catch (err) {
159
+ _logger.default.error(`Could not load plugin '${pluginName}', so it will not be available. Error ` + `in loading the plugin was: ${err.message}`);
160
+
161
+ _logger.default.debug(err.stack);
162
+ }
163
+ }));
164
+ }
165
+
166
+ function getActiveDrivers(args, driverConfig) {
167
+ return _lodash.default.compact(Object.keys(driverConfig.installedExtensions).filter(driverName => _lodash.default.includes(args.useDrivers, driverName) || args.useDrivers.length === 0).map(driverName => {
168
+ try {
169
+ _logger.default.info(`Attempting to load driver ${driverName}...`);
170
+
171
+ return driverConfig.require(driverName);
172
+ } catch (err) {
173
+ _logger.default.error(`Could not load driver '${driverName}', so it will not be available. Error ` + `in loading the driver was: ${err.message}`);
174
+
175
+ _logger.default.debug(err.stack);
176
+ }
177
+ }));
178
+ }
179
+
180
+ function getServerUpdaters(driverClasses, pluginClasses) {
181
+ return [...driverClasses, ...pluginClasses].map(klass => klass.updateServer).filter(Boolean);
182
+ }
183
+
184
+ function getExtraMethodMap(driverClasses, pluginClasses) {
185
+ return [...driverClasses, ...pluginClasses].reduce((map, klass) => ({ ...map,
186
+ ...klass.newMethodMap
187
+ }), {});
188
+ }
189
+
190
+ async function init(args) {
191
+ var _configResult$config2;
192
+
193
+ const parser = await (0, _parser.default)();
126
194
  let throwInsteadOfExit = false;
195
+ let parsedArgs;
127
196
 
128
197
  if (args) {
129
- args = Object.assign({}, (0, _parser.getDefaultServerArgs)(), args);
198
+ var _args$subcommand;
130
199
 
131
200
  if (args.throwInsteadOfExit) {
132
201
  throwInsteadOfExit = true;
133
202
  delete args.throwInsteadOfExit;
134
203
  }
204
+
205
+ parsedArgs = { ...args,
206
+ subcommand: (_args$subcommand = args.subcommand) !== null && _args$subcommand !== void 0 ? _args$subcommand : _parser.SERVER_SUBCOMMAND
207
+ };
135
208
  } else {
136
- args = parser.parseArgs();
209
+ parsedArgs = parser.parseArgs();
210
+ }
211
+
212
+ const configResult = await (0, _configFile.readConfigFile)(parsedArgs.configFile);
213
+
214
+ if (!_lodash.default.isEmpty(configResult.errors)) {
215
+ var _configResult$reason;
216
+
217
+ throw new Error(`Errors in config file ${configResult.filepath}:\n ${(_configResult$reason = configResult.reason) !== null && _configResult$reason !== void 0 ? _configResult$reason : configResult.errors}`);
137
218
  }
138
219
 
139
- await (0, _logsink.init)(args);
220
+ if (parsedArgs.subcommand === _parser.SERVER_SUBCOMMAND) {
221
+ var _configResult$config;
222
+
223
+ parsedArgs = _lodash.default.defaultsDeep(parsedArgs, (_configResult$config = configResult.config) === null || _configResult$config === void 0 ? void 0 : _configResult$config.server, (0, _schema.getDefaultsFromSchema)());
224
+ }
225
+
226
+ parsedArgs = _lodash.default.defaultsDeep(parsedArgs, (_configResult$config2 = configResult.config) !== null && _configResult$config2 !== void 0 ? _configResult$config2 : {});
227
+ await (0, _logsink.init)(parsedArgs);
228
+
229
+ if (parsedArgs.subcommand === _extensionConfig.DRIVER_TYPE) {
230
+ await (0, _extension.runExtensionCommand)(parsedArgs, parsedArgs.subcommand, _args.driverConfig);
231
+ return {
232
+ parser
233
+ };
234
+ }
140
235
 
141
- if (args.subcommand === _extensionConfig.DRIVER_TYPE || args.subcommand === _extensionConfig.PLUGIN_TYPE) {
142
- await (0, _extension.runExtensionCommand)(args, args.subcommand);
143
- process.exit();
236
+ if (parsedArgs.subcommand === _extensionConfig.PLUGIN_TYPE) {
237
+ await (0, _extension.runExtensionCommand)(parsedArgs, parsedArgs.subcommand, _args.pluginConfig);
238
+ return {
239
+ parser
240
+ };
144
241
  }
145
242
 
146
- if (args.logFilters) {
243
+ if (parsedArgs.logFilters) {
147
244
  const {
148
245
  issues,
149
246
  rules
150
- } = await _appiumSupport.logger.loadSecureValuesPreprocessingRules(args.logFilters);
247
+ } = await _support.logger.loadSecureValuesPreprocessingRules(parsedArgs.logFilters);
151
248
 
152
249
  if (!_lodash.default.isEmpty(issues)) {
153
- throw new Error(`The log filtering rules config '${args.logFilters}' has issues: ` + JSON.stringify(issues, null, 2));
250
+ throw new Error(`The log filtering rules config '${parsedArgs.logFilters}' has issues: ` + JSON.stringify(issues, null, 2));
154
251
  }
155
252
 
156
253
  if (_lodash.default.isEmpty(rules)) {
157
- _logger.default.warn(`Found no log filtering rules in '${args.logFilters}'. Is that expected?`);
254
+ _logger.default.warn(`Found no log filtering rules in '${parsedArgs.logFilters}'. Is that expected?`);
158
255
  } else {
159
- _logger.default.info(`Loaded ${_appiumSupport.util.pluralize('filtering rule', rules.length, true)} from '${args.logFilters}'`);
256
+ _logger.default.info(`Loaded ${_support.util.pluralize('filtering rule', rules.length, true)} from '${parsedArgs.logFilters}'`);
160
257
  }
161
258
  }
162
259
 
163
- let appiumDriver = new _appium.AppiumDriver(args);
164
- const driverConfig = new _driverConfig.default(args.appiumHome);
165
- const pluginConfig = new _pluginConfig.default(args.appiumHome);
166
- appiumDriver.driverConfig = driverConfig;
167
- await preflightChecks({
260
+ const appiumDriver = new _appium.AppiumDriver(parsedArgs);
261
+ appiumDriver.driverConfig = _args.driverConfig;
262
+ await preflightChecks(parsedArgs, throwInsteadOfExit);
263
+ return {
168
264
  parser,
169
- args,
170
- driverConfig,
171
- pluginConfig,
172
- throwInsteadOfExit
173
- });
174
- await logStartupInfo(parser, args);
175
- let routeConfiguringFunction = (0, _appiumBaseDriver.routeConfiguringFunction)(appiumDriver);
176
- const plugins = Object.keys(pluginConfig.installedExtensions).filter(pluginName => _lodash.default.includes(args.plugins, pluginName) || args.plugins.length === 1 && args.plugins[0] === _args.USE_ALL_PLUGINS).map(pluginName => {
177
- try {
178
- const PluginClass = pluginConfig.require(pluginName);
265
+ appiumDriver,
266
+ parsedArgs
267
+ };
268
+ }
179
269
 
180
- return new PluginClass(pluginName);
181
- } catch (err) {
182
- _logger.default.error(`Could not load plugin '${pluginName}', so it will not be available. Error ` + `in loading the plugin was: ${err}`);
270
+ async function main(args) {
271
+ const {
272
+ parser,
273
+ appiumDriver,
274
+ parsedArgs
275
+ } = await init(args);
183
276
 
184
- return false;
185
- }
186
- }).filter(Boolean);
187
- appiumDriver.plugins = plugins;
188
- let server = await (0, _appiumBaseDriver.server)({
277
+ if (!appiumDriver || !parsedArgs) {
278
+ return;
279
+ }
280
+
281
+ const pluginClasses = getActivePlugins(parsedArgs, _args.pluginConfig);
282
+ appiumDriver.pluginClasses = pluginClasses;
283
+ await logStartupInfo(parser, parsedArgs);
284
+ let routeConfiguringFunction = (0, _baseDriver.routeConfiguringFunction)(appiumDriver);
285
+ const driverClasses = getActiveDrivers(parsedArgs, _args.driverConfig);
286
+ const serverUpdaters = getServerUpdaters(driverClasses, pluginClasses);
287
+ const extraMethodMap = getExtraMethodMap(driverClasses, pluginClasses);
288
+ const serverOpts = {
189
289
  routeConfiguringFunction,
190
- port: args.port,
191
- hostname: args.address,
192
- allowCors: args.allowCors,
193
- basePath: args.basePath,
194
- plugins
195
- });
196
-
197
- if (args.allowCors) {
290
+ port: parsedArgs.port,
291
+ hostname: parsedArgs.address,
292
+ allowCors: parsedArgs.allowCors,
293
+ basePath: parsedArgs.basePath,
294
+ serverUpdaters,
295
+ extraMethodMap
296
+ };
297
+
298
+ if (parsedArgs.keepAliveTimeout) {
299
+ serverOpts.keepAliveTimeout = parsedArgs.keepAliveTimeout * 1000;
300
+ }
301
+
302
+ let server;
303
+
304
+ try {
305
+ server = await (0, _baseDriver.server)(serverOpts);
306
+ } catch (err) {
307
+ _logger.default.error(`Could not configure Appium server. It's possible that a driver or plugin tried ` + `to update the server and failed. Original error: ${err.message}`);
308
+
309
+ _logger.default.debug(err.stack);
310
+
311
+ return process.exit(1);
312
+ }
313
+
314
+ if (parsedArgs.allowCors) {
198
315
  _logger.default.warn('You have enabled CORS requests from any host. Be careful not ' + 'to visit sites which could maliciously try to start Appium ' + 'sessions on your machine');
199
316
  }
200
317
 
201
318
  appiumDriver.server = server;
202
319
 
203
320
  try {
204
- if (args.nodeconfig !== null) {
205
- await (0, _gridRegister.default)(args.nodeconfig, args.address, args.port);
321
+ if (parsedArgs.nodeconfig) {
322
+ await (0, _gridRegister.default)(parsedArgs.nodeconfig, parsedArgs.address, parsedArgs.port, parsedArgs.basePath);
206
323
  }
207
324
  } catch (err) {
208
325
  await server.close();
@@ -228,9 +345,12 @@ async function main(args = null) {
228
345
  });
229
346
  }
230
347
 
231
- logServerPort(args.address, args.port);
232
- driverConfig.print();
233
- pluginConfig.print(plugins);
348
+ logServerPort(parsedArgs.address, parsedArgs.port);
349
+
350
+ _args.driverConfig.print();
351
+
352
+ _args.pluginConfig.print(pluginClasses.map(p => p.pluginName));
353
+
234
354
  return server;
235
355
  }
236
356
 
@@ -239,4 +359,4 @@ if (require.main === module) {
239
359
  }require('source-map-support').install();
240
360
 
241
361
 
242
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9tYWluLmpzIl0sIm5hbWVzIjpbInByZWZsaWdodENoZWNrcyIsInBhcnNlciIsImFyZ3MiLCJkcml2ZXJDb25maWciLCJwbHVnaW5Db25maWciLCJ0aHJvd0luc3RlYWRPZkV4aXQiLCJsb25nU3RhY2t0cmFjZSIsInJlcXVpcmUiLCJhc3luY190cmFjZV9saW1pdCIsInNob3dDb25maWciLCJwcm9jZXNzIiwiZXhpdCIsInJlYWQiLCJ0bXBEaXIiLCJlcnIiLCJsb2dnZXIiLCJlcnJvciIsIm1lc3NhZ2UiLCJyZWQiLCJsb2dOb25EZWZhdWx0QXJnc1dhcm5pbmciLCJpbmZvIiwibG9nRGVmYXVsdENhcGFiaWxpdGllc1dhcm5pbmciLCJjYXBzIiwibG9nU3RhcnR1cEluZm8iLCJ3ZWxjb21lIiwiQVBQSVVNX1ZFUiIsImFwcGl1bVJldiIsInNob3dBcmdzIiwiXyIsInNpemUiLCJpc0VtcHR5IiwiZGVmYXVsdENhcGFiaWxpdGllcyIsImxvZ1NlcnZlclBvcnQiLCJhZGRyZXNzIiwicG9ydCIsImxvZ01lc3NhZ2UiLCJtYWluIiwiT2JqZWN0IiwiYXNzaWduIiwicGFyc2VBcmdzIiwic3ViY29tbWFuZCIsIkRSSVZFUl9UWVBFIiwiUExVR0lOX1RZUEUiLCJsb2dGaWx0ZXJzIiwiaXNzdWVzIiwicnVsZXMiLCJsb2dGYWN0b3J5IiwibG9hZFNlY3VyZVZhbHVlc1ByZXByb2Nlc3NpbmdSdWxlcyIsIkVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsIndhcm4iLCJ1dGlsIiwicGx1cmFsaXplIiwibGVuZ3RoIiwiYXBwaXVtRHJpdmVyIiwiQXBwaXVtRHJpdmVyIiwiRHJpdmVyQ29uZmlnIiwiYXBwaXVtSG9tZSIsIlBsdWdpbkNvbmZpZyIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsInBsdWdpbnMiLCJrZXlzIiwiaW5zdGFsbGVkRXh0ZW5zaW9ucyIsImZpbHRlciIsInBsdWdpbk5hbWUiLCJpbmNsdWRlcyIsIlVTRV9BTExfUExVR0lOUyIsIm1hcCIsIlBsdWdpbkNsYXNzIiwiQm9vbGVhbiIsInNlcnZlciIsImhvc3RuYW1lIiwiYWxsb3dDb3JzIiwiYmFzZVBhdGgiLCJub2RlY29uZmlnIiwiY2xvc2UiLCJzaWduYWwiLCJvbmNlIiwib25TaWduYWwiLCJkZWxldGVBbGxTZXNzaW9ucyIsImZvcmNlIiwicmVhc29uIiwiZSIsInByaW50IiwibW9kdWxlIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxlQUFlQSxlQUFmLENBQWdDO0FBQUNDLEVBQUFBLE1BQUQ7QUFBU0MsRUFBQUEsSUFBVDtBQUFlQyxFQUFBQSxZQUFmO0FBQTZCQyxFQUFBQSxZQUE3QjtBQUEyQ0MsRUFBQUEsa0JBQWtCLEdBQUc7QUFBaEUsQ0FBaEMsRUFBd0c7QUFDdEcsTUFBSTtBQUNGOztBQUNBLFFBQUlILElBQUksQ0FBQ0ksY0FBVCxFQUF5QjtBQUN2QkMsTUFBQUEsT0FBTyxDQUFDLFVBQUQsQ0FBUCxDQUFvQkMsaUJBQXBCLEdBQXdDLENBQUMsQ0FBekM7QUFDRDs7QUFDRCxRQUFJTixJQUFJLENBQUNPLFVBQVQsRUFBcUI7QUFDbkIsWUFBTSx5QkFBTjtBQUNBQyxNQUFBQSxPQUFPLENBQUNDLElBQVIsQ0FBYSxDQUFiO0FBQ0Q7O0FBQ0Q7QUFDQSxvQ0FBbUJWLE1BQW5CLEVBQTJCQyxJQUEzQjtBQUNBLFVBQU1DLFlBQVksQ0FBQ1MsSUFBYixFQUFOO0FBQ0EsVUFBTVIsWUFBWSxDQUFDUSxJQUFiLEVBQU47O0FBQ0EsUUFBSVYsSUFBSSxDQUFDVyxNQUFULEVBQWlCO0FBQ2YsWUFBTSw0QkFBZVgsSUFBSSxDQUFDVyxNQUFwQixDQUFOO0FBQ0Q7QUFDRixHQWhCRCxDQWdCRSxPQUFPQyxHQUFQLEVBQVk7QUFDWkMsb0JBQU9DLEtBQVAsQ0FBYUYsR0FBRyxDQUFD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ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcbi8vIHRyYW5zcGlsZTptYWluXG5cbmltcG9ydCB7IGluaXQgYXMgbG9nc2lua0luaXQgfSBmcm9tICcuL2xvZ3NpbmsnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7IC8vIGxvZ2dlciBuZWVkcyB0byByZW1haW4gZmlyc3Qgb2YgaW1wb3J0c1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHNlcnZlciBhcyBiYXNlU2VydmVyLCByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24gYXMgbWFrZVJvdXRlciB9IGZyb20gJ2FwcGl1bS1iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyBhc3luY2lmeSB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IGRlZmF1bHQgYXMgZ2V0UGFyc2VyLCBnZXREZWZhdWx0U2VydmVyQXJncyB9IGZyb20gJy4vY2xpL3BhcnNlcic7XG5pbXBvcnQgeyBVU0VfQUxMX1BMVUdJTlMgfSBmcm9tICcuL2NsaS9hcmdzJztcbmltcG9ydCB7IGxvZ2dlciBhcyBsb2dGYWN0b3J5LCB1dGlsIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IHtcbiAgc2hvd0NvbmZpZywgY2hlY2tOb2RlT2ssIHZhbGlkYXRlU2VydmVyQXJncyxcbiAgd2Fybk5vZGVEZXByZWNhdGlvbnMsIHZhbGlkYXRlVG1wRGlyLCBnZXROb25EZWZhdWx0QXJncyxcbiAgZ2V0R2l0UmV2LCBBUFBJVU1fVkVSXG59IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCBEcml2ZXJDb25maWcgZnJvbSAnLi9kcml2ZXItY29uZmlnJztcbmltcG9ydCBQbHVnaW5Db25maWcgZnJvbSAnLi9wbHVnaW4tY29uZmlnJztcbmltcG9ydCB7IERSSVZFUl9UWVBFLCBQTFVHSU5fVFlQRSB9IGZyb20gJy4vZXh0ZW5zaW9uLWNvbmZpZyc7XG5pbXBvcnQgeyBydW5FeHRlbnNpb25Db21tYW5kIH0gZnJvbSAnLi9jbGkvZXh0ZW5zaW9uJztcbmltcG9ydCB7IEFwcGl1bURyaXZlciB9IGZyb20gJy4vYXBwaXVtJztcbmltcG9ydCByZWdpc3Rlck5vZGUgZnJvbSAnLi9ncmlkLXJlZ2lzdGVyJztcbmltcG9ydCB7IGluc3BlY3RPYmplY3QgfSBmcm9tICcuL3V0aWxzJztcblxuXG5hc3luYyBmdW5jdGlvbiBwcmVmbGlnaHRDaGVja3MgKHtwYXJzZXIsIGFyZ3MsIGRyaXZlckNvbmZpZywgcGx1Z2luQ29uZmlnLCB0aHJvd0luc3RlYWRPZkV4aXQgPSBmYWxzZX0pIHtcbiAgdHJ5IHtcbiAgICBjaGVja05vZGVPaygpO1xuICAgIGlmIChhcmdzLmxvbmdTdGFja3RyYWNlKSB7XG4gICAgICByZXF1aXJlKCdsb25nam9obicpLmFzeW5jX3RyYWNlX2xpbWl0ID0gLTE7XG4gICAgfVxuICAgIGlmIChhcmdzLnNob3dDb25maWcpIHtcbiAgICAgIGF3YWl0IHNob3dDb25maWcoKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG4gICAgd2Fybk5vZGVEZXByZWNhdGlvbnMoKTtcbiAgICB2YWxpZGF0ZVNlcnZlckFyZ3MocGFyc2VyLCBhcmdzKTtcbiAgICBhd2FpdCBkcml2ZXJDb25maWcucmVhZCgpO1xuICAgIGF3YWl0IHBsdWdpbkNvbmZpZy5yZWFkKCk7XG4gICAgaWYgKGFyZ3MudG1wRGlyKSB7XG4gICAgICBhd2FpdCB2YWxpZGF0ZVRtcERpcihhcmdzLnRtcERpcik7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZXJyb3IoZXJyLm1lc3NhZ2UucmVkKTtcbiAgICBpZiAodGhyb3dJbnN0ZWFkT2ZFeGl0KSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxvZ05vbkRlZmF1bHRBcmdzV2FybmluZyAoYXJncykge1xuICBsb2dnZXIuaW5mbygnTm9uLWRlZmF1bHQgc2VydmVyIGFyZ3M6Jyk7XG4gIGluc3BlY3RPYmplY3QoYXJncyk7XG59XG5cbmZ1bmN0aW9uIGxvZ0RlZmF1bHRDYXBhYmlsaXRpZXNXYXJuaW5nIChjYXBzKSB7XG4gIGxvZ2dlci5pbmZvKCdEZWZhdWx0IGNhcGFiaWxpdGllcywgd2hpY2ggd2lsbCBiZSBhZGRlZCB0byBlYWNoIHJlcXVlc3QgJyArXG4gICAgICAgICAgICAgICd1bmxlc3Mgb3ZlcnJpZGRlbiBieSBkZXNpcmVkIGNhcGFiaWxpdGllczonKTtcbiAgaW5zcGVjdE9iamVjdChjYXBzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9nU3RhcnR1cEluZm8gKHBhcnNlciwgYXJncykge1xuICBsZXQgd2VsY29tZSA9IGBXZWxjb21lIHRvIEFwcGl1bSB2JHtBUFBJVU1fVkVSfWA7XG4gIGxldCBhcHBpdW1SZXYgPSBhd2FpdCBnZXRHaXRSZXYoKTtcbiAgaWYgKGFwcGl1bVJldikge1xuICAgIHdlbGNvbWUgKz0gYCAoUkVWICR7YXBwaXVtUmV2fSlgO1xuICB9XG4gIGxvZ2dlci5pbmZvKHdlbGNvbWUpO1xuXG4gIGxldCBzaG93QXJncyA9IGdldE5vbkRlZmF1bHRBcmdzKHBhcnNlciwgYXJncyk7XG4gIGlmIChfLnNpemUoc2hvd0FyZ3MpKSB7XG4gICAgbG9nTm9uRGVmYXVsdEFyZ3NXYXJuaW5nKHNob3dBcmdzKTtcbiAgfVxuICBpZiAoIV8uaXNFbXB0eShhcmdzLmRlZmF1bHRDYXBhYmlsaXRpZXMpKSB7XG4gICAgbG9nRGVmYXVsdENhcGFiaWxpdGllc1dhcm5pbmcoYXJncy5kZWZhdWx0Q2FwYWJpbGl0aWVzKTtcbiAgfVxuICAvLyBUT0RPOiBicmluZyBiYWNrIGxvZ2xldmVsIHJlcG9ydGluZyBiZWxvdyBvbmNlIGxvZ2dlciBpcyBmbHVzaGVkIG91dFxuICAvLyBsb2dnZXIuaW5mbygnQ29uc29sZSBMb2dMZXZlbDogJyArIGxvZ2dlci50cmFuc3BvcnRzLmNvbnNvbGUubGV2ZWwpO1xuICAvLyBpZiAobG9nZ2VyLnRyYW5zcG9ydHMuZmlsZSkge1xuICAvLyAgIGxvZ2dlci5pbmZvKCdGaWxlIExvZ0xldmVsOiAnICsgbG9nZ2VyLnRyYW5zcG9ydHMuZmlsZS5sZXZlbCk7XG4gIC8vIH1cbn1cblxuZnVuY3Rpb24gbG9nU2VydmVyUG9ydCAoYWRkcmVzcywgcG9ydCkge1xuICBsZXQgbG9nTWVzc2FnZSA9IGBBcHBpdW0gUkVTVCBodHRwIGludGVyZmFjZSBsaXN0ZW5lciBzdGFydGVkIG9uIGAgK1xuICAgICAgICAgICAgICAgICAgIGAke2FkZHJlc3N9OiR7cG9ydH1gO1xuICBsb2dnZXIuaW5mbyhsb2dNZXNzYWdlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWFpbiAoYXJncyA9IG51bGwpIHtcbiAgbGV0IHBhcnNlciA9IGdldFBhcnNlcigpO1xuICBsZXQgdGhyb3dJbnN0ZWFkT2ZFeGl0ID0gZmFsc2U7XG4gIGlmIChhcmdzKSB7XG4gICAgLy8gYSBjb250YWluaW5nIHBhY2thZ2UgcGFzc2VkIGluIHRoZWlyIG93biBhcmdzLCBsZXQncyBmaWxsIHRoZW0gb3V0XG4gICAgLy8gd2l0aCBkZWZhdWx0c1xuICAgIGFyZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBnZXREZWZhdWx0U2VydmVyQXJncygpLCBhcmdzKTtcblxuICAgIC8vIGlmIHdlIGhhdmUgYSBjb250YWluaW5nIHBhY2thZ2UgaW5zdGVhZCBvZiBydW5uaW5nIGFzIGEgQ0xJIHByb2Nlc3MsXG4gICAgLy8gdGhhdCBwYWNrYWdlIG1pZ2h0IG5vdCBhcHByZWNpYXRlIHVzIGNhbGxpbmcgJ3Byb2Nlc3MuZXhpdCcgd2lsbHktXG4gICAgLy8gbmlsbHksIHNvIGdpdmUgaXQgdGhlIG9wdGlvbiB0byBoYXZlIHVzIHRocm93IGluc3RlYWQgb2YgZXhpdFxuICAgIGlmIChhcmdzLnRocm93SW5zdGVhZE9mRXhpdCkge1xuICAgICAgdGhyb3dJbnN0ZWFkT2ZFeGl0ID0gdHJ1ZTtcbiAgICAgIC8vIGJ1dCByZW1vdmUgaXQgc2luY2UgaXQncyBub3QgYSByZWFsIHNlcnZlciBhcmcgcGVyIHNlXG4gICAgICBkZWxldGUgYXJncy50aHJvd0luc3RlYWRPZkV4aXQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIG90aGVyd2lzZSBwYXJzZSBmcm9tIENMSVxuICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VBcmdzKCk7XG4gIH1cbiAgYXdhaXQgbG9nc2lua0luaXQoYXJncyk7XG5cbiAgLy8gaWYgdGhlIHVzZXIgaGFzIHJlcXVlc3RlZCB0aGUgJ2RyaXZlcicgQ0xJLCBkb24ndCBydW4gdGhlIG5vcm1hbCBzZXJ2ZXIsXG4gIC8vIGJ1dCBpbnN0ZWFkIHBhc3MgY29udHJvbCB0byB0aGUgZHJpdmVyIENMSVxuICBpZiAoYXJncy5zdWJjb21tYW5kID09PSBEUklWRVJfVFlQRSB8fCBhcmdzLnN1YmNvbW1hbmQgPT09IFBMVUdJTl9UWVBFKSB7XG4gICAgYXdhaXQgcnVuRXh0ZW5zaW9uQ29tbWFuZChhcmdzLCBhcmdzLnN1YmNvbW1hbmQpO1xuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9XG5cbiAgaWYgKGFyZ3MubG9nRmlsdGVycykge1xuICAgIGNvbnN0IHtpc3N1ZXMsIHJ1bGVzfSA9IGF3YWl0IGxvZ0ZhY3RvcnkubG9hZFNlY3VyZVZhbHVlc1ByZXByb2Nlc3NpbmdSdWxlcyhhcmdzLmxvZ0ZpbHRlcnMpO1xuICAgIGlmICghXy5pc0VtcHR5KGlzc3VlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGxvZyBmaWx0ZXJpbmcgcnVsZXMgY29uZmlnICcke2FyZ3MubG9nRmlsdGVyc30nIGhhcyBpc3N1ZXM6IGAgK1xuICAgICAgICBKU09OLnN0cmluZ2lmeShpc3N1ZXMsIG51bGwsIDIpKTtcbiAgICB9XG4gICAgaWYgKF8uaXNFbXB0eShydWxlcykpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBGb3VuZCBubyBsb2cgZmlsdGVyaW5nIHJ1bGVzIGluICcke2FyZ3MubG9nRmlsdGVyc30nLiBJcyB0aGF0IGV4cGVjdGVkP2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIuaW5mbyhgTG9hZGVkICR7dXRpbC5wbHVyYWxpemUoJ2ZpbHRlcmluZyBydWxlJywgcnVsZXMubGVuZ3RoLCB0cnVlKX0gZnJvbSAnJHthcmdzLmxvZ0ZpbHRlcnN9J2ApO1xuICAgIH1cbiAgfVxuXG4gIGxldCBhcHBpdW1Ecml2ZXIgPSBuZXcgQXBwaXVtRHJpdmVyKGFyZ3MpO1xuICBjb25zdCBkcml2ZXJDb25maWcgPSBuZXcgRHJpdmVyQ29uZmlnKGFyZ3MuYXBwaXVtSG9tZSk7XG4gIGNvbnN0IHBsdWdpbkNvbmZpZyA9IG5ldyBQbHVnaW5Db25maWcoYXJncy5hcHBpdW1Ib21lKTtcbiAgYXBwaXVtRHJpdmVyLmRyaXZlckNvbmZpZyA9IGRyaXZlckNvbmZpZztcbiAgYXdhaXQgcHJlZmxpZ2h0Q2hlY2tzKHtwYXJzZXIsIGFyZ3MsIGRyaXZlckNvbmZpZywgcGx1Z2luQ29uZmlnLCB0aHJvd0luc3RlYWRPZkV4aXR9KTtcbiAgYXdhaXQgbG9nU3RhcnR1cEluZm8ocGFyc2VyLCBhcmdzKTtcbiAgbGV0IHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiA9IG1ha2VSb3V0ZXIoYXBwaXVtRHJpdmVyKTtcblxuICAvLyBmaW5kIGFueSBwbHVnaW4gbmFtZSB3aGljaCBoYXMgYmVlbiBpbnN0YWxsZWQsIGFuZCB3aGljaCBoYXMgYmVlbiByZXF1ZXN0ZWQgZm9yIGFjdGl2YXRpb24gYnlcbiAgLy8gdXNpbmcgdGhlIC0tcGx1Z2lucyBmbGFnLCBhbmQgdHVybiBlYWNoIG9uZSBpbnRvIGFuIGluc3RhbnRpYXRlZCBwbHVnaW4gb2JqZWN0LCBzbyB3ZSBjYW4gc2VuZFxuICAvLyB0aGVtIGFzIG9iamVjdHMgdG8gdGhlIHNlcnZlciBpbml0LiB3ZSBhbHNvIHdhbnQgdG8gc2VuZC9hc3NpZ24gdGhlbSB0byB0aGUgdW1icmVsbGEgZHJpdmVyIHNvXG4gIC8vIGl0IGNhbiB1c2UgdGhlbSB0byB3cmFwIGNvbW1hbmQgZXhlY3V0aW9uXG4gIGNvbnN0IHBsdWdpbnMgPSBPYmplY3Qua2V5cyhwbHVnaW5Db25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucykuZmlsdGVyKChwbHVnaW5OYW1lKSA9PlxuICAgIF8uaW5jbHVkZXMoYXJncy5wbHVnaW5zLCBwbHVnaW5OYW1lKSB8fFxuICAgIChhcmdzLnBsdWdpbnMubGVuZ3RoID09PSAxICYmIGFyZ3MucGx1Z2luc1swXSA9PT0gVVNFX0FMTF9QTFVHSU5TKVxuICApLm1hcCgocGx1Z2luTmFtZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBQbHVnaW5DbGFzcyA9IHBsdWdpbkNvbmZpZy5yZXF1aXJlKHBsdWdpbk5hbWUpO1xuICAgICAgcmV0dXJuIG5ldyBQbHVnaW5DbGFzcyhwbHVnaW5OYW1lKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgQ291bGQgbm90IGxvYWQgcGx1Z2luICcke3BsdWdpbk5hbWV9Jywgc28gaXQgd2lsbCBub3QgYmUgYXZhaWxhYmxlLiBFcnJvciBgICtcbiAgICAgICAgICAgICAgICAgICBgaW4gbG9hZGluZyB0aGUgcGx1Z2luIHdhczogJHtlcnJ9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KS5maWx0ZXIoQm9vbGVhbik7XG4gIGFwcGl1bURyaXZlci5wbHVnaW5zID0gcGx1Z2lucztcblxuICBsZXQgc2VydmVyID0gYXdhaXQgYmFzZVNlcnZlcih7XG4gICAgcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uLFxuICAgIHBvcnQ6IGFyZ3MucG9ydCxcbiAgICBob3N0bmFtZTogYXJncy5hZGRyZXNzLFxuICAgIGFsbG93Q29yczogYXJncy5hbGxvd0NvcnMsXG4gICAgYmFzZVBhdGg6IGFyZ3MuYmFzZVBhdGgsXG4gICAgcGx1Z2lucyxcbiAgfSk7XG4gIGlmIChhcmdzLmFsbG93Q29ycykge1xuICAgIGxvZ2dlci53YXJuKCdZb3UgaGF2ZSBlbmFibGVkIENPUlMgcmVxdWVzdHMgZnJvbSBhbnkgaG9zdC4gQmUgY2FyZWZ1bCBub3QgJyArXG4gICAgICAgICAgICAgICAgJ3RvIHZpc2l0IHNpdGVzIHdoaWNoIGNvdWxkIG1hbGljaW91c2x5IHRyeSB0byBzdGFydCBBcHBpdW0gJyArXG4gICAgICAgICAgICAgICAgJ3Nlc3Npb25zIG9uIHlvdXIgbWFjaGluZScpO1xuICB9XG4gIGFwcGl1bURyaXZlci5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gIHRyeSB7XG4gICAgLy8gVE9ETyBwcmVsYXVuY2ggaWYgYXJncy5sYXVuY2ggaXMgc2V0XG4gICAgLy8gVE9ETzogc3RhcnRBbGVydFNvY2tldChzZXJ2ZXIsIGFwcGl1bVNlcnZlcik7XG5cbiAgICAvLyBjb25maWd1cmUgYXMgbm9kZSBvbiBncmlkLCBpZiBuZWNlc3NhcnlcbiAgICBpZiAoYXJncy5ub2RlY29uZmlnICE9PSBudWxsKSB7XG4gICAgICBhd2FpdCByZWdpc3Rlck5vZGUoYXJncy5ub2RlY29uZmlnLCBhcmdzLmFkZHJlc3MsIGFyZ3MucG9ydCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBhd2FpdCBzZXJ2ZXIuY2xvc2UoKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJ10pIHtcbiAgICBwcm9jZXNzLm9uY2Uoc2lnbmFsLCBhc3luYyBmdW5jdGlvbiBvblNpZ25hbCAoKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgUmVjZWl2ZWQgJHtzaWduYWx9IC0gc2h1dHRpbmcgZG93bmApO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgYXBwaXVtRHJpdmVyLmRlbGV0ZUFsbFNlc3Npb25zKHtcbiAgICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgICAgICByZWFzb246IGBUaGUgcHJvY2VzcyBoYXMgcmVjZWl2ZWQgJHtzaWduYWx9IHNpZ25hbGAsXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIud2FybihlKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbG9nU2VydmVyUG9ydChhcmdzLmFkZHJlc3MsIGFyZ3MucG9ydCk7XG4gIGRyaXZlckNvbmZpZy5wcmludCgpO1xuICBwbHVnaW5Db25maWcucHJpbnQocGx1Z2lucyk7XG5cbiAgcmV0dXJuIHNlcnZlcjtcbn1cblxuaWYgKHJlcXVpcmUubWFpbiA9PT0gbW9kdWxlKSB7XG4gIGFzeW5jaWZ5KG1haW4pO1xufVxuXG5leHBvcnQgeyBtYWluIH07XG4iXSwiZmlsZSI6ImxpYi9tYWluLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
362
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9tYWluLmpzIl0sIm5hbWVzIjpbInByZWZsaWdodENoZWNrcyIsImFyZ3MiLCJ0aHJvd0luc3RlYWRPZkV4aXQiLCJsb25nU3RhY2t0cmFjZSIsInJlcXVpcmUiLCJhc3luY190cmFjZV9saW1pdCIsInNob3dDb25maWciLCJwcm9jZXNzIiwiZXhpdCIsInRtcERpciIsImVyciIsImxvZ2dlciIsImVycm9yIiwibWVzc2FnZSIsInJlZCIsImxvZ05vbkRlZmF1bHRBcmdzV2FybmluZyIsImluZm8iLCJsb2dEZWZhdWx0Q2FwYWJpbGl0aWVzV2FybmluZyIsImNhcHMiLCJsb2dTdGFydHVwSW5mbyIsInBhcnNlciIsIndlbGNvbWUiLCJBUFBJVU1fVkVSIiwiYXBwaXVtUmV2Iiwic2hvd0FyZ3MiLCJfIiwic2l6ZSIsImlzRW1wdHkiLCJkZWZhdWx0Q2FwYWJpbGl0aWVzIiwibG9nU2VydmVyUG9ydCIsImFkZHJlc3MiLCJwb3J0IiwibG9nTWVzc2FnZSIsImdldEFjdGl2ZVBsdWdpbnMiLCJwbHVnaW5Db25maWciLCJjb21wYWN0IiwiT2JqZWN0Iiwia2V5cyIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJmaWx0ZXIiLCJwbHVnaW5OYW1lIiwiaW5jbHVkZXMiLCJ1c2VQbHVnaW5zIiwibGVuZ3RoIiwiVVNFX0FMTF9QTFVHSU5TIiwibWFwIiwiUGx1Z2luQ2xhc3MiLCJkZWJ1ZyIsInN0YWNrIiwiZ2V0QWN0aXZlRHJpdmVycyIsImRyaXZlckNvbmZpZyIsImRyaXZlck5hbWUiLCJ1c2VEcml2ZXJzIiwiZ2V0U2VydmVyVXBkYXRlcnMiLCJkcml2ZXJDbGFzc2VzIiwicGx1Z2luQ2xhc3NlcyIsImtsYXNzIiwidXBkYXRlU2VydmVyIiwiQm9vbGVhbiIsImdldEV4dHJhTWV0aG9kTWFwIiwicmVkdWNlIiwibmV3TWV0aG9kTWFwIiwiaW5pdCIsInBhcnNlZEFyZ3MiLCJzdWJjb21tYW5kIiwiU0VSVkVSX1NVQkNPTU1BTkQiLCJwYXJzZUFyZ3MiLCJjb25maWdSZXN1bHQiLCJjb25maWdGaWxlIiwiZXJyb3JzIiwiRXJyb3IiLCJmaWxlcGF0aCIsInJlYXNvbiIsImRlZmF1bHRzRGVlcCIsImNvbmZpZyIsInNlcnZlciIsIkRSSVZFUl9UWVBFIiwiUExVR0lOX1RZUEUiLCJsb2dGaWx0ZXJzIiwiaXNzdWVzIiwicnVsZXMiLCJsb2dGYWN0b3J5IiwibG9hZFNlY3VyZVZhbHVlc1ByZXByb2Nlc3NpbmdSdWxlcyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ3YXJuIiwidXRpbCIsInBsdXJhbGl6ZSIsImFwcGl1bURyaXZlciIsIkFwcGl1bURyaXZlciIsIm1haW4iLCJyb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24iLCJzZXJ2ZXJVcGRhdGVycyIsImV4dHJhTWV0aG9kTWFwIiwic2VydmVyT3B0cyIsImhvc3RuYW1lIiwiYWxsb3dDb3JzIiwiYmFzZVBhdGgiLCJrZWVwQWxpdmVUaW1lb3V0Iiwibm9kZWNvbmZpZyIsImNsb3NlIiwic2lnbmFsIiwib25jZSIsIm9uU2lnbmFsIiwiZGVsZXRlQWxsU2Vzc2lvbnMiLCJmb3JjZSIsImUiLCJwcmludCIsInAiLCJtb2R1bGUiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7OztBQU9BLGVBQWVBLGVBQWYsQ0FBZ0NDLElBQWhDLEVBQXNDQyxrQkFBa0IsR0FBRyxLQUEzRCxFQUFrRTtBQUNoRSxNQUFJO0FBQ0Y7O0FBQ0EsUUFBSUQsSUFBSSxDQUFDRSxjQUFULEVBQXlCO0FBQ3ZCQyxNQUFBQSxPQUFPLENBQUMsVUFBRCxDQUFQLENBQW9CQyxpQkFBcEIsR0FBd0MsQ0FBQyxDQUF6QztBQUNEOztBQUNELFFBQUlKLElBQUksQ0FBQ0ssVUFBVCxFQUFxQjtBQUNuQixZQUFNLHlC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RixJQUFSLEtBQWlCbUIsTUFBckIsRUFBNkI7QUFDM0IsMEJBQVNuQixJQUFUO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbi8vIHRyYW5zcGlsZTptYWluXG4vLyBAdHMtY2hlY2tcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uIGFzIG1ha2VSb3V0ZXIsIHNlcnZlciBhcyBiYXNlU2VydmVyIH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyBsb2dnZXIgYXMgbG9nRmFjdG9yeSwgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBhc3luY2lmeSB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBBcHBpdW1Ecml2ZXIgfSBmcm9tICcuL2FwcGl1bSc7XG5pbXBvcnQgeyBkcml2ZXJDb25maWcsIHBsdWdpbkNvbmZpZywgVVNFX0FMTF9QTFVHSU5TIH0gZnJvbSAnLi9jbGkvYXJncyc7XG5pbXBvcnQgeyBydW5FeHRlbnNpb25Db21tYW5kIH0gZnJvbSAnLi9jbGkvZXh0ZW5zaW9uJztcbmltcG9ydCB7IGRlZmF1bHQgYXMgZ2V0UGFyc2VyLCBTRVJWRVJfU1VCQ09NTUFORCB9IGZyb20gJy4vY2xpL3BhcnNlcic7XG5pbXBvcnQgeyBBUFBJVU1fVkVSLCBjaGVja05vZGVPaywgZ2V0R2l0UmV2LCBnZXROb25EZWZhdWx0U2VydmVyQXJncywgc2hvd0NvbmZpZywgdmFsaWRhdGVUbXBEaXIsIHdhcm5Ob2RlRGVwcmVjYXRpb25zIH0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHsgcmVhZENvbmZpZ0ZpbGUgfSBmcm9tICcuL2NvbmZpZy1maWxlJztcbmltcG9ydCB7IERSSVZFUl9UWVBFLCBQTFVHSU5fVFlQRSB9IGZyb20gJy4vZXh0ZW5zaW9uLWNvbmZpZyc7XG5pbXBvcnQgcmVnaXN0ZXJOb2RlIGZyb20gJy4vZ3JpZC1yZWdpc3Rlcic7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJzsgLy8gbG9nZ2VyIG5lZWRzIHRvIHJlbWFpbiBmaXJzdCBvZiBpbXBvcnRzXG5pbXBvcnQgeyBpbml0IGFzIGxvZ3NpbmtJbml0IH0gZnJvbSAnLi9sb2dzaW5rJztcbmltcG9ydCB7IGdldERlZmF1bHRzRnJvbVNjaGVtYSwgdmFsaWRhdGUgfSBmcm9tICcuL3NjaGVtYS9zY2hlbWEnO1xuaW1wb3J0IHsgaW5zcGVjdE9iamVjdCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge1BhcnNlZEFyZ3N9IGFyZ3NcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Rocm93SW5zdGVhZE9mRXhpdF1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJlZmxpZ2h0Q2hlY2tzIChhcmdzLCB0aHJvd0luc3RlYWRPZkV4aXQgPSBmYWxzZSkge1xuICB0cnkge1xuICAgIGNoZWNrTm9kZU9rKCk7XG4gICAgaWYgKGFyZ3MubG9uZ1N0YWNrdHJhY2UpIHtcbiAgICAgIHJlcXVpcmUoJ2xvbmdqb2huJykuYXN5bmNfdHJhY2VfbGltaXQgPSAtMTtcbiAgICB9XG4gICAgaWYgKGFyZ3Muc2hvd0NvbmZpZykge1xuICAgICAgYXdhaXQgc2hvd0NvbmZpZygpO1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH1cbiAgICB3YXJuTm9kZURlcHJlY2F0aW9ucygpO1xuXG4gICAgdmFsaWRhdGUoYXJncyk7XG5cbiAgICBpZiAoYXJncy50bXBEaXIpIHtcbiAgICAgIGF3YWl0IHZhbGlkYXRlVG1wRGlyKGFyZ3MudG1wRGlyKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5lcnJvcihlcnIubWVzc2FnZS5yZWQpO1xuICAgIGlmICh0aHJvd0luc3RlYWRPZkV4aXQpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbG9nTm9uRGVmYXVsdEFyZ3NXYXJuaW5nIChhcmdzKSB7XG4gIGxvZ2dlci5pbmZvKCdOb24tZGVmYXVsdCBzZXJ2ZXIgYXJnczonKTtcbiAgaW5zcGVjdE9iamVjdChhcmdzKTtcbn1cblxuZnVuY3Rpb24gbG9nRGVmYXVsdENhcGFiaWxpdGllc1dhcm5pbmcgKGNhcHMpIHtcbiAgbG9nZ2VyLmluZm8oJ0RlZmF1bHQgY2FwYWJpbGl0aWVzLCB3aGljaCB3aWxsIGJlIGFkZGVkIHRvIGVhY2ggcmVxdWVzdCAnICtcbiAgICAgICAgICAgICAgJ3VubGVzcyBvdmVycmlkZGVuIGJ5IGRlc2lyZWQgY2FwYWJpbGl0aWVzOicpO1xuICBpbnNwZWN0T2JqZWN0KGNhcHMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsb2dTdGFydHVwSW5mbyAocGFyc2VyLCBhcmdzKSB7XG4gIGxldCB3ZWxjb21lID0gYFdlbGNvbWUgdG8gQXBwaXVtIHYke0FQUElVTV9WRVJ9YDtcbiAgbGV0IGFwcGl1bVJldiA9IGF3YWl0IGdldEdpdFJldigpO1xuICBpZiAoYXBwaXVtUmV2KSB7XG4gICAgd2VsY29tZSArPSBgIChSRVYgJHthcHBpdW1SZXZ9KWA7XG4gIH1cbiAgbG9nZ2VyLmluZm8od2VsY29tZSk7XG5cbiAgbGV0IHNob3dBcmdzID0gZ2V0Tm9uRGVmYXVsdFNlcnZlckFyZ3MocGFyc2VyLCBhcmdzKTtcbiAgaWYgKF8uc2l6ZShzaG93QXJncykpIHtcbiAgICBsb2dOb25EZWZhdWx0QXJnc1dhcm5pbmcoc2hvd0FyZ3MpO1xuICB9XG4gIGlmICghXy5pc0VtcHR5KGFyZ3MuZGVmYXVsdENhcGFiaWxpdGllcykpIHtcbiAgICBsb2dEZWZhdWx0Q2FwYWJpbGl0aWVzV2FybmluZyhhcmdzLmRlZmF1bHRDYXBhYmlsaXRpZXMpO1xuICB9XG4gIC8vIFRPRE86IGJyaW5nIGJhY2sgbG9nbGV2ZWwgcmVwb3J0aW5nIGJlbG93IG9uY2UgbG9nZ2VyIGlzIGZsdXNoZWQgb3V0XG4gIC8vIGxvZ2dlci5pbmZvKCdDb25zb2xlIExvZ0xldmVsOiAnICsgbG9nZ2VyLnRyYW5zcG9ydHMuY29uc29sZS5sZXZlbCk7XG4gIC8vIGlmIChsb2dnZXIudHJhbnNwb3J0cy5maWxlKSB7XG4gIC8vICAgbG9nZ2VyLmluZm8oJ0ZpbGUgTG9nTGV2ZWw6ICcgKyBsb2dnZXIudHJhbnNwb3J0cy5maWxlLmxldmVsKTtcbiAgLy8gfVxufVxuXG5mdW5jdGlvbiBsb2dTZXJ2ZXJQb3J0IChhZGRyZXNzLCBwb3J0KSB7XG4gIGxldCBsb2dNZXNzYWdlID0gYEFwcGl1bSBSRVNUIGh0dHAgaW50ZXJmYWNlIGxpc3RlbmVyIHN0YXJ0ZWQgb24gYCArXG4gICAgICAgICAgICAgICAgICAgYCR7YWRkcmVzc306JHtwb3J0fWA7XG4gIGxvZ2dlci5pbmZvKGxvZ01lc3NhZ2UpO1xufVxuXG4vKipcbiAqIEZpbmQgYW55IHBsdWdpbiBuYW1lIHdoaWNoIGhhcyBiZWVuIGluc3RhbGxlZCwgYW5kIHdoaWNoIGhhcyBiZWVuIHJlcXVlc3RlZCBmb3IgYWN0aXZhdGlvbiBieVxuICogdXNpbmcgdGhlIC0tdXNlLXBsdWdpbnMgZmxhZywgYW5kIHR1cm4gZWFjaCBvbmUgaW50byBpdHMgY2xhc3MsIHNvIHdlIGNhbiBzZW5kIHRoZW0gYXMgb2JqZWN0c1xuICogdG8gdGhlIHNlcnZlciBpbml0LiBXZSBhbHNvIHdhbnQgdG8gc2VuZC9hc3NpZ24gdGhlbSB0byB0aGUgdW1icmVsbGEgZHJpdmVyIHNvIGl0IGNhbiB1c2UgdGhlbVxuICogdG8gd3JhcCBjb21tYW5kIGV4ZWN1dGlvblxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzIC0gYXJncGFyc2VyIHBhcnNlZCBkaWN0XG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9wbHVnaW4tY29uZmlnJykuZGVmYXVsdH0gcGx1Z2luQ29uZmlnIC0gYSBwbHVnaW4gZXh0ZW5zaW9uIGNvbmZpZ1xuICogQHJldHVybnMgeyh7cGx1Z2luTmFtZTogc3RyaW5nfSAmICgoLi4uYXJnczogYW55W10pID0+IHVua25vd24pKVtdfVxuICovXG5mdW5jdGlvbiBnZXRBY3RpdmVQbHVnaW5zIChhcmdzLCBwbHVnaW5Db25maWcpIHtcbiAgcmV0dXJuIF8uY29tcGFjdChPYmplY3Qua2V5cyhwbHVnaW5Db25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucykuZmlsdGVyKChwbHVnaW5OYW1lKSA9PlxuICAgIF8uaW5jbHVkZXMoYXJncy51c2VQbHVnaW5zLCBwbHVnaW5OYW1lKSB8fFxuICAgIChhcmdzLnVzZVBsdWdpbnMubGVuZ3RoID09PSAxICYmIGFyZ3MudXNlUGx1Z2luc1swXSA9PT0gVVNFX0FMTF9QTFVHSU5TKVxuICApLm1hcCgocGx1Z2luTmFtZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBsb2dnZXIuaW5mbyhgQXR0ZW1wdGluZyB0byBsb2FkIHBsdWdpbiAke3BsdWdpbk5hbWV9Li4uYCk7XG4gICAgICBjb25zdCBQbHVnaW5DbGFzcyA9IC8qKiBAdHlwZSB7e3BsdWdpbk5hbWU6IHN0cmluZ30gJiAoKC4uLmFyZ3M6IGFueVtdKSA9PiB1bmtub3duKX0gKi8ocGx1Z2luQ29uZmlnLnJlcXVpcmUocGx1Z2luTmFtZSkpO1xuXG4gICAgICBQbHVnaW5DbGFzcy5wbHVnaW5OYW1lID0gcGx1Z2luTmFtZTsgLy8gc3RvcmUgdGhlIHBsdWdpbiBuYW1lIG9uIHRoZSBjbGFzcyBzbyBpdCBjYW4gYmUgdXNlZCBsYXRlclxuICAgICAgcmV0dXJuIFBsdWdpbkNsYXNzO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBDb3VsZCBub3QgbG9hZCBwbHVnaW4gJyR7cGx1Z2luTmFtZX0nLCBzbyBpdCB3aWxsIG5vdCBiZSBhdmFpbGFibGUuIEVycm9yIGAgK1xuICAgICAgICAgICAgICAgICAgIGBpbiBsb2FkaW5nIHRoZSBwbHVnaW4gd2FzOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgbG9nZ2VyLmRlYnVnKGVyci5zdGFjayk7XG4gICAgfVxuICB9KSk7XG59XG5cbi8qKlxuICogRmluZCBhbnkgZHJpdmVyIG5hbWUgd2hpY2ggaGFzIGJlZW4gaW5zdGFsbGVkLCBhbmQgdHVybiBlYWNoIG9uZSBpbnRvIGl0cyBjbGFzcywgc28gd2UgY2FuIHNlbmRcbiAqIHRoZW0gYXMgb2JqZWN0cyB0byB0aGUgc2VydmVyIGluaXQgaW4gY2FzZSB0aGV5IG5lZWQgdG8gYWRkIG1ldGhvZHMvcm91dGVzIG9yIHVwZGF0ZSB0aGUgc2VydmVyLlxuICogSWYgdGhlIC0tZHJpdmVycyBmbGFnIHdhcyBnaXZlbiwgdGhpcyBtZXRob2Qgb25seSBsb2FkcyB0aGUgZ2l2ZW4gZHJpdmVycy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYXJncyAtIGFyZ3BhcnNlciBwYXJzZWQgZGljdFxuICogQHBhcmFtIHtpbXBvcnQoJy4vZHJpdmVyLWNvbmZpZycpLmRlZmF1bHR9IGRyaXZlckNvbmZpZyAtIGEgZHJpdmVyIGV4dGVuc2lvbiBjb25maWdcbiAqL1xuZnVuY3Rpb24gZ2V0QWN0aXZlRHJpdmVycyAoYXJncywgZHJpdmVyQ29uZmlnKSB7XG4gIHJldHVybiBfLmNvbXBhY3QoT2JqZWN0LmtleXMoZHJpdmVyQ29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnMpLmZpbHRlcigoZHJpdmVyTmFtZSkgPT5cbiAgICBfLmluY2x1ZGVzKGFyZ3MudXNlRHJpdmVycywgZHJpdmVyTmFtZSkgfHwgYXJncy51c2VEcml2ZXJzLmxlbmd0aCA9PT0gMFxuICApLm1hcCgoZHJpdmVyTmFtZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBsb2dnZXIuaW5mbyhgQXR0ZW1wdGluZyB0byBsb2FkIGRyaXZlciAke2RyaXZlck5hbWV9Li4uYCk7XG4gICAgICByZXR1cm4gZHJpdmVyQ29uZmlnLnJlcXVpcmUoZHJpdmVyTmFtZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYENvdWxkIG5vdCBsb2FkIGRyaXZlciAnJHtkcml2ZXJOYW1lfScsIHNvIGl0IHdpbGwgbm90IGJlIGF2YWlsYWJsZS4gRXJyb3IgYCArXG4gICAgICAgICAgICAgICAgICAgYGluIGxvYWRpbmcgdGhlIGRyaXZlciB3YXM6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICBsb2dnZXIuZGVidWcoZXJyLnN0YWNrKTtcbiAgICB9XG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gZ2V0U2VydmVyVXBkYXRlcnMgKGRyaXZlckNsYXNzZXMsIHBsdWdpbkNsYXNzZXMpIHtcbiAgcmV0dXJuIFsuLi5kcml2ZXJDbGFzc2VzLCAuLi5wbHVnaW5DbGFzc2VzXS5tYXAoKGtsYXNzKSA9PiBrbGFzcy51cGRhdGVTZXJ2ZXIpLmZpbHRlcihCb29sZWFuKTtcbn1cblxuZnVuY3Rpb24gZ2V0RXh0cmFNZXRob2RNYXAgKGRyaXZlckNsYXNzZXMsIHBsdWdpbkNsYXNzZXMpIHtcbiAgcmV0dXJuIFsuLi5kcml2ZXJDbGFzc2VzLCAuLi5wbHVnaW5DbGFzc2VzXS5yZWR1Y2UoXG4gICAgKG1hcCwga2xhc3MpID0+ICh7Li4ubWFwLCAuLi5rbGFzcy5uZXdNZXRob2RNYXB9KSxcbiAgICB7fVxuICApO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIEFwcGl1bSwgYnV0IGRvZXMgbm90IHN0YXJ0IHRoZSBzZXJ2ZXIuXG4gKlxuICogVXNlIHRoaXMgdG8gZ2V0IGF0IHRoZSBjb25maWd1cmF0aW9uIHNjaGVtYS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHtpbml0LCBnZXRTY2hlbWF9IGZyb20gJ2FwcGl1bSc7XG4gKiBjb25zdCBvcHRpb25zID0ge307IC8vIGNvbmZpZyBvYmplY3RcbiAqIGF3YWl0IGluaXQob3B0aW9ucyk7XG4gKiBjb25zdCBzY2hlbWEgPSBnZXRTY2hlbWEoKTsgLy8gZW50aXJlIGNvbmZpZyBzY2hlbWEgaW5jbHVkaW5nIHBsdWdpbnMgYW5kIGRyaXZlcnNcbiAqIEBwYXJhbSB7UGFyc2VkQXJnc30gW2FyZ3NdIC0gUGFyc2VkIGFyZ3NcbiAqIEByZXR1cm5zIHtQcm9taXNlPHtwYXJzZXI6IGltcG9ydCgnLi9jbGkvcGFyc2VyJykuQXJnUGFyc2VyfSAmIFBhcnRpYWw8e2FwcGl1bURyaXZlcjogQXBwaXVtRHJpdmVyLCBwYXJzZWRBcmdzOiBQYXJzZWRBcmdzfT4+fVxuICovXG5hc3luYyBmdW5jdGlvbiBpbml0IChhcmdzKSB7XG4gIGNvbnN0IHBhcnNlciA9IGF3YWl0IGdldFBhcnNlcigpO1xuICBsZXQgdGhyb3dJbnN0ZWFkT2ZFeGl0ID0gZmFsc2U7XG4gIC8qKiBAdHlwZSB7UGFyc2VkQXJnc30gKi9cbiAgbGV0IHBhcnNlZEFyZ3M7XG4gIGlmIChhcmdzKSB7XG4gICAgLy8gaWYgd2UgaGF2ZSBhIGNvbnRhaW5pbmcgcGFja2FnZSBpbnN0ZWFkIG9mIHJ1bm5pbmcgYXMgYSBDTEkgcHJvY2VzcyxcbiAgICAvLyB0aGF0IHBhY2thZ2UgbWlnaHQgbm90IGFwcHJlY2lhdGUgdXMgY2FsbGluZyAncHJvY2Vzcy5leGl0JyB3aWxseS1cbiAgICAvLyBuaWxseSwgc28gZ2l2ZSBpdCB0aGUgb3B0aW9uIHRvIGhhdmUgdXMgdGhyb3cgaW5zdGVhZCBvZiBleGl0XG4gICAgaWYgKGFyZ3MudGhyb3dJbnN0ZWFkT2ZFeGl0KSB7XG4gICAgICB0aHJvd0luc3RlYWRPZkV4aXQgPSB0cnVlO1xuICAgICAgLy8gYnV0IHJlbW92ZSBpdCBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgc2VydmVyIGFyZyBwZXIgc2VcbiAgICAgIGRlbGV0ZSBhcmdzLnRocm93SW5zdGVhZE9mRXhpdDtcbiAgICB9XG4gICAgcGFyc2VkQXJncyA9IHsuLi5hcmdzLCBzdWJjb21tYW5kOiBhcmdzLnN1YmNvbW1hbmQgPz8gU0VSVkVSX1NVQkNPTU1BTkR9O1xuICB9IGVsc2Uge1xuICAgIC8vIG90aGVyd2lzZSBwYXJzZSBmcm9tIENMSVxuICAgIHBhcnNlZEFyZ3MgPSBwYXJzZXIucGFyc2VBcmdzKCk7XG4gIH1cblxuICBjb25zdCBjb25maWdSZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZShwYXJzZWRBcmdzLmNvbmZpZ0ZpbGUpO1xuXG4gIGlmICghXy5pc0VtcHR5KGNvbmZpZ1Jlc3VsdC5lcnJvcnMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvcnMgaW4gY29uZmlnIGZpbGUgJHtjb25maWdSZXN1bHQuZmlsZXBhdGh9OlxcbiAke2NvbmZpZ1Jlc3VsdC5yZWFzb24gPz8gY29uZmlnUmVzdWx0LmVycm9yc31gKTtcbiAgfVxuXG4gIC8vIG1lcmdlIGNvbmZpZyBhbmQgYXBwbHkgZGVmYXVsdHMuXG4gIC8vIHRoZSBvcmRlciBvZiBwcmVjZW5kZWNlIGlzOlxuICAvLyAxLiBjb21tYW5kIGxpbmUgYXJnc1xuICAvLyAyLiBjb25maWcgZmlsZVxuICAvLyAzLiBkZWZhdWx0cyBmcm9tIGNvbmZpZyBmaWxlLlxuICBpZiAocGFyc2VkQXJncy5zdWJjb21tYW5kID09PSBTRVJWRVJfU1VCQ09NTUFORCkge1xuICAgIHBhcnNlZEFyZ3MgPSBfLmRlZmF1bHRzRGVlcChcbiAgICAgIHBhcnNlZEFyZ3MsXG4gICAgICBjb25maWdSZXN1bHQuY29uZmlnPy5zZXJ2ZXIsXG4gICAgICBnZXREZWZhdWx0c0Zyb21TY2hlbWEoKVxuICAgICk7XG4gIH1cblxuICBwYXJzZWRBcmdzID0gXy5kZWZhdWx0c0RlZXAoXG4gICAgcGFyc2VkQXJncyxcbiAgICBjb25maWdSZXN1bHQuY29uZmlnID8/IHt9LFxuICApO1xuXG4gIGF3YWl0IGxvZ3NpbmtJbml0KHBhcnNlZEFyZ3MpO1xuXG4gIC8vIGlmIHRoZSB1c2VyIGhhcyByZXF1ZXN0ZWQgdGhlICdkcml2ZXInIENMSSwgZG9uJ3QgcnVuIHRoZSBub3JtYWwgc2VydmVyLFxuICAvLyBidXQgaW5zdGVhZCBwYXNzIGNvbnRyb2wgdG8gdGhlIGRyaXZlciBDTElcbiAgaWYgKHBhcnNlZEFyZ3Muc3ViY29tbWFuZCA9PT0gRFJJVkVSX1RZUEUpIHtcbiAgICBhd2FpdCBydW5FeHRlbnNpb25Db21tYW5kKHBhcnNlZEFyZ3MsIHBhcnNlZEFyZ3Muc3ViY29tbWFuZCwgZHJpdmVyQ29uZmlnKTtcbiAgICByZXR1cm4ge3BhcnNlcn07XG4gIH1cbiAgaWYgKHBhcnNlZEFyZ3Muc3ViY29tbWFuZCA9PT0gUExVR0lOX1RZUEUpIHtcbiAgICBhd2FpdCBydW5FeHRlbnNpb25Db21tYW5kKHBhcnNlZEFyZ3MsIHBhcnNlZEFyZ3Muc3ViY29tbWFuZCwgcGx1Z2luQ29uZmlnKTtcbiAgICByZXR1cm4ge3BhcnNlcn07XG4gIH1cblxuICBpZiAocGFyc2VkQXJncy5sb2dGaWx0ZXJzKSB7XG4gICAgY29uc3Qge2lzc3VlcywgcnVsZXN9ID0gYXdhaXQgbG9nRmFjdG9yeS5sb2FkU2VjdXJlVmFsdWVzUHJlcHJvY2Vzc2luZ1J1bGVzKHBhcnNlZEFyZ3MubG9nRmlsdGVycyk7XG4gICAgaWYgKCFfLmlzRW1wdHkoaXNzdWVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgbG9nIGZpbHRlcmluZyBydWxlcyBjb25maWcgJyR7cGFyc2VkQXJncy5sb2dGaWx0ZXJzfScgaGFzIGlzc3VlczogYCArXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGlzc3VlcywgbnVsbCwgMikpO1xuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KHJ1bGVzKSkge1xuICAgICAgbG9nZ2VyLndhcm4oYEZvdW5kIG5vIGxvZyBmaWx0ZXJpbmcgcnVsZXMgaW4gJyR7cGFyc2VkQXJncy5sb2dGaWx0ZXJzfScuIElzIHRoYXQgZXhwZWN0ZWQ/YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBMb2FkZWQgJHt1dGlsLnBsdXJhbGl6ZSgnZmlsdGVyaW5nIHJ1bGUnLCBydWxlcy5sZW5ndGgsIHRydWUpfSBmcm9tICcke3BhcnNlZEFyZ3MubG9nRmlsdGVyc30nYCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYXBwaXVtRHJpdmVyID0gbmV3IEFwcGl1bURyaXZlcihwYXJzZWRBcmdzKTtcbiAgLy8gc2V0IHRoZSBjb25maWcgb24gdGhlIHVtYnJlbGxhIGRyaXZlciBzbyBpdCBjYW4gbWF0Y2ggZHJpdmVycyB0byBjYXBzXG4gIGFwcGl1bURyaXZlci5kcml2ZXJDb25maWcgPSBkcml2ZXJDb25maWc7XG4gIGF3YWl0IHByZWZsaWdodENoZWNrcyhwYXJzZWRBcmdzLCB0aHJvd0luc3RlYWRPZkV4aXQpO1xuXG4gIHJldHVybiB7cGFyc2VyLCBhcHBpdW1Ecml2ZXIsIHBhcnNlZEFyZ3N9O1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge1BhcnNlZEFyZ3N9IFthcmdzXVxuICogQHJldHVybnNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbWFpbiAoYXJncykge1xuICBjb25zdCB7cGFyc2VyLCBhcHBpdW1Ecml2ZXIsIHBhcnNlZEFyZ3N9ID0gYXdhaXQgaW5pdChhcmdzKTtcblxuICBpZiAoIWFwcGl1bURyaXZlciB8fCAhcGFyc2VkQXJncykge1xuICAgIC8vIGlmIHRoaXMgYnJhbmNoIGlzIHRha2VuLCB3ZSd2ZSBydW4gYSBkaWZmZXJlbnQgc3ViY29tbWFuZCwgc28gdGhlcmUncyBub3RoaW5nXG4gICAgLy8gbGVmdCB0byBkbyBoZXJlLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBsdWdpbkNsYXNzZXMgPSBnZXRBY3RpdmVQbHVnaW5zKHBhcnNlZEFyZ3MsIHBsdWdpbkNvbmZpZyk7XG4gIC8vIHNldCB0aGUgYWN0aXZlIHBsdWdpbnMgb24gdGhlIHVtYnJlbGxhIGRyaXZlciBzbyBpdCBjYW4gdXNlIHRoZW0gZm9yIGNvbW1hbmRzXG4gIGFwcGl1bURyaXZlci5wbHVnaW5DbGFzc2VzID0gcGx1Z2luQ2xhc3NlcztcblxuICBhd2FpdCBsb2dTdGFydHVwSW5mbyhwYXJzZXIsIHBhcnNlZEFyZ3MpO1xuICBsZXQgcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uID0gbWFrZVJvdXRlcihhcHBpdW1Ecml2ZXIpO1xuXG4gIGNvbnN0IGRyaXZlckNsYXNzZXMgPSBnZXRBY3RpdmVEcml2ZXJzKHBhcnNlZEFyZ3MsIGRyaXZlckNvbmZpZyk7XG4gIGNvbnN0IHNlcnZlclVwZGF0ZXJzID0gZ2V0U2VydmVyVXBkYXRlcnMoZHJpdmVyQ2xhc3NlcywgcGx1Z2luQ2xhc3Nlcyk7XG4gIGNvbnN0IGV4dHJhTWV0aG9kTWFwID0gZ2V0RXh0cmFNZXRob2RNYXAoZHJpdmVyQ2xhc3NlcywgcGx1Z2luQ2xhc3Nlcyk7XG5cbiAgY29uc3Qgc2VydmVyT3B0cyA9IHtcbiAgICByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24sXG4gICAgcG9ydDogcGFyc2VkQXJncy5wb3J0LFxuICAgIGhvc3RuYW1lOiBwYXJzZWRBcmdzLmFkZHJlc3MsXG4gICAgYWxsb3dDb3JzOiBwYXJzZWRBcmdzLmFsbG93Q29ycyxcbiAgICBiYXNlUGF0aDogcGFyc2VkQXJncy5iYXNlUGF0aCxcbiAgICBzZXJ2ZXJVcGRhdGVycyxcbiAgICBleHRyYU1ldGhvZE1hcCxcbiAgfTtcbiAgaWYgKHBhcnNlZEFyZ3Mua2VlcEFsaXZlVGltZW91dCkge1xuICAgIHNlcnZlck9wdHMua2VlcEFsaXZlVGltZW91dCA9IHBhcnNlZEFyZ3Mua2VlcEFsaXZlVGltZW91dCAqIDEwMDA7XG4gIH1cbiAgbGV0IHNlcnZlcjtcbiAgdHJ5IHtcbiAgICBzZXJ2ZXIgPSBhd2FpdCBiYXNlU2VydmVyKHNlcnZlck9wdHMpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZXJyb3IoYENvdWxkIG5vdCBjb25maWd1cmUgQXBwaXVtIHNlcnZlci4gSXQncyBwb3NzaWJsZSB0aGF0IGEgZHJpdmVyIG9yIHBsdWdpbiB0cmllZCBgICtcbiAgICAgICAgICAgICAgICAgYHRvIHVwZGF0ZSB0aGUgc2VydmVyIGFuZCBmYWlsZWQuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIGxvZ2dlci5kZWJ1ZyhlcnIuc3RhY2spO1xuICAgIHJldHVybiBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAocGFyc2VkQXJncy5hbGxvd0NvcnMpIHtcbiAgICBsb2dnZXIud2FybignWW91IGhhdmUgZW5hYmxlZCBDT1JTIHJlcXVlc3RzIGZyb20gYW55IGhvc3QuIEJlIGNhcmVmdWwgbm90ICcgK1xuICAgICAgICAgICAgICAgICd0byB2aXNpdCBzaXRlcyB3aGljaCBjb3VsZCBtYWxpY2lvdXNseSB0cnkgdG8gc3RhcnQgQXBwaXVtICcgK1xuICAgICAgICAgICAgICAgICdzZXNzaW9ucyBvbiB5b3VyIG1hY2hpbmUnKTtcbiAgfVxuICAvLyBAdHMtaWdub3JlXG4gIGFwcGl1bURyaXZlci5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gIHRyeSB7XG4gICAgLy8gY29uZmlndXJlIGFzIG5vZGUgb24gZ3JpZCwgaWYgbmVjZXNzYXJ5XG4gICAgLy8gZmFsc3kgdmFsdWVzIHNob3VsZCBub3QgY2F1c2UgdGhpcyB0byBydW5cbiAgICBpZiAocGFyc2VkQXJncy5ub2RlY29uZmlnKSB7XG4gICAgICBhd2FpdCByZWdpc3Rlck5vZGUocGFyc2VkQXJncy5ub2RlY29uZmlnLCBwYXJzZWRBcmdzLmFkZHJlc3MsIHBhcnNlZEFyZ3MucG9ydCwgcGFyc2VkQXJncy5iYXNlUGF0aCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBhd2FpdCBzZXJ2ZXIuY2xvc2UoKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJ10pIHtcbiAgICBwcm9jZXNzLm9uY2Uoc2lnbmFsLCBhc3luYyBmdW5jdGlvbiBvblNpZ25hbCAoKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgUmVjZWl2ZWQgJHtzaWduYWx9IC0gc2h1dHRpbmcgZG93bmApO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgYXBwaXVtRHJpdmVyLmRlbGV0ZUFsbFNlc3Npb25zKHtcbiAgICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgICAgICByZWFzb246IGBUaGUgcHJvY2VzcyBoYXMgcmVjZWl2ZWQgJHtzaWduYWx9IHNpZ25hbGAsXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIud2FybihlKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbG9nU2VydmVyUG9ydChwYXJzZWRBcmdzLmFkZHJlc3MsIHBhcnNlZEFyZ3MucG9ydCk7XG4gIGRyaXZlckNvbmZpZy5wcmludCgpO1xuICBwbHVnaW5Db25maWcucHJpbnQocGx1Z2luQ2xhc3Nlcy5tYXAoKHApID0+IHAucGx1Z2luTmFtZSkpO1xuXG4gIHJldHVybiBzZXJ2ZXI7XG59XG5cbi8vIE5PVEU6IHRoaXMgaXMgaGVyZSBmb3IgYmFja3dhcmRzIGNvbXBhdCBmb3IgYW55IHNjcmlwdHMgcmVmZXJlbmNpbmcgYG1haW4uanNgIGRpcmVjdGx5XG4vLyAobW9yZSBzcGVjaWZpY2FsbHksIGBidWlsZC9saWIvbWFpbi5qc2ApXG4vLyB0aGUgZXhlY3V0YWJsZSBpcyBub3cgYC4uL2luZGV4LmpzYCwgc28gdGhhdCBtb2R1bGUgd2lsbCB0eXBpY2FsbHkgYmUgYHJlcXVpcmUubWFpbmAuXG5pZiAocmVxdWlyZS5tYWluID09PSBtb2R1bGUpIHtcbiAgYXN5bmNpZnkobWFpbik7XG59XG5cbi8vIGV2ZXJ5dGhpbmcgYmVsb3cgaGVyZSBpcyBpbnRlbmRlZCB0byBiZSBhIHB1YmxpYyBBUEkuXG5leHBvcnQgeyBtYWluLCBpbml0IH07XG5leHBvcnQgeyBBUFBJVU1fSE9NRSB9IGZyb20gJy4vZXh0ZW5zaW9uLWNvbmZpZyc7XG5leHBvcnQgeyBnZXRTY2hlbWEsIHZhbGlkYXRlLCBmaW5hbGl6ZVNjaGVtYSB9IGZyb20gJy4vc2NoZW1hL3NjaGVtYSc7XG5leHBvcnQgeyByZWFkQ29uZmlnRmlsZSB9IGZyb20gJy4vY29uZmlnLWZpbGUnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL3R5cGVzL3R5cGVzJykuUGFyc2VkQXJnc30gUGFyc2VkQXJnc1xuICovXG4iXSwiZmlsZSI6ImxpYi9tYWluLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
@@ -1,7 +1,5 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
4
-
5
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
6
4
 
7
5
  Object.defineProperty(exports, "__esModule", {
@@ -9,17 +7,29 @@ Object.defineProperty(exports, "__esModule", {
9
7
  });
10
8
  exports.default = void 0;
11
9
 
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
12
  require("source-map-support/register");
13
13
 
14
14
  var _lodash = _interopRequireDefault(require("lodash"));
15
15
 
16
- var _extensionConfig = _interopRequireWildcard(require("./extension-config"));
16
+ var _extensionConfig = _interopRequireDefault(require("./extension-config"));
17
+
18
+ var _extConfigIo = require("./ext-config-io");
17
19
 
18
20
  var _logger = _interopRequireDefault(require("./logger"));
19
21
 
20
22
  class PluginConfig extends _extensionConfig.default {
21
- constructor(appiumHome, logFn = null) {
22
- super(appiumHome, _extensionConfig.PLUGIN_TYPE, logFn);
23
+ constructor(appiumHome, logFn) {
24
+ super(appiumHome, _extConfigIo.PLUGIN_TYPE, logFn);
25
+ }
26
+
27
+ static getInstance(appiumHome, logFn) {
28
+ var _PluginConfig$_instan;
29
+
30
+ const instance = (_PluginConfig$_instan = PluginConfig._instances[appiumHome]) !== null && _PluginConfig$_instan !== void 0 ? _PluginConfig$_instan : new PluginConfig(appiumHome, logFn);
31
+ PluginConfig._instances[appiumHome] = instance;
32
+ return instance;
23
33
  }
24
34
 
25
35
  extensionDesc(pluginName, {
@@ -28,9 +38,8 @@ class PluginConfig extends _extensionConfig.default {
28
38
  return `${pluginName}@${version}`;
29
39
  }
30
40
 
31
- print(activePlugins) {
41
+ print(activeNames) {
32
42
  const pluginNames = Object.keys(this.installedExtensions);
33
- const activeNames = activePlugins.map(p => p.name);
34
43
 
35
44
  if (_lodash.default.isEmpty(pluginNames)) {
36
45
  _logger.default.info(`No plugins have been installed. Use the "appium plugin" ` + 'command to install the one(s) you want to use.');
@@ -46,14 +55,15 @@ class PluginConfig extends _extensionConfig.default {
46
55
  _logger.default.info(` - ${this.extensionDesc(pluginName, pluginData)}${activeTxt}`);
47
56
  }
48
57
 
49
- if (_lodash.default.isEmpty(activePlugins)) {
50
- _logger.default.info('No plugins activated. Use the --plugins flag with names of plugins to activate');
58
+ if (_lodash.default.isEmpty(activeNames)) {
59
+ _logger.default.info('No plugins activated. Use the --use-plugins flag with names of plugins to activate');
51
60
  }
52
61
  }
53
62
 
54
63
  }
55
64
 
56
- exports.default = PluginConfig;require('source-map-support').install();
65
+ exports.default = PluginConfig;
66
+ (0, _defineProperty2.default)(PluginConfig, "_instances", {});require('source-map-support').install();
57
67
 
58
68
 
59
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wbHVnaW4tY29uZmlnLmpzIl0sIm5hbWVzIjpbIlBsdWdpbkNvbmZpZyIsIkV4dGVuc2lvbkNvbmZpZyIsImNvbnN0cnVjdG9yIiwiYXBwaXVtSG9tZSIsImxvZ0ZuIiwiUExVR0lOX1RZUEUiLCJleHRlbnNpb25EZXNjIiwicGx1Z2luTmFtZSIsInZlcnNpb24iLCJwcmludCIsImFjdGl2ZVBsdWdpbnMiLCJwbHVnaW5OYW1lcyIsIk9iamVjdCIsImtleXMiLCJpbnN0YWxsZWRFeHRlbnNpb25zIiwiYWN0aXZlTmFtZXMiLCJtYXAiLCJwIiwibmFtZSIsIl8iLCJpc0VtcHR5IiwibG9nIiwiaW5mbyIsInBsdWdpbkRhdGEiLCJ0b1BhaXJzIiwiYWN0aXZlVHh0IiwiaW5jbHVkZXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFFZSxNQUFNQSxZQUFOLFNBQTJCQyx3QkFBM0IsQ0FBMkM7QUFDeERDLEVBQUFBLFdBQVcsQ0FBRUMsVUFBRixFQUFjQyxLQUFLLEdBQUcsSUFBdEIsRUFBNEI7QUFDckMsVUFBTUQsVUFBTixFQUFrQkUsNEJBQWxCLEVBQStCRCxLQUEvQjtBQUNEOztBQUVERSxFQUFBQSxhQUFhLENBQUVDLFVBQUYsRUFBYztBQUFDQyxJQUFBQTtBQUFELEdBQWQsRUFBeUI7QUFDcEMsV0FBUSxHQUFFRCxVQUFXLElBQUdDLE9BQVEsRUFBaEM7QUFDRDs7QUFFREMsRUFBQUEsS0FBSyxDQUFFQyxhQUFGLEVBQWlCO0FBQ3BCLFVBQU1DLFdBQVcsR0FBR0MsTUFBTSxDQUFDQyxJQUFQLENBQVksS0FBS0MsbUJBQWpCLENBQXBCO0FBQ0EsVUFBTUMsV0FBVyxHQUFHTCxhQUFhLENBQUNNLEdBQWQsQ0FBbUJDLENBQUQsSUFBT0EsQ0FBQyxDQUFDQyxJQUEzQixDQUFwQjs7QUFFQSxRQUFJQyxnQkFBRUMsT0FBRixDQUFVVCxXQUFWLENBQUosRUFBNEI7QUFDMUJVLHNCQUFJQyxJQUFKLENBQVUsMERBQUQsR0FDQSxnREFEVDs7QUFFQTtBQUNEOztBQUVERCxvQkFBSUMsSUFBSixDQUFVLG9CQUFWOztBQUNBLFNBQUssTUFBTSxDQUFDZixVQUFELEVBQWFnQixVQUFiLENBQVgsSUFBdUNKLGdCQUFFSyxPQUFGLENBQVUsS0FBS1YsbUJBQWYsQ0FBdkMsRUFBNEU7QUFDMUUsWUFBTVcsU0FBUyxHQUFHTixnQkFBRU8sUUFBRixDQUFXWCxXQUFYLEVBQXdCUixVQUF4QixJQUFzQyxXQUF0QyxHQUFvRCxFQUF0RTs7QUFDQWMsc0JBQUlDLElBQUosQ0FBVSxPQUFNLEtBQUtoQixhQUFMLENBQW1CQyxVQUFuQixFQUErQmdCLFVBQS9CLENBQTJDLEdBQUVFLFNBQVUsRUFBdkU7QUFDRDs7QUFFRCxRQUFJTixnQkFBRUMsT0FBRixDQUFVVixhQUFWLENBQUosRUFBOEI7QUFDNUJXLHNCQUFJQyxJQUFKLENBQVMsZ0ZBQVQ7QUFDRDtBQUNGOztBQTVCdUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEV4dGVuc2lvbkNvbmZpZywgeyBQTFVHSU5fVFlQRSB9IGZyb20gJy4vZXh0ZW5zaW9uLWNvbmZpZyc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGx1Z2luQ29uZmlnIGV4dGVuZHMgRXh0ZW5zaW9uQ29uZmlnIHtcbiAgY29uc3RydWN0b3IgKGFwcGl1bUhvbWUsIGxvZ0ZuID0gbnVsbCkge1xuICAgIHN1cGVyKGFwcGl1bUhvbWUsIFBMVUdJTl9UWVBFLCBsb2dGbik7XG4gIH1cblxuICBleHRlbnNpb25EZXNjIChwbHVnaW5OYW1lLCB7dmVyc2lvbn0pIHtcbiAgICByZXR1cm4gYCR7cGx1Z2luTmFtZX1AJHt2ZXJzaW9ufWA7XG4gIH1cblxuICBwcmludCAoYWN0aXZlUGx1Z2lucykge1xuICAgIGNvbnN0IHBsdWdpbk5hbWVzID0gT2JqZWN0LmtleXModGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zKTtcbiAgICBjb25zdCBhY3RpdmVOYW1lcyA9IGFjdGl2ZVBsdWdpbnMubWFwKChwKSA9PiBwLm5hbWUpO1xuXG4gICAgaWYgKF8uaXNFbXB0eShwbHVnaW5OYW1lcykpIHtcbiAgICAgIGxvZy5pbmZvKGBObyBwbHVnaW5zIGhhdmUgYmVlbiBpbnN0YWxsZWQuIFVzZSB0aGUgXCJhcHBpdW0gcGx1Z2luXCIgYCArXG4gICAgICAgICAgICAgICAnY29tbWFuZCB0byBpbnN0YWxsIHRoZSBvbmUocykgeW91IHdhbnQgdG8gdXNlLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZy5pbmZvKGBBdmFpbGFibGUgcGx1Z2luczpgKTtcbiAgICBmb3IgKGNvbnN0IFtwbHVnaW5OYW1lLCBwbHVnaW5EYXRhXSBvZiBfLnRvUGFpcnModGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zKSkge1xuICAgICAgY29uc3QgYWN0aXZlVHh0ID0gXy5pbmNsdWRlcyhhY3RpdmVOYW1lcywgcGx1Z2luTmFtZSkgPyAnIChBQ1RJVkUpJyA6ICcnO1xuICAgICAgbG9nLmluZm8oYCAgLSAke3RoaXMuZXh0ZW5zaW9uRGVzYyhwbHVnaW5OYW1lLCBwbHVnaW5EYXRhKX0ke2FjdGl2ZVR4dH1gKTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc0VtcHR5KGFjdGl2ZVBsdWdpbnMpKSB7XG4gICAgICBsb2cuaW5mbygnTm8gcGx1Z2lucyBhY3RpdmF0ZWQuIFVzZSB0aGUgLS1wbHVnaW5zIGZsYWcgd2l0aCBuYW1lcyBvZiBwbHVnaW5zIHRvIGFjdGl2YXRlJyk7XG4gICAgfVxuICB9XG59XG4iXSwiZmlsZSI6ImxpYi9wbHVnaW4tY29uZmlnLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
69
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wbHVnaW4tY29uZmlnLmpzIl0sIm5hbWVzIjpbIlBsdWdpbkNvbmZpZyIsIkV4dGVuc2lvbkNvbmZpZyIsImNvbnN0cnVjdG9yIiwiYXBwaXVtSG9tZSIsImxvZ0ZuIiwiUExVR0lOX1RZUEUiLCJnZXRJbnN0YW5jZSIsImluc3RhbmNlIiwiX2luc3RhbmNlcyIsImV4dGVuc2lvbkRlc2MiLCJwbHVnaW5OYW1lIiwidmVyc2lvbiIsInByaW50IiwiYWN0aXZlTmFtZXMiLCJwbHVnaW5OYW1lcyIsIk9iamVjdCIsImtleXMiLCJpbnN0YWxsZWRFeHRlbnNpb25zIiwiXyIsImlzRW1wdHkiLCJsb2ciLCJpbmZvIiwicGx1Z2luRGF0YSIsInRvUGFpcnMiLCJhY3RpdmVUeHQiLCJpbmNsdWRlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUVlLE1BQU1BLFlBQU4sU0FBMkJDLHdCQUEzQixDQUEyQztBQWtCeERDLEVBQUFBLFdBQVcsQ0FBRUMsVUFBRixFQUFjQyxLQUFkLEVBQXFCO0FBQzlCLFVBQU1ELFVBQU4sRUFBa0JFLHdCQUFsQixFQUErQkQsS0FBL0I7QUFDRDs7QUFRaUIsU0FBWEUsV0FBVyxDQUFFSCxVQUFGLEVBQWNDLEtBQWQsRUFBcUI7QUFBQTs7QUFDckMsVUFBTUcsUUFBUSw0QkFBR1AsWUFBWSxDQUFDUSxVQUFiLENBQXdCTCxVQUF4QixDQUFILHlFQUEwQyxJQUFJSCxZQUFKLENBQWlCRyxVQUFqQixFQUE2QkMsS0FBN0IsQ0FBeEQ7QUFDQUosSUFBQUEsWUFBWSxDQUFDUSxVQUFiLENBQXdCTCxVQUF4QixJQUFzQ0ksUUFBdEM7QUFDQSxXQUFPQSxRQUFQO0FBQ0Q7O0FBRURFLEVBQUFBLGFBQWEsQ0FBRUMsVUFBRixFQUFjO0FBQUNDLElBQUFBO0FBQUQsR0FBZCxFQUF5QjtBQUNwQyxXQUFRLEdBQUVELFVBQVcsSUFBR0MsT0FBUSxFQUFoQztBQUNEOztBQUVEQyxFQUFBQSxLQUFLLENBQUVDLFdBQUYsRUFBZTtBQUNsQixVQUFNQyxXQUFXLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLEtBQUtDLG1CQUFqQixDQUFwQjs7QUFFQSxRQUFJQyxnQkFBRUMsT0FBRixDQUFVTCxXQUFWLENBQUosRUFBNEI7QUFDMUJNLHNCQUFJQyxJQUFKLENBQVUsMERBQUQsR0FDQSxnREFEVDs7QUFFQTtBQUNEOztBQUVERCxvQkFBSUMsSUFBSixDQUFVLG9CQUFWOztBQUNBLFNBQUssTUFBTSxDQUFDWCxVQUFELEVBQWFZLFVBQWIsQ0FBWCxJQUF1Q0osZ0JBQUVLLE9BQUYsQ0FBVSxLQUFLTixtQkFBZixDQUF2QyxFQUE0RTtBQUMxRSxZQUFNTyxTQUFTLEdBQUdOLGdCQUFFTyxRQUFGLENBQVdaLFdBQVgsRUFBd0JILFVBQXhCLElBQXNDLFdBQXRDLEdBQW9ELEVBQXRFOztBQUNBVSxzQkFBSUMsSUFBSixDQUFVLE9BQU0sS0FBS1osYUFBTCxDQUFtQkMsVUFBbkIsRUFBK0JZLFVBQS9CLENBQTJDLEdBQUVFLFNBQVUsRUFBdkU7QUFDRDs7QUFFRCxRQUFJTixnQkFBRUMsT0FBRixDQUFVTixXQUFWLENBQUosRUFBNEI7QUFDMUJPLHNCQUFJQyxJQUFKLENBQVMsb0ZBQVQ7QUFDRDtBQUNGOztBQXhEdUQ7Ozs4QkFBckNyQixZLGdCQVFDLEUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEV4dGVuc2lvbkNvbmZpZyBmcm9tICcuL2V4dGVuc2lvbi1jb25maWcnO1xuaW1wb3J0IHsgUExVR0lOX1RZUEUgfSBmcm9tICcuL2V4dC1jb25maWctaW8nO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsdWdpbkNvbmZpZyBleHRlbmRzIEV4dGVuc2lvbkNvbmZpZyB7XG5cbiAgLyoqXG4gICAqIEEgbWFwcGluZyBvZiBgQVBQSVVNX0hPTUVgIHZhbHVlcyB0byB7QGxpbmsgUGx1Z2luQ29uZmlnfSBpbnN0YW5jZXMuXG4gICAqIEVhY2ggYEFQUElVTV9IT01FYCBzaG91bGQgb25seSBoYXZlIG9uZSBhc3NvY2lhdGVkIGBQbHVnaW5Db25maWdgIGluc3RhbmNlLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxQbHVnaW5Db25maWc+fVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc3RhdGljIF9pbnN0YW5jZXMgPSB7fTtcblxuICAvKipcbiAgICogQ2FsbCB7QGxpbmsgUGx1Z2luQ29uZmlnLmdldEluc3RhbmNlfSBpbnN0ZWFkLlxuICAgKlxuICAgKiBKdXN0IGNhbGxzIHRoZSBzdXBlcmNsYXNzJyBjb25zdHJ1Y3RvciB3aXRoIHRoZSBjb3JyZWN0IGV4dGVuc2lvbiB0eXBlXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBpdW1Ib21lIC0gYEFQUElVTV9IT01FYCBwYXRoXG4gICAqIEBwYXJhbSB7KC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKX0gW2xvZ0ZuXSAtIE9wdGlvbmFsIGxvZ2dpbmcgZnVuY3Rpb25cbiAgICovXG4gIGNvbnN0cnVjdG9yIChhcHBpdW1Ib21lLCBsb2dGbikge1xuICAgIHN1cGVyKGFwcGl1bUhvbWUsIFBMVUdJTl9UWVBFLCBsb2dGbik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBvciBnZXRzIGFuIGluc3RhbmNlIG9mIHtAbGluayBQbHVnaW5Db25maWd9IGJhc2VkIHZhbHVlIG9mIGBhcHBpdW1Ib21lYFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwaXVtSG9tZSAtIGBBUFBJVU1fSE9NRWAgcGF0aFxuICAgKiBAcGFyYW0geyguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZH0gW2xvZ0ZuXSAtIE9wdGlvbmFsIGxvZ2dpbmcgZnVuY3Rpb25cbiAgICogQHJldHVybnMge1BsdWdpbkNvbmZpZ31cbiAgICovXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSAoYXBwaXVtSG9tZSwgbG9nRm4pIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IFBsdWdpbkNvbmZpZy5faW5zdGFuY2VzW2FwcGl1bUhvbWVdID8/IG5ldyBQbHVnaW5Db25maWcoYXBwaXVtSG9tZSwgbG9nRm4pO1xuICAgIFBsdWdpbkNvbmZpZy5faW5zdGFuY2VzW2FwcGl1bUhvbWVdID0gaW5zdGFuY2U7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgZXh0ZW5zaW9uRGVzYyAocGx1Z2luTmFtZSwge3ZlcnNpb259KSB7XG4gICAgcmV0dXJuIGAke3BsdWdpbk5hbWV9QCR7dmVyc2lvbn1gO1xuICB9XG5cbiAgcHJpbnQgKGFjdGl2ZU5hbWVzKSB7XG4gICAgY29uc3QgcGx1Z2luTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnMpO1xuXG4gICAgaWYgKF8uaXNFbXB0eShwbHVnaW5OYW1lcykpIHtcbiAgICAgIGxvZy5pbmZvKGBObyBwbHVnaW5zIGhhdmUgYmVlbiBpbnN0YWxsZWQuIFVzZSB0aGUgXCJhcHBpdW0gcGx1Z2luXCIgYCArXG4gICAgICAgICAgICAgICAnY29tbWFuZCB0byBpbnN0YWxsIHRoZSBvbmUocykgeW91IHdhbnQgdG8gdXNlLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZy5pbmZvKGBBdmFpbGFibGUgcGx1Z2luczpgKTtcbiAgICBmb3IgKGNvbnN0IFtwbHVnaW5OYW1lLCBwbHVnaW5EYXRhXSBvZiBfLnRvUGFpcnModGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zKSkge1xuICAgICAgY29uc3QgYWN0aXZlVHh0ID0gXy5pbmNsdWRlcyhhY3RpdmVOYW1lcywgcGx1Z2luTmFtZSkgPyAnIChBQ1RJVkUpJyA6ICcnO1xuICAgICAgbG9nLmluZm8oYCAgLSAke3RoaXMuZXh0ZW5zaW9uRGVzYyhwbHVnaW5OYW1lLCBwbHVnaW5EYXRhKX0ke2FjdGl2ZVR4dH1gKTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc0VtcHR5KGFjdGl2ZU5hbWVzKSkge1xuICAgICAgbG9nLmluZm8oJ05vIHBsdWdpbnMgYWN0aXZhdGVkLiBVc2UgdGhlIC0tdXNlLXBsdWdpbnMgZmxhZyB3aXRoIG5hbWVzIG9mIHBsdWdpbnMgdG8gYWN0aXZhdGUnKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJmaWxlIjoibGliL3BsdWdpbi1jb25maWcuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
@@ -7,8 +7,10 @@ exports.KNOWN_PLUGINS = void 0;
7
7
 
8
8
  require("source-map-support/register");
9
9
 
10
- const KNOWN_PLUGINS = {};
10
+ const KNOWN_PLUGINS = {
11
+ images: '@appium/images-plugin'
12
+ };
11
13
  exports.KNOWN_PLUGINS = KNOWN_PLUGINS;require('source-map-support').install();
12
14
 
13
15
 
14
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wbHVnaW5zLmpzIl0sIm5hbWVzIjpbIktOT1dOX1BMVUdJTlMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUlBLE1BQU1BLGFBQWEsR0FBRyxFQUF0QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoaXMgaXMgYSBtYXAgb2YgcGx1Z2luIG5hbWVzIHRvIG5wbSBwYWNrYWdlcyByZXByZXNlbnRpbmcgdGhvc2UgcGx1Z2lucy5cbi8vIFRoZSBwbHVnaW5zIGluIHRoaXMgbGlzdCB3aWxsIGJlIGF2YWlsYWJsZSB0byB0aGUgQ0xJIHNvIHVzZXJzIGNhbiBqdXN0XG4vLyB0eXBlICdhcHBpdW0gcGx1Z2luIGluc3RhbGwgJ25hbWUnJywgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIHNwZWNpZnkgdGhlIGZ1bGxcbi8vIG5wbSBwYWNrYWdlLiBJLmUuLCB0aGVzZSBhcmUgdGhlIG9mZmljaWFsbHkgcmVjb2duaXplZCBwbHVnaW5zLlxuY29uc3QgS05PV05fUExVR0lOUyA9IHtcbn07XG5cbmV4cG9ydCB7XG4gIEtOT1dOX1BMVUdJTlMsXG59O1xuIl0sImZpbGUiOiJsaWIvcGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
16
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wbHVnaW5zLmpzIl0sIm5hbWVzIjpbIktOT1dOX1BMVUdJTlMiLCJpbWFnZXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUlBLE1BQU1BLGFBQWEsR0FBRztBQUNwQkMsRUFBQUEsTUFBTSxFQUFFO0FBRFksQ0FBdEIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGlzIGEgbWFwIG9mIHBsdWdpbiBuYW1lcyB0byBucG0gcGFja2FnZXMgcmVwcmVzZW50aW5nIHRob3NlIHBsdWdpbnMuXG4vLyBUaGUgcGx1Z2lucyBpbiB0aGlzIGxpc3Qgd2lsbCBiZSBhdmFpbGFibGUgdG8gdGhlIENMSSBzbyB1c2VycyBjYW4ganVzdFxuLy8gdHlwZSAnYXBwaXVtIHBsdWdpbiBpbnN0YWxsICduYW1lJycsIHJhdGhlciB0aGFuIGhhdmluZyB0byBzcGVjaWZ5IHRoZSBmdWxsXG4vLyBucG0gcGFja2FnZS4gSS5lLiwgdGhlc2UgYXJlIHRoZSBvZmZpY2lhbGx5IHJlY29nbml6ZWQgcGx1Z2lucy5cbmNvbnN0IEtOT1dOX1BMVUdJTlMgPSB7XG4gIGltYWdlczogJ0BhcHBpdW0vaW1hZ2VzLXBsdWdpbicsXG59O1xuXG5leHBvcnQge1xuICBLTk9XTl9QTFVHSU5TLFxufTtcbiJdLCJmaWxlIjoibGliL3BsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==