@appium/base-driver 8.7.3 → 9.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/build/lib/basedriver/capabilities.d.ts +11 -163
  2. package/build/lib/basedriver/capabilities.d.ts.map +1 -1
  3. package/build/lib/basedriver/capabilities.js +355 -236
  4. package/build/lib/basedriver/capabilities.js.map +1 -1
  5. package/build/lib/basedriver/commands/event.d.ts +7 -6
  6. package/build/lib/basedriver/commands/event.d.ts.map +1 -1
  7. package/build/lib/basedriver/commands/event.js +55 -35
  8. package/build/lib/basedriver/commands/event.js.map +1 -1
  9. package/build/lib/basedriver/commands/execute.d.ts +7 -6
  10. package/build/lib/basedriver/commands/execute.d.ts.map +1 -1
  11. package/build/lib/basedriver/commands/execute.js +66 -58
  12. package/build/lib/basedriver/commands/execute.js.map +1 -1
  13. package/build/lib/basedriver/commands/find.d.ts +9 -7
  14. package/build/lib/basedriver/commands/find.d.ts.map +1 -1
  15. package/build/lib/basedriver/commands/find.js +102 -54
  16. package/build/lib/basedriver/commands/find.js.map +1 -1
  17. package/build/lib/basedriver/commands/index.d.ts +3 -7
  18. package/build/lib/basedriver/commands/index.d.ts.map +1 -1
  19. package/build/lib/basedriver/commands/index.js +30 -33
  20. package/build/lib/basedriver/commands/index.js.map +1 -1
  21. package/build/lib/basedriver/commands/log.d.ts +8 -9
  22. package/build/lib/basedriver/commands/log.d.ts.map +1 -1
  23. package/build/lib/basedriver/commands/log.js +54 -38
  24. package/build/lib/basedriver/commands/log.js.map +1 -1
  25. package/build/lib/basedriver/commands/session.d.ts +7 -6
  26. package/build/lib/basedriver/commands/session.d.ts.map +1 -1
  27. package/build/lib/basedriver/commands/session.js +46 -39
  28. package/build/lib/basedriver/commands/session.js.map +1 -1
  29. package/build/lib/basedriver/commands/settings.d.ts +7 -7
  30. package/build/lib/basedriver/commands/settings.d.ts.map +1 -1
  31. package/build/lib/basedriver/commands/settings.js +35 -28
  32. package/build/lib/basedriver/commands/settings.js.map +1 -1
  33. package/build/lib/basedriver/commands/timeout.d.ts +7 -5
  34. package/build/lib/basedriver/commands/timeout.d.ts.map +1 -1
  35. package/build/lib/basedriver/commands/timeout.js +144 -162
  36. package/build/lib/basedriver/commands/timeout.js.map +1 -1
  37. package/build/lib/basedriver/core.d.ts +6 -157
  38. package/build/lib/basedriver/core.d.ts.map +1 -1
  39. package/build/lib/basedriver/core.js +361 -230
  40. package/build/lib/basedriver/core.js.map +1 -1
  41. package/build/lib/basedriver/desired-caps.js +80 -110
  42. package/build/lib/basedriver/desired-caps.js.map +1 -1
  43. package/build/lib/basedriver/device-settings.js +57 -62
  44. package/build/lib/basedriver/device-settings.js.map +1 -1
  45. package/build/lib/basedriver/driver.d.ts +11 -262
  46. package/build/lib/basedriver/driver.d.ts.map +1 -1
  47. package/build/lib/basedriver/driver.js +362 -262
  48. package/build/lib/basedriver/driver.js.map +1 -1
  49. package/build/lib/basedriver/helpers.js +500 -495
  50. package/build/lib/basedriver/helpers.js.map +1 -1
  51. package/build/lib/basedriver/logger.d.ts +1 -1
  52. package/build/lib/basedriver/logger.d.ts.map +1 -1
  53. package/build/lib/basedriver/logger.js +5 -15
  54. package/build/lib/basedriver/logger.js.map +1 -1
  55. package/build/lib/constants.js +14 -14
  56. package/build/lib/constants.js.map +1 -1
  57. package/build/lib/express/crash.js +8 -15
  58. package/build/lib/express/crash.js.map +1 -1
  59. package/build/lib/express/express-logging.js +49 -59
  60. package/build/lib/express/express-logging.js.map +1 -1
  61. package/build/lib/express/idempotency.js +125 -177
  62. package/build/lib/express/idempotency.js.map +1 -1
  63. package/build/lib/express/logger.d.ts +1 -1
  64. package/build/lib/express/logger.d.ts.map +1 -1
  65. package/build/lib/express/logger.js +5 -15
  66. package/build/lib/express/logger.js.map +1 -1
  67. package/build/lib/express/middleware.js +82 -107
  68. package/build/lib/express/middleware.js.map +1 -1
  69. package/build/lib/express/server.d.ts +17 -5
  70. package/build/lib/express/server.d.ts.map +1 -1
  71. package/build/lib/express/server.js +259 -224
  72. package/build/lib/express/server.js.map +1 -1
  73. package/build/lib/express/static.js +64 -81
  74. package/build/lib/express/static.js.map +1 -1
  75. package/build/lib/express/websocket.js +115 -87
  76. package/build/lib/express/websocket.js.map +1 -1
  77. package/build/lib/helpers/capabilities.d.ts +1 -59
  78. package/build/lib/helpers/capabilities.d.ts.map +1 -1
  79. package/build/lib/helpers/capabilities.js +72 -69
  80. package/build/lib/helpers/capabilities.js.map +1 -1
  81. package/build/lib/index.js +64 -180
  82. package/build/lib/index.js.map +1 -1
  83. package/build/lib/jsonwp-proxy/protocol-converter.js +215 -227
  84. package/build/lib/jsonwp-proxy/protocol-converter.js.map +1 -1
  85. package/build/lib/jsonwp-proxy/proxy.d.ts.map +1 -1
  86. package/build/lib/jsonwp-proxy/proxy.js +355 -393
  87. package/build/lib/jsonwp-proxy/proxy.js.map +1 -1
  88. package/build/lib/jsonwp-status/status.js +119 -130
  89. package/build/lib/jsonwp-status/status.js.map +1 -1
  90. package/build/lib/protocol/errors.d.ts +135 -32
  91. package/build/lib/protocol/errors.d.ts.map +1 -1
  92. package/build/lib/protocol/errors.js +871 -919
  93. package/build/lib/protocol/errors.js.map +1 -1
  94. package/build/lib/protocol/helpers.js +37 -37
  95. package/build/lib/protocol/helpers.js.map +1 -1
  96. package/build/lib/protocol/index.js +22 -109
  97. package/build/lib/protocol/index.js.map +1 -1
  98. package/build/lib/protocol/protocol.js +394 -350
  99. package/build/lib/protocol/protocol.js.map +1 -1
  100. package/build/lib/protocol/routes.d.ts +1248 -4
  101. package/build/lib/protocol/routes.d.ts.map +1 -1
  102. package/build/lib/protocol/routes.js +972 -1327
  103. package/build/lib/protocol/routes.js.map +1 -1
  104. package/build/lib/protocol/validators.js +32 -39
  105. package/build/lib/protocol/validators.js.map +1 -1
  106. package/build/tsconfig.tsbuildinfo +1 -1
  107. package/lib/basedriver/capabilities.js +83 -39
  108. package/lib/basedriver/commands/event.js +10 -5
  109. package/lib/basedriver/commands/execute.js +14 -9
  110. package/lib/basedriver/commands/find.js +18 -12
  111. package/lib/basedriver/commands/index.js +21 -16
  112. package/lib/basedriver/commands/log.js +24 -18
  113. package/lib/basedriver/commands/session.js +10 -5
  114. package/lib/basedriver/commands/settings.js +9 -6
  115. package/lib/basedriver/commands/timeout.js +10 -4
  116. package/lib/basedriver/core.js +2 -3
  117. package/lib/basedriver/driver.js +12 -16
  118. package/lib/express/server.js +6 -3
  119. package/lib/protocol/errors.js +155 -44
  120. package/lib/protocol/routes.js +19 -7
  121. package/package.json +16 -18
@@ -1,253 +1,372 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.STANDARD_CAPS = exports.PREFIXED_APPIUM_OPTS_CAP = exports.APPIUM_VENDOR_PREFIX = exports.APPIUM_OPTS_CAP = void 0;
7
- exports.findNonPrefixedCaps = findNonPrefixedCaps;
8
- exports.isStandardCap = isStandardCap;
9
- exports.mergeCaps = mergeCaps;
10
- exports.parseCaps = parseCaps;
11
- exports.processCapabilities = processCapabilities;
12
- exports.promoteAppiumOptions = promoteAppiumOptions;
13
- exports.stripAppiumPrefixes = stripAppiumPrefixes;
14
- exports.validateCaps = validateCaps;
15
-
16
- require("source-map-support/register");
17
-
18
- var _lodash = _interopRequireDefault(require("lodash"));
19
-
20
- var _desiredCaps = require("./desired-caps");
21
-
22
- var _support = require("@appium/support");
23
-
24
- var _logger = _interopRequireDefault(require("./logger"));
25
-
26
- var _errors = require("../protocol/errors");
27
-
28
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
-
2
+ // @ts-check
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.PREFIXED_APPIUM_OPTS_CAP = exports.promoteAppiumOptions = exports.stripAppiumPrefixes = exports.isStandardCap = exports.findNonPrefixedCaps = exports.APPIUM_VENDOR_PREFIX = exports.mergeCaps = exports.validateCaps = exports.processCapabilities = exports.parseCaps = exports.STANDARD_CAPS = void 0;
8
+ const lodash_1 = __importDefault(require("lodash"));
9
+ const desired_caps_1 = require("./desired-caps");
10
+ const support_1 = require("@appium/support");
11
+ const logger_1 = __importDefault(require("./logger"));
12
+ const errors_1 = require("../protocol/errors");
30
13
  const APPIUM_VENDOR_PREFIX = 'appium:';
31
14
  exports.APPIUM_VENDOR_PREFIX = APPIUM_VENDOR_PREFIX;
32
- const APPIUM_OPTS_CAP = 'options';
33
- exports.APPIUM_OPTS_CAP = APPIUM_OPTS_CAP;
34
- const PREFIXED_APPIUM_OPTS_CAP = `${APPIUM_VENDOR_PREFIX}${APPIUM_OPTS_CAP}`;
15
+ const PREFIXED_APPIUM_OPTS_CAP = `${APPIUM_VENDOR_PREFIX}options`;
35
16
  exports.PREFIXED_APPIUM_OPTS_CAP = PREFIXED_APPIUM_OPTS_CAP;
36
-
17
+ /**
18
+ * Takes primary caps object and merges it into a secondary caps object.
19
+ * @template {Constraints} [T={}]
20
+ * @template {Constraints} [U={}]
21
+ * @param {Capabilities<T>} [primary]
22
+ * @param {Capabilities<U>} [secondary]
23
+ * @returns {Merge<Capabilities<T>, Capabilities<U>>}
24
+ * @see https://www.w3.org/TR/webdriver/#dfn-merging-capabilities)
25
+ */
37
26
  function mergeCaps(primary = {}, secondary = {}) {
38
- let result = { ...primary
39
- };
40
-
41
- for (let [name, value] of _lodash.default.toPairs(secondary)) {
42
- if (!_lodash.default.isUndefined(primary[name])) {
43
- throw new _errors.errors.InvalidArgumentError(`property '${name}' should not exist on both primary (${JSON.stringify(primary)}) and secondary (${JSON.stringify(secondary)}) object`);
44
- }
45
-
46
- result[name] = value;
47
- }
48
-
49
- return result;
27
+ let result = /** @type {Merge<Capabilities<T>, Capabilities<U>>} */ ({
28
+ ...primary,
29
+ });
30
+ for (let [name, value] of /** @type {[keyof typeof secondary, any]} */ (lodash_1.default.toPairs(secondary))) {
31
+ // Overwriting is not allowed. Primary and secondary must have different properties (w3c rule 4.4)
32
+ if (!lodash_1.default.isUndefined(primary[name])) {
33
+ throw new errors_1.errors.InvalidArgumentError(`property '${name}' should not exist on both primary (${JSON.stringify(primary)}) and secondary (${JSON.stringify(secondary)}) object`);
34
+ }
35
+ result[ /** @type {keyof typeof result} */(name)] = value;
36
+ }
37
+ return result;
50
38
  }
51
-
52
- function validateCaps(caps, constraints = {}, opts = {}) {
53
- let {
54
- skipPresenceConstraint
55
- } = opts;
56
-
57
- if (!_lodash.default.isPlainObject(caps)) {
58
- throw new _errors.errors.InvalidArgumentError(`must be a JSON object`);
59
- }
60
-
61
- constraints = _lodash.default.mapValues(constraints, skipPresenceConstraint ? constraint => _lodash.default.omit(constraint, 'presence') : constraint => {
62
- if (constraint.presence === true) {
63
- return { ..._lodash.default.omit(constraint, 'presence'),
64
- presence: {
65
- allowEmpty: false
39
+ exports.mergeCaps = mergeCaps;
40
+ // Validates caps against a set of constraints
41
+ /**
42
+ * @template {Constraints} [C={}]
43
+ * @param {Capabilities<C>} caps
44
+ * @param {C} [constraints]
45
+ * @param {ValidateCapsOpts} [opts]
46
+ * @returns {Capabilities<C>}
47
+ */
48
+ function validateCaps(caps, constraints = /** @type {C} */ ({}), opts = {}) {
49
+ let { skipPresenceConstraint } = opts;
50
+ if (!lodash_1.default.isPlainObject(caps)) {
51
+ throw new errors_1.errors.InvalidArgumentError(`must be a JSON object`);
52
+ }
53
+ // Remove the 'presence' constraint if we're not checking for it
54
+ constraints = /** @type {C} */ (lodash_1.default.mapValues(constraints, skipPresenceConstraint
55
+ ? /** @param {Constraint} constraint */
56
+ (constraint) => lodash_1.default.omit(constraint, 'presence')
57
+ : /** @param {Constraint} constraint */
58
+ (constraint) => {
59
+ if (constraint.presence === true) {
60
+ return { ...lodash_1.default.omit(constraint, 'presence'), presence: { allowEmpty: false } };
61
+ }
62
+ return constraint;
63
+ }));
64
+ const validationErrors = desired_caps_1.validator.validate(lodash_1.default.pickBy(caps, support_1.util.hasValue), constraints, {
65
+ fullMessages: false,
66
+ });
67
+ if (validationErrors) {
68
+ let message = [];
69
+ for (let [attribute, reasons] of lodash_1.default.toPairs(validationErrors)) {
70
+ for (let reason of reasons) {
71
+ message.push(`'${attribute}' ${reason}`);
72
+ }
66
73
  }
67
- };
68
- }
69
-
70
- return constraint;
71
- });
72
-
73
- const validationErrors = _desiredCaps.validator.validate(_lodash.default.pickBy(caps, _support.util.hasValue), constraints, {
74
- fullMessages: false
75
- });
76
-
77
- if (validationErrors) {
78
- let message = [];
79
-
80
- for (let [attribute, reasons] of _lodash.default.toPairs(validationErrors)) {
81
- for (let reason of reasons) {
82
- message.push(`'${attribute}' ${reason}`);
83
- }
84
- }
85
-
86
- throw new _errors.errors.InvalidArgumentError(message.join('; '));
87
- }
88
-
89
- return caps;
74
+ throw new errors_1.errors.InvalidArgumentError(message.join('; '));
75
+ }
76
+ // Return caps
77
+ return caps;
90
78
  }
91
-
92
- const STANDARD_CAPS = Object.freeze(new Set(['browserName', 'browserVersion', 'platformName', 'acceptInsecureCerts', 'pageLoadStrategy', 'proxy', 'setWindowRect', 'timeouts', 'unhandledPromptBehavior']));
93
- exports.STANDARD_CAPS = STANDARD_CAPS;
94
- const STANDARD_CAPS_LOWER = new Set([...STANDARD_CAPS].map(cap => cap.toLowerCase()));
95
-
79
+ exports.validateCaps = validateCaps;
80
+ /**
81
+ * Standard, non-prefixed capabilities
82
+ * @see https://www.w3.org/TR/webdriver/#dfn-table-of-standard-capabilities)
83
+ */
84
+ exports.STANDARD_CAPS = Object.freeze(new Set(
85
+ /** @type {StringKeyOf<import('@appium/types').StandardCapabilities>[]} */ ([
86
+ 'browserName',
87
+ 'browserVersion',
88
+ 'platformName',
89
+ 'acceptInsecureCerts',
90
+ 'pageLoadStrategy',
91
+ 'proxy',
92
+ 'setWindowRect',
93
+ 'timeouts',
94
+ 'unhandledPromptBehavior',
95
+ 'webSocketUrl',
96
+ ])));
97
+ const STANDARD_CAPS_LOWER = new Set([...exports.STANDARD_CAPS].map((cap) => cap.toLowerCase()));
98
+ /**
99
+ * @param {string} cap
100
+ * @returns {boolean}
101
+ */
96
102
  function isStandardCap(cap) {
97
- return STANDARD_CAPS_LOWER.has(cap.toLowerCase());
103
+ return STANDARD_CAPS_LOWER.has(cap.toLowerCase());
98
104
  }
99
-
105
+ exports.isStandardCap = isStandardCap;
106
+ /**
107
+ * If the 'appium:' prefix was provided and it's a valid capability, strip out the prefix
108
+ * @template {Constraints} [C={}]
109
+ * @param {import('@appium/types').NSCapabilities<C>} caps
110
+ * @see https://www.w3.org/TR/webdriver/#dfn-extension-capabilities
111
+ * @internal
112
+ * @returns {import('@appium/types').Capabilities<C>}
113
+ */
100
114
  function stripAppiumPrefixes(caps) {
101
- const [prefixedCaps, nonPrefixedCaps] = _lodash.default.partition(_lodash.default.keys(caps), cap => String(cap).startsWith(APPIUM_VENDOR_PREFIX));
102
-
103
- let strippedCaps = _lodash.default.pick(caps, nonPrefixedCaps);
104
-
105
- const badPrefixedCaps = [];
106
-
107
- for (let prefixedCap of prefixedCaps) {
108
- const strippedCapName = prefixedCap.substring(APPIUM_VENDOR_PREFIX.length);
109
-
110
- if (isStandardCap(strippedCapName)) {
111
- badPrefixedCaps.push(strippedCapName);
112
-
113
- if (_lodash.default.isNil(strippedCaps[strippedCapName])) {
114
- strippedCaps[strippedCapName] = caps[prefixedCap];
115
- } else {
116
- _logger.default.warn(`Ignoring capability '${prefixedCap}=${caps[prefixedCap]}' and ` + `using capability '${strippedCapName}=${strippedCaps[strippedCapName]}'`);
117
- }
118
- } else {
119
- strippedCaps[strippedCapName] = caps[prefixedCap];
120
- }
121
- }
122
-
123
- if (badPrefixedCaps.length > 0) {
124
- _logger.default.warn(`The capabilities ${JSON.stringify(badPrefixedCaps)} are standard capabilities and do not require "appium:" prefix`);
125
- }
126
-
127
- return strippedCaps;
115
+ // split into prefixed and non-prefixed.
116
+ // non-prefixed should be standard caps at this point
117
+ const [prefixedCaps, nonPrefixedCaps] = lodash_1.default.partition(lodash_1.default.keys(caps), (cap) => String(cap).startsWith(APPIUM_VENDOR_PREFIX));
118
+ // initialize this with the k/v pairs of the non-prefixed caps
119
+ let strippedCaps = /** @type {import('@appium/types').Capabilities<C>} */ (lodash_1.default.pick(caps, nonPrefixedCaps));
120
+ const badPrefixedCaps = [];
121
+ // Strip out the 'appium:' prefix
122
+ for (let prefixedCap of prefixedCaps) {
123
+ const strippedCapName = /** @type {StringKeyOf<import('@appium/types').Capabilities<C>>} */ (prefixedCap.substring(APPIUM_VENDOR_PREFIX.length));
124
+ // If it's standard capability that was prefixed, add it to an array of incorrectly prefixed capabilities
125
+ if (isStandardCap(strippedCapName)) {
126
+ badPrefixedCaps.push(strippedCapName);
127
+ if (lodash_1.default.isNil(strippedCaps[strippedCapName])) {
128
+ strippedCaps[strippedCapName] = caps[prefixedCap];
129
+ }
130
+ else {
131
+ logger_1.default.warn(`Ignoring capability '${prefixedCap}=${caps[prefixedCap]}' and ` +
132
+ `using capability '${strippedCapName}=${strippedCaps[strippedCapName]}'`);
133
+ }
134
+ }
135
+ else {
136
+ strippedCaps[strippedCapName] = caps[prefixedCap];
137
+ }
138
+ }
139
+ // If we found standard caps that were incorrectly prefixed, throw an exception (e.g.: don't accept 'appium:platformName', only accept just 'platformName')
140
+ if (badPrefixedCaps.length > 0) {
141
+ logger_1.default.warn(`The capabilities ${JSON.stringify(badPrefixedCaps)} are standard capabilities and do not require "appium:" prefix`);
142
+ }
143
+ return strippedCaps;
128
144
  }
129
-
130
- function findNonPrefixedCaps({
131
- alwaysMatch = {},
132
- firstMatch = []
133
- }) {
134
- return _lodash.default.chain([alwaysMatch, ...firstMatch]).reduce((unprefixedCaps, caps) => [...unprefixedCaps, ...Object.keys(caps).filter(cap => !cap.includes(':') && !isStandardCap(cap))], []).uniq().value();
145
+ exports.stripAppiumPrefixes = stripAppiumPrefixes;
146
+ /**
147
+ * Get an array of all the unprefixed caps that are being used in 'alwaysMatch' and all of the 'firstMatch' object
148
+ * @template {Constraints} [C={}]
149
+ * @param {import('@appium/types').W3CCapabilities<C>} caps A capabilities object
150
+ */
151
+ function findNonPrefixedCaps({ alwaysMatch = {}, firstMatch = [] }) {
152
+ return lodash_1.default.chain([alwaysMatch, ...firstMatch])
153
+ .reduce((unprefixedCaps, caps) => [
154
+ ...unprefixedCaps,
155
+ ...Object.keys(caps).filter((cap) => !cap.includes(':') && !isStandardCap(cap)),
156
+ ], [])
157
+ .uniq()
158
+ .value();
135
159
  }
136
-
137
- function parseCaps(caps, constraints = {}, shouldValidateCaps = true) {
138
- if (!_lodash.default.isPlainObject(caps)) {
139
- throw new _errors.errors.InvalidArgumentError('The capabilities argument was not valid for the following reason(s): "capabilities" must be a JSON object.');
140
- }
141
-
142
- let {
143
- alwaysMatch: requiredCaps = {},
144
- firstMatch: allFirstMatchCaps = [{}]
145
- } = caps;
146
-
147
- if (!_lodash.default.isArray(allFirstMatchCaps)) {
148
- throw new _errors.errors.InvalidArgumentError('The capabilities.firstMatch argument was not valid for the following reason(s): "capabilities.firstMatch" must be a JSON array or undefined');
149
- }
150
-
151
- if (allFirstMatchCaps.length === 0) {
152
- _logger.default.warn(`The firstMatch array in the given capabilities has no entries. Adding an empty entry fo rnow, ` + `but it will require one or more entries as W3C spec.`);
153
-
154
- allFirstMatchCaps.push({});
155
- }
156
-
157
- let nonPrefixedCaps = findNonPrefixedCaps(caps);
158
-
159
- if (!_lodash.default.isEmpty(nonPrefixedCaps)) {
160
- throw new _errors.errors.InvalidArgumentError(`All non-standard capabilities should have a vendor prefix. The following capabilities did not have one: ${nonPrefixedCaps}`);
161
- }
162
-
163
- let strippedRequiredCaps = stripAppiumPrefixes(requiredCaps);
164
- let strippedAllFirstMatchCaps = allFirstMatchCaps.map(stripAppiumPrefixes);
165
-
166
- if (shouldValidateCaps) {
167
- strippedRequiredCaps = validateCaps(strippedRequiredCaps, constraints, {
168
- skipPresenceConstraint: true
169
- });
170
- }
171
-
172
- const filteredConstraints = _lodash.default.omitBy(constraints, (_, key) => key in strippedRequiredCaps);
173
-
174
- let validationErrors = [];
175
-
176
- let validatedFirstMatchCaps = _lodash.default.compact(strippedAllFirstMatchCaps.map(firstMatchCaps => {
177
- try {
178
- return shouldValidateCaps ? validateCaps(firstMatchCaps, filteredConstraints) : firstMatchCaps;
179
- } catch (e) {
180
- validationErrors.push(e.message);
181
- }
182
- }));
183
-
184
- let matchedCaps = null;
185
-
186
- for (let firstMatchCaps of validatedFirstMatchCaps) {
187
- try {
188
- matchedCaps = mergeCaps(strippedRequiredCaps, firstMatchCaps);
189
-
190
- if (matchedCaps) {
191
- break;
192
- }
193
- } catch (err) {
194
- _logger.default.warn(err.message);
195
-
196
- validationErrors.push(err.message);
197
- }
198
- }
199
-
200
- return {
201
- requiredCaps,
202
- allFirstMatchCaps,
203
- validatedFirstMatchCaps,
204
- matchedCaps,
205
- validationErrors
206
- };
160
+ exports.findNonPrefixedCaps = findNonPrefixedCaps;
161
+ /**
162
+ * Parse capabilities
163
+ * @template {Constraints} [C={}]
164
+ * @param {import('@appium/types').W3CCapabilities<C>} caps
165
+ * @param {C} [constraints]
166
+ * @param {boolean} [shouldValidateCaps]
167
+ * @see https://www.w3.org/TR/webdriver/#processing-capabilities
168
+ */
169
+ function parseCaps(caps, constraints = /** @type {C} */ ({}), shouldValidateCaps = true) {
170
+ // If capabilities request is not an object, return error (#1.1)
171
+ if (!lodash_1.default.isPlainObject(caps)) {
172
+ throw new errors_1.errors.InvalidArgumentError('The capabilities argument was not valid for the following reason(s): "capabilities" must be a JSON object.');
173
+ }
174
+ // Let 'requiredCaps' be property named 'alwaysMatch' from capabilities request (#2)
175
+ // and 'allFirstMatchCaps' be property named 'firstMatch' from capabilities request (#3)
176
+ let { alwaysMatch: requiredCaps = {}, // If 'requiredCaps' is undefined, set it to an empty JSON object (#2.1)
177
+ firstMatch: allFirstMatchCaps = [{}], // If 'firstMatch' is undefined set it to a singleton list with one empty object (#3.1)
178
+ } = caps;
179
+ // Reject 'firstMatch' argument if it's not an array (#3.2)
180
+ if (!lodash_1.default.isArray(allFirstMatchCaps)) {
181
+ throw new errors_1.errors.InvalidArgumentError('The capabilities.firstMatch argument was not valid for the following reason(s): "capabilities.firstMatch" must be a JSON array or undefined');
182
+ }
183
+ // If an empty array as provided, we'll be forgiving and make it an array of one empty object
184
+ // In the future, reject 'firstMatch' argument if its array did not have one or more entries (#3.2)
185
+ if (allFirstMatchCaps.length === 0) {
186
+ logger_1.default.warn(`The firstMatch array in the given capabilities has no entries. Adding an empty entry fo rnow, ` +
187
+ `but it will require one or more entries as W3C spec.`);
188
+ allFirstMatchCaps.push({});
189
+ }
190
+ // Check for non-prefixed, non-standard capabilities and log warnings if they are found
191
+ let nonPrefixedCaps = findNonPrefixedCaps(caps);
192
+ if (!lodash_1.default.isEmpty(nonPrefixedCaps)) {
193
+ throw new errors_1.errors.InvalidArgumentError(`All non-standard capabilities should have a vendor prefix. The following capabilities did not have one: ${nonPrefixedCaps}`);
194
+ }
195
+ // Strip out the 'appium:' prefix from all
196
+ let strippedRequiredCaps = stripAppiumPrefixes(requiredCaps);
197
+ let strippedAllFirstMatchCaps = allFirstMatchCaps.map(stripAppiumPrefixes);
198
+ // Validate the requiredCaps. But don't validate 'presence' because if that constraint fails on 'alwaysMatch' it could still pass on one of the 'firstMatch' keys
199
+ if (shouldValidateCaps) {
200
+ strippedRequiredCaps = validateCaps(strippedRequiredCaps, constraints, {
201
+ skipPresenceConstraint: true,
202
+ });
203
+ }
204
+ // Remove the 'presence' constraint for any keys that are already present in 'requiredCaps'
205
+ // since we know that this constraint has already passed
206
+ const filteredConstraints = /** @type {C} */ (lodash_1.default.omitBy(constraints, (_, key) => key in strippedRequiredCaps));
207
+ // Validate all of the first match capabilities and return an array with only the valid caps (see spec #5)
208
+ /** @type {string[]} */
209
+ let validationErrors = [];
210
+ let validatedFirstMatchCaps = lodash_1.default.compact(strippedAllFirstMatchCaps.map(
211
+ /**
212
+ * @param {import('@appium/types').Capabilities<C>} firstMatchCaps
213
+ */
214
+ (firstMatchCaps) => {
215
+ try {
216
+ // Validate firstMatch caps
217
+ return shouldValidateCaps
218
+ ? validateCaps(firstMatchCaps, filteredConstraints)
219
+ : firstMatchCaps;
220
+ }
221
+ catch (e) {
222
+ validationErrors.push(e.message);
223
+ }
224
+ }));
225
+ // Try to merge requiredCaps with first match capabilities, break once it finds its first match (see spec #6)
226
+ let matchedCaps = null;
227
+ for (let firstMatchCaps of validatedFirstMatchCaps) {
228
+ try {
229
+ matchedCaps = mergeCaps(strippedRequiredCaps, firstMatchCaps);
230
+ if (matchedCaps) {
231
+ break;
232
+ }
233
+ }
234
+ catch (err) {
235
+ logger_1.default.warn(err.message);
236
+ validationErrors.push(err.message);
237
+ }
238
+ }
239
+ // Returns variables for testing purposes
240
+ return {
241
+ requiredCaps,
242
+ allFirstMatchCaps,
243
+ validatedFirstMatchCaps,
244
+ matchedCaps,
245
+ validationErrors,
246
+ };
207
247
  }
208
-
209
- function processCapabilities(w3cCaps, constraints = {}, shouldValidateCaps = true) {
210
- const {
211
- matchedCaps,
212
- validationErrors
213
- } = parseCaps(w3cCaps, constraints, shouldValidateCaps);
214
-
215
- if (!_support.util.hasValue(matchedCaps)) {
216
- if (_lodash.default.isArray(w3cCaps.firstMatch) && w3cCaps.firstMatch.length > 1) {
217
- throw new _errors.errors.InvalidArgumentError(`Could not find matching capabilities from ${JSON.stringify(w3cCaps)}:\n ${validationErrors.join('\n')}`);
218
- } else {
219
- throw new _errors.errors.InvalidArgumentError(validationErrors[0]);
220
- }
221
- }
222
-
223
- return matchedCaps ?? {};
248
+ exports.parseCaps = parseCaps;
249
+ // Calls parseCaps and just returns the matchedCaps variable
250
+ /**
251
+ * @template {Constraints} C
252
+ * @param {import('@appium/types').W3CCapabilities<C>} w3cCaps
253
+ * @param {C} [constraints]
254
+ * @param {boolean} [shouldValidateCaps]
255
+ * @returns {import('@appium/types').Capabilities<C>}
256
+ */
257
+ function processCapabilities(w3cCaps, constraints = /** @type {C} */ ({}), shouldValidateCaps = true) {
258
+ const { matchedCaps, validationErrors } = parseCaps(w3cCaps, constraints, shouldValidateCaps);
259
+ // If we found an error throw an exception
260
+ if (!support_1.util.hasValue(matchedCaps)) {
261
+ if (lodash_1.default.isArray(w3cCaps.firstMatch) && w3cCaps.firstMatch.length > 1) {
262
+ // If there was more than one 'firstMatch' cap, indicate that we couldn't find a matching capabilities set and show all the errors
263
+ throw new errors_1.errors.InvalidArgumentError(`Could not find matching capabilities from ${JSON.stringify(w3cCaps)}:\n ${validationErrors.join('\n')}`);
264
+ }
265
+ else {
266
+ // Otherwise, just show the singular error message
267
+ throw new errors_1.errors.InvalidArgumentError(validationErrors[0]);
268
+ }
269
+ }
270
+ return /** @type {Capabilities<C>} */ (matchedCaps ?? {});
224
271
  }
225
-
272
+ exports.processCapabilities = processCapabilities;
273
+ /**
274
+ * Return a copy of a capabilities object which has taken everything within the 'options'
275
+ * capability and promoted it to the top level.
276
+ *
277
+ * @template {Constraints} C
278
+ * @param {import('@appium/types').W3CCapabilities<C>} originalCaps
279
+ * @return {import('@appium/types').W3CCapabilities<C>} the capabilities with 'options' promoted if necessary
280
+ */
226
281
  function promoteAppiumOptions(originalCaps) {
227
- const appiumOptions = originalCaps[APPIUM_OPTS_CAP];
228
-
229
- if (!appiumOptions) {
230
- return originalCaps;
231
- }
232
-
233
- let caps = _lodash.default.cloneDeep(originalCaps);
234
-
235
- if (!_lodash.default.isPlainObject(appiumOptions)) {
236
- throw new _errors.errors.SessionNotCreatedError(`The ${APPIUM_OPTS_CAP} capability must be an object`);
237
- }
238
-
239
- const strippedAppiumOptions = stripAppiumPrefixes(appiumOptions);
240
-
241
- const overwrittenKeys = _lodash.default.intersection(Object.keys(caps), Object.keys(strippedAppiumOptions));
242
-
243
- if (overwrittenKeys.length > 0) {
244
- _logger.default.warn(`Found capabilities inside ${PREFIXED_APPIUM_OPTS_CAP} that will overwrite ` + `capabilities at the top level: ${JSON.stringify(overwrittenKeys)}`);
245
- }
246
-
247
- caps = { ...caps,
248
- ...strippedAppiumOptions
249
- };
250
- delete caps[APPIUM_OPTS_CAP];
251
- return caps;
282
+ const promoteForObject = (obj) => {
283
+ const appiumOptions = obj[PREFIXED_APPIUM_OPTS_CAP];
284
+ if (!appiumOptions) {
285
+ return obj;
286
+ }
287
+ if (!lodash_1.default.isPlainObject(appiumOptions)) {
288
+ throw new errors_1.errors.SessionNotCreatedError(`The ${PREFIXED_APPIUM_OPTS_CAP} capability must be an object`);
289
+ }
290
+ if (lodash_1.default.isEmpty(appiumOptions)) {
291
+ return obj;
292
+ }
293
+ logger_1.default.debug(`Found ${PREFIXED_APPIUM_OPTS_CAP} capability present; will promote items inside to caps`);
294
+ /**
295
+ * @param {string} capName
296
+ */
297
+ const shouldAddVendorPrefix = (capName) => !capName.startsWith(APPIUM_VENDOR_PREFIX);
298
+ const verifyIfAcceptable = (capName) => {
299
+ if (!lodash_1.default.isString(capName)) {
300
+ throw new errors_1.errors.SessionNotCreatedError(`Capability names in ${PREFIXED_APPIUM_OPTS_CAP} must be strings. '${capName}' is unexpected`);
301
+ }
302
+ if (isStandardCap(capName)) {
303
+ throw new errors_1.errors.SessionNotCreatedError(`${PREFIXED_APPIUM_OPTS_CAP} must only contain vendor-specific capabilties. '${capName}' is unexpected`);
304
+ }
305
+ return capName;
306
+ };
307
+ const preprocessedOptions = (0, lodash_1.default)(appiumOptions)
308
+ .mapKeys((value, key) => verifyIfAcceptable(key))
309
+ .mapKeys((value, key) => (shouldAddVendorPrefix(key) ? `${APPIUM_VENDOR_PREFIX}${key}` : key))
310
+ .value();
311
+ // warn if we are going to overwrite any keys on the base caps object
312
+ const overwrittenKeys = lodash_1.default.intersection(Object.keys(obj), Object.keys(preprocessedOptions));
313
+ if (overwrittenKeys.length > 0) {
314
+ logger_1.default.warn(`Found capabilities inside ${PREFIXED_APPIUM_OPTS_CAP} that will overwrite ` +
315
+ `capabilities at the top level: ${JSON.stringify(overwrittenKeys)}`);
316
+ }
317
+ return lodash_1.default.cloneDeep({
318
+ ...lodash_1.default.omit(obj, PREFIXED_APPIUM_OPTS_CAP),
319
+ ...preprocessedOptions,
320
+ });
321
+ };
322
+ const { alwaysMatch, firstMatch } = originalCaps;
323
+ const result = {};
324
+ if (lodash_1.default.isPlainObject(alwaysMatch)) {
325
+ result.alwaysMatch = promoteForObject(alwaysMatch);
326
+ }
327
+ else if ('alwaysMatch' in originalCaps) {
328
+ result.alwaysMatch = alwaysMatch;
329
+ }
330
+ if (lodash_1.default.isArray(firstMatch)) {
331
+ result.firstMatch = firstMatch.map(promoteForObject);
332
+ }
333
+ else if ('firstMatch' in originalCaps) {
334
+ result.firstMatch = firstMatch;
335
+ }
336
+ return result;
252
337
  }
253
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBUFBJVU1fVkVORE9SX1BSRUZJWCIsIkFQUElVTV9PUFRTX0NBUCIsIlBSRUZJWEVEX0FQUElVTV9PUFRTX0NBUCIsIm1lcmdlQ2FwcyIsInByaW1hcnkiLCJzZWNvbmRhcnkiLCJyZXN1bHQiLCJuYW1lIiwidmFsdWUiLCJfIiwidG9QYWlycyIsImlzVW5kZWZpbmVkIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwidmFsaWRhdGVDYXBzIiwiY2FwcyIsImNvbnN0cmFpbnRzIiwib3B0cyIsInNraXBQcmVzZW5jZUNvbnN0cmFpbnQiLCJpc1BsYWluT2JqZWN0IiwibWFwVmFsdWVzIiwiY29uc3RyYWludCIsIm9taXQiLCJwcmVzZW5jZSIsImFsbG93RW1wdHkiLCJ2YWxpZGF0aW9uRXJyb3JzIiwidmFsaWRhdG9yIiwidmFsaWRhdGUiLCJwaWNrQnkiLCJ1dGlsIiwiaGFzVmFsdWUiLCJmdWxsTWVzc2FnZXMiLCJtZXNzYWdlIiwiYXR0cmlidXRlIiwicmVhc29ucyIsInJlYXNvbiIsInB1c2giLCJqb2luIiwiU1RBTkRBUkRfQ0FQUyIsIk9iamVjdCIsImZyZWV6ZSIsIlNldCIsIlNUQU5EQVJEX0NBUFNfTE9XRVIiLCJtYXAiLCJjYXAiLCJ0b0xvd2VyQ2FzZSIsImlzU3RhbmRhcmRDYXAiLCJoYXMiLCJzdHJpcEFwcGl1bVByZWZpeGVzIiwicHJlZml4ZWRDYXBzIiwibm9uUHJlZml4ZWRDYXBzIiwicGFydGl0aW9uIiwia2V5cyIsIlN0cmluZyIsInN0YXJ0c1dpdGgiLCJzdHJpcHBlZENhcHMiLCJwaWNrIiwiYmFkUHJlZml4ZWRDYXBzIiwicHJlZml4ZWRDYXAiLCJzdHJpcHBlZENhcE5hbWUiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJpc05pbCIsImxvZyIsIndhcm4iLCJmaW5kTm9uUHJlZml4ZWRDYXBzIiwiYWx3YXlzTWF0Y2giLCJmaXJzdE1hdGNoIiwiY2hhaW4iLCJyZWR1Y2UiLCJ1bnByZWZpeGVkQ2FwcyIsImZpbHRlciIsImluY2x1ZGVzIiwidW5pcSIsInBhcnNlQ2FwcyIsInNob3VsZFZhbGlkYXRlQ2FwcyIsInJlcXVpcmVkQ2FwcyIsImFsbEZpcnN0TWF0Y2hDYXBzIiwiaXNBcnJheSIsImlzRW1wdHkiLCJzdHJpcHBlZFJlcXVpcmVkQ2FwcyIsInN0cmlwcGVkQWxsRmlyc3RNYXRjaENhcHMiLCJmaWx0ZXJlZENvbnN0cmFpbnRzIiwib21pdEJ5Iiwia2V5IiwidmFsaWRhdGVkRmlyc3RNYXRjaENhcHMiLCJjb21wYWN0IiwiZmlyc3RNYXRjaENhcHMiLCJlIiwibWF0Y2hlZENhcHMiLCJlcnIiLCJwcm9jZXNzQ2FwYWJpbGl0aWVzIiwidzNjQ2FwcyIsInByb21vdGVBcHBpdW1PcHRpb25zIiwib3JpZ2luYWxDYXBzIiwiYXBwaXVtT3B0aW9ucyIsImNsb25lRGVlcCIsIlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IiLCJzdHJpcHBlZEFwcGl1bU9wdGlvbnMiLCJvdmVyd3JpdHRlbktleXMiLCJpbnRlcnNlY3Rpb24iXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvYmFzZWRyaXZlci9jYXBhYmlsaXRpZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge3ZhbGlkYXRvcn0gZnJvbSAnLi9kZXNpcmVkLWNhcHMnO1xuaW1wb3J0IHt1dGlsfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQge2Vycm9yc30gZnJvbSAnLi4vcHJvdG9jb2wvZXJyb3JzJztcblxuY29uc3QgQVBQSVVNX1ZFTkRPUl9QUkVGSVggPSAnYXBwaXVtOic7XG5jb25zdCBBUFBJVU1fT1BUU19DQVAgPSAnb3B0aW9ucyc7XG5jb25zdCBQUkVGSVhFRF9BUFBJVU1fT1BUU19DQVAgPSBgJHtBUFBJVU1fVkVORE9SX1BSRUZJWH0ke0FQUElVTV9PUFRTX0NBUH1gO1xuXG4vKipcbiAqIFRha2VzIHByaW1hcnkgY2FwcyBvYmplY3QgYW5kIG1lcmdlcyBpdCBpbnRvIGEgc2Vjb25kYXJ5IGNhcHMgb2JqZWN0LlxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gW1Q9e31dXG4gKiBAdGVtcGxhdGUge0NvbnN0cmFpbnRzfSBbVT17fV1cbiAqIEBwYXJhbSB7Q2FwYWJpbGl0aWVzPFQ+fSBbcHJpbWFyeV1cbiAqIEBwYXJhbSB7Q2FwYWJpbGl0aWVzPFU+fSBbc2Vjb25kYXJ5XVxuICogQHJldHVybnMge2ltcG9ydCgndHlwZS1mZXN0JykuTWVyZ2U8Q2FwYWJpbGl0aWVzPFQ+LCBDYXBhYmlsaXRpZXM8VT4+fVxuICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvd2ViZHJpdmVyLyNkZm4tbWVyZ2luZy1jYXBhYmlsaXRpZXMpXG4gKi9cbmZ1bmN0aW9uIG1lcmdlQ2FwcyhwcmltYXJ5ID0ge30sIHNlY29uZGFyeSA9IHt9KSB7XG4gIGxldCByZXN1bHQgPSAvKiogQHR5cGUge2ltcG9ydCgndHlwZS1mZXN0JykuTWVyZ2U8Q2FwYWJpbGl0aWVzPFQ+LCBDYXBhYmlsaXRpZXM8VT4+fSAqLyAoe1xuICAgIC4uLnByaW1hcnksXG4gIH0pO1xuXG4gIGZvciAobGV0IFtuYW1lLCB2YWx1ZV0gb2YgLyoqIEB0eXBlIHtba2V5b2YgdHlwZW9mIHNlY29uZGFyeSwgYW55XX0gKi8gKF8udG9QYWlycyhzZWNvbmRhcnkpKSkge1xuICAgIC8vIE92ZXJ3cml0aW5nIGlzIG5vdCBhbGxvd2VkLiBQcmltYXJ5IGFuZCBzZWNvbmRhcnkgbXVzdCBoYXZlIGRpZmZlcmVudCBwcm9wZXJ0aWVzICh3M2MgcnVsZSA0LjQpXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHByaW1hcnlbbmFtZV0pKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgICBgcHJvcGVydHkgJyR7bmFtZX0nIHNob3VsZCBub3QgZXhpc3Qgb24gYm90aCBwcmltYXJ5ICgke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHByaW1hcnlcbiAgICAgICAgKX0pIGFuZCBzZWNvbmRhcnkgKCR7SlNPTi5zdHJpbmdpZnkoc2Vjb25kYXJ5KX0pIG9iamVjdGBcbiAgICAgICk7XG4gICAgfVxuICAgIHJlc3VsdFsvKiogQHR5cGUge2tleW9mIHR5cGVvZiByZXN1bHR9ICovIChuYW1lKV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIFZhbGlkYXRlcyBjYXBzIGFnYWluc3QgYSBzZXQgb2YgY29uc3RyYWludHNcbi8qKlxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gW0M9e31dXG4gKiBAcGFyYW0ge0NhcGFiaWxpdGllczxDPn0gY2Fwc1xuICogQHBhcmFtIHtDfSBbY29uc3RyYWludHNdXG4gKiBAcGFyYW0ge1ZhbGlkYXRlQ2Fwc09wdHN9IFtvcHRzXVxuICogQHJldHVybnMge0NhcGFiaWxpdGllczxDPn1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDYXBzKGNhcHMsIGNvbnN0cmFpbnRzID0gLyoqIEB0eXBlIHtDfSAqLyAoe30pLCBvcHRzID0ge30pIHtcbiAgbGV0IHtza2lwUHJlc2VuY2VDb25zdHJhaW50fSA9IG9wdHM7XG5cbiAgaWYgKCFfLmlzUGxhaW5PYmplY3QoY2FwcykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBtdXN0IGJlIGEgSlNPTiBvYmplY3RgKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSB0aGUgJ3ByZXNlbmNlJyBjb25zdHJhaW50IGlmIHdlJ3JlIG5vdCBjaGVja2luZyBmb3IgaXRcbiAgY29uc3RyYWludHMgPSAvKiogQHR5cGUge0N9ICovIChcbiAgICBfLm1hcFZhbHVlcyhcbiAgICAgIGNvbnN0cmFpbnRzLFxuICAgICAgc2tpcFByZXNlbmNlQ29uc3RyYWludFxuICAgICAgICA/IC8qKiBAcGFyYW0ge0NvbnN0cmFpbnR9IGNvbnN0cmFpbnQgKi9cbiAgICAgICAgICAoY29uc3RyYWludCkgPT4gXy5vbWl0KGNvbnN0cmFpbnQsICdwcmVzZW5jZScpXG4gICAgICAgIDogLyoqIEBwYXJhbSB7Q29uc3RyYWludH0gY29uc3RyYWludCAqL1xuICAgICAgICAgIChjb25zdHJhaW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoY29uc3RyYWludC5wcmVzZW5jZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICByZXR1cm4gey4uLl8ub21pdChjb25zdHJhaW50LCAncHJlc2VuY2UnKSwgcHJlc2VuY2U6IHthbGxvd0VtcHR5OiBmYWxzZX19O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnQ7XG4gICAgICAgICAgfVxuICAgIClcbiAgKTtcblxuICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdG9yLnZhbGlkYXRlKF8ucGlja0J5KGNhcHMsIHV0aWwuaGFzVmFsdWUpLCBjb25zdHJhaW50cywge1xuICAgIGZ1bGxNZXNzYWdlczogZmFsc2UsXG4gIH0pO1xuXG4gIGlmICh2YWxpZGF0aW9uRXJyb3JzKSB7XG4gICAgbGV0IG1lc3NhZ2UgPSBbXTtcbiAgICBmb3IgKGxldCBbYXR0cmlidXRlLCByZWFzb25zXSBvZiBfLnRvUGFpcnModmFsaWRhdGlvbkVycm9ycykpIHtcbiAgICAgIGZvciAobGV0IHJlYXNvbiBvZiByZWFzb25zKSB7XG4gICAgICAgIG1lc3NhZ2UucHVzaChgJyR7YXR0cmlidXRlfScgJHtyZWFzb259YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IobWVzc2FnZS5qb2luKCc7ICcpKTtcbiAgfVxuXG4gIC8vIFJldHVybiBjYXBzXG4gIHJldHVybiBjYXBzO1xufVxuXG4vKipcbiAqIFN0YW5kYXJkLCBub24tcHJlZml4ZWQgY2FwYWJpbGl0aWVzXG4gKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJkcml2ZXIvI2Rmbi10YWJsZS1vZi1zdGFuZGFyZC1jYXBhYmlsaXRpZXMpXG4gKi9cbmV4cG9ydCBjb25zdCBTVEFOREFSRF9DQVBTID0gT2JqZWN0LmZyZWV6ZShcbiAgbmV3IFNldChcbiAgICAvKiogQHR5cGUge2ltcG9ydCgndHlwZS1mZXN0JykuU3RyaW5nS2V5T2Y8aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuU3RhbmRhcmRDYXBhYmlsaXRpZXM+W119ICovIChbXG4gICAgICAnYnJvd3Nlck5hbWUnLFxuICAgICAgJ2Jyb3dzZXJWZXJzaW9uJyxcbiAgICAgICdwbGF0Zm9ybU5hbWUnLFxuICAgICAgJ2FjY2VwdEluc2VjdXJlQ2VydHMnLFxuICAgICAgJ3BhZ2VMb2FkU3RyYXRlZ3knLFxuICAgICAgJ3Byb3h5JyxcbiAgICAgICdzZXRXaW5kb3dSZWN0JyxcbiAgICAgICd0aW1lb3V0cycsXG4gICAgICAndW5oYW5kbGVkUHJvbXB0QmVoYXZpb3InLFxuICAgIF0pXG4gIClcbik7XG5cbmNvbnN0IFNUQU5EQVJEX0NBUFNfTE9XRVIgPSBuZXcgU2V0KFsuLi5TVEFOREFSRF9DQVBTXS5tYXAoKGNhcCkgPT4gY2FwLnRvTG93ZXJDYXNlKCkpKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2FwXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNTdGFuZGFyZENhcChjYXApIHtcbiAgcmV0dXJuIFNUQU5EQVJEX0NBUFNfTE9XRVIuaGFzKGNhcC50b0xvd2VyQ2FzZSgpKTtcbn1cblxuLyoqXG4gKiBJZiB0aGUgJ2FwcGl1bTonIHByZWZpeCB3YXMgcHJvdmlkZWQgYW5kIGl0J3MgYSB2YWxpZCBjYXBhYmlsaXR5LCBzdHJpcCBvdXQgdGhlIHByZWZpeFxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gW0M9e31dXG4gKiBAcGFyYW0ge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLk5TQ2FwYWJpbGl0aWVzPEM+fSBjYXBzXG4gKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJkcml2ZXIvI2Rmbi1leHRlbnNpb24tY2FwYWJpbGl0aWVzXG4gKiBAaW50ZXJuYWxcbiAqIEByZXR1cm5zIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5DYXBhYmlsaXRpZXM8Qz59XG4gKi9cbmZ1bmN0aW9uIHN0cmlwQXBwaXVtUHJlZml4ZXMoY2Fwcykge1xuICAvLyBzcGxpdCBpbnRvIHByZWZpeGVkIGFuZCBub24tcHJlZml4ZWQuXG4gIC8vIG5vbi1wcmVmaXhlZCBzaG91bGQgYmUgc3RhbmRhcmQgY2FwcyBhdCB0aGlzIHBvaW50XG4gIGNvbnN0IFtwcmVmaXhlZENhcHMsIG5vblByZWZpeGVkQ2Fwc10gPSBfLnBhcnRpdGlvbihfLmtleXMoY2FwcyksIChjYXApID0+XG4gICAgU3RyaW5nKGNhcCkuc3RhcnRzV2l0aChBUFBJVU1fVkVORE9SX1BSRUZJWClcbiAgKTtcblxuICAvLyBpbml0aWFsaXplIHRoaXMgd2l0aCB0aGUgay92IHBhaXJzIG9mIHRoZSBub24tcHJlZml4ZWQgY2Fwc1xuICBsZXQgc3RyaXBwZWRDYXBzID0gLyoqIEB0eXBlIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5DYXBhYmlsaXRpZXM8Qz59ICovIChcbiAgICBfLnBpY2soY2Fwcywgbm9uUHJlZml4ZWRDYXBzKVxuICApO1xuICBjb25zdCBiYWRQcmVmaXhlZENhcHMgPSBbXTtcblxuICAvLyBTdHJpcCBvdXQgdGhlICdhcHBpdW06JyBwcmVmaXhcbiAgZm9yIChsZXQgcHJlZml4ZWRDYXAgb2YgcHJlZml4ZWRDYXBzKSB7XG4gICAgY29uc3Qgc3RyaXBwZWRDYXBOYW1lID1cbiAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KCd0eXBlLWZlc3QnKS5TdHJpbmdLZXlPZjxpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5DYXBhYmlsaXRpZXM8Qz4+fSAqLyAoXG4gICAgICAgIHByZWZpeGVkQ2FwLnN1YnN0cmluZyhBUFBJVU1fVkVORE9SX1BSRUZJWC5sZW5ndGgpXG4gICAgICApO1xuXG4gICAgLy8gSWYgaXQncyBzdGFuZGFyZCBjYXBhYmlsaXR5IHRoYXQgd2FzIHByZWZpeGVkLCBhZGQgaXQgdG8gYW4gYXJyYXkgb2YgaW5jb3JyZWN0bHkgcHJlZml4ZWQgY2FwYWJpbGl0aWVzXG4gICAgaWYgKGlzU3RhbmRhcmRDYXAoc3RyaXBwZWRDYXBOYW1lKSkge1xuICAgICAgYmFkUHJlZml4ZWRDYXBzLnB1c2goc3RyaXBwZWRDYXBOYW1lKTtcbiAgICAgIGlmIChfLmlzTmlsKHN0cmlwcGVkQ2Fwc1tzdHJpcHBlZENhcE5hbWVdKSkge1xuICAgICAgICBzdHJpcHBlZENhcHNbc3RyaXBwZWRDYXBOYW1lXSA9IGNhcHNbcHJlZml4ZWRDYXBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLndhcm4oXG4gICAgICAgICAgYElnbm9yaW5nIGNhcGFiaWxpdHkgJyR7cHJlZml4ZWRDYXB9PSR7Y2Fwc1twcmVmaXhlZENhcF19JyBhbmQgYCArXG4gICAgICAgICAgICBgdXNpbmcgY2FwYWJpbGl0eSAnJHtzdHJpcHBlZENhcE5hbWV9PSR7c3RyaXBwZWRDYXBzW3N0cmlwcGVkQ2FwTmFtZV19J2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyaXBwZWRDYXBzW3N0cmlwcGVkQ2FwTmFtZV0gPSBjYXBzW3ByZWZpeGVkQ2FwXTtcbiAgICB9XG4gIH1cblxuICAvLyBJZiB3ZSBmb3VuZCBzdGFuZGFyZCBjYXBzIHRoYXQgd2VyZSBpbmNvcnJlY3RseSBwcmVmaXhlZCwgdGhyb3cgYW4gZXhjZXB0aW9uIChlLmcuOiBkb24ndCBhY2NlcHQgJ2FwcGl1bTpwbGF0Zm9ybU5hbWUnLCBvbmx5IGFjY2VwdCBqdXN0ICdwbGF0Zm9ybU5hbWUnKVxuICBpZiAoYmFkUHJlZml4ZWRDYXBzLmxlbmd0aCA+IDApIHtcbiAgICBsb2cud2FybihcbiAgICAgIGBUaGUgY2FwYWJpbGl0aWVzICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGJhZFByZWZpeGVkQ2Fwc1xuICAgICAgKX0gYXJlIHN0YW5kYXJkIGNhcGFiaWxpdGllcyBhbmQgZG8gbm90IHJlcXVpcmUgXCJhcHBpdW06XCIgcHJlZml4YFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHN0cmlwcGVkQ2Fwcztcbn1cblxuLyoqXG4gKiBHZXQgYW4gYXJyYXkgb2YgYWxsIHRoZSB1bnByZWZpeGVkIGNhcHMgdGhhdCBhcmUgYmVpbmcgdXNlZCBpbiAnYWx3YXlzTWF0Y2gnIGFuZCBhbGwgb2YgdGhlICdmaXJzdE1hdGNoJyBvYmplY3RcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IFtDPXt9XVxuICogQHBhcmFtIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5XM0NDYXBhYmlsaXRpZXM8Qz59IGNhcHMgQSBjYXBhYmlsaXRpZXMgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGZpbmROb25QcmVmaXhlZENhcHMoe2Fsd2F5c01hdGNoID0ge30sIGZpcnN0TWF0Y2ggPSBbXX0pIHtcbiAgcmV0dXJuIF8uY2hhaW4oW2Fsd2F5c01hdGNoLCAuLi5maXJzdE1hdGNoXSlcbiAgICAucmVkdWNlKFxuICAgICAgKHVucHJlZml4ZWRDYXBzLCBjYXBzKSA9PiBbXG4gICAgICAgIC4uLnVucHJlZml4ZWRDYXBzLFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhjYXBzKS5maWx0ZXIoKGNhcCkgPT4gIWNhcC5pbmNsdWRlcygnOicpICYmICFpc1N0YW5kYXJkQ2FwKGNhcCkpLFxuICAgICAgXSxcbiAgICAgIFtdXG4gICAgKVxuICAgIC51bmlxKClcbiAgICAudmFsdWUoKTtcbn1cblxuLyoqXG4gKiBQYXJzZSBjYXBhYmlsaXRpZXNcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IFtDPXt9XVxuICogQHBhcmFtIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5XM0NDYXBhYmlsaXRpZXM8Qz59IGNhcHNcbiAqIEBwYXJhbSB7Q30gW2NvbnN0cmFpbnRzXVxuICogQHBhcmFtIHtib29sZWFufSBbc2hvdWxkVmFsaWRhdGVDYXBzXVxuICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvd2ViZHJpdmVyLyNwcm9jZXNzaW5nLWNhcGFiaWxpdGllc1xuICovXG5mdW5jdGlvbiBwYXJzZUNhcHMoY2FwcywgY29uc3RyYWludHMgPSAvKiogQHR5cGUge0N9ICovICh7fSksIHNob3VsZFZhbGlkYXRlQ2FwcyA9IHRydWUpIHtcbiAgLy8gSWYgY2FwYWJpbGl0aWVzIHJlcXVlc3QgaXMgbm90IGFuIG9iamVjdCwgcmV0dXJuIGVycm9yICgjMS4xKVxuICBpZiAoIV8uaXNQbGFpbk9iamVjdChjYXBzKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAnVGhlIGNhcGFiaWxpdGllcyBhcmd1bWVudCB3YXMgbm90IHZhbGlkIGZvciB0aGUgZm9sbG93aW5nIHJlYXNvbihzKTogXCJjYXBhYmlsaXRpZXNcIiBtdXN0IGJlIGEgSlNPTiBvYmplY3QuJ1xuICAgICk7XG4gIH1cblxuICAvLyBMZXQgJ3JlcXVpcmVkQ2FwcycgYmUgcHJvcGVydHkgbmFtZWQgJ2Fsd2F5c01hdGNoJyBmcm9tIGNhcGFiaWxpdGllcyByZXF1ZXN0ICgjMilcbiAgLy8gYW5kICdhbGxGaXJzdE1hdGNoQ2FwcycgYmUgcHJvcGVydHkgbmFtZWQgJ2ZpcnN0TWF0Y2gnIGZyb20gY2FwYWJpbGl0aWVzIHJlcXVlc3QgKCMzKVxuICBsZXQge1xuICAgIGFsd2F5c01hdGNoOiByZXF1aXJlZENhcHMgPSB7fSwgLy8gSWYgJ3JlcXVpcmVkQ2FwcycgaXMgdW5kZWZpbmVkLCBzZXQgaXQgdG8gYW4gZW1wdHkgSlNPTiBvYmplY3QgKCMyLjEpXG4gICAgZmlyc3RNYXRjaDogYWxsRmlyc3RNYXRjaENhcHMgPSBbe31dLCAvLyBJZiAnZmlyc3RNYXRjaCcgaXMgdW5kZWZpbmVkIHNldCBpdCB0byBhIHNpbmdsZXRvbiBsaXN0IHdpdGggb25lIGVtcHR5IG9iamVjdCAoIzMuMSlcbiAgfSA9IGNhcHM7XG5cbiAgLy8gUmVqZWN0ICdmaXJzdE1hdGNoJyBhcmd1bWVudCBpZiBpdCdzIG5vdCBhbiBhcnJheSAoIzMuMilcbiAgaWYgKCFfLmlzQXJyYXkoYWxsRmlyc3RNYXRjaENhcHMpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICdUaGUgY2FwYWJpbGl0aWVzLmZpcnN0TWF0Y2ggYXJndW1lbnQgd2FzIG5vdCB2YWxpZCBmb3IgdGhlIGZvbGxvd2luZyByZWFzb24ocyk6IFwiY2FwYWJpbGl0aWVzLmZpcnN0TWF0Y2hcIiBtdXN0IGJlIGEgSlNPTiBhcnJheSBvciB1bmRlZmluZWQnXG4gICAgKTtcbiAgfVxuXG4gIC8vIElmIGFuIGVtcHR5IGFycmF5IGFzIHByb3ZpZGVkLCB3ZSdsbCBiZSBmb3JnaXZpbmcgYW5kIG1ha2UgaXQgYW4gYXJyYXkgb2Ygb25lIGVtcHR5IG9iamVjdFxuICAvLyBJbiB0aGUgZnV0dXJlLCByZWplY3QgJ2ZpcnN0TWF0Y2gnIGFyZ3VtZW50IGlmIGl0cyBhcnJheSBkaWQgbm90IGhhdmUgb25lIG9yIG1vcmUgZW50cmllcyAoIzMuMilcbiAgaWYgKGFsbEZpcnN0TWF0Y2hDYXBzLmxlbmd0aCA9PT0gMCkge1xuICAgIGxvZy53YXJuKFxuICAgICAgYFRoZSBmaXJzdE1hdGNoIGFycmF5IGluIHRoZSBnaXZlbiBjYXBhYmlsaXRpZXMgaGFzIG5vIGVudHJpZXMuIEFkZGluZyBhbiBlbXB0eSBlbnRyeSBmbyBybm93LCBgICtcbiAgICAgICAgYGJ1dCBpdCB3aWxsIHJlcXVpcmUgb25lIG9yIG1vcmUgZW50cmllcyBhcyBXM0Mgc3BlYy5gXG4gICAgKTtcbiAgICBhbGxGaXJzdE1hdGNoQ2Fwcy5wdXNoKHt9KTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBub24tcHJlZml4ZWQsIG5vbi1zdGFuZGFyZCBjYXBhYmlsaXRpZXMgYW5kIGxvZyB3YXJuaW5ncyBpZiB0aGV5IGFyZSBmb3VuZFxuICBsZXQgbm9uUHJlZml4ZWRDYXBzID0gZmluZE5vblByZWZpeGVkQ2FwcyhjYXBzKTtcbiAgaWYgKCFfLmlzRW1wdHkobm9uUHJlZml4ZWRDYXBzKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICBgQWxsIG5vbi1zdGFuZGFyZCBjYXBhYmlsaXRpZXMgc2hvdWxkIGhhdmUgYSB2ZW5kb3IgcHJlZml4LiBUaGUgZm9sbG93aW5nIGNhcGFiaWxpdGllcyBkaWQgbm90IGhhdmUgb25lOiAke25vblByZWZpeGVkQ2Fwc31gXG4gICAgKTtcbiAgfVxuXG4gIC8vIFN0cmlwIG91dCB0aGUgJ2FwcGl1bTonIHByZWZpeCBmcm9tIGFsbFxuICBsZXQgc3RyaXBwZWRSZXF1aXJlZENhcHMgPSBzdHJpcEFwcGl1bVByZWZpeGVzKHJlcXVpcmVkQ2Fwcyk7XG4gIGxldCBzdHJpcHBlZEFsbEZpcnN0TWF0Y2hDYXBzID0gYWxsRmlyc3RNYXRjaENhcHMubWFwKHN0cmlwQXBwaXVtUHJlZml4ZXMpO1xuXG4gIC8vIFZhbGlkYXRlIHRoZSByZXF1aXJlZENhcHMuIEJ1dCBkb24ndCB2YWxpZGF0ZSAncHJlc2VuY2UnIGJlY2F1c2UgaWYgdGhhdCBjb25zdHJhaW50IGZhaWxzIG9uICdhbHdheXNNYXRjaCcgaXQgY291bGQgc3RpbGwgcGFzcyBvbiBvbmUgb2YgdGhlICdmaXJzdE1hdGNoJyBrZXlzXG4gIGlmIChzaG91bGRWYWxpZGF0ZUNhcHMpIHtcbiAgICBzdHJpcHBlZFJlcXVpcmVkQ2FwcyA9IHZhbGlkYXRlQ2FwcyhzdHJpcHBlZFJlcXVpcmVkQ2FwcywgY29uc3RyYWludHMsIHtcbiAgICAgIHNraXBQcmVzZW5jZUNvbnN0cmFpbnQ6IHRydWUsXG4gICAgfSk7XG4gIH1cbiAgLy8gUmVtb3ZlIHRoZSAncHJlc2VuY2UnIGNvbnN0cmFpbnQgZm9yIGFueSBrZXlzIHRoYXQgYXJlIGFscmVhZHkgcHJlc2VudCBpbiAncmVxdWlyZWRDYXBzJ1xuICAvLyBzaW5jZSB3ZSBrbm93IHRoYXQgdGhpcyBjb25zdHJhaW50IGhhcyBhbHJlYWR5IHBhc3NlZFxuICBjb25zdCBmaWx0ZXJlZENvbnN0cmFpbnRzID0gLyoqIEB0eXBlIHtDfSAqLyAoXG4gICAgXy5vbWl0QnkoY29uc3RyYWludHMsIChfLCBrZXkpID0+IGtleSBpbiBzdHJpcHBlZFJlcXVpcmVkQ2FwcylcbiAgKTtcblxuICAvLyBWYWxpZGF0ZSBhbGwgb2YgdGhlIGZpcnN0IG1hdGNoIGNhcGFiaWxpdGllcyBhbmQgcmV0dXJuIGFuIGFycmF5IHdpdGggb25seSB0aGUgdmFsaWQgY2FwcyAoc2VlIHNwZWMgIzUpXG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGxldCB2YWxpZGF0aW9uRXJyb3JzID0gW107XG4gIGxldCB2YWxpZGF0ZWRGaXJzdE1hdGNoQ2FwcyA9IF8uY29tcGFjdChcbiAgICBzdHJpcHBlZEFsbEZpcnN0TWF0Y2hDYXBzLm1hcChcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5DYXBhYmlsaXRpZXM8Qz59IGZpcnN0TWF0Y2hDYXBzXG4gICAgICAgKi9cbiAgICAgIChmaXJzdE1hdGNoQ2FwcykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFZhbGlkYXRlIGZpcnN0TWF0Y2ggY2Fwc1xuICAgICAgICAgIHJldHVybiBzaG91bGRWYWxpZGF0ZUNhcHNcbiAgICAgICAgICAgID8gdmFsaWRhdGVDYXBzKGZpcnN0TWF0Y2hDYXBzLCBmaWx0ZXJlZENvbnN0cmFpbnRzKVxuICAgICAgICAgICAgOiBmaXJzdE1hdGNoQ2FwcztcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHZhbGlkYXRpb25FcnJvcnMucHVzaChlLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKVxuICApO1xuXG4gIC8vIFRyeSB0byBtZXJnZSByZXF1aXJlZENhcHMgd2l0aCBmaXJzdCBtYXRjaCBjYXBhYmlsaXRpZXMsIGJyZWFrIG9uY2UgaXQgZmluZHMgaXRzIGZpcnN0IG1hdGNoIChzZWUgc3BlYyAjNilcbiAgbGV0IG1hdGNoZWRDYXBzID0gbnVsbDtcbiAgZm9yIChsZXQgZmlyc3RNYXRjaENhcHMgb2YgdmFsaWRhdGVkRmlyc3RNYXRjaENhcHMpIHtcbiAgICB0cnkge1xuICAgICAgbWF0Y2hlZENhcHMgPSBtZXJnZUNhcHMoc3RyaXBwZWRSZXF1aXJlZENhcHMsIGZpcnN0TWF0Y2hDYXBzKTtcbiAgICAgIGlmIChtYXRjaGVkQ2Fwcykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy53YXJuKGVyci5tZXNzYWdlKTtcbiAgICAgIHZhbGlkYXRpb25FcnJvcnMucHVzaChlcnIubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmV0dXJucyB2YXJpYWJsZXMgZm9yIHRlc3RpbmcgcHVycG9zZXNcbiAgcmV0dXJuIHtcbiAgICByZXF1aXJlZENhcHMsXG4gICAgYWxsRmlyc3RNYXRjaENhcHMsXG4gICAgdmFsaWRhdGVkRmlyc3RNYXRjaENhcHMsXG4gICAgbWF0Y2hlZENhcHMsXG4gICAgdmFsaWRhdGlvbkVycm9ycyxcbiAgfTtcbn1cblxuLy8gQ2FsbHMgcGFyc2VDYXBzIGFuZCBqdXN0IHJldHVybnMgdGhlIG1hdGNoZWRDYXBzIHZhcmlhYmxlXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IENcbiAqIEBwYXJhbSB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuVzNDQ2FwYWJpbGl0aWVzPEM+fSB3M2NDYXBzXG4gKiBAcGFyYW0ge0N9IFtjb25zdHJhaW50c11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Nob3VsZFZhbGlkYXRlQ2Fwc11cbiAqIEByZXR1cm5zIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5DYXBhYmlsaXRpZXM8Qz59XG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NDYXBhYmlsaXRpZXMoXG4gIHczY0NhcHMsXG4gIGNvbnN0cmFpbnRzID0gLyoqIEB0eXBlIHtDfSAqLyAoe30pLFxuICBzaG91bGRWYWxpZGF0ZUNhcHMgPSB0cnVlXG4pIHtcbiAgY29uc3Qge21hdGNoZWRDYXBzLCB2YWxpZGF0aW9uRXJyb3JzfSA9IHBhcnNlQ2Fwcyh3M2NDYXBzLCBjb25zdHJhaW50cywgc2hvdWxkVmFsaWRhdGVDYXBzKTtcblxuICAvLyBJZiB3ZSBmb3VuZCBhbiBlcnJvciB0aHJvdyBhbiBleGNlcHRpb25cbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKG1hdGNoZWRDYXBzKSkge1xuICAgIGlmIChfLmlzQXJyYXkodzNjQ2Fwcy5maXJzdE1hdGNoKSAmJiB3M2NDYXBzLmZpcnN0TWF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgLy8gSWYgdGhlcmUgd2FzIG1vcmUgdGhhbiBvbmUgJ2ZpcnN0TWF0Y2gnIGNhcCwgaW5kaWNhdGUgdGhhdCB3ZSBjb3VsZG4ndCBmaW5kIGEgbWF0Y2hpbmcgY2FwYWJpbGl0aWVzIHNldCBhbmQgc2hvdyBhbGwgdGhlIGVycm9yc1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIG1hdGNoaW5nIGNhcGFiaWxpdGllcyBmcm9tICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgdzNjQ2Fwc1xuICAgICAgICApfTpcXG4gJHt2YWxpZGF0aW9uRXJyb3JzLmpvaW4oJ1xcbicpfWBcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE90aGVyd2lzZSwganVzdCBzaG93IHRoZSBzaW5ndWxhciBlcnJvciBtZXNzYWdlXG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKHZhbGlkYXRpb25FcnJvcnNbMF0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAvKiogQHR5cGUge0NhcGFiaWxpdGllczxDPn0gKi8gKG1hdGNoZWRDYXBzID8/IHt9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYSBjb3B5IG9mIGEgY2FwYWJpbGl0aWVzIG9iamVjdCB3aGljaCBoYXMgdGFrZW4gZXZlcnl0aGluZyB3aXRoaW4gdGhlICdvcHRpb25zJ1xuICogY2FwYWJpbGl0eSBhbmQgcHJvbW90ZWQgaXQgdG8gdGhlIHRvcCBsZXZlbC4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgYXNzdW1lZCB0byBiZSBydW4gYWZ0ZXJcbiAqIGFsbCB2ZW5kb3IgcHJlZml4ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc3RyaXBwZWQgZnJvbSB0aGUgdG9wIGxldmVsLiBTbyB3ZSBhcmUgZGVhbGluZyB3aXRoIGUuZy5cbiAqICdvcHRpb25zJyBhbmQgbm90ICdhcHBpdW06b3B0aW9ucycgYXQgdGhpcyBwb2ludC4gQW55IHByZWZpeGVzIF9pbnNpZGVfIHRoZSAnb3B0aW9ucycgY2FwYWJpbGl0eVxuICogd2lsbCB0aGVtc2VsdmVzIGJlIHN0cmlwcGVkLiBUaGlzIGlzIGRlc2lnbmVkIGFzIGFuIGludGVybmFsIGZ1bmN0aW9uLCBub3Qgb25lIHRvIG9wZXJhdGUgb25cbiAqIHVzZXItY29uc3RydWN0ZWQgY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcmlnaW5hbENhcHMgLSB0aGUgY2FwYWJpbGl0aWVzIHRvIGFuYWx5emUgYW5kIHByb21vdGUgZnJvbSAnb3B0aW9ucydcbiAqIEByZXR1cm4ge29iamVjdCF9IC0gdGhlIGNhcGFiaWxpdGllcyB3aXRoICdvcHRpb25zJyBwcm9tb3RlZCBpZiBuZWNlc3NhcnlcbiAqL1xuZnVuY3Rpb24gcHJvbW90ZUFwcGl1bU9wdGlvbnMob3JpZ2luYWxDYXBzKSB7XG4gIGNvbnN0IGFwcGl1bU9wdGlvbnMgPSBvcmlnaW5hbENhcHNbQVBQSVVNX09QVFNfQ0FQXTtcbiAgaWYgKCFhcHBpdW1PcHRpb25zKSB7XG4gICAgcmV0dXJuIG9yaWdpbmFsQ2FwcztcbiAgfVxuXG4gIGxldCBjYXBzID0gXy5jbG9uZURlZXAob3JpZ2luYWxDYXBzKTtcbiAgaWYgKCFfLmlzUGxhaW5PYmplY3QoYXBwaXVtT3B0aW9ucykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IoYFRoZSAke0FQUElVTV9PUFRTX0NBUH0gY2FwYWJpbGl0eSBtdXN0IGJlIGFuIG9iamVjdGApO1xuICB9XG5cbiAgLy8gZmlyc3QgZ2V0IHJpZCBvZiBhbnkgcHJlZml4ZXMgaW5zaWRlIGFwcGl1bTpvcHRpb25zXG4gIGNvbnN0IHN0cmlwcGVkQXBwaXVtT3B0aW9ucyA9IHN0cmlwQXBwaXVtUHJlZml4ZXMoYXBwaXVtT3B0aW9ucyk7XG4gIC8vIHdhcm4gaWYgd2UgYXJlIGdvaW5nIHRvIG92ZXJ3cml0ZSBhbnkga2V5cyBvbiB0aGUgYmFzZSBjYXBzIG9iamVjdFxuICBjb25zdCBvdmVyd3JpdHRlbktleXMgPSBfLmludGVyc2VjdGlvbihPYmplY3Qua2V5cyhjYXBzKSwgT2JqZWN0LmtleXMoc3RyaXBwZWRBcHBpdW1PcHRpb25zKSk7XG4gIGlmIChvdmVyd3JpdHRlbktleXMubGVuZ3RoID4gMCkge1xuICAgIGxvZy53YXJuKFxuICAgICAgYEZvdW5kIGNhcGFiaWxpdGllcyBpbnNpZGUgJHtQUkVGSVhFRF9BUFBJVU1fT1BUU19DQVB9IHRoYXQgd2lsbCBvdmVyd3JpdGUgYCArXG4gICAgICAgIGBjYXBhYmlsaXRpZXMgYXQgdGhlIHRvcCBsZXZlbDogJHtKU09OLnN0cmluZ2lmeShvdmVyd3JpdHRlbktleXMpfWBcbiAgICApO1xuICB9XG5cbiAgLy8gbm93IGp1c3QgYXBwbHkgdGhlbSB0byB0aGUgbWFpbiBjYXBzIG9iamVjdFxuICBjYXBzID0gey4uLmNhcHMsIC4uLnN0cmlwcGVkQXBwaXVtT3B0aW9uc307XG5cbiAgLy8gYW5kIHJlbW92ZSBhbGwgdHJhY2VzIG9mIHRoZSBvcHRpb25zIGNhcFxuICBkZWxldGUgY2Fwc1tBUFBJVU1fT1BUU19DQVBdO1xuICByZXR1cm4gY2Fwcztcbn1cblxuZXhwb3J0IHtcbiAgcGFyc2VDYXBzLFxuICBwcm9jZXNzQ2FwYWJpbGl0aWVzLFxuICB2YWxpZGF0ZUNhcHMsXG4gIG1lcmdlQ2FwcyxcbiAgQVBQSVVNX1ZFTkRPUl9QUkVGSVgsXG4gIEFQUElVTV9PUFRTX0NBUCxcbiAgZmluZE5vblByZWZpeGVkQ2FwcyxcbiAgaXNTdGFuZGFyZENhcCxcbiAgc3RyaXBBcHBpdW1QcmVmaXhlcyxcbiAgcHJvbW90ZUFwcGl1bU9wdGlvbnMsXG4gIFBSRUZJWEVEX0FQUElVTV9PUFRTX0NBUCxcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNvbnN0cmFpbnRzfSBDb25zdHJhaW50c1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNvbnN0cmFpbnR9IENvbnN0cmFpbnRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5TdHJpbmdSZWNvcmR9IFN0cmluZ1JlY29yZFxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkJhc2VEcml2ZXJDYXBDb25zdHJhaW50c30gQmFzZURyaXZlckNhcENvbnN0cmFpbnRzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBWYWxpZGF0ZUNhcHNPcHRzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtza2lwUHJlc2VuY2VDb25zdHJhaW50XSAtIGlmIHRydWUsIHNraXAgdGhlIHByZXNlbmNlIGNvbnN0cmFpbnRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IFtDPUJhc2VEcml2ZXJDYXBDb25zdHJhaW50c11cbiAqIEB0ZW1wbGF0ZSB7U3RyaW5nUmVjb3JkfHZvaWR9IFtFeHRyYT12b2lkXVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLk5TQ2FwYWJpbGl0aWVzPEMsIEV4dHJhPn0gTlNDYXBhYmlsaXRpZXNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IFtDPUJhc2VEcml2ZXJDYXBDb25zdHJhaW50c11cbiAqIEB0ZW1wbGF0ZSB7U3RyaW5nUmVjb3JkfHZvaWR9IFtFeHRyYT12b2lkXVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNhcGFiaWxpdGllczxDLCBFeHRyYT59IENhcGFiaWxpdGllc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gW0M9QmFzZURyaXZlckNhcENvbnN0cmFpbnRzXVxuICogQHRlbXBsYXRlIHtTdHJpbmdSZWNvcmR8dm9pZH0gW0V4dHJhPXZvaWRdXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuVzNDQ2FwYWJpbGl0aWVzPEMsIEV4dHJhPn0gVzNDQ2FwYWJpbGl0aWVzXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBLE1BQU1BLG9CQUFvQixHQUFHLFNBQTdCOztBQUNBLE1BQU1DLGVBQWUsR0FBRyxTQUF4Qjs7QUFDQSxNQUFNQyx3QkFBd0IsR0FBSSxHQUFFRixvQkFBcUIsR0FBRUMsZUFBZ0IsRUFBM0U7OztBQVdBLFNBQVNFLFNBQVQsQ0FBbUJDLE9BQU8sR0FBRyxFQUE3QixFQUFpQ0MsU0FBUyxHQUFHLEVBQTdDLEVBQWlEO0VBQy9DLElBQUlDLE1BQU0sR0FBK0UsRUFDdkYsR0FBR0Y7RUFEb0YsQ0FBekY7O0VBSUEsS0FBSyxJQUFJLENBQUNHLElBQUQsRUFBT0MsS0FBUCxDQUFULElBQXdFQyxlQUFBLENBQUVDLE9BQUYsQ0FBVUwsU0FBVixDQUF4RSxFQUErRjtJQUU3RixJQUFJLENBQUNJLGVBQUEsQ0FBRUUsV0FBRixDQUFjUCxPQUFPLENBQUNHLElBQUQsQ0FBckIsQ0FBTCxFQUFtQztNQUNqQyxNQUFNLElBQUlLLGNBQUEsQ0FBT0Msb0JBQVgsQ0FDSCxhQUFZTixJQUFLLHVDQUFzQ08sSUFBSSxDQUFDQyxTQUFMLENBQ3REWCxPQURzRCxDQUV0RCxvQkFBbUJVLElBQUksQ0FBQ0MsU0FBTCxDQUFlVixTQUFmLENBQTBCLFVBSDNDLENBQU47SUFLRDs7SUFDREMsTUFBTSxDQUFxQ0MsSUFBckMsQ0FBTixHQUFvREMsS0FBcEQ7RUFD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
338
+ exports.promoteAppiumOptions = promoteAppiumOptions;
339
+ /**
340
+ * @typedef {import('@appium/types').Constraints} Constraints
341
+ * @typedef {import('@appium/types').Constraint} Constraint
342
+ * @typedef {import('@appium/types').StringRecord} StringRecord
343
+ * @typedef {import('@appium/types').BaseDriverCapConstraints} BaseDriverCapConstraints
344
+ */
345
+ /**
346
+ * @typedef ValidateCapsOpts
347
+ * @property {boolean} [skipPresenceConstraint] - if true, skip the presence constraint
348
+ */
349
+ /**
350
+ * @template {Constraints} [C=BaseDriverCapConstraints]
351
+ * @template {StringRecord|void} [Extra=void]
352
+ * @typedef {import('@appium/types').NSCapabilities<C, Extra>} NSCapabilities
353
+ */
354
+ /**
355
+ * @template {Constraints} [C=BaseDriverCapConstraints]
356
+ * @template {StringRecord|void} [Extra=void]
357
+ * @typedef {import('@appium/types').Capabilities<C, Extra>} Capabilities
358
+ */
359
+ /**
360
+ * @template {Constraints} [C=BaseDriverCapConstraints]
361
+ * @template {StringRecord|void} [Extra=void]
362
+ * @typedef {import('@appium/types').W3CCapabilities<C, Extra>} W3CCapabilities
363
+ */
364
+ /**
365
+ * @template T,U
366
+ * @typedef {import('type-fest').Merge<T,U>} Merge
367
+ */
368
+ /**
369
+ * @template T
370
+ * @typedef {import('type-fest').StringKeyOf<T>} StringKeyOf
371
+ */
372
+ //# sourceMappingURL=capabilities.js.map