UNPKG

33.2 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
5Object.defineProperty(exports, "__esModule", {
6 value: true
7});
8exports.inspectObject = inspectObject;
9exports.parseCapsForInnerDriver = parseCapsForInnerDriver;
10exports.insertAppiumPrefixes = insertAppiumPrefixes;
11exports.getPackageVersion = getPackageVersion;
12exports.pullSettings = pullSettings;
13exports.rootDir = void 0;
14
15require("source-map-support/register");
16
17var _lodash = _interopRequireDefault(require("lodash"));
18
19var _logger = _interopRequireDefault(require("./logger"));
20
21var _appiumBaseDriver = require("appium-base-driver");
22
23var _findRoot = _interopRequireDefault(require("find-root"));
24
25const W3C_APPIUM_PREFIX = 'appium';
26
27function inspectObject(args) {
28 function getValueArray(obj, indent = ' ') {
29 if (!_lodash.default.isObject(obj)) {
30 return [obj];
31 }
32
33 let strArr = ['{'];
34
35 for (let [arg, value] of _lodash.default.toPairs(obj)) {
36 if (!_lodash.default.isObject(value)) {
37 strArr.push(`${indent} ${arg}: ${value}`);
38 } else {
39 value = getValueArray(value, `${indent} `);
40 strArr.push(`${indent} ${arg}: ${value.shift()}`);
41 strArr.push(...value);
42 }
43 }
44
45 strArr.push(`${indent}}`);
46 return strArr;
47 }
48
49 for (let [arg, value] of _lodash.default.toPairs(args)) {
50 value = getValueArray(value);
51
52 _logger.default.info(` ${arg}: ${value.shift()}`);
53
54 for (let val of value) {
55 _logger.default.info(val);
56 }
57 }
58}
59
60function parseCapsForInnerDriver(jsonwpCapabilities, w3cCapabilities, constraints = {}, defaultCapabilities = {}) {
61 const hasW3CCaps = _lodash.default.isPlainObject(w3cCapabilities) && (_lodash.default.has(w3cCapabilities, 'alwaysMatch') || _lodash.default.has(w3cCapabilities, 'firstMatch'));
62
63 const hasJSONWPCaps = _lodash.default.isPlainObject(jsonwpCapabilities);
64
65 let protocol = null;
66 let desiredCaps = {};
67 let processedW3CCapabilities = null;
68 let processedJsonwpCapabilities = null;
69
70 if (!hasJSONWPCaps && !hasW3CCaps) {
71 return {
72 protocol: _appiumBaseDriver.PROTOCOLS.W3C,
73 error: new Error('Either JSONWP or W3C capabilities should be provided')
74 };
75 }
76
77 const {
78 W3C,
79 MJSONWP
80 } = _appiumBaseDriver.PROTOCOLS;
81 jsonwpCapabilities = _lodash.default.cloneDeep(jsonwpCapabilities);
82 w3cCapabilities = _lodash.default.cloneDeep(w3cCapabilities);
83 defaultCapabilities = _lodash.default.cloneDeep(defaultCapabilities);
84
85 if (!_lodash.default.isEmpty(defaultCapabilities)) {
86 if (hasW3CCaps) {
87 for (const [defaultCapKey, defaultCapValue] of _lodash.default.toPairs(defaultCapabilities)) {
88 let isCapAlreadySet = false;
89
90 for (const firstMatchEntry of w3cCapabilities.firstMatch || []) {
91 if (_lodash.default.isPlainObject(firstMatchEntry) && _lodash.default.has(removeW3CPrefixes(firstMatchEntry), removeW3CPrefix(defaultCapKey))) {
92 isCapAlreadySet = true;
93 break;
94 }
95 }
96
97 isCapAlreadySet = isCapAlreadySet || _lodash.default.isPlainObject(w3cCapabilities.alwaysMatch) && _lodash.default.has(removeW3CPrefixes(w3cCapabilities.alwaysMatch), removeW3CPrefix(defaultCapKey));
98
99 if (isCapAlreadySet) {
100 continue;
101 }
102
103 if (_lodash.default.isEmpty(w3cCapabilities.firstMatch)) {
104 w3cCapabilities.firstMatch = [{
105 [defaultCapKey]: defaultCapValue
106 }];
107 } else {
108 w3cCapabilities.firstMatch[0][defaultCapKey] = defaultCapValue;
109 }
110 }
111 }
112
113 if (hasJSONWPCaps) {
114 jsonwpCapabilities = Object.assign({}, removeW3CPrefixes(defaultCapabilities), jsonwpCapabilities);
115 }
116 }
117
118 if (hasJSONWPCaps) {
119 protocol = MJSONWP;
120 desiredCaps = jsonwpCapabilities;
121 processedJsonwpCapabilities = removeW3CPrefixes({ ...desiredCaps
122 });
123 }
124
125 if (hasW3CCaps) {
126 protocol = W3C;
127 let isFixingNeededForW3cCaps = false;
128
129 try {
130 desiredCaps = (0, _appiumBaseDriver.processCapabilities)(w3cCapabilities, constraints, true);
131 } catch (error) {
132 if (!hasJSONWPCaps) {
133 return {
134 desiredCaps,
135 processedJsonwpCapabilities,
136 processedW3CCapabilities,
137 protocol,
138 error
139 };
140 }
141
142 _logger.default.info(`Could not parse W3C capabilities: ${error.message}`);
143
144 isFixingNeededForW3cCaps = true;
145 }
146
147 if (hasJSONWPCaps && !isFixingNeededForW3cCaps) {
148 const differingKeys = _lodash.default.difference(_lodash.default.keys(processedJsonwpCapabilities), _lodash.default.keys(removeW3CPrefixes(desiredCaps)));
149
150 if (!_lodash.default.isEmpty(differingKeys)) {
151 _logger.default.info(`The following capabilities were provided in the JSONWP desired capabilities that are missing ` + `in W3C capabilities: ${JSON.stringify(differingKeys)}`);
152
153 isFixingNeededForW3cCaps = true;
154 }
155 }
156
157 if (isFixingNeededForW3cCaps && hasJSONWPCaps) {
158 _logger.default.info('Trying to fix W3C capabilities by merging them with JSONWP caps');
159
160 w3cCapabilities = fixW3cCapabilities(w3cCapabilities, jsonwpCapabilities);
161
162 try {
163 desiredCaps = (0, _appiumBaseDriver.processCapabilities)(w3cCapabilities, constraints, true);
164 } catch (error) {
165 _logger.default.warn(`Could not parse fixed W3C capabilities: ${error.message}. Falling back to JSONWP protocol`);
166
167 return {
168 desiredCaps: processedJsonwpCapabilities,
169 processedJsonwpCapabilities,
170 processedW3CCapabilities: null,
171 protocol: MJSONWP
172 };
173 }
174 }
175
176 processedW3CCapabilities = {
177 alwaysMatch: { ...insertAppiumPrefixes(desiredCaps)
178 },
179 firstMatch: [{}]
180 };
181 }
182
183 return {
184 desiredCaps,
185 processedJsonwpCapabilities,
186 processedW3CCapabilities,
187 protocol
188 };
189}
190
191function fixW3cCapabilities(w3cCaps, jsonwpCaps) {
192 const result = {
193 firstMatch: w3cCaps.firstMatch || [],
194 alwaysMatch: w3cCaps.alwaysMatch || {}
195 };
196
197 const keysToInsert = _lodash.default.keys(jsonwpCaps);
198
199 const removeMatchingKeys = match => {
200 _lodash.default.pull(keysToInsert, match);
201
202 const colonIndex = match.indexOf(':');
203
204 if (colonIndex >= 0 && match.length > colonIndex) {
205 _lodash.default.pull(keysToInsert, match.substring(colonIndex + 1));
206 }
207
208 if (keysToInsert.includes(`${W3C_APPIUM_PREFIX}:${match}`)) {
209 _lodash.default.pull(keysToInsert, `${W3C_APPIUM_PREFIX}:${match}`);
210 }
211 };
212
213 for (const firstMatchEntry of result.firstMatch) {
214 for (const pair of _lodash.default.toPairs(firstMatchEntry)) {
215 removeMatchingKeys(pair[0]);
216 }
217 }
218
219 for (const pair of _lodash.default.toPairs(result.alwaysMatch)) {
220 removeMatchingKeys(pair[0]);
221 }
222
223 for (const key of keysToInsert) {
224 result.alwaysMatch[key] = jsonwpCaps[key];
225 }
226
227 return result;
228}
229
230function insertAppiumPrefixes(caps) {
231 const STANDARD_CAPS = ['browserName', 'browserVersion', 'platformName', 'acceptInsecureCerts', 'pageLoadStrategy', 'proxy', 'setWindowRect', 'timeouts', 'unhandledPromptBehavior'];
232 let prefixedCaps = {};
233
234 for (let [name, value] of _lodash.default.toPairs(caps)) {
235 if (STANDARD_CAPS.includes(name) || name.includes(':')) {
236 prefixedCaps[name] = value;
237 } else {
238 prefixedCaps[`${W3C_APPIUM_PREFIX}:${name}`] = value;
239 }
240 }
241
242 return prefixedCaps;
243}
244
245function removeW3CPrefixes(caps) {
246 if (!_lodash.default.isPlainObject(caps)) {
247 return caps;
248 }
249
250 const fixedCaps = {};
251
252 for (let [name, value] of _lodash.default.toPairs(caps)) {
253 fixedCaps[removeW3CPrefix(name)] = value;
254 }
255
256 return fixedCaps;
257}
258
259function removeW3CPrefix(key) {
260 const colonPos = key.indexOf(':');
261 return colonPos > 0 && key.length > colonPos ? key.substring(colonPos + 1) : key;
262}
263
264function getPackageVersion(pkgName) {
265 const pkgInfo = require(`${pkgName}/package.json`) || {};
266 return pkgInfo.version;
267}
268
269function pullSettings(caps) {
270 if (!_lodash.default.isPlainObject(caps) || _lodash.default.isEmpty(caps)) {
271 return {};
272 }
273
274 const result = {};
275
276 for (const [key, value] of _lodash.default.toPairs(caps)) {
277 const match = /\bsettings\[(\S+)\]$/.exec(key);
278
279 if (!match) {
280 continue;
281 }
282
283 result[match[1]] = value;
284 delete caps[key];
285 }
286
287 return result;
288}
289
290const rootDir = (0, _findRoot.default)(__dirname);
291exports.rootDir = rootDir;require('source-map-support').install();
292
293
294//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91dGlscy5qcyJdLCJuYW1lcyI6WyJXM0NfQVBQSVVNX1BSRUZJWCIsImluc3BlY3RPYmplY3QiLCJhcmdzIiwiZ2V0VmFsdWVBcnJheSIsIm9iaiIsImluZGVudCIsIl8iLCJpc09iamVjdCIsInN0ckFyciIsImFyZyIsInZhbHVlIiwidG9QYWlycyIsInB1c2giLCJzaGlmdCIsImxvZ2dlciIsImluZm8iLCJ2YWwiLCJwYXJzZUNhcHNGb3JJbm5lckRyaXZlciIsImpzb253cENhcGFiaWxpdGllcyIsInczY0NhcGFiaWxpdGllcyIsImNvbnN0cmFpbnRzIiwiZGVmYXVsdENhcGFiaWxpdGllcyIsImhhc1czQ0NhcHMiLCJpc1BsYWluT2JqZWN0IiwiaGFzIiwiaGFzSlNPTldQQ2FwcyIsInByb3RvY29sIiwiZGVzaXJlZENhcHMiLCJwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMiLCJwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMiLCJQUk9UT0NPTFMiLCJXM0MiLCJlcnJvciIsIkVycm9yIiwiTUpTT05XUCIsImNsb25lRGVlcCIsImlzRW1wdHkiLCJkZWZhdWx0Q2FwS2V5IiwiZGVmYXVsdENhcFZhbHVlIiwiaXNDYXBBbHJlYWR5U2V0IiwiZmlyc3RNYXRjaEVudHJ5IiwiZmlyc3RNYXRjaCIsInJlbW92ZVczQ1ByZWZpeGVzIiwicmVtb3ZlVzNDUHJlZml4IiwiYWx3YXlzTWF0Y2giLCJPYmplY3QiLCJhc3NpZ24iLCJpc0ZpeGluZ05lZWRlZEZvclczY0NhcHMiLCJtZXNzYWdlIiwiZGlmZmVyaW5nS2V5cyIsImRpZmZlcmVuY2UiLCJrZXlzIiwiSlNPTiIsInN0cmluZ2lmeSIsImZpeFczY0NhcGFiaWxpdGllcyIsIndhcm4iLCJpbnNlcnRBcHBpdW1QcmVmaXhlcyIsInczY0NhcHMiLCJqc29ud3BDYXBzIiwicmVzdWx0Iiwia2V5c1RvSW5zZXJ0IiwicmVtb3ZlTWF0Y2hpbmdLZXlzIiwibWF0Y2giLCJwdWxsIiwiY29sb25JbmRleCIsImluZGV4T2YiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJpbmNsdWRlcyIsInBhaXIiLCJrZXkiLCJjYXBzIiwiU1RBTkRBUkRfQ0FQUyIsInByZWZpeGVkQ2FwcyIsIm5hbWUiLCJmaXhlZENhcHMiLCJjb2xvblBvcyIsImdldFBhY2thZ2VWZXJzaW9uIiwicGtnTmFtZSIsInBrZ0luZm8iLCJyZXF1aXJlIiwidmVyc2lvbiIsInB1bGxTZXR0aW5ncyIsImV4ZWMiLCJyb290RGlyIiwiX19kaXJuYW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsaUJBQWlCLEdBQUcsUUFBMUI7O0FBRUEsU0FBU0MsYUFBVCxDQUF3QkMsSUFBeEIsRUFBOEI7QUFDNUIsV0FBU0MsYUFBVCxDQUF3QkMsR0FBeEIsRUFBNkJDLE1BQU0sR0FBRyxJQUF0QyxFQUE0QztBQUMxQyxRQUFJLENBQUNDLGdCQUFFQyxRQUFGLENBQVdILEdBQVgsQ0FBTCxFQUFzQjtBQUNwQixhQUFPLENBQUNBLEdBQUQsQ0FBUDtBQUNEOztBQUVELFFBQUlJLE1BQU0sR0FBRyxDQUFDLEdBQUQsQ0FBYjs7QUFDQSxTQUFLLElBQUksQ0FBQ0MsR0FBRCxFQUFNQyxLQUFOLENBQVQsSUFBeUJKLGdCQUFFSyxPQUFGLENBQVVQLEdBQVYsQ0FBekIsRUFBeUM7QUFDdkMsVUFBSSxDQUFDRSxnQkFBRUMsUUFBRixDQUFXRyxLQUFYLENBQUwsRUFBd0I7QUFDdEJGLFFBQUFBLE1BQU0sQ0FBQ0ksSUFBUCxDQUFhLEdBQUVQLE1BQU8sS0FBSUksR0FBSSxLQUFJQyxLQUFNLEVBQXhDO0FBQ0QsT0FGRCxNQUVPO0FBQ0xBLFFBQUFBLEtBQUssR0FBR1AsYUFBYSxDQUFDTyxLQUFELEVBQVMsR0FBRUwsTUFBTyxJQUFsQixDQUFyQjtBQUNBRyxRQUFBQSxNQUFNLENBQUNJLElBQVAsQ0FBYSxHQUFFUCxNQUFPLEtBQUlJLEdBQUksS0FBSUMsS0FBSyxDQUFDRyxLQUFOLEVBQWMsRUFB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akUsZ0JBQUU4QixPQUFGLENBQVVtQyxJQUFWLENBQTlCLEVBQStDO0FBQzdDLFdBQU8sRUFBUDtBQUNEOztBQUVELFFBQU1aLE1BQU0sR0FBRyxFQUFmOztBQUNBLE9BQUssTUFBTSxDQUFDVyxHQUFELEVBQU01RCxLQUFOLENBQVgsSUFBMkJKLGdCQUFFSyxPQUFGLENBQVU0RCxJQUFWLENBQTNCLEVBQTRDO0FBQzFDLFVBQU1ULEtBQUssR0FBRyx1QkFBdUJxQixJQUF2QixDQUE0QmIsR0FBNUIsQ0FBZDs7QUFDQSxRQUFJLENBQUNSLEtBQUwsRUFBWTtBQUNWO0FBQ0Q7O0FBRURILElBQUFBLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLENBQUQsQ0FBTixDQUFOLEdBQW1CcEQsS0FBbkI7QUFDQSxXQUFPNkQsSUFBSSxDQUFDRCxHQUFELENBQVg7QUFDRDs7QUFDRCxTQUFPWCxNQUFQO0FBQ0Q7O0FBRUQsTUFBTXlCLE9BQU8sR0FBRyx1QkFBU0MsU0FBVCxDQUFoQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IHByb2Nlc3NDYXBhYmlsaXRpZXMsIFBST1RPQ09MUyB9IGZyb20gJ2FwcGl1bS1iYXNlLWRyaXZlcic7XG5pbXBvcnQgZmluZFJvb3QgZnJvbSAnZmluZC1yb290JztcblxuY29uc3QgVzNDX0FQUElVTV9QUkVGSVggPSAnYXBwaXVtJztcblxuZnVuY3Rpb24gaW5zcGVjdE9iamVjdCAoYXJncykge1xuICBmdW5jdGlvbiBnZXRWYWx1ZUFycmF5IChvYmosIGluZGVudCA9ICcgICcpIHtcbiAgICBpZiAoIV8uaXNPYmplY3Qob2JqKSkge1xuICAgICAgcmV0dXJuIFtvYmpdO1xuICAgIH1cblxuICAgIGxldCBzdHJBcnIgPSBbJ3snXTtcbiAgICBmb3IgKGxldCBbYXJnLCB2YWx1ZV0gb2YgXy50b1BhaXJzKG9iaikpIHtcbiAgICAgIGlmICghXy5pc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgc3RyQXJyLnB1c2goYCR7aW5kZW50fSAgJHthcmd9OiAke3ZhbHVlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBnZXRWYWx1ZUFycmF5KHZhbHVlLCBgJHtpbmRlbnR9ICBgKTtcbiAgICAgICAgc3RyQXJyLnB1c2goYCR7aW5kZW50fSAgJHthcmd9OiAke3ZhbHVlLnNoaWZ0KCl9YCk7XG4gICAgICAgIHN0ckFyci5wdXNoKC4uLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RyQXJyLnB1c2goYCR7aW5kZW50fX1gKTtcbiAgICByZXR1cm4gc3RyQXJyO1xuICB9XG4gIGZvciAobGV0IFthcmcsIHZhbHVlXSBvZiBfLnRvUGFpcnMoYXJncykpIHtcbiAgICB2YWx1ZSA9IGdldFZhbHVlQXJyYXkodmFsdWUpO1xuICAgIGxvZ2dlci5pbmZvKGAgICR7YXJnfTogJHt2YWx1ZS5zaGlmdCgpfWApO1xuICAgIGZvciAobGV0IHZhbCBvZiB2YWx1ZSkge1xuICAgICAgbG9nZ2VyLmluZm8odmFsKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUYWtlcyB0aGUgY2FwcyB0aGF0IHdlcmUgcHJvdmlkZWQgaW4gdGhlIHJlcXVlc3QgYW5kIHRyYW5zbGF0ZXMgdGhlbVxuICogaW50byBjYXBzIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGhlIGlubmVyIGRyaXZlcnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGpzb253cENhcGFiaWxpdGllc1xuICogQHBhcmFtIHtPYmplY3R9IHczY0NhcGFiaWxpdGllc1xuICogQHBhcmFtIHtPYmplY3R9IGNvbnN0cmFpbnRzXG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdENhcGFiaWxpdGllc1xuICovXG5mdW5jdGlvbiBwYXJzZUNhcHNGb3JJbm5lckRyaXZlciAoanNvbndwQ2FwYWJpbGl0aWVzLCB3M2NDYXBhYmlsaXRpZXMsIGNvbnN0cmFpbnRzID0ge30sIGRlZmF1bHRDYXBhYmlsaXRpZXMgPSB7fSkge1xuICAvLyBDaGVjayBpZiB0aGUgY2FsbGVyIHNlbnQgSlNPTldQIGNhcHMsIFczQyBjYXBzLCBvciBib3RoXG4gIGNvbnN0IGhhc1czQ0NhcHMgPSBfLmlzUGxhaW5PYmplY3QodzNjQ2FwYWJpbGl0aWVzKSAmJlxuICAgIChfLmhhcyh3M2NDYXBhYmlsaXRpZXMsICdhbHdheXNNYXRjaCcpIHx8IF8uaGFzKHczY0NhcGFiaWxpdGllcywgJ2ZpcnN0TWF0Y2gnKSk7XG4gIGNvbnN0IGhhc0pTT05XUENhcHMgPSBfLmlzUGxhaW5PYmplY3QoanNvbndwQ2FwYWJpbGl0aWVzKTtcbiAgbGV0IHByb3RvY29sID0gbnVsbDtcbiAgbGV0IGRlc2lyZWRDYXBzID0ge307XG4gIGxldCBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMgPSBudWxsO1xuICBsZXQgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzID0gbnVsbDtcblxuICBpZiAoIWhhc0pTT05XUENhcHMgJiYgIWhhc1czQ0NhcHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvdG9jb2w6IFBST1RPQ09MUy5XM0MsXG4gICAgICBlcnJvcjogbmV3IEVycm9yKCdFaXRoZXIgSlNPTldQIG9yIFczQyBjYXBhYmlsaXRpZXMgc2hvdWxkIGJlIHByb3ZpZGVkJyksXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHtXM0MsIE1KU09OV1B9ID0gUFJPVE9DT0xTO1xuXG4gIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBtdXRhdGUgdGhlIG9yaWdpbmFsIGFyZ3VtZW50c1xuICBqc29ud3BDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcChqc29ud3BDYXBhYmlsaXRpZXMpO1xuICB3M2NDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcCh3M2NDYXBhYmlsaXRpZXMpO1xuICBkZWZhdWx0Q2FwYWJpbGl0aWVzID0gXy5jbG9uZURlZXAoZGVmYXVsdENhcGFiaWxpdGllcyk7XG5cbiAgaWYgKCFfLmlzRW1wdHkoZGVmYXVsdENhcGFiaWxpdGllcykpIHtcbiAgICBpZiAoaGFzVzNDQ2Fwcykge1xuICAgICAgZm9yIChjb25zdCBbZGVmYXVsdENhcEtleSwgZGVmYXVsdENhcFZhbHVlXSBvZiBfLnRvUGFpcnMoZGVmYXVsdENhcGFiaWxpdGllcykpIHtcbiAgICAgICAgbGV0IGlzQ2FwQWxyZWFkeVNldCA9IGZhbHNlO1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUga2V5IGlzIGFscmVhZHkgcHJlc2VudCBpbiBmaXJzdE1hdGNoIGVudHJpZXNcbiAgICAgICAgZm9yIChjb25zdCBmaXJzdE1hdGNoRW50cnkgb2YgKHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoIHx8IFtdKSkge1xuICAgICAgICAgIGlmIChfLmlzUGxhaW5PYmplY3QoZmlyc3RNYXRjaEVudHJ5KVxuICAgICAgICAgICAgICAmJiBfLmhhcyhyZW1vdmVXM0NQcmVmaXhlcyhmaXJzdE1hdGNoRW50cnkpLCByZW1vdmVXM0NQcmVmaXgoZGVmYXVsdENhcEtleSkpKSB7XG4gICAgICAgICAgICBpc0NhcEFscmVhZHlTZXQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBrZXkgaXMgYWxyZWFkeSBwcmVzZW50IGluIGFsd2F5c01hdGNoIGVudHJpZXNcbiAgICAgICAgaXNDYXBBbHJlYWR5U2V0ID0gaXNDYXBBbHJlYWR5U2V0IHx8IChfLmlzUGxhaW5PYmplY3QodzNjQ2FwYWJpbGl0aWVzLmFsd2F5c01hdGNoKVxuICAgICAgICAgICYmIF8uaGFzKHJlbW92ZVczQ1ByZWZpeGVzKHczY0NhcGFiaWxpdGllcy5hbHdheXNNYXRjaCksIHJlbW92ZVczQ1ByZWZpeChkZWZhdWx0Q2FwS2V5KSkpO1xuICAgICAgICBpZiAoaXNDYXBBbHJlYWR5U2V0KSB7XG4gICAgICAgICAgLy8gU2tpcCBpZiB0aGUga2V5IGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgcHJvdmlkZWQgY2Fwc1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBhZGQgdGhlIGRlZmF1bHQgY2FwYWJpbGl0eSBpZiBpdCBpcyBub3Qgb3ZlcnJpZGRlblxuICAgICAgICBpZiAoXy5pc0VtcHR5KHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoKSkge1xuICAgICAgICAgIHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoID0gW3tbZGVmYXVsdENhcEtleV06IGRlZmF1bHRDYXBWYWx1ZX1dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoWzBdW2RlZmF1bHRDYXBLZXldID0gZGVmYXVsdENhcFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYXNKU09OV1BDYXBzKSB7XG4gICAgICBqc29ud3BDYXBhYmlsaXRpZXMgPSBPYmplY3QuYXNzaWduKHt9LCByZW1vdmVXM0NQcmVmaXhlcyhkZWZhdWx0Q2FwYWJpbGl0aWVzKSwganNvbndwQ2FwYWJpbGl0aWVzKTtcbiAgICB9XG4gIH1cblxuICAvLyBHZXQgTUpTT05XUCBjYXBzXG4gIGlmIChoYXNKU09OV1BDYXBzKSB7XG4gICAgcHJvdG9jb2wgPSBNSlNPTldQO1xuICAgIGRlc2lyZWRDYXBzID0ganNvbndwQ2FwYWJpbGl0aWVzO1xuICAgIHByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcyA9IHJlbW92ZVczQ1ByZWZpeGVzKHsuLi5kZXNpcmVkQ2Fwc30pO1xuICB9XG5cbiAgLy8gR2V0IFczQyBjYXBzXG4gIGlmIChoYXNXM0NDYXBzKSB7XG4gICAgcHJvdG9jb2wgPSBXM0M7XG4gICAgLy8gQ2FsbCB0aGUgcHJvY2VzcyBjYXBhYmlsaXRpZXMgYWxnb3JpdGhtIHRvIGZpbmQgbWF0Y2hpbmcgY2FwcyBvbiB0aGUgVzNDXG4gICAgLy8gKHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2psaXBwcy9zaW1wbGUtd2Qtc3BlYyNwcm9jZXNzaW5nLWNhcGFiaWxpdGllcylcbiAgICBsZXQgaXNGaXhpbmdOZWVkZWRGb3JXM2NDYXBzID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGRlc2lyZWRDYXBzID0gcHJvY2Vzc0NhcGFiaWxpdGllcyh3M2NDYXBhYmlsaXRpZXMsIGNvbnN0cmFpbnRzLCB0cnVlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFoYXNKU09OV1BDYXBzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGVzaXJlZENhcHMsXG4gICAgICAgICAgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgIHByb2Nlc3NlZFczQ0NhcGFiaWxpdGllcyxcbiAgICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5pbmZvKGBDb3VsZCBub3QgcGFyc2UgVzNDIGNhcGFiaWxpdGllczogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgaXNGaXhpbmdOZWVkZWRGb3JXM2NDYXBzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaGFzSlNPTldQQ2FwcyAmJiAhaXNGaXhpbmdOZWVkZWRGb3JXM2NDYXBzKSB7XG4gICAgICBjb25zdCBkaWZmZXJpbmdLZXlzID0gXy5kaWZmZXJlbmNlKF8ua2V5cyhwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMpLCBfLmtleXMocmVtb3ZlVzNDUHJlZml4ZXMoZGVzaXJlZENhcHMpKSk7XG4gICAgICBpZiAoIV8uaXNFbXB0eShkaWZmZXJpbmdLZXlzKSkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgVGhlIGZvbGxvd2luZyBjYXBhYmlsaXRpZXMgd2VyZSBwcm92aWRlZCBpbiB0aGUgSlNPTldQIGRlc2lyZWQgY2FwYWJpbGl0aWVzIHRoYXQgYXJlIG1pc3NpbmcgYCArXG4gICAgICAgICAgYGluIFczQyBjYXBhYmlsaXRpZXM6ICR7SlNPTi5zdHJpbmdpZnkoZGlmZmVyaW5nS2V5cyl9YCk7XG4gICAgICAgIGlzRml4aW5nTmVlZGVkRm9yVzNjQ2FwcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzRml4aW5nTmVlZGVkRm9yVzNjQ2FwcyAmJiBoYXNKU09OV1BDYXBzKSB7XG4gICAgICBsb2dnZXIuaW5mbygnVHJ5aW5nIHRvIGZpeCBXM0MgY2FwYWJpbGl0aWVzIGJ5IG1lcmdpbmcgdGhlbSB3aXRoIEpTT05XUCBjYXBzJyk7XG4gICAgICB3M2NDYXBhYmlsaXRpZXMgPSBmaXhXM2NDYXBhYmlsaXRpZXModzNjQ2FwYWJpbGl0aWVzLCBqc29ud3BDYXBhYmlsaXRpZXMpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZGVzaXJlZENhcHMgPSBwcm9jZXNzQ2FwYWJpbGl0aWVzKHczY0NhcGFiaWxpdGllcywgY29uc3RyYWludHMsIHRydWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYENvdWxkIG5vdCBwYXJzZSBmaXhlZCBXM0MgY2FwYWJpbGl0aWVzOiAke2Vycm9yLm1lc3NhZ2V9LiBGYWxsaW5nIGJhY2sgdG8gSlNPTldQIHByb3RvY29sYCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGVzaXJlZENhcHM6IHByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcyxcbiAgICAgICAgICBwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzOiBudWxsLFxuICAgICAgICAgIHByb3RvY29sOiBNSlNPTldQLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIG5ldyB3M2MgY2FwYWJpbGl0aWVzIHBheWxvYWQgdGhhdCBjb250YWlucyBvbmx5IHRoZSBtYXRjaGluZyBjYXBzIGluIGBhbHdheXNNYXRjaGBcbiAgICBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMgPSB7XG4gICAgICBhbHdheXNNYXRjaDogey4uLmluc2VydEFwcGl1bVByZWZpeGVzKGRlc2lyZWRDYXBzKX0sXG4gICAgICBmaXJzdE1hdGNoOiBbe31dLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge2Rlc2lyZWRDYXBzLCBwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMsIHByb2Nlc3NlZFczQ0NhcGFiaWxpdGllcywgcHJvdG9jb2x9O1xufVxuXG4vKipcbiAqIFRoaXMgaGVscGVyIG1ldGhvZCB0cmllcyB0byBmaXggY29ycnVwdGVkIFczQyBjYXBhYmlsaXRpZXMgYnlcbiAqIG1lcmdpbmcgdGhlbSB0byBleGlzdGluZyBKU09OV1AgY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB3M2NDYXBzIFczQyBjYXBhYmlsaXRpZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBqc29ud3BDYXBzIEpTT05XUCBjYXBhYmlsaXRpZXNcbiAqIEByZXR1cm5zIHtPYmplY3R9IEZpeGVkIFczQyBjYXBhYmlsaXRpZXNcbiAqL1xuZnVuY3Rpb24gZml4VzNjQ2FwYWJpbGl0aWVzICh3M2NDYXBzLCBqc29ud3BDYXBzKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBmaXJzdE1hdGNoOiB3M2NDYXBzLmZpcnN0TWF0Y2ggfHwgW10sXG4gICAgYWx3YXlzTWF0Y2g6IHczY0NhcHMuYWx3YXlzTWF0Y2ggfHwge30sXG4gIH07XG4gIGNvbnN0IGtleXNUb0luc2VydCA9IF8ua2V5cyhqc29ud3BDYXBzKTtcbiAgY29uc3QgcmVtb3ZlTWF0Y2hpbmdLZXlzID0gKG1hdGNoKSA9PiB7XG4gICAgXy5wdWxsKGtleXNUb0luc2VydCwgbWF0Y2gpO1xuICAgIGNvbnN0IGNvbG9uSW5kZXggPSBtYXRjaC5pbmRleE9mKCc6Jyk7XG4gICAgaWYgKGNvbG9uSW5kZXggPj0gMCAmJiBtYXRjaC5sZW5ndGggPiBjb2xvbkluZGV4KSB7XG4gICAgICBfLnB1bGwoa2V5c1RvSW5zZXJ0LCBtYXRjaC5zdWJzdHJpbmcoY29sb25JbmRleCArIDEpKTtcbiAgICB9XG4gICAgaWYgKGtleXNUb0luc2VydC5pbmNsdWRlcyhgJHtXM0NfQVBQSVVNX1BSRUZJWH06JHttYXRjaH1gKSkge1xuICAgICAgXy5wdWxsKGtleXNUb0luc2VydCwgYCR7VzNDX0FQUElVTV9QUkVGSVh9OiR7bWF0Y2h9YCk7XG4gICAgfVxuICB9O1xuXG4gIGZvciAoY29uc3QgZmlyc3RNYXRjaEVudHJ5IG9mIHJlc3VsdC5maXJzdE1hdGNoKSB7XG4gICAgZm9yIChjb25zdCBwYWlyIG9mIF8udG9QYWlycyhmaXJzdE1hdGNoRW50cnkpKSB7XG4gICAgICByZW1vdmVNYXRjaGluZ0tleXMocGFpclswXSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBwYWlyIG9mIF8udG9QYWlycyhyZXN1bHQuYWx3YXlzTWF0Y2gpKSB7XG4gICAgcmVtb3ZlTWF0Y2hpbmdLZXlzKHBhaXJbMF0pO1xuICB9XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5c1RvSW5zZXJ0KSB7XG4gICAgcmVzdWx0LmFsd2F5c01hdGNoW2tleV0gPSBqc29ud3BDYXBzW2tleV07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUYWtlcyBhIGNhcGFiaWxpdGllcyBvYmplY3RzIGFuZCBwcmVmaXhlcyBjYXBhYmlsaXRpZXMgd2l0aCBgYXBwaXVtOmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBjYXBzIERlc2lyZWQgY2FwYWJpbGl0aWVzIG9iamVjdFxuICovXG5mdW5jdGlvbiBpbnNlcnRBcHBpdW1QcmVmaXhlcyAoY2Fwcykge1xuICAvLyBTdGFuZGFyZCwgbm9uLXByZWZpeGVkIGNhcGFiaWxpdGllcyAoc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJkcml2ZXIvI2Rmbi10YWJsZS1vZi1zdGFuZGFyZC1jYXBhYmlsaXRpZXMpXG4gIGNvbnN0IFNUQU5EQVJEX0NBUFMgPSBbXG4gICAgJ2Jyb3dzZXJOYW1lJyxcbiAgICAnYnJvd3NlclZlcnNpb24nLFxuICAgICdwbGF0Zm9ybU5hbWUnLFxuICAgICdhY2NlcHRJbnNlY3VyZUNlcnRzJyxcbiAgICAncGFnZUxvYWRTdHJhdGVneScsXG4gICAgJ3Byb3h5JyxcbiAgICAnc2V0V2luZG93UmVjdCcsXG4gICAgJ3RpbWVvdXRzJyxcbiAgICAndW5oYW5kbGVkUHJvbXB0QmVoYXZpb3InXG4gIF07XG5cbiAgbGV0IHByZWZpeGVkQ2FwcyA9IHt9O1xuICBmb3IgKGxldCBbbmFtZSwgdmFsdWVdIG9mIF8udG9QYWlycyhjYXBzKSkge1xuICAgIGlmIChTVEFOREFSRF9DQVBTLmluY2x1ZGVzKG5hbWUpIHx8IG5hbWUuaW5jbHVkZXMoJzonKSkge1xuICAgICAgcHJlZml4ZWRDYXBzW25hbWVdID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpeGVkQ2Fwc1tgJHtXM0NfQVBQSVVNX1BSRUZJWH06JHtuYW1lfWBdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBwcmVmaXhlZENhcHM7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVczQ1ByZWZpeGVzIChjYXBzKSB7XG4gIGlmICghXy5pc1BsYWluT2JqZWN0KGNhcHMpKSB7XG4gICAgcmV0dXJuIGNhcHM7XG4gIH1cblxuICBjb25zdCBmaXhlZENhcHMgPSB7fTtcbiAgZm9yIChsZXQgW25hbWUsIHZhbHVlXSBvZiBfLnRvUGFpcnMoY2FwcykpIHtcbiAgICBmaXhlZENhcHNbcmVtb3ZlVzNDUHJlZml4KG5hbWUpXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBmaXhlZENhcHM7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVczQ1ByZWZpeCAoa2V5KSB7XG4gIGNvbnN0IGNvbG9uUG9zID0ga2V5LmluZGV4T2YoJzonKTtcbiAgcmV0dXJuIGNvbG9uUG9zID4gMCAmJiBrZXkubGVuZ3RoID4gY29sb25Qb3MgPyBrZXkuc3Vic3RyaW5nKGNvbG9uUG9zICsgMSkgOiBrZXk7XG59XG5cbmZ1bmN0aW9uIGdldFBhY2thZ2VWZXJzaW9uIChwa2dOYW1lKSB7XG4gIGNvbnN0IHBrZ0luZm8gPSByZXF1aXJlKGAke3BrZ05hbWV9L3BhY2thZ2UuanNvbmApIHx8IHt9O1xuICByZXR1cm4gcGtnSW5mby52ZXJzaW9uO1xufVxuXG4vKipcbiAqIFB1bGxzIHRoZSBpbml0aWFsIHZhbHVlcyBvZiBBcHBpdW0gc2V0dGluZ3MgZnJvbSB0aGUgZ2l2ZW4gY2FwYWJpbGl0aWVzIGFyZ3VtZW50LlxuICogRWFjaCBzZXR0aW5nIGl0ZW0gbXVzdCBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxuICogYHNldHRpbmdbc2V0dGluZ19uYW1lXTogc2V0dGluZ192YWx1ZWBcbiAqIFRoZSBjYXBhYmlsaXRpZXMgYXJndW1lbnQgaXRzZWxmIGdldHMgbXV0YXRlZCwgc28gaXQgZG9lcyBub3QgY29udGFpbiBwYXJzZWRcbiAqIHNldHRpbmdzIGFueW1vcmUgdG8gYXZvaWQgZnVydGhlciBwYXJzaW5nIGlzc3Vlcy5cbiAqIENoZWNrXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9ibG9iL21hc3Rlci9kb2NzL2VuL2FkdmFuY2VkLWNvbmNlcHRzL3NldHRpbmdzLm1kXG4gKiBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBhdmFpbGFibGUgc2V0dGluZ3MuXG4gKlxuICogQHBhcmFtIHs/T2JqZWN0fSBjYXBzIC0gQ2FwYWJpbGl0aWVzIGRpY3Rpb25hcnkuIEl0IGlzIG11dGF0ZWQgaWZcbiAqIG9uZSBvciBtb3JlIHNldHRpbmdzIGhhdmUgYmVlbiBwdWxsZWQgZnJvbSBpdFxuICogQHJldHVybnMge09iamVjdH0gLSBBbiBlbXB0eSBkaWN0aW9uYXJ5IGlmIHRoZSBnaXZlbiBjYXBzIGNvbnRhaW5zIG5vXG4gKiBzZXR0aW5nIGl0ZW1zIG9yIGEgZGljdGlvbmFyeSBjb250YWluaW5nIHBhcnNlZCBBcHBpdW0gc2V0dGluZyBuYW1lcyBhbG9uZyB3aXRoXG4gKiB0aGVpciB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIHB1bGxTZXR0aW5ncyAoY2Fwcykge1xuICBpZiAoIV8uaXNQbGFpbk9iamVjdChjYXBzKSB8fCBfLmlzRW1wdHkoY2FwcykpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgXy50b1BhaXJzKGNhcHMpKSB7XG4gICAgY29uc3QgbWF0Y2ggPSAvXFxic2V0dGluZ3NcXFsoXFxTKylcXF0kLy5leGVjKGtleSk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmVzdWx0W21hdGNoWzFdXSA9IHZhbHVlO1xuICAgIGRlbGV0ZSBjYXBzW2tleV07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3Qgcm9vdERpciA9IGZpbmRSb290KF9fZGlybmFtZSk7XG5cbmV4cG9ydCB7XG4gIGluc3BlY3RPYmplY3QsIHBhcnNlQ2Fwc0ZvcklubmVyRHJpdmVyLCBpbnNlcnRBcHBpdW1QcmVmaXhlcywgcm9vdERpcixcbiAgZ2V0UGFja2FnZVZlcnNpb24sIHB1bGxTZXR0aW5ncyxcbn07XG4iXSwiZmlsZSI6ImxpYi91dGlscy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9