@adobe/helix-rum-enhancer 2.36.5 → 2.37.1

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/src/index.js CHANGED
@@ -21,7 +21,8 @@
21
21
  redirect: [620, 1139],
22
22
  example: [543, 770, 1136],
23
23
  language: [543, 959, 1139, 620],
24
- allresources: [1139]
24
+ allresources: [1139],
25
+ a11y: [557, 781, 897, 955, 959]
25
26
  };
26
27
 
27
28
  const KNOWN_PROPERTIES = ['weight', 'id', 'referer', 'checkpoint', 't', 'source', 'target', 'cwv', 'CLS', 'FID', 'LCP', 'INP', 'TTFB'];
@@ -127,8 +128,22 @@
127
128
  const [blocksMO, mediaMO] = [blocksMCB, mediaMCB].map(createMO);
128
129
  const hasCookieKey = key => document.cookie.split(';').some(c => c.trim().startsWith(`${key}=`));
129
130
  const pluginBasePath = new URL(document.currentScript.src).href.replace(/index(\.map)?\.js/, 'plugins');
131
+ const CONSENT_PROVIDERS = [{
132
+ name: 'onetrust',
133
+ detect: () => hasCookieKey('OptanonAlertBoxClosed') || document.querySelector('#onetrust-banner-sdk, #onetrust-pc-sdk')
134
+ }, {
135
+ name: 'trustarc',
136
+ detect: () => ['notice_gdpr_prefs', 'notice_preferences'].some(hasCookieKey) || document.querySelector('#truste-consent-track, #consent_blackbar')
137
+ }, {
138
+ name: 'usercentrics',
139
+ detect: () => window.localStorage.getItem('uc_gcm') || document.querySelector('#usercentrics-root')
140
+ }];
141
+ const getConsentProvider = () => CONSENT_PROVIDERS.find(({
142
+ detect
143
+ }) => detect());
130
144
  const PLUGINS = {
131
145
  cwv: `${pluginBasePath}/cwv.js`,
146
+ a11y: `${pluginBasePath}/a11y.js`,
132
147
  form: {
133
148
  url: `${pluginBasePath}/form.js`,
134
149
  when: () => document.querySelector('form'),
@@ -150,9 +165,8 @@
150
165
  urlParameters
151
166
  }) => urlParameters.size > 0
152
167
  },
153
- onetrust: {
154
- url: `${pluginBasePath}/onetrust.js`,
155
- when: () => hasCookieKey('OptanonAlertBoxClosed') || document.querySelector('#onetrust-consent-sdk'),
168
+ consent: {
169
+ when: () => getConsentProvider(),
156
170
  isBlockDependent: true,
157
171
  mutationObserverParams: {
158
172
  target: document.body,
@@ -204,11 +218,13 @@
204
218
  }
205
219
  return null;
206
220
  }
221
+ if (key === 'consent') {
222
+ plugin.url = `${pluginBasePath}/${getConsentProvider().name}.js`;
223
+ }
207
224
  if (!pluginCache.has(key)) {
208
225
  pluginCache.set(key, import(`${plugin.url || plugin}`));
209
226
  }
210
- const pluginLoadPromise = pluginCache.get(key);
211
- return pluginLoadPromise.then(p => p.default && p.default(params) || typeof p === 'function' && p(params)).catch(() => {});
227
+ return pluginCache.get(key).then(p => p.default && p.default(params) || typeof p === 'function' && p(params)).catch(() => {});
212
228
  }
213
229
  function loadPlugins(filter = () => true, params = PLUGIN_PARAMETERS) {
214
230
  Object.entries(PLUGINS).filter(([, plugin]) => filter(plugin)).map(([key]) => loadPlugin(key, params));
@@ -237,31 +253,28 @@
237
253
  } = window.hlx.rum;
238
254
  if (isSelected && maxEvents) {
239
255
  maxEvents -= 1;
240
- const sendPing = (pdata = data) => {
241
- const body = JSON.stringify({
242
- weight,
243
- id,
244
- referer: urlSanitizers[window.hlx.RUM_MASK_URL || 'path'](),
245
- checkpoint,
246
- t,
247
- ...data
248
- }, KNOWN_PROPERTIES);
249
- const urlParams = window.RUM_PARAMS ? `?${new URLSearchParams(window.RUM_PARAMS).toString()}` : '';
250
- const {
251
- href: url,
252
- origin
253
- } = new URL(`.rum/${weight}${urlParams}`, sampleRUM.collectBaseURL);
254
- if (window.location.origin === origin) {
255
- const headers = {
256
- type: 'application/json'
257
- };
258
- navigator.sendBeacon(url, new Blob([body], headers));
259
- } else {
260
- navigator.sendBeacon(url, body);
261
- }
262
- console.debug(`ping:${checkpoint}`, pdata);
263
- };
264
- sendPing(data);
256
+ const body = JSON.stringify({
257
+ weight,
258
+ id,
259
+ referer: urlSanitizers[window.hlx.RUM_MASK_URL || 'path'](),
260
+ checkpoint,
261
+ t,
262
+ ...data
263
+ }, KNOWN_PROPERTIES);
264
+ const urlParams = window.RUM_PARAMS ? `?${new URLSearchParams(window.RUM_PARAMS).toString()}` : '';
265
+ const {
266
+ href: url,
267
+ origin
268
+ } = new URL(`.rum/${weight}${urlParams}`, sampleRUM.collectBaseURL);
269
+ if (window.location.origin === origin) {
270
+ const headers = {
271
+ type: 'application/json'
272
+ };
273
+ navigator.sendBeacon(url, new Blob([body], headers));
274
+ } else {
275
+ navigator.sendBeacon(url, body);
276
+ }
277
+ console.debug(`ping:${checkpoint}`, data);
265
278
  }
266
279
  }
267
280
  function processQueue() {
@@ -316,13 +329,14 @@
316
329
  function addLoadResourceTracking() {
317
330
  const observer = new PerformanceObserver(list => {
318
331
  try {
319
- list.getEntries().filter(e => !e.responseStatus || e.responseStatus < 400).filter(e => window.location.hostname === new URL(e.name).hostname || fflags.has('allresources')).filter(e => new URL(e.name).pathname.match('.*(\\.plain\\.html$|\\.json|graphql|api)')).forEach(e => {
332
+ const entries = list.getEntries();
333
+ entries.filter(e => !e.responseStatus || e.responseStatus < 400).filter(e => window.location.hostname === new URL(e.name).hostname || fflags.has('allresources')).filter(e => new URL(e.name).pathname.match('.*(\\.plain\\.html$|\\.json|graphql|api)')).forEach(e => {
320
334
  sampleRUM('loadresource', {
321
335
  source: e.name,
322
336
  target: Math.round(e.duration)
323
337
  });
324
338
  });
325
- list.getEntries().filter(e => e.responseStatus >= 400).filter(e => !new URL(e.name).pathname.match('.*(/\\.rum/1[0-9]{0,3})')).forEach(e => {
339
+ entries.filter(e => e.responseStatus >= 400).filter(e => !new URL(e.name).pathname.match('.*(/\\.rum/1[0-9]{0,3})')).forEach(e => {
326
340
  sampleRUM('missingresource', {
327
341
  source: e.name,
328
342
  target: e.responseStatus
@@ -419,7 +433,7 @@
419
433
  });
420
434
  });
421
435
  }
422
- function initEnhancer() {
436
+ function init() {
423
437
  try {
424
438
  if (sampleRUM) {
425
439
  addTrackingFromConfig();
@@ -428,6 +442,6 @@
428
442
  }
429
443
  } catch (error) {}
430
444
  }
431
- initEnhancer();
445
+ init();
432
446
 
433
447
  })();
package/src/index.md5 CHANGED
@@ -1 +1 @@
1
- 553c68a2b55034ef8e3f0c52cd6ccb50
1
+ 17c00804cede176f8349b25d79899efa
package/src/index.sri CHANGED
@@ -1 +1 @@
1
- sha384-CjLEkhzEseDSIYhgHR+ei0ZCRsITHEnViPh3w6rZZQKtbNW6hU7EY76328h4Ce/8
1
+ sha384-E0tOoXUN4IvzjkIb4WwyWGlRnGAbrcrV5O3QbmmASq+cYh7qAE752ezPyoc/ID5O
@@ -0,0 +1,181 @@
1
+ /*
2
+ * Copyright 2024 Adobe. All rights reserved.
3
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
+ * you may not use this file except in compliance with the License. You may obtain a copy
5
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ *
7
+ * Unless required by applicable law or agreed to in writing, software distributed under
8
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
+ * OF ANY KIND, either express or implied. See the License for the specific language
10
+ * governing permissions and limitations under the License.
11
+ */
12
+ const MEDIA_QUERY_PREFERENCES = ['(prefers-reduced-motion: reduce)', '(prefers-contrast: high)', '(prefers-contrast: more)', '(forced-colors: active)', '(prefers-reduced-transparency: reduce)'];
13
+ const KEYBOARD_RELEVANT_KEYS = ['Tab', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Enter', ' ', 'Escape'];
14
+ const HIGH_ZOOM_LEVEL = 200;
15
+ const MEDIUM_ZOOM_LEVEL = 125;
16
+ const BEHAVIORAL_MIN_EVENTS = 10;
17
+ const FOCUSTRAP_MAX_HISTORY = 25;
18
+ const FOCUS_TRAP_MIN_HISTORY = 4;
19
+ const FOCUS_TRAP_PING_PONG_DURATION = 3000;
20
+ const FOCUS_TRAP_MIN_REPEATS = 3;
21
+ function getZoom() {
22
+ if (window.visualViewport && window.visualViewport.width > 0) {
23
+ return Math.round(window.innerWidth / window.visualViewport.width * 100);
24
+ }
25
+ return 100;
26
+ }
27
+ function addAccessibilityAudienceTracking({
28
+ sampleRUM,
29
+ sourceSelector
30
+ }) {
31
+ const focusHistory = [];
32
+ let score = 0;
33
+ let reported = false;
34
+ let focusTrapDetected = false;
35
+ let keyboardCount = 0;
36
+ let totalCount = 0;
37
+ let lastFocusTime = 0;
38
+ let hadMeaningfulFocus = false;
39
+ const reportAudience = () => {
40
+ if (reported) {
41
+ return;
42
+ }
43
+ reported = true;
44
+ const audience = score >= 1 ? 'on' : 'off';
45
+ sampleRUM('a11y', {
46
+ source: audience,
47
+ target: 'on:off'
48
+ });
49
+ };
50
+ const reportFocusTrap = (trapType, elements) => {
51
+ if (focusTrapDetected) {
52
+ return;
53
+ }
54
+ focusTrapDetected = true;
55
+ const elementDescriptions = elements.slice(0, 3).map(sourceSelector);
56
+ sampleRUM('error', {
57
+ source: `focus-trap:${trapType}`,
58
+ target: elementDescriptions.join(', ')
59
+ });
60
+ };
61
+ const detectRepeatingSequence = (elements, seqLength) => {
62
+ const totalLength = seqLength * FOCUS_TRAP_MIN_REPEATS;
63
+ if (elements.length < totalLength) {
64
+ return false;
65
+ }
66
+ const recent = elements.slice(-totalLength);
67
+ const baseSequence = recent.slice(0, seqLength);
68
+ for (let i = 1; i < FOCUS_TRAP_MIN_REPEATS; i += 1) {
69
+ const nextSequence = recent.slice(i * seqLength, (i + 1) * seqLength);
70
+ if (nextSequence.length !== seqLength || !nextSequence.every((el, j) => el === baseSequence[j])) {
71
+ return false;
72
+ }
73
+ }
74
+ reportFocusTrap('sequence', baseSequence);
75
+ return true;
76
+ };
77
+ const detectFocusTrap = () => {
78
+ if (focusHistory.length < FOCUS_TRAP_MIN_HISTORY || focusTrapDetected) {
79
+ return;
80
+ }
81
+ const elements = focusHistory.map(h => h.element);
82
+ const timestamps = focusHistory.map(h => h.timestamp);
83
+ if (elements.slice(-3).every(el => el === elements[elements.length - 1])) {
84
+ reportFocusTrap('single', [elements[elements.length - 1]]);
85
+ return;
86
+ }
87
+ const recent4 = elements.slice(-4);
88
+ const unique = [...new Set(recent4)];
89
+ const timeDiff = timestamps[timestamps.length - 1] - timestamps[timestamps.length - 4];
90
+ if (unique.length === 2 && timeDiff < FOCUS_TRAP_PING_PONG_DURATION) {
91
+ reportFocusTrap('ping-pong', unique);
92
+ return;
93
+ }
94
+ const minSeqLength = 2 * FOCUS_TRAP_MIN_HISTORY + 1;
95
+ if (focusHistory.length >= minSeqLength) {
96
+ for (let seqLength = 2; seqLength <= 4; seqLength += 1) {
97
+ if (detectRepeatingSequence(elements, seqLength)) {
98
+ return;
99
+ }
100
+ }
101
+ }
102
+ };
103
+ const trackFocusForTrap = event => {
104
+ setTimeout(() => {
105
+ const {
106
+ activeElement
107
+ } = document;
108
+ if (!activeElement || activeElement === document.body) {
109
+ return;
110
+ }
111
+ focusHistory.push({
112
+ element: activeElement,
113
+ timestamp: performance.now(),
114
+ shiftKey: event.shiftKey
115
+ });
116
+ if (focusHistory.length > FOCUSTRAP_MAX_HISTORY) {
117
+ focusHistory.shift();
118
+ }
119
+ detectFocusTrap();
120
+ }, 0);
121
+ };
122
+ const checkBehavioralScore = () => {
123
+ if (totalCount >= BEHAVIORAL_MIN_EVENTS && !reported) {
124
+ if (keyboardCount / totalCount > 0.7) {
125
+ score += 2;
126
+ }
127
+ reportAudience();
128
+ }
129
+ };
130
+ score += MEDIA_QUERY_PREFERENCES.filter(q => window.matchMedia(q).matches).length;
131
+ const zoom = getZoom();
132
+ if (zoom >= HIGH_ZOOM_LEVEL) {
133
+ score += 3;
134
+ } else if (zoom >= MEDIUM_ZOOM_LEVEL) {
135
+ score += 2;
136
+ }
137
+ if (navigator.maxTouchPoints === 0 && window.matchMedia('(pointer: coarse)').matches) {
138
+ score += 2;
139
+ }
140
+ document.addEventListener('keydown', event => {
141
+ if (KEYBOARD_RELEVANT_KEYS.includes(event.key)) {
142
+ keyboardCount += 1;
143
+ totalCount += 1;
144
+ if (event.key === 'Tab') {
145
+ trackFocusForTrap(event);
146
+ }
147
+ checkBehavioralScore();
148
+ }
149
+ });
150
+ document.addEventListener('click', () => {
151
+ totalCount += 1;
152
+ checkBehavioralScore();
153
+ });
154
+ document.addEventListener('focusin', event => {
155
+ if (event.target !== document.body) {
156
+ lastFocusTime = performance.now();
157
+ hadMeaningfulFocus = true;
158
+ }
159
+ });
160
+ const focusLossObserver = new MutationObserver(mutations => {
161
+ if (hadMeaningfulFocus && document.activeElement === document.body && performance.now() - lastFocusTime > 100) {
162
+ const mutation = mutations.find(m => m.type === 'childList' && (m.addedNodes.length > 0 || m.removedNodes.length > 0));
163
+ sampleRUM('error', {
164
+ source: 'focus-loss',
165
+ target: sourceSelector(mutation?.target)
166
+ });
167
+ hadMeaningfulFocus = false;
168
+ }
169
+ });
170
+ focusLossObserver.observe(document, {
171
+ childList: true,
172
+ subtree: true
173
+ });
174
+ if (score >= 1) {
175
+ reportAudience();
176
+ } else {
177
+ setTimeout(() => reportAudience(), window.hlx.A11Y_REPORT_DELAY || 10_000);
178
+ }
179
+ }
180
+
181
+ export { addAccessibilityAudienceTracking as default };
@@ -0,0 +1,182 @@
1
+ /*
2
+ * Copyright 2024 Adobe. All rights reserved.
3
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
+ * you may not use this file except in compliance with the License. You may obtain a copy
5
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ *
7
+ * Unless required by applicable law or agreed to in writing, software distributed under
8
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
+ * OF ANY KIND, either express or implied. See the License for the specific language
10
+ * governing permissions and limitations under the License.
11
+ */
12
+ const MEDIA_QUERY_PREFERENCES = ['(prefers-reduced-motion: reduce)', '(prefers-contrast: high)', '(prefers-contrast: more)', '(forced-colors: active)', '(prefers-reduced-transparency: reduce)'];
13
+ const KEYBOARD_RELEVANT_KEYS = ['Tab', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Enter', ' ', 'Escape'];
14
+ const HIGH_ZOOM_LEVEL = 200;
15
+ const MEDIUM_ZOOM_LEVEL = 125;
16
+ const BEHAVIORAL_MIN_EVENTS = 10;
17
+ const FOCUSTRAP_MAX_HISTORY = 25;
18
+ const FOCUS_TRAP_MIN_HISTORY = 4;
19
+ const FOCUS_TRAP_PING_PONG_DURATION = 3000;
20
+ const FOCUS_TRAP_MIN_REPEATS = 3;
21
+ function getZoom() {
22
+ if (window.visualViewport && window.visualViewport.width > 0) {
23
+ return Math.round(window.innerWidth / window.visualViewport.width * 100);
24
+ }
25
+ return 100;
26
+ }
27
+ function addAccessibilityAudienceTracking({
28
+ sampleRUM,
29
+ sourceSelector
30
+ }) {
31
+ const focusHistory = [];
32
+ let score = 0;
33
+ let reported = false;
34
+ let focusTrapDetected = false;
35
+ let keyboardCount = 0;
36
+ let totalCount = 0;
37
+ let lastFocusTime = 0;
38
+ let hadMeaningfulFocus = false;
39
+ const reportAudience = () => {
40
+ if (reported) {
41
+ return;
42
+ }
43
+ reported = true;
44
+ const audience = score >= 1 ? 'on' : 'off';
45
+ sampleRUM('a11y', {
46
+ source: audience,
47
+ target: 'on:off'
48
+ });
49
+ };
50
+ const reportFocusTrap = (trapType, elements) => {
51
+ if (focusTrapDetected) {
52
+ return;
53
+ }
54
+ focusTrapDetected = true;
55
+ const elementDescriptions = elements.slice(0, 3).map(sourceSelector);
56
+ sampleRUM('error', {
57
+ source: `focus-trap:${trapType}`,
58
+ target: elementDescriptions.join(', ')
59
+ });
60
+ };
61
+ const detectRepeatingSequence = (elements, seqLength) => {
62
+ const totalLength = seqLength * FOCUS_TRAP_MIN_REPEATS;
63
+ if (elements.length < totalLength) {
64
+ return false;
65
+ }
66
+ const recent = elements.slice(-totalLength);
67
+ const baseSequence = recent.slice(0, seqLength);
68
+ for (let i = 1; i < FOCUS_TRAP_MIN_REPEATS; i += 1) {
69
+ const nextSequence = recent.slice(i * seqLength, (i + 1) * seqLength);
70
+ if (nextSequence.length !== seqLength || !nextSequence.every((el, j) => el === baseSequence[j])) {
71
+ return false;
72
+ }
73
+ }
74
+ reportFocusTrap('sequence', baseSequence);
75
+ return true;
76
+ };
77
+ const detectFocusTrap = () => {
78
+ if (focusHistory.length < FOCUS_TRAP_MIN_HISTORY || focusTrapDetected) {
79
+ return;
80
+ }
81
+ const elements = focusHistory.map(h => h.element);
82
+ const timestamps = focusHistory.map(h => h.timestamp);
83
+ if (elements.slice(-3).every(el => el === elements[elements.length - 1])) {
84
+ reportFocusTrap('single', [elements[elements.length - 1]]);
85
+ return;
86
+ }
87
+ const recent4 = elements.slice(-4);
88
+ const unique = [...new Set(recent4)];
89
+ const timeDiff = timestamps[timestamps.length - 1] - timestamps[timestamps.length - 4];
90
+ if (unique.length === 2 && timeDiff < FOCUS_TRAP_PING_PONG_DURATION) {
91
+ reportFocusTrap('ping-pong', unique);
92
+ return;
93
+ }
94
+ const minSeqLength = 2 * FOCUS_TRAP_MIN_HISTORY + 1;
95
+ if (focusHistory.length >= minSeqLength) {
96
+ for (let seqLength = 2; seqLength <= 4; seqLength += 1) {
97
+ if (detectRepeatingSequence(elements, seqLength)) {
98
+ return;
99
+ }
100
+ }
101
+ }
102
+ };
103
+ const trackFocusForTrap = event => {
104
+ setTimeout(() => {
105
+ const {
106
+ activeElement
107
+ } = document;
108
+ if (!activeElement || activeElement === document.body) {
109
+ return;
110
+ }
111
+ focusHistory.push({
112
+ element: activeElement,
113
+ timestamp: performance.now(),
114
+ shiftKey: event.shiftKey
115
+ });
116
+ if (focusHistory.length > FOCUSTRAP_MAX_HISTORY) {
117
+ focusHistory.shift();
118
+ }
119
+ detectFocusTrap();
120
+ }, 0);
121
+ };
122
+ const checkBehavioralScore = () => {
123
+ if (totalCount >= BEHAVIORAL_MIN_EVENTS && !reported) {
124
+ if (keyboardCount / totalCount > 0.7) {
125
+ score += 2;
126
+ }
127
+ reportAudience();
128
+ }
129
+ };
130
+ score += MEDIA_QUERY_PREFERENCES.filter(q => window.matchMedia(q).matches).length;
131
+ const zoom = getZoom();
132
+ if (zoom >= HIGH_ZOOM_LEVEL) {
133
+ score += 3;
134
+ } else if (zoom >= MEDIUM_ZOOM_LEVEL) {
135
+ score += 2;
136
+ }
137
+ if (navigator.maxTouchPoints === 0 && window.matchMedia('(pointer: coarse)').matches) {
138
+ score += 2;
139
+ }
140
+ document.addEventListener('keydown', event => {
141
+ if (KEYBOARD_RELEVANT_KEYS.includes(event.key)) {
142
+ keyboardCount += 1;
143
+ totalCount += 1;
144
+ if (event.key === 'Tab') {
145
+ trackFocusForTrap(event);
146
+ }
147
+ checkBehavioralScore();
148
+ }
149
+ });
150
+ document.addEventListener('click', () => {
151
+ totalCount += 1;
152
+ checkBehavioralScore();
153
+ });
154
+ document.addEventListener('focusin', event => {
155
+ if (event.target !== document.body) {
156
+ lastFocusTime = performance.now();
157
+ hadMeaningfulFocus = true;
158
+ }
159
+ });
160
+ const focusLossObserver = new MutationObserver(mutations => {
161
+ if (hadMeaningfulFocus && document.activeElement === document.body && performance.now() - lastFocusTime > 100) {
162
+ const mutation = mutations.find(m => m.type === 'childList' && (m.addedNodes.length > 0 || m.removedNodes.length > 0));
163
+ sampleRUM('error', {
164
+ source: 'focus-loss',
165
+ target: sourceSelector(mutation?.target)
166
+ });
167
+ hadMeaningfulFocus = false;
168
+ }
169
+ });
170
+ focusLossObserver.observe(document, {
171
+ childList: true,
172
+ subtree: true
173
+ });
174
+ if (score >= 1) {
175
+ reportAudience();
176
+ } else {
177
+ setTimeout(() => reportAudience(), window.hlx.A11Y_REPORT_DELAY || 10_000);
178
+ }
179
+ }
180
+
181
+ 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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
@@ -0,0 +1 @@
1
+ 7377a0534dc9e004550bba8a99e54c80
@@ -179,8 +179,10 @@
179
179
  }
180
180
  const B = e => {
181
181
  const t = globalThis.requestIdleCallback || setTimeout;
182
- "hidden" === document.visibilityState ? e() : (t(e = u(e)), document.addEventListener("visibilitychange", e, {
182
+ "hidden" === document.visibilityState ? e() : (e = u(e), document.addEventListener("visibilitychange", e, {
183
183
  once: true
184
+ }), t(() => {
185
+ e(), document.removeEventListener("visibilitychange", e);
184
186
  }));
185
187
  },
186
188
  N = [200, 500];