appium-uiautomator2-driver 1.70.1 → 1.74.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.
@@ -13,7 +13,6 @@ var _lodash = require("lodash");
13
13
 
14
14
  var _appiumBaseDriver = require("appium-base-driver");
15
15
 
16
- const CssConverter = {};
17
16
  const parser = new _cssSelectorParser.CssSelectorParser();
18
17
  parser.registerSelectorPseudos('has');
19
18
  parser.registerNestingOperators('>', '+', '~');
@@ -69,165 +68,173 @@ function getWordMatcherRegex(word) {
69
68
  return `\\b(\\w*${(0, _lodash.escapeRegExp)(word)}\\w*)\\b`;
70
69
  }
71
70
 
72
- function formatIdLocator(locator) {
73
- return ID_LOCATOR_PATTERN.test(locator) ? locator : `android:id/${locator}`;
74
- }
71
+ class CssConverter {
72
+ constructor(selector, pkg) {
73
+ this.selector = selector;
74
+ this.pkg = pkg;
75
+ }
75
76
 
76
- function parseAttr(cssAttr) {
77
- if (cssAttr.valueType && cssAttr.valueType !== 'string') {
78
- throw new Error(`'${cssAttr.name}=${cssAttr.value}' is an invalid attribute. ` + `Only 'string' and empty attribute types are supported. Found '${cssAttr.valueType}'`);
77
+ formatIdLocator(locator) {
78
+ return ID_LOCATOR_PATTERN.test(locator) ? locator : `${this.pkg || 'android'}:id/${locator}`;
79
79
  }
80
80
 
81
- const attrName = assertGetAttrName(cssAttr);
82
- const methodName = toSnakeCase(attrName);
81
+ parseAttr(cssAttr) {
82
+ if (cssAttr.valueType && cssAttr.valueType !== 'string') {
83
+ throw new Error(`'${cssAttr.name}=${cssAttr.value}' is an invalid attribute. ` + `Only 'string' and empty attribute types are supported. Found '${cssAttr.valueType}'`);
84
+ }
83
85
 
84
- if (!STR_ATTRS.includes(attrName) && !BOOLEAN_ATTRS.includes(attrName)) {
85
- throw new Error(`'${attrName}' is not supported. Supported attributes are ` + `'${[...STR_ATTRS, ...BOOLEAN_ATTRS].join(', ')}'`);
86
- }
86
+ const attrName = assertGetAttrName(cssAttr);
87
+ const methodName = toSnakeCase(attrName);
87
88
 
88
- if (BOOLEAN_ATTRS.includes(attrName)) {
89
- return `.${methodName}(${assertGetBool(cssAttr)})`;
90
- }
89
+ if (!STR_ATTRS.includes(attrName) && !BOOLEAN_ATTRS.includes(attrName)) {
90
+ throw new Error(`'${attrName}' is not supported. Supported attributes are ` + `'${[...STR_ATTRS, ...BOOLEAN_ATTRS].join(', ')}'`);
91
+ }
91
92
 
92
- let value = cssAttr.value || '';
93
+ if (BOOLEAN_ATTRS.includes(attrName)) {
94
+ return `.${methodName}(${assertGetBool(cssAttr)})`;
95
+ }
93
96
 
94
- if (attrName === RESOURCE_ID) {
95
- value = formatIdLocator(value);
96
- }
97
+ let value = cssAttr.value || '';
97
98
 
98
- if (value === '') {
99
- return `.${methodName}Matches("")`;
100
- }
99
+ if (attrName === RESOURCE_ID) {
100
+ value = this.formatIdLocator(value);
101
+ }
101
102
 
102
- switch (cssAttr.operator) {
103
- case '=':
104
- return `.${methodName}("${value}")`;
103
+ if (value === '') {
104
+ return `.${methodName}Matches("")`;
105
+ }
105
106
 
106
- case '*=':
107
- if (['description', 'text'].includes(attrName)) {
108
- return `.${methodName}Contains("${value}")`;
109
- }
107
+ switch (cssAttr.operator) {
108
+ case '=':
109
+ return `.${methodName}("${value}")`;
110
110
 
111
- return `.${methodName}Matches("${(0, _lodash.escapeRegExp)(value)}")`;
111
+ case '*=':
112
+ if (['description', 'text'].includes(attrName)) {
113
+ return `.${methodName}Contains("${value}")`;
114
+ }
112
115
 
113
- case '^=':
114
- if (['description', 'text'].includes(attrName)) {
115
- return `.${methodName}StartsWith("${value}")`;
116
- }
116
+ return `.${methodName}Matches("${(0, _lodash.escapeRegExp)(value)}")`;
117
117
 
118
- return `.${methodName}Matches("^${(0, _lodash.escapeRegExp)(value)}")`;
118
+ case '^=':
119
+ if (['description', 'text'].includes(attrName)) {
120
+ return `.${methodName}StartsWith("${value}")`;
121
+ }
119
122
 
120
- case '$=':
121
- return `.${methodName}Matches("${(0, _lodash.escapeRegExp)(value)}$")`;
123
+ return `.${methodName}Matches("^${(0, _lodash.escapeRegExp)(value)}")`;
122
124
 
123
- case '~=':
124
- return `.${methodName}Matches("${getWordMatcherRegex(value)}")`;
125
+ case '$=':
126
+ return `.${methodName}Matches("${(0, _lodash.escapeRegExp)(value)}$")`;
125
127
 
126
- default:
127
- throw new Error(`Unsupported CSS attribute operator '${cssAttr.operator}'. ` + ` '=', '*=', '^=', '$=' and '~=' are supported.`);
128
- }
129
- }
128
+ case '~=':
129
+ return `.${methodName}Matches("${getWordMatcherRegex(value)}")`;
130
130
 
131
- function parsePseudo(cssPseudo) {
132
- if (cssPseudo.valueType && cssPseudo.valueType !== 'string') {
133
- throw new Error(`'${cssPseudo.name}=${cssPseudo.value}'. ` + `Unsupported css pseudo class value type: '${cssPseudo.valueType}'. Only 'string' type or empty is supported.`);
131
+ default:
132
+ throw new Error(`Unsupported CSS attribute operator '${cssAttr.operator}'. ` + ` '=', '*=', '^=', '$=' and '~=' are supported.`);
133
+ }
134
134
  }
135
135
 
136
- const pseudoName = assertGetAttrName(cssPseudo);
136
+ parsePseudo(cssPseudo) {
137
+ if (cssPseudo.valueType && cssPseudo.valueType !== 'string') {
138
+ throw new Error(`'${cssPseudo.name}=${cssPseudo.value}'. ` + `Unsupported css pseudo class value type: '${cssPseudo.valueType}'. Only 'string' type or empty is supported.`);
139
+ }
137
140
 
138
- if (BOOLEAN_ATTRS.includes(pseudoName)) {
139
- return `.${toSnakeCase(pseudoName)}(${assertGetBool(cssPseudo)})`;
140
- }
141
+ const pseudoName = assertGetAttrName(cssPseudo);
141
142
 
142
- if (NUMERIC_ATTRS.includes(pseudoName)) {
143
- return `.${pseudoName}(${cssPseudo.value})`;
143
+ if (BOOLEAN_ATTRS.includes(pseudoName)) {
144
+ return `.${toSnakeCase(pseudoName)}(${assertGetBool(cssPseudo)})`;
145
+ }
146
+
147
+ if (NUMERIC_ATTRS.includes(pseudoName)) {
148
+ return `.${pseudoName}(${cssPseudo.value})`;
149
+ }
144
150
  }
145
- }
146
151
 
147
- function parseCssRule(cssRule) {
148
- const {
149
- nestingOperator
150
- } = cssRule;
152
+ parseCssRule(cssRule) {
153
+ const {
154
+ nestingOperator
155
+ } = cssRule;
151
156
 
152
- if (nestingOperator && nestingOperator !== ' ') {
153
- throw new Error(`'${nestingOperator}' is not a supported combinator. ` + `Only child combinator (>) and descendant combinator are supported.`);
154
- }
157
+ if (nestingOperator && nestingOperator !== ' ') {
158
+ throw new Error(`'${nestingOperator}' is not a supported combinator. ` + `Only child combinator (>) and descendant combinator are supported.`);
159
+ }
155
160
 
156
- let uiAutomatorSelector = 'new UiSelector()';
161
+ let uiAutomatorSelector = 'new UiSelector()';
157
162
 
158
- if (cssRule.tagName && cssRule.tagName !== '*') {
159
- let androidClass = [cssRule.tagName];
163
+ if (cssRule.tagName && cssRule.tagName !== '*') {
164
+ let androidClass = [cssRule.tagName];
160
165
 
161
- if (cssRule.classNames) {
162
- for (const cssClassNames of cssRule.classNames) {
163
- androidClass.push(cssClassNames);
166
+ if (cssRule.classNames) {
167
+ for (const cssClassNames of cssRule.classNames) {
168
+ androidClass.push(cssClassNames);
169
+ }
170
+
171
+ uiAutomatorSelector += `.className("${androidClass.join('.')}")`;
172
+ } else {
173
+ uiAutomatorSelector += `.classNameMatches("${cssRule.tagName}")`;
164
174
  }
175
+ } else if (cssRule.classNames) {
176
+ uiAutomatorSelector += `.classNameMatches("${cssRule.classNames.join('\\.')}")`;
177
+ }
165
178
 
166
- uiAutomatorSelector += `.className("${androidClass.join('.')}")`;
167
- } else {
168
- uiAutomatorSelector += `.classNameMatches("${cssRule.tagName}")`;
179
+ if (cssRule.id) {
180
+ uiAutomatorSelector += `.resourceId("${this.formatIdLocator(cssRule.id)}")`;
169
181
  }
170
- } else if (cssRule.classNames) {
171
- uiAutomatorSelector += `.classNameMatches("${cssRule.classNames.join('\\.')}")`;
172
- }
173
182
 
174
- if (cssRule.id) {
175
- uiAutomatorSelector += `.resourceId("${formatIdLocator(cssRule.id)}")`;
176
- }
183
+ if (cssRule.attrs) {
184
+ for (const attr of cssRule.attrs) {
185
+ uiAutomatorSelector += this.parseAttr(attr);
186
+ }
187
+ }
177
188
 
178
- if (cssRule.attrs) {
179
- for (const attr of cssRule.attrs) {
180
- uiAutomatorSelector += parseAttr(attr);
189
+ if (cssRule.pseudos) {
190
+ for (const pseudo of cssRule.pseudos) {
191
+ uiAutomatorSelector += this.parsePseudo(pseudo);
192
+ }
181
193
  }
182
- }
183
194
 
184
- if (cssRule.pseudos) {
185
- for (const pseudo of cssRule.pseudos) {
186
- uiAutomatorSelector += parsePseudo(pseudo);
195
+ if (cssRule.rule) {
196
+ uiAutomatorSelector += `.childSelector(${this.parseCssRule(cssRule.rule)})`;
187
197
  }
188
- }
189
198
 
190
- if (cssRule.rule) {
191
- uiAutomatorSelector += `.childSelector(${parseCssRule(cssRule.rule)})`;
199
+ return uiAutomatorSelector;
192
200
  }
193
201
 
194
- return uiAutomatorSelector;
195
- }
196
-
197
- function parseCssObject(css) {
198
- switch (css.type) {
199
- case 'rule':
200
- return parseCssRule(css);
202
+ parseCssObject(css) {
203
+ switch (css.type) {
204
+ case 'rule':
205
+ return this.parseCssRule(css);
201
206
 
202
- case 'ruleSet':
203
- return parseCssObject(css.rule);
207
+ case 'ruleSet':
208
+ return this.parseCssObject(css.rule);
204
209
 
205
- case 'selectors':
206
- return css.selectors.map(selector => parseCssObject(selector)).join('; ');
210
+ case 'selectors':
211
+ return css.selectors.map(selector => this.parseCssObject(selector)).join('; ');
207
212
 
208
- default:
209
- throw new Error(`UiAutomator does not support '${css.type}' css. Only supports 'rule', 'ruleSet', 'selectors' `);
213
+ default:
214
+ throw new Error(`UiAutomator does not support '${css.type}' css. Only supports 'rule', 'ruleSet', 'selectors' `);
215
+ }
210
216
  }
211
- }
212
217
 
213
- CssConverter.toUiAutomatorSelector = function toUiAutomatorSelector(cssSelector) {
214
- let cssObj;
218
+ toUiAutomatorSelector() {
219
+ let cssObj;
215
220
 
216
- try {
217
- cssObj = parser.parse(cssSelector);
218
- } catch (e) {
219
- throw new _appiumBaseDriver.errors.InvalidSelectorError(`Invalid CSS selector '${cssSelector}'. Reason: '${e}'`);
220
- }
221
+ try {
222
+ cssObj = parser.parse(this.selector);
223
+ } catch (e) {
224
+ throw new _appiumBaseDriver.errors.InvalidSelectorError(`Invalid CSS selector '${this.selector}'. Reason: '${e}'`);
225
+ }
221
226
 
222
- try {
223
- return parseCssObject(cssObj);
224
- } catch (e) {
225
- throw new _appiumBaseDriver.errors.InvalidSelectorError(`Unsupported CSS selector '${cssSelector}'. Reason: '${e}'`);
227
+ try {
228
+ return this.parseCssObject(cssObj);
229
+ } catch (e) {
230
+ throw new _appiumBaseDriver.errors.InvalidSelectorError(`Unsupported CSS selector '${this.selector}'. Reason: '${e}'`);
231
+ }
226
232
  }
227
- };
233
+
234
+ }
228
235
 
229
236
  var _default = CssConverter;
230
237
  exports.default = _default;require('source-map-support').install();
231
238
 
232
239
 
233
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jc3MtY29udmVydGVyLmpzIl0sIm5hbWVzIjpbIkNzc0NvbnZlcnRlciIsInBhcnNlciIsIkNzc1NlbGVjdG9yUGFyc2VyIiwicmVnaXN0ZXJTZWxlY3RvclBzZXVkb3MiLCJyZWdpc3Rlck5lc3RpbmdPcGVyYXRvcnMiLCJyZWdpc3RlckF0dHJFcXVhbGl0eU1vZHMiLCJlbmFibGVTdWJzdGl0dXRlcyIsIlJFU09VUkNFX0lEIiwiSURfTE9DQVRPUl9QQVRURVJOIiwiQk9PTEVBTl9BVFRSUyIsIk5VTUVSSUNfQVRUUlMiLCJTVFJfQVRUUlMiLCJBTExfQVRUUlMiLCJBVFRSSUJVVEVfQUxJQVNFUyIsInRvU25ha2VDYXNlIiwic3RyIiwidG9rZW5zIiwic3BsaXQiLCJtYXAiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwidG9Mb3dlckNhc2UiLCJvdXQiLCJqb2luIiwiYXNzZXJ0R2V0Qm9vbCIsImNzcyIsInZhbCIsInZhbHVlIiwiaW5jbHVkZXMiLCJFcnJvciIsIm5hbWUiLCJhc3NlcnRHZXRBdHRyTmFtZSIsImF0dHJOYW1lIiwib2ZmaWNpYWxBdHRyIiwiYWxpYXNBdHRycyIsImdldFdvcmRNYXRjaGVyUmVnZXgiLCJ3b3JkIiwiZm9ybWF0SWRMb2NhdG9yIiwibG9jYXRvciIsInRlc3QiLCJwYXJzZUF0dHIiLCJjc3NBdHRyIiwidmFsdWVUeXBlIiwibWV0aG9kTmFtZSIsIm9wZXJhdG9yIiwicGFyc2VQc2V1ZG8iLCJjc3NQc2V1ZG8iLCJwc2V1ZG9OYW1lIiwicGFyc2VDc3NSdWxlIiwiY3NzUnVsZSIsIm5lc3RpbmdPcGVyYXRvciIsInVpQXV0b21hdG9yU2VsZWN0b3IiLCJ0YWdOYW1lIiwiYW5kcm9pZENsYXNzIiwiY2xhc3NOYW1lcyIsImNzc0NsYXNzTmFtZXMiLCJwdXNoIiwiaWQiLCJhdHRycyIsImF0dHIiLCJwc2V1ZG9zIiwicHNldWRvIiwicnVsZSIsInBhcnNlQ3NzT2JqZWN0IiwidHlwZSIsInNlbGVjdG9ycyIsInNlbGVjdG9yIiwidG9VaUF1dG9tYXRvclNlbGVjdG9yIiwiY3NzU2VsZWN0b3IiLCJjc3NPYmoiLCJwYXJzZSIsImUiLCJlcnJvcnMiLCJJbnZhbGlkU2VsZWN0b3JFcnJvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsWUFBWSxHQUFHLEVBQXJCO0FBRUEsTUFBTUMsTUFBTSxHQUFHLElBQUlDLG9DQUFKLEVBQWY7QUFDQUQsTUFBTSxDQUFDRSx1QkFBUCxDQUErQixLQUEvQjtBQUNBRixNQUFNLENBQUNHLHdCQUFQLENBQWdDLEdBQWhDLEVBQXFDLEdBQXJDLEVBQTBDLEdBQTFDO0FBQ0FILE1BQU0sQ0FBQ0ksd0JBQVAsQ0FBZ0MsR0FBaEMsRUFBcUMsR0FBckMsRUFBMEMsR0FBMUMsRUFBK0MsR0FBL0M7QUFDQUosTUFBTSxDQUFDSyxpQkFBUDtBQUVBLE1BQU1DLFdBQVcsR0FBRyxhQUFwQjtBQUNBLE1BQU1DLGtCQUFrQixHQUFHLHFDQUEzQjtBQUVBLE1BQU1DLGFBQWEsR0FBRyxDQUNwQixXQURvQixFQUNQLFNBRE8sRUFDSSxXQURKLEVBQ2lCLFNBRGpCLEVBQzRCLFdBRDVCLEVBRXBCLFNBRm9CLEVBRVQsZ0JBRlMsRUFFUyxZQUZULEVBRXVCLFVBRnZCLENBQXRCO0FBS0EsTUFBTUMsYUFBYSxHQUFHLENBQ3BCLE9BRG9CLEVBQ1gsVUFEVyxDQUF0QjtBQUlBLE1BQU1DLFNBQVMsR0FBRyxDQUNoQixhQURnQixFQUNESixXQURDLEVBQ1ksTUFEWixFQUNvQixZQURwQixFQUNrQyxjQURsQyxDQUFsQjtBQUlBLE1BQU1LLFNBQVMsR0FBRyxDQUNoQixHQUFHSCxhQURhLEVBRWhCLEdBQUdDLGFBRmEsRUFHaEIsR0FBR0MsU0FIYSxDQUFsQjtBQU1BLE1BQU1FLGlCQUFpQixHQUFHLENBQ3hCLENBQUNOLFdBQUQsRUFBYyxDQUFDLElBQUQsQ0FBZCxDQUR3QixFQUV4QixDQUFDLGFBQUQsRUFBZ0IsQ0FDZCxxQkFEYyxFQUNTLGNB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QUF3QkwsV0FBWSxlQUFjRyxDQUFFLEdBQXJGLENBQU47QUFDRDs7QUFDRCxNQUFJO0FBQ0YsV0FBT1IsY0FBYyxDQUFDTSxNQUFELENBQXJCO0FBQ0QsR0FGRCxDQUVFLE9BQU9FLENBQVAsRUFBVTtBQUNWLFVBQU0sSUFBSUMseUJBQU9DLG9CQUFYLENBQWlDLDZCQUE0QkwsV0FBWSxlQUFjRyxDQUFFLEdBQXpGLENBQU47QUFDRDtBQUNGLENBWkQ7O2VBY2V4RSxZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3NzU2VsZWN0b3JQYXJzZXIgfSBmcm9tICdjc3Mtc2VsZWN0b3ItcGFyc2VyJztcbmltcG9ydCB7IGVzY2FwZVJlZ0V4cCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0tYmFzZS1kcml2ZXInO1xuXG5jb25zdCBDc3NDb252ZXJ0ZXIgPSB7fTtcblxuY29uc3QgcGFyc2VyID0gbmV3IENzc1NlbGVjdG9yUGFyc2VyKCk7XG5wYXJzZXIucmVnaXN0ZXJTZWxlY3RvclBzZXVkb3MoJ2hhcycpO1xucGFyc2VyLnJlZ2lzdGVyTmVzdGluZ09wZXJhdG9ycygnPicsICcrJywgJ34nKTtcbnBhcnNlci5yZWdpc3RlckF0dHJFcXVhbGl0eU1vZHMoJ14nLCAnJCcsICcqJywgJ34nKTtcbnBhcnNlci5lbmFibGVTdWJzdGl0dXRlcygpO1xuXG5jb25zdCBSRVNPVVJDRV9JRCA9ICdyZXNvdXJjZS1pZCc7XG5jb25zdCBJRF9MT0NBVE9SX1BBVFRFUk4gPSAvXlthLXpBLVpfXVthLXpBLVowLTkuX10qOmlkXFwvW1xcU10rJC87XG5cbmNvbnN0IEJPT0xFQU5fQVRUUlMgPSBbXG4gICdjaGVja2FibGUnLCAnY2hlY2tlZCcsICdjbGlja2FibGUnLCAnZW5hYmxlZCcsICdmb2N1c2FibGUnLFxuICAnZm9jdXNlZCcsICdsb25nLWNsaWNrYWJsZScsICdzY3JvbGxhYmxlJywgJ3NlbGVjdGVkJyxcbl07XG5cbmNvbnN0IE5VTUVSSUNfQVRUUlMgPSBbXG4gICdpbmRleCcsICdpbnN0YW5jZScsXG5dO1xuXG5jb25zdCBTVFJfQVRUUlMgPSBbXG4gICdkZXNjcmlwdGlvbicsIFJFU09VUkNFX0lELCAndGV4dCcsICdjbGFzcy1uYW1lJywgJ3BhY2thZ2UtbmFtZSdcbl07XG5cbmNvbnN0IEFMTF9BVFRSUyA9IFtcbiAgLi4uQk9PTEVBTl9BVFRSUyxcbiAgLi4uTlVNRVJJQ19BVFRSUyxcbiAgLi4uU1RSX0FUVFJTLFxuXTtcblxuY29uc3QgQVRUUklCVVRFX0FMSUFTRVMgPSBbXG4gIFtSRVNPVVJDRV9JRCwgWydpZCddXSxcbiAgWydkZXNjcmlwdGlvbicsIFtcbiAgICAnY29udGVudC1kZXNjcmlwdGlvbicsICdjb250ZW50LWRlc2MnLFxuICAgICdkZXNjJywgJ2FjY2Vzc2liaWxpdHktaWQnLFxuICBdXSxcbiAgWydpbmRleCcsIFsnbnRoLWNoaWxkJ11dLFxuXTtcblxuLyoqXG4gKiBDb252ZXJ0IGh5cGhlbiBzZXBhcmF0ZWQgd29yZCB0byBzbmFrZSBjYXNlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGh5cGhlbiBzZXBhcmF0ZWQgd29yZCB0cmFuc2xhdGVkIHRvIHNuYWtlIGNhc2VcbiAqL1xuZnVuY3Rpb24gdG9TbmFrZUNhc2UgKHN0cikge1xuICBpZiAoIXN0cikge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zdCB0b2tlbnMgPSBzdHIuc3BsaXQoJy0nKS5tYXAoKHN0cikgPT4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCkpO1xuICBjb25zdCBvdXQgPSB0b2tlbnMuam9pbignJyk7XG4gIHJldHVybiBvdXQuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBvdXQuc2xpY2UoMSk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ3NzTmFtZVZhbHVlT2JqZWN0XG4gKiBAcHJvcGVydHkgez9uYW1lfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBDU1Mgb2JqZWN0XG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgQ1NTIG9iamVjdFxuICovXG5cbi8qKlxuICogR2V0IHRoZSBib29sZWFuIGZyb20gYSBDU1Mgb2JqZWN0LiBJZiBlbXB0eSwgcmV0dXJuIHRydWUuIElmIG5vdCB0cnVlL2ZhbHNlL2VtcHR5LCB0aHJvdyBleGNlcHRpb25cbiAqXG4gKiBAcGFyYW0ge0Nzc05hbWVWYWx1ZU9iamVjdH0gY3NzIEEgQ1NTIG9iamVjdCB0aGF0IGhhcyAnbmFtZScgYW5kICd2YWx1ZSdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEVpdGhlciAndHJ1ZScgb3IgJ2ZhbHNlJy4gSWYgdmFsdWUgaXMgZW1wdHksIHJldHVybiAndHJ1ZSdcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0R2V0Qm9vbCAoY3NzKSB7XG4gIGNvbnN0IHZhbCA9IGNzcy52YWx1ZT8udG9Mb3dlckNhc2UoKSB8fCAndHJ1ZSc7IC8vIGFuIG9taXR0ZWQgYm9vbGVhbiBhdHRyaWJ1dGUgbWVhbnMgJ3RydWUnIChlLmcuOiBpbnB1dFtjaGVja2VkXSBtZWFucyBjaGVja2VkIGlzIHRydWUpXG4gIGlmIChbJ3RydWUnLCAnZmFsc2UnXS5pbmNsdWRlcyh2YWwpKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYCcke2Nzcy5uYW1lfScgbXVzdCBiZSB0cnVlLCBmYWxzZSBvciBlbXB0eS4gRm91bmQgJyR7Y3NzLnZhbHVlfSdgKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGNhbm9uaWNhbCBmb3JtIG9mIGEgQ1NTIGF0dHJpYnV0ZSBuYW1lXG4gKlxuICogQ29udmVydHMgdG8gbG93ZXJjYXNlIGFuZCBpZiBhbiBhdHRyaWJ1dGUgbmFtZSBpcyBhbiBhbGlhcyBmb3Igc29tZXRoaW5nIGVsc2UsIHJldHVyblxuICogd2hhdCBpdCBpcyBhbiBhbGlhcyBmb3JcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY3NzIENTUyBvYmplY3RcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjYW5vbmljYWwgYXR0cmlidXRlIG5hbWVcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0R2V0QXR0ck5hbWUgKGNzcykge1xuICBjb25zdCBhdHRyTmFtZSA9IGNzcy5uYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gQ2hlY2sgaWYgaXQncyBzdXBwb3J0ZWQgYW5kIGlmIGl0IGlzLCByZXR1cm4gaXRcbiAgaWYgKEFMTF9BVFRSUy5pbmNsdWRlcyhhdHRyTmFtZSkpIHtcbiAgICByZXR1cm4gYXR0ck5hbWUudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIC8vIElmIGF0dHJOYW1lIGlzIGFuIGFsaWFzIGZvciBzb21ldGhpbmcgZWxzZSwgcmV0dXJuIHRoYXRcbiAgZm9yIChjb25zdCBbb2ZmaWNpYWxBdHRyLCBhbGlhc0F0dHJzXSBvZiBBVFRSSUJVVEVfQUxJQVNFUykge1xuICAgIGlmIChhbGlhc0F0dHJzLmluY2x1ZGVzKGF0dHJOYW1lKSkge1xuICAgICAgcmV0dXJuIG9mZmljaWFsQXR0cjtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGAnJHthdHRyTmFtZX0nIGlzIG5vdCBhIHZhbGlkIGF0dHJpYnV0ZS4gYCArXG4gICAgYFN1cHBvcnRlZCBhdHRyaWJ1dGVzIGFyZSAnJHtBTExfQVRUUlMuam9pbignLCAnKX0nYCk7XG59XG5cbi8qKlxuICogR2V0IGEgcmVnZXggdGhhdCBtYXRjaGVzIGEgd2hvbGUgd29yZC4gRm9yIHRoZSB+PSBDU1MgYXR0cmlidXRlIHNlbGVjdG9yLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB3b3JkXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBBIHJlZ2V4IFwid29yZFwiIG1hdGNoZXJcbiAqL1xuZnVuY3Rpb24gZ2V0V29yZE1hdGNoZXJSZWdleCAod29yZCkge1xuICByZXR1cm4gYFxcXFxiKFxcXFx3KiR7ZXNjYXBlUmVnRXhwKHdvcmQpfVxcXFx3KilcXFxcYmA7XG59XG5cbi8qKlxuICogQWRkIGFuZHJvaWQ6aWQvIHRvIGJlZ2lubmluZyBvZiBzdHJpbmcgaWYgaXQncyBub3QgdGhlcmUgYWxyZWFkeVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdG9yIFRoZSBpbml0aWFsIGxvY2F0b3JcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFN0cmluZyB3aXRoIGBhbmRyb2lkOmlkL2AgcHJlcGVuZGVkIChpZiBpdCB3YXNuJ3QgYWxyZWFkeSlcbiAqL1xuZnVuY3Rpb24gZm9ybWF0SWRMb2NhdG9yIChsb2NhdG9yKSB7XG4gIHJldHVybiBJRF9MT0NBVE9SX1BBVFRFUk4udGVzdChsb2NhdG9yKSA/IGxvY2F0b3IgOiBgYW5kcm9pZDppZC8ke2xvY2F0b3J9YDtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDc3NBdHRyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlVHlwZSBUeXBlIG9mIGF0dHJpYnV0ZSAobXVzdCBiZSBzdHJpbmcgb3IgZW1wdHkpXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gb3BlcmF0b3IgVGhlIG9wZXJhdG9yIGJldHdlZW4gdmFsdWUgYW5kIHZhbHVlIHR5cGUgKD0sICo9LCAsIF49LCAkPSlcbiAqL1xuXG4vKipcbiAqIENvbnZlcnQgYSBDU1MgYXR0cmlidXRlIGludG8gYSBVaVNlbGVjdG9yIG1ldGhvZCBjYWxsXG4gKlxuICogQHBhcmFtIHtDc3NBdHRyfSBjc3NBdHRyIENTUyBhdHRyaWJ1dGUgb2JqZWN0XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBDU1MgYXR0cmlidXRlIHBhcnNlZCBhcyBVaVNlbGVjdG9yXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQXR0ciAoY3NzQXR0cikge1xuICBpZiAoY3NzQXR0ci52YWx1ZVR5cGUgJiYgY3NzQXR0ci52YWx1ZVR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnJHtjc3NBdHRyLm5hbWV9PSR7Y3NzQXR0ci52YWx1ZX0nIGlzIGFuIGludmFsaWQgYXR0cmlidXRlLiBgICtcbiAgICAgIGBPbmx5ICdzdHJpbmcnIGFuZCBlbXB0eSBhdHRyaWJ1dGUgdHlwZXMgYXJlIHN1cHBvcnRlZC4gRm91bmQgJyR7Y3NzQXR0ci52YWx1ZVR5cGV9J2ApO1xuICB9XG4gIGNvbnN0IGF0dHJOYW1lID0gYXNzZXJ0R2V0QXR0ck5hbWUoY3NzQXR0cik7XG4gIGNvbnN0IG1ldGhvZE5hbWUgPSB0b1NuYWtlQ2FzZShhdHRyTmFtZSk7XG5cbiAgLy8gVmFsaWRhdGUgdGhhdCBpdCdzIGEgc3VwcG9ydGVkIGF0dHJpYnV0ZVxuICBpZiAoIVNUUl9BVFRSUy5pbmNsdWRlcyhhdHRyTmFtZSkgJiYgIUJPT0xFQU5fQVRUUlMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnJHthdHRyTmFtZX0nIGlzIG5vdCBzdXBwb3J0ZWQuIFN1cHBvcnRlZCBhdHRyaWJ1dGVzIGFyZSBgICtcbiAgICAgIGAnJHtbLi4uU1RSX0FUVFJTLCAuLi5CT09MRUFOX0FUVFJTXS5qb2luKCcsICcpfSdgKTtcbiAgfVxuXG4gIC8vIFBhcnNlIGJvb2xlYW4sIGlmIGl0J3MgYSBib29sZWFuIGF0dHJpYnV0ZVxuICBpZiAoQk9PTEVBTl9BVFRSUy5pbmNsdWRlcyhhdHRyTmFtZSkpIHtcbiAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9KCR7YXNzZXJ0R2V0Qm9vbChjc3NBdHRyKX0pYDtcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSBwYXJzZSBhcyBzdHJpbmdcbiAgbGV0IHZhbHVlID0gY3NzQXR0ci52YWx1ZSB8fCAnJztcbiAgaWYgKGF0dHJOYW1lID09PSBSRVNPVVJDRV9JRCkge1xuICAgIHZhbHVlID0gZm9ybWF0SWRMb2NhdG9yKHZhbHVlKTtcbiAgfVxuICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCJcIilgO1xuICB9XG5cbiAgc3dpdGNoIChjc3NBdHRyLm9wZXJhdG9yKSB7XG4gICAgY2FzZSAnPSc6XG4gICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9KFwiJHt2YWx1ZX1cIilgO1xuICAgIGNhc2UgJyo9JzpcbiAgICAgIGlmIChbJ2Rlc2NyaXB0aW9uJywgJ3RleHQnXS5pbmNsdWRlcyhhdHRyTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfUNvbnRhaW5zKFwiJHt2YWx1ZX1cIilgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke2VzY2FwZVJlZ0V4cCh2YWx1ZSl9XCIpYDtcbiAgICBjYXNlICdePSc6XG4gICAgICBpZiAoWydkZXNjcmlwdGlvbicsICd0ZXh0J10uaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1TdGFydHNXaXRoKFwiJHt2YWx1ZX1cIilgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCJeJHtlc2NhcGVSZWdFeHAodmFsdWUpfVwiKWA7XG4gICAgY2FzZSAnJD0nOlxuICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke2VzY2FwZVJlZ0V4cCh2YWx1ZSl9JFwiKWA7XG4gICAgY2FzZSAnfj0nOlxuICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke2dldFdvcmRNYXRjaGVyUmVnZXgodmFsdWUpfVwiKWA7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIFVucmVhY2hhYmxlLCBidXQgYWRkaW5nIGVycm9yIGluIGNhc2UgYSBuZXcgQ1NTIGF0dHJpYnV0ZSBpcyBhZGRlZC5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgQ1NTIGF0dHJpYnV0ZSBvcGVyYXRvciAnJHtjc3NBdHRyLm9wZXJhdG9yfScuIGAgK1xuICAgICAgICBgICc9JywgJyo9JywgJ149JywgJyQ9JyBhbmQgJ349JyBhcmUgc3VwcG9ydGVkLmApO1xuICB9XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ3NzUHNldWRvXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlVHlwZSBUaGUgdHlwZSBvZiBDU1MgcHNldWRvIHNlbGVjdG9yIChodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9jc3Mtc2VsZWN0b3ItcGFyc2VyIGZvciByZWZlcmVuY2UpXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHBzZXVkbyBzZWxlY3RvclxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHBzZXVkbyBzZWxlY3RvclxuICovXG5cbi8qKlxuICogQ29udmVydCBhIENTUyBwc2V1ZG8gY2xhc3MgdG8gYSBVaVNlbGVjdG9yXG4gKlxuICogQHBhcmFtIHtDc3NQc2V1ZG99IGNzc1BzZXVkbyBDU1MgUHNldWRvIGNsYXNzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBQc2V1ZG8gc2VsZWN0b3IgcGFyc2VkIGFzIFVpU2VsZWN0b3JcbiAqL1xuZnVuY3Rpb24gcGFyc2VQc2V1ZG8gKGNzc1BzZXVkbykge1xuICBpZiAoY3NzUHNldWRvLnZhbHVlVHlwZSAmJiBjc3NQc2V1ZG8udmFsdWVUeXBlICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7Y3NzUHNldWRvLm5hbWV9PSR7Y3NzUHNldWRvLnZhbHVlfScuIGAgK1xuICAgICAgYFVuc3VwcG9ydGVkIGNzcyBwc2V1ZG8gY2xhc3MgdmFsdWUgdHlwZTogJyR7Y3NzUHNldWRvLnZhbHVlVHlwZX0nLiBPbmx5ICdzdHJpbmcnIHR5cGUgb3IgZW1wdHkgaXMgc3VwcG9ydGVkLmApO1xuICB9XG5cbiAgY29uc3QgcHNldWRvTmFtZSA9IGFzc2VydEdldEF0dHJOYW1lKGNzc1BzZXVkbyk7XG5cbiAgaWYgKEJPT0xFQU5fQVRUUlMuaW5jbHVkZXMocHNldWRvTmFtZSkpIHtcbiAgICByZXR1cm4gYC4ke3RvU25ha2VDYXNlKHBzZXVkb05hbWUpfSgke2Fzc2VydEdldEJvb2woY3NzUHNldWRvKX0pYDtcbiAgfVxuXG4gIGlmIChOVU1FUklDX0FUVFJTLmluY2x1ZGVzKHBzZXVkb05hbWUpKSB7XG4gICAgcmV0dXJuIGAuJHtwc2V1ZG9OYW1lfSgke2Nzc1BzZXVkby52YWx1ZX0pYDtcbiAgfVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENzc1J1bGVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gbmVzdGluZ09wZXJhdG9yIFRoZSBuZXN0aW5nIG9wZXJhdG9yIChha2E6IGNvbWJpbmF0b3IgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMpXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHRhZ05hbWUgVGhlIHRhZyBuYW1lIChha2E6IHR5cGUgc2VsZWN0b3IgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL1R5cGVfc2VsZWN0b3JzKVxuICogQHByb3BlcnR5IHs/c3RyaW5nW119IGNsYXNzTmFtZXMgQW4gYXJyYXkgb2YgQ1NTIGNsYXNzIG5hbWVzXG4gKiBAcHJvcGVydHkgez9Dc3NBdHRyW119IGF0dHJzIEFuIGFycmF5IG9mIENTUyBhdHRyaWJ1dGVzXG4gKiBAcHJvcGVydHkgez9Dc3NQc2V1ZG9bXX0gYXR0cnMgQW4gYXJyYXkgb2YgQ1NTIHBzZXVkb3NcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaWQgQ1NTIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7P0Nzc1J1bGV9IHJ1bGUgQSBkZXNjZW5kYW50IG9mIHRoaXMgQ1NTIHJ1bGVcbiAqL1xuXG4vKipcbiAqIENvbnZlcnQgYSBDU1MgcnVsZSB0byBhIFVpU2VsZWN0b3JcbiAqIEBwYXJhbSB7Q3NzUnVsZX0gY3NzUnVsZSBDU1MgcnVsZSBkZWZpbml0aW9uXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ3NzUnVsZSAoY3NzUnVsZSkge1xuICBjb25zdCB7IG5lc3RpbmdPcGVyYXRvciB9ID0gY3NzUnVsZTtcbiAgaWYgKG5lc3RpbmdPcGVyYXRvciAmJiBuZXN0aW5nT3BlcmF0b3IgIT09ICcgJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7bmVzdGluZ09wZXJhdG9yfScgaXMgbm90IGEgc3VwcG9ydGVkIGNvbWJpbmF0b3IuIGAgK1xuICAgICAgYE9ubHkgY2hpbGQgY29tYmluYXRvciAoPikgYW5kIGRlc2NlbmRhbnQgY29tYmluYXRvciBhcmUgc3VwcG9ydGVkLmApO1xuICB9XG5cbiAgbGV0IHVpQXV0b21hdG9yU2VsZWN0b3IgPSAnbmV3IFVpU2VsZWN0b3IoKSc7XG4gIGlmIChjc3NSdWxlLnRhZ05hbWUgJiYgY3NzUnVsZS50YWdOYW1lICE9PSAnKicpIHtcbiAgICBsZXQgYW5kcm9pZENsYXNzID0gW2Nzc1J1bGUudGFnTmFtZV07XG4gICAgaWYgKGNzc1J1bGUuY2xhc3NOYW1lcykge1xuICAgICAgZm9yIChjb25zdCBjc3NDbGFzc05hbWVzIG9mIGNzc1J1bGUuY2xhc3NOYW1lcykge1xuICAgICAgICBhbmRyb2lkQ2xhc3MucHVzaChjc3NDbGFzc05hbWVzKTtcbiAgICAgIH1cbiAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5jbGFzc05hbWUoXCIke2FuZHJvaWRDbGFzcy5qb2luKCcuJyl9XCIpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBgLmNsYXNzTmFtZU1hdGNoZXMoXCIke2Nzc1J1bGUudGFnTmFtZX1cIilgO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjc3NSdWxlLmNsYXNzTmFtZXMpIHtcbiAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IGAuY2xhc3NOYW1lTWF0Y2hlcyhcIiR7Y3NzUnVsZS5jbGFzc05hbWVzLmpvaW4oJ1xcXFwuJyl9XCIpYDtcbiAgfVxuICBpZiAoY3NzUnVsZS5pZCkge1xuICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5yZXNvdXJjZUlkKFwiJHtmb3JtYXRJZExvY2F0b3IoY3NzUnVsZS5pZCl9XCIpYDtcbiAgfVxuICBpZiAoY3NzUnVsZS5hdHRycykge1xuICAgIGZvciAoY29uc3QgYXR0ciBvZiBjc3NSdWxlLmF0dHJzKSB7XG4gICAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IHBhcnNlQXR0cihhdHRyKTtcbiAgICB9XG4gIH1cbiAgaWYgKGNzc1J1bGUucHNldWRvcykge1xuICAgIGZvciAoY29uc3QgcHNldWRvIG9mIGNzc1J1bGUucHNldWRvcykge1xuICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBwYXJzZVBzZXVkbyhwc2V1ZG8pO1xuICAgIH1cbiAgfVxuICBpZiAoY3NzUnVsZS5ydWxlKSB7XG4gICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBgLmNoaWxkU2VsZWN0b3IoJHtwYXJzZUNzc1J1bGUoY3NzUnVsZS5ydWxlKX0pYDtcbiAgfVxuICByZXR1cm4gdWlBdXRvbWF0b3JTZWxlY3Rvcjtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDc3NPYmplY3RcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdHlwZSBUeXBlIG9mIENTUyBvYmplY3QuICdydWxlJywgJ3J1bGVzZXQnIG9yICdzZWxlY3RvcnMnXG4gKi9cblxuLyoqXG4gKiBDb252ZXJ0IENTUyBvYmplY3QgdG8gVWlBdXRvbWF0b3IyIHNlbGVjdG9yXG4gKiBAcGFyYW0ge0Nzc09iamVjdH0gY3NzIENTUyBvYmplY3RcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBDU1Mgb2JqZWN0IHBhcnNlZCBhcyBhIFVpU2VsZWN0b3JcbiAqL1xuZnVuY3Rpb24gcGFyc2VDc3NPYmplY3QgKGNzcykge1xuICBzd2l0Y2ggKGNzcy50eXBlKSB7XG4gICAgY2FzZSAncnVsZSc6XG4gICAgICByZXR1cm4gcGFyc2VDc3NSdWxlKGNzcyk7XG4gICAgY2FzZSAncnVsZVNldCc6XG4gICAgICByZXR1cm4gcGFyc2VDc3NPYmplY3QoY3NzLnJ1bGUpO1xuICAgIGNhc2UgJ3NlbGVjdG9ycyc6XG4gICAgICByZXR1cm4gY3NzLnNlbGVjdG9ycy5tYXAoKHNlbGVjdG9yKSA9PiBwYXJzZUNzc09iamVjdChzZWxlY3RvcikpLmpvaW4oJzsgJyk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gVGhpcyBpcyBuZXZlciByZWFjaGFibGUsIGJ1dCBpZiBpdCBldmVyIGlzIGRvIHRoaXMuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVpQXV0b21hdG9yIGRvZXMgbm90IHN1cHBvcnQgJyR7Y3NzLnR5cGV9JyBjc3MuIE9ubHkgc3VwcG9ydHMgJ3J1bGUnLCAncnVsZVNldCcsICdzZWxlY3RvcnMnIGApO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBhIENTUyBzZWxlY3RvciB0byBhIFVpQXV0b21hdG9yMiBzZWxlY3RvclxuICogQHBhcmFtIHtzdHJpbmd9IGNzc1NlbGVjdG9yIENTUyBTZWxlY3RvclxuICogQHJldHVybnMge3N0cmluZ30gVGhlIENTUyBzZWxlY3RvciBjb252ZXJ0ZWQgdG8gYSBVaVNlbGVjdG9yXG4gKi9cbkNzc0NvbnZlcnRlci50b1VpQXV0b21hdG9yU2VsZWN0b3IgPSBmdW5jdGlvbiB0b1VpQXV0b21hdG9yU2VsZWN0b3IgKGNzc1NlbGVjdG9yKSB7XG4gIGxldCBjc3NPYmo7XG4gIHRyeSB7XG4gICAgY3NzT2JqID0gcGFyc2VyLnBhcnNlKGNzc1NlbGVjdG9yKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFNlbGVjdG9yRXJyb3IoYEludmFsaWQgQ1NTIHNlbGVjdG9yICcke2Nzc1NlbGVjdG9yfScuIFJlYXNvbjogJyR7ZX0nYCk7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2VDc3NPYmplY3QoY3NzT2JqKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFNlbGVjdG9yRXJyb3IoYFVuc3VwcG9ydGVkIENTUyBzZWxlY3RvciAnJHtjc3NTZWxlY3Rvcn0nLiBSZWFzb246ICcke2V9J2ApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBDc3NDb252ZXJ0ZXI7Il0sImZpbGUiOiJsaWIvY3NzLWNvbnZlcnRlci5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
240
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jc3MtY29udmVydGVyLmpzIl0sIm5hbWVzIjpbInBhcnNlciIsIkNzc1NlbGVjdG9yUGFyc2VyIiwicmVnaXN0ZXJTZWxlY3RvclBzZXVkb3MiLCJyZWdpc3Rlck5lc3RpbmdPcGVyYXRvcnMiLCJyZWdpc3RlckF0dHJFcXVhbGl0eU1vZHMiLCJlbmFibGVTdWJzdGl0dXRlcyIsIlJFU09VUkNFX0lEIiwiSURfTE9DQVRPUl9QQVRURVJOIiwiQk9PTEVBTl9BVFRSUyIsIk5VTUVSSUNfQVRUUlMiLCJTVFJfQVRUUlMiLCJBTExfQVRUUlMiLCJBVFRSSUJVVEVfQUxJQVNFUyIsInRvU25ha2VDYXNlIiwic3RyIiwidG9rZW5zIiwic3BsaXQiLCJtYXAiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwidG9Mb3dlckNhc2UiLCJvdXQiLCJqb2luIiwiYXNzZXJ0R2V0Qm9vbCIsImNzcyIsInZhbCIsInZhbHVlIiwiaW5jbHVkZXMiLCJFcnJvciIsIm5hbWUiLCJhc3NlcnRHZXRBdHRyTmFtZSIsImF0dHJOYW1lIiwib2ZmaWNpYWxBdHRyIiwiYWxpYXNBdHRycyIsImdldFdvcmRNYXRjaGVyUmVnZXgiLCJ3b3JkIiwiQ3NzQ29udmVydGVyIiwiY29uc3RydWN0b3IiLCJzZWxlY3RvciIsInBrZyIsImZvcm1hdElkTG9jYXRvciIsImxvY2F0b3IiLCJ0ZXN0IiwicGFyc2VBdHRyIiwiY3NzQXR0ciIsInZhbHVlVHlwZSIsIm1ldGhvZE5hbWUiLCJvcGVyYXRvciIsInBhcnNlUHNldWRvIiwiY3NzUHNldWRvIiwicHNldWRvTmFtZSIsInBhcnNlQ3NzUnVsZSIsImNzc1J1bGUiLCJuZXN0aW5nT3BlcmF0b3IiLCJ1aUF1dG9tYXRvclNlbGVjdG9yIiwidGFnTmFtZSIsImFuZHJvaWRDbGFzcyIsImNsYXNzTmFtZXMiLCJjc3NDbGFzc05hbWVzIiwicHVzaCIsImlkIiwiYXR0cnMiLCJhdHRyIiwicHNldWRvcyIsInBzZXVkbyIsInJ1bGUiLCJwYXJzZUNzc09iamVjdCIsInR5cGUiLCJzZWxlY3RvcnMiLCJ0b1VpQXV0b21hdG9yU2VsZWN0b3IiLCJjc3NPYmoiLCJwYXJzZSIsImUiLCJlcnJvcnMiLCJJbnZhbGlkU2VsZWN0b3JFcnJvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsTUFBTSxHQUFHLElBQUlDLG9DQUFKLEVBQWY7QUFDQUQsTUFBTSxDQUFDRSx1QkFBUCxDQUErQixLQUEvQjtBQUNBRixNQUFNLENBQUNHLHdCQUFQLENBQWdDLEdBQWhDLEVBQXFDLEdBQXJDLEVBQTBDLEdBQTFDO0FBQ0FILE1BQU0sQ0FBQ0ksd0JBQVAsQ0FBZ0MsR0FBaEMsRUFBcUMsR0FBckMsRUFBMEMsR0FBMUMsRUFBK0MsR0FBL0M7QUFDQUosTUFBTSxDQUFDSyxpQkFBUDtBQUVBLE1BQU1DLFdBQVcsR0FBRyxhQUFwQjtBQUNBLE1BQU1DLGtCQUFrQixHQUFHLHFDQUEzQjtBQUVBLE1BQU1DLGFBQWEsR0FBRyxDQUNwQixXQURvQixFQUNQLFNBRE8sRUFDSSxXQURKLEVBQ2lCLFNBRGpCLEVBQzRCLFdBRDVCLEVBRXBCLFNBRm9CLEVBRVQsZ0JBRlMsRUFFUyxZQUZULEVBRXVCLFVBRnZCLENBQXRCO0FBS0EsTUFBTUMsYUFBYSxHQUFHLENBQ3BCLE9BRG9CLEVBQ1gsVUFEVyxDQUF0QjtBQUlBLE1BQU1DLFNBQVMsR0FBRyxDQUNoQixhQURnQixFQUNESixXQURDLEVBQ1ksTUFEWixFQUNvQixZQURwQixFQUNrQyxjQURsQyxDQUFsQjtBQUlBLE1BQU1LLFNBQVMsR0FBRyxDQUNoQixHQUFHSCxhQURhLEVBRWhCLEdBQUdDLGFBRmEsRUFHaEIsR0FBR0MsU0FIYSxDQUFsQjtBQU1BLE1BQU1FLGlCQUFpQixHQUFHLENBQ3hCLENBQUNOLFdBQUQsRUFBYyxDQUFDLElBQUQsQ0FBZCxDQUR3QixFQUV4QixDQUFDLGFBQUQsRUFBZ0IsQ0FDZCxxQkFEYyxFQUNTLGNBRFQsRUFFZCxNQUZjLEVBRU4sa0JB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QUN2QixRQUFJQyxNQUFKOztBQUNBLFFBQUk7QUFDRkEsTUFBQUEsTUFBTSxHQUFHdkUsTUFBTSxDQUFDd0UsS0FBUCxDQUFhLEtBQUtqQyxRQUFsQixDQUFUO0FBQ0QsS0FGRCxDQUVFLE9BQU9rQyxDQUFQLEVBQVU7QUFDVixZQUFNLElBQUlDLHlCQUFPQyxvQkFBWCxDQUFpQyx5QkFBd0IsS0FBS3BDLFFBQVMsZUFBY2tDLENBQUUsR0FBdkYsQ0FBTjtBQUNEOztBQUNELFFBQUk7QUFDRixhQUFPLEtBQUtOLGNBQUwsQ0FBb0JJLE1BQXBCLENBQVA7QUFDRCxLQUZELENBRUUsT0FBT0UsQ0FBUCxFQUFVO0FBQ1YsWUFBTSxJQUFJQyx5QkFBT0Msb0JBQVgsQ0FBaUMsNkJBQTRCLEtBQUtwQyxRQUFTLGVBQWNrQyxDQUFFLEdBQTNGLENBQU47QUFDRDtBQUNGOztBQXJMZ0I7O2VBd0xKcEMsWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENzc1NlbGVjdG9yUGFyc2VyIH0gZnJvbSAnY3NzLXNlbGVjdG9yLXBhcnNlcic7XG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtLWJhc2UtZHJpdmVyJztcblxuY29uc3QgcGFyc2VyID0gbmV3IENzc1NlbGVjdG9yUGFyc2VyKCk7XG5wYXJzZXIucmVnaXN0ZXJTZWxlY3RvclBzZXVkb3MoJ2hhcycpO1xucGFyc2VyLnJlZ2lzdGVyTmVzdGluZ09wZXJhdG9ycygnPicsICcrJywgJ34nKTtcbnBhcnNlci5yZWdpc3RlckF0dHJFcXVhbGl0eU1vZHMoJ14nLCAnJCcsICcqJywgJ34nKTtcbnBhcnNlci5lbmFibGVTdWJzdGl0dXRlcygpO1xuXG5jb25zdCBSRVNPVVJDRV9JRCA9ICdyZXNvdXJjZS1pZCc7XG5jb25zdCBJRF9MT0NBVE9SX1BBVFRFUk4gPSAvXlthLXpBLVpfXVthLXpBLVowLTkuX10qOmlkXFwvW1xcU10rJC87XG5cbmNvbnN0IEJPT0xFQU5fQVRUUlMgPSBbXG4gICdjaGVja2FibGUnLCAnY2hlY2tlZCcsICdjbGlja2FibGUnLCAnZW5hYmxlZCcsICdmb2N1c2FibGUnLFxuICAnZm9jdXNlZCcsICdsb25nLWNsaWNrYWJsZScsICdzY3JvbGxhYmxlJywgJ3NlbGVjdGVkJyxcbl07XG5cbmNvbnN0IE5VTUVSSUNfQVRUUlMgPSBbXG4gICdpbmRleCcsICdpbnN0YW5jZScsXG5dO1xuXG5jb25zdCBTVFJfQVRUUlMgPSBbXG4gICdkZXNjcmlwdGlvbicsIFJFU09VUkNFX0lELCAndGV4dCcsICdjbGFzcy1uYW1lJywgJ3BhY2thZ2UtbmFtZSdcbl07XG5cbmNvbnN0IEFMTF9BVFRSUyA9IFtcbiAgLi4uQk9PTEVBTl9BVFRSUyxcbiAgLi4uTlVNRVJJQ19BVFRSUyxcbiAgLi4uU1RSX0FUVFJTLFxuXTtcblxuY29uc3QgQVRUUklCVVRFX0FMSUFTRVMgPSBbXG4gIFtSRVNPVVJDRV9JRCwgWydpZCddXSxcbiAgWydkZXNjcmlwdGlvbicsIFtcbiAgICAnY29udGVudC1kZXNjcmlwdGlvbicsICdjb250ZW50LWRlc2MnLFxuICAgICdkZXNjJywgJ2FjY2Vzc2liaWxpdHktaWQnLFxuICBdXSxcbiAgWydpbmRleCcsIFsnbnRoLWNoaWxkJ11dLFxuXTtcblxuLyoqXG4gKiBDb252ZXJ0IGh5cGhlbiBzZXBhcmF0ZWQgd29yZCB0byBzbmFrZSBjYXNlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGh5cGhlbiBzZXBhcmF0ZWQgd29yZCB0cmFuc2xhdGVkIHRvIHNuYWtlIGNhc2VcbiAqL1xuZnVuY3Rpb24gdG9TbmFrZUNhc2UgKHN0cikge1xuICBpZiAoIXN0cikge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zdCB0b2tlbnMgPSBzdHIuc3BsaXQoJy0nKS5tYXAoKHN0cikgPT4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCkpO1xuICBjb25zdCBvdXQgPSB0b2tlbnMuam9pbignJyk7XG4gIHJldHVybiBvdXQuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBvdXQuc2xpY2UoMSk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ3NzTmFtZVZhbHVlT2JqZWN0XG4gKiBAcHJvcGVydHkgez9uYW1lfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBDU1Mgb2JqZWN0XG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgQ1NTIG9iamVjdFxuICovXG5cbi8qKlxuICogR2V0IHRoZSBib29sZWFuIGZyb20gYSBDU1Mgb2JqZWN0LiBJZiBlbXB0eSwgcmV0dXJuIHRydWUuIElmIG5vdCB0cnVlL2ZhbHNlL2VtcHR5LCB0aHJvdyBleGNlcHRpb25cbiAqXG4gKiBAcGFyYW0ge0Nzc05hbWVWYWx1ZU9iamVjdH0gY3NzIEEgQ1NTIG9iamVjdCB0aGF0IGhhcyAnbmFtZScgYW5kICd2YWx1ZSdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEVpdGhlciAndHJ1ZScgb3IgJ2ZhbHNlJy4gSWYgdmFsdWUgaXMgZW1wdHksIHJldHVybiAndHJ1ZSdcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0R2V0Qm9vbCAoY3NzKSB7XG4gIGNvbnN0IHZhbCA9IGNzcy52YWx1ZT8udG9Mb3dlckNhc2UoKSB8fCAndHJ1ZSc7IC8vIGFuIG9taXR0ZWQgYm9vbGVhbiBhdHRyaWJ1dGUgbWVhbnMgJ3RydWUnIChlLmcuOiBpbnB1dFtjaGVja2VkXSBtZWFucyBjaGVja2VkIGlzIHRydWUpXG4gIGlmIChbJ3RydWUnLCAnZmFsc2UnXS5pbmNsdWRlcyh2YWwpKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYCcke2Nzcy5uYW1lfScgbXVzdCBiZSB0cnVlLCBmYWxzZSBvciBlbXB0eS4gRm91bmQgJyR7Y3NzLnZhbHVlfSdgKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGNhbm9uaWNhbCBmb3JtIG9mIGEgQ1NTIGF0dHJpYnV0ZSBuYW1lXG4gKlxuICogQ29udmVydHMgdG8gbG93ZXJjYXNlIGFuZCBpZiBhbiBhdHRyaWJ1dGUgbmFtZSBpcyBhbiBhbGlhcyBmb3Igc29tZXRoaW5nIGVsc2UsIHJldHVyblxuICogd2hhdCBpdCBpcyBhbiBhbGlhcyBmb3JcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY3NzIENTUyBvYmplY3RcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjYW5vbmljYWwgYXR0cmlidXRlIG5hbWVcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0R2V0QXR0ck5hbWUgKGNzcykge1xuICBjb25zdCBhdHRyTmFtZSA9IGNzcy5uYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gQ2hlY2sgaWYgaXQncyBzdXBwb3J0ZWQgYW5kIGlmIGl0IGlzLCByZXR1cm4gaXRcbiAgaWYgKEFMTF9BVFRSUy5pbmNsdWRlcyhhdHRyTmFtZSkpIHtcbiAgICByZXR1cm4gYXR0ck5hbWUudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIC8vIElmIGF0dHJOYW1lIGlzIGFuIGFsaWFzIGZvciBzb21ldGhpbmcgZWxzZSwgcmV0dXJuIHRoYXRcbiAgZm9yIChjb25zdCBbb2ZmaWNpYWxBdHRyLCBhbGlhc0F0dHJzXSBvZiBBVFRSSUJVVEVfQUxJQVNFUykge1xuICAgIGlmIChhbGlhc0F0dHJzLmluY2x1ZGVzKGF0dHJOYW1lKSkge1xuICAgICAgcmV0dXJuIG9mZmljaWFsQXR0cjtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGAnJHthdHRyTmFtZX0nIGlzIG5vdCBhIHZhbGlkIGF0dHJpYnV0ZS4gYCArXG4gICAgYFN1cHBvcnRlZCBhdHRyaWJ1dGVzIGFyZSAnJHtBTExfQVRUUlMuam9pbignLCAnKX0nYCk7XG59XG5cbi8qKlxuICogR2V0IGEgcmVnZXggdGhhdCBtYXRjaGVzIGEgd2hvbGUgd29yZC4gRm9yIHRoZSB+PSBDU1MgYXR0cmlidXRlIHNlbGVjdG9yLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB3b3JkXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBBIHJlZ2V4IFwid29yZFwiIG1hdGNoZXJcbiAqL1xuZnVuY3Rpb24gZ2V0V29yZE1hdGNoZXJSZWdleCAod29yZCkge1xuICByZXR1cm4gYFxcXFxiKFxcXFx3KiR7ZXNjYXBlUmVnRXhwKHdvcmQpfVxcXFx3KilcXFxcYmA7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ3NzQXR0clxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB2YWx1ZVR5cGUgVHlwZSBvZiBhdHRyaWJ1dGUgKG11c3QgYmUgc3RyaW5nIG9yIGVtcHR5KVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB2YWx1ZSBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG9wZXJhdG9yIFRoZSBvcGVyYXRvciBiZXR3ZWVuIHZhbHVlIGFuZCB2YWx1ZSB0eXBlICg9LCAqPSwgLCBePSwgJD0pXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDc3NSdWxlXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG5lc3RpbmdPcGVyYXRvciBUaGUgbmVzdGluZyBvcGVyYXRvciAoYWthOiBjb21iaW5hdG9yIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9DU1NfU2VsZWN0b3JzKVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB0YWdOYW1lIFRoZSB0YWcgbmFtZSAoYWthOiB0eXBlIHNlbGVjdG9yIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9UeXBlX3NlbGVjdG9ycylcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ1tdfSBjbGFzc05hbWVzIEFuIGFycmF5IG9mIENTUyBjbGFzcyBuYW1lc1xuICogQHByb3BlcnR5IHs/Q3NzQXR0cltdfSBhdHRycyBBbiBhcnJheSBvZiBDU1MgYXR0cmlidXRlc1xuICogQHByb3BlcnR5IHs/Q3NzUHNldWRvW119IGF0dHJzIEFuIGFycmF5IG9mIENTUyBwc2V1ZG9zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGlkIENTUyBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkgez9Dc3NSdWxlfSBydWxlIEEgZGVzY2VuZGFudCBvZiB0aGlzIENTUyBydWxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDc3NPYmplY3RcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdHlwZSBUeXBlIG9mIENTUyBvYmplY3QuICdydWxlJywgJ3J1bGVzZXQnIG9yICdzZWxlY3RvcnMnXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDc3NQc2V1ZG9cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmFsdWVUeXBlIFRoZSB0eXBlIG9mIENTUyBwc2V1ZG8gc2VsZWN0b3IgKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2Nzcy1zZWxlY3Rvci1wYXJzZXIgZm9yIHJlZmVyZW5jZSlcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHNldWRvIHNlbGVjdG9yXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgcHNldWRvIHNlbGVjdG9yXG4gKi9cblxuY2xhc3MgQ3NzQ29udmVydGVyIHtcblxuICBjb25zdHJ1Y3RvciAoc2VsZWN0b3IsIHBrZykge1xuICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICB0aGlzLnBrZyA9IHBrZztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYDxwa2dOYW1lPjppZC9gIHByZWZpeCB0byBiZWdpbm5pbmcgb2Ygc3RyaW5nIGlmIGl0J3Mgbm90IHRoZXJlIGFscmVhZHlcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0b3IgVGhlIGluaXRpYWwgbG9jYXRvclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBTdHJpbmcgd2l0aCBgPHBrZ05hbWU+OmlkL2AgcHJlcGVuZGVkIChpZiBpdCB3YXNuJ3QgYWxyZWFkeSlcbiAgICovXG4gIGZvcm1hdElkTG9jYXRvciAobG9jYXRvcikge1xuICAgIHJldHVybiBJRF9MT0NBVE9SX1BBVFRFUk4udGVzdChsb2NhdG9yKVxuICAgICAgPyBsb2NhdG9yXG4gICAgICA6IGAke3RoaXMucGtnIHx8ICdhbmRyb2lkJ306aWQvJHtsb2NhdG9yfWA7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhIENTUyBhdHRyaWJ1dGUgaW50byBhIFVpU2VsZWN0b3IgbWV0aG9kIGNhbGxcbiAgICpcbiAgICogQHBhcmFtIHtDc3NBdHRyfSBjc3NBdHRyIENTUyBhdHRyaWJ1dGUgb2JqZWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IENTUyBhdHRyaWJ1dGUgcGFyc2VkIGFzIFVpU2VsZWN0b3JcbiAgICovXG4gIHBhcnNlQXR0ciAoY3NzQXR0cikge1xuICAgIGlmIChjc3NBdHRyLnZhbHVlVHlwZSAmJiBjc3NBdHRyLnZhbHVlVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7Y3NzQXR0ci5uYW1lfT0ke2Nzc0F0dHIudmFsdWV9JyBpcyBhbiBpbnZhbGlkIGF0dHJpYnV0ZS4gYCArXG4gICAgICAgIGBPbmx5ICdzdHJpbmcnIGFuZCBlbXB0eSBhdHRyaWJ1dGUgdHlwZXMgYXJlIHN1cHBvcnRlZC4gRm91bmQgJyR7Y3NzQXR0ci52YWx1ZVR5cGV9J2ApO1xuICAgIH1cbiAgICBjb25zdCBhdHRyTmFtZSA9IGFzc2VydEdldEF0dHJOYW1lKGNzc0F0dHIpO1xuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSB0b1NuYWtlQ2FzZShhdHRyTmFtZSk7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGF0IGl0J3MgYSBzdXBwb3J0ZWQgYXR0cmlidXRlXG4gICAgaWYgKCFTVFJfQVRUUlMuaW5jbHVkZXMoYXR0ck5hbWUpICYmICFCT09MRUFOX0FUVFJTLmluY2x1ZGVzKGF0dHJOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHthdHRyTmFtZX0nIGlzIG5vdCBzdXBwb3J0ZWQuIFN1cHBvcnRlZCBhdHRyaWJ1dGVzIGFyZSBgICtcbiAgICAgICAgYCcke1suLi5TVFJfQVRUUlMsIC4uLkJPT0xFQU5fQVRUUlNdLmpvaW4oJywgJyl9J2ApO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIGJvb2xlYW4sIGlmIGl0J3MgYSBib29sZWFuIGF0dHJpYnV0ZVxuICAgIGlmIChCT09MRUFOX0FUVFJTLmluY2x1ZGVzKGF0dHJOYW1lKSkge1xuICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfSgke2Fzc2VydEdldEJvb2woY3NzQXR0cil9KWA7XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlIHBhcnNlIGFzIHN0cmluZ1xuICAgIGxldCB2YWx1ZSA9IGNzc0F0dHIudmFsdWUgfHwgJyc7XG4gICAgaWYgKGF0dHJOYW1lID09PSBSRVNPVVJDRV9JRCkge1xuICAgICAgdmFsdWUgPSB0aGlzLmZvcm1hdElkTG9jYXRvcih2YWx1ZSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1NYXRjaGVzKFwiXCIpYDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNzc0F0dHIub3BlcmF0b3IpIHtcbiAgICAgIGNhc2UgJz0nOlxuICAgICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9KFwiJHt2YWx1ZX1cIilgO1xuICAgICAgY2FzZSAnKj0nOlxuICAgICAgICBpZiAoWydkZXNjcmlwdGlvbicsICd0ZXh0J10uaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfUNvbnRhaW5zKFwiJHt2YWx1ZX1cIilgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1NYXRjaGVzKFwiJHtlc2NhcGVSZWdFeHAodmFsdWUpfVwiKWA7XG4gICAgICBjYXNlICdePSc6XG4gICAgICAgIGlmIChbJ2Rlc2NyaXB0aW9uJywgJ3RleHQnXS5pbmNsdWRlcyhhdHRyTmFtZSkpIHtcbiAgICAgICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9U3RhcnRzV2l0aChcIiR7dmFsdWV9XCIpYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9TWF0Y2hlcyhcIl4ke2VzY2FwZVJlZ0V4cCh2YWx1ZSl9XCIpYDtcbiAgICAgIGNhc2UgJyQ9JzpcbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke2VzY2FwZVJlZ0V4cCh2YWx1ZSl9JFwiKWA7XG4gICAgICBjYXNlICd+PSc6XG4gICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1NYXRjaGVzKFwiJHtnZXRXb3JkTWF0Y2hlclJlZ2V4KHZhbHVlKX1cIilgO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gVW5yZWFjaGFibGUsIGJ1dCBhZGRpbmcgZXJyb3IgaW4gY2FzZSBhIG5ldyBDU1MgYXR0cmlidXRlIGlzIGFkZGVkLlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIENTUyBhdHRyaWJ1dGUgb3BlcmF0b3IgJyR7Y3NzQXR0ci5vcGVyYXRvcn0nLiBgICtcbiAgICAgICAgICBgICc9JywgJyo9JywgJ149JywgJyQ9JyBhbmQgJ349JyBhcmUgc3VwcG9ydGVkLmApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgQ1NTIHBzZXVkbyBjbGFzcyB0byBhIFVpU2VsZWN0b3JcbiAgICpcbiAgICogQHBhcmFtIHtDc3NQc2V1ZG99IGNzc1BzZXVkbyBDU1MgUHNldWRvIGNsYXNzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFBzZXVkbyBzZWxlY3RvciBwYXJzZWQgYXMgVWlTZWxlY3RvclxuICAgKi9cbiAgcGFyc2VQc2V1ZG8gKGNzc1BzZXVkbykge1xuICAgIGlmIChjc3NQc2V1ZG8udmFsdWVUeXBlICYmIGNzc1BzZXVkby52YWx1ZVR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2Nzc1BzZXVkby5uYW1lfT0ke2Nzc1BzZXVkby52YWx1ZX0nLiBgICtcbiAgICAgICAgYFVuc3VwcG9ydGVkIGNzcyBwc2V1ZG8gY2xhc3MgdmFsdWUgdHlwZTogJyR7Y3NzUHNldWRvLnZhbHVlVHlwZX0nLiBPbmx5ICdzdHJpbmcnIHR5cGUgb3IgZW1wdHkgaXMgc3VwcG9ydGVkLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHBzZXVkb05hbWUgPSBhc3NlcnRHZXRBdHRyTmFtZShjc3NQc2V1ZG8pO1xuXG4gICAgaWYgKEJPT0xFQU5fQVRUUlMuaW5jbHVkZXMocHNldWRvTmFtZSkpIHtcbiAgICAgIHJldHVybiBgLiR7dG9TbmFrZUNhc2UocHNldWRvTmFtZSl9KCR7YXNzZXJ0R2V0Qm9vbChjc3NQc2V1ZG8pfSlgO1xuICAgIH1cblxuICAgIGlmIChOVU1FUklDX0FUVFJTLmluY2x1ZGVzKHBzZXVkb05hbWUpKSB7XG4gICAgICByZXR1cm4gYC4ke3BzZXVkb05hbWV9KCR7Y3NzUHNldWRvLnZhbHVlfSlgO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgQ1NTIHJ1bGUgdG8gYSBVaVNlbGVjdG9yXG4gICAqIEBwYXJhbSB7Q3NzUnVsZX0gY3NzUnVsZSBDU1MgcnVsZSBkZWZpbml0aW9uXG4gICAqL1xuICBwYXJzZUNzc1J1bGUgKGNzc1J1bGUpIHtcbiAgICBjb25zdCB7IG5lc3RpbmdPcGVyYXRvciB9ID0gY3NzUnVsZTtcbiAgICBpZiAobmVzdGluZ09wZXJhdG9yICYmIG5lc3RpbmdPcGVyYXRvciAhPT0gJyAnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke25lc3RpbmdPcGVyYXRvcn0nIGlzIG5vdCBhIHN1cHBvcnRlZCBjb21iaW5hdG9yLiBgICtcbiAgICAgICAgYE9ubHkgY2hpbGQgY29tYmluYXRvciAoPikgYW5kIGRlc2NlbmRhbnQgY29tYmluYXRvciBhcmUgc3VwcG9ydGVkLmApO1xuICAgIH1cblxuICAgIGxldCB1aUF1dG9tYXRvclNlbGVjdG9yID0gJ25ldyBVaVNlbGVjdG9yKCknO1xuICAgIGlmIChjc3NSdWxlLnRhZ05hbWUgJiYgY3NzUnVsZS50YWdOYW1lICE9PSAnKicpIHtcbiAgICAgIGxldCBhbmRyb2lkQ2xhc3MgPSBbY3NzUnVsZS50YWdOYW1lXTtcbiAgICAgIGlmIChjc3NSdWxlLmNsYXNzTmFtZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBjc3NDbGFzc05hbWVzIG9mIGNzc1J1bGUuY2xhc3NOYW1lcykge1xuICAgICAgICAgIGFuZHJvaWRDbGFzcy5wdXNoKGNzc0NsYXNzTmFtZXMpO1xuICAgICAgICB9XG4gICAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5jbGFzc05hbWUoXCIke2FuZHJvaWRDbGFzcy5qb2luKCcuJyl9XCIpYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5jbGFzc05hbWVNYXRjaGVzKFwiJHtjc3NSdWxlLnRhZ05hbWV9XCIpYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNzc1J1bGUuY2xhc3NOYW1lcykge1xuICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBgLmNsYXNzTmFtZU1hdGNoZXMoXCIke2Nzc1J1bGUuY2xhc3NOYW1lcy5qb2luKCdcXFxcLicpfVwiKWA7XG4gICAgfVxuICAgIGlmIChjc3NSdWxlLmlkKSB7XG4gICAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IGAucmVzb3VyY2VJZChcIiR7dGhpcy5mb3JtYXRJZExvY2F0b3IoY3NzUnVsZS5pZCl9XCIpYDtcbiAgICB9XG4gICAgaWYgKGNzc1J1bGUuYXR0cnMpIHtcbiAgICAgIGZvciAoY29uc3QgYXR0ciBvZiBjc3NSdWxlLmF0dHJzKSB7XG4gICAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gdGhpcy5wYXJzZUF0dHIoYXR0cik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjc3NSdWxlLnBzZXVkb3MpIHtcbiAgICAgIGZvciAoY29uc3QgcHNldWRvIG9mIGNzc1J1bGUucHNldWRvcykge1xuICAgICAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IHRoaXMucGFyc2VQc2V1ZG8ocHNldWRvKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNzc1J1bGUucnVsZSkge1xuICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBgLmNoaWxkU2VsZWN0b3IoJHt0aGlzLnBhcnNlQ3NzUnVsZShjc3NSdWxlLnJ1bGUpfSlgO1xuICAgIH1cbiAgICByZXR1cm4gdWlBdXRvbWF0b3JTZWxlY3RvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IENTUyBvYmplY3QgdG8gVWlBdXRvbWF0b3IyIHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7Q3NzT2JqZWN0fSBjc3MgQ1NTIG9iamVjdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgQ1NTIG9iamVjdCBwYXJzZWQgYXMgYSBVaVNlbGVjdG9yXG4gICAqL1xuICBwYXJzZUNzc09iamVjdCAoY3NzKSB7XG4gICAgc3dpdGNoIChjc3MudHlwZSkge1xuICAgICAgY2FzZSAncnVsZSc6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQ3NzUnVsZShjc3MpO1xuICAgICAgY2FzZSAncnVsZVNldCc6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQ3NzT2JqZWN0KGNzcy5ydWxlKTtcbiAgICAgIGNhc2UgJ3NlbGVjdG9ycyc6XG4gICAgICAgIHJldHVybiBjc3Muc2VsZWN0b3JzLm1hcCgoc2VsZWN0b3IpID0+IHRoaXMucGFyc2VDc3NPYmplY3Qoc2VsZWN0b3IpKS5qb2luKCc7ICcpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBUaGlzIGlzIG5ldmVyIHJlYWNoYWJsZSwgYnV0IGlmIGl0IGV2ZXIgaXMgZG8gdGhpcy5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVaUF1dG9tYXRvciBkb2VzIG5vdCBzdXBwb3J0ICcke2Nzcy50eXBlfScgY3NzLiBPbmx5IHN1cHBvcnRzICdydWxlJywgJ3J1bGVTZXQnLCAnc2VsZWN0b3JzJyBgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhIENTUyBzZWxlY3RvciB0byBhIFVpQXV0b21hdG9yMiBzZWxlY3RvclxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgQ1NTIHNlbGVjdG9yIGNvbnZlcnRlZCB0byBhIFVpU2VsZWN0b3JcbiAgICovXG4gIHRvVWlBdXRvbWF0b3JTZWxlY3RvciAoKSB7XG4gICAgbGV0IGNzc09iajtcbiAgICB0cnkge1xuICAgICAgY3NzT2JqID0gcGFyc2VyLnBhcnNlKHRoaXMuc2VsZWN0b3IpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFNlbGVjdG9yRXJyb3IoYEludmFsaWQgQ1NTIHNlbGVjdG9yICcke3RoaXMuc2VsZWN0b3J9Jy4gUmVhc29uOiAnJHtlfSdgKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlQ3NzT2JqZWN0KGNzc09iaik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkU2VsZWN0b3JFcnJvcihgVW5zdXBwb3J0ZWQgQ1NTIHNlbGVjdG9yICcke3RoaXMuc2VsZWN0b3J9Jy4gUmVhc29uOiAnJHtlfSdgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ3NzQ29udmVydGVyOyJdLCJmaWxlIjoibGliL2Nzcy1jb252ZXJ0ZXIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==