@adobe/helix-rum-enhancer 2.38.0 → 2.39.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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ # [2.39.0](https://github.com/adobe/helix-rum-enhancer/compare/v2.38.0...v2.39.0) (2025-07-28)
2
+
3
+
4
+ ### Features
5
+
6
+ * **a11y:** introduce granular a11y level detection ([0f7a4ba](https://github.com/adobe/helix-rum-enhancer/commit/0f7a4bae5148fdb99c46ab122b630ca9ec06ce01))
7
+ * **a11y:** introduce granular a11y level detection ([e8dfcca](https://github.com/adobe/helix-rum-enhancer/commit/e8dfcca547990eb985d1705db2f5752689858db1))
8
+ * **a11y:** introduce granular a11y level detection ([39dc433](https://github.com/adobe/helix-rum-enhancer/commit/39dc433f74a3d9f6b1a241b6770e2759ce2313de))
9
+
1
10
  # [2.38.0](https://github.com/adobe/helix-rum-enhancer/compare/v2.37.1...v2.38.0) (2025-07-23)
2
11
 
3
12
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adobe/helix-rum-enhancer",
3
- "version": "2.38.0",
3
+ "version": "2.39.0",
4
4
  "description": "Helix RUM Enhancer",
5
5
  "main": "src/index.js",
6
6
  "type": "module",
package/plugins/a11y.js CHANGED
@@ -10,13 +10,18 @@
10
10
  * governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- const MEDIA_QUERY_PREFERENCES = [
14
- '(prefers-reduced-motion: reduce)',
15
- '(prefers-contrast: high)',
16
- '(prefers-contrast: more)',
17
- '(forced-colors: active)',
18
- '(prefers-reduced-transparency: reduce)',
19
- ];
13
+ const A_WEIGHT = 1;
14
+ const AA_WEIGHT = 2;
15
+ const AAA_WEIGHT = 4;
16
+
17
+ const PREFERENCE_WEIGHTS = {
18
+ '(prefers-reduced-motion: reduce)': A_WEIGHT,
19
+ '(prefers-contrast: more)': AA_WEIGHT,
20
+ '(prefers-contrast: high)': AA_WEIGHT,
21
+ '(forced-colors: active)': AAA_WEIGHT,
22
+ '(-ms-high-contrast: active)': AAA_WEIGHT,
23
+ '(prefers-reduced-transparency: reduce)': A_WEIGHT,
24
+ };
20
25
 
21
26
  const KEYBOARD_RELEVANT_KEYS = [
22
27
  'Tab', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Enter', ' ', 'Escape',
@@ -67,8 +72,15 @@ export default function addAccessibilityAudienceTracking({ sampleRUM, sourceSele
67
72
  return;
68
73
  }
69
74
  reported = true;
70
- const audience = score >= 1 ? 'on' : 'off';
71
- sampleRUM('a11y', { source: audience, target: 'on:off' });
75
+ let audience = 'off';
76
+ if (score > 7) {
77
+ audience = 'high';
78
+ } else if (score >= 4) {
79
+ audience = 'medium';
80
+ } else if (score >= 1) {
81
+ audience = 'low';
82
+ }
83
+ sampleRUM('a11y', { source: audience, target: 'off:low:medium:high' });
72
84
  };
73
85
 
74
86
  const reportFocusTrap = (trapType, elements) => {
@@ -127,6 +139,7 @@ export default function addAccessibilityAudienceTracking({ sampleRUM, sourceSele
127
139
  if (focusHistory.length >= minSeqLength) {
128
140
  for (let seqLength = 2; seqLength <= 4; seqLength += 1) {
129
141
  if (detectRepeatingSequence(elements, seqLength)) {
142
+ /* c8 ignore next 4 */
130
143
  return;
131
144
  }
132
145
  }
@@ -156,24 +169,32 @@ export default function addAccessibilityAudienceTracking({ sampleRUM, sourceSele
156
169
  const checkBehavioralScore = () => {
157
170
  if (totalCount >= BEHAVIORAL_MIN_EVENTS && !reported) {
158
171
  if (keyboardCount / totalCount > 0.7) {
159
- score += 2;
172
+ score += AAA_WEIGHT;
160
173
  }
161
174
  reportAudience();
162
175
  }
163
176
  };
164
177
 
165
178
  // --- Static Scoring ---
166
- score += MEDIA_QUERY_PREFERENCES.filter((q) => window.matchMedia(q).matches).length;
179
+ Object.entries(PREFERENCE_WEIGHTS).forEach(([query, queryWeight]) => {
180
+ if (window.matchMedia(query).matches) {
181
+ score += queryWeight;
182
+ }
183
+ });
167
184
 
168
185
  const zoom = getZoom();
169
186
  if (zoom >= HIGH_ZOOM_LEVEL) {
170
- score += 3;
187
+ score += AA_WEIGHT;
171
188
  } else if (zoom >= MEDIUM_ZOOM_LEVEL) {
172
- score += 2;
189
+ score += A_WEIGHT;
173
190
  }
174
191
 
175
192
  if (navigator.maxTouchPoints === 0 && window.matchMedia('(pointer: coarse)').matches) {
176
- score += 2;
193
+ score += AA_WEIGHT;
194
+ }
195
+
196
+ if (window.matchMedia('(hover: none)').matches) {
197
+ score += AA_WEIGHT;
177
198
  }
178
199
 
179
200
  // --- Event Listeners & Observers ---
@@ -219,7 +240,7 @@ export default function addAccessibilityAudienceTracking({ sampleRUM, sourceSele
219
240
  focusLossObserver.observe(document, { childList: true, subtree: true });
220
241
 
221
242
  // --- Final Reporting ---
222
- if (score >= 1) {
243
+ if (score >= 7) {
223
244
  reportAudience();
224
245
  } else {
225
246
  setTimeout(
@@ -9,7 +9,17 @@
9
9
  * OF ANY KIND, either express or implied. See the License for the specific language
10
10
  * governing permissions and limitations under the License.
11
11
  */
12
- const MEDIA_QUERY_PREFERENCES = ['(prefers-reduced-motion: reduce)', '(prefers-contrast: high)', '(prefers-contrast: more)', '(forced-colors: active)', '(prefers-reduced-transparency: reduce)'];
12
+ const A_WEIGHT = 1;
13
+ const AA_WEIGHT = 2;
14
+ const AAA_WEIGHT = 4;
15
+ const PREFERENCE_WEIGHTS = {
16
+ '(prefers-reduced-motion: reduce)': A_WEIGHT,
17
+ '(prefers-contrast: more)': AA_WEIGHT,
18
+ '(prefers-contrast: high)': AA_WEIGHT,
19
+ '(forced-colors: active)': AAA_WEIGHT,
20
+ '(-ms-high-contrast: active)': AAA_WEIGHT,
21
+ '(prefers-reduced-transparency: reduce)': A_WEIGHT
22
+ };
13
23
  const KEYBOARD_RELEVANT_KEYS = ['Tab', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Enter', ' ', 'Escape'];
14
24
  const HIGH_ZOOM_LEVEL = 200;
15
25
  const MEDIUM_ZOOM_LEVEL = 125;
@@ -41,10 +51,17 @@ function addAccessibilityAudienceTracking({
41
51
  return;
42
52
  }
43
53
  reported = true;
44
- const audience = score >= 1 ? 'on' : 'off';
54
+ let audience = 'off';
55
+ if (score > 7) {
56
+ audience = 'high';
57
+ } else if (score >= 4) {
58
+ audience = 'medium';
59
+ } else if (score >= 1) {
60
+ audience = 'low';
61
+ }
45
62
  sampleRUM('a11y', {
46
63
  source: audience,
47
- target: 'on:off'
64
+ target: 'off:low:medium:high'
48
65
  });
49
66
  };
50
67
  const reportFocusTrap = (trapType, elements) => {
@@ -122,20 +139,27 @@ function addAccessibilityAudienceTracking({
122
139
  const checkBehavioralScore = () => {
123
140
  if (totalCount >= BEHAVIORAL_MIN_EVENTS && !reported) {
124
141
  if (keyboardCount / totalCount > 0.7) {
125
- score += 2;
142
+ score += AAA_WEIGHT;
126
143
  }
127
144
  reportAudience();
128
145
  }
129
146
  };
130
- score += MEDIA_QUERY_PREFERENCES.filter(q => window.matchMedia(q).matches).length;
147
+ Object.entries(PREFERENCE_WEIGHTS).forEach(([query, queryWeight]) => {
148
+ if (window.matchMedia(query).matches) {
149
+ score += queryWeight;
150
+ }
151
+ });
131
152
  const zoom = getZoom();
132
153
  if (zoom >= HIGH_ZOOM_LEVEL) {
133
- score += 3;
154
+ score += AA_WEIGHT;
134
155
  } else if (zoom >= MEDIUM_ZOOM_LEVEL) {
135
- score += 2;
156
+ score += A_WEIGHT;
136
157
  }
137
158
  if (navigator.maxTouchPoints === 0 && window.matchMedia('(pointer: coarse)').matches) {
138
- score += 2;
159
+ score += AA_WEIGHT;
160
+ }
161
+ if (window.matchMedia('(hover: none)').matches) {
162
+ score += AA_WEIGHT;
139
163
  }
140
164
  document.addEventListener('keydown', event => {
141
165
  if (KEYBOARD_RELEVANT_KEYS.includes(event.key)) {
@@ -171,7 +195,7 @@ function addAccessibilityAudienceTracking({
171
195
  childList: true,
172
196
  subtree: true
173
197
  });
174
- if (score >= 1) {
198
+ if (score >= 7) {
175
199
  reportAudience();
176
200
  } else {
177
201
  setTimeout(() => reportAudience(), window.hlx.A11Y_REPORT_DELAY || 10_000);
@@ -9,7 +9,17 @@
9
9
  * OF ANY KIND, either express or implied. See the License for the specific language
10
10
  * governing permissions and limitations under the License.
11
11
  */
12
- const MEDIA_QUERY_PREFERENCES = ['(prefers-reduced-motion: reduce)', '(prefers-contrast: high)', '(prefers-contrast: more)', '(forced-colors: active)', '(prefers-reduced-transparency: reduce)'];
12
+ const A_WEIGHT = 1;
13
+ const AA_WEIGHT = 2;
14
+ const AAA_WEIGHT = 4;
15
+ const PREFERENCE_WEIGHTS = {
16
+ '(prefers-reduced-motion: reduce)': A_WEIGHT,
17
+ '(prefers-contrast: more)': AA_WEIGHT,
18
+ '(prefers-contrast: high)': AA_WEIGHT,
19
+ '(forced-colors: active)': AAA_WEIGHT,
20
+ '(-ms-high-contrast: active)': AAA_WEIGHT,
21
+ '(prefers-reduced-transparency: reduce)': A_WEIGHT
22
+ };
13
23
  const KEYBOARD_RELEVANT_KEYS = ['Tab', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Enter', ' ', 'Escape'];
14
24
  const HIGH_ZOOM_LEVEL = 200;
15
25
  const MEDIUM_ZOOM_LEVEL = 125;
@@ -41,10 +51,17 @@ function addAccessibilityAudienceTracking({
41
51
  return;
42
52
  }
43
53
  reported = true;
44
- const audience = score >= 1 ? 'on' : 'off';
54
+ let audience = 'off';
55
+ if (score > 7) {
56
+ audience = 'high';
57
+ } else if (score >= 4) {
58
+ audience = 'medium';
59
+ } else if (score >= 1) {
60
+ audience = 'low';
61
+ }
45
62
  sampleRUM('a11y', {
46
63
  source: audience,
47
- target: 'on:off'
64
+ target: 'off:low:medium:high'
48
65
  });
49
66
  };
50
67
  const reportFocusTrap = (trapType, elements) => {
@@ -122,20 +139,27 @@ function addAccessibilityAudienceTracking({
122
139
  const checkBehavioralScore = () => {
123
140
  if (totalCount >= BEHAVIORAL_MIN_EVENTS && !reported) {
124
141
  if (keyboardCount / totalCount > 0.7) {
125
- score += 2;
142
+ score += AAA_WEIGHT;
126
143
  }
127
144
  reportAudience();
128
145
  }
129
146
  };
130
- score += MEDIA_QUERY_PREFERENCES.filter(q => window.matchMedia(q).matches).length;
147
+ Object.entries(PREFERENCE_WEIGHTS).forEach(([query, queryWeight]) => {
148
+ if (window.matchMedia(query).matches) {
149
+ score += queryWeight;
150
+ }
151
+ });
131
152
  const zoom = getZoom();
132
153
  if (zoom >= HIGH_ZOOM_LEVEL) {
133
- score += 3;
154
+ score += AA_WEIGHT;
134
155
  } else if (zoom >= MEDIUM_ZOOM_LEVEL) {
135
- score += 2;
156
+ score += A_WEIGHT;
136
157
  }
137
158
  if (navigator.maxTouchPoints === 0 && window.matchMedia('(pointer: coarse)').matches) {
138
- score += 2;
159
+ score += AA_WEIGHT;
160
+ }
161
+ if (window.matchMedia('(hover: none)').matches) {
162
+ score += AA_WEIGHT;
139
163
  }
140
164
  document.addEventListener('keydown', event => {
141
165
  if (KEYBOARD_RELEVANT_KEYS.includes(event.key)) {
@@ -171,7 +195,7 @@ function addAccessibilityAudienceTracking({
171
195
  childList: true,
172
196
  subtree: true
173
197
  });
174
- if (score >= 1) {
198
+ if (score >= 7) {
175
199
  reportAudience();
176
200
  } else {
177
201
  setTimeout(() => reportAudience(), window.hlx.A11Y_REPORT_DELAY || 10_000);
@@ -179,4 +203,4 @@ function addAccessibilityAudienceTracking({
179
203
  }
180
204
 
181
205
  export { addAccessibilityAudienceTracking as default };
182
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYTExeS5tYXAuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3BsdWdpbnMvYTExeS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMjQgQWRvYmUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weVxuICogb2YgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlclxuICogdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TXG4gKiBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2VcbiAqIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuY29uc3QgTUVESUFfUVVFUllfUFJFRkVSRU5DRVMgPSBbXG4gICcocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKScsXG4gICcocHJlZmVycy1jb250cmFzdDogaGlnaCknLFxuICAnKHByZWZlcnMtY29udHJhc3Q6IG1vcmUpJyxcbiAgJyhmb3JjZWQtY29sb3JzOiBhY3RpdmUpJyxcbiAgJyhwcmVmZXJzLXJlZHVjZWQtdHJhbnNwYXJlbmN5OiByZWR1Y2UpJyxcbl07XG5cbmNvbnN0IEtFWUJPQVJEX1JFTEVWQU5UX0tFWVMgPSBbXG4gICdUYWInLCAnQXJyb3dVcCcsICdBcnJvd0Rvd24nLCAnQXJyb3dMZWZ0JywgJ0Fycm93UmlnaHQnLCAnRW50ZXInLCAnICcsICdFc2NhcGUnLFxuXTtcblxuY29uc3QgSElHSF9aT09NX0xFVkVMID0gMjAwO1xuY29uc3QgTUVESVVNX1pPT01fTEVWRUwgPSAxMjU7XG5cbmNvbnN0IEJFSEFWSU9SQUxfTUlOX0VWRU5UUyA9IDEwO1xuXG5jb25zdCBGT0NVU1RSQVBfTUFYX0hJU1RPUlkgPSAyNTtcbmNvbnN0IEZPQ1VTX1RSQVBfTUlOX0hJU1RPUlkgPSA0O1xuY29uc3QgRk9DVVNfVFJBUF9QSU5HX1BPTkdfRFVSQVRJT04gPSAzMDAwO1xuY29uc3QgRk9DVVNfVFJBUF9NSU5fUkVQRUFUUyA9IDM7XG5cbi8qKlxuICogRGV0ZWN0cyBhcHByb3hpbWF0ZSB6b29tIGxldmVsIHVzaW5nIHRoZSBWaXN1YWwgVmlld3BvcnQgQVBJLlxuICogVGhpcyBpcyBhIHB1cmUgdXRpbGl0eSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IEVzdGltYXRlZCB6b29tIHBlcmNlbnRhZ2UuXG4gKi9cbmZ1bmN0aW9uIGdldFpvb20oKSB7XG4gIGlmICh3aW5kb3cudmlzdWFsVmlld3BvcnQgJiYgd2luZG93LnZpc3VhbFZpZXdwb3J0LndpZHRoID4gMCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKCh3aW5kb3cuaW5uZXJXaWR0aCAvIHdpbmRvdy52aXN1YWxWaWV3cG9ydC53aWR0aCkgKiAxMDApO1xuICB9XG4gIC8qIGM4IGlnbm9yZSBuZXh0IDEgKi9cbiAgcmV0dXJuIDEwMDtcbn1cblxuLyoqXG4gKiBNaW5pbWFsIGFjY2Vzc2liaWxpdHkgYXVkaWVuY2UgZGV0ZWN0aW9uIHBsdWdpbiBmb3IgaGVsaXgtcnVtLWVuaGFuY2VyLlxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBQbHVnaW4gcGFyYW1ldGVycyBmcm9tIGVuaGFuY2VyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyYW1zLnNhbXBsZVJVTSBSVU0gdHJhY2tpbmcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXJhbXMuc291cmNlU2VsZWN0b3IgRnVuY3Rpb24gdG8gZ2VuZXJhdGUgYSBzZWxlY3RvciBmb3IgYW4gZWxlbWVudC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYWRkQWNjZXNzaWJpbGl0eUF1ZGllbmNlVHJhY2tpbmcoeyBzYW1wbGVSVU0sIHNvdXJjZVNlbGVjdG9yIH0pIHtcbiAgY29uc3QgZm9jdXNIaXN0b3J5ID0gW107XG4gIGxldCBzY29yZSA9IDA7XG4gIGxldCByZXBvcnRlZCA9IGZhbHNlO1xuICBsZXQgZm9jdXNUcmFwRGV0ZWN0ZWQgPSBmYWxzZTtcbiAgbGV0IGtleWJvYXJkQ291bnQgPSAwO1xuICBsZXQgdG90YWxDb3VudCA9IDA7XG4gIGxldCBsYXN0Rm9jdXNUaW1lID0gMDtcbiAgbGV0IGhhZE1lYW5pbmdmdWxGb2N1cyA9IGZhbHNlO1xuXG4gIGNvbnN0IHJlcG9ydEF1ZGllbmNlID0gKCkgPT4ge1xuICAgIC8qIGM4IGlnbm9yZSBuZXh0IDMgKi9cbiAgICBpZiAocmVwb3J0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVwb3J0ZWQgPSB0cnVlO1xuICAgIGNvbnN0IGF1ZGllbmNlID0gc2NvcmUgPj0gMSA/ICdvbicgOiAnb2ZmJztcbiAgICBzYW1wbGVSVU0oJ2ExMXknLCB7IHNvdXJjZTogYXVkaWVuY2UsIHRhcmdldDogJ29uOm9mZicgfSk7XG4gIH07XG5cbiAgY29uc3QgcmVwb3J0Rm9jdXNUcmFwID0gKHRyYXBUeXBlLCBlbGVtZW50cykgPT4ge1xuICAgIC8qIGM4IGlnbm9yZSBuZXh0IDMgKi9cbiAgICBpZiAoZm9jdXNUcmFwRGV0ZWN0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9jdXNUcmFwRGV0ZWN0ZWQgPSB0cnVlO1xuICAgIGNvbnN0IGVsZW1lbnREZXNjcmlwdGlvbnMgPSBlbGVtZW50cy5zbGljZSgwLCAzKS5tYXAoc291cmNlU2VsZWN0b3IpO1xuICAgIHNhbXBsZVJVTSgnZXJyb3InLCB7XG4gICAgICBzb3VyY2U6IGBmb2N1cy10cmFwOiR7dHJhcFR5cGV9YCxcbiAgICAgIHRhcmdldDogZWxlbWVudERlc2NyaXB0aW9ucy5qb2luKCcsICcpLFxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGRldGVjdFJlcGVhdGluZ1NlcXVlbmNlID0gKGVsZW1lbnRzLCBzZXFMZW5ndGgpID0+IHtcbiAgICBjb25zdCB0b3RhbExlbmd0aCA9IHNlcUxlbmd0aCAqIEZPQ1VTX1RSQVBfTUlOX1JFUEVBVFM7XG4gICAgLyogYzggaWdub3JlIG5leHQgMyAqL1xuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPCB0b3RhbExlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCByZWNlbnQgPSBlbGVtZW50cy5zbGljZSgtdG90YWxMZW5ndGgpO1xuICAgIGNvbnN0IGJhc2VTZXF1ZW5jZSA9IHJlY2VudC5zbGljZSgwLCBzZXFMZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgRk9DVVNfVFJBUF9NSU5fUkVQRUFUUzsgaSArPSAxKSB7XG4gICAgICBjb25zdCBuZXh0U2VxdWVuY2UgPSByZWNlbnQuc2xpY2UoaSAqIHNlcUxlbmd0aCwgKGkgKyAxKSAqIHNlcUxlbmd0aCk7XG4gICAgICBpZiAobmV4dFNlcXVlbmNlLmxlbmd0aCAhPT0gc2VxTGVuZ3RoXG4gICAgICAgIHx8ICFuZXh0U2VxdWVuY2UuZXZlcnkoKGVsLCBqKSA9PiBlbCA9PT0gYmFzZVNlcXVlbmNlW2pdKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJlcG9ydEZvY3VzVHJhcCgnc2VxdWVuY2UnLCBiYXNlU2VxdWVuY2UpO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIGNvbnN0IGRldGVjdEZvY3VzVHJhcCA9ICgpID0+IHtcbiAgICBpZiAoZm9jdXNIaXN0b3J5Lmxlbmd0aCA8IEZPQ1VTX1RSQVBfTUlOX0hJU1RPUlkgfHwgZm9jdXNUcmFwRGV0ZWN0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZWxlbWVudHMgPSBmb2N1c0hpc3RvcnkubWFwKChoKSA9PiBoLmVsZW1lbnQpO1xuICAgIGNvbnN0IHRpbWVzdGFtcHMgPSBmb2N1c0hpc3RvcnkubWFwKChoKSA9PiBoLnRpbWVzdGFtcCk7XG5cbiAgICBpZiAoZWxlbWVudHMuc2xpY2UoLTMpLmV2ZXJ5KChlbCkgPT4gZWwgPT09IGVsZW1lbnRzW2VsZW1lbnRzLmxlbmd0aCAtIDFdKSkge1xuICAgICAgcmVwb3J0Rm9jdXNUcmFwKCdzaW5nbGUnLCBbZWxlbWVudHNbZWxlbWVudHMubGVuZ3RoIC0gMV1dKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWNlbnQ0ID0gZWxlbWVudHMuc2xpY2UoLTQpO1xuICAgIGNvbnN0IHVuaXF1ZSA9IFsuLi5uZXcgU2V0KHJlY2VudDQpXTtcbiAgICBjb25zdCB0aW1lRGlmZiA9IHRpbWVzdGFtcHNbdGltZXN0YW1wcy5sZW5ndGggLSAxXSAtIHRpbWVzdGFtcHNbdGltZXN0YW1wcy5sZW5ndGggLSA0XTtcbiAgICBpZiAodW5pcXVlLmxlbmd0aCA9PT0gMiAmJiB0aW1lRGlmZiA8IEZPQ1VTX1RSQVBfUElOR19QT05HX0RVUkFUSU9OKSB7XG4gICAgICByZXBvcnRGb2N1c1RyYXAoJ3BpbmctcG9uZycsIHVuaXF1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWluU2VxTGVuZ3RoID0gMiAqIEZPQ1VTX1RSQVBfTUlOX0hJU1RPUlkgKyAxO1xuICAgIGlmIChmb2N1c0hpc3RvcnkubGVuZ3RoID49IG1pblNlcUxlbmd0aCkge1xuICAgICAgZm9yIChsZXQgc2VxTGVuZ3RoID0gMjsgc2VxTGVuZ3RoIDw9IDQ7IHNlcUxlbmd0aCArPSAxKSB7XG4gICAgICAgIGlmIChkZXRlY3RSZXBlYXRpbmdTZXF1ZW5jZShlbGVtZW50cywgc2VxTGVuZ3RoKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCB0cmFja0ZvY3VzRm9yVHJhcCA9IChldmVudCkgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgeyBhY3RpdmVFbGVtZW50IH0gPSBkb2N1bWVudDtcbiAgICAgIC8qIGM4IGlnbm9yZSBuZXh0IDMgKi9cbiAgICAgIGlmICghYWN0aXZlRWxlbWVudCB8fCBhY3RpdmVFbGVtZW50ID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvY3VzSGlzdG9yeS5wdXNoKHtcbiAgICAgICAgZWxlbWVudDogYWN0aXZlRWxlbWVudCxcbiAgICAgICAgdGltZXN0YW1wOiBwZXJmb3JtYW5jZS5ub3coKSxcbiAgICAgICAgc2hpZnRLZXk6IGV2ZW50LnNoaWZ0S2V5LFxuICAgICAgfSk7XG4gICAgICAvKiBjOCBpZ25vcmUgbmV4dCAzICovXG4gICAgICBpZiAoZm9jdXNIaXN0b3J5Lmxlbmd0aCA+IEZPQ1VTVFJBUF9NQVhfSElTVE9SWSkge1xuICAgICAgICBmb2N1c0hpc3Rvcnkuc2hpZnQoKTtcbiAgICAgIH1cbiAgICAgIGRldGVjdEZvY3VzVHJhcCgpO1xuICAgIH0sIDApO1xuICB9O1xuXG4gIGNvbnN0IGNoZWNrQmVoYXZpb3JhbFNjb3JlID0gKCkgPT4ge1xuICAgIGlmICh0b3RhbENvdW50ID49IEJFSEFWSU9SQUxfTUlOX0VWRU5UUyAmJiAhcmVwb3J0ZWQpIHtcbiAgICAgIGlmIChrZXlib2FyZENvdW50IC8gdG90YWxDb3VudCA+IDAuNykge1xuICAgICAgICBzY29yZSArPSAyO1xuICAgICAgfVxuICAgICAgcmVwb3J0QXVkaWVuY2UoKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gLS0tIFN0YXRpYyBTY29yaW5nIC0tLVxuICBzY29yZSArPSBNRURJQV9RVUVSWV9QUkVGRVJFTkNFUy5maWx0ZXIoKHEpID0+IHdpbmRvdy5tYXRjaE1lZGlhKHEpLm1hdGNoZXMpLmxlbmd0aDtcblxuICBjb25zdCB6b29tID0gZ2V0Wm9vbSgpO1xuICBpZiAoem9vbSA+PSBISUdIX1pPT01fTEVWRUwpIHtcbiAgICBzY29yZSArPSAzO1xuICB9IGVsc2UgaWYgKHpvb20gPj0gTUVESVVNX1pPT01fTEVWRUwpIHtcbiAgICBzY29yZSArPSAyO1xuICB9XG5cbiAgaWYgKG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA9PT0gMCAmJiB3aW5kb3cubWF0Y2hNZWRpYSgnKHBvaW50ZXI6IGNvYXJzZSknKS5tYXRjaGVzKSB7XG4gICAgc2NvcmUgKz0gMjtcbiAgfVxuXG4gIC8vIC0tLSBFdmVudCBMaXN0ZW5lcnMgJiBPYnNlcnZlcnMgLS0tXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcbiAgICBpZiAoS0VZQk9BUkRfUkVMRVZBTlRfS0VZUy5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICBrZXlib2FyZENvdW50ICs9IDE7XG4gICAgICB0b3RhbENvdW50ICs9IDE7XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnVGFiJykge1xuICAgICAgICB0cmFja0ZvY3VzRm9yVHJhcChldmVudCk7XG4gICAgICB9XG4gICAgICBjaGVja0JlaGF2aW9yYWxTY29yZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgdG90YWxDb3VudCArPSAxO1xuICAgIGNoZWNrQmVoYXZpb3JhbFNjb3JlKCk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCAoZXZlbnQpID0+IHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICBsYXN0Rm9jdXNUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICBoYWRNZWFuaW5nZnVsRm9jdXMgPSB0cnVlO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgZm9jdXNMb3NzT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG4gICAgaWYgKGhhZE1lYW5pbmdmdWxGb2N1c1xuICAgICAgICAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBkb2N1bWVudC5ib2R5XG4gICAgICAgICYmIChwZXJmb3JtYW5jZS5ub3coKSAtIGxhc3RGb2N1c1RpbWUgPiAxMDApKSB7XG4gICAgICAvKiBjOCBpZ25vcmUgbmV4dCA5ICovXG4gICAgICBjb25zdCBtdXRhdGlvbiA9IG11dGF0aW9ucy5maW5kKChtKSA9PiAoXG4gICAgICAgIG0udHlwZSA9PT0gJ2NoaWxkTGlzdCcgJiYgKG0uYWRkZWROb2Rlcy5sZW5ndGggPiAwIHx8IG0ucmVtb3ZlZE5vZGVzLmxlbmd0aCA+IDApXG4gICAgICApKTtcbiAgICAgIHNhbXBsZVJVTSgnZXJyb3InLCB7XG4gICAgICAgIHNvdXJjZTogJ2ZvY3VzLWxvc3MnLFxuICAgICAgICB0YXJnZXQ6IHNvdXJjZVNlbGVjdG9yKG11dGF0aW9uPy50YXJnZXQpLFxuICAgICAgfSk7XG4gICAgICBoYWRNZWFuaW5nZnVsRm9jdXMgPSBmYWxzZTsgLy8gUHJldmVudCBzcGFtXG4gICAgfVxuICB9KTtcblxuICBmb2N1c0xvc3NPYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcblxuICAvLyAtLS0gRmluYWwgUmVwb3J0aW5nIC0tLVxuICBpZiAoc2NvcmUgPj0gMSkge1xuICAgIHJlcG9ydEF1ZGllbmNlKCk7XG4gIH0gZWxzZSB7XG4gICAgc2V0VGltZW91dChcbiAgICAgICgpID0+IHJlcG9ydEF1ZGllbmNlKCksXG4gICAgICAvKiBjOCBpZ25vcmUgbmV4dCAxICovXG4gICAgICB3aW5kb3cuaGx4LkExMVlfUkVQT1JUX0RFTEFZIHx8IDEwXzAwMCxcbiAgICApO1xuICB9XG59XG4iXSwibmFtZXMiOlsiTUVESUFfUVVFUllfUFJFRkVSRU5DRVMiLCJLRVlCT0FSRF9SRUxFVkFOVF9LRVlTIiwiSElHSF9aT09NX0xFVkVMIiwiTUVESVVNX1pPT01fTEVWRUwiLCJCRUhBVklPUkFMX01JTl9FVkVOVFMiLCJGT0NVU1RSQVBfTUFYX0hJU1RPUlkiLCJGT0NVU19UUkFQX01JTl9ISVNUT1JZIiwiRk9DVVNfVFJBUF9QSU5HX1BPTkdfRFVSQVRJT04iLCJGT0NVU19UUkFQX01JTl9SRVBFQVRTIiwiZ2V0Wm9vbSIsIndpbmRvdyIsInZpc3VhbFZpZXdwb3J0Iiwid2lkdGgiLCJNYXRoIiwicm91bmQiLCJpbm5lcldpZHRoIiwiYWRkQWNjZXNzaWJpbGl0eUF1ZGllbmNlVHJhY2tpbmciLCJzYW1wbGVSVU0iLCJzb3VyY2VTZWxlY3RvciIsImZvY3VzSGlzdG9yeSIsInNjb3JlIiwicmVwb3J0ZWQiLCJmb2N1c1RyYXBEZXRlY3RlZCIsImtleWJvYXJkQ291bnQiLCJ0b3RhbENvdW50IiwibGFzdEZvY3VzVGltZSIsImhhZE1lYW5pbmdmdWxGb2N1cyIsInJlcG9ydEF1ZGllbmNlIiwiYXVkaWVuY2UiLCJzb3VyY2UiLCJ0YXJnZXQiLCJyZXBvcnRGb2N1c1RyYXAiLCJ0cmFwVHlwZSIsImVsZW1lbnRzIiwiZWxlbWVudERlc2NyaXB0aW9ucyIsInNsaWNlIiwibWFwIiwiam9pbiIsImRldGVjdFJlcGVhdGluZ1NlcXVlbmNlIiwic2VxTGVuZ3RoIiwidG90YWxMZW5ndGgiLCJsZW5ndGgiLCJyZWNlbnQiLCJiYXNlU2VxdWVuY2UiLCJpIiwibmV4dFNlcXVlbmNlIiwiZXZlcnkiLCJlbCIsImoiLCJkZXRlY3RGb2N1c1RyYXAiLCJoIiwiZWxlbWVudCIsInRpbWVzdGFtcHMiLCJ0aW1lc3RhbXAiLCJyZWNlbnQ0IiwidW5pcXVlIiwiU2V0IiwidGltZURpZmYiLCJtaW5TZXFMZW5ndGgiLCJ0cmFja0ZvY3VzRm9yVHJhcCIsImV2ZW50Iiwic2V0VGltZW91dCIsImFjdGl2ZUVsZW1lbnQiLCJkb2N1bWVudCIsImJvZHkiLCJwdXNoIiwicGVyZm9ybWFuY2UiLCJub3ciLCJzaGlmdEtleSIsInNoaWZ0IiwiY2hlY2tCZWhhdmlvcmFsU2NvcmUiLCJmaWx0ZXIiLCJxIiwibWF0Y2hNZWRpYSIsIm1hdGNoZXMiLCJ6b29tIiwibmF2aWdhdG9yIiwibWF4VG91Y2hQb2ludHMiLCJhZGRFdmVudExpc3RlbmVyIiwiaW5jbHVkZXMiLCJrZXkiLCJmb2N1c0xvc3NPYnNlcnZlciIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJtdXRhdGlvbnMiLCJtdXRhdGlvbiIsImZpbmQiLCJtIiwidHlwZSIsImFkZGVkTm9kZXMiLCJyZW1vdmVkTm9kZXMiLCJvYnNlcnZlIiwiY2hpbGRMaXN0Iiwic3VidHJlZSIsImhseCIsIkExMVlfUkVQT1JUX0RFTEFZIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQVlBLE1BQU1BLHVCQUF1QixHQUFHLENBQzlCLGtDQUFrQyxFQUNsQywwQkFBMEIsRUFDMUIsMEJBQTBCLEVBQzFCLHlCQUF5QixFQUN6Qix3Q0FBd0MsQ0FDekM7QUFFRCxNQUFNQyxzQkFBc0IsR0FBRyxDQUM3QixLQUFLLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUNqRjtBQUVELE1BQU1DLGVBQWUsR0FBRyxHQUFHO0FBQzNCLE1BQU1DLGlCQUFpQixHQUFHLEdBQUc7QUFFN0IsTUFBTUMscUJBQXFCLEdBQUcsRUFBRTtBQUVoQyxNQUFNQyxxQkFBcUIsR0FBRyxFQUFFO0FBQ2hDLE1BQU1DLHNCQUFzQixHQUFHLENBQUM7QUFDaEMsTUFBTUMsNkJBQTZCLEdBQUcsSUFBSTtBQUMxQyxNQUFNQyxzQkFBc0IsR0FBRyxDQUFDO0FBT2hDLFNB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
206
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYTExeS5tYXAuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3BsdWdpbnMvYTExeS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMjQgQWRvYmUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weVxuICogb2YgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlclxuICogdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TXG4gKiBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2VcbiAqIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuY29uc3QgQV9XRUlHSFQgPSAxO1xuY29uc3QgQUFfV0VJR0hUID0gMjtcbmNvbnN0IEFBQV9XRUlHSFQgPSA0O1xuXG5jb25zdCBQUkVGRVJFTkNFX1dFSUdIVFMgPSB7XG4gICcocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSc6IEFfV0VJR0hULFxuICAnKHByZWZlcnMtY29udHJhc3Q6IG1vcmUpJzogQUFfV0VJR0hULFxuICAnKHByZWZlcnMtY29udHJhc3Q6IGhpZ2gpJzogQUFfV0VJR0hULFxuICAnKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSknOiBBQUFfV0VJR0hULFxuICAnKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpJzogQUFBX1dFSUdIVCxcbiAgJyhwcmVmZXJzLXJlZHVjZWQtdHJhbnNwYXJlbmN5OiByZWR1Y2UpJzogQV9XRUlHSFQsXG59O1xuXG5jb25zdCBLRVlCT0FSRF9SRUxFVkFOVF9LRVlTID0gW1xuICAnVGFiJywgJ0Fycm93VXAnLCAnQXJyb3dEb3duJywgJ0Fycm93TGVmdCcsICdBcnJvd1JpZ2h0JywgJ0VudGVyJywgJyAnLCAnRXNjYXBlJyxcbl07XG5cbmNvbnN0IEhJR0hfWk9PTV9MRVZFTCA9IDIwMDtcbmNvbnN0IE1FRElVTV9aT09NX0xFVkVMID0gMTI1O1xuXG5jb25zdCBCRUhBVklPUkFMX01JTl9FVkVOVFMgPSAxMDtcblxuY29uc3QgRk9DVVNUUkFQX01BWF9ISVNUT1JZID0gMjU7XG5jb25zdCBGT0NVU19UUkFQX01JTl9ISVNUT1JZID0gNDtcbmNvbnN0IEZPQ1VTX1RSQVBfUElOR19QT05HX0RVUkFUSU9OID0gMzAwMDtcbmNvbnN0IEZPQ1VTX1RSQVBfTUlOX1JFUEVBVFMgPSAzO1xuXG4vKipcbiAqIERldGVjdHMgYXBwcm94aW1hdGUgem9vbSBsZXZlbCB1c2luZyB0aGUgVmlzdWFsIFZpZXdwb3J0IEFQSS5cbiAqIFRoaXMgaXMgYSBwdXJlIHV0aWxpdHkgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBFc3RpbWF0ZWQgem9vbSBwZXJjZW50YWdlLlxuICovXG5mdW5jdGlvbiBnZXRab29tKCkge1xuICBpZiAod2luZG93LnZpc3VhbFZpZXdwb3J0ICYmIHdpbmRvdy52aXN1YWxWaWV3cG9ydC53aWR0aCA+IDApIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgod2luZG93LmlubmVyV2lkdGggLyB3aW5kb3cudmlzdWFsVmlld3BvcnQud2lkdGgpICogMTAwKTtcbiAgfVxuICAvKiBjOCBpZ25vcmUgbmV4dCAxICovXG4gIHJldHVybiAxMDA7XG59XG5cbi8qKlxuICogTWluaW1hbCBhY2Nlc3NpYmlsaXR5IGF1ZGllbmNlIGRldGVjdGlvbiBwbHVnaW4gZm9yIGhlbGl4LXJ1bS1lbmhhbmNlci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgUGx1Z2luIHBhcmFtZXRlcnMgZnJvbSBlbmhhbmNlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHBhcmFtcy5zYW1wbGVSVU0gUlVNIHRyYWNraW5nIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyYW1zLnNvdXJjZVNlbGVjdG9yIEZ1bmN0aW9uIHRvIGdlbmVyYXRlIGEgc2VsZWN0b3IgZm9yIGFuIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFkZEFjY2Vzc2liaWxpdHlBdWRpZW5jZVRyYWNraW5nKHsgc2FtcGxlUlVNLCBzb3VyY2VTZWxlY3RvciB9KSB7XG4gIGNvbnN0IGZvY3VzSGlzdG9yeSA9IFtdO1xuICBsZXQgc2NvcmUgPSAwO1xuICBsZXQgcmVwb3J0ZWQgPSBmYWxzZTtcbiAgbGV0IGZvY3VzVHJhcERldGVjdGVkID0gZmFsc2U7XG4gIGxldCBrZXlib2FyZENvdW50ID0gMDtcbiAgbGV0IHRvdGFsQ291bnQgPSAwO1xuICBsZXQgbGFzdEZvY3VzVGltZSA9IDA7XG4gIGxldCBoYWRNZWFuaW5nZnVsRm9jdXMgPSBmYWxzZTtcblxuICBjb25zdCByZXBvcnRBdWRpZW5jZSA9ICgpID0+IHtcbiAgICAvKiBjOCBpZ25vcmUgbmV4dCAzICovXG4gICAgaWYgKHJlcG9ydGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcG9ydGVkID0gdHJ1ZTtcbiAgICBsZXQgYXVkaWVuY2UgPSAnb2ZmJztcbiAgICBpZiAoc2NvcmUgPiA3KSB7XG4gICAgICBhdWRpZW5jZSA9ICdoaWdoJztcbiAgICB9IGVsc2UgaWYgKHNjb3JlID49IDQpIHtcbiAgICAgIGF1ZGllbmNlID0gJ21lZGl1bSc7XG4gICAgfSBlbHNlIGlmIChzY29yZSA+PSAxKSB7XG4gICAgICBhdWRpZW5jZSA9ICdsb3cnO1xuICAgIH1cbiAgICBzYW1wbGVSVU0oJ2ExMXknLCB7IHNvdXJjZTogYXVkaWVuY2UsIHRhcmdldDogJ29mZjpsb3c6bWVkaXVtOmhpZ2gnIH0pO1xuICB9O1xuXG4gIGNvbnN0IHJlcG9ydEZvY3VzVHJhcCA9ICh0cmFwVHlwZSwgZWxlbWVudHMpID0+IHtcbiAgICAvKiBjOCBpZ25vcmUgbmV4dCAzICovXG4gICAgaWYgKGZvY3VzVHJhcERldGVjdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvY3VzVHJhcERldGVjdGVkID0gdHJ1ZTtcbiAgICBjb25zdCBlbGVtZW50RGVzY3JpcHRpb25zID0gZWxlbWVudHMuc2xpY2UoMCwgMykubWFwKHNvdXJjZVNlbGVjdG9yKTtcbiAgICBzYW1wbGVSVU0oJ2Vycm9yJywge1xuICAgICAgc291cmNlOiBgZm9jdXMtdHJhcDoke3RyYXBUeXBlfWAsXG4gICAgICB0YXJnZXQ6IGVsZW1lbnREZXNjcmlwdGlvbnMuam9pbignLCAnKSxcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBkZXRlY3RSZXBlYXRpbmdTZXF1ZW5jZSA9IChlbGVtZW50cywgc2VxTGVuZ3RoKSA9PiB7XG4gICAgY29uc3QgdG90YWxMZW5ndGggPSBzZXFMZW5ndGggKiBGT0NVU19UUkFQX01JTl9SRVBFQVRTO1xuICAgIC8qIGM4IGlnbm9yZSBuZXh0IDMgKi9cbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoIDwgdG90YWxMZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcmVjZW50ID0gZWxlbWVudHMuc2xpY2UoLXRvdGFsTGVuZ3RoKTtcbiAgICBjb25zdCBiYXNlU2VxdWVuY2UgPSByZWNlbnQuc2xpY2UoMCwgc2VxTGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IEZPQ1VTX1RSQVBfTUlOX1JFUEVBVFM7IGkgKz0gMSkge1xuICAgICAgY29uc3QgbmV4dFNlcXVlbmNlID0gcmVjZW50LnNsaWNlKGkgKiBzZXFMZW5ndGgsIChpICsgMSkgKiBzZXFMZW5ndGgpO1xuICAgICAgaWYgKG5leHRTZXF1ZW5jZS5sZW5ndGggIT09IHNlcUxlbmd0aFxuICAgICAgICB8fCAhbmV4dFNlcXVlbmNlLmV2ZXJ5KChlbCwgaikgPT4gZWwgPT09IGJhc2VTZXF1ZW5jZVtqXSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXBvcnRGb2N1c1RyYXAoJ3NlcXVlbmNlJywgYmFzZVNlcXVlbmNlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBjb25zdCBkZXRlY3RGb2N1c1RyYXAgPSAoKSA9PiB7XG4gICAgaWYgKGZvY3VzSGlzdG9yeS5sZW5ndGggPCBGT0NVU19UUkFQX01JTl9ISVNUT1JZIHx8IGZvY3VzVHJhcERldGVjdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVsZW1lbnRzID0gZm9jdXNIaXN0b3J5Lm1hcCgoaCkgPT4gaC5lbGVtZW50KTtcbiAgICBjb25zdCB0aW1lc3RhbXBzID0gZm9jdXNIaXN0b3J5Lm1hcCgoaCkgPT4gaC50aW1lc3RhbXApO1xuXG4gICAgaWYgKGVsZW1lbnRzLnNsaWNlKC0zKS5ldmVyeSgoZWwpID0+IGVsID09PSBlbGVtZW50c1tlbGVtZW50cy5sZW5ndGggLSAxXSkpIHtcbiAgICAgIHJlcG9ydEZvY3VzVHJhcCgnc2luZ2xlJywgW2VsZW1lbnRzW2VsZW1lbnRzLmxlbmd0aCAtIDFdXSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVjZW50NCA9IGVsZW1lbnRzLnNsaWNlKC00KTtcbiAgICBjb25zdCB1bmlxdWUgPSBbLi4ubmV3IFNldChyZWNlbnQ0KV07XG4gICAgY29uc3QgdGltZURpZmYgPSB0aW1lc3RhbXBzW3RpbWVzdGFtcHMubGVuZ3RoIC0gMV0gLSB0aW1lc3RhbXBzW3RpbWVzdGFtcHMubGVuZ3RoIC0gNF07XG4gICAgaWYgKHVuaXF1ZS5sZW5ndGggPT09IDIgJiYgdGltZURpZmYgPCBGT0NVU19UUkFQX1BJTkdfUE9OR19EVVJBVElPTikge1xuICAgICAgcmVwb3J0Rm9jdXNUcmFwKCdwaW5nLXBvbmcnLCB1bmlxdWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1pblNlcUxlbmd0aCA9IDIgKiBGT0NVU19UUkFQX01JTl9ISVNUT1JZICsgMTtcbiAgICBpZiAoZm9jdXNIaXN0b3J5Lmxlbmd0aCA+PSBtaW5TZXFMZW5ndGgpIHtcbiAgICAgIGZvciAobGV0IHNlcUxlbmd0aCA9IDI7IHNlcUxlbmd0aCA8PSA0OyBzZXFMZW5ndGggKz0gMSkge1xuICAgICAgICBpZiAoZGV0ZWN0UmVwZWF0aW5nU2VxdWVuY2UoZWxlbWVudHMsIHNlcUxlbmd0aCkpIHtcbiAgICAgICAgICAvKiBjOCBpZ25vcmUgbmV4dCA0ICovXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHRyYWNrRm9jdXNGb3JUcmFwID0gKGV2ZW50KSA9PiB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCB7IGFjdGl2ZUVsZW1lbnQgfSA9IGRvY3VtZW50O1xuICAgICAgLyogYzggaWdub3JlIG5leHQgMyAqL1xuICAgICAgaWYgKCFhY3RpdmVFbGVtZW50IHx8IGFjdGl2ZUVsZW1lbnQgPT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9jdXNIaXN0b3J5LnB1c2goe1xuICAgICAgICBlbGVtZW50OiBhY3RpdmVFbGVtZW50LFxuICAgICAgICB0aW1lc3RhbXA6IHBlcmZvcm1hbmNlLm5vdygpLFxuICAgICAgICBzaGlmdEtleTogZXZlbnQuc2hpZnRLZXksXG4gICAgICB9KTtcbiAgICAgIC8qIGM4IGlnbm9yZSBuZXh0IDMgKi9cbiAgICAgIGlmIChmb2N1c0hpc3RvcnkubGVuZ3RoID4gRk9DVVNUUkFQX01BWF9ISVNUT1JZKSB7XG4gICAgICAgIGZvY3VzSGlzdG9yeS5zaGlmdCgpO1xuICAgICAgfVxuICAgICAgZGV0ZWN0Rm9jdXNUcmFwKCk7XG4gICAgfSwgMCk7XG4gIH07XG5cbiAgY29uc3QgY2hlY2tCZWhhdmlvcmFsU2NvcmUgPSAoKSA9PiB7XG4gICAgaWYgKHRvdGFsQ291bnQgPj0gQkVIQVZJT1JBTF9NSU5fRVZFTlRTICYmICFyZXBvcnRlZCkge1xuICAgICAgaWYgKGtleWJvYXJkQ291bnQgLyB0b3RhbENvdW50ID4gMC43KSB7XG4gICAgICAgIHNjb3JlICs9IEFBQV9XRUlHSFQ7XG4gICAgICB9XG4gICAgICByZXBvcnRBdWRpZW5jZSgpO1xuICAgIH1cbiAgfTtcblxuICAvLyAtLS0gU3RhdGljIFNjb3JpbmcgLS0tXG4gIE9iamVjdC5lbnRyaWVzKFBSRUZFUkVOQ0VfV0VJR0hUUykuZm9yRWFjaCgoW3F1ZXJ5LCBxdWVyeVdlaWdodF0pID0+IHtcbiAgICBpZiAod2luZG93Lm1hdGNoTWVkaWEocXVlcnkpLm1hdGNoZXMpIHtcbiAgICAgIHNjb3JlICs9IHF1ZXJ5V2VpZ2h0O1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3Qgem9vbSA9IGdldFpvb20oKTtcbiAgaWYgKHpvb20gPj0gSElHSF9aT09NX0xFVkVMKSB7XG4gICAgc2NvcmUgKz0gQUFfV0VJR0hUO1xuICB9IGVsc2UgaWYgKHpvb20gPj0gTUVESVVNX1pPT01fTEVWRUwpIHtcbiAgICBzY29yZSArPSBBX1dFSUdIVDtcbiAgfVxuXG4gIGlmIChuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPT09IDAgJiYgd2luZG93Lm1hdGNoTWVkaWEoJyhwb2ludGVyOiBjb2Fyc2UpJykubWF0Y2hlcykge1xuICAgIHNjb3JlICs9IEFBX1dFSUdIVDtcbiAgfVxuXG4gIGlmICh3aW5kb3cubWF0Y2hNZWRpYSgnKGhvdmVyOiBub25lKScpLm1hdGNoZXMpIHtcbiAgICBzY29yZSArPSBBQV9XRUlHSFQ7XG4gIH1cblxuICAvLyAtLS0gRXZlbnQgTGlzdGVuZXJzICYgT2JzZXJ2ZXJzIC0tLVxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG4gICAgaWYgKEtFWUJPQVJEX1JFTEVWQU5UX0tFWVMuaW5jbHVkZXMoZXZlbnQua2V5KSkge1xuICAgICAga2V5Ym9hcmRDb3VudCArPSAxO1xuICAgICAgdG90YWxDb3VudCArPSAxO1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicpIHtcbiAgICAgICAgdHJhY2tGb2N1c0ZvclRyYXAoZXZlbnQpO1xuICAgICAgfVxuICAgICAgY2hlY2tCZWhhdmlvcmFsU2NvcmUoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIHRvdGFsQ291bnQgKz0gMTtcbiAgICBjaGVja0JlaGF2aW9yYWxTY29yZSgpO1xuICB9KTtcblxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgKGV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgbGFzdEZvY3VzVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgaGFkTWVhbmluZ2Z1bEZvY3VzID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IGZvY3VzTG9zc09ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xuICAgIGlmIChoYWRNZWFuaW5nZnVsRm9jdXNcbiAgICAgICAgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZG9jdW1lbnQuYm9keVxuICAgICAgICAmJiAocGVyZm9ybWFuY2Uubm93KCkgLSBsYXN0Rm9jdXNUaW1lID4gMTAwKSkge1xuICAgICAgLyogYzggaWdub3JlIG5leHQgOSAqL1xuICAgICAgY29uc3QgbXV0YXRpb24gPSBtdXRhdGlvbnMuZmluZCgobSkgPT4gKFxuICAgICAgICBtLnR5cGUgPT09ICdjaGlsZExpc3QnICYmIChtLmFkZGVkTm9kZXMubGVuZ3RoID4gMCB8fCBtLnJlbW92ZWROb2Rlcy5sZW5ndGggPiAwKVxuICAgICAgKSk7XG4gICAgICBzYW1wbGVSVU0oJ2Vycm9yJywge1xuICAgICAgICBzb3VyY2U6ICdmb2N1cy1sb3NzJyxcbiAgICAgICAgdGFyZ2V0OiBzb3VyY2VTZWxlY3RvcihtdXRhdGlvbj8udGFyZ2V0KSxcbiAgICAgIH0pO1xuICAgICAgaGFkTWVhbmluZ2Z1bEZvY3VzID0gZmFsc2U7IC8vIFByZXZlbnQgc3BhbVxuICAgIH1cbiAgfSk7XG5cbiAgZm9jdXNMb3NzT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XG5cbiAgLy8gLS0tIEZpbmFsIFJlcG9ydGluZyAtLS1cbiAgaWYgKHNjb3JlID49IDcpIHtcbiAgICByZXBvcnRBdWRpZW5jZSgpO1xuICB9IGVsc2Uge1xuICAgIHNldFRpbWVvdXQoXG4gICAgICAoKSA9PiByZXBvcnRBdWRpZW5jZSgpLFxuICAgICAgLyogYzggaWdub3JlIG5leHQgMSAqL1xuICAgICAgd2luZG93LmhseC5BMTFZX1JFUE9SVF9ERUxBWSB8fCAxMF8wMDAsXG4gICAgKTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbIkFfV0VJR0hUIiwiQUFfV0VJR0hUIiwiQUFBX1dFSUdIVCIsIlBSRUZFUkVOQ0VfV0VJR0hUUyIsIktFWUJPQVJEX1JFTEVWQU5UX0tFWVMiLCJISUdIX1pPT01fTEVWRUwiLCJNRURJVU1fWk9PTV9MRVZFTCIsIkJFSEFWSU9SQUxfTUlOX0VWRU5UUyIsIkZPQ1VTVFJBUF9NQVhfSElTVE9SWSIsIkZPQ1VTX1RSQVBfTUlOX0hJU1RPUlkiLCJGT0NVU19UUkFQX1BJTkdfUE9OR19EVVJBVElPTiIsIkZPQ1VTX1RSQVBfTUlOX1JFUEVBVFMiLCJnZXRab29tIiwid2luZG93IiwidmlzdWFsVmlld3BvcnQiLCJ3aWR0aCIsIk1hdGgiLCJyb3VuZCIsImlubmVyV2lkdGgiLCJhZGRBY2Nlc3NpYmlsaXR5QXVkaWVuY2VUcmFja2luZyIsInNhbXBsZVJVTSIsInNvdXJjZVNlbGVjdG9yIiwiZm9jdXNIaXN0b3J5Iiwic2NvcmUiLCJyZXBvcnRlZCIsImZvY3VzVHJhcERldGVjdGVkIiwia2V5Ym9hcmRDb3VudCIsInRvdGFsQ291bnQiLCJsYXN0Rm9jdXNUaW1lIiwiaGFkTWVhbmluZ2Z1bEZvY3VzIiwicmVwb3J0QXVkaWVuY2UiLCJhdWRpZW5jZSIsInNvdXJjZSIsInRhcmdldCIsInJlcG9ydEZvY3VzVHJhcCIsInRyYXBUeXBlIiwiZWxlbWVudHMiLCJlbGVtZW50RGVzY3JpcHRpb25zIiwic2xpY2UiLCJtYXAiLCJqb2luIiwiZGV0ZWN0UmVwZWF0aW5nU2VxdWVuY2UiLCJzZXFMZW5ndGgiLCJ0b3RhbExlbmd0aCIsImxlbmd0aCIsInJlY2VudCIsImJhc2VTZXF1ZW5jZSIsImkiLCJuZXh0U2VxdWVuY2UiLCJldmVyeSIsImVsIiwiaiIsImRldGVjdEZvY3VzVHJhcCIsImgiLCJlbGVtZW50IiwidGltZXN0YW1wcyIsInRpbWVzdGFtcCIsInJlY2VudDQiLCJ1bmlxdWUiLCJTZXQiLCJ0aW1lRGlmZiIsIm1pblNlcUxlbmd0aCIsInRyYWNrRm9jdXNGb3JUcmFwIiwiZXZlbnQiLCJzZXRUaW1lb3V0IiwiYWN0aXZlRWxlbWVudCIsImRvY3VtZW50IiwiYm9keSIsInB1c2giLCJwZXJmb3JtYW5jZSIsIm5vdyIsInNoaWZ0S2V5Iiwic2hpZnQiLCJjaGVja0JlaGF2aW9yYWxTY29yZSIsIk9iamVjdCIsImVudHJpZXMiLCJmb3JFYWNoIiwicXVlcnkiLCJxdWVyeVdlaWdodCIsIm1hdGNoTWVkaWEiLCJtYXRjaGVzIiwiem9vbSIsIm5hdmlnYXRvciIsIm1heFRvdWNoUG9pbnRzIiwiYWRkRXZlbnRMaXN0ZW5lciIsImluY2x1ZGVzIiwia2V5IiwiZm9jdXNMb3NzT2JzZXJ2ZXIiLCJNdXRhdGlvbk9ic2VydmVyIiwibXV0YXRpb25zIiwibXV0YXRpb24iLCJmaW5kIiwibSIsInR5cGUiLCJhZGRlZE5vZGVzIiwicmVtb3ZlZE5vZGVzIiwib2JzZXJ2ZSIsImNoaWxkTGlzdCIsInN1YnRyZWUiLCJobHgiLCJBMTFZX1JFUE9SVF9ERUxBWSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFZQSxNQUFNQSxRQUFRLEdBQUcsQ0FBQztBQUNsQixNQUFNQyxTQUFTLEdBQUcsQ0FBQztBQUNuQixNQUFNQyxVQUFVLEdBQUcsQ0FBQztBQUVwQixNQUFNQyxrQkFBa0IsR0FBRztBQUN6QixFQUFBLGtDQUFrQyxFQUFFSCxRQUFRO0FBQzVDLEVBQUEsMEJBQTBCLEVBQUVDLFNBQVM7QUFDckMsRUFBQSwwQkFBMEIsRUFBRUEsU0FBUztBQUNyQyxFQUFBLHlCQUF5QixFQUFFQyxVQUFVO0FBQ3JDLEVBQUEsNkJBQTZCLEVBQUVBLFVBQVU7QUFDekMsRUFBQSx3Q0FBd0MsRUFBRUY7QUFDNUMsQ0FBQztBQUVELE1BQU1JLHNCQUFzQixHQUFHLENBQzdCLEtBQUssRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQ2pGO0FBRUQsTUFBTUMsZUFBZSxHQUFHLEdBQUc7QUFDM0IsTUFBTUMsaUJBQWlCLEdBQUcsR0FBRztBQUU3QixNQUFNQyxxQkFBcUIsR0FBRyxFQUFFO0FBRWhDLE1BQU1DLHFCQUFxQixHQUFHLEVBQUU7QUFDaEMsTUFBTUMsc0JBQXNCLEdBQUcsQ0FBQztBQUNoQyxNQUFNQyw2QkFBNkIsR0FBRyxJQUFJO0FBQzFDLE1BQU1DLHNCQUFzQixHQUFHLENBQUM7QUFPaEMsU0FBU0MsT0FBT0EsR0FBRztFQUNqQixJQUFJQyxNQUFNLENBQUNDLGNBQWMsSUFBSUQsTUFBTSxDQUFDQyxjQUFjLENBQUNDLEtBQUssR0FBRyxDQUFDLEVBQUU7QUFD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
@@ -1 +1 @@
1
- 7377a0534dc9e004550bba8a99e54c80
1
+ ca3630c51ee48da2595696b4b11cb586
@@ -1 +1 @@
1
- 44a60e36c92e7b70b0dd230d2f1d1e7b
1
+ 81a070324c3b6699b07f9f5d4a04d9e2
@@ -1 +1 @@
1
- 6267791fa138d96308480bc66b8fb805
1
+ 5617845e9f7ebe824f07b3f042193b12
@@ -1 +1 @@
1
- 4b5cf6c41be188be11c519f419592e7e
1
+ c00518b019647f564ce00dce9d07c74b