appium 2.0.0-beta.24 → 2.0.0-beta.27

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 (124) hide show
  1. package/build/lib/appium-config.schema.json +278 -0
  2. package/build/lib/appium.js +45 -66
  3. package/build/lib/cli/args.js +19 -39
  4. package/build/lib/cli/driver-command.js +5 -9
  5. package/build/lib/cli/extension-command.js +73 -64
  6. package/build/lib/cli/extension.js +10 -23
  7. package/build/lib/cli/parser.js +9 -19
  8. package/build/lib/cli/plugin-command.js +5 -9
  9. package/build/lib/cli/utils.js +2 -4
  10. package/build/lib/config-file.js +5 -10
  11. package/build/lib/config.js +50 -20
  12. package/build/lib/constants.js +60 -0
  13. package/build/lib/extension/driver-config.js +190 -0
  14. package/build/lib/extension/extension-config.js +297 -0
  15. package/build/lib/extension/index.js +77 -0
  16. package/build/lib/extension/manifest.js +246 -0
  17. package/build/lib/extension/package-changed.js +68 -0
  18. package/build/lib/extension/plugin-config.js +87 -0
  19. package/build/lib/grid-register.js +2 -4
  20. package/build/lib/logger.js +2 -4
  21. package/build/lib/logsink.js +2 -4
  22. package/build/lib/main.js +42 -71
  23. package/build/lib/schema/appium-config-schema.js +2 -4
  24. package/build/lib/schema/arg-spec.js +11 -14
  25. package/build/lib/schema/cli-args.js +2 -4
  26. package/build/lib/schema/cli-transformers.js +2 -4
  27. package/build/lib/schema/index.js +2 -4
  28. package/build/lib/schema/keywords.js +2 -4
  29. package/build/lib/schema/schema.js +61 -37
  30. package/build/lib/utils.js +1 -32
  31. package/lib/appium.js +50 -68
  32. package/lib/cli/args.js +19 -23
  33. package/lib/cli/driver-command.js +10 -2
  34. package/lib/cli/extension-command.js +216 -135
  35. package/lib/cli/extension.js +7 -15
  36. package/lib/cli/parser.js +6 -14
  37. package/lib/cli/plugin-command.js +1 -2
  38. package/lib/config-file.js +12 -15
  39. package/lib/config.js +55 -24
  40. package/lib/constants.js +79 -0
  41. package/lib/extension/driver-config.js +230 -0
  42. package/lib/extension/extension-config.js +459 -0
  43. package/lib/extension/index.js +103 -0
  44. package/lib/extension/manifest.js +590 -0
  45. package/lib/extension/package-changed.js +64 -0
  46. package/lib/extension/plugin-config.js +111 -0
  47. package/lib/grid-register.js +4 -4
  48. package/lib/main.js +57 -93
  49. package/lib/schema/arg-spec.js +3 -3
  50. package/lib/schema/cli-args.js +1 -0
  51. package/lib/schema/keywords.js +1 -1
  52. package/lib/schema/schema.js +67 -29
  53. package/lib/utils.js +2 -32
  54. package/package.json +29 -21
  55. package/{postinstall.js → scripts/postinstall.js} +1 -1
  56. package/types/types.d.ts +70 -31
  57. package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
  58. package/build/check-npm-pack-files.js +0 -23
  59. package/build/commands-yml/parse.js +0 -319
  60. package/build/commands-yml/validator.js +0 -130
  61. package/build/index.js +0 -19
  62. package/build/lib/cli/npm.js +0 -220
  63. package/build/lib/driver-config.js +0 -100
  64. package/build/lib/drivers.js +0 -100
  65. package/build/lib/ext-config-io.js +0 -165
  66. package/build/lib/extension-config.js +0 -320
  67. package/build/lib/plugin-config.js +0 -69
  68. package/build/lib/plugins.js +0 -18
  69. package/build/postinstall.js +0 -90
  70. package/build/test/cli/cli-e2e-specs.js +0 -221
  71. package/build/test/cli/cli-helpers.js +0 -86
  72. package/build/test/cli/cli-specs.js +0 -71
  73. package/build/test/cli/fixtures/test-driver/package.json +0 -27
  74. package/build/test/cli/schema-args-specs.js +0 -48
  75. package/build/test/cli/schema-e2e-specs.js +0 -47
  76. package/build/test/config-e2e-specs.js +0 -112
  77. package/build/test/config-file-e2e-specs.js +0 -209
  78. package/build/test/config-file-specs.js +0 -281
  79. package/build/test/config-specs.js +0 -246
  80. package/build/test/driver-e2e-specs.js +0 -435
  81. package/build/test/driver-specs.js +0 -386
  82. package/build/test/ext-config-io-specs.js +0 -181
  83. package/build/test/extension-config-specs.js +0 -365
  84. package/build/test/fixtures/allow-feat.txt +0 -5
  85. package/build/test/fixtures/caps.json +0 -3
  86. package/build/test/fixtures/config/allow-insecure.txt +0 -3
  87. package/build/test/fixtures/config/appium.config.bad-nodeconfig.json +0 -5
  88. package/build/test/fixtures/config/appium.config.bad.json +0 -32
  89. package/build/test/fixtures/config/appium.config.ext-good.json +0 -9
  90. package/build/test/fixtures/config/appium.config.ext-unknown-props.json +0 -10
  91. package/build/test/fixtures/config/appium.config.good.js +0 -40
  92. package/build/test/fixtures/config/appium.config.good.json +0 -33
  93. package/build/test/fixtures/config/appium.config.good.yaml +0 -30
  94. package/build/test/fixtures/config/appium.config.invalid.json +0 -31
  95. package/build/test/fixtures/config/appium.config.security-array.json +0 -5
  96. package/build/test/fixtures/config/appium.config.security-delimited.json +0 -5
  97. package/build/test/fixtures/config/appium.config.security-path.json +0 -5
  98. package/build/test/fixtures/config/driver-fake.config.json +0 -8
  99. package/build/test/fixtures/config/nodeconfig.json +0 -3
  100. package/build/test/fixtures/config/plugin-fake.config.json +0 -0
  101. package/build/test/fixtures/default-args.js +0 -35
  102. package/build/test/fixtures/deny-feat.txt +0 -5
  103. package/build/test/fixtures/driver.schema.js +0 -20
  104. package/build/test/fixtures/extensions.yaml +0 -27
  105. package/build/test/fixtures/flattened-schema.js +0 -532
  106. package/build/test/fixtures/plugin.schema.js +0 -20
  107. package/build/test/fixtures/schema-with-extensions.js +0 -28
  108. package/build/test/grid-register-specs.js +0 -74
  109. package/build/test/helpers.js +0 -75
  110. package/build/test/logger-specs.js +0 -76
  111. package/build/test/npm-specs.js +0 -20
  112. package/build/test/parser-specs.js +0 -319
  113. package/build/test/plugin-e2e-specs.js +0 -316
  114. package/build/test/schema/arg-spec-specs.js +0 -70
  115. package/build/test/schema/cli-args-specs.js +0 -408
  116. package/build/test/schema/schema-specs.js +0 -407
  117. package/build/test/utils-specs.js +0 -288
  118. package/lib/cli/npm.js +0 -251
  119. package/lib/driver-config.js +0 -101
  120. package/lib/drivers.js +0 -84
  121. package/lib/ext-config-io.js +0 -287
  122. package/lib/extension-config.js +0 -366
  123. package/lib/plugin-config.js +0 -63
  124. package/lib/plugins.js +0 -13
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.USE_ALL_PLUGINS = exports.SERVER_SUBCOMMAND = exports.PLUGIN_TYPE = exports.PKG_HASHFILE_RELATIVE_PATH = exports.KNOWN_PLUGINS = exports.KNOWN_DRIVERS = exports.EXT_SUBCOMMAND_UPDATE = exports.EXT_SUBCOMMAND_UNINSTALL = exports.EXT_SUBCOMMAND_RUN = exports.EXT_SUBCOMMAND_LIST = exports.EXT_SUBCOMMAND_INSTALL = exports.DRIVER_TYPE = exports.CACHE_DIR_RELATIVE_PATH = void 0;
9
+
10
+ require("source-map-support/register");
11
+
12
+ var _path = _interopRequireDefault(require("path"));
13
+
14
+ const DRIVER_TYPE = 'driver';
15
+ exports.DRIVER_TYPE = DRIVER_TYPE;
16
+ const PLUGIN_TYPE = 'plugin';
17
+ exports.PLUGIN_TYPE = PLUGIN_TYPE;
18
+ const SERVER_SUBCOMMAND = 'server';
19
+ exports.SERVER_SUBCOMMAND = SERVER_SUBCOMMAND;
20
+ const USE_ALL_PLUGINS = 'all';
21
+ exports.USE_ALL_PLUGINS = USE_ALL_PLUGINS;
22
+ const KNOWN_PLUGINS = Object.freeze({
23
+ images: '@appium/images-plugin',
24
+ 'execute-driver': '@appium/execute-driver-plugin',
25
+ 'relaxed-caps': '@appium/relaxed-caps-plugin'
26
+ });
27
+ exports.KNOWN_PLUGINS = KNOWN_PLUGINS;
28
+ const KNOWN_DRIVERS = Object.freeze({
29
+ uiautomator2: 'appium-uiautomator2-driver',
30
+ xcuitest: 'appium-xcuitest-driver',
31
+ youiengine: 'appium-youiengine-driver',
32
+ windows: 'appium-windows-driver',
33
+ mac: 'appium-mac-driver',
34
+ mac2: 'appium-mac2-driver',
35
+ espresso: 'appium-espresso-driver',
36
+ tizen: 'appium-tizen-driver',
37
+ flutter: 'appium-flutter-driver',
38
+ safari: 'appium-safari-driver',
39
+ gecko: 'appium-geckodriver'
40
+ });
41
+ exports.KNOWN_DRIVERS = KNOWN_DRIVERS;
42
+
43
+ const CACHE_DIR_RELATIVE_PATH = _path.default.join('node_modules', '.cache', 'appium');
44
+
45
+ exports.CACHE_DIR_RELATIVE_PATH = CACHE_DIR_RELATIVE_PATH;
46
+
47
+ const PKG_HASHFILE_RELATIVE_PATH = _path.default.join(CACHE_DIR_RELATIVE_PATH, 'package.hash');
48
+
49
+ exports.PKG_HASHFILE_RELATIVE_PATH = PKG_HASHFILE_RELATIVE_PATH;
50
+ const EXT_SUBCOMMAND_LIST = 'list';
51
+ exports.EXT_SUBCOMMAND_LIST = EXT_SUBCOMMAND_LIST;
52
+ const EXT_SUBCOMMAND_INSTALL = 'install';
53
+ exports.EXT_SUBCOMMAND_INSTALL = EXT_SUBCOMMAND_INSTALL;
54
+ const EXT_SUBCOMMAND_UNINSTALL = 'uninstall';
55
+ exports.EXT_SUBCOMMAND_UNINSTALL = EXT_SUBCOMMAND_UNINSTALL;
56
+ const EXT_SUBCOMMAND_UPDATE = 'update';
57
+ exports.EXT_SUBCOMMAND_UPDATE = EXT_SUBCOMMAND_UPDATE;
58
+ const EXT_SUBCOMMAND_RUN = 'run';
59
+ exports.EXT_SUBCOMMAND_RUN = EXT_SUBCOMMAND_RUN;
60
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9jb25zdGFudHMuanMiXSwibmFtZXMiOlsiRFJJVkVSX1RZUEUiLCJQTFVHSU5fVFlQRSIsIlNFUlZFUl9TVUJDT01NQU5EIiwiVVNFX0FMTF9QTFVHSU5TIiwiS05PV05fUExVR0lOUyIsIk9iamVjdCIsImZyZWV6ZSIsImltYWdlcyIsIktOT1dOX0RSSVZFUlMiLCJ1aWF1dG9tYXRvcjIiLCJ4Y3VpdGVzdCIsInlvdWllbmdpbmUiLCJ3aW5kb3dzIiwibWFjIiwibWFjMiIsImVzcHJlc3NvIiwidGl6ZW4iLCJmbHV0dGVyIiwic2FmYXJpIiwiZ2Vja28iLCJDQUNIRV9ESVJfUkVMQVRJVkVfUEFUSCIsInBhdGgiLCJqb2luIiwiUEtHX0hBU0hGSUxFX1JFTEFUSVZFX1BBVEgiLCJFWFRfU1VCQ09NTUFORF9MSVNUIiwiRVhUX1NVQkNPTU1BTkRfSU5TVEFMTCIsIkVYVF9TVUJDT01NQU5EX1VOSU5TVEFMTCIsIkVYVF9TVUJDT01NQU5EX1VQREFURSIsIkVYVF9TVUJDT01NQU5EX1JVTiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFFQTs7QUFLTyxNQUFNQSxXQUFXLEdBQUcsUUFBcEI7O0FBS0EsTUFBTUMsV0FBVyxHQUFHLFFBQXBCOztBQUtBLE1BQU1DLGlCQUFpQixHQUFHLFFBQTFCOztBQUtBLE1BQU1DLGVBQWUsR0FBRyxLQUF4Qjs7QUFNQSxNQUFNQyxhQUFhLEdBQUdDLE1BQU0sQ0FBQ0MsTUFBUCxDQUNMO0FBQ3BCQyxFQUFBQSxNQUFNLEVBQUUsdUJBRFk7QUFFcEIsb0JBQWtCLCtCQUZFO0FBR3BCLGtCQUFnQjtBQUhJLENBREssQ0FBdEI7O0FBWUEsTUFBTUMsYUFBYSxHQUFHSCxNQUFNLENBQUNDLE1BQVAsQ0FDTDtBQUNwQkcsRUFBQUEsWUFBWSxFQUFFLDRCQURNO0FBRXBCQyxFQUFBQSxRQUFRLEVBQUUsd0JBRlU7QUFHcEJDLEVBQUFBLFVBQVUsRUFBRSwwQkFIUTtBQUlwQkMsRUFBQUEsT0FBTyxFQUFFLHVCQUpXO0FBS3BCQyxFQUFBQSxHQUFHLEVBQUUsbUJBTGU7QUFNcEJDLEVBQUFBLElBQUksRUFBRSxvQkFOYztBQU9wQkMsRUFBQUEsUUFBUSxFQUFFLHdCQVBVO0FBUXBCQyxFQUFBQSxLQUFLLEVBQUUscUJBUmE7QUFTcEJDLEVBQUFBLE9BQU8sRUFBRSx1QkFUVztBQVVwQkMsRUFBQUEsTUFBTSxFQUFFLHNCQVZZO0FBV3BCQyxFQUFBQSxLQUFLLEVBQUU7QUFYYSxDQURLLENBQXRCOzs7QUFtQkEsTUFBTUMsdUJBQXVCLEdBQUdDLGNBQUtDLElBQUwsQ0FDckMsY0FEcUMsRUFFckMsUUFGcUMsRUFHckMsUUFIcUMsQ0FBaEM7Ozs7QUFTQSxNQUFNQywwQkFBMEIsR0FBR0YsY0FBS0MsSUFBTCxDQUN4Q0YsdUJBRHdDLEVBRXhDLGNBRndDLENBQW5DOzs7QUFNQSxNQUFNSSxtQkFBbUIsR0FBRyxNQUE1Qjs7QUFDQSxNQUFNQyxzQkFBc0IsR0FBRyxTQUEvQjs7QUFDQSxNQUFNQyx3QkFBd0IsR0FBRyxXQUFqQzs7QUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxRQUE5Qjs7QUFDQSxNQUFNQyxrQkFBa0IsR0FBRyxLQUEzQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHR5cGUgZm9yIGRyaXZlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IERSSVZFUl9UWVBFID0gJ2RyaXZlcic7XG5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0eXBlIGZvciBwbHVnaW5zXG4gKi9cbmV4cG9ydCBjb25zdCBQTFVHSU5fVFlQRSA9ICdwbHVnaW4nO1xuXG4vKipcbiAqIFRoZSBgc2VydmVyYCBjb21tYW5kIG9mIHRoZSBgYXBwaXVtYCBDTElcbiAqL1xuZXhwb3J0IGNvbnN0IFNFUlZFUl9TVUJDT01NQU5EID0gJ3NlcnZlcic7XG5cbi8qKlxuICogVGhlIHZhbHVlIG9mIGAtLXVzZS1wbHVnaW5zYCBpZiBfYWxsXyBwbHVnaW5zIHNob3VsZCBiZSBsb2FkZWRcbiAqL1xuZXhwb3J0IGNvbnN0IFVTRV9BTExfUExVR0lOUyA9ICdhbGwnO1xuXG4vLyBUaGlzIGlzIGEgbWFwIG9mIHBsdWdpbiBuYW1lcyB0byBucG0gcGFja2FnZXMgcmVwcmVzZW50aW5nIHRob3NlIHBsdWdpbnMuXG4vLyBUaGUgcGx1Z2lucyBpbiB0aGlzIGxpc3Qgd2lsbCBiZSBhdmFpbGFibGUgdG8gdGhlIENMSSBzbyB1c2VycyBjYW4ganVzdFxuLy8gdHlwZSAnYXBwaXVtIHBsdWdpbiBpbnN0YWxsICduYW1lJycsIHJhdGhlciB0aGFuIGhhdmluZyB0byBzcGVjaWZ5IHRoZSBmdWxsXG4vLyBucG0gcGFja2FnZS4gSS5lLiwgdGhlc2UgYXJlIHRoZSBvZmZpY2lhbGx5IHJlY29nbml6ZWQgcGx1Z2lucy5cbmV4cG9ydCBjb25zdCBLTk9XTl9QTFVHSU5TID0gT2JqZWN0LmZyZWV6ZShcbiAgLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgICBpbWFnZXM6ICdAYXBwaXVtL2ltYWdlcy1wbHVnaW4nLFxuICAgICdleGVjdXRlLWRyaXZlcic6ICdAYXBwaXVtL2V4ZWN1dGUtZHJpdmVyLXBsdWdpbicsXG4gICAgJ3JlbGF4ZWQtY2Fwcyc6ICdAYXBwaXVtL3JlbGF4ZWQtY2Fwcy1wbHVnaW4nLFxuICB9KSxcbik7XG5cbi8vIFRoaXMgaXMgYSBtYXAgb2YgZHJpdmVyIG5hbWVzIHRvIG5wbSBwYWNrYWdlcyByZXByZXNlbnRpbmcgdGhvc2UgZHJpdmVycy5cbi8vIFRoZSBkcml2ZXJzIGluIHRoaXMgbGlzdCB3aWxsIGJlIGF2YWlsYWJsZSB0byB0aGUgQ0xJIHNvIHVzZXJzIGNhbiBqdXN0XG4vLyB0eXBlICdhcHBpdW0gZHJpdmVyIGluc3RhbGwgJ25hbWUnJywgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIHNwZWNpZnkgdGhlIGZ1bGxcbi8vIG5wbSBwYWNrYWdlLiBJLmUuLCB0aGVzZSBhcmUgdGhlIG9mZmljaWFsbHkgcmVjb2duaXplZCBkcml2ZXJzLlxuZXhwb3J0IGNvbnN0IEtOT1dOX0RSSVZFUlMgPSBPYmplY3QuZnJlZXplKFxuICAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICAgIHVpYXV0b21hdG9yMjogJ2FwcGl1bS11aWF1dG9tYXRvcjItZHJpdmVyJyxcbiAgICB4Y3VpdGVzdDogJ2FwcGl1bS14Y3VpdGVzdC1kcml2ZXInLFxuICAgIHlvdWllbmdpbmU6ICdhcHBpdW0teW91aWVuZ2luZS1kcml2ZXInLFxuICAgIHdpbmRvd3M6ICdhcHBpdW0td2luZG93cy1kcml2ZXInLFxuICAgIG1hYzogJ2FwcGl1bS1tYWMtZHJpdmVyJyxcbiAgICBtYWMyOiAnYXBwaXVtLW1hYzItZHJpdmVyJyxcbiAgICBlc3ByZXNzbzogJ2FwcGl1bS1lc3ByZXNzby1kcml2ZXInLFxuICAgIHRpemVuOiAnYXBwaXVtLXRpemVuLWRyaXZlcicsXG4gICAgZmx1dHRlcjogJ2FwcGl1bS1mbHV0dGVyLWRyaXZlcicsXG4gICAgc2FmYXJpOiAnYXBwaXVtLXNhZmFyaS1kcml2ZXInLFxuICAgIGdlY2tvOiAnYXBwaXVtLWdlY2tvZHJpdmVyJyxcbiAgfSksXG4pO1xuXG4vKipcbiAqIFJlbGF0aXZlIHBhdGggdG8gZGlyZWN0b3J5IGNvbnRhaW5pbmcgYW55IEFwcGl1bSBpbnRlcm5hbCBmaWxlc1xuICovXG5leHBvcnQgY29uc3QgQ0FDSEVfRElSX1JFTEFUSVZFX1BBVEggPSBwYXRoLmpvaW4oXG4gICdub2RlX21vZHVsZXMnLFxuICAnLmNhY2hlJyxcbiAgJ2FwcGl1bScsXG4pO1xuXG4vKipcbiAqIFJlbGF0aXZlIHBhdGggdG8gaGFzaGZpbGUgKGZyb20gYEFQUElVTV9IT01FYCkgb2YgY29uc3VtaW5nIHByb2plY3QncyBgcGFja2FnZS5qc29uYCAoaWYgaXQgZXhpc3RzKVxuICovXG5leHBvcnQgY29uc3QgUEtHX0hBU0hGSUxFX1JFTEFUSVZFX1BBVEggPSBwYXRoLmpvaW4oXG4gIENBQ0hFX0RJUl9SRUxBVElWRV9QQVRILFxuICAncGFja2FnZS5oYXNoJyxcbik7XG5cblxuZXhwb3J0IGNvbnN0IEVYVF9TVUJDT01NQU5EX0xJU1QgPSAnbGlzdCc7XG5leHBvcnQgY29uc3QgRVhUX1NVQkNPTU1BTkRfSU5TVEFMTCA9ICdpbnN0YWxsJztcbmV4cG9ydCBjb25zdCBFWFRfU1VCQ09NTUFORF9VTklOU1RBTEwgPSAndW5pbnN0YWxsJztcbmV4cG9ydCBjb25zdCBFWFRfU1VCQ09NTUFORF9VUERBVEUgPSAndXBkYXRlJztcbmV4cG9ydCBjb25zdCBFWFRfU1VCQ09NTUFORF9SVU4gPSAncnVuJztcbiJdfQ==
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.DriverConfig = void 0;
9
+
10
+ require("source-map-support/register");
11
+
12
+ var _lodash = _interopRequireDefault(require("lodash"));
13
+
14
+ var _constants = require("../constants");
15
+
16
+ var _logger = _interopRequireDefault(require("../logger"));
17
+
18
+ var _extensionConfig = require("./extension-config");
19
+
20
+ class DriverConfig extends _extensionConfig.ExtensionConfig {
21
+ knownAutomationNames;
22
+ static _instances = new WeakMap();
23
+
24
+ constructor(manifest, {
25
+ logFn,
26
+ extData
27
+ } = {}) {
28
+ super(_constants.DRIVER_TYPE, manifest, logFn);
29
+ this.knownAutomationNames = new Set();
30
+
31
+ if (extData) {
32
+ this.validate(extData);
33
+ }
34
+ }
35
+
36
+ static create(manifest, {
37
+ extData,
38
+ logFn
39
+ } = {}) {
40
+ const instance = new DriverConfig(manifest, {
41
+ logFn,
42
+ extData
43
+ });
44
+
45
+ if (DriverConfig.getInstance(manifest)) {
46
+ throw new Error(`Manifest with APPIUM_HOME ${manifest.appiumHome} already has a DriverConfig; use DriverConfig.getInstance() to retrieve it.`);
47
+ }
48
+
49
+ DriverConfig._instances.set(manifest, instance);
50
+
51
+ return instance;
52
+ }
53
+
54
+ static getInstance(manifest) {
55
+ return DriverConfig._instances.get(manifest);
56
+ }
57
+
58
+ validate(exts) {
59
+ this.knownAutomationNames.clear();
60
+ return super.validate(exts);
61
+ }
62
+
63
+ getConfigProblems(extData) {
64
+ const problems = [];
65
+ const {
66
+ platformNames,
67
+ automationName
68
+ } = extData;
69
+
70
+ if (!_lodash.default.isArray(platformNames)) {
71
+ problems.push({
72
+ err: 'Missing or incorrect supported platformNames list.',
73
+ val: platformNames
74
+ });
75
+ } else {
76
+ if (_lodash.default.isEmpty(platformNames)) {
77
+ problems.push({
78
+ err: 'Empty platformNames list.',
79
+ val: platformNames
80
+ });
81
+ } else {
82
+ for (const pName of platformNames) {
83
+ if (!_lodash.default.isString(pName)) {
84
+ problems.push({
85
+ err: 'Incorrectly formatted platformName.',
86
+ val: pName
87
+ });
88
+ }
89
+ }
90
+ }
91
+ }
92
+
93
+ if (!_lodash.default.isString(automationName)) {
94
+ problems.push({
95
+ err: 'Missing or incorrect automationName',
96
+ val: automationName
97
+ });
98
+ }
99
+
100
+ if (this.knownAutomationNames.has(automationName)) {
101
+ problems.push({
102
+ err: 'Multiple drivers claim support for the same automationName',
103
+ val: automationName
104
+ });
105
+ }
106
+
107
+ this.knownAutomationNames.add(automationName);
108
+ return problems;
109
+ }
110
+
111
+ extensionDesc(driverName, {
112
+ version,
113
+ automationName
114
+ }) {
115
+ return `${driverName}@${version} (automationName '${automationName}')`;
116
+ }
117
+
118
+ findMatchingDriver({
119
+ automationName,
120
+ platformName
121
+ }) {
122
+ if (!_lodash.default.isString(platformName)) {
123
+ throw new Error('You must include a platformName capability');
124
+ }
125
+
126
+ if (!_lodash.default.isString(automationName)) {
127
+ throw new Error('You must include an automationName capability');
128
+ }
129
+
130
+ _logger.default.info(`Attempting to find matching driver for automationName ` + `'${automationName}' and platformName '${platformName}'`);
131
+
132
+ try {
133
+ const {
134
+ driverName,
135
+ mainClass,
136
+ version
137
+ } = this._getDriverBySupport(automationName, platformName);
138
+
139
+ _logger.default.info(`The '${driverName}' driver was installed and matched caps.`);
140
+
141
+ _logger.default.info(`Will require it at ${this.getInstallPath(driverName)}`);
142
+
143
+ const driver = this.require(driverName);
144
+
145
+ if (!driver) {
146
+ throw new Error(`Driver '${driverName}' did not export a class with name '${mainClass}'. Contact the author of the driver!`);
147
+ }
148
+
149
+ return {
150
+ driver,
151
+ version,
152
+ driverName
153
+ };
154
+ } catch (err) {
155
+ const msg = `Could not find a driver for automationName ` + `'${automationName}' and platformName ${platformName}'. ` + `Have you installed a driver that supports those ` + `capabilities? Run 'appium driver list --installed' to see. ` + `(Lower-level error: ${err.message})`;
156
+ throw new Error(msg);
157
+ }
158
+ }
159
+
160
+ _getDriverBySupport(matchAutomationName, matchPlatformName) {
161
+ const drivers = this.installedExtensions;
162
+
163
+ for (const [driverName, driverData] of _lodash.default.toPairs(drivers)) {
164
+ const {
165
+ automationName,
166
+ platformNames
167
+ } = driverData;
168
+ const aNameMatches = automationName.toLowerCase() === matchAutomationName.toLowerCase();
169
+
170
+ const pNameMatches = _lodash.default.includes(platformNames.map(_lodash.default.toLower), matchPlatformName.toLowerCase());
171
+
172
+ if (aNameMatches && pNameMatches) {
173
+ return {
174
+ driverName,
175
+ ...driverData
176
+ };
177
+ }
178
+
179
+ if (aNameMatches) {
180
+ throw new Error(`Driver '${driverName}' supports automationName ` + `'${automationName}', but Appium could not find ` + `support for platformName '${matchPlatformName}'. Supported ` + `platformNames are: ` + JSON.stringify(platformNames));
181
+ }
182
+ }
183
+
184
+ throw new Error(`Could not find installed driver to support given caps`);
185
+ }
186
+
187
+ }
188
+
189
+ exports.DriverConfig = DriverConfig;
190
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9leHRlbnNpb24vZHJpdmVyLWNvbmZpZy5qcyJdLCJuYW1lcyI6WyJEcml2ZXJDb25maWciLCJFeHRlbnNpb25Db25maWciLCJrbm93bkF1dG9tYXRpb25OYW1lcyIsIl9pbnN0YW5jZXMiLCJXZWFrTWFwIiwiY29uc3RydWN0b3IiLCJtYW5pZmVzdCIsImxvZ0ZuIiwiZXh0RGF0YSIsIkRSSVZFUl9UWVBFIiwiU2V0IiwidmFsaWRhdGUiLCJjcmVhdGUiLCJpbnN0YW5jZSIsImdldEluc3RhbmNlIiwiRXJyb3IiLCJhcHBpdW1Ib21lIiwic2V0IiwiZ2V0IiwiZXh0cyIsImNsZWFyIiwiZ2V0Q29uZmlnUHJvYmxlbXMiLCJwcm9ibGVtcyIsInBsYXRmb3JtTmFtZXMiLCJhdXRvbWF0aW9uTmFtZSIsIl8iLCJpc0FycmF5IiwicHVzaCIsImVyciIsInZhbCIsImlzRW1wdHkiLCJwTmFtZSIsImlzU3RyaW5nIiwiaGFzIiwiYWRkIiwiZXh0ZW5zaW9uRGVzYyIsImRyaXZlck5hbWUiLCJ2ZXJzaW9uIiwiZmluZE1hdGNoaW5nRHJpdmVyIiwicGxhdGZvcm1OYW1lIiwibG9nIiwiaW5mbyIsIm1haW5DbGFzcyIsIl9nZXREcml2ZXJCeVN1cHBvcnQiLCJnZXRJbnN0YWxsUGF0aCIsImRyaXZlciIsInJlcXVpcmUiLCJtc2ciLCJtZXNzYWdlIiwibWF0Y2hBdXRvbWF0aW9uTmFtZSIsIm1hdGNoUGxhdGZvcm1OYW1lIiwiZHJpdmVycyIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJkcml2ZXJEYXRhIiwidG9QYWlycyIsImFOYW1lTWF0Y2hlcyIsInRvTG93ZXJDYXNlIiwicE5hbWVNYXRjaGVzIiwiaW5jbHVkZXMiLCJtYXAiLCJ0b0xvd2VyIiwiSlNPTiIsInN0cmluZ2lmeSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLTyxNQUFNQSxZQUFOLFNBQTJCQyxnQ0FBM0IsQ0FBMkM7QUFNaERD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QUFVcUIsVUFBVyw0QkFBdEIsR0FDQSxJQUFHWixjQUFlLCtCQURsQixHQUVBLDZCQUE0QjBCLGlCQUFrQixlQUY5QyxHQUdBLHFCQUhBLEdBSURXLElBQUksQ0FBQ0MsU0FBTCxDQUFldkMsYUFBZixDQUpULENBQU47QUFLRDtBQUNGOztBQUVELFVBQU0sSUFBSVIsS0FBSixDQUFXLHVEQUFYLENBQU47QUFDRDs7QUFqTThDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBEUklWRVJfVFlQRSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBFeHRlbnNpb25Db25maWcgfSBmcm9tICcuL2V4dGVuc2lvbi1jb25maWcnO1xuXG4vKipcbiAqIEBleHRlbmRzIHtFeHRlbnNpb25Db25maWc8RHJpdmVyVHlwZT59XG4gKi9cbmV4cG9ydCBjbGFzcyBEcml2ZXJDb25maWcgZXh0ZW5kcyBFeHRlbnNpb25Db25maWcge1xuXG4gIC8qKlxuICAgKiBBIHNldCBvZiB1bmlxdWUgYXV0b21hdGlvbiBuYW1lcyB1c2VkIGJ5IGRyaXZlcnMuXG4gICAqIEB0eXBlIHtTZXQ8c3RyaW5nPn1cbiAgICovXG4gIGtub3duQXV0b21hdGlvbk5hbWVzO1xuXG4gIC8qKlxuICAgKiBBIG1hcHBpbmcgb2Yge0BsaW5rIE1hbmlmZXN0fSBpbnN0YW5jZXMgdG8ge0BsaW5rIERyaXZlckNvbmZpZ30gaW5zdGFuY2VzLlxuICAgKlxuICAgKiBgTWFuaWZlc3RgIGFuZCBgRXh0ZW5zaW9uQ29uZmlnYCBoYXZlIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwOyBlYWNoIGBNYW5pZmVzdGAgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCBhIGBEcml2ZXJDb25maWdgIGFuZCBhIGBQbHVnaW5Db25maWdgOyBubyBtb3JlLCBubyBsZXNzLlxuICAgKlxuICAgKiBUaGlzIHZhcmlhYmxlIHRyYWNrcyB0aGUgYE1hbmlmZXN0YC10by1gRHJpdmVyQ29uZmlnYCBwb3J0aW9uLlxuICAgKlxuICAgKiBAdHlwZSB7V2Vha01hcDxNYW5pZmVzdCxEcml2ZXJDb25maWc+fVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgIHN0YXRpYyBfaW5zdGFuY2VzID0gbmV3IFdlYWtNYXAoKTtcblxuICAgLyoqXG4gICAqIENhbGwge0BsaW5rIERyaXZlckNvbmZpZy5jcmVhdGV9IGluc3RlYWQuXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7aW1wb3J0KCcuL21hbmlmZXN0JykuTWFuaWZlc3R9IG1hbmlmZXN0IC0gTWFuaWZlc3QgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtEcml2ZXJDb25maWdPcHRpb25zfSBbb3B0c11cbiAgICovXG4gICBjb25zdHJ1Y3RvciAobWFuaWZlc3QsIHtsb2dGbiwgZXh0RGF0YX0gPSB7fSkge1xuICAgICBzdXBlcihEUklWRVJfVFlQRSwgbWFuaWZlc3QsIGxvZ0ZuKTtcblxuICAgICB0aGlzLmtub3duQXV0b21hdGlvbk5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgIGlmIChleHREYXRhKSB7XG4gICAgICAgdGhpcy52YWxpZGF0ZShleHREYXRhKTtcbiAgICAgfVxuICAgfVxuXG4gICAvKipcbiAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIERyaXZlckNvbmZpZ30gaW5zdGFuY2UgZm9yIGEge0BsaW5rIE1hbmlmZXN0fSBpbnN0YW5jZS5cbiAgICAqXG4gICAgKiBAcGFyYW0ge01hbmlmZXN0fSBtYW5pZmVzdFxuICAgICogQHBhcmFtIHtEcml2ZXJDb25maWdPcHRpb25zfSBbb3B0c11cbiAgICAqIEB0aHJvd3MgSWYgYG1hbmlmZXN0YCBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBhIGBEcml2ZXJDb25maWdgXG4gICAgKiBAcmV0dXJucyB7RHJpdmVyQ29uZmlnfVxuICAgICovXG4gICBzdGF0aWMgY3JlYXRlIChtYW5pZmVzdCwge2V4dERhdGEsIGxvZ0ZufSA9IHt9KSB7XG4gICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IERyaXZlckNvbmZpZyhtYW5pZmVzdCwge2xvZ0ZuLCBleHREYXRhfSk7XG4gICAgIGlmIChEcml2ZXJDb25maWcuZ2V0SW5zdGFuY2UobWFuaWZlc3QpKSB7XG4gICAgICAgdGhyb3cgbmV3IEVycm9yKGBNYW5pZmVzdCB3aXRoIEFQUElVTV9IT01FICR7bWFuaWZlc3QuYXBwaXVtSG9tZX0gYWxyZWFkeSBoYXMgYSBEcml2ZXJDb25maWc7IHVzZSBEcml2ZXJDb25maWcuZ2V0SW5zdGFuY2UoKSB0byByZXRyaWV2ZSBpdC5gKTtcbiAgICAgfVxuICAgICBEcml2ZXJDb25maWcuX2luc3RhbmNlcy5zZXQobWFuaWZlc3QsIGluc3RhbmNlKTtcbiAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgfVxuXG4gICAvKipcbiAgICAqIFJldHVybnMgYSBEcml2ZXJDb25maWcgYXNzb2NpYXRlZCB3aXRoIGEgTWFuaWZlc3RcbiAgICAqIEBwYXJhbSB7TWFuaWZlc3R9IG1hbmlmZXN0XG4gICAgKiBAcmV0dXJucyB7RHJpdmVyQ29uZmlnfHVuZGVmaW5lZH1cbiAgICAqL1xuICAgc3RhdGljIGdldEluc3RhbmNlIChtYW5pZmVzdCkge1xuICAgICByZXR1cm4gRHJpdmVyQ29uZmlnLl9pbnN0YW5jZXMuZ2V0KG1hbmlmZXN0KTtcbiAgIH1cblxuICAgLyoqXG4gICAqIENoZWNrcyBleHRlbnNpb25zIGZvciBwcm9ibGVtc1xuICAgKiBAcGFyYW0ge0V4dFJlY29yZDxEcml2ZXJUeXBlPn0gZXh0c1xuICAgKi9cbiAgIHZhbGlkYXRlIChleHRzKSB7XG4gICAgIHRoaXMua25vd25BdXRvbWF0aW9uTmFtZXMuY2xlYXIoKTtcbiAgICAgcmV0dXJuIHN1cGVyLnZhbGlkYXRlKGV4dHMpO1xuICAgfVxuXG4gICAvKipcbiAgICogQHBhcmFtIHtNYW5pZmVzdERyaXZlckRhdGF9IGV4dERhdGFcbiAgICogQHJldHVybnMge2ltcG9ydCgnLi9leHRlbnNpb24tY29uZmlnJykuUHJvYmxlbVtdfVxuICAgKi9cbiAgIGdldENvbmZpZ1Byb2JsZW1zIChleHREYXRhKSB7XG4gICAgIGNvbnN0IHByb2JsZW1zID0gW107XG4gICAgIGNvbnN0IHtwbGF0Zm9ybU5hbWVzLCBhdXRvbWF0aW9uTmFtZX0gPSBleHREYXRhO1xuXG4gICAgIGlmICghXy5pc0FycmF5KHBsYXRmb3JtTmFtZXMpKSB7XG4gICAgICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICAgICBlcnI6ICdNaXNzaW5nIG9yIGluY29ycmVjdCBzdXBwb3J0ZWQgcGxhdGZvcm1OYW1lcyBsaXN0LicsXG4gICAgICAgICB2YWw6IHBsYXRmb3JtTmFtZXNcbiAgICAgICB9KTtcbiAgICAgfSBlbHNlIHtcbiAgICAgICBpZiAoXy5pc0VtcHR5KHBsYXRmb3JtTmFtZXMpKSB7XG4gICAgICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgICAgZXJyOiAnRW1wdHkgcGxhdGZvcm1OYW1lcyBsaXN0LicsXG4gICAgICAgICAgIHZhbDogcGxhdGZvcm1OYW1lc1xuICAgICAgICAgfSk7XG4gICAgICAgfSBlbHNlIHtcbiAgICAgICAgIGZvciAoY29uc3QgcE5hbWUgb2YgcGxhdGZvcm1OYW1lcykge1xuICAgICAgICAgICBpZiAoIV8uaXNTdHJpbmcocE5hbWUpKSB7XG4gICAgICAgICAgICAgcHJvYmxlbXMucHVzaCh7ZXJyOiAnSW5jb3JyZWN0bHkgZm9ybWF0dGVkIHBsYXRmb3JtTmFtZS4nLCB2YWw6IHBOYW1lfSk7XG4gICAgICAgICAgIH1cbiAgICAgICAgIH1cbiAgICAgICB9XG4gICAgIH1cblxuICAgICBpZiAoIV8uaXNTdHJpbmcoYXV0b21hdGlvbk5hbWUpKSB7XG4gICAgICAgcHJvYmxlbXMucHVzaCh7ZXJyOiAnTWlzc2luZyBvciBpbmNvcnJlY3QgYXV0b21hdGlvbk5hbWUnLCB2YWw6IGF1dG9tYXRpb25OYW1lfSk7XG4gICAgIH1cblxuICAgICBpZiAodGhpcy5rbm93bkF1dG9tYXRpb25OYW1lcy5oYXMoYXV0b21hdGlvbk5hbWUpKSB7XG4gICAgICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICAgICBlcnI6ICdNdWx0aXBsZSBkcml2ZXJzIGNsYWltIHN1cHBvcnQgZm9yIHRoZSBzYW1lIGF1dG9tYXRpb25OYW1lJyxcbiAgICAgICAgIHZhbDogYXV0b21hdGlvbk5hbWVcbiAgICAgICB9KTtcbiAgICAgfVxuXG4gICAgIC8vIHNob3VsZCB3ZSByZXRhaW4gdGhlIG5hbWUgYXQgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uLCBvbmNlIHdlJ3ZlIGNoZWNrZWQgdGhlcmUgYXJlIG5vIHByb2JsZW1zP1xuICAgICB0aGlzLmtub3duQXV0b21hdGlvbk5hbWVzLmFkZChhdXRvbWF0aW9uTmFtZSk7XG5cbiAgICAgcmV0dXJuIHByb2JsZW1zO1xuICAgfVxuXG4gICAvKipcbiAgICogQHBhcmFtIHtFeHROYW1lPERyaXZlclR5cGU+fSBkcml2ZXJOYW1lXG4gICAqIEBwYXJhbSB7TWFuaWZlc3REcml2ZXJEYXRhfSBleHREYXRhXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICAgZXh0ZW5zaW9uRGVzYyAoZHJpdmVyTmFtZSwge3ZlcnNpb24sIGF1dG9tYXRpb25OYW1lfSkge1xuICAgICByZXR1cm4gYCR7ZHJpdmVyTmFtZX1AJHt2ZXJzaW9ufSAoYXV0b21hdGlvbk5hbWUgJyR7YXV0b21hdGlvbk5hbWV9JylgO1xuICAgfVxuXG4gICAvKipcbiAgICogR2l2ZW4gY2FwYWJpbGl0aWVzLCBmaW5kIGEgbWF0Y2hpbmcgZHJpdmVyIHdpdGhpbiB0aGUgY29uZmlnLiBMb2FkIGl0cyBjbGFzcyBhbmQgcmV0dXJuIGl0IGFsb25nIHdpdGggdmVyc2lvbiBhbmQgZHJpdmVyIG5hbWUuXG4gICAqIEBwYXJhbSB7IHsgYXV0b21hdGlvbk5hbWU6IHN0cmluZywgcGxhdGZvcm1OYW1lOiBzdHJpbmcgfSB9IGNhcHNcbiAgICogQHJldHVybnMgeyB7IGRyaXZlcjogaW1wb3J0KCcuL21hbmlmZXN0JykuRHJpdmVyQ2xhc3MsIHZlcnNpb246IHN0cmluZywgZHJpdmVyTmFtZTogc3RyaW5nIH0gfVxuICAgKi9cbiAgIGZpbmRNYXRjaGluZ0RyaXZlciAoe2F1dG9tYXRpb25OYW1lLCBwbGF0Zm9ybU5hbWV9KSB7XG4gICAgIGlmICghXy5pc1N0cmluZyhwbGF0Zm9ybU5hbWUpKSB7XG4gICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBpbmNsdWRlIGEgcGxhdGZvcm1OYW1lIGNhcGFiaWxpdHknKTtcbiAgICAgfVxuXG4gICAgIGlmICghXy5pc1N0cmluZyhhdXRvbWF0aW9uTmFtZSkpIHtcbiAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IGluY2x1ZGUgYW4gYXV0b21hdGlvbk5hbWUgY2FwYWJpbGl0eScpO1xuICAgICB9XG5cbiAgICAgbG9nLmluZm8oYEF0dGVtcHRpbmcgdG8gZmluZCBtYXRjaGluZyBkcml2ZXIgZm9yIGF1dG9tYXRpb25OYW1lIGAgK1xuICAgICAgICAgICAgIGAnJHthdXRvbWF0aW9uTmFtZX0nIGFuZCBwbGF0Zm9ybU5hbWUgJyR7cGxhdGZvcm1OYW1lfSdgKTtcblxuICAgICB0cnkge1xuICAgICAgIGNvbnN0IHtcbiAgICAgICAgIGRyaXZlck5hbWUsXG4gICAgICAgICBtYWluQ2xhc3MsXG4gICAgICAgICB2ZXJzaW9uLFxuICAgICAgIH0gPSB0aGlzLl9nZXREcml2ZXJCeVN1cHBvcnQoYXV0b21hdGlvbk5hbWUsIHBsYXRmb3JtTmFtZSk7XG4gICAgICAgbG9nLmluZm8oYFRoZSAnJHtkcml2ZXJOYW1lfScgZHJpdmVyIHdhcyBpbnN0YWxsZWQgYW5kIG1hdGNoZWQgY2Fwcy5gKTtcbiAgICAgICBsb2cuaW5mbyhgV2lsbCByZXF1aXJlIGl0IGF0ICR7dGhpcy5nZXRJbnN0YWxsUGF0aChkcml2ZXJOYW1lKX1gKTtcbiAgICAgICBjb25zdCBkcml2ZXIgPSB0aGlzLnJlcXVpcmUoZHJpdmVyTmFtZSk7XG4gICAgICAgaWYgKCFkcml2ZXIpIHtcbiAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRHJpdmVyICcke2RyaXZlck5hbWV9JyBkaWQgbm90IGV4cG9ydCBhIGNsYXNzIHdpdGggbmFtZSAnJHttYWluQ2xhc3N9Jy4gQ29udGFjdCB0aGUgYXV0aG9yIG9mIHRoZSBkcml2ZXIhYCk7XG4gICAgICAgfVxuICAgICAgIHJldHVybiB7ZHJpdmVyLCB2ZXJzaW9uLCBkcml2ZXJOYW1lfTtcbiAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgY29uc3QgbXNnID0gYENvdWxkIG5vdCBmaW5kIGEgZHJpdmVyIGZvciBhdXRvbWF0aW9uTmFtZSBgICtcbiAgICAgICAgICAgICAgICAgIGAnJHthdXRvbWF0aW9uTmFtZX0nIGFuZCBwbGF0Zm9ybU5hbWUgJHtwbGF0Zm9ybU5hbWV9Jy4gYCArXG4gICAgICAgICAgICAgICAgICBgSGF2ZSB5b3UgaW5zdGFsbGVkIGEgZHJpdmVyIHRoYXQgc3VwcG9ydHMgdGhvc2UgYCArXG4gICAgICAgICAgICAgICAgICBgY2FwYWJpbGl0aWVzPyBSdW4gJ2FwcGl1bSBkcml2ZXIgbGlzdCAtLWluc3RhbGxlZCcgdG8gc2VlLiBgICtcbiAgICAgICAgICAgICAgICAgIGAoTG93ZXItbGV2ZWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9KWA7XG4gICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgIH1cbiAgIH1cblxuICAgLyoqXG4gICAqIEdpdmVuIGFuIGF1dG9tYXRpb24gbmFtZSBhbmQgcGxhdGZvcm0gbmFtZSwgZmluZCBhIHN1aXRhYmxlIGRyaXZlciBhbmQgcmV0dXJuIGl0cyBleHRlbnNpb24gZGF0YS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoQXV0b21hdGlvbk5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoUGxhdGZvcm1OYW1lXG4gICAqIEByZXR1cm5zIHtNYW5pZmVzdERyaXZlckRhdGEgJiB7IGRyaXZlck5hbWU6IHN0cmluZyB9IH1cbiAgICovXG4gICBfZ2V0RHJpdmVyQnlTdXBwb3J0IChtYXRjaEF1dG9tYXRpb25OYW1lLCBtYXRjaFBsYXRmb3JtTmFtZSkge1xuICAgICBjb25zdCBkcml2ZXJzID0gdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zO1xuICAgICBmb3IgKGNvbnN0IFtkcml2ZXJOYW1lLCBkcml2ZXJEYXRhXSBvZiBfLnRvUGFpcnMoZHJpdmVycykpIHtcbiAgICAgICBjb25zdCB7YXV0b21hdGlvbk5hbWUsIHBsYXRmb3JtTmFtZXN9ID0gZHJpdmVyRGF0YTtcbiAgICAgICBjb25zdCBhTmFtZU1hdGNoZXMgPSBhdXRvbWF0aW9uTmFtZS50b0xvd2VyQ2FzZSgpID09PSBtYXRjaEF1dG9tYXRpb25OYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgY29uc3QgcE5hbWVNYXRjaGVzID0gXy5pbmNsdWRlcyhwbGF0Zm9ybU5hbWVzLm1hcChfLnRvTG93ZXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFBsYXRmb3JtTmFtZS50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgIGlmIChhTmFtZU1hdGNoZXMgJiYgcE5hbWVNYXRjaGVzKSB7XG4gICAgICAgICByZXR1cm4ge2RyaXZlck5hbWUsIC4uLmRyaXZlckRhdGF9O1xuICAgICAgIH1cblxuICAgICAgIGlmIChhTmFtZU1hdGNoZXMpIHtcbiAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRHJpdmVyICcke2RyaXZlck5hbWV9JyBzdXBwb3J0cyBhdXRvbWF0aW9uTmFtZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAnJHthdXRvbWF0aW9uTmFtZX0nLCBidXQgQXBwaXVtIGNvdWxkIG5vdCBmaW5kIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYHN1cHBvcnQgZm9yIHBsYXRmb3JtTmFtZSAnJHttYXRjaFBsYXRmb3JtTmFtZX0nLiBTdXBwb3J0ZWQgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgcGxhdGZvcm1OYW1lcyBhcmU6IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkocGxhdGZvcm1OYW1lcykpO1xuICAgICAgIH1cbiAgICAgfVxuXG4gICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgaW5zdGFsbGVkIGRyaXZlciB0byBzdXBwb3J0IGdpdmVuIGNhcHNgKTtcbiAgIH1cbn1cblxuLyoqXG4gKiBAdHlwZWRlZiBEcml2ZXJDb25maWdPcHRpb25zXG4gKiBAcHJvcGVydHkge2ltcG9ydCgnLi9leHRlbnNpb24tY29uZmlnJykuRXh0ZW5zaW9uTG9nRm59IFtsb2dGbl0gLSBPcHRpb25hbCBsb2dnaW5nIGZ1bmN0aW9uXG4gKiBAcHJvcGVydHkge01hbmlmZXN0RGF0YVsnZHJpdmVycyddfSBbZXh0RGF0YV0gLSBFeHRlbnNpb24gZGF0YVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnLi9tYW5pZmVzdCcpLkV4dGVybmFsRGF0YTxEcml2ZXJUeXBlPn0gRXh0ZXJuYWxEcml2ZXJEYXRhXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuL21hbmlmZXN0JykuTWFuaWZlc3REcml2ZXJEYXRhfSBNYW5pZmVzdERyaXZlckRhdGFcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4vbWFuaWZlc3QnKS5NYW5pZmVzdERhdGF9IE1hbmlmZXN0RGF0YVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi9tYW5pZmVzdCcpLkRyaXZlclR5cGV9IERyaXZlclR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4vbWFuaWZlc3QnKS5NYW5pZmVzdH0gTWFuaWZlc3RcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuL2V4dGVuc2lvbi1jb25maWcnKS5FeHRSZWNvcmQ8VD59IEV4dFJlY29yZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4vZXh0ZW5zaW9uLWNvbmZpZycpLkV4dE5hbWU8VD59IEV4dE5hbWVcbiAqL1xuXG4iXX0=
@@ -0,0 +1,297 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.INSTALL_TYPE_NPM = exports.INSTALL_TYPE_LOCAL = exports.INSTALL_TYPE_GITHUB = exports.INSTALL_TYPE_GIT = exports.INSTALL_TYPES = exports.ExtensionConfig = void 0;
9
+
10
+ require("source-map-support/register");
11
+
12
+ var _lodash = _interopRequireDefault(require("lodash"));
13
+
14
+ var _path = _interopRequireDefault(require("path"));
15
+
16
+ var _resolveFrom = _interopRequireDefault(require("resolve-from"));
17
+
18
+ var _logger = _interopRequireDefault(require("../logger"));
19
+
20
+ var _schema = require("../schema/schema");
21
+
22
+ const INSTALL_TYPE_NPM = 'npm';
23
+ exports.INSTALL_TYPE_NPM = INSTALL_TYPE_NPM;
24
+ const INSTALL_TYPE_LOCAL = 'local';
25
+ exports.INSTALL_TYPE_LOCAL = INSTALL_TYPE_LOCAL;
26
+ const INSTALL_TYPE_GITHUB = 'github';
27
+ exports.INSTALL_TYPE_GITHUB = INSTALL_TYPE_GITHUB;
28
+ const INSTALL_TYPE_GIT = 'git';
29
+ exports.INSTALL_TYPE_GIT = INSTALL_TYPE_GIT;
30
+ const INSTALL_TYPES = new Set([INSTALL_TYPE_GIT, INSTALL_TYPE_GITHUB, INSTALL_TYPE_LOCAL, INSTALL_TYPE_NPM]);
31
+ exports.INSTALL_TYPES = INSTALL_TYPES;
32
+
33
+ class ExtensionConfig {
34
+ extensionType;
35
+ configKey;
36
+ installedExtensions;
37
+ log;
38
+ manifest;
39
+
40
+ constructor(extensionType, manifest, logFn) {
41
+ const logger = _lodash.default.isFunction(logFn) ? logFn : _logger.default.error.bind(_logger.default);
42
+ this.extensionType = extensionType;
43
+ this.configKey = `${extensionType}s`;
44
+ this.installedExtensions = manifest.getExtensionData(extensionType);
45
+ this.log = logger;
46
+ this.manifest = manifest;
47
+ }
48
+
49
+ get manifestPath() {
50
+ return this.manifest.manifestPath;
51
+ }
52
+
53
+ get appiumHome() {
54
+ return this.manifest.appiumHome;
55
+ }
56
+
57
+ validate(exts) {
58
+ const foundProblems = {};
59
+
60
+ for (const [extName, extData] of _lodash.default.toPairs(exts)) {
61
+ foundProblems[extName] = [...this.getGenericConfigProblems(extData, extName), ...this.getConfigProblems(extData), ...this.getSchemaProblems(extData, extName)];
62
+ }
63
+
64
+ const problemSummaries = [];
65
+
66
+ for (const [extName, problems] of _lodash.default.toPairs(foundProblems)) {
67
+ if (_lodash.default.isEmpty(problems)) {
68
+ continue;
69
+ }
70
+
71
+ delete exts[extName];
72
+ problemSummaries.push(`${this.extensionType} ${extName} had errors and will not ` + `be available. Errors:`);
73
+
74
+ for (const problem of problems) {
75
+ problemSummaries.push(` - ${problem.err} (Actual value: ` + `${JSON.stringify(problem.val)})`);
76
+ }
77
+ }
78
+
79
+ if (!_lodash.default.isEmpty(problemSummaries)) {
80
+ this.log(`Appium encountered one or more errors while validating ` + `the ${this.configKey} extension file (${this.manifestPath}):`);
81
+
82
+ for (const summary of problemSummaries) {
83
+ this.log(summary);
84
+ }
85
+ }
86
+
87
+ return exts;
88
+ }
89
+
90
+ getSchemaProblems(extData, extName) {
91
+ const problems = [];
92
+ const {
93
+ schema: argSchemaPath
94
+ } = extData;
95
+
96
+ if (ExtensionConfig.extDataHasSchema(extData)) {
97
+ if (_lodash.default.isString(argSchemaPath)) {
98
+ if ((0, _schema.isAllowedSchemaFileExtension)(argSchemaPath)) {
99
+ try {
100
+ this.readExtensionSchema(extName, extData);
101
+ } catch (err) {
102
+ problems.push({
103
+ err: `Unable to register schema at path ${argSchemaPath}; ${err.message}`,
104
+ val: argSchemaPath
105
+ });
106
+ }
107
+ } else {
108
+ problems.push({
109
+ err: `Schema file has unsupported extension. Allowed: ${[..._schema.ALLOWED_SCHEMA_EXTENSIONS].join(', ')}`,
110
+ val: argSchemaPath
111
+ });
112
+ }
113
+ } else if (_lodash.default.isPlainObject(argSchemaPath)) {
114
+ try {
115
+ this.readExtensionSchema(extName, extData);
116
+ } catch (err) {
117
+ problems.push({
118
+ err: `Unable to register embedded schema; ${err.message}`,
119
+ val: argSchemaPath
120
+ });
121
+ }
122
+ } else {
123
+ problems.push({
124
+ err: 'Incorrectly formatted schema field; must be a path to a schema file or a schema object.',
125
+ val: argSchemaPath
126
+ });
127
+ }
128
+ }
129
+
130
+ return problems;
131
+ }
132
+
133
+ getGenericConfigProblems(extData, extName) {
134
+ const {
135
+ version,
136
+ pkgName,
137
+ installSpec,
138
+ installType,
139
+ mainClass
140
+ } = extData;
141
+ const problems = [];
142
+
143
+ if (!_lodash.default.isString(version)) {
144
+ problems.push({
145
+ err: 'Missing or incorrect version',
146
+ val: version
147
+ });
148
+ }
149
+
150
+ if (!_lodash.default.isString(pkgName)) {
151
+ problems.push({
152
+ err: 'Missing or incorrect NPM package name',
153
+ val: pkgName
154
+ });
155
+ }
156
+
157
+ if (!_lodash.default.isString(installSpec)) {
158
+ problems.push({
159
+ err: 'Missing or incorrect installation spec',
160
+ val: installSpec
161
+ });
162
+ }
163
+
164
+ if (!INSTALL_TYPES.has(installType)) {
165
+ problems.push({
166
+ err: 'Missing or incorrect install type',
167
+ val: installType
168
+ });
169
+ }
170
+
171
+ if (!_lodash.default.isString(mainClass)) {
172
+ problems.push({
173
+ err: 'Missing or incorrect driver class name',
174
+ val: mainClass
175
+ });
176
+ }
177
+
178
+ return problems;
179
+ }
180
+
181
+ getConfigProblems(extData) {
182
+ return [];
183
+ }
184
+
185
+ async addExtension(extName, extData, {
186
+ write = true
187
+ } = {}) {
188
+ await this.manifest.addExtension(this.extensionType, extName, extData);
189
+
190
+ if (write) {
191
+ await this.manifest.write();
192
+ }
193
+ }
194
+
195
+ async updateExtension(extName, extData, {
196
+ write = true
197
+ } = {}) {
198
+ this.installedExtensions[extName] = { ...this.installedExtensions[extName],
199
+ ...extData
200
+ };
201
+
202
+ if (write) {
203
+ await this.manifest.write();
204
+ }
205
+ }
206
+
207
+ async removeExtension(extName, {
208
+ write = true
209
+ } = {}) {
210
+ delete this.installedExtensions[extName];
211
+
212
+ if (write) {
213
+ await this.manifest.write();
214
+ }
215
+ }
216
+
217
+ print(activeNames) {
218
+ if (_lodash.default.isEmpty(this.installedExtensions)) {
219
+ _logger.default.info(`No ${this.configKey} have been installed in ${this.appiumHome}. Use the "appium ${this.extensionType}" ` + 'command to install the one(s) you want to use.');
220
+
221
+ return;
222
+ }
223
+
224
+ _logger.default.info(`Available ${this.configKey}:`);
225
+
226
+ for (const [extName, extData] of _lodash.default.toPairs(this.installedExtensions)) {
227
+ _logger.default.info(` - ${this.extensionDesc(extName, extData)}`);
228
+ }
229
+ }
230
+
231
+ extensionDesc(extName, extData) {
232
+ throw new Error('This must be implemented in a subclass');
233
+ }
234
+
235
+ getInstallPath(extName) {
236
+ return _path.default.join(this.appiumHome, 'node_modules', this.installedExtensions[extName].pkgName);
237
+ }
238
+
239
+ require(extName) {
240
+ const {
241
+ mainClass
242
+ } = this.installedExtensions[extName];
243
+ const reqPath = this.getInstallPath(extName);
244
+
245
+ const reqResolved = require.resolve(reqPath);
246
+
247
+ if (process.env.APPIUM_RELOAD_EXTENSIONS && require.cache[reqResolved]) {
248
+ _logger.default.debug(`Removing ${reqResolved} from require cache`);
249
+
250
+ delete require.cache[reqResolved];
251
+ }
252
+
253
+ _logger.default.debug(`Requiring ${this.extensionType} at ${reqPath}`);
254
+
255
+ return require(reqPath)[mainClass];
256
+ }
257
+
258
+ isInstalled(extName) {
259
+ return _lodash.default.includes(Object.keys(this.installedExtensions), extName);
260
+ }
261
+
262
+ static _readExtensionSchema(appiumHome, extType, extName, extData) {
263
+ const {
264
+ pkgName,
265
+ schema: argSchemaPath
266
+ } = extData;
267
+
268
+ if (!argSchemaPath) {
269
+ throw new TypeError(`No \`schema\` property found in config for ${extType} ${pkgName} -- why is this function being called?`);
270
+ }
271
+
272
+ let moduleObject;
273
+
274
+ if (_lodash.default.isString(argSchemaPath)) {
275
+ const schemaPath = (0, _resolveFrom.default)(appiumHome, _path.default.join(pkgName, argSchemaPath));
276
+ moduleObject = require(schemaPath);
277
+ } else {
278
+ moduleObject = argSchemaPath;
279
+ }
280
+
281
+ const schema = moduleObject.__esModule ? moduleObject.default : moduleObject;
282
+ (0, _schema.registerSchema)(extType, extName, schema);
283
+ return schema;
284
+ }
285
+
286
+ static extDataHasSchema(extData) {
287
+ return _lodash.default.isString(extData === null || extData === void 0 ? void 0 : extData.schema) || _lodash.default.isObject(extData === null || extData === void 0 ? void 0 : extData.schema);
288
+ }
289
+
290
+ readExtensionSchema(extName, extData) {
291
+ return ExtensionConfig._readExtensionSchema(this.appiumHome, this.extensionType, extName, extData);
292
+ }
293
+
294
+ }
295
+
296
+ exports.ExtensionConfig = ExtensionConfig;
297
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9leHRlbnNpb24vZXh0ZW5zaW9uLWNvbmZpZy5qcyJdLCJuYW1lcyI6WyJJTlNUQUxMX1RZUEVfTlBNIiwiSU5TVEFMTF9UWVBFX0xPQ0FMIiwiSU5TVEFMTF9UWVBFX0dJVEhVQiIsIklOU1RBTExfVFlQRV9HSVQiLCJJTlNUQUxMX1RZUEVTIiwiU2V0IiwiRXh0ZW5zaW9uQ29uZmlnIiwiZXh0ZW5zaW9uVHlwZSIsImNvbmZpZ0tleSIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJsb2ciLCJtYW5pZmVzdCIsImNvbnN0cnVjdG9yIiwibG9nRm4iLCJsb2dnZXIiLCJfIiwiaXNGdW5jdGlvbiIsImVycm9yIiwiYmluZCIsImdldEV4dGVuc2lvbkRhdGEiLCJtYW5pZmVzdFBhdGgiLCJhcHBpdW1Ib21lIiwidmFsaWRhdGUiLCJleHRzIiwiZm91bmRQcm9ibGVtcyIsImV4dE5hbWUiLCJleHREYXRhIiwidG9QYWlycyIsImdldEdlbmVyaWNDb25maWdQcm9ibGVtcyIsImdldENvbmZpZ1Byb2JsZW1zIiwiZ2V0U2NoZW1hUHJvYmxlbXMiLCJwcm9ibGVtU3VtbWFyaWVzIiwicHJvYmxlbXMiLCJpc0VtcHR5IiwicHVzaCIsInByb2JsZW0iLCJlcnIiLCJKU09OIiwic3RyaW5naWZ5IiwidmFsIiwic3VtbWFyeSIsInNjaGVtYSIsImFyZ1NjaGVtYVBhdGgiLCJleHREYXRhSGFzU2NoZW1hIiwiaXNTdHJpbmciLCJyZWFkRXh0ZW5zaW9uU2NoZW1hIiwibWVzc2FnZSIsIkFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlMiLCJqb2luIiwiaXNQbGFpbk9iamVjdCIsInZlcnNpb24iLCJwa2dOYW1lIiwiaW5zdGFsbFNwZWMiLCJpbnN0YWxsVHlwZSIsIm1haW5DbGFzcyIsImhhcyIsImFkZEV4dGVuc2lvbiIsIndyaXRlIiwidXBkYXRlRXh0ZW5zaW9uIiwicmVtb3ZlRXh0ZW5zaW9uIiwicHJpbnQiLCJhY3RpdmVOYW1lcyIsImluZm8iLCJleHRlbnNpb25EZXNjIiwiRXJyb3IiLCJnZXRJbnN0YWxsUGF0aCIsInBhdGgiLCJyZXF1aXJlIiwicmVxUGF0aCIsInJlcVJlc29sdmVkIiwicmVzb2x2ZSIsInByb2Nlc3MiLCJlbnYiLCJBUFBJVU1fUkVMT0FEX0VYVEVOU0lPTlMiLCJjYWNoZSIsImRlYnVnIiwiaXNJbnN0YWxsZWQiLCJpbmNsdWRlcyIsIk9iamVjdCIsImtleXMiLCJfcmVhZEV4dGVuc2lvblNjaGVtYSIsImV4dFR5cGUiLCJUeXBlRXJyb3IiLCJtb2R1bGVPYmplY3QiLCJzY2hlbWFQYXRoIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJpc09iamVjdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFNQSxNQUFNQSxnQkFBZ0IsR0FBRyxLQUF6Qjs7QUFDQSxNQUFNQyxrQkFBa0IsR0FBRyxPQUEzQjs7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxRQUE1Qjs7QUFDQSxNQUFNQyxnQkFBZ0IsR0FBRyxLQUF6Qjs7QUFHQSxNQUFNQyxhQUFhLEdBQUcsSUFBSUMsR0FBSixDQUFRLENBQzVCRixnQkFENEIsRUFFNUJELG1CQUY0QixFQUc1QkQsa0JBSDRCLEVBSTVCRCxnQkFKNEIsQ0FBUixDQUF0Qjs7O0FBYU8sTUFBTU0sZUFBTixDQUFzQjtBQUUzQkMsRUFBQUEsYUFBYTtBQUdiQyxFQUFBQSxTQUFTO0FBR1RDLEVBQUFBLG1CQUFtQjtBQUduQkMsRUFBQUEsR0FBRztBQUdIQyxFQUFBQSxRQUFROztBQVFSQyxFQUFBQSxXQUFXLENBQUVMLGFBQUYsRUFBaUJJLFFBQWpCLEVBQTJCRSxLQUEzQixFQUFrQztBQUMzQyxVQUFNQyxNQUFNLEdBQUdDLGdCQUFFQyxVQUFGLENBQWFILEtBQWIsSUFBc0JBLEtBQXRCLEdBQThCSCxnQkFBSU8sS0FBSixDQUFVQyxJQUFWLENBQWVSLGVBQWYsQ0FBN0M7QUFDQSxTQUFLSCxhQUFMLEdBQXFCQSxhQUFyQjtBQUNBLFNBQUtDLFNBQUws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bUJBQW1CLENBQUVwQixPQUFGLEVBQVdDLE9BQVgsRUFBb0I7QUFDckMsV0FBT3BCLGVBQWUsQ0FBQzBFLG9CQUFoQixDQUNMLEtBQUszRCxVQURBLEVBRUwsS0FBS2QsYUFGQSxFQUdMa0IsT0FISyxFQUlMQyxPQUpLLENBQVA7QUFNRDs7QUEzVzBCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCByZXNvbHZlRnJvbSBmcm9tICdyZXNvbHZlLWZyb20nO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHtcbiAgQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OUyxcbiAgaXNBbGxvd2VkU2NoZW1hRmlsZUV4dGVuc2lvbixcbiAgcmVnaXN0ZXJTY2hlbWEsXG59IGZyb20gJy4uL3NjaGVtYS9zY2hlbWEnO1xuXG5jb25zdCBJTlNUQUxMX1RZUEVfTlBNID0gJ25wbSc7XG5jb25zdCBJTlNUQUxMX1RZUEVfTE9DQUwgPSAnbG9jYWwnO1xuY29uc3QgSU5TVEFMTF9UWVBFX0dJVEhVQiA9ICdnaXRodWInO1xuY29uc3QgSU5TVEFMTF9UWVBFX0dJVCA9ICdnaXQnO1xuXG4vKiogQHR5cGUge1NldDxJbnN0YWxsVHlwZT59ICovXG5jb25zdCBJTlNUQUxMX1RZUEVTID0gbmV3IFNldChbXG4gIElOU1RBTExfVFlQRV9HSVQsXG4gIElOU1RBTExfVFlQRV9HSVRIVUIsXG4gIElOU1RBTExfVFlQRV9MT0NBTCxcbiAgSU5TVEFMTF9UWVBFX05QTSxcbl0pO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgYWJzdHJhY3QuIEl0IHNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5LlxuICpcbiAqIFN1YmNsYXNzZXMgc2hvdWxkIHByb3ZpZGUgdGhlIGdlbmVyaWMgcGFyYW1ldGVyIHRvIGltcGxlbWVudC5cbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICovXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9uQ29uZmlnIHtcbiAgLyoqIEB0eXBlIHtFeHRUeXBlfSAqL1xuICBleHRlbnNpb25UeXBlO1xuXG4gIC8qKiBAdHlwZSB7YCR7RXh0VHlwZX1zYH0gKi9cbiAgY29uZmlnS2V5O1xuXG4gIC8qKiBAdHlwZSB7RXh0UmVjb3JkPEV4dFR5cGU+fSAqL1xuICBpbnN0YWxsZWRFeHRlbnNpb25zO1xuXG4gIC8qKiBAdHlwZSB7RXh0ZW5zaW9uTG9nRm59ICovXG4gIGxvZztcblxuICAvKiogQHR5cGUge01hbmlmZXN0fSAqL1xuICBtYW5pZmVzdDtcblxuICAvKipcbiAgICogQHByb3RlY3RlZFxuICAgKiBAcGFyYW0ge0V4dFR5cGV9IGV4dGVuc2lvblR5cGUgLSBUeXBlIG9mIGV4dGVuc2lvblxuICAgKiBAcGFyYW0ge01hbmlmZXN0fSBtYW5pZmVzdCAtIGBNYW5pZmVzdGAgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtFeHRlbnNpb25Mb2dGbn0gW2xvZ0ZuXVxuICAgKi9cbiAgY29uc3RydWN0b3IgKGV4dGVuc2lvblR5cGUsIG1hbmlmZXN0LCBsb2dGbikge1xuICAgIGNvbnN0IGxvZ2dlciA9IF8uaXNGdW5jdGlvbihsb2dGbikgPyBsb2dGbiA6IGxvZy5lcnJvci5iaW5kKGxvZyk7XG4gICAgdGhpcy5leHRlbnNpb25UeXBlID0gZXh0ZW5zaW9uVHlwZTtcbiAgICB0aGlzLmNvbmZpZ0tleSA9IGAke2V4dGVuc2lvblR5cGV9c2A7XG4gICAgdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zID0gbWFuaWZlc3QuZ2V0RXh0ZW5zaW9uRGF0YShleHRlbnNpb25UeXBlKTtcbiAgICB0aGlzLmxvZyA9IGxvZ2dlcjtcbiAgICB0aGlzLm1hbmlmZXN0ID0gbWFuaWZlc3Q7XG4gIH1cblxuICBnZXQgbWFuaWZlc3RQYXRoICgpIHtcbiAgICByZXR1cm4gdGhpcy5tYW5pZmVzdC5tYW5pZmVzdFBhdGg7XG4gIH1cblxuICBnZXQgYXBwaXVtSG9tZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFuaWZlc3QuYXBwaXVtSG9tZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgZXh0ZW5zaW9ucyBmb3IgcHJvYmxlbXNcbiAgICogQHBhcmFtIHtFeHRSZWNvcmQ8RXh0VHlwZT59IGV4dHMgLSBFeHRlbnNpb24gZGF0YVxuICAgKi9cbiAgdmFsaWRhdGUgKGV4dHMpIHtcbiAgICBjb25zdCBmb3VuZFByb2JsZW1zID1cbiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPEV4dE5hbWU8RXh0VHlwZT4sUHJvYmxlbVtdPn0gKi8gKHt9KTtcbiAgICBmb3IgKGNvbnN0IFtcbiAgICAgIGV4dE5hbWUsXG4gICAgICBleHREYXRhLFxuICAgIF0gb2YgLyoqIEB0eXBlIHtbRXh0TmFtZTxFeHRUeXBlPiwgRXh0RGF0YTxFeHRUeXBlPl1bXX0gKi8gKFxuICAgICAgICBfLnRvUGFpcnMoZXh0cylcbiAgICAgICkpIHtcbiAgICAgIGZvdW5kUHJvYmxlbXNbZXh0TmFtZV0gPSBbXG4gICAgICAgIC4uLnRoaXMuZ2V0R2VuZXJpY0NvbmZpZ1Byb2JsZW1zKGV4dERhdGEsIGV4dE5hbWUpLFxuICAgICAgICAuLi50aGlzLmdldENvbmZpZ1Byb2JsZW1zKGV4dERhdGEpLFxuICAgICAgICAuLi50aGlzLmdldFNjaGVtYVByb2JsZW1zKGV4dERhdGEsIGV4dE5hbWUpLFxuICAgICAgXTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9ibGVtU3VtbWFyaWVzID0gW107XG4gICAgZm9yIChjb25zdCBbZXh0TmFtZSwgcHJvYmxlbXNdIG9mIF8udG9QYWlycyhmb3VuZFByb2JsZW1zKSkge1xuICAgICAgaWYgKF8uaXNFbXB0eShwcm9ibGVtcykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyByZW1vdmUgdGhpcyBleHRlbnNpb24gZnJvbSB0aGUgbGlzdCBzaW5jZSBpdCdzIG5vdCB2YWxpZFxuICAgICAgZGVsZXRlIGV4dHNbZXh0TmFtZV07XG4gICAgICBwcm9ibGVtU3VtbWFyaWVzLnB1c2goXG4gICAgICAgIGAke3RoaXMuZXh0ZW5zaW9uVHlwZX0gJHtleHROYW1lfSBoYWQgZXJyb3JzIGFuZCB3aWxsIG5vdCBgICtcbiAgICAgICAgICBgYmUgYXZhaWxhYmxlLiBFcnJvcnM6YCxcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IHByb2JsZW0gb2YgcHJvYmxlbXMpIHtcbiAgICAgICAgcHJvYmxlbVN1bW1hcmllcy5wdXNoKFxuICAgICAgICAgIGAgIC0gJHtwcm9ibGVtLmVycn0gKEFjdHVhbCB2YWx1ZTogYCArXG4gICAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShwcm9ibGVtLnZhbCl9KWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzRW1wdHkocHJvYmxlbVN1bW1hcmllcykpIHtcbiAgICAgIHRoaXMubG9nKFxuICAgICAgICBgQXBwaXVtIGVuY291bnRlcmVkIG9uZSBvciBtb3JlIGVycm9ycyB3aGlsZSB2YWxpZGF0aW5nIGAgK1xuICAgICAgICAgIGB0aGUgJHt0aGlzLmNvbmZpZ0tleX0gZXh0ZW5zaW9uIGZpbGUgKCR7dGhpcy5tYW5pZmVzdFBhdGh9KTpgLFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3Qgc3VtbWFyeSBvZiBwcm9ibGVtU3VtbWFyaWVzKSB7XG4gICAgICAgIHRoaXMubG9nKHN1bW1hcnkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBleHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXh0RGF0YTxFeHRUeXBlPn0gZXh0RGF0YVxuICAgKiBAcGFyYW0ge0V4dE5hbWU8RXh0VHlwZT59IGV4dE5hbWVcbiAgICogQHJldHVybnMge1Byb2JsZW1bXX1cbiAgICovXG4gIGdldFNjaGVtYVByb2JsZW1zIChleHREYXRhLCBleHROYW1lKSB7XG4gICAgY29uc3QgcHJvYmxlbXMgPSBbXTtcbiAgICBjb25zdCB7c2NoZW1hOiBhcmdTY2hlbWFQYXRofSA9IGV4dERhdGE7XG4gICAgaWYgKEV4dGVuc2lvbkNvbmZpZy5leHREYXRhSGFzU2NoZW1hKGV4dERhdGEpKSB7XG4gICAgICBpZiAoXy5pc1N0cmluZyhhcmdTY2hlbWFQYXRoKSkge1xuICAgICAgICBpZiAoaXNBbGxvd2VkU2NoZW1hRmlsZUV4dGVuc2lvbihhcmdTY2hlbWFQYXRoKSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnJlYWRFeHRlbnNpb25TY2hlbWEoZXh0TmFtZSwgZXh0RGF0YSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgZXJyOiBgVW5hYmxlIHRvIHJlZ2lzdGVyIHNjaGVtYSBhdCBwYXRoICR7YXJnU2NoZW1hUGF0aH07ICR7ZXJyLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgdmFsOiBhcmdTY2hlbWFQYXRoLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICAgICAgZXJyOiBgU2NoZW1hIGZpbGUgaGFzIHVuc3VwcG9ydGVkIGV4dGVuc2lvbi4gQWxsb3dlZDogJHtbXG4gICAgICAgICAgICAgIC4uLkFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlMsXG4gICAgICAgICAgICBdLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgIHZhbDogYXJnU2NoZW1hUGF0aCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChfLmlzUGxhaW5PYmplY3QoYXJnU2NoZW1hUGF0aCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLnJlYWRFeHRlbnNpb25TY2hlbWEoZXh0TmFtZSwgZXh0RGF0YSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICAgICAgZXJyOiBgVW5hYmxlIHRvIHJlZ2lzdGVyIGVtYmVkZGVkIHNjaGVtYTsgJHtlcnIubWVzc2FnZX1gLFxuICAgICAgICAgICAgdmFsOiBhcmdTY2hlbWFQYXRoLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgICBlcnI6ICdJbmNvcnJlY3RseSBmb3JtYXR0ZWQgc2NoZW1hIGZpZWxkOyBtdXN0IGJlIGEgcGF0aCB0byBhIHNjaGVtYSBmaWxlIG9yIGEgc2NoZW1hIG9iamVjdC4nLFxuICAgICAgICAgIHZhbDogYXJnU2NoZW1hUGF0aCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9ibGVtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V4dERhdGE8RXh0VHlwZT59IGV4dERhdGFcbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtQcm9ibGVtW119XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZ2V0R2VuZXJpY0NvbmZpZ1Byb2JsZW1zIChleHREYXRhLCBleHROYW1lKSB7XG4gICAgY29uc3Qge3ZlcnNpb24sIHBrZ05hbWUsIGluc3RhbGxTcGVjLCBpbnN0YWxsVHlwZSwgbWFpbkNsYXNzfSA9XG4gICAgICBleHREYXRhO1xuICAgIGNvbnN0IHByb2JsZW1zID0gW107XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcodmVyc2lvbikpIHtcbiAgICAgIHByb2JsZW1zLnB1c2goe2VycjogJ01pc3Npbmcgb3IgaW5jb3JyZWN0IHZlcnNpb24nLCB2YWw6IHZlcnNpb259KTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGtnTmFtZSkpIHtcbiAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICBlcnI6ICdNaXNzaW5nIG9yIGluY29ycmVjdCBOUE0gcGFja2FnZSBuYW1lJyxcbiAgICAgICAgdmFsOiBwa2dOYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKGluc3RhbGxTcGVjKSkge1xuICAgICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICAgIGVycjogJ01pc3Npbmcgb3IgaW5jb3JyZWN0IGluc3RhbGxhdGlvbiBzcGVjJyxcbiAgICAgICAgdmFsOiBpbnN0YWxsU3BlYyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghSU5TVEFMTF9UWVBFUy5oYXMoaW5zdGFsbFR5cGUpKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgZXJyOiAnTWlzc2luZyBvciBpbmNvcnJlY3QgaW5zdGFsbCB0eXBlJyxcbiAgICAgICAgdmFsOiBpbnN0YWxsVHlwZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhtYWluQ2xhc3MpKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgZXJyOiAnTWlzc2luZyBvciBpbmNvcnJlY3QgZHJpdmVyIGNsYXNzIG5hbWUnLFxuICAgICAgICB2YWw6IG1haW5DbGFzcyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9ibGVtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtFeHREYXRhPEV4dFR5cGU+fSBleHREYXRhXG4gICAqIEByZXR1cm5zIHtQcm9ibGVtW119XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZ2V0Q29uZmlnUHJvYmxlbXMgKGV4dERhdGEpIHtcbiAgICAvLyBzaG91ZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiBzcGVjaWFsIHZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IGZvciB0aGlzIGV4dGVuc2lvbiB0eXBlXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqIEBwYXJhbSB7RXh0RGF0YTxFeHRUeXBlPn0gZXh0RGF0YVxuICAgKiBAcGFyYW0ge0V4dGVuc2lvbkNvbmZpZ011dGF0aW9uT3B0c30gW29wdHNdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgYWRkRXh0ZW5zaW9uIChleHROYW1lLCBleHREYXRhLCB7d3JpdGUgPSB0cnVlfSA9IHt9KSB7XG4gICAgYXdhaXQgdGhpcy5tYW5pZmVzdC5hZGRFeHRlbnNpb24odGhpcy5leHRlbnNpb25UeXBlLCBleHROYW1lLCBleHREYXRhKTtcbiAgICBpZiAod3JpdGUpIHtcbiAgICAgIGF3YWl0IHRoaXMubWFuaWZlc3Qud3JpdGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lXG4gICAqIEBwYXJhbSB7RXh0RGF0YTxFeHRUeXBlPn0gZXh0RGF0YVxuICAgKiBAcGFyYW0ge0V4dGVuc2lvbkNvbmZpZ011dGF0aW9uT3B0c30gW29wdHNdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlRXh0ZW5zaW9uIChleHROYW1lLCBleHREYXRhLCB7d3JpdGUgPSB0cnVlfSA9IHt9KSB7XG4gICAgdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdID0ge1xuICAgICAgLi4udGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdLFxuICAgICAgLi4uZXh0RGF0YSxcbiAgICB9O1xuICAgIGlmICh3cml0ZSkge1xuICAgICAgYXdhaXQgdGhpcy5tYW5pZmVzdC53cml0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V4dE5hbWU8RXh0VHlwZT59IGV4dE5hbWVcbiAgICogQHBhcmFtIHtFeHRlbnNpb25Db25maWdNdXRhdGlvbk9wdHN9IFtvcHRzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlbW92ZUV4dGVuc2lvbiAoZXh0TmFtZSwge3dyaXRlID0gdHJ1ZX0gPSB7fSkge1xuICAgIGRlbGV0ZSB0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0TmFtZV07XG4gICAgaWYgKHdyaXRlKSB7XG4gICAgICBhd2FpdCB0aGlzLm1hbmlmZXN0LndyaXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPltdfSBbYWN0aXZlTmFtZXNdXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIHByaW50IChhY3RpdmVOYW1lcykge1xuICAgIGlmIChfLmlzRW1wdHkodGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zKSkge1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBObyAke3RoaXMuY29uZmlnS2V5fSBoYXZlIGJlZW4gaW5zdGFsbGVkIGluICR7dGhpcy5hcHBpdW1Ib21lfS4gVXNlIHRoZSBcImFwcGl1bSAke3RoaXMuZXh0ZW5zaW9uVHlwZX1cIiBgICtcbiAgICAgICAgICAnY29tbWFuZCB0byBpbnN0YWxsIHRoZSBvbmUocykgeW91IHdhbnQgdG8gdXNlLicsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZy5pbmZvKGBBdmFpbGFibGUgJHt0aGlzLmNvbmZpZ0tleX06YCk7XG4gICAgZm9yIChjb25zdCBbXG4gICAgICBleHROYW1lLFxuICAgICAgZXh0RGF0YSxcbiAgICBdIG9mIC8qKiBAdHlwZSB7W3N0cmluZywgRXh0RGF0YTxFeHRUeXBlPl1bXX0gKi8gKFxuICAgICAgICBfLnRvUGFpcnModGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zKVxuICAgICAgKSkge1xuICAgICAgbG9nLmluZm8oYCAgLSAke3RoaXMuZXh0ZW5zaW9uRGVzYyhleHROYW1lLCBleHREYXRhKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBleHRlbnNpb24uIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQuXG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPn0gZXh0TmFtZSAtIEV4dGVuc2lvbiBuYW1lXG4gICAqIEBwYXJhbSB7RXh0RGF0YTxFeHRUeXBlPn0gZXh0RGF0YSAtIEV4dGVuc2lvbiBkYXRhXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIGV4dGVuc2lvbkRlc2MgKGV4dE5hbWUsIGV4dERhdGEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBhIHN1YmNsYXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldEluc3RhbGxQYXRoIChleHROYW1lKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmFwcGl1bUhvbWUsICdub2RlX21vZHVsZXMnLCB0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0TmFtZV0ucGtnTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgZXh0ZW5zaW9uIGFuZCByZXR1cm5zIGl0cyBtYWluIGNsYXNzIChjb25zdHJ1Y3RvcilcbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtFeHRDbGFzczxFeHRUeXBlPn1cbiAgICovXG4gIHJlcXVpcmUgKGV4dE5hbWUpIHtcbiAgICBjb25zdCB7bWFpbkNsYXNzfSA9IHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHROYW1lXTtcbiAgICBjb25zdCByZXFQYXRoID0gdGhpcy5nZXRJbnN0YWxsUGF0aChleHROYW1lKTtcbiAgICBjb25zdCByZXFSZXNvbHZlZCA9IHJlcXVpcmUucmVzb2x2ZShyZXFQYXRoKTtcbiAgICAvLyBub3RlOiB0aGlzIHdpbGwgb25seSByZWxvYWQgdGhlIGVudHJ5IHBvaW50XG4gICAgaWYgKHByb2Nlc3MuZW52LkFQUElVTV9SRUxPQURfRVhURU5TSU9OUyAmJiByZXF1aXJlLmNhY2hlW3JlcVJlc29sdmVkXSkge1xuICAgICAgbG9nLmRlYnVnKGBSZW1vdmluZyAke3JlcVJlc29sdmVkfSBmcm9tIHJlcXVpcmUgY2FjaGVgKTtcbiAgICAgIGRlbGV0ZSByZXF1aXJlLmNhY2hlW3JlcVJlc29sdmVkXTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBSZXF1aXJpbmcgJHt0aGlzLmV4dGVuc2lvblR5cGV9IGF0ICR7cmVxUGF0aH1gKTtcbiAgICByZXR1cm4gcmVxdWlyZShyZXFQYXRoKVttYWluQ2xhc3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNJbnN0YWxsZWQgKGV4dE5hbWUpIHtcbiAgICByZXR1cm4gXy5pbmNsdWRlcyhPYmplY3Qua2V5cyh0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnMpLCBleHROYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlbmRlZCB0byBiZSBjYWxsZWQgYnkgY29ycmVzcG9uZGluZyBpbnN0YW5jZSBtZXRob2RzIG9mIHN1YmNsYXNzLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcGl1bUhvbWVcbiAgICogQHBhcmFtIHtFeHRUeXBlfSBleHRUeXBlXG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPn0gZXh0TmFtZSAtIEV4dGVuc2lvbiBuYW1lICh1bmlxdWUgdG8gaXRzIHR5cGUpXG4gICAqIEBwYXJhbSB7RXh0RGF0YVdpdGhTY2hlbWE8RXh0VHlwZT59IGV4dERhdGEgLSBFeHRlbnNpb24gY29uZmlnXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoJ2FqdicpLlNjaGVtYU9iamVjdHx1bmRlZmluZWR9XG4gICAqL1xuICBzdGF0aWMgX3JlYWRFeHRlbnNpb25TY2hlbWEgKGFwcGl1bUhvbWUsIGV4dFR5cGUsIGV4dE5hbWUsIGV4dERhdGEpIHtcbiAgICBjb25zdCB7cGtnTmFtZSwgc2NoZW1hOiBhcmdTY2hlbWFQYXRofSA9IGV4dERhdGE7XG4gICAgaWYgKCFhcmdTY2hlbWFQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgTm8gXFxgc2NoZW1hXFxgIHByb3BlcnR5IGZvdW5kIGluIGNvbmZpZyBmb3IgJHtleHRUeXBlfSAke3BrZ05hbWV9IC0tIHdoeSBpcyB0aGlzIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZD9gLFxuICAgICAgKTtcbiAgICB9XG4gICAgbGV0IG1vZHVsZU9iamVjdDtcbiAgICBpZiAoXy5pc1N0cmluZyhhcmdTY2hlbWFQYXRoKSkge1xuICAgICAgY29uc3Qgc2NoZW1hUGF0aCA9IHJlc29sdmVGcm9tKGFwcGl1bUhvbWUsIHBhdGguam9pbihwa2dOYW1lLCBhcmdTY2hlbWFQYXRoKSk7XG4gICAgICBtb2R1bGVPYmplY3QgPSByZXF1aXJlKHNjaGVtYVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtb2R1bGVPYmplY3QgPSBhcmdTY2hlbWFQYXRoO1xuICAgIH1cbiAgICAvLyB0aGlzIHN1Y2tzLiBkZWZhdWx0IGV4cG9ydHMgc2hvdWxkIGJlIGRlc3Ryb3llZFxuICAgIGNvbnN0IHNjaGVtYSA9IG1vZHVsZU9iamVjdC5fX2VzTW9kdWxlXG4gICAgICA/IG1vZHVsZU9iamVjdC5kZWZhdWx0XG4gICAgICA6IG1vZHVsZU9iamVjdDtcbiAgICByZWdpc3RlclNjaGVtYShleHRUeXBlLCBleHROYW1lLCBzY2hlbWEpO1xuICAgIHJldHVybiBzY2hlbWE7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgYSBzcGVjaWZpYyB7QGxpbmsgRXh0RGF0YX0gb2JqZWN0IGhhcyBhIGBzY2hlbWFgIHByb3AuXG4gICAqIFRoZSB7QGxpbmsgRXh0RGF0YX0gb2JqZWN0IGJlY29tZXMgYSB7QGxpbmsgRXh0RGF0YVdpdGhTY2hlbWF9IG9iamVjdC5cbiAgICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gICAqIEBwYXJhbSB7RXh0RGF0YTxFeHRUeXBlPn0gZXh0RGF0YVxuICAgKiBAcmV0dXJucyB7ZXh0RGF0YSBpcyBFeHREYXRhV2l0aFNjaGVtYTxFeHRUeXBlPn1cbiAgICovXG4gIHN0YXRpYyBleHREYXRhSGFzU2NoZW1hIChleHREYXRhKSB7XG4gICAgcmV0dXJuIF8uaXNTdHJpbmcoZXh0RGF0YT8uc2NoZW1hKSB8fCBfLmlzT2JqZWN0KGV4dERhdGE/LnNjaGVtYSk7XG4gIH1cblxuICAvKipcbiAgICogSWYgYW4gZXh0ZW5zaW9uIHByb3ZpZGVzIGEgc2NoZW1hLCB0aGlzIHdpbGwgbG9hZCB0aGUgc2NoZW1hIGFuZCBhdHRlbXB0IHRvXG4gICAqIHJlZ2lzdGVyIGl0IHdpdGggdGhlIHNjaGVtYSByZWdpc3RyYXIuXG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPn0gZXh0TmFtZSAtIE5hbWUgb2YgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSB7RXh0RGF0YVdpdGhTY2hlbWE8RXh0VHlwZT59IGV4dERhdGEgLSBFeHRlbnNpb24gZGF0YVxuICAgKiBAcmV0dXJucyB7aW1wb3J0KCdhanYnKS5TY2hlbWFPYmplY3R8dW5kZWZpbmVkfVxuICAgKi9cbiAgcmVhZEV4dGVuc2lvblNjaGVtYSAoZXh0TmFtZSwgZXh0RGF0YSkge1xuICAgIHJldHVybiBFeHRlbnNpb25Db25maWcuX3JlYWRFeHRlbnNpb25TY2hlbWEoXG4gICAgICB0aGlzLmFwcGl1bUhvbWUsXG4gICAgICB0aGlzLmV4dGVuc2lvblR5cGUsXG4gICAgICBleHROYW1lLFxuICAgICAgZXh0RGF0YSxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIElOU1RBTExfVFlQRV9OUE0sXG4gIElOU1RBTExfVFlQRV9HSVQsXG4gIElOU1RBTExfVFlQRV9MT0NBTCxcbiAgSU5TVEFMTF9UWVBFX0dJVEhVQixcbiAgSU5TVEFMTF9UWVBFUyxcbn07XG5cbi8qKlxuICogQ29uZmlnIHByb2JsZW1cbiAqIEB0eXBlZGVmIFByb2JsZW1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBlcnIgLSBFcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge2FueX0gdmFsIC0gQXNzb2NpYXRlZCB2YWx1ZVxuICovXG5cbi8qKlxuICogQW4gb3B0aW9uYWwgbG9nZ2luZyBmdW5jdGlvbiBwcm92aWRlZCB0byBhbiB7QGxpbmsgRXh0ZW5zaW9uQ29uZmlnfSBzdWJjbGFzcy5cbiAqIEBjYWxsYmFjayBFeHRlbnNpb25Mb2dGblxuICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnLi9tYW5pZmVzdCcpLkV4dGVuc2lvblR5cGV9IEV4dGVuc2lvblR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4vbWFuaWZlc3QnKS5NYW5pZmVzdH0gTWFuaWZlc3RcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuL21hbmlmZXN0JykuRXh0RGF0YTxUPn0gRXh0RGF0YVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4vbWFuaWZlc3QnKS5FeHREYXRhV2l0aFNjaGVtYTxUPn0gRXh0RGF0YVdpdGhTY2hlbWFcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuL21hbmlmZXN0JykuRXh0TmFtZTxUPn0gRXh0TmFtZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4vbWFuaWZlc3QnKS5FeHRDbGFzczxUPn0gRXh0Q2xhc3NcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuL21hbmlmZXN0JykuRXh0UmVjb3JkPFQ+fSBFeHRSZWNvcmRcbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHZhcmlvdXMgbWV0aG9kcyBpbiB7QGxpbmsgRXh0ZW5zaW9uQ29uZmlnfVxuICogQHR5cGVkZWYgRXh0ZW5zaW9uQ29uZmlnTXV0YXRpb25PcHRzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt3cml0ZT10cnVlXSBXaGV0aGVyIG9yIG5vdCB0byB3cml0ZSB0aGUgbWFuaWZlc3QgdG8gZGlzayBhZnRlciBhIG11dGF0aW9uIG9wZXJhdGlvblxuICovXG5cbi8qKlxuICogQSB2YWxpZCBpbnN0YWxsIHR5cGVcbiAqIEB0eXBlZGVmIHt0eXBlb2YgSU5TVEFMTF9UWVBFX05QTSB8IHR5cGVvZiBJTlNUQUxMX1RZUEVfR0lUIHwgdHlwZW9mIElOU1RBTExfVFlQRV9MT0NBTCB8IHR5cGVvZiBJTlNUQUxMX1RZUEVfR0lUSFVCfSBJbnN0YWxsVHlwZVxuICovXG4iXX0=