@atlaskit/media-file-preview 0.15.1 → 0.15.3

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,5 +1,21 @@
1
1
  # @atlaskit/media-file-preview
2
2
 
3
+ ## 0.15.3
4
+
5
+ ### Patch Changes
6
+
7
+ - [`71b895a2fd401`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/71b895a2fd401) -
8
+ Fix SSR preview generation to only be attempted in SSR and not in client if the ssr="client" prop
9
+ is sent
10
+ - Updated dependencies
11
+
12
+ ## 0.15.2
13
+
14
+ ### Patch Changes
15
+
16
+ - [`5e282b606cfbf`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/5e282b606cfbf) -
17
+ Fixing the inline script to be injected correctly without susception to minification
18
+
3
19
  ## 0.15.1
4
20
 
5
21
  ### Patch Changes
@@ -3,13 +3,9 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.getKey = exports.generateScriptProps = exports.GLOBAL_MEDIA_NAMESPACE = exports.GLOBAL_MEDIA_COUNT_SSR = exports.GLOBAL_MEDIA_CARD_SSR = void 0;
6
+ exports.getKey = exports.generateScriptProps = exports.GLOBAL_MEDIA_PERFORMANCE_ENTRIES = exports.GLOBAL_MEDIA_NAMESPACE = exports.GLOBAL_MEDIA_COUNT_SSR = exports.GLOBAL_MEDIA_CARD_SSR = void 0;
7
7
  exports.getMediaCardSSR = getMediaCardSSR;
8
- exports.getMediaCountSSR = getMediaCountSSR;
9
8
  exports.getMediaGlobalScope = getMediaGlobalScope;
10
- exports.incrementMediaCountSSR = incrementMediaCountSSR;
11
- exports.storeDataURI = void 0;
12
- var _printScript = require("./printScript");
13
9
  // ----- WARNING -----
14
10
  // This is a very sensitive fraction of code.
15
11
  // Any changes to this file must be tested directly in product before merging.
@@ -18,6 +14,7 @@ var _printScript = require("./printScript");
18
14
 
19
15
  var GLOBAL_MEDIA_CARD_SSR = exports.GLOBAL_MEDIA_CARD_SSR = 'mediaCardSsr';
20
16
  var GLOBAL_MEDIA_COUNT_SSR = exports.GLOBAL_MEDIA_COUNT_SSR = 'mediaCountSsr';
17
+ var GLOBAL_MEDIA_PERFORMANCE_ENTRIES = exports.GLOBAL_MEDIA_PERFORMANCE_ENTRIES = 'performanceEntries';
21
18
  var GLOBAL_MEDIA_NAMESPACE = exports.GLOBAL_MEDIA_NAMESPACE = '__MEDIA_INTERNAL';
22
19
  var MAX_EAGER_LOAD_COUNT = 6;
23
20
  function getMediaGlobalScope() {
@@ -39,26 +36,6 @@ function getMediaCardSSR() {
39
36
  }
40
37
  return globalMedia[key];
41
38
  }
42
- function getMediaCountSSR() {
43
- var globalScope = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window;
44
- var globalMedia = getMediaGlobalScope(globalScope);
45
- // Must match GLOBAL_MEDIA_COUNT_SSR. Can't reference the constant from here.
46
- var key = 'mediaCountSsr';
47
- if (!globalMedia[key]) {
48
- globalMedia[key] = 0;
49
- }
50
- return globalMedia[key];
51
- }
52
- function incrementMediaCountSSR() {
53
- var globalScope = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window;
54
- var globalMedia = getMediaGlobalScope(globalScope);
55
- // Must match GLOBAL_MEDIA_COUNT_SSR. Can't reference the constant from here.
56
- var key = 'mediaCountSsr';
57
- if (!globalMedia[key]) {
58
- globalMedia[key] = 0;
59
- }
60
- globalMedia[key]++;
61
- }
62
39
  var dashed = function dashed(param) {
63
40
  return param ? "-".concat(param) : '';
64
41
  };
@@ -68,62 +45,24 @@ var getKey = exports.getKey = function getKey(_ref, resizeMode) {
68
45
  occurrenceKey = _ref.occurrenceKey;
69
46
  return "".concat(id).concat(dashed(collectionName)).concat(dashed(occurrenceKey)).concat(dashed(resizeMode));
70
47
  };
71
- var storeDataURI = exports.storeDataURI = function storeDataURI(key, paramDataURI, paramMode, paramSrcSet, dimensions, error) {
72
- var featureFlags = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {};
73
- var globalScope = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : window;
74
- var mediaCardSsr = getMediaCardSSR(globalScope);
75
- var mediaCountSsr = getMediaCountSSR(globalScope);
76
- if (featureFlags['media-perf-uplift-mutation-fix']) {
77
- var _prevData$dimensions, _script;
78
- var prevData = mediaCardSsr[key];
79
- var isPreviousImageLarger = (prevData === null || prevData === void 0 ? void 0 : prevData.mode) === paramMode && prevData && ((_prevData$dimensions = prevData.dimensions) === null || _prevData$dimensions === void 0 ? void 0 : _prevData$dimensions.width) && (dimensions === null || dimensions === void 0 ? void 0 : dimensions.width) && prevData.dimensions.width > dimensions.width;
80
- var srcSet = isPreviousImageLarger ? prevData === null || prevData === void 0 ? void 0 : prevData.srcSet : paramSrcSet;
81
- var dataURI = isPreviousImageLarger ? prevData === null || prevData === void 0 ? void 0 : prevData.dataURI : paramDataURI;
82
- var currData = {
83
- dataURI: dataURI,
84
- dimensions: dimensions,
85
- error: error,
86
- srcSet: srcSet,
87
- loading: 'lazy'
88
- };
89
- var img = (_script = script) === null || _script === void 0 || (_script = _script.parentElement) === null || _script === void 0 ? void 0 : _script.querySelector('img');
90
- if (img && featureFlags['media-perf-lazy-loading-optimisation'] && mediaCountSsr < MAX_EAGER_LOAD_COUNT) {
91
- incrementMediaCountSSR(globalScope);
92
- if (img.getAttribute('loading') === 'lazy') {
93
- img.removeAttribute('loading');
94
- }
95
- currData.loading = '';
96
- }
97
- if (img && dataURI) {
98
- img.src = dataURI;
99
- }
100
- if (img && srcSet) {
101
- img.srcset = srcSet;
102
- }
103
- currData.loadPromise = new Promise(function (resolve, reject) {
104
- // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
105
- img === null || img === void 0 || img.addEventListener('load', function () {
106
- resolve(void 0);
107
- });
108
-
109
- // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
110
- img === null || img === void 0 || img.addEventListener('error', function () {
111
- reject(new Error('Failed to load image'));
112
- });
113
- });
114
- mediaCardSsr[key] = isPreviousImageLarger ? prevData : currData;
115
- } else {
116
- mediaCardSsr[key] = {
117
- dataURI: paramDataURI,
118
- dimensions: dimensions,
119
- error: error
120
- };
121
- }
122
- };
123
48
  var generateScript = function generateScript(identifier, dataURI, mode, srcSet, dimensions, error) {
124
49
  var featureFlags = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {};
125
- var functionCall = (0, _printScript.printFunctionCall)(storeDataURI, getKey(identifier, mode), dataURI, mode, srcSet, dimensions, error, featureFlags);
126
- return (0, _printScript.printScript)([getMediaCardSSR.toString(), getMediaGlobalScope.toString(), functionCall]);
50
+ var key = getKey(identifier, mode);
51
+
52
+ // Serialize the parameters for injection into the script
53
+ var params = {
54
+ key: key,
55
+ dataURI: dataURI,
56
+ mode: mode,
57
+ srcSet: srcSet,
58
+ dimensions: dimensions,
59
+ error: error,
60
+ featureFlags: featureFlags,
61
+ maxEagerLoadCount: MAX_EAGER_LOAD_COUNT
62
+ };
63
+
64
+ // Read originalScriptCode.ts before making changes
65
+ return "!function(e){var r=document.currentScript,i=window.__MEDIA_INTERNAL=window.__MEDIA_INTERNAL||{},n=i.mediaCardSsr=i.mediaCardSsr||{},o=e.key,t=e.dataURI,d=e.mode,a=e.srcSet,s=e.dimensions,m=e.error,l=e.featureFlags;if(l[\"media-perf-uplift-mutation-fix\"]){var u,c,f=n[o],v=f&&f.mode===d&&(null===(u=f.dimensions)||void 0===u?void 0:u.width)&&(null==s?void 0:s.width)&&f.dimensions.width>s.width,E=v?f.srcSet:a,p=v?f.dataURI:t,w={dataURI:p,dimensions:s,error:m,srcSet:E,loading:\"lazy\",loadPromise:void 0,mode:d},S=null==r||null===(c=r.parentElement)||void 0===c?void 0:c.querySelector(\"img\");if(i.mediaCountSsr=i.mediaCountSsr||0,S){if(l[\"media-perf-lazy-loading-optimisation\"]&&i.mediaCountSsr<e.maxEagerLoadCount){i.mediaCountSsr++,S.removeAttribute(\"loading\"),w.loading=\"\";var g=new PerformanceObserver((function(e){e.getEntries().forEach((function(e){E.includes(e.name)&&(i.performanceEntries=i.performanceEntries||[],i.performanceEntries.push(e),g.disconnect())}))}));g.observe({type:\"resource\"})}p&&(S.src=p),E&&(S.srcset=E),w.loadPromise=new Promise((function(e,r){S.addEventListener(\"load\",(function(){return e()})),S.addEventListener(\"error\",(function(){return r(new Error(\"Failed to load image\"))}))}))}n[o]=v?f:w}else n[o]={dataURI:t,dimensions:s,error:m};null==r||r.remove()}({replace:\"\"});".replace('{replace:""}', JSON.stringify(params));
127
66
  };
128
67
  var generateScriptProps = exports.generateScriptProps = function generateScriptProps(identifier, dataURI, mode, srcSet, dimensions, error) {
129
68
  var featureFlags = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {};
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+
3
+ /* eslint-disable @atlaskit/platform/no-direct-document-usage */
4
+
5
+ /** IMPORTANT: This is the original code for the script.
6
+ * Do not change the code without testing it in product first.
7
+ * Steps:
8
+ * 1. Make changes in this code
9
+ * 2. Manually minify the code into: https://repl.parceljs.org/#JTdCJTIyZmlsZXMlMjIlM0ElNUIlNUIlMjIlMkZzcmMlMkZpbmRleC50cyUyMiUyQyU3QiUyMnZhbHVlJTIyJTNBJTIyJTJGKiUyMGVzbGludC1kaXNhYmxlJTIwJTQwYXRsYXNraXQlMkZwbGF0Zm9ybSUyRm5vLWRpcmVjdC1kb2N1bWVudC11c2FnZSUyMColMkYlNUNuJTVDbiUyRioqJTIwSU1QT1JUQU5UJTNBJTIwVGhpcyUyMGlzJTIwdGhlJTIwb3JpZ2luYWwlMjBjb2RlJTIwZm9yJTIwdGhlJTIwc2NyaXB0LiU1Q24lMjAqJTIwRG8lMjBub3QlMjBjaGFuZ2UlMjB0aGUlMjBjb2RlJTIwd2l0aG91dCUyMHRlc3RpbmclMjBpdCUyMGluJTIwcHJvZHVjdCUyMGZpcnN0LiU1Q24lMjAqJTIwU3RlcHMlM0ElNUNuJTIwKiUyMDEuJTIwTWFrZSUyMGNoYW5nZXMlMjBpbiUyMHRoaXMlMjBjb2RlJTVDbiUyMColMjAyLiUyME1hbnVhbGx5JTIwbWluaWZ5JTIwdGhlJTIwY29kZSUyMGludG8lM0ElMjBodHRwcyUzQSUyRiUyRnJlcGwucGFyY2VsanMub3JnJTJGJTIzSlRkQ0pUSXlabWxzWlhNbE1qSWxNMEVsTlVJbE5VSWxNaklsTWtaemNtTWxNa1pwYm1SbGVDNTBjeVV5TWlVeVF5VTNRaVV5TW5aaGJIVmxKVEl5SlROQkpUSXlKVEpHS2lVeU1HVnpiR2x1ZEMxa2FYTmhZbXhsSlRJd0pUUXdZWFJzWVhOcmFYUWxNa1p3YkdGMFptOXliU1V5Um01dkxXUnBjbVZqZEMxa2IyTjFiV1Z1ZEMxMWMyRm5aU1V5TUNvbE1rWWxOVU51SlRWRGJpVXlSaW9xSlRJd1NVMVFUMUpVUVU1VUpUTkJKVEl3VkdocGN5VXlNR2x6SlRJd2RHaGxKVEl3YjNKcFoybHVZV3dsTWpCamIyUmxKVEl3Wm05eUpUSXdkR2hsSlRJd2MyTnlhWEIwTGlVMVEyNGxNakFxSlRJd1JHOGxNakJ1YjNRbE1qQmphR0Z1WjJVbE1qQjBhR1VsTWpCamIyUmxKVEl3ZDJsMGFHOTFkQ1V5TUhSbGMzUnBibWNsTWpCcGRDVXlNR2x1SlRJd2NISnZaSFZqZENVeU1HWnBjbk4wTGlVMVEyNGxNakFxSlRJd1UzUmxjSE1sTTBFbE5VTnVKVEl3S2lVeU1ERXVKVEl3VFdGclpTVXlNR05vWVc1blpYTWxNakJwYmlVeU1IUm9hWE1sTWpCamIyUmxKVFZEYmlVeU1Db2xNakF5TGlVeU1FMWhiblZoYkd4NUpUSXdiV2x1YVdaNUpUSXdkR2hsSlRJd1kyOWtaU1V5TUhacFlTVXlNR2gwZEhCekpUTkJKVEpHSlRKR2NtVndiQzV3WVhKalpXeHFjeTV2Y21jbE1rWWxOVU51SlRJd0tpVXlNRE11SlRJd1EyOXdlU1V5TUhSb1pTVXlNRzFwYm1sbWFXVmtKVEl3WTI5a1pTVXlNR2x1ZEc4bE1qQm5iRzlpWVd4VFkyOXdaUzUwYzNnbE1qQnlaWEJzWVdOcGJtY2xNakIwYUdVbE1qQmxlR2x6ZEdsdVp5VXlNSE4wY21sdVp5VXlNSGRvWlhKbEpUSXdhWFFsTWpCellYbHpKVEl3VUVGVFZFVWxNakJJUlZKRkpUVkRiaVV5TUNvbE1qQTBMaVV5TUZKMWJpVXlNSFJvWlNVeU1IUmxjM1J6SlRJd1lXNWtKVEl3YldGclpTVXlNSE4xY21VbE1qQjBhR1Y1SlRJd2NHRnpjeVUxUTI0bE1qQXFKVEl3TlM0bE1qQlVSVk5VSlRJd1NVNGxNakJRVWs5RVZVTlVVeVV5TUVKRlJrOVNSU1V5TUUxRlVrZEpUa2NsTlVOdUpUSXdLaVUxUTI0bE1qQXFKVEpHSlRWRGJpVTFRMjVtZFc1amRHbHZiaVV5TUdkbGRFMWxaR2xoUjJ4dlltRnNVMk52Y0dVb0tTVXlNQ1UzUWlVMVEyNGxNakFsTWpCamIyNXpkQ1V5TUc1aGJXVnpjR0ZqWlNVeU1DVXpSQ1V5TUNVMVF5VXlNbDlmVFVWRVNVRmZTVTVVUlZKT1FVd2xOVU1sTWpJbE0wSWxOVU51SlRJd0pUSXdhV1lsTWpBb0lTaDNhVzVrYjNjbE1qQmhjeVV5TUdGdWVTa2xOVUp1WVcxbGMzQmhZMlVsTlVRcEpUSXdKVGRDSlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ2gzYVc1a2IzY2xNakJoY3lVeU1HRnVlU2tsTlVKdVlXMWxjM0JoWTJVbE5VUWxNakFsTTBRbE1qQWxOMElsTjBRbE0wSWxOVU51SlRJd0pUSXdKVGRFSlRWRGJpVXlNQ1V5TUhKbGRIVnliaVV5TUNoM2FXNWtiM2NsTWpCaGN5VXlNR0Z1ZVNrbE5VSnVZVzFsYzNCaFkyVWxOVVFsTTBJbE5VTnVKVGRFSlRWRGJpVTFRMjVtZFc1amRHbHZiaVV5TUdkbGRFMWxaR2xoUTJGeVpGTlRVaWdwSlRJd0pUZENKVFZEYmlVeU1DVXlNR052Ym5OMEpUSXdaMnh2WW1Gc1RXVmthV0VsTWpBbE0wUWxNakJuWlhSTlpXUnBZVWRzYjJKaGJGTmpiM0JsS0NrbE0wSWxOVU51SlRJd0pUSXdZMjl1YzNRbE1qQnJaWGtsTWpBbE0wUWxNakFsTlVNbE1qSnRaV1JwWVVOaGNtUlRjM0lsTlVNbE1qSWxNMElsTlVOdUpUSXdKVEl3YVdZbE1qQW9JV2RzYjJKaGJFMWxaR2xoSlRWQ2EyVjVKVFZFS1NVeU1DVTNRaVUxUTI0bE1qQWxNakFsTWpBbE1qQm5iRzlpWVd4TlpXUnBZU1UxUW10bGVTVTFSQ1V5TUNVelJDVXlNQ1UzUWlVM1JDVXpRaVUxUTI0bE1qQWxNakFsTjBRbE5VTnVKVEl3SlRJd2NtVjBkWEp1SlRJd1oyeHZZbUZzVFdWa2FXRWxOVUpyWlhrbE5VUWxNMElsTlVOdUpUZEVKVFZEYmlVMVEyNW1kVzVqZEdsdmJpVXlNR2RsZEUxbFpHbGhRMjkxYm5SVFUxSW9LU1V5TUNVM1FpVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1HZHNiMkpoYkUxbFpHbGhKVEl3SlRORUpUSXdaMlYwVFdWa2FXRkhiRzlpWVd4VFkyOXdaU2dwSlROQ0pUVkRiaVV5TUNVeU1HTnZibk4wSlRJd2EyVjVKVEl3SlRORUpUSXdKVFZESlRJeWJXVmthV0ZEYjNWdWRGTnpjaVUxUXlVeU1pVXpRaVUxUTI0bE1qQWxNakJwWmlVeU1DZ2haMnh2WW1Gc1RXVmthV0VsTlVKclpYa2xOVVFwSlRJd0pUZENKVFZEYmlVeU1DVXlNQ1V5TUNVeU1HZHNiMkpoYkUxbFpHbGhKVFZDYTJWNUpUVkVKVEl3SlRORUpUSXdNQ1V6UWlVMVEyNGxNakFsTWpBbE4wUWxOVU51SlRJd0pUSXdjbVYwZFhKdUpUSXdaMnh2WW1Gc1RXVmthV0VsTlVKclpYa2xOVVFsTTBJbE5VTnVKVGRFSlRWRGJpVTFRMjVtZFc1amRHbHZiaVV5TUdsdVkzSmxiV1Z1ZEUxbFpHbGhRMjkxYm5SVFUxSW9LU1V5TUNVM1FpVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1HZHNiMkpoYkUxbFpHbGhKVEl3SlRORUpUSXdaMlYwVFdWa2FXRkhiRzlpWVd4VFkyOXdaU2dwSlROQ0pUVkRiaVV5TUNVeU1HTnZibk4wSlRJd2EyVjVKVEl3SlRORUpUSXdKVFZESlRJeWJXVmthV0ZEYjNWdWRGTnpjaVUxUXlVeU1pVXpRaVUxUTI0bE1qQWxNakJwWmlVeU1DZ2haMnh2WW1Gc1RXVmthV0VsTlVKclpYa2xOVVFwSlRJd0pUZENKVFZEYmlVeU1DVXlNQ1V5TUNVeU1HZHNiMkpoYkUxbFpHbGhKVFZDYTJWNUpUVkVKVEl3SlRORUpUSXdNQ1V6UWlVMVEyNGxNakFsTWpBbE4wUWxOVU51SlRJd0pUSXdaMnh2WW1Gc1RXVmthV0VsTlVKclpYa2xOVVFsTWtJbE1rSWxNMElsTlVOdUpUZEVKVFZEYmlVMVEyNG9ablZ1WTNScGIyNGxNakFvY0dGeVlXMXpKVE5CSlRJd1lXNTVLU1V5TUNVM1FpVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1ITmpjbWx3ZENVeU1DVXpSQ1V5TUdSdlkzVnRaVzUwTG1OMWNuSmxiblJUWTNKcGNIUWxNMElsTlVOdUpUVkRiaVV5TUNVeU1DVXlSaVV5UmlVeU1GTjBiM0psSlRJd2RHaGxKVEl3WkdGMFlTVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1HMWxaR2xoUTJGeVpGTnpjaVV5TUNVelJDVXlNR2RsZEUxbFpHbGhRMkZ5WkZOVFVpZ3BKVE5DSlRWRGJpVXlNQ1V5TUdOdmJuTjBKVEl3YldWa2FXRkRiM1Z1ZEZOemNpVXlNQ1V6UkNVeU1HZGxkRTFsWkdsaFEyOTFiblJUVTFJb0tTVXpRaVUxUTI0bE1qQWxNakJqYjI1emRDVXlNQ1UzUWlVeU1HdGxlU1V5TUNVM1JDVXlNQ1V6UkNVeU1IQmhjbUZ0Y3lVelFpVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1IQmhjbUZ0UkdGMFlWVlNTU1V5TUNVelJDVXlNSEJoY21GdGN5NWtZWFJoVlZKSkpUTkNKVFZEYmlVeU1DVXlNR052Ym5OMEpUSXdjR0Z5WVcxTmIyUmxKVEl3SlRORUpUSXdjR0Z5WVcxekxtMXZaR1VsTTBJbE5VTnVKVEl3SlRJd1kyOXVjM1FsTWpCd1lYSmhiVk55WTFObGRDVXlNQ1V6UkNVeU1IQmhjbUZ0Y3k1emNtTlRaWFFsTTBJbE5VTnVKVEl3SlRJd1kyOXVjM1FsTWpBbE4wSWxNakJrYVcxbGJuTnBiMjV6SlRJd0pUZEVKVEl3SlRORUpUSXdjR0Z5WVcxekpUTkNKVFZEYmlVeU1DVXlNR052Ym5OMEpUSXdKVGRDSlRJd1pYSnliM0lsTWpBbE4wUWxNakFsTTBRbE1qQndZWEpoYlhNbE0wSWxOVU51SlRJd0pUSXdZMjl1YzNRbE1qQWxOMElsTWpCbVpXRjBkWEpsUm14aFozTWxNakFsTjBRbE1qQWxNMFFsTWpCd1lYSmhiWE1sTTBJbE5VTnVKVFZEYmlVeU1DVXlNR2xtSlRJd0tHWmxZWFIxY21WR2JHRm5jeVUxUWlVMVF5VXlNbTFsWkdsaExYQmxjbVl0ZFhCc2FXWjBMVzExZEdGMGFXOXVMV1pwZUNVMVF5VXlNaVUxUkNrbE1qQWxOMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdZMjl1YzNRbE1qQndjbVYyUkdGMFlTVXlNQ1V6UkNVeU1HMWxaR2xoUTJGeVpGTnpjaVUxUW10bGVTVTFSQ1V6UWlVMVEyNGxNakFsTWpBbE1qQWxNakJqYjI1emRDVXlNR2x6VUhKbGRtbHZkWE5KYldGblpVeGhjbWRsY2lVeU1DVXpSQ1UxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpCd2NtVjJSR0YwWVNVeU1DVXlOaVV5TmlVMVEyNGxNakFsTWpBbE1qQWxNakFsTWpBbE1qQndjbVYyUkdGMFlTNXRiMlJsSlRJd0pUTkVKVE5FSlRORUpUSXdjR0Z5WVcxTmIyUmxKVEl3SlRJMkpUSTJKVFZEYmlVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUhCeVpYWkVZWFJoTG1ScGJXVnVjMmx2Ym5NbE1qQWxNallsTWpZbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjSEpsZGtSaGRHRXVaR2x0Wlc1emFXOXVjeTUzYVdSMGFDVXlNQ1V5TmlVeU5pVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJrYVcxbGJuTnBiMjV6SlRJd0pUSTJKVEkySlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1HUnBiV1Z1YzJsdmJuTXVkMmxrZEdnbE1qQWxNallsTWpZbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjSEpsZGtSaGRHRXVaR2x0Wlc1emFXOXVjeTUzYVdSMGFDVXlNQ1V6UlNVeU1HUnBiV1Z1YzJsdmJuTXVkMmxrZEdnbE0wSWxOVU51SlRWRGJpVXlNQ1V5TUNVeU1DVXlNR052Ym5OMEpUSXdjM0pqVTJWMEpUSXdKVE5FSlRJd2FYTlFjbVYyYVc5MWMwbHRZV2RsVEdGeVoyVnlKVEl3SlROR0pUSXdjSEpsZGtSaGRHRXVjM0pqVTJWMEpUSXdKVE5CSlRJd2NHRnlZVzFUY21OVFpYUWxNMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdZMjl1YzNRbE1qQmtZWFJoVlZKSkpUSXdKVE5FSlRJd2FYTlFjbVYyYVc5MWMwbHRZV2RsVEdGeVoyVnlKVEl3SlROR0pUSXdjSEpsZGtSaGRHRXVaR0YwWVZWU1NTVXlNQ1V6UVNVeU1IQmhjbUZ0UkdGMFlWVlNTU1V6UWlVMVEyNGxOVU51SlRJd0pUSXdKVEl3SlRJd1kyOXVjM1FsTWpCamRYSnlSR0YwWVNVelFTVXlNR0Z1ZVNVeU1DVXpSQ1V5TUNVM1FpVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJrWVhSaFZWSkpKVEpESlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1HUnBiV1Z1YzJsdmJuTWxNa01sTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd1pYSnliM0lsTWtNbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjM0pqVTJWMEpUSkRKVFZEYmlVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUd4dllXUnBibWNsTTBFbE1qQWxOVU1sTWpKc1lYcDVKVFZESlRJeUpUSkRKVFZEYmlVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUd4dllXUlFjbTl0YVhObEpUTkJKVEl3ZFc1a1pXWnBibVZrSlRKREpUVkRiaVUxUTNRbE5VTjBKVFZEZEcxdlpHVWxNMEVsTWpCd1lYSmhiVTF2WkdVbE1rTWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUZEVKVE5DSlRWRGJpVTFRMjRsTWpBbE1qQWxNakFsTWpCamIyNXpkQ1V5TUdsdFp5VXlNQ1V6UkNVMVEyNGxNakFsTWpBbE1qQWxNakFsTWpBbE1qQnpZM0pwY0hRbE1qQWxNallsTWpZbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjMk55YVhCMExuQmhjbVZ1ZEVWc1pXMWxiblFsTWpBbE1qWWxNallsTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd2MyTnlhWEIwTG5CaGNtVnVkRVZzWlcxbGJuUXVjWFZsY25sVFpXeGxZM1J2Y2lnbE5VTWxNakpwYldjbE5VTWxNaklwSlROQ0pUVkRiaVUxUTI0bE1qQWxNakFsTWpBbE1qQnBaaVV5TUNnbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdhVzFuSlRJd0pUSTJKVEkySlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1HWmxZWFIxY21WR2JHRm5jeVUxUWlVMVF5VXlNbTFsWkdsaExYQmxjbVl0YkdGNmVTMXNiMkZrYVc1bkxXOXdkR2x0YVhOaGRHbHZiaVUxUXlVeU1pVTFSQ1V5TUNVeU5pVXlOaVUxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpCdFpXUnBZVU52ZFc1MFUzTnlKVEl3SlROREpUSXdjR0Z5WVcxekxtMWhlRVZoWjJWeVRHOWhaRU52ZFc1MEpUVkRiaVV5TUNVeU1DVXlNQ1V5TUNrbE1qQWxOMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd2FXNWpjbVZ0Wlc1MFRXVmthV0ZEYjNWdWRGTlRVaWdwSlROQ0pUVkRiaVV5TUNVeU1DVXlNQ1V5TUNVeU1DVXlNR2xtSlRJd0tHbHRaeTVuWlhSQmRIUnlhV0oxZEdVb0pUVkRKVEl5Ykc5aFpHbHVaeVUxUXlVeU1pa2xNakFsTTBRbE0wUWxNMFFsTWpBbE5VTWxNakpzWVhwNUpUVkRKVEl5S1NVeU1DVTNRaVUxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJwYldjdWNtVnRiM1psUVhSMGNtbGlkWFJsS0NVMVF5VXlNbXh2WVdScGJtY2xOVU1sTWpJcEpUTkNKVFZEYmlVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVM1JDVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJqZFhKeVJHRjBZUzVzYjJGa2FXNW5KVEl3SlRORUpUSXdKVFZESlRJeUpUVkRKVEl5SlROQ0pUVkRiaVV5TUNVeU1DVXlNQ1V5TUNVM1JDVTFRMjRsTlVOdUpUSXdKVEl3SlRJd0pUSXdhV1lsTWpBb2FXMW5KVEl3SlRJMkpUSTJKVEl3WkdGMFlWVlNTU2tsTWpBbE4wSWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3YVcxbkxuTnlZeVV5TUNVelJDVXlNR1JoZEdGVlVra2xNMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdKVGRFSlRWRGJpVXlNQ1V5TUNVeU1DVXlNR2xtSlRJd0tHbHRaeVV5TUNVeU5pVXlOaVV5TUhOeVkxTmxkQ2tsTWpBbE4wSWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3YVcxbkxuTnlZM05sZENVeU1DVXpSQ1V5TUhOeVkxTmxkQ1V6UWlVMVEyNGxNakFsTWpBbE1qQWxNakFsTjBRbE5VTnVKVFZEYmlVeU1DVXlNQ1V5TUNVeU1HTjFjbkpFWVhSaExteHZZV1JRY205dGFYTmxKVEl3SlRORUpUSXdibVYzSlRJd1VISnZiV2x6WlNVelEzWnZhV1FsTTBVb1puVnVZM1JwYjI0bE1qQW9jbVZ6YjJ4MlpTVXlReVV5TUhKbGFtVmpkQ2tsTWpBbE4wSWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3YVdZbE1qQW9hVzFuS1NVeU1DVTNRaVUxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWtZbE1rWWxNakJsYzJ4cGJuUXRaR2x6WVdKc1pTMXVaWGgwTFd4cGJtVWxNakFsTkRCeVpYQnZKVEpHYVc1MFpYSnVZV3dsTWtaa2IyMHRaWFpsYm5SekpUSkdibTh0ZFc1ellXWmxMV1YyWlc1MExXeHBjM1JsYm1WeWN5VTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQnBiV2N1WVdSa1JYWmxiblJNYVhOMFpXNWxjaWdsTlVNbE1qSnNiMkZrSlRWREpUSXlKVEpESlRJd1puVnVZM1JwYjI0bE1qQW9LU1V5TUNVM1FpVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpCeVpYTnZiSFpsS0hWdVpHVm1hVzVsWkNrbE0wSWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVGRFS1NVelFpVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNa1lsTWtZbE1qQmxjMnhwYm5RdFpHbHpZV0pzWlMxdVpYaDBMV3hwYm1VbE1qQWxOREJ5WlhCdkpUSkdhVzUwWlhKdVlXd2xNa1prYjIwdFpYWmxiblJ6SlRKR2JtOHRkVzV6WVdabExXVjJaVzUwTFd4cGMzUmxibVZ5Y3lVMVEyNGxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpCcGJXY3VZV1JrUlhabGJuUk1hWE4wWlc1bGNpZ2xOVU1sTWpKbGNuSnZjaVUxUXlVeU1pVXlReVV5TUdaMWJtTjBhVzl1SlRJd0tDa2xNakFsTjBJbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3Y21WcVpXTjBLRzVsZHlVeU1FVnljbTl5S0NVMVF5VXlNa1poYVd4bFpDVXlNSFJ2SlRJd2JHOWhaQ1V5TUdsdFlXZGxKVFZESlRJeUtTa2xNMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRkRUtTVXpRaVUxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE4wUWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUZEVLU1V6UWlVMVEyNGxOVU51SlRJd0pUSXdKVEl3SlRJd2JXVmthV0ZEWVhKa1UzTnlKVFZDYTJWNUpUVkVKVEl3SlRORUpUSXdhWE5RY21WMmFXOTFjMGx0WVdkbFRHRnlaMlZ5SlRJd0pUTkdKVEl3Y0hKbGRrUmhkR0VsTWpBbE0wRWxNakJqZFhKeVJHRjBZU1V6UWlVMVEyNGxNakFsTWpBbE4wUWxNakJsYkhObEpUSXdKVGRDSlRWRGJpVXlNQ1V5TUNVeU1DVXlNRzFsWkdsaFEyRnlaRk56Y2lVMVFtdGxlU1UxUkNVeU1DVXpSQ1V5TUNVM1FpVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJrWVhSaFZWSkpKVE5CSlRJd2NHRnlZVzFFWVhSaFZWSkpKVEpESlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1HUnBiV1Z1YzJsdmJuTWxNa01sTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd1pYSnliM0lsTWtNbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRkRUpUTkNKVFZEYmlVeU1DVXlNQ1UzUkNVMVEyNGxOVU51SlRJd0pUSXdKVEpHSlRKR0pUSXdVbVZ0YjNabEpUSXdjMk55YVhCMEpUSXdkRzhsTWpCd2NtVjJaVzUwSlRJd2FIbGtjbUYwYVc5dUpUSXdiV2x6YldGMFkyZ2xOVU51SlRJd0pUSXdaRzlqZFcxbGJuUXVZM1Z5Y21WdWRGTmpjbWx3ZENVelJpNXlaVzF2ZG1Vb0tTVXpRaVUxUTI0bE5VTnVKVFZEZENVeVJpVXlSaVV5TUhSb2FYTWxNakJ5WlhCc1lXTmxKVEl3ZDJsc2JDVXlNR0psSlRJd2RYTmxaQ1V5TUdGekpUSXdZU1V5TUhCc1lXTmxhRzlzWkdWeUpUSXdabTl5SlRJd2RHaGxKVEl3YzNSeWFXNW5hV1pwWldRbE1qQndZWEpoYlhNbE1qQjBieVV5TUdKbEpUSXdhVzVxWldOMFpXUWxNakJwYm5SdkpUSXdkR2hsSlRJd2MyTnlhWEIwSlRWRGJpVTNSQ2tvSlRkQ0pUSXdjbVZ3YkdGalpTVXpRU1V5TUNVMVF5VXlNaVUxUXlVeU1pVXlNQ1UzUkNrbE0wSWxOVU51SlRJeUpUSkRKVEl5YVhORmJuUnllU1V5TWlVelFYUnlkV1VsTjBRbE5VUWxOVVFsTWtNbE1qSnZjSFJwYjI1ekpUSXlKVE5CSlRkQ0pUSXlaVzUwY21sbGN5VXlNaVV6UVNVMVFpVTFSQ1V5UXlVeU1tMXBibWxtZVNVeU1pVXpRWFJ5ZFdVbE1rTWxNakp6WTI5d1pVaHZhWE4wSlRJeUpUTkJkSEoxWlNVeVF5VXlNbk52ZFhKalpVMWhjSE1sTWpJbE0wRm1ZV3h6WlNVeVF5VXlNbkIxWW14cFkxVnliQ1V5TWlVelFTVXlNaVV5Umw5ZmNtVndiRjlrYVhOMEpUSXlKVEpESlRJeWRHRnlaMlYwVkhsd1pTVXlNaVV6UVNVeU1tSnliM2R6WlhKekpUSXlKVEpESlRJeWRHRnlaMlYwUlc1MkpUSXlKVE5CYm5Wc2JDVXlReVV5TW05MWRIQjFkRVp2Y20xaGRDVXlNaVV6UVc1MWJHd2xNa01sTWpKb2JYSWxNaklsTTBGbVlXeHpaU1V5UXlVeU1tMXZaR1VsTWpJbE0wRWxNakp3Y205a2RXTjBhVzl1SlRJeUpUSkRKVEl5Y21WdVpHVnlSM0poY0doekpUSXlKVE5CWm1Gc2MyVWxNa01sTWpKMmFXVjNVMjkxY21ObGJXRndjeVV5TWlVelFXWmhiSE5sSlRKREpUSXlaR1Z3Wlc1a1pXNWphV1Z6SlRJeUpUTkJKVFZDSlRWRUpUSkRKVEl5Ym5WdFYyOXlhMlZ5Y3lVeU1pVXpRVEFsTjBRbE1rTWxNakoxYzJWVVlXSnpKVEl5SlROQmRISjFaU1V5UXlVeU1tSnliM2R6WlhKRGIyeHNZWEJ6WldRbE1qSWxNMEVsTlVJbE5VUWxNa01sTWpKMmFXVjNjeVV5TWlVelFTVTFRaVV5TWlVeVJuTnlZeVV5Um1sdVpHVjRMblJ6SlRJeUpUVkVKVEpESlRJeVkzVnljbVZ1ZEZacFpYY2xNaklsTTBFd0pUZEUlNUNuJTIwKiUyMDMuJTIwQ29weSUyMHRoZSUyMG1pbmlmaWVkJTIwY29kZSUyMGludG8lMjBnbG9iYWxTY29wZS50c3glMjByZXBsYWNpbmclMjB0aGUlMjBleGlzdGluZyUyMHN0cmluZyUyMHdoZXJlJTIwaXQlMjBzYXlzJTIwUEFTVEUlMjBIRVJFJTVDbiUyMColMjA0LiUyMFJ1biUyMHRoZSUyMHRlc3RzJTIwYW5kJTIwbWFrZSUyMHN1cmUlMjB0aGV5JTIwcGFzcyU1Q24lMjAqJTIwNS4lMjBURVNUJTIwSU4lMjBQUk9EVUNUUyUyMEJFRk9SRSUyME1FUkdJTkclNUNuJTIwKiU1Q24lMjAqJTJGJTVDbiU1Q24oZnVuY3Rpb24lMjAocGFyYW1zJTNBJTIwYW55KSUyMCU3QiU1Q24lNUN0Y29uc3QlMjBzY3JpcHQlMjAlM0QlMjBkb2N1bWVudC5jdXJyZW50U2NyaXB0JTNCJTVDbiU1Q3Rjb25zdCUyMGdsb2JhbE1lZGlhJTIwJTNEJTIwKCh3aW5kb3clMjBhcyUyMGFueSkuX19NRURJQV9JTlRFUk5BTCUyMCUzRCUyMCh3aW5kb3clMjBhcyUyMGFueSkuX19NRURJQV9JTlRFUk5BTCUyMCU3QyU3QyUyMCU3QiU3RCklM0IlNUNuJTVDdGNvbnN0JTIwbWVkaWFDYXJkU3NyJTIwJTNEJTIwKGdsb2JhbE1lZGlhLm1lZGlhQ2FyZFNzciUyMCUzRCUyMGdsb2JhbE1lZGlhLm1lZGlhQ2FyZFNzciUyMCU3QyU3QyUyMCU3QiU3RCklM0IlNUNuJTVDdGNvbnN0JTIwJTdCJTIwa2V5JTJDJTIwZGF0YVVSSSUzQSUyMHBhcmFtRGF0YVVSSSUyQyUyMG1vZGUlM0ElMjBwYXJhbU1vZGUlMkMlMjBzcmNTZXQlM0ElMjBwYXJhbVNyY1NldCUyQyUyMGRpbWVuc2lvbnMlMkMlMjBlcnJvciUyQyUyMGZlYXR1cmVGbGFncyUyMCU3RCUyMCUzRCUyMHBhcmFtcyUzQiU1Q24lNUNuJTVDdGlmJTIwKGZlYXR1cmVGbGFncyU1QiU1QyUyMm1lZGlhLXBlcmYtdXBsaWZ0LW11dGF0aW9uLWZpeCU1QyUyMiU1RCklMjAlN0IlNUNuJTVDdCU1Q3Rjb25zdCUyMHByZXZEYXRhJTIwJTNEJTIwbWVkaWFDYXJkU3NyJTVCa2V5JTVEJTNCJTVDbiU1Q3QlNUN0Y29uc3QlMjBpc1ByZXZpb3VzSW1hZ2VMYXJnZXIlMjAlM0QlNUNuJTVDdCU1Q3QlNUN0cHJldkRhdGElMjAlMjYlMjYlNUNuJTVDdCU1Q3QlNUN0cHJldkRhdGEubW9kZSUyMCUzRCUzRCUzRCUyMHBhcmFtTW9kZSUyMCUyNiUyNiU1Q24lNUN0JTVDdCU1Q3RwcmV2RGF0YS5kaW1lbnNpb25zJTNGLndpZHRoJTIwJTI2JTI2JTVDbiU1Q3QlNUN0JTVDdGRpbWVuc2lvbnMlM0Yud2lkdGglMjAlMjYlMjYlNUNuJTVDdCU1Q3QlNUN0cHJldkRhdGEuZGltZW5zaW9ucy53aWR0aCUyMCUzRSUyMGRpbWVuc2lvbnMud2lkdGglM0IlNUNuJTVDbiU1Q3QlNUN0Y29uc3QlMjBzcmNTZXQlMjAlM0QlMjBpc1ByZXZpb3VzSW1hZ2VMYXJnZXIlMjAlM0YlMjBwcmV2RGF0YS5zcmNTZXQlMjAlM0ElMjBwYXJhbVNyY1NldCUzQiU1Q24lNUN0JTVDdGNvbnN0JTIwZGF0YVVSSSUyMCUzRCUyMGlzUHJldmlvdXNJbWFnZUxhcmdlciUyMCUzRiUyMHByZXZEYXRhLmRhdGFVUkklMjAlM0ElMjBwYXJhbURhdGFVUkklM0IlNUNuJTVDbiU1Q3QlNUN0Y29uc3QlMjBjdXJyRGF0YSUzQSUyMGFueSUyMCUzRCUyMCU3QiU1Q24lNUN0JTVDdCU1Q3RkYXRhVVJJJTJDJTVDbiU1Q3QlNUN0JTVDdGRpbWVuc2lvbnMlMkMlNUNuJTVDdCU1Q3QlNUN0ZXJyb3IlMkMlNUNuJTVDdCU1Q3QlNUN0c3JjU2V0JTJDJTVDbiU1Q3QlNUN0JTVDdGxvYWRpbmclM0ElMjAlNUMlMjJsYXp5JTVDJTIyJTJDJTVDbiU1Q3QlNUN0JTVDdGxvYWRQcm9taXNlJTNBJTIwdW5kZWZpbmVkJTJDJTVDbiU1Q3QlNUN0JTVDdG1vZGUlM0ElMjBwYXJhbU1vZGUlMkMlNUNuJTVDdCU1Q3QlN0QlM0IlNUNuJTVDbiU1Q3QlNUN0Y29uc3QlMjBpbWclMjAlM0QlMjBzY3JpcHQlM0YucGFyZW50RWxlbWVudCUzRi5xdWVyeVNlbGVjdG9yKCU1QyUyMmltZyU1QyUyMiklM0IlNUNuJTVDbiU1Q3QlNUN0Z2xvYmFsTWVkaWEubWVkaWFDb3VudFNzciUyMCUzRCUyMGdsb2JhbE1lZGlhLm1lZGlhQ291bnRTc3IlMjAlN0MlN0MlMjAwJTNCJTVDbiU1Q24lNUN0JTVDdGlmJTIwKGltZyklMjAlN0IlNUNuJTVDdCU1Q3QlNUN0aWYlMjAoJTVDbiU1Q3QlNUN0JTVDdCU1Q3RmZWF0dXJlRmxhZ3MlNUIlNUMlMjJtZWRpYS1wZXJmLWxhenktbG9hZGluZy1vcHRpbWlzYXRpb24lNUMlMjIlNUQlMjAlMjYlMjYlNUNuJTVDdCU1Q3QlNUN0JTVDdGdsb2JhbE1lZGlhLm1lZGlhQ291bnRTc3IlMjAlM0MlMjBwYXJhbXMubWF4RWFnZXJMb2FkQ291bnQlNUNuJTVDdCU1Q3QlNUN0KSUyMCU3QiU1Q24lNUN0JTVDdCU1Q3QlNUN0Z2xvYmFsTWVkaWEubWVkaWFDb3VudFNzciUyQiUyQiUzQiU1Q24lNUN0JTVDdCU1Q3QlNUN0aW1nLnJlbW92ZUF0dHJpYnV0ZSglNUMlMjJsb2FkaW5nJTVDJTIyKSUzQiU1Q24lNUN0JTVDdCU1Q3QlNUN0Y3VyckRhdGEubG9hZGluZyUyMCUzRCUyMCU1QyUyMiU1QyUyMiUzQiU1Q24lNUNuJTVDdCU1Q3QlNUN0JTVDdGNvbnN0JTIwb2JzZXJ2ZXIlMjAlM0QlMjBuZXclMjBQZXJmb3JtYW5jZU9ic2VydmVyKChlbnRyaWVzKSUyMCUzRCUzRSUyMCU3QiU1Q24lNUN0JTVDdCU1Q3QlNUN0JTVDdGVudHJpZXMuZ2V0RW50cmllcygpLmZvckVhY2goKGVudHJ5KSUyMCUzRCUzRSUyMCU3QiU1Q24lNUN0JTVDdCU1Q3QlNUN0JTVDdCU1Q3RpZiUyMChzcmNTZXQuaW5jbHVkZXMoZW50cnkubmFtZSkpJTIwJTdCJTVDbiU1Q3QlNUN0JTVDdCU1Q3QlNUN0JTVDdCU1Q3RnbG9iYWxNZWRpYS5wZXJmb3JtYW5jZUVudHJpZXMlMjAlM0QlMjBnbG9iYWxNZWRpYS5wZXJmb3JtYW5jZUVudHJpZXMlMjAlN0MlN0MlMjAlNUIlNUQlM0IlNUNuJTVDdCU1Q3QlNUN0JTVDdCU1Q3QlNUN0JTVDdGdsb2JhbE1lZGlhLnBlcmZvcm1hbmNlRW50cmllcy5wdXNoKGVudHJ5KSUzQiU1Q24lNUN0JTVDdCU1Q3QlNUN0JTVDdCU1Q3QlNUN0b2JzZXJ2ZXIuZGlzY29ubmVjdCgpJTNCJTVDbiU1Q3QlNUN0JTVDdCU1Q3QlNUN0JTVDdCU3RCU1Q24lNUN0JTVDdCU1Q3QlNUN0JTVDdCU3RCklM0IlNUNuJTVDdCU1Q3QlNUN0JTVDdCU3RCklM0IlNUNuJTVDdCU1Q3QlNUN0JTVDdG9ic2VydmVyLm9ic2VydmUoJTdCJTIwdHlwZSUzQSUyMCdyZXNvdXJjZSclMjAlN0QpJTNCJTVDbiU1Q3QlNUN0JTVDdCU3RCU1Q24lNUNuJTVDdCU1Q3QlNUN0aWYlMjAoZGF0YVVSSSklMjAlN0IlNUNuJTVDdCU1Q3QlNUN0JTVDdGltZy5zcmMlMjAlM0QlMjBkYXRhVVJJJTNCJTVDbiU1Q3QlNUN0JTVDdCU3RCU1Q24lNUN0JTVDdCU1Q3RpZiUyMChzcmNTZXQpJTIwJTdCJTVDbiU1Q3QlNUN0JTVDdCU1Q3RpbWcuc3Jjc2V0JTIwJTNEJTIwc3JjU2V0JTNCJTVDbiU1Q3QlNUN0JTVDdCU3RCU1Q24lNUN0JTVDdCU1Q3RjdXJyRGF0YS5sb2FkUHJvbWlzZSUyMCUzRCUyMG5ldyUyMFByb21pc2UlM0N2b2lkJTNFKGZ1bmN0aW9uJTIwKHJlc29sdmUlMkMlMjByZWplY3QpJTIwJTdCJTVDbiU1Q3QlNUN0JTVDdCU1Q3QlMkYlMkYlMjBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUlMjAlNDByZXBvJTJGaW50ZXJuYWwlMkZkb20tZXZlbnRzJTJGbm8tdW5zYWZlLWV2ZW50LWxpc3RlbmVycyU1Q24lNUN0JTVDdCU1Q3QlNUN0aW1nLmFkZEV2ZW50TGlzdGVuZXIoJTVDJTIybG9hZCU1QyUyMiUyQyUyMCgpJTIwJTNEJTNFJTIwcmVzb2x2ZSgpKSUzQiU1Q24lNUN0JTVDdCU1Q3QlNUN0JTJGJTJGJTIwZXNsaW50LWRpc2FibGUtbmV4dC1saW5lJTIwJTQwcmVwbyUyRmludGVybmFsJTJGZG9tLWV2ZW50cyUyRm5vLXVuc2FmZS1ldmVudC1saXN0ZW5lcnMlNUNuJTVDdCU1Q3QlNUN0JTVDdGltZy5hZGRFdmVudExpc3RlbmVyKCU1QyUyMmVycm9yJTVDJTIyJTJDJTIwKCklMjAlM0QlM0UlMjByZWplY3QobmV3JTIwRXJyb3IoJTVDJTIyRmFpbGVkJTIwdG8lMjBsb2FkJTIwaW1hZ2UlNUMlMjIpKSklM0IlNUNuJTVDdCU1Q3QlNUN0JTdEKSUzQiU1Q24lNUN0JTVDdCU3RCU1Q24lNUNuJTVDdCU1Q3RtZWRpYUNhcmRTc3IlNUJrZXklNUQlMjAlM0QlMjBpc1ByZXZpb3VzSW1hZ2VMYXJnZXIlMjAlM0YlMjBwcmV2RGF0YSUyMCUzQSUyMGN1cnJEYXRhJTNCJTVDbiU1Q3QlN0QlMjBlbHNlJTIwJTdCJTVDbiU1Q3QlNUN0bWVkaWFDYXJkU3NyJTVCa2V5JTVEJTIwJTNEJTIwJTdCJTVDbiU1Q3QlNUN0JTVDdGRhdGFVUkklM0ElMjBwYXJhbURhdGFVUkklMkMlNUNuJTVDdCU1Q3QlNUN0ZGltZW5zaW9ucyUyQyU1Q24lNUN0JTVDdCU1Q3RlcnJvciUyQyU1Q24lNUN0JTVDdCU3RCUzQiU1Q24lNUN0JTdEJTVDbiU1Q24lNUN0c2NyaXB0JTNGLnJlbW92ZSgpJTNCJTVDbiU1Q24lNUN0JTJGJTJGJTIwdGhpcyUyMHJlcGxhY2UlMjB3aWxsJTIwYmUlMjB1c2VkJTIwYXMlMjBhJTIwcGxhY2Vob2xkZXIlMjBmb3IlMjB0aGUlMjBzdHJpbmdpZmllZCUyMHBhcmFtcyUyMHRvJTIwYmUlMjBpbmplY3RlZCUyMGludG8lMjB0aGUlMjBzY3JpcHQlNUNuJTdEKSglN0IlMjByZXBsYWNlJTNBJTIwJTVDJTIyJTVDJTIyJTIwJTdEKSUzQiU1Q24lMjIlMkMlMjJpc0VudHJ5JTIyJTNBdHJ1ZSU3RCU1RCU1RCUyQyUyMm9wdGlvbnMlMjIlM0ElN0IlMjJlbnRyaWVzJTIyJTNBJTVCJTVEJTJDJTIybWluaWZ5JTIyJTNBdHJ1ZSUyQyUyMnNjb3BlSG9pc3QlMjIlM0F0cnVlJTJDJTIyc291cmNlTWFwcyUyMiUzQWZhbHNlJTJDJTIycHVibGljVXJsJTIyJTNBJTIyJTJGX19yZXBsX2Rpc3QlMjIlMkMlMjJ0YXJnZXRUeXBlJTIyJTNBJTIyYnJvd3NlcnMlMjIlMkMlMjJ0YXJnZXRFbnYlMjIlM0ElMjJzaW5jZSUyMDIwMTUlMjIlMkMlMjJvdXRwdXRGb3JtYXQlMjIlM0FudWxsJTJDJTIyaG1yJTIyJTNBZmFsc2UlMkMlMjJtb2RlJTIyJTNBJTIycHJvZHVjdGlvbiUyMiUyQyUyMnJlbmRlckdyYXBocyUyMiUzQWZhbHNlJTJDJTIydmlld1NvdXJjZW1hcHMlMjIlM0FmYWxzZSUyQyUyMmRlcGVuZGVuY2llcyUyMiUzQSU1QiU1RCUyQyUyMm51bVdvcmtlcnMlMjIlM0EwJTdEJTJDJTIydXNlVGFicyUyMiUzQXRydWUlMkMlMjJicm93c2VyQ29sbGFwc2VkJTIyJTNBJTVCJTVEJTJDJTIydmlld3MlMjIlM0ElNUIlMjIlMkZzcmMlMkZpbmRleC50cyUyMiU1RCUyQyUyMmN1cnJlbnRWaWV3JTIyJTNBMCU3RA==
10
+ * Ensure the settings have: Minification on and
11
+ * 3. Copy the minified code into globalScope.tsx replacing the existing string where it says PASTE HERE
12
+ * 4. Run the tests and make sure they pass
13
+ * 5. TEST IN PRODUCTS BEFORE MERGING
14
+ *
15
+ */
16
+
17
+ (function (params) {
18
+ var script = document.currentScript;
19
+ var globalMedia = window.__MEDIA_INTERNAL = window.__MEDIA_INTERNAL || {};
20
+ var mediaCardSsr = globalMedia.mediaCardSsr = globalMedia.mediaCardSsr || {};
21
+ var key = params.key,
22
+ paramDataURI = params.dataURI,
23
+ paramMode = params.mode,
24
+ paramSrcSet = params.srcSet,
25
+ dimensions = params.dimensions,
26
+ error = params.error,
27
+ featureFlags = params.featureFlags;
28
+ if (featureFlags["media-perf-uplift-mutation-fix"]) {
29
+ var _prevData$dimensions, _script$parentElement;
30
+ var prevData = mediaCardSsr[key];
31
+ var isPreviousImageLarger = prevData && prevData.mode === paramMode && ((_prevData$dimensions = prevData.dimensions) === null || _prevData$dimensions === void 0 ? void 0 : _prevData$dimensions.width) && (dimensions === null || dimensions === void 0 ? void 0 : dimensions.width) && prevData.dimensions.width > dimensions.width;
32
+ var srcSet = isPreviousImageLarger ? prevData.srcSet : paramSrcSet;
33
+ var dataURI = isPreviousImageLarger ? prevData.dataURI : paramDataURI;
34
+ var currData = {
35
+ dataURI: dataURI,
36
+ dimensions: dimensions,
37
+ error: error,
38
+ srcSet: srcSet,
39
+ loading: "lazy",
40
+ loadPromise: undefined,
41
+ mode: paramMode
42
+ };
43
+ var img = script === null || script === void 0 || (_script$parentElement = script.parentElement) === null || _script$parentElement === void 0 ? void 0 : _script$parentElement.querySelector("img");
44
+ globalMedia.mediaCountSsr = globalMedia.mediaCountSsr || 0;
45
+ if (img) {
46
+ if (featureFlags["media-perf-lazy-loading-optimisation"] && globalMedia.mediaCountSsr < params.maxEagerLoadCount) {
47
+ globalMedia.mediaCountSsr++;
48
+ img.removeAttribute("loading");
49
+ currData.loading = "";
50
+ var observer = new PerformanceObserver(function (entries) {
51
+ entries.getEntries().forEach(function (entry) {
52
+ if (srcSet.includes(entry.name)) {
53
+ globalMedia.performanceEntries = globalMedia.performanceEntries || [];
54
+ globalMedia.performanceEntries.push(entry);
55
+ observer.disconnect();
56
+ }
57
+ });
58
+ });
59
+ observer.observe({
60
+ type: 'resource'
61
+ });
62
+ }
63
+ if (dataURI) {
64
+ img.src = dataURI;
65
+ }
66
+ if (srcSet) {
67
+ img.srcset = srcSet;
68
+ }
69
+ currData.loadPromise = new Promise(function (resolve, reject) {
70
+ // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
71
+ img.addEventListener("load", function () {
72
+ return resolve();
73
+ });
74
+ // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
75
+ img.addEventListener("error", function () {
76
+ return reject(new Error("Failed to load image"));
77
+ });
78
+ });
79
+ }
80
+ mediaCardSsr[key] = isPreviousImageLarger ? prevData : currData;
81
+ } else {
82
+ mediaCardSsr[key] = {
83
+ dataURI: paramDataURI,
84
+ dimensions: dimensions,
85
+ error: error
86
+ };
87
+ }
88
+ script === null || script === void 0 || script.remove();
89
+
90
+ // this replace will be used as a placeholder for the stringified params to be injected into the script
91
+ })({
92
+ replace: ""
93
+ });
@@ -115,12 +115,19 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
115
115
  });
116
116
  }
117
117
  if (!(ssrData !== null && ssrData !== void 0 && ssrData.dataURI)) {
118
- try {
119
- return (0, _getPreview.getSSRPreview)(ssr, mediaClient, identifier.id, imageURLParams, mediaBlobUrlAttrs);
120
- } catch (e) {
121
- ssrReliabilityRef.current = _objectSpread(_objectSpread({}, ssrReliabilityRef.current), {}, (0, _defineProperty2.default)({}, ssr, _objectSpread({
122
- status: 'fail'
123
- }, (0, _analytics.extractErrorInfo)(e, traceContext))));
118
+ // Only attempt SSR preview generation if:
119
+ // 1. We're on the server (ssr='server'), OR
120
+ // 2. We're on the client AND there is SSR data (meaning SSR actually happened)
121
+ // If ssr='client' but there's no SSR data, it means this is a client-side navigation
122
+ // where no SSR occurred, so we should skip SSR preview generation entirely.
123
+ if (ssr === 'server' || ssrData) {
124
+ try {
125
+ return (0, _getPreview.getSSRPreview)(ssr, mediaClient, identifier.id, imageURLParams, mediaBlobUrlAttrs);
126
+ } catch (e) {
127
+ ssrReliabilityRef.current = _objectSpread(_objectSpread({}, ssrReliabilityRef.current), {}, (0, _defineProperty2.default)({}, ssr, _objectSpread({
128
+ status: 'fail'
129
+ }, (0, _analytics.extractErrorInfo)(e, traceContext))));
130
+ }
124
131
  }
125
132
  } else {
126
133
  var _dimensions = ssrData.dimensions,
@@ -306,7 +313,7 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
306
313
  client: (0, _analytics.createFailedSSRObject)(failedPreview, traceContext)
307
314
  });
308
315
  }
309
- var isSSR = (0, _getPreview.isSSRDataPreview)(failedPreview) || ((0, _platformFeatureFlags.fg)('jfp-magma-fix-failed-ssr-preview-load') ? (0, _getPreview.isSSRClientPreview)(failedPreview) : false);
316
+ var isSSR = (0, _getPreview.isSSRDataPreview)(failedPreview) || (0, _getPreview.isSSRClientPreview)(failedPreview);
310
317
 
311
318
  // If the preview failed and it comes from server (global scope / ssrData), it means that we have reused it in client and the error counts for both: server & client.
312
319
  if (isSSR) {
@@ -1,4 +1,3 @@
1
- import { printFunctionCall, printScript } from './printScript';
2
1
  // ----- WARNING -----
3
2
  // This is a very sensitive fraction of code.
4
3
  // Any changes to this file must be tested directly in product before merging.
@@ -7,6 +6,7 @@ import { printFunctionCall, printScript } from './printScript';
7
6
 
8
7
  export const GLOBAL_MEDIA_CARD_SSR = 'mediaCardSsr';
9
8
  export const GLOBAL_MEDIA_COUNT_SSR = 'mediaCountSsr';
9
+ export const GLOBAL_MEDIA_PERFORMANCE_ENTRIES = 'performanceEntries';
10
10
  export const GLOBAL_MEDIA_NAMESPACE = '__MEDIA_INTERNAL';
11
11
  const MAX_EAGER_LOAD_COUNT = 6;
12
12
  export function getMediaGlobalScope(globalScope = window) {
@@ -26,83 +26,29 @@ export function getMediaCardSSR(globalScope = window) {
26
26
  }
27
27
  return globalMedia[key];
28
28
  }
29
- export function getMediaCountSSR(globalScope = window) {
30
- const globalMedia = getMediaGlobalScope(globalScope);
31
- // Must match GLOBAL_MEDIA_COUNT_SSR. Can't reference the constant from here.
32
- const key = 'mediaCountSsr';
33
- if (!globalMedia[key]) {
34
- globalMedia[key] = 0;
35
- }
36
- return globalMedia[key];
37
- }
38
- export function incrementMediaCountSSR(globalScope = window) {
39
- const globalMedia = getMediaGlobalScope(globalScope);
40
- // Must match GLOBAL_MEDIA_COUNT_SSR. Can't reference the constant from here.
41
- const key = 'mediaCountSsr';
42
- if (!globalMedia[key]) {
43
- globalMedia[key] = 0;
44
- }
45
- globalMedia[key]++;
46
- }
47
29
  const dashed = param => param ? `-${param}` : '';
48
30
  export const getKey = ({
49
31
  id,
50
32
  collectionName,
51
33
  occurrenceKey
52
34
  }, resizeMode) => `${id}${dashed(collectionName)}${dashed(occurrenceKey)}${dashed(resizeMode)}`;
53
- export const storeDataURI = (key, paramDataURI, paramMode, paramSrcSet, dimensions, error, featureFlags = {}, globalScope = window) => {
54
- const mediaCardSsr = getMediaCardSSR(globalScope);
55
- const mediaCountSsr = getMediaCountSSR(globalScope);
56
- if (featureFlags['media-perf-uplift-mutation-fix']) {
57
- var _prevData$dimensions, _script, _script$parentElement;
58
- const prevData = mediaCardSsr[key];
59
- const isPreviousImageLarger = (prevData === null || prevData === void 0 ? void 0 : prevData.mode) === paramMode && prevData && ((_prevData$dimensions = prevData.dimensions) === null || _prevData$dimensions === void 0 ? void 0 : _prevData$dimensions.width) && (dimensions === null || dimensions === void 0 ? void 0 : dimensions.width) && prevData.dimensions.width > dimensions.width;
60
- const srcSet = isPreviousImageLarger ? prevData === null || prevData === void 0 ? void 0 : prevData.srcSet : paramSrcSet;
61
- const dataURI = isPreviousImageLarger ? prevData === null || prevData === void 0 ? void 0 : prevData.dataURI : paramDataURI;
62
- const currData = {
63
- dataURI,
64
- dimensions,
65
- error,
66
- srcSet,
67
- loading: 'lazy'
68
- };
69
- const img = (_script = script) === null || _script === void 0 ? void 0 : (_script$parentElement = _script.parentElement) === null || _script$parentElement === void 0 ? void 0 : _script$parentElement.querySelector('img');
70
- if (img && featureFlags['media-perf-lazy-loading-optimisation'] && mediaCountSsr < MAX_EAGER_LOAD_COUNT) {
71
- incrementMediaCountSSR(globalScope);
72
- if (img.getAttribute('loading') === 'lazy') {
73
- img.removeAttribute('loading');
74
- }
75
- currData.loading = '';
76
- }
77
- if (img && dataURI) {
78
- img.src = dataURI;
79
- }
80
- if (img && srcSet) {
81
- img.srcset = srcSet;
82
- }
83
- currData.loadPromise = new Promise((resolve, reject) => {
84
- // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
85
- img === null || img === void 0 ? void 0 : img.addEventListener('load', () => {
86
- resolve(void 0);
87
- });
88
-
89
- // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
90
- img === null || img === void 0 ? void 0 : img.addEventListener('error', () => {
91
- reject(new Error('Failed to load image'));
92
- });
93
- });
94
- mediaCardSsr[key] = isPreviousImageLarger ? prevData : currData;
95
- } else {
96
- mediaCardSsr[key] = {
97
- dataURI: paramDataURI,
98
- dimensions,
99
- error
100
- };
101
- }
102
- };
103
35
  const generateScript = (identifier, dataURI, mode, srcSet, dimensions, error, featureFlags = {}) => {
104
- const functionCall = printFunctionCall(storeDataURI, getKey(identifier, mode), dataURI, mode, srcSet, dimensions, error, featureFlags);
105
- return printScript([getMediaCardSSR.toString(), getMediaGlobalScope.toString(), functionCall]);
36
+ const key = getKey(identifier, mode);
37
+
38
+ // Serialize the parameters for injection into the script
39
+ const params = {
40
+ key,
41
+ dataURI,
42
+ mode,
43
+ srcSet,
44
+ dimensions,
45
+ error,
46
+ featureFlags,
47
+ maxEagerLoadCount: MAX_EAGER_LOAD_COUNT
48
+ };
49
+
50
+ // Read originalScriptCode.ts before making changes
51
+ return `!function(e){var r=document.currentScript,i=window.__MEDIA_INTERNAL=window.__MEDIA_INTERNAL||{},n=i.mediaCardSsr=i.mediaCardSsr||{},o=e.key,t=e.dataURI,d=e.mode,a=e.srcSet,s=e.dimensions,m=e.error,l=e.featureFlags;if(l["media-perf-uplift-mutation-fix"]){var u,c,f=n[o],v=f&&f.mode===d&&(null===(u=f.dimensions)||void 0===u?void 0:u.width)&&(null==s?void 0:s.width)&&f.dimensions.width>s.width,E=v?f.srcSet:a,p=v?f.dataURI:t,w={dataURI:p,dimensions:s,error:m,srcSet:E,loading:"lazy",loadPromise:void 0,mode:d},S=null==r||null===(c=r.parentElement)||void 0===c?void 0:c.querySelector("img");if(i.mediaCountSsr=i.mediaCountSsr||0,S){if(l["media-perf-lazy-loading-optimisation"]&&i.mediaCountSsr<e.maxEagerLoadCount){i.mediaCountSsr++,S.removeAttribute("loading"),w.loading="";var g=new PerformanceObserver((function(e){e.getEntries().forEach((function(e){E.includes(e.name)&&(i.performanceEntries=i.performanceEntries||[],i.performanceEntries.push(e),g.disconnect())}))}));g.observe({type:"resource"})}p&&(S.src=p),E&&(S.srcset=E),w.loadPromise=new Promise((function(e,r){S.addEventListener("load",(function(){return e()})),S.addEventListener("error",(function(){return r(new Error("Failed to load image"))}))}))}n[o]=v?f:w}else n[o]={dataURI:t,dimensions:s,error:m};null==r||r.remove()}({replace:""});`.replace('{replace:""}', JSON.stringify(params));
106
52
  };
107
53
  export const generateScriptProps = (identifier, dataURI, mode, srcSet, dimensions, error, featureFlags = {}) => ({
108
54
  dangerouslySetInnerHTML: {
@@ -0,0 +1,89 @@
1
+ /* eslint-disable @atlaskit/platform/no-direct-document-usage */
2
+
3
+ /** IMPORTANT: This is the original code for the script.
4
+ * Do not change the code without testing it in product first.
5
+ * Steps:
6
+ * 1. Make changes in this code
7
+ * 2. Manually minify the code into: https://repl.parceljs.org/#JTdCJTIyZmlsZXMlMjIlM0ElNUIlNUIlMjIlMkZzcmMlMkZpbmRleC50cyUyMiUyQyU3QiUyMnZhbHVlJTIyJTNBJTIyJTJGKiUyMGVzbGludC1kaXNhYmxlJTIwJTQwYXRsYXNraXQlMkZwbGF0Zm9ybSUyRm5vLWRpcmVjdC1kb2N1bWVudC11c2FnZSUyMColMkYlNUNuJTVDbiUyRioqJTIwSU1QT1JUQU5UJTNBJTIwVGhpcyUyMGlzJTIwdGhlJTIwb3JpZ2luYWwlMjBjb2RlJTIwZm9yJTIwdGhlJTIwc2NyaXB0LiU1Q24lMjAqJTIwRG8lMjBub3QlMjBjaGFuZ2UlMjB0aGUlMjBjb2RlJTIwd2l0aG91dCUyMHRlc3RpbmclMjBpdCUyMGluJTIwcHJvZHVjdCUyMGZpcnN0LiU1Q24lMjAqJTIwU3RlcHMlM0ElNUNuJTIwKiUyMDEuJTIwTWFrZSUyMGNoYW5nZXMlMjBpbiUyMHRoaXMlMjBjb2RlJTVDbiUyMColMjAyLiUyME1hbnVhbGx5JTIwbWluaWZ5JTIwdGhlJTIwY29kZSUyMGludG8lM0ElMjBodHRwcyUzQSUyRiUyRnJlcGwucGFyY2VsanMub3JnJTJGJTIzSlRkQ0pUSXlabWxzWlhNbE1qSWxNMEVsTlVJbE5VSWxNaklsTWtaemNtTWxNa1pwYm1SbGVDNTBjeVV5TWlVeVF5VTNRaVV5TW5aaGJIVmxKVEl5SlROQkpUSXlKVEpHS2lVeU1HVnpiR2x1ZEMxa2FYTmhZbXhsSlRJd0pUUXdZWFJzWVhOcmFYUWxNa1p3YkdGMFptOXliU1V5Um01dkxXUnBjbVZqZEMxa2IyTjFiV1Z1ZEMxMWMyRm5aU1V5TUNvbE1rWWxOVU51SlRWRGJpVXlSaW9xSlRJd1NVMVFUMUpVUVU1VUpUTkJKVEl3VkdocGN5VXlNR2x6SlRJd2RHaGxKVEl3YjNKcFoybHVZV3dsTWpCamIyUmxKVEl3Wm05eUpUSXdkR2hsSlRJd2MyTnlhWEIwTGlVMVEyNGxNakFxSlRJd1JHOGxNakJ1YjNRbE1qQmphR0Z1WjJVbE1qQjBhR1VsTWpCamIyUmxKVEl3ZDJsMGFHOTFkQ1V5TUhSbGMzUnBibWNsTWpCcGRDVXlNR2x1SlRJd2NISnZaSFZqZENVeU1HWnBjbk4wTGlVMVEyNGxNakFxSlRJd1UzUmxjSE1sTTBFbE5VTnVKVEl3S2lVeU1ERXVKVEl3VFdGclpTVXlNR05vWVc1blpYTWxNakJwYmlVeU1IUm9hWE1sTWpCamIyUmxKVFZEYmlVeU1Db2xNakF5TGlVeU1FMWhiblZoYkd4NUpUSXdiV2x1YVdaNUpUSXdkR2hsSlRJd1kyOWtaU1V5TUhacFlTVXlNR2gwZEhCekpUTkJKVEpHSlRKR2NtVndiQzV3WVhKalpXeHFjeTV2Y21jbE1rWWxOVU51SlRJd0tpVXlNRE11SlRJd1EyOXdlU1V5TUhSb1pTVXlNRzFwYm1sbWFXVmtKVEl3WTI5a1pTVXlNR2x1ZEc4bE1qQm5iRzlpWVd4VFkyOXdaUzUwYzNnbE1qQnlaWEJzWVdOcGJtY2xNakIwYUdVbE1qQmxlR2x6ZEdsdVp5VXlNSE4wY21sdVp5VXlNSGRvWlhKbEpUSXdhWFFsTWpCellYbHpKVEl3VUVGVFZFVWxNakJJUlZKRkpUVkRiaVV5TUNvbE1qQTBMaVV5TUZKMWJpVXlNSFJvWlNVeU1IUmxjM1J6SlRJd1lXNWtKVEl3YldGclpTVXlNSE4xY21VbE1qQjBhR1Y1SlRJd2NHRnpjeVUxUTI0bE1qQXFKVEl3TlM0bE1qQlVSVk5VSlRJd1NVNGxNakJRVWs5RVZVTlVVeVV5TUVKRlJrOVNSU1V5TUUxRlVrZEpUa2NsTlVOdUpUSXdLaVUxUTI0bE1qQXFKVEpHSlRWRGJpVTFRMjVtZFc1amRHbHZiaVV5TUdkbGRFMWxaR2xoUjJ4dlltRnNVMk52Y0dVb0tTVXlNQ1UzUWlVMVEyNGxNakFsTWpCamIyNXpkQ1V5TUc1aGJXVnpjR0ZqWlNVeU1DVXpSQ1V5TUNVMVF5VXlNbDlmVFVWRVNVRmZTVTVVUlZKT1FVd2xOVU1sTWpJbE0wSWxOVU51SlRJd0pUSXdhV1lsTWpBb0lTaDNhVzVrYjNjbE1qQmhjeVV5TUdGdWVTa2xOVUp1WVcxbGMzQmhZMlVsTlVRcEpUSXdKVGRDSlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ2gzYVc1a2IzY2xNakJoY3lVeU1HRnVlU2tsTlVKdVlXMWxjM0JoWTJVbE5VUWxNakFsTTBRbE1qQWxOMElsTjBRbE0wSWxOVU51SlRJd0pUSXdKVGRFSlRWRGJpVXlNQ1V5TUhKbGRIVnliaVV5TUNoM2FXNWtiM2NsTWpCaGN5VXlNR0Z1ZVNrbE5VSnVZVzFsYzNCaFkyVWxOVVFsTTBJbE5VTnVKVGRFSlRWRGJpVTFRMjVtZFc1amRHbHZiaVV5TUdkbGRFMWxaR2xoUTJGeVpGTlRVaWdwSlRJd0pUZENKVFZEYmlVeU1DVXlNR052Ym5OMEpUSXdaMnh2WW1Gc1RXVmthV0VsTWpBbE0wUWxNakJuWlhSTlpXUnBZVWRzYjJKaGJGTmpiM0JsS0NrbE0wSWxOVU51SlRJd0pUSXdZMjl1YzNRbE1qQnJaWGtsTWpBbE0wUWxNakFsTlVNbE1qSnRaV1JwWVVOaGNtUlRjM0lsTlVNbE1qSWxNMElsTlVOdUpUSXdKVEl3YVdZbE1qQW9JV2RzYjJKaGJFMWxaR2xoSlRWQ2EyVjVKVFZFS1NVeU1DVTNRaVUxUTI0bE1qQWxNakFsTWpBbE1qQm5iRzlpWVd4TlpXUnBZU1UxUW10bGVTVTFSQ1V5TUNVelJDVXlNQ1UzUWlVM1JDVXpRaVUxUTI0bE1qQWxNakFsTjBRbE5VTnVKVEl3SlRJd2NtVjBkWEp1SlRJd1oyeHZZbUZzVFdWa2FXRWxOVUpyWlhrbE5VUWxNMElsTlVOdUpUZEVKVFZEYmlVMVEyNW1kVzVqZEdsdmJpVXlNR2RsZEUxbFpHbGhRMjkxYm5SVFUxSW9LU1V5TUNVM1FpVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1HZHNiMkpoYkUxbFpHbGhKVEl3SlRORUpUSXdaMlYwVFdWa2FXRkhiRzlpWVd4VFkyOXdaU2dwSlROQ0pUVkRiaVV5TUNVeU1HTnZibk4wSlRJd2EyVjVKVEl3SlRORUpUSXdKVFZESlRJeWJXVmthV0ZEYjNWdWRGTnpjaVUxUXlVeU1pVXpRaVUxUTI0bE1qQWxNakJwWmlVeU1DZ2haMnh2WW1Gc1RXVmthV0VsTlVKclpYa2xOVVFwSlRJd0pUZENKVFZEYmlVeU1DVXlNQ1V5TUNVeU1HZHNiMkpoYkUxbFpHbGhKVFZDYTJWNUpUVkVKVEl3SlRORUpUSXdNQ1V6UWlVMVEyNGxNakFsTWpBbE4wUWxOVU51SlRJd0pUSXdjbVYwZFhKdUpUSXdaMnh2WW1Gc1RXVmthV0VsTlVKclpYa2xOVVFsTTBJbE5VTnVKVGRFSlRWRGJpVTFRMjVtZFc1amRHbHZiaVV5TUdsdVkzSmxiV1Z1ZEUxbFpHbGhRMjkxYm5SVFUxSW9LU1V5TUNVM1FpVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1HZHNiMkpoYkUxbFpHbGhKVEl3SlRORUpUSXdaMlYwVFdWa2FXRkhiRzlpWVd4VFkyOXdaU2dwSlROQ0pUVkRiaVV5TUNVeU1HTnZibk4wSlRJd2EyVjVKVEl3SlRORUpUSXdKVFZESlRJeWJXVmthV0ZEYjNWdWRGTnpjaVUxUXlVeU1pVXpRaVUxUTI0bE1qQWxNakJwWmlVeU1DZ2haMnh2WW1Gc1RXVmthV0VsTlVKclpYa2xOVVFwSlRJd0pUZENKVFZEYmlVeU1DVXlNQ1V5TUNVeU1HZHNiMkpoYkUxbFpHbGhKVFZDYTJWNUpUVkVKVEl3SlRORUpUSXdNQ1V6UWlVMVEyNGxNakFsTWpBbE4wUWxOVU51SlRJd0pUSXdaMnh2WW1Gc1RXVmthV0VsTlVKclpYa2xOVVFsTWtJbE1rSWxNMElsTlVOdUpUZEVKVFZEYmlVMVEyNG9ablZ1WTNScGIyNGxNakFvY0dGeVlXMXpKVE5CSlRJd1lXNTVLU1V5TUNVM1FpVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1ITmpjbWx3ZENVeU1DVXpSQ1V5TUdSdlkzVnRaVzUwTG1OMWNuSmxiblJUWTNKcGNIUWxNMElsTlVOdUpUVkRiaVV5TUNVeU1DVXlSaVV5UmlVeU1GTjBiM0psSlRJd2RHaGxKVEl3WkdGMFlTVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1HMWxaR2xoUTJGeVpGTnpjaVV5TUNVelJDVXlNR2RsZEUxbFpHbGhRMkZ5WkZOVFVpZ3BKVE5DSlRWRGJpVXlNQ1V5TUdOdmJuTjBKVEl3YldWa2FXRkRiM1Z1ZEZOemNpVXlNQ1V6UkNVeU1HZGxkRTFsWkdsaFEyOTFiblJUVTFJb0tTVXpRaVUxUTI0bE1qQWxNakJqYjI1emRDVXlNQ1UzUWlVeU1HdGxlU1V5TUNVM1JDVXlNQ1V6UkNVeU1IQmhjbUZ0Y3lVelFpVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1IQmhjbUZ0UkdGMFlWVlNTU1V5TUNVelJDVXlNSEJoY21GdGN5NWtZWFJoVlZKSkpUTkNKVFZEYmlVeU1DVXlNR052Ym5OMEpUSXdjR0Z5WVcxTmIyUmxKVEl3SlRORUpUSXdjR0Z5WVcxekxtMXZaR1VsTTBJbE5VTnVKVEl3SlRJd1kyOXVjM1FsTWpCd1lYSmhiVk55WTFObGRDVXlNQ1V6UkNVeU1IQmhjbUZ0Y3k1emNtTlRaWFFsTTBJbE5VTnVKVEl3SlRJd1kyOXVjM1FsTWpBbE4wSWxNakJrYVcxbGJuTnBiMjV6SlRJd0pUZEVKVEl3SlRORUpUSXdjR0Z5WVcxekpUTkNKVFZEYmlVeU1DVXlNR052Ym5OMEpUSXdKVGRDSlRJd1pYSnliM0lsTWpBbE4wUWxNakFsTTBRbE1qQndZWEpoYlhNbE0wSWxOVU51SlRJd0pUSXdZMjl1YzNRbE1qQWxOMElsTWpCbVpXRjBkWEpsUm14aFozTWxNakFsTjBRbE1qQWxNMFFsTWpCd1lYSmhiWE1sTTBJbE5VTnVKVFZEYmlVeU1DVXlNR2xtSlRJd0tHWmxZWFIxY21WR2JHRm5jeVUxUWlVMVF5VXlNbTFsWkdsaExYQmxjbVl0ZFhCc2FXWjBMVzExZEdGMGFXOXVMV1pwZUNVMVF5VXlNaVUxUkNrbE1qQWxOMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdZMjl1YzNRbE1qQndjbVYyUkdGMFlTVXlNQ1V6UkNVeU1HMWxaR2xoUTJGeVpGTnpjaVUxUW10bGVTVTFSQ1V6UWlVMVEyNGxNakFsTWpBbE1qQWxNakJqYjI1emRDVXlNR2x6VUhKbGRtbHZkWE5KYldGblpVeGhjbWRsY2lVeU1DVXpSQ1UxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpCd2NtVjJSR0YwWVNVeU1DVXlOaVV5TmlVMVEyNGxNakFsTWpBbE1qQWxNakFsTWpBbE1qQndjbVYyUkdGMFlTNXRiMlJsSlRJd0pUTkVKVE5FSlRORUpUSXdjR0Z5WVcxTmIyUmxKVEl3SlRJMkpUSTJKVFZEYmlVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUhCeVpYWkVZWFJoTG1ScGJXVnVjMmx2Ym5NbE1qQWxNallsTWpZbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjSEpsZGtSaGRHRXVaR2x0Wlc1emFXOXVjeTUzYVdSMGFDVXlNQ1V5TmlVeU5pVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJrYVcxbGJuTnBiMjV6SlRJd0pUSTJKVEkySlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1HUnBiV1Z1YzJsdmJuTXVkMmxrZEdnbE1qQWxNallsTWpZbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjSEpsZGtSaGRHRXVaR2x0Wlc1emFXOXVjeTUzYVdSMGFDVXlNQ1V6UlNVeU1HUnBiV1Z1YzJsdmJuTXVkMmxrZEdnbE0wSWxOVU51SlRWRGJpVXlNQ1V5TUNVeU1DVXlNR052Ym5OMEpUSXdjM0pqVTJWMEpUSXdKVE5FSlRJd2FYTlFjbVYyYVc5MWMwbHRZV2RsVEdGeVoyVnlKVEl3SlROR0pUSXdjSEpsZGtSaGRHRXVjM0pqVTJWMEpUSXdKVE5CSlRJd2NHRnlZVzFUY21OVFpYUWxNMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdZMjl1YzNRbE1qQmtZWFJoVlZKSkpUSXdKVE5FSlRJd2FYTlFjbVYyYVc5MWMwbHRZV2RsVEdGeVoyVnlKVEl3SlROR0pUSXdjSEpsZGtSaGRHRXVaR0YwWVZWU1NTVXlNQ1V6UVNVeU1IQmhjbUZ0UkdGMFlWVlNTU1V6UWlVMVEyNGxOVU51SlRJd0pUSXdKVEl3SlRJd1kyOXVjM1FsTWpCamRYSnlSR0YwWVNVelFTVXlNR0Z1ZVNVeU1DVXpSQ1V5TUNVM1FpVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJrWVhSaFZWSkpKVEpESlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1HUnBiV1Z1YzJsdmJuTWxNa01sTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd1pYSnliM0lsTWtNbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjM0pqVTJWMEpUSkRKVFZEYmlVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUd4dllXUnBibWNsTTBFbE1qQWxOVU1sTWpKc1lYcDVKVFZESlRJeUpUSkRKVFZEYmlVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUd4dllXUlFjbTl0YVhObEpUTkJKVEl3ZFc1a1pXWnBibVZrSlRKREpUVkRiaVUxUTNRbE5VTjBKVFZEZEcxdlpHVWxNMEVsTWpCd1lYSmhiVTF2WkdVbE1rTWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUZEVKVE5DSlRWRGJpVTFRMjRsTWpBbE1qQWxNakFsTWpCamIyNXpkQ1V5TUdsdFp5VXlNQ1V6UkNVMVEyNGxNakFsTWpBbE1qQWxNakFsTWpBbE1qQnpZM0pwY0hRbE1qQWxNallsTWpZbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjMk55YVhCMExuQmhjbVZ1ZEVWc1pXMWxiblFsTWpBbE1qWWxNallsTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd2MyTnlhWEIwTG5CaGNtVnVkRVZzWlcxbGJuUXVjWFZsY25sVFpXeGxZM1J2Y2lnbE5VTWxNakpwYldjbE5VTWxNaklwSlROQ0pUVkRiaVUxUTI0bE1qQWxNakFsTWpBbE1qQnBaaVV5TUNnbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdhVzFuSlRJd0pUSTJKVEkySlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1HWmxZWFIxY21WR2JHRm5jeVUxUWlVMVF5VXlNbTFsWkdsaExYQmxjbVl0YkdGNmVTMXNiMkZrYVc1bkxXOXdkR2x0YVhOaGRHbHZiaVUxUXlVeU1pVTFSQ1V5TUNVeU5pVXlOaVUxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpCdFpXUnBZVU52ZFc1MFUzTnlKVEl3SlROREpUSXdjR0Z5WVcxekxtMWhlRVZoWjJWeVRHOWhaRU52ZFc1MEpUVkRiaVV5TUNVeU1DVXlNQ1V5TUNrbE1qQWxOMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd2FXNWpjbVZ0Wlc1MFRXVmthV0ZEYjNWdWRGTlRVaWdwSlROQ0pUVkRiaVV5TUNVeU1DVXlNQ1V5TUNVeU1DVXlNR2xtSlRJd0tHbHRaeTVuWlhSQmRIUnlhV0oxZEdVb0pUVkRKVEl5Ykc5aFpHbHVaeVUxUXlVeU1pa2xNakFsTTBRbE0wUWxNMFFsTWpBbE5VTWxNakpzWVhwNUpUVkRKVEl5S1NVeU1DVTNRaVUxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJwYldjdWNtVnRiM1psUVhSMGNtbGlkWFJsS0NVMVF5VXlNbXh2WVdScGJtY2xOVU1sTWpJcEpUTkNKVFZEYmlVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVM1JDVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJqZFhKeVJHRjBZUzVzYjJGa2FXNW5KVEl3SlRORUpUSXdKVFZESlRJeUpUVkRKVEl5SlROQ0pUVkRiaVV5TUNVeU1DVXlNQ1V5TUNVM1JDVTFRMjRsTlVOdUpUSXdKVEl3SlRJd0pUSXdhV1lsTWpBb2FXMW5KVEl3SlRJMkpUSTJKVEl3WkdGMFlWVlNTU2tsTWpBbE4wSWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3YVcxbkxuTnlZeVV5TUNVelJDVXlNR1JoZEdGVlVra2xNMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdKVGRFSlRWRGJpVXlNQ1V5TUNVeU1DVXlNR2xtSlRJd0tHbHRaeVV5TUNVeU5pVXlOaVV5TUhOeVkxTmxkQ2tsTWpBbE4wSWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3YVcxbkxuTnlZM05sZENVeU1DVXpSQ1V5TUhOeVkxTmxkQ1V6UWlVMVEyNGxNakFsTWpBbE1qQWxNakFsTjBRbE5VTnVKVFZEYmlVeU1DVXlNQ1V5TUNVeU1HTjFjbkpFWVhSaExteHZZV1JRY205dGFYTmxKVEl3SlRORUpUSXdibVYzSlRJd1VISnZiV2x6WlNVelEzWnZhV1FsTTBVb1puVnVZM1JwYjI0bE1qQW9jbVZ6YjJ4MlpTVXlReVV5TUhKbGFtVmpkQ2tsTWpBbE4wSWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3YVdZbE1qQW9hVzFuS1NVeU1DVTNRaVUxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWtZbE1rWWxNakJsYzJ4cGJuUXRaR2x6WVdKc1pTMXVaWGgwTFd4cGJtVWxNakFsTkRCeVpYQnZKVEpHYVc1MFpYSnVZV3dsTWtaa2IyMHRaWFpsYm5SekpUSkdibTh0ZFc1ellXWmxMV1YyWlc1MExXeHBjM1JsYm1WeWN5VTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQnBiV2N1WVdSa1JYWmxiblJNYVhOMFpXNWxjaWdsTlVNbE1qSnNiMkZrSlRWREpUSXlKVEpESlRJd1puVnVZM1JwYjI0bE1qQW9LU1V5TUNVM1FpVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpCeVpYTnZiSFpsS0hWdVpHVm1hVzVsWkNrbE0wSWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVGRFS1NVelFpVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNa1lsTWtZbE1qQmxjMnhwYm5RdFpHbHpZV0pzWlMxdVpYaDBMV3hwYm1VbE1qQWxOREJ5WlhCdkpUSkdhVzUwWlhKdVlXd2xNa1prYjIwdFpYWmxiblJ6SlRKR2JtOHRkVzV6WVdabExXVjJaVzUwTFd4cGMzUmxibVZ5Y3lVMVEyNGxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpCcGJXY3VZV1JrUlhabGJuUk1hWE4wWlc1bGNpZ2xOVU1sTWpKbGNuSnZjaVUxUXlVeU1pVXlReVV5TUdaMWJtTjBhVzl1SlRJd0tDa2xNakFsTjBJbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3Y21WcVpXTjBLRzVsZHlVeU1FVnljbTl5S0NVMVF5VXlNa1poYVd4bFpDVXlNSFJ2SlRJd2JHOWhaQ1V5TUdsdFlXZGxKVFZESlRJeUtTa2xNMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRkRUtTVXpRaVUxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE4wUWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUZEVLU1V6UWlVMVEyNGxOVU51SlRJd0pUSXdKVEl3SlRJd2JXVmthV0ZEWVhKa1UzTnlKVFZDYTJWNUpUVkVKVEl3SlRORUpUSXdhWE5RY21WMmFXOTFjMGx0WVdkbFRHRnlaMlZ5SlRJd0pUTkdKVEl3Y0hKbGRrUmhkR0VsTWpBbE0wRWxNakJqZFhKeVJHRjBZU1V6UWlVMVEyNGxNakFsTWpBbE4wUWxNakJsYkhObEpUSXdKVGRDSlRWRGJpVXlNQ1V5TUNVeU1DVXlNRzFsWkdsaFEyRnlaRk56Y2lVMVFtdGxlU1UxUkNVeU1DVXpSQ1V5TUNVM1FpVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJrWVhSaFZWSkpKVE5CSlRJd2NHRnlZVzFFWVhSaFZWSkpKVEpESlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1HUnBiV1Z1YzJsdmJuTWxNa01sTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd1pYSnliM0lsTWtNbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRkRUpUTkNKVFZEYmlVeU1DVXlNQ1UzUkNVMVEyNGxOVU51SlRJd0pUSXdKVEpHSlRKR0pUSXdVbVZ0YjNabEpUSXdjMk55YVhCMEpUSXdkRzhsTWpCd2NtVjJaVzUwSlRJd2FIbGtjbUYwYVc5dUpUSXdiV2x6YldGMFkyZ2xOVU51SlRJd0pUSXdaRzlqZFcxbGJuUXVZM1Z5Y21WdWRGTmpjbWx3ZENVelJpNXlaVzF2ZG1Vb0tTVXpRaVUxUTI0bE5VTnVKVFZEZENVeVJpVXlSaVV5TUhSb2FYTWxNakJ5WlhCc1lXTmxKVEl3ZDJsc2JDVXlNR0psSlRJd2RYTmxaQ1V5TUdGekpUSXdZU1V5TUhCc1lXTmxhRzlzWkdWeUpUSXdabTl5SlRJd2RHaGxKVEl3YzNSeWFXNW5hV1pwWldRbE1qQndZWEpoYlhNbE1qQjBieVV5TUdKbEpUSXdhVzVxWldOMFpXUWxNakJwYm5SdkpUSXdkR2hsSlRJd2MyTnlhWEIwSlRWRGJpVTNSQ2tvSlRkQ0pUSXdjbVZ3YkdGalpTVXpRU1V5TUNVMVF5VXlNaVUxUXlVeU1pVXlNQ1UzUkNrbE0wSWxOVU51SlRJeUpUSkRKVEl5YVhORmJuUnllU1V5TWlVelFYUnlkV1VsTjBRbE5VUWxOVVFsTWtNbE1qSnZjSFJwYjI1ekpUSXlKVE5CSlRkQ0pUSXlaVzUwY21sbGN5VXlNaVV6UVNVMVFpVTFSQ1V5UXlVeU1tMXBibWxtZVNVeU1pVXpRWFJ5ZFdVbE1rTWxNakp6WTI5d1pVaHZhWE4wSlRJeUpUTkJkSEoxWlNVeVF5VXlNbk52ZFhKalpVMWhjSE1sTWpJbE0wRm1ZV3h6WlNVeVF5VXlNbkIxWW14cFkxVnliQ1V5TWlVelFTVXlNaVV5Umw5ZmNtVndiRjlrYVhOMEpUSXlKVEpESlRJeWRHRnlaMlYwVkhsd1pTVXlNaVV6UVNVeU1tSnliM2R6WlhKekpUSXlKVEpESlRJeWRHRnlaMlYwUlc1MkpUSXlKVE5CYm5Wc2JDVXlReVV5TW05MWRIQjFkRVp2Y20xaGRDVXlNaVV6UVc1MWJHd2xNa01sTWpKb2JYSWxNaklsTTBGbVlXeHpaU1V5UXlVeU1tMXZaR1VsTWpJbE0wRWxNakp3Y205a2RXTjBhVzl1SlRJeUpUSkRKVEl5Y21WdVpHVnlSM0poY0doekpUSXlKVE5CWm1Gc2MyVWxNa01sTWpKMmFXVjNVMjkxY21ObGJXRndjeVV5TWlVelFXWmhiSE5sSlRKREpUSXlaR1Z3Wlc1a1pXNWphV1Z6SlRJeUpUTkJKVFZDSlRWRUpUSkRKVEl5Ym5WdFYyOXlhMlZ5Y3lVeU1pVXpRVEFsTjBRbE1rTWxNakoxYzJWVVlXSnpKVEl5SlROQmRISjFaU1V5UXlVeU1tSnliM2R6WlhKRGIyeHNZWEJ6WldRbE1qSWxNMEVsTlVJbE5VUWxNa01sTWpKMmFXVjNjeVV5TWlVelFTVTFRaVV5TWlVeVJuTnlZeVV5Um1sdVpHVjRMblJ6SlRJeUpUVkVKVEpESlRJeVkzVnljbVZ1ZEZacFpYY2xNaklsTTBFd0pUZEUlNUNuJTIwKiUyMDMuJTIwQ29weSUyMHRoZSUyMG1pbmlmaWVkJTIwY29kZSUyMGludG8lMjBnbG9iYWxTY29wZS50c3glMjByZXBsYWNpbmclMjB0aGUlMjBleGlzdGluZyUyMHN0cmluZyUyMHdoZXJlJTIwaXQlMjBzYXlzJTIwUEFTVEUlMjBIRVJFJTVDbiUyMColMjA0LiUyMFJ1biUyMHRoZSUyMHRlc3RzJTIwYW5kJTIwbWFrZSUyMHN1cmUlMjB0aGV5JTIwcGFzcyU1Q24lMjAqJTIwNS4lMjBURVNUJTIwSU4lMjBQUk9EVUNUUyUyMEJFRk9SRSUyME1FUkdJTkclNUNuJTIwKiU1Q24lMjAqJTJGJTVDbiU1Q24oZnVuY3Rpb24lMjAocGFyYW1zJTNBJTIwYW55KSUyMCU3QiU1Q24lNUN0Y29uc3QlMjBzY3JpcHQlMjAlM0QlMjBkb2N1bWVudC5jdXJyZW50U2NyaXB0JTNCJTVDbiU1Q3Rjb25zdCUyMGdsb2JhbE1lZGlhJTIwJTNEJTIwKCh3aW5kb3clMjBhcyUyMGFueSkuX19NRURJQV9JTlRFUk5BTCUyMCUzRCUyMCh3aW5kb3clMjBhcyUyMGFueSkuX19NRURJQV9JTlRFUk5BTCUyMCU3QyU3QyUyMCU3QiU3RCklM0IlNUNuJTVDdGNvbnN0JTIwbWVkaWFDYXJkU3NyJTIwJTNEJTIwKGdsb2JhbE1lZGlhLm1lZGlhQ2FyZFNzciUyMCUzRCUyMGdsb2JhbE1lZGlhLm1lZGlhQ2FyZFNzciUyMCU3QyU3QyUyMCU3QiU3RCklM0IlNUNuJTVDdGNvbnN0JTIwJTdCJTIwa2V5JTJDJTIwZGF0YVVSSSUzQSUyMHBhcmFtRGF0YVVSSSUyQyUyMG1vZGUlM0ElMjBwYXJhbU1vZGUlMkMlMjBzcmNTZXQlM0ElMjBwYXJhbVNyY1NldCUyQyUyMGRpbWVuc2lvbnMlMkMlMjBlcnJvciUyQyUyMGZlYXR1cmVGbGFncyUyMCU3RCUyMCUzRCUyMHBhcmFtcyUzQiU1Q24lNUNuJTVDdGlmJTIwKGZlYXR1cmVGbGFncyU1QiU1QyUyMm1lZGlhLXBlcmYtdXBsaWZ0LW11dGF0aW9uLWZpeCU1QyUyMiU1RCklMjAlN0IlNUNuJTVDdCU1Q3Rjb25zdCUyMHByZXZEYXRhJTIwJTNEJTIwbWVkaWFDYXJkU3NyJTVCa2V5JTVEJTNCJTVDbiU1Q3QlNUN0Y29uc3QlMjBpc1ByZXZpb3VzSW1hZ2VMYXJnZXIlMjAlM0QlNUNuJTVDdCU1Q3QlNUN0cHJldkRhdGElMjAlMjYlMjYlNUNuJTVDdCU1Q3QlNUN0cHJldkRhdGEubW9kZSUyMCUzRCUzRCUzRCUyMHBhcmFtTW9kZSUyMCUyNiUyNiU1Q24lNUN0JTVDdCU1Q3RwcmV2RGF0YS5kaW1lbnNpb25zJTNGLndpZHRoJTIwJTI2JTI2JTVDbiU1Q3QlNUN0JTVDdGRpbWVuc2lvbnMlM0Yud2lkdGglMjAlMjYlMjYlNUNuJTVDdCU1Q3QlNUN0cHJldkRhdGEuZGltZW5zaW9ucy53aWR0aCUyMCUzRSUyMGRpbWVuc2lvbnMud2lkdGglM0IlNUNuJTVDbiU1Q3QlNUN0Y29uc3QlMjBzcmNTZXQlMjAlM0QlMjBpc1ByZXZpb3VzSW1hZ2VMYXJnZXIlMjAlM0YlMjBwcmV2RGF0YS5zcmNTZXQlMjAlM0ElMjBwYXJhbVNyY1NldCUzQiU1Q24lNUN0JTVDdGNvbnN0JTIwZGF0YVVSSSUyMCUzRCUyMGlzUHJldmlvdXNJbWFnZUxhcmdlciUyMCUzRiUyMHByZXZEYXRhLmRhdGFVUkklMjAlM0ElMjBwYXJhbURhdGFVUkklM0IlNUNuJTVDbiU1Q3QlNUN0Y29uc3QlMjBjdXJyRGF0YSUzQSUyMGFueSUyMCUzRCUyMCU3QiU1Q24lNUN0JTVDdCU1Q3RkYXRhVVJJJTJDJTVDbiU1Q3QlNUN0JTVDdGRpbWVuc2lvbnMlMkMlNUNuJTVDdCU1Q3QlNUN0ZXJyb3IlMkMlNUNuJTVDdCU1Q3QlNUN0c3JjU2V0JTJDJTVDbiU1Q3QlNUN0JTVDdGxvYWRpbmclM0ElMjAlNUMlMjJsYXp5JTVDJTIyJTJDJTVDbiU1Q3QlNUN0JTVDdGxvYWRQcm9taXNlJTNBJTIwdW5kZWZpbmVkJTJDJTVDbiU1Q3QlNUN0JTVDdG1vZGUlM0ElMjBwYXJhbU1vZGUlMkMlNUNuJTVDdCU1Q3QlN0QlM0IlNUNuJTVDbiU1Q3QlNUN0Y29uc3QlMjBpbWclMjAlM0QlMjBzY3JpcHQlM0YucGFyZW50RWxlbWVudCUzRi5xdWVyeVNlbGVjdG9yKCU1QyUyMmltZyU1QyUyMiklM0IlNUNuJTVDbiU1Q3QlNUN0Z2xvYmFsTWVkaWEubWVkaWFDb3VudFNzciUyMCUzRCUyMGdsb2JhbE1lZGlhLm1lZGlhQ291bnRTc3IlMjAlN0MlN0MlMjAwJTNCJTVDbiU1Q24lNUN0JTVDdGlmJTIwKGltZyklMjAlN0IlNUNuJTVDdCU1Q3QlNUN0aWYlMjAoJTVDbiU1Q3QlNUN0JTVDdCU1Q3RmZWF0dXJlRmxhZ3MlNUIlNUMlMjJtZWRpYS1wZXJmLWxhenktbG9hZGluZy1vcHRpbWlzYXRpb24lNUMlMjIlNUQlMjAlMjYlMjYlNUNuJTVDdCU1Q3QlNUN0JTVDdGdsb2JhbE1lZGlhLm1lZGlhQ291bnRTc3IlMjAlM0MlMjBwYXJhbXMubWF4RWFnZXJMb2FkQ291bnQlNUNuJTVDdCU1Q3QlNUN0KSUyMCU3QiU1Q24lNUN0JTVDdCU1Q3QlNUN0Z2xvYmFsTWVkaWEubWVkaWFDb3VudFNzciUyQiUyQiUzQiU1Q24lNUN0JTVDdCU1Q3QlNUN0aW1nLnJlbW92ZUF0dHJpYnV0ZSglNUMlMjJsb2FkaW5nJTVDJTIyKSUzQiU1Q24lNUN0JTVDdCU1Q3QlNUN0Y3VyckRhdGEubG9hZGluZyUyMCUzRCUyMCU1QyUyMiU1QyUyMiUzQiU1Q24lNUNuJTVDdCU1Q3QlNUN0JTVDdGNvbnN0JTIwb2JzZXJ2ZXIlMjAlM0QlMjBuZXclMjBQZXJmb3JtYW5jZU9ic2VydmVyKChlbnRyaWVzKSUyMCUzRCUzRSUyMCU3QiU1Q24lNUN0JTVDdCU1Q3QlNUN0JTVDdGVudHJpZXMuZ2V0RW50cmllcygpLmZvckVhY2goKGVudHJ5KSUyMCUzRCUzRSUyMCU3QiU1Q24lNUN0JTVDdCU1Q3QlNUN0JTVDdCU1Q3RpZiUyMChzcmNTZXQuaW5jbHVkZXMoZW50cnkubmFtZSkpJTIwJTdCJTVDbiU1Q3QlNUN0JTVDdCU1Q3QlNUN0JTVDdCU1Q3RnbG9iYWxNZWRpYS5wZXJmb3JtYW5jZUVudHJpZXMlMjAlM0QlMjBnbG9iYWxNZWRpYS5wZXJmb3JtYW5jZUVudHJpZXMlMjAlN0MlN0MlMjAlNUIlNUQlM0IlNUNuJTVDdCU1Q3QlNUN0JTVDdCU1Q3QlNUN0JTVDdGdsb2JhbE1lZGlhLnBlcmZvcm1hbmNlRW50cmllcy5wdXNoKGVudHJ5KSUzQiU1Q24lNUN0JTVDdCU1Q3QlNUN0JTVDdCU1Q3QlNUN0b2JzZXJ2ZXIuZGlzY29ubmVjdCgpJTNCJTVDbiU1Q3QlNUN0JTVDdCU1Q3QlNUN0JTVDdCU3RCU1Q24lNUN0JTVDdCU1Q3QlNUN0JTVDdCU3RCklM0IlNUNuJTVDdCU1Q3QlNUN0JTVDdCU3RCklM0IlNUNuJTVDdCU1Q3QlNUN0JTVDdG9ic2VydmVyLm9ic2VydmUoJTdCJTIwdHlwZSUzQSUyMCdyZXNvdXJjZSclMjAlN0QpJTNCJTVDbiU1Q3QlNUN0JTVDdCU3RCU1Q24lNUNuJTVDdCU1Q3QlNUN0aWYlMjAoZGF0YVVSSSklMjAlN0IlNUNuJTVDdCU1Q3QlNUN0JTVDdGltZy5zcmMlMjAlM0QlMjBkYXRhVVJJJTNCJTVDbiU1Q3QlNUN0JTVDdCU3RCU1Q24lNUN0JTVDdCU1Q3RpZiUyMChzcmNTZXQpJTIwJTdCJTVDbiU1Q3QlNUN0JTVDdCU1Q3RpbWcuc3Jjc2V0JTIwJTNEJTIwc3JjU2V0JTNCJTVDbiU1Q3QlNUN0JTVDdCU3RCU1Q24lNUN0JTVDdCU1Q3RjdXJyRGF0YS5sb2FkUHJvbWlzZSUyMCUzRCUyMG5ldyUyMFByb21pc2UlM0N2b2lkJTNFKGZ1bmN0aW9uJTIwKHJlc29sdmUlMkMlMjByZWplY3QpJTIwJTdCJTVDbiU1Q3QlNUN0JTVDdCU1Q3QlMkYlMkYlMjBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUlMjAlNDByZXBvJTJGaW50ZXJuYWwlMkZkb20tZXZlbnRzJTJGbm8tdW5zYWZlLWV2ZW50LWxpc3RlbmVycyU1Q24lNUN0JTVDdCU1Q3QlNUN0aW1nLmFkZEV2ZW50TGlzdGVuZXIoJTVDJTIybG9hZCU1QyUyMiUyQyUyMCgpJTIwJTNEJTNFJTIwcmVzb2x2ZSgpKSUzQiU1Q24lNUN0JTVDdCU1Q3QlNUN0JTJGJTJGJTIwZXNsaW50LWRpc2FibGUtbmV4dC1saW5lJTIwJTQwcmVwbyUyRmludGVybmFsJTJGZG9tLWV2ZW50cyUyRm5vLXVuc2FmZS1ldmVudC1saXN0ZW5lcnMlNUNuJTVDdCU1Q3QlNUN0JTVDdGltZy5hZGRFdmVudExpc3RlbmVyKCU1QyUyMmVycm9yJTVDJTIyJTJDJTIwKCklMjAlM0QlM0UlMjByZWplY3QobmV3JTIwRXJyb3IoJTVDJTIyRmFpbGVkJTIwdG8lMjBsb2FkJTIwaW1hZ2UlNUMlMjIpKSklM0IlNUNuJTVDdCU1Q3QlNUN0JTdEKSUzQiU1Q24lNUN0JTVDdCU3RCU1Q24lNUNuJTVDdCU1Q3RtZWRpYUNhcmRTc3IlNUJrZXklNUQlMjAlM0QlMjBpc1ByZXZpb3VzSW1hZ2VMYXJnZXIlMjAlM0YlMjBwcmV2RGF0YSUyMCUzQSUyMGN1cnJEYXRhJTNCJTVDbiU1Q3QlN0QlMjBlbHNlJTIwJTdCJTVDbiU1Q3QlNUN0bWVkaWFDYXJkU3NyJTVCa2V5JTVEJTIwJTNEJTIwJTdCJTVDbiU1Q3QlNUN0JTVDdGRhdGFVUkklM0ElMjBwYXJhbURhdGFVUkklMkMlNUNuJTVDdCU1Q3QlNUN0ZGltZW5zaW9ucyUyQyU1Q24lNUN0JTVDdCU1Q3RlcnJvciUyQyU1Q24lNUN0JTVDdCU3RCUzQiU1Q24lNUN0JTdEJTVDbiU1Q24lNUN0c2NyaXB0JTNGLnJlbW92ZSgpJTNCJTVDbiU1Q24lNUN0JTJGJTJGJTIwdGhpcyUyMHJlcGxhY2UlMjB3aWxsJTIwYmUlMjB1c2VkJTIwYXMlMjBhJTIwcGxhY2Vob2xkZXIlMjBmb3IlMjB0aGUlMjBzdHJpbmdpZmllZCUyMHBhcmFtcyUyMHRvJTIwYmUlMjBpbmplY3RlZCUyMGludG8lMjB0aGUlMjBzY3JpcHQlNUNuJTdEKSglN0IlMjByZXBsYWNlJTNBJTIwJTVDJTIyJTVDJTIyJTIwJTdEKSUzQiU1Q24lMjIlMkMlMjJpc0VudHJ5JTIyJTNBdHJ1ZSU3RCU1RCU1RCUyQyUyMm9wdGlvbnMlMjIlM0ElN0IlMjJlbnRyaWVzJTIyJTNBJTVCJTVEJTJDJTIybWluaWZ5JTIyJTNBdHJ1ZSUyQyUyMnNjb3BlSG9pc3QlMjIlM0F0cnVlJTJDJTIyc291cmNlTWFwcyUyMiUzQWZhbHNlJTJDJTIycHVibGljVXJsJTIyJTNBJTIyJTJGX19yZXBsX2Rpc3QlMjIlMkMlMjJ0YXJnZXRUeXBlJTIyJTNBJTIyYnJvd3NlcnMlMjIlMkMlMjJ0YXJnZXRFbnYlMjIlM0ElMjJzaW5jZSUyMDIwMTUlMjIlMkMlMjJvdXRwdXRGb3JtYXQlMjIlM0FudWxsJTJDJTIyaG1yJTIyJTNBZmFsc2UlMkMlMjJtb2RlJTIyJTNBJTIycHJvZHVjdGlvbiUyMiUyQyUyMnJlbmRlckdyYXBocyUyMiUzQWZhbHNlJTJDJTIydmlld1NvdXJjZW1hcHMlMjIlM0FmYWxzZSUyQyUyMmRlcGVuZGVuY2llcyUyMiUzQSU1QiU1RCUyQyUyMm51bVdvcmtlcnMlMjIlM0EwJTdEJTJDJTIydXNlVGFicyUyMiUzQXRydWUlMkMlMjJicm93c2VyQ29sbGFwc2VkJTIyJTNBJTVCJTVEJTJDJTIydmlld3MlMjIlM0ElNUIlMjIlMkZzcmMlMkZpbmRleC50cyUyMiU1RCUyQyUyMmN1cnJlbnRWaWV3JTIyJTNBMCU3RA==
8
+ * Ensure the settings have: Minification on and
9
+ * 3. Copy the minified code into globalScope.tsx replacing the existing string where it says PASTE HERE
10
+ * 4. Run the tests and make sure they pass
11
+ * 5. TEST IN PRODUCTS BEFORE MERGING
12
+ *
13
+ */
14
+
15
+ (function (params) {
16
+ const script = document.currentScript;
17
+ const globalMedia = window.__MEDIA_INTERNAL = window.__MEDIA_INTERNAL || {};
18
+ const mediaCardSsr = globalMedia.mediaCardSsr = globalMedia.mediaCardSsr || {};
19
+ const {
20
+ key,
21
+ dataURI: paramDataURI,
22
+ mode: paramMode,
23
+ srcSet: paramSrcSet,
24
+ dimensions,
25
+ error,
26
+ featureFlags
27
+ } = params;
28
+ if (featureFlags["media-perf-uplift-mutation-fix"]) {
29
+ var _prevData$dimensions, _script$parentElement;
30
+ const prevData = mediaCardSsr[key];
31
+ const isPreviousImageLarger = prevData && prevData.mode === paramMode && ((_prevData$dimensions = prevData.dimensions) === null || _prevData$dimensions === void 0 ? void 0 : _prevData$dimensions.width) && (dimensions === null || dimensions === void 0 ? void 0 : dimensions.width) && prevData.dimensions.width > dimensions.width;
32
+ const srcSet = isPreviousImageLarger ? prevData.srcSet : paramSrcSet;
33
+ const dataURI = isPreviousImageLarger ? prevData.dataURI : paramDataURI;
34
+ const currData = {
35
+ dataURI,
36
+ dimensions,
37
+ error,
38
+ srcSet,
39
+ loading: "lazy",
40
+ loadPromise: undefined,
41
+ mode: paramMode
42
+ };
43
+ const img = script === null || script === void 0 ? void 0 : (_script$parentElement = script.parentElement) === null || _script$parentElement === void 0 ? void 0 : _script$parentElement.querySelector("img");
44
+ globalMedia.mediaCountSsr = globalMedia.mediaCountSsr || 0;
45
+ if (img) {
46
+ if (featureFlags["media-perf-lazy-loading-optimisation"] && globalMedia.mediaCountSsr < params.maxEagerLoadCount) {
47
+ globalMedia.mediaCountSsr++;
48
+ img.removeAttribute("loading");
49
+ currData.loading = "";
50
+ const observer = new PerformanceObserver(entries => {
51
+ entries.getEntries().forEach(entry => {
52
+ if (srcSet.includes(entry.name)) {
53
+ globalMedia.performanceEntries = globalMedia.performanceEntries || [];
54
+ globalMedia.performanceEntries.push(entry);
55
+ observer.disconnect();
56
+ }
57
+ });
58
+ });
59
+ observer.observe({
60
+ type: 'resource'
61
+ });
62
+ }
63
+ if (dataURI) {
64
+ img.src = dataURI;
65
+ }
66
+ if (srcSet) {
67
+ img.srcset = srcSet;
68
+ }
69
+ currData.loadPromise = new Promise(function (resolve, reject) {
70
+ // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
71
+ img.addEventListener("load", () => resolve());
72
+ // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
73
+ img.addEventListener("error", () => reject(new Error("Failed to load image")));
74
+ });
75
+ }
76
+ mediaCardSsr[key] = isPreviousImageLarger ? prevData : currData;
77
+ } else {
78
+ mediaCardSsr[key] = {
79
+ dataURI: paramDataURI,
80
+ dimensions,
81
+ error
82
+ };
83
+ }
84
+ script === null || script === void 0 ? void 0 : script.remove();
85
+
86
+ // this replace will be used as a placeholder for the stringified params to be injected into the script
87
+ })({
88
+ replace: ""
89
+ });
@@ -86,16 +86,23 @@ export const useFilePreview = ({
86
86
  };
87
87
  }
88
88
  if (!(ssrData !== null && ssrData !== void 0 && ssrData.dataURI)) {
89
- try {
90
- return getSSRPreview(ssr, mediaClient, identifier.id, imageURLParams, mediaBlobUrlAttrs);
91
- } catch (e) {
92
- ssrReliabilityRef.current = {
93
- ...ssrReliabilityRef.current,
94
- [ssr]: {
95
- status: 'fail',
96
- ...extractErrorInfo(e, traceContext)
97
- }
98
- };
89
+ // Only attempt SSR preview generation if:
90
+ // 1. We're on the server (ssr='server'), OR
91
+ // 2. We're on the client AND there is SSR data (meaning SSR actually happened)
92
+ // If ssr='client' but there's no SSR data, it means this is a client-side navigation
93
+ // where no SSR occurred, so we should skip SSR preview generation entirely.
94
+ if (ssr === 'server' || ssrData) {
95
+ try {
96
+ return getSSRPreview(ssr, mediaClient, identifier.id, imageURLParams, mediaBlobUrlAttrs);
97
+ } catch (e) {
98
+ ssrReliabilityRef.current = {
99
+ ...ssrReliabilityRef.current,
100
+ [ssr]: {
101
+ status: 'fail',
102
+ ...extractErrorInfo(e, traceContext)
103
+ }
104
+ };
105
+ }
99
106
  }
100
107
  } else {
101
108
  const {
@@ -282,7 +289,7 @@ export const useFilePreview = ({
282
289
  client: createFailedSSRObject(failedPreview, traceContext)
283
290
  };
284
291
  }
285
- const isSSR = isSSRDataPreview(failedPreview) || (fg('jfp-magma-fix-failed-ssr-preview-load') ? isSSRClientPreview(failedPreview) : false);
292
+ const isSSR = isSSRDataPreview(failedPreview) || isSSRClientPreview(failedPreview);
286
293
 
287
294
  // If the preview failed and it comes from server (global scope / ssrData), it means that we have reused it in client and the error counts for both: server & client.
288
295
  if (isSSR) {
@@ -1,4 +1,3 @@
1
- import { printFunctionCall, printScript } from './printScript';
2
1
  // ----- WARNING -----
3
2
  // This is a very sensitive fraction of code.
4
3
  // Any changes to this file must be tested directly in product before merging.
@@ -7,6 +6,7 @@ import { printFunctionCall, printScript } from './printScript';
7
6
 
8
7
  export var GLOBAL_MEDIA_CARD_SSR = 'mediaCardSsr';
9
8
  export var GLOBAL_MEDIA_COUNT_SSR = 'mediaCountSsr';
9
+ export var GLOBAL_MEDIA_PERFORMANCE_ENTRIES = 'performanceEntries';
10
10
  export var GLOBAL_MEDIA_NAMESPACE = '__MEDIA_INTERNAL';
11
11
  var MAX_EAGER_LOAD_COUNT = 6;
12
12
  export function getMediaGlobalScope() {
@@ -28,26 +28,6 @@ export function getMediaCardSSR() {
28
28
  }
29
29
  return globalMedia[key];
30
30
  }
31
- export function getMediaCountSSR() {
32
- var globalScope = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window;
33
- var globalMedia = getMediaGlobalScope(globalScope);
34
- // Must match GLOBAL_MEDIA_COUNT_SSR. Can't reference the constant from here.
35
- var key = 'mediaCountSsr';
36
- if (!globalMedia[key]) {
37
- globalMedia[key] = 0;
38
- }
39
- return globalMedia[key];
40
- }
41
- export function incrementMediaCountSSR() {
42
- var globalScope = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window;
43
- var globalMedia = getMediaGlobalScope(globalScope);
44
- // Must match GLOBAL_MEDIA_COUNT_SSR. Can't reference the constant from here.
45
- var key = 'mediaCountSsr';
46
- if (!globalMedia[key]) {
47
- globalMedia[key] = 0;
48
- }
49
- globalMedia[key]++;
50
- }
51
31
  var dashed = function dashed(param) {
52
32
  return param ? "-".concat(param) : '';
53
33
  };
@@ -57,62 +37,24 @@ export var getKey = function getKey(_ref, resizeMode) {
57
37
  occurrenceKey = _ref.occurrenceKey;
58
38
  return "".concat(id).concat(dashed(collectionName)).concat(dashed(occurrenceKey)).concat(dashed(resizeMode));
59
39
  };
60
- export var storeDataURI = function storeDataURI(key, paramDataURI, paramMode, paramSrcSet, dimensions, error) {
61
- var featureFlags = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {};
62
- var globalScope = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : window;
63
- var mediaCardSsr = getMediaCardSSR(globalScope);
64
- var mediaCountSsr = getMediaCountSSR(globalScope);
65
- if (featureFlags['media-perf-uplift-mutation-fix']) {
66
- var _prevData$dimensions, _script;
67
- var prevData = mediaCardSsr[key];
68
- var isPreviousImageLarger = (prevData === null || prevData === void 0 ? void 0 : prevData.mode) === paramMode && prevData && ((_prevData$dimensions = prevData.dimensions) === null || _prevData$dimensions === void 0 ? void 0 : _prevData$dimensions.width) && (dimensions === null || dimensions === void 0 ? void 0 : dimensions.width) && prevData.dimensions.width > dimensions.width;
69
- var srcSet = isPreviousImageLarger ? prevData === null || prevData === void 0 ? void 0 : prevData.srcSet : paramSrcSet;
70
- var dataURI = isPreviousImageLarger ? prevData === null || prevData === void 0 ? void 0 : prevData.dataURI : paramDataURI;
71
- var currData = {
72
- dataURI: dataURI,
73
- dimensions: dimensions,
74
- error: error,
75
- srcSet: srcSet,
76
- loading: 'lazy'
77
- };
78
- var img = (_script = script) === null || _script === void 0 || (_script = _script.parentElement) === null || _script === void 0 ? void 0 : _script.querySelector('img');
79
- if (img && featureFlags['media-perf-lazy-loading-optimisation'] && mediaCountSsr < MAX_EAGER_LOAD_COUNT) {
80
- incrementMediaCountSSR(globalScope);
81
- if (img.getAttribute('loading') === 'lazy') {
82
- img.removeAttribute('loading');
83
- }
84
- currData.loading = '';
85
- }
86
- if (img && dataURI) {
87
- img.src = dataURI;
88
- }
89
- if (img && srcSet) {
90
- img.srcset = srcSet;
91
- }
92
- currData.loadPromise = new Promise(function (resolve, reject) {
93
- // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
94
- img === null || img === void 0 || img.addEventListener('load', function () {
95
- resolve(void 0);
96
- });
97
-
98
- // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
99
- img === null || img === void 0 || img.addEventListener('error', function () {
100
- reject(new Error('Failed to load image'));
101
- });
102
- });
103
- mediaCardSsr[key] = isPreviousImageLarger ? prevData : currData;
104
- } else {
105
- mediaCardSsr[key] = {
106
- dataURI: paramDataURI,
107
- dimensions: dimensions,
108
- error: error
109
- };
110
- }
111
- };
112
40
  var generateScript = function generateScript(identifier, dataURI, mode, srcSet, dimensions, error) {
113
41
  var featureFlags = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {};
114
- var functionCall = printFunctionCall(storeDataURI, getKey(identifier, mode), dataURI, mode, srcSet, dimensions, error, featureFlags);
115
- return printScript([getMediaCardSSR.toString(), getMediaGlobalScope.toString(), functionCall]);
42
+ var key = getKey(identifier, mode);
43
+
44
+ // Serialize the parameters for injection into the script
45
+ var params = {
46
+ key: key,
47
+ dataURI: dataURI,
48
+ mode: mode,
49
+ srcSet: srcSet,
50
+ dimensions: dimensions,
51
+ error: error,
52
+ featureFlags: featureFlags,
53
+ maxEagerLoadCount: MAX_EAGER_LOAD_COUNT
54
+ };
55
+
56
+ // Read originalScriptCode.ts before making changes
57
+ return "!function(e){var r=document.currentScript,i=window.__MEDIA_INTERNAL=window.__MEDIA_INTERNAL||{},n=i.mediaCardSsr=i.mediaCardSsr||{},o=e.key,t=e.dataURI,d=e.mode,a=e.srcSet,s=e.dimensions,m=e.error,l=e.featureFlags;if(l[\"media-perf-uplift-mutation-fix\"]){var u,c,f=n[o],v=f&&f.mode===d&&(null===(u=f.dimensions)||void 0===u?void 0:u.width)&&(null==s?void 0:s.width)&&f.dimensions.width>s.width,E=v?f.srcSet:a,p=v?f.dataURI:t,w={dataURI:p,dimensions:s,error:m,srcSet:E,loading:\"lazy\",loadPromise:void 0,mode:d},S=null==r||null===(c=r.parentElement)||void 0===c?void 0:c.querySelector(\"img\");if(i.mediaCountSsr=i.mediaCountSsr||0,S){if(l[\"media-perf-lazy-loading-optimisation\"]&&i.mediaCountSsr<e.maxEagerLoadCount){i.mediaCountSsr++,S.removeAttribute(\"loading\"),w.loading=\"\";var g=new PerformanceObserver((function(e){e.getEntries().forEach((function(e){E.includes(e.name)&&(i.performanceEntries=i.performanceEntries||[],i.performanceEntries.push(e),g.disconnect())}))}));g.observe({type:\"resource\"})}p&&(S.src=p),E&&(S.srcset=E),w.loadPromise=new Promise((function(e,r){S.addEventListener(\"load\",(function(){return e()})),S.addEventListener(\"error\",(function(){return r(new Error(\"Failed to load image\"))}))}))}n[o]=v?f:w}else n[o]={dataURI:t,dimensions:s,error:m};null==r||r.remove()}({replace:\"\"});".replace('{replace:""}', JSON.stringify(params));
116
58
  };
117
59
  export var generateScriptProps = function generateScriptProps(identifier, dataURI, mode, srcSet, dimensions, error) {
118
60
  var featureFlags = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {};
@@ -0,0 +1,91 @@
1
+ /* eslint-disable @atlaskit/platform/no-direct-document-usage */
2
+
3
+ /** IMPORTANT: This is the original code for the script.
4
+ * Do not change the code without testing it in product first.
5
+ * Steps:
6
+ * 1. Make changes in this code
7
+ * 2. Manually minify the code into: https://repl.parceljs.org/#JTdCJTIyZmlsZXMlMjIlM0ElNUIlNUIlMjIlMkZzcmMlMkZpbmRleC50cyUyMiUyQyU3QiUyMnZhbHVlJTIyJTNBJTIyJTJGKiUyMGVzbGludC1kaXNhYmxlJTIwJTQwYXRsYXNraXQlMkZwbGF0Zm9ybSUyRm5vLWRpcmVjdC1kb2N1bWVudC11c2FnZSUyMColMkYlNUNuJTVDbiUyRioqJTIwSU1QT1JUQU5UJTNBJTIwVGhpcyUyMGlzJTIwdGhlJTIwb3JpZ2luYWwlMjBjb2RlJTIwZm9yJTIwdGhlJTIwc2NyaXB0LiU1Q24lMjAqJTIwRG8lMjBub3QlMjBjaGFuZ2UlMjB0aGUlMjBjb2RlJTIwd2l0aG91dCUyMHRlc3RpbmclMjBpdCUyMGluJTIwcHJvZHVjdCUyMGZpcnN0LiU1Q24lMjAqJTIwU3RlcHMlM0ElNUNuJTIwKiUyMDEuJTIwTWFrZSUyMGNoYW5nZXMlMjBpbiUyMHRoaXMlMjBjb2RlJTVDbiUyMColMjAyLiUyME1hbnVhbGx5JTIwbWluaWZ5JTIwdGhlJTIwY29kZSUyMGludG8lM0ElMjBodHRwcyUzQSUyRiUyRnJlcGwucGFyY2VsanMub3JnJTJGJTIzSlRkQ0pUSXlabWxzWlhNbE1qSWxNMEVsTlVJbE5VSWxNaklsTWtaemNtTWxNa1pwYm1SbGVDNTBjeVV5TWlVeVF5VTNRaVV5TW5aaGJIVmxKVEl5SlROQkpUSXlKVEpHS2lVeU1HVnpiR2x1ZEMxa2FYTmhZbXhsSlRJd0pUUXdZWFJzWVhOcmFYUWxNa1p3YkdGMFptOXliU1V5Um01dkxXUnBjbVZqZEMxa2IyTjFiV1Z1ZEMxMWMyRm5aU1V5TUNvbE1rWWxOVU51SlRWRGJpVXlSaW9xSlRJd1NVMVFUMUpVUVU1VUpUTkJKVEl3VkdocGN5VXlNR2x6SlRJd2RHaGxKVEl3YjNKcFoybHVZV3dsTWpCamIyUmxKVEl3Wm05eUpUSXdkR2hsSlRJd2MyTnlhWEIwTGlVMVEyNGxNakFxSlRJd1JHOGxNakJ1YjNRbE1qQmphR0Z1WjJVbE1qQjBhR1VsTWpCamIyUmxKVEl3ZDJsMGFHOTFkQ1V5TUhSbGMzUnBibWNsTWpCcGRDVXlNR2x1SlRJd2NISnZaSFZqZENVeU1HWnBjbk4wTGlVMVEyNGxNakFxSlRJd1UzUmxjSE1sTTBFbE5VTnVKVEl3S2lVeU1ERXVKVEl3VFdGclpTVXlNR05vWVc1blpYTWxNakJwYmlVeU1IUm9hWE1sTWpCamIyUmxKVFZEYmlVeU1Db2xNakF5TGlVeU1FMWhiblZoYkd4NUpUSXdiV2x1YVdaNUpUSXdkR2hsSlRJd1kyOWtaU1V5TUhacFlTVXlNR2gwZEhCekpUTkJKVEpHSlRKR2NtVndiQzV3WVhKalpXeHFjeTV2Y21jbE1rWWxOVU51SlRJd0tpVXlNRE11SlRJd1EyOXdlU1V5TUhSb1pTVXlNRzFwYm1sbWFXVmtKVEl3WTI5a1pTVXlNR2x1ZEc4bE1qQm5iRzlpWVd4VFkyOXdaUzUwYzNnbE1qQnlaWEJzWVdOcGJtY2xNakIwYUdVbE1qQmxlR2x6ZEdsdVp5VXlNSE4wY21sdVp5VXlNSGRvWlhKbEpUSXdhWFFsTWpCellYbHpKVEl3VUVGVFZFVWxNakJJUlZKRkpUVkRiaVV5TUNvbE1qQTBMaVV5TUZKMWJpVXlNSFJvWlNVeU1IUmxjM1J6SlRJd1lXNWtKVEl3YldGclpTVXlNSE4xY21VbE1qQjBhR1Y1SlRJd2NHRnpjeVUxUTI0bE1qQXFKVEl3TlM0bE1qQlVSVk5VSlRJd1NVNGxNakJRVWs5RVZVTlVVeVV5TUVKRlJrOVNSU1V5TUUxRlVrZEpUa2NsTlVOdUpUSXdLaVUxUTI0bE1qQXFKVEpHSlRWRGJpVTFRMjVtZFc1amRHbHZiaVV5TUdkbGRFMWxaR2xoUjJ4dlltRnNVMk52Y0dVb0tTVXlNQ1UzUWlVMVEyNGxNakFsTWpCamIyNXpkQ1V5TUc1aGJXVnpjR0ZqWlNVeU1DVXpSQ1V5TUNVMVF5VXlNbDlmVFVWRVNVRmZTVTVVUlZKT1FVd2xOVU1sTWpJbE0wSWxOVU51SlRJd0pUSXdhV1lsTWpBb0lTaDNhVzVrYjNjbE1qQmhjeVV5TUdGdWVTa2xOVUp1WVcxbGMzQmhZMlVsTlVRcEpUSXdKVGRDSlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ2gzYVc1a2IzY2xNakJoY3lVeU1HRnVlU2tsTlVKdVlXMWxjM0JoWTJVbE5VUWxNakFsTTBRbE1qQWxOMElsTjBRbE0wSWxOVU51SlRJd0pUSXdKVGRFSlRWRGJpVXlNQ1V5TUhKbGRIVnliaVV5TUNoM2FXNWtiM2NsTWpCaGN5VXlNR0Z1ZVNrbE5VSnVZVzFsYzNCaFkyVWxOVVFsTTBJbE5VTnVKVGRFSlRWRGJpVTFRMjVtZFc1amRHbHZiaVV5TUdkbGRFMWxaR2xoUTJGeVpGTlRVaWdwSlRJd0pUZENKVFZEYmlVeU1DVXlNR052Ym5OMEpUSXdaMnh2WW1Gc1RXVmthV0VsTWpBbE0wUWxNakJuWlhSTlpXUnBZVWRzYjJKaGJGTmpiM0JsS0NrbE0wSWxOVU51SlRJd0pUSXdZMjl1YzNRbE1qQnJaWGtsTWpBbE0wUWxNakFsTlVNbE1qSnRaV1JwWVVOaGNtUlRjM0lsTlVNbE1qSWxNMElsTlVOdUpUSXdKVEl3YVdZbE1qQW9JV2RzYjJKaGJFMWxaR2xoSlRWQ2EyVjVKVFZFS1NVeU1DVTNRaVUxUTI0bE1qQWxNakFsTWpBbE1qQm5iRzlpWVd4TlpXUnBZU1UxUW10bGVTVTFSQ1V5TUNVelJDVXlNQ1UzUWlVM1JDVXpRaVUxUTI0bE1qQWxNakFsTjBRbE5VTnVKVEl3SlRJd2NtVjBkWEp1SlRJd1oyeHZZbUZzVFdWa2FXRWxOVUpyWlhrbE5VUWxNMElsTlVOdUpUZEVKVFZEYmlVMVEyNW1kVzVqZEdsdmJpVXlNR2RsZEUxbFpHbGhRMjkxYm5SVFUxSW9LU1V5TUNVM1FpVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1HZHNiMkpoYkUxbFpHbGhKVEl3SlRORUpUSXdaMlYwVFdWa2FXRkhiRzlpWVd4VFkyOXdaU2dwSlROQ0pUVkRiaVV5TUNVeU1HTnZibk4wSlRJd2EyVjVKVEl3SlRORUpUSXdKVFZESlRJeWJXVmthV0ZEYjNWdWRGTnpjaVUxUXlVeU1pVXpRaVUxUTI0bE1qQWxNakJwWmlVeU1DZ2haMnh2WW1Gc1RXVmthV0VsTlVKclpYa2xOVVFwSlRJd0pUZENKVFZEYmlVeU1DVXlNQ1V5TUNVeU1HZHNiMkpoYkUxbFpHbGhKVFZDYTJWNUpUVkVKVEl3SlRORUpUSXdNQ1V6UWlVMVEyNGxNakFsTWpBbE4wUWxOVU51SlRJd0pUSXdjbVYwZFhKdUpUSXdaMnh2WW1Gc1RXVmthV0VsTlVKclpYa2xOVVFsTTBJbE5VTnVKVGRFSlRWRGJpVTFRMjVtZFc1amRHbHZiaVV5TUdsdVkzSmxiV1Z1ZEUxbFpHbGhRMjkxYm5SVFUxSW9LU1V5TUNVM1FpVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1HZHNiMkpoYkUxbFpHbGhKVEl3SlRORUpUSXdaMlYwVFdWa2FXRkhiRzlpWVd4VFkyOXdaU2dwSlROQ0pUVkRiaVV5TUNVeU1HTnZibk4wSlRJd2EyVjVKVEl3SlRORUpUSXdKVFZESlRJeWJXVmthV0ZEYjNWdWRGTnpjaVUxUXlVeU1pVXpRaVUxUTI0bE1qQWxNakJwWmlVeU1DZ2haMnh2WW1Gc1RXVmthV0VsTlVKclpYa2xOVVFwSlRJd0pUZENKVFZEYmlVeU1DVXlNQ1V5TUNVeU1HZHNiMkpoYkUxbFpHbGhKVFZDYTJWNUpUVkVKVEl3SlRORUpUSXdNQ1V6UWlVMVEyNGxNakFsTWpBbE4wUWxOVU51SlRJd0pUSXdaMnh2WW1Gc1RXVmthV0VsTlVKclpYa2xOVVFsTWtJbE1rSWxNMElsTlVOdUpUZEVKVFZEYmlVMVEyNG9ablZ1WTNScGIyNGxNakFvY0dGeVlXMXpKVE5CSlRJd1lXNTVLU1V5TUNVM1FpVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1ITmpjbWx3ZENVeU1DVXpSQ1V5TUdSdlkzVnRaVzUwTG1OMWNuSmxiblJUWTNKcGNIUWxNMElsTlVOdUpUVkRiaVV5TUNVeU1DVXlSaVV5UmlVeU1GTjBiM0psSlRJd2RHaGxKVEl3WkdGMFlTVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1HMWxaR2xoUTJGeVpGTnpjaVV5TUNVelJDVXlNR2RsZEUxbFpHbGhRMkZ5WkZOVFVpZ3BKVE5DSlRWRGJpVXlNQ1V5TUdOdmJuTjBKVEl3YldWa2FXRkRiM1Z1ZEZOemNpVXlNQ1V6UkNVeU1HZGxkRTFsWkdsaFEyOTFiblJUVTFJb0tTVXpRaVUxUTI0bE1qQWxNakJqYjI1emRDVXlNQ1UzUWlVeU1HdGxlU1V5TUNVM1JDVXlNQ1V6UkNVeU1IQmhjbUZ0Y3lVelFpVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1IQmhjbUZ0UkdGMFlWVlNTU1V5TUNVelJDVXlNSEJoY21GdGN5NWtZWFJoVlZKSkpUTkNKVFZEYmlVeU1DVXlNR052Ym5OMEpUSXdjR0Z5WVcxTmIyUmxKVEl3SlRORUpUSXdjR0Z5WVcxekxtMXZaR1VsTTBJbE5VTnVKVEl3SlRJd1kyOXVjM1FsTWpCd1lYSmhiVk55WTFObGRDVXlNQ1V6UkNVeU1IQmhjbUZ0Y3k1emNtTlRaWFFsTTBJbE5VTnVKVEl3SlRJd1kyOXVjM1FsTWpBbE4wSWxNakJrYVcxbGJuTnBiMjV6SlRJd0pUZEVKVEl3SlRORUpUSXdjR0Z5WVcxekpUTkNKVFZEYmlVeU1DVXlNR052Ym5OMEpUSXdKVGRDSlRJd1pYSnliM0lsTWpBbE4wUWxNakFsTTBRbE1qQndZWEpoYlhNbE0wSWxOVU51SlRJd0pUSXdZMjl1YzNRbE1qQWxOMElsTWpCbVpXRjBkWEpsUm14aFozTWxNakFsTjBRbE1qQWxNMFFsTWpCd1lYSmhiWE1sTTBJbE5VTnVKVFZEYmlVeU1DVXlNR2xtSlRJd0tHWmxZWFIxY21WR2JHRm5jeVUxUWlVMVF5VXlNbTFsWkdsaExYQmxjbVl0ZFhCc2FXWjBMVzExZEdGMGFXOXVMV1pwZUNVMVF5VXlNaVUxUkNrbE1qQWxOMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdZMjl1YzNRbE1qQndjbVYyUkdGMFlTVXlNQ1V6UkNVeU1HMWxaR2xoUTJGeVpGTnpjaVUxUW10bGVTVTFSQ1V6UWlVMVEyNGxNakFsTWpBbE1qQWxNakJqYjI1emRDVXlNR2x6VUhKbGRtbHZkWE5KYldGblpVeGhjbWRsY2lVeU1DVXpSQ1UxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpCd2NtVjJSR0YwWVNVeU1DVXlOaVV5TmlVMVEyNGxNakFsTWpBbE1qQWxNakFsTWpBbE1qQndjbVYyUkdGMFlTNXRiMlJsSlRJd0pUTkVKVE5FSlRORUpUSXdjR0Z5WVcxTmIyUmxKVEl3SlRJMkpUSTJKVFZEYmlVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUhCeVpYWkVZWFJoTG1ScGJXVnVjMmx2Ym5NbE1qQWxNallsTWpZbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjSEpsZGtSaGRHRXVaR2x0Wlc1emFXOXVjeTUzYVdSMGFDVXlNQ1V5TmlVeU5pVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJrYVcxbGJuTnBiMjV6SlRJd0pUSTJKVEkySlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1HUnBiV1Z1YzJsdmJuTXVkMmxrZEdnbE1qQWxNallsTWpZbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjSEpsZGtSaGRHRXVaR2x0Wlc1emFXOXVjeTUzYVdSMGFDVXlNQ1V6UlNVeU1HUnBiV1Z1YzJsdmJuTXVkMmxrZEdnbE0wSWxOVU51SlRWRGJpVXlNQ1V5TUNVeU1DVXlNR052Ym5OMEpUSXdjM0pqVTJWMEpUSXdKVE5FSlRJd2FYTlFjbVYyYVc5MWMwbHRZV2RsVEdGeVoyVnlKVEl3SlROR0pUSXdjSEpsZGtSaGRHRXVjM0pqVTJWMEpUSXdKVE5CSlRJd2NHRnlZVzFUY21OVFpYUWxNMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdZMjl1YzNRbE1qQmtZWFJoVlZKSkpUSXdKVE5FSlRJd2FYTlFjbVYyYVc5MWMwbHRZV2RsVEdGeVoyVnlKVEl3SlROR0pUSXdjSEpsZGtSaGRHRXVaR0YwWVZWU1NTVXlNQ1V6UVNVeU1IQmhjbUZ0UkdGMFlWVlNTU1V6UWlVMVEyNGxOVU51SlRJd0pUSXdKVEl3SlRJd1kyOXVjM1FsTWpCamRYSnlSR0YwWVNVelFTVXlNR0Z1ZVNVeU1DVXpSQ1V5TUNVM1FpVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJrWVhSaFZWSkpKVEpESlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1HUnBiV1Z1YzJsdmJuTWxNa01sTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd1pYSnliM0lsTWtNbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjM0pqVTJWMEpUSkRKVFZEYmlVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUd4dllXUnBibWNsTTBFbE1qQWxOVU1sTWpKc1lYcDVKVFZESlRJeUpUSkRKVFZEYmlVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUd4dllXUlFjbTl0YVhObEpUTkJKVEl3ZFc1a1pXWnBibVZrSlRKREpUVkRiaVUxUTNRbE5VTjBKVFZEZEcxdlpHVWxNMEVsTWpCd1lYSmhiVTF2WkdVbE1rTWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUZEVKVE5DSlRWRGJpVTFRMjRsTWpBbE1qQWxNakFsTWpCamIyNXpkQ1V5TUdsdFp5VXlNQ1V6UkNVMVEyNGxNakFsTWpBbE1qQWxNakFsTWpBbE1qQnpZM0pwY0hRbE1qQWxNallsTWpZbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjMk55YVhCMExuQmhjbVZ1ZEVWc1pXMWxiblFsTWpBbE1qWWxNallsTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd2MyTnlhWEIwTG5CaGNtVnVkRVZzWlcxbGJuUXVjWFZsY25sVFpXeGxZM1J2Y2lnbE5VTWxNakpwYldjbE5VTWxNaklwSlROQ0pUVkRiaVUxUTI0bE1qQWxNakFsTWpBbE1qQnBaaVV5TUNnbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdhVzFuSlRJd0pUSTJKVEkySlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1HWmxZWFIxY21WR2JHRm5jeVUxUWlVMVF5VXlNbTFsWkdsaExYQmxjbVl0YkdGNmVTMXNiMkZrYVc1bkxXOXdkR2x0YVhOaGRHbHZiaVUxUXlVeU1pVTFSQ1V5TUNVeU5pVXlOaVUxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpCdFpXUnBZVU52ZFc1MFUzTnlKVEl3SlROREpUSXdjR0Z5WVcxekxtMWhlRVZoWjJWeVRHOWhaRU52ZFc1MEpUVkRiaVV5TUNVeU1DVXlNQ1V5TUNrbE1qQWxOMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd2FXNWpjbVZ0Wlc1MFRXVmthV0ZEYjNWdWRGTlRVaWdwSlROQ0pUVkRiaVV5TUNVeU1DVXlNQ1V5TUNVeU1DVXlNR2xtSlRJd0tHbHRaeTVuWlhSQmRIUnlhV0oxZEdVb0pUVkRKVEl5Ykc5aFpHbHVaeVUxUXlVeU1pa2xNakFsTTBRbE0wUWxNMFFsTWpBbE5VTWxNakpzWVhwNUpUVkRKVEl5S1NVeU1DVTNRaVUxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJwYldjdWNtVnRiM1psUVhSMGNtbGlkWFJsS0NVMVF5VXlNbXh2WVdScGJtY2xOVU1sTWpJcEpUTkNKVFZEYmlVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVM1JDVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJqZFhKeVJHRjBZUzVzYjJGa2FXNW5KVEl3SlRORUpUSXdKVFZESlRJeUpUVkRKVEl5SlROQ0pUVkRiaVV5TUNVeU1DVXlNQ1V5TUNVM1JDVTFRMjRsTlVOdUpUSXdKVEl3SlRJd0pUSXdhV1lsTWpBb2FXMW5KVEl3SlRJMkpUSTJKVEl3WkdGMFlWVlNTU2tsTWpBbE4wSWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3YVcxbkxuTnlZeVV5TUNVelJDVXlNR1JoZEdGVlVra2xNMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdKVGRFSlRWRGJpVXlNQ1V5TUNVeU1DVXlNR2xtSlRJd0tHbHRaeVV5TUNVeU5pVXlOaVV5TUhOeVkxTmxkQ2tsTWpBbE4wSWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3YVcxbkxuTnlZM05sZENVeU1DVXpSQ1V5TUhOeVkxTmxkQ1V6UWlVMVEyNGxNakFsTWpBbE1qQWxNakFsTjBRbE5VTnVKVFZEYmlVeU1DVXlNQ1V5TUNVeU1HTjFjbkpFWVhSaExteHZZV1JRY205dGFYTmxKVEl3SlRORUpUSXdibVYzSlRJd1VISnZiV2x6WlNVelEzWnZhV1FsTTBVb1puVnVZM1JwYjI0bE1qQW9jbVZ6YjJ4MlpTVXlReVV5TUhKbGFtVmpkQ2tsTWpBbE4wSWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3YVdZbE1qQW9hVzFuS1NVeU1DVTNRaVUxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWtZbE1rWWxNakJsYzJ4cGJuUXRaR2x6WVdKc1pTMXVaWGgwTFd4cGJtVWxNakFsTkRCeVpYQnZKVEpHYVc1MFpYSnVZV3dsTWtaa2IyMHRaWFpsYm5SekpUSkdibTh0ZFc1ellXWmxMV1YyWlc1MExXeHBjM1JsYm1WeWN5VTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQnBiV2N1WVdSa1JYWmxiblJNYVhOMFpXNWxjaWdsTlVNbE1qSnNiMkZrSlRWREpUSXlKVEpESlRJd1puVnVZM1JwYjI0bE1qQW9LU1V5TUNVM1FpVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpCeVpYTnZiSFpsS0hWdVpHVm1hVzVsWkNrbE0wSWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVGRFS1NVelFpVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNa1lsTWtZbE1qQmxjMnhwYm5RdFpHbHpZV0pzWlMxdVpYaDBMV3hwYm1VbE1qQWxOREJ5WlhCdkpUSkdhVzUwWlhKdVlXd2xNa1prYjIwdFpYWmxiblJ6SlRKR2JtOHRkVzV6WVdabExXVjJaVzUwTFd4cGMzUmxibVZ5Y3lVMVEyNGxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpCcGJXY3VZV1JrUlhabGJuUk1hWE4wWlc1bGNpZ2xOVU1sTWpKbGNuSnZjaVUxUXlVeU1pVXlReVV5TUdaMWJtTjBhVzl1SlRJd0tDa2xNakFsTjBJbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3Y21WcVpXTjBLRzVsZHlVeU1FVnljbTl5S0NVMVF5VXlNa1poYVd4bFpDVXlNSFJ2SlRJd2JHOWhaQ1V5TUdsdFlXZGxKVFZESlRJeUtTa2xNMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRkRUtTVXpRaVUxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE4wUWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUZEVLU1V6UWlVMVEyNGxOVU51SlRJd0pUSXdKVEl3SlRJd2JXVmthV0ZEWVhKa1UzTnlKVFZDYTJWNUpUVkVKVEl3SlRORUpUSXdhWE5RY21WMmFXOTFjMGx0WVdkbFRHRnlaMlZ5SlRJd0pUTkdKVEl3Y0hKbGRrUmhkR0VsTWpBbE0wRWxNakJqZFhKeVJHRjBZU1V6UWlVMVEyNGxNakFsTWpBbE4wUWxNakJsYkhObEpUSXdKVGRDSlRWRGJpVXlNQ1V5TUNVeU1DVXlNRzFsWkdsaFEyRnlaRk56Y2lVMVFtdGxlU1UxUkNVeU1DVXpSQ1V5TUNVM1FpVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJrWVhSaFZWSkpKVE5CSlRJd2NHRnlZVzFFWVhSaFZWSkpKVEpESlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1HUnBiV1Z1YzJsdmJuTWxNa01sTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd1pYSnliM0lsTWtNbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRkRUpUTkNKVFZEYmlVeU1DVXlNQ1UzUkNVMVEyNGxOVU51SlRJd0pUSXdKVEpHSlRKR0pUSXdVbVZ0YjNabEpUSXdjMk55YVhCMEpUSXdkRzhsTWpCd2NtVjJaVzUwSlRJd2FIbGtjbUYwYVc5dUpUSXdiV2x6YldGMFkyZ2xOVU51SlRJd0pUSXdaRzlqZFcxbGJuUXVZM1Z5Y21WdWRGTmpjbWx3ZENVelJpNXlaVzF2ZG1Vb0tTVXpRaVUxUTI0bE5VTnVKVFZEZENVeVJpVXlSaVV5TUhSb2FYTWxNakJ5WlhCc1lXTmxKVEl3ZDJsc2JDVXlNR0psSlRJd2RYTmxaQ1V5TUdGekpUSXdZU1V5TUhCc1lXTmxhRzlzWkdWeUpUSXdabTl5SlRJd2RHaGxKVEl3YzNSeWFXNW5hV1pwWldRbE1qQndZWEpoYlhNbE1qQjBieVV5TUdKbEpUSXdhVzVxWldOMFpXUWxNakJwYm5SdkpUSXdkR2hsSlRJd2MyTnlhWEIwSlRWRGJpVTNSQ2tvSlRkQ0pUSXdjbVZ3YkdGalpTVXpRU1V5TUNVMVF5VXlNaVUxUXlVeU1pVXlNQ1UzUkNrbE0wSWxOVU51SlRJeUpUSkRKVEl5YVhORmJuUnllU1V5TWlVelFYUnlkV1VsTjBRbE5VUWxOVVFsTWtNbE1qSnZjSFJwYjI1ekpUSXlKVE5CSlRkQ0pUSXlaVzUwY21sbGN5VXlNaVV6UVNVMVFpVTFSQ1V5UXlVeU1tMXBibWxtZVNVeU1pVXpRWFJ5ZFdVbE1rTWxNakp6WTI5d1pVaHZhWE4wSlRJeUpUTkJkSEoxWlNVeVF5VXlNbk52ZFhKalpVMWhjSE1sTWpJbE0wRm1ZV3h6WlNVeVF5VXlNbkIxWW14cFkxVnliQ1V5TWlVelFTVXlNaVV5Umw5ZmNtVndiRjlrYVhOMEpUSXlKVEpESlRJeWRHRnlaMlYwVkhsd1pTVXlNaVV6UVNVeU1tSnliM2R6WlhKekpUSXlKVEpESlRJeWRHRnlaMlYwUlc1MkpUSXlKVE5CYm5Wc2JDVXlReVV5TW05MWRIQjFkRVp2Y20xaGRDVXlNaVV6UVc1MWJHd2xNa01sTWpKb2JYSWxNaklsTTBGbVlXeHpaU1V5UXlVeU1tMXZaR1VsTWpJbE0wRWxNakp3Y205a2RXTjBhVzl1SlRJeUpUSkRKVEl5Y21WdVpHVnlSM0poY0doekpUSXlKVE5CWm1Gc2MyVWxNa01sTWpKMmFXVjNVMjkxY21ObGJXRndjeVV5TWlVelFXWmhiSE5sSlRKREpUSXlaR1Z3Wlc1a1pXNWphV1Z6SlRJeUpUTkJKVFZDSlRWRUpUSkRKVEl5Ym5WdFYyOXlhMlZ5Y3lVeU1pVXpRVEFsTjBRbE1rTWxNakoxYzJWVVlXSnpKVEl5SlROQmRISjFaU1V5UXlVeU1tSnliM2R6WlhKRGIyeHNZWEJ6WldRbE1qSWxNMEVsTlVJbE5VUWxNa01sTWpKMmFXVjNjeVV5TWlVelFTVTFRaVV5TWlVeVJuTnlZeVV5Um1sdVpHVjRMblJ6SlRJeUpUVkVKVEpESlRJeVkzVnljbVZ1ZEZacFpYY2xNaklsTTBFd0pUZEUlNUNuJTIwKiUyMDMuJTIwQ29weSUyMHRoZSUyMG1pbmlmaWVkJTIwY29kZSUyMGludG8lMjBnbG9iYWxTY29wZS50c3glMjByZXBsYWNpbmclMjB0aGUlMjBleGlzdGluZyUyMHN0cmluZyUyMHdoZXJlJTIwaXQlMjBzYXlzJTIwUEFTVEUlMjBIRVJFJTVDbiUyMColMjA0LiUyMFJ1biUyMHRoZSUyMHRlc3RzJTIwYW5kJTIwbWFrZSUyMHN1cmUlMjB0aGV5JTIwcGFzcyU1Q24lMjAqJTIwNS4lMjBURVNUJTIwSU4lMjBQUk9EVUNUUyUyMEJFRk9SRSUyME1FUkdJTkclNUNuJTIwKiU1Q24lMjAqJTJGJTVDbiU1Q24oZnVuY3Rpb24lMjAocGFyYW1zJTNBJTIwYW55KSUyMCU3QiU1Q24lNUN0Y29uc3QlMjBzY3JpcHQlMjAlM0QlMjBkb2N1bWVudC5jdXJyZW50U2NyaXB0JTNCJTVDbiU1Q3Rjb25zdCUyMGdsb2JhbE1lZGlhJTIwJTNEJTIwKCh3aW5kb3clMjBhcyUyMGFueSkuX19NRURJQV9JTlRFUk5BTCUyMCUzRCUyMCh3aW5kb3clMjBhcyUyMGFueSkuX19NRURJQV9JTlRFUk5BTCUyMCU3QyU3QyUyMCU3QiU3RCklM0IlNUNuJTVDdGNvbnN0JTIwbWVkaWFDYXJkU3NyJTIwJTNEJTIwKGdsb2JhbE1lZGlhLm1lZGlhQ2FyZFNzciUyMCUzRCUyMGdsb2JhbE1lZGlhLm1lZGlhQ2FyZFNzciUyMCU3QyU3QyUyMCU3QiU3RCklM0IlNUNuJTVDdGNvbnN0JTIwJTdCJTIwa2V5JTJDJTIwZGF0YVVSSSUzQSUyMHBhcmFtRGF0YVVSSSUyQyUyMG1vZGUlM0ElMjBwYXJhbU1vZGUlMkMlMjBzcmNTZXQlM0ElMjBwYXJhbVNyY1NldCUyQyUyMGRpbWVuc2lvbnMlMkMlMjBlcnJvciUyQyUyMGZlYXR1cmVGbGFncyUyMCU3RCUyMCUzRCUyMHBhcmFtcyUzQiU1Q24lNUNuJTVDdGlmJTIwKGZlYXR1cmVGbGFncyU1QiU1QyUyMm1lZGlhLXBlcmYtdXBsaWZ0LW11dGF0aW9uLWZpeCU1QyUyMiU1RCklMjAlN0IlNUNuJTVDdCU1Q3Rjb25zdCUyMHByZXZEYXRhJTIwJTNEJTIwbWVkaWFDYXJkU3NyJTVCa2V5JTVEJTNCJTVDbiU1Q3QlNUN0Y29uc3QlMjBpc1ByZXZpb3VzSW1hZ2VMYXJnZXIlMjAlM0QlNUNuJTVDdCU1Q3QlNUN0cHJldkRhdGElMjAlMjYlMjYlNUNuJTVDdCU1Q3QlNUN0cHJldkRhdGEubW9kZSUyMCUzRCUzRCUzRCUyMHBhcmFtTW9kZSUyMCUyNiUyNiU1Q24lNUN0JTVDdCU1Q3RwcmV2RGF0YS5kaW1lbnNpb25zJTNGLndpZHRoJTIwJTI2JTI2JTVDbiU1Q3QlNUN0JTVDdGRpbWVuc2lvbnMlM0Yud2lkdGglMjAlMjYlMjYlNUNuJTVDdCU1Q3QlNUN0cHJldkRhdGEuZGltZW5zaW9ucy53aWR0aCUyMCUzRSUyMGRpbWVuc2lvbnMud2lkdGglM0IlNUNuJTVDbiU1Q3QlNUN0Y29uc3QlMjBzcmNTZXQlMjAlM0QlMjBpc1ByZXZpb3VzSW1hZ2VMYXJnZXIlMjAlM0YlMjBwcmV2RGF0YS5zcmNTZXQlMjAlM0ElMjBwYXJhbVNyY1NldCUzQiU1Q24lNUN0JTVDdGNvbnN0JTIwZGF0YVVSSSUyMCUzRCUyMGlzUHJldmlvdXNJbWFnZUxhcmdlciUyMCUzRiUyMHByZXZEYXRhLmRhdGFVUkklMjAlM0ElMjBwYXJhbURhdGFVUkklM0IlNUNuJTVDbiU1Q3QlNUN0Y29uc3QlMjBjdXJyRGF0YSUzQSUyMGFueSUyMCUzRCUyMCU3QiU1Q24lNUN0JTVDdCU1Q3RkYXRhVVJJJTJDJTVDbiU1Q3QlNUN0JTVDdGRpbWVuc2lvbnMlMkMlNUNuJTVDdCU1Q3QlNUN0ZXJyb3IlMkMlNUNuJTVDdCU1Q3QlNUN0c3JjU2V0JTJDJTVDbiU1Q3QlNUN0JTVDdGxvYWRpbmclM0ElMjAlNUMlMjJsYXp5JTVDJTIyJTJDJTVDbiU1Q3QlNUN0JTVDdGxvYWRQcm9taXNlJTNBJTIwdW5kZWZpbmVkJTJDJTVDbiU1Q3QlNUN0JTVDdG1vZGUlM0ElMjBwYXJhbU1vZGUlMkMlNUNuJTVDdCU1Q3QlN0QlM0IlNUNuJTVDbiU1Q3QlNUN0Y29uc3QlMjBpbWclMjAlM0QlMjBzY3JpcHQlM0YucGFyZW50RWxlbWVudCUzRi5xdWVyeVNlbGVjdG9yKCU1QyUyMmltZyU1QyUyMiklM0IlNUNuJTVDbiU1Q3QlNUN0Z2xvYmFsTWVkaWEubWVkaWFDb3VudFNzciUyMCUzRCUyMGdsb2JhbE1lZGlhLm1lZGlhQ291bnRTc3IlMjAlN0MlN0MlMjAwJTNCJTVDbiU1Q24lNUN0JTVDdGlmJTIwKGltZyklMjAlN0IlNUNuJTVDdCU1Q3QlNUN0aWYlMjAoJTVDbiU1Q3QlNUN0JTVDdCU1Q3RmZWF0dXJlRmxhZ3MlNUIlNUMlMjJtZWRpYS1wZXJmLWxhenktbG9hZGluZy1vcHRpbWlzYXRpb24lNUMlMjIlNUQlMjAlMjYlMjYlNUNuJTVDdCU1Q3QlNUN0JTVDdGdsb2JhbE1lZGlhLm1lZGlhQ291bnRTc3IlMjAlM0MlMjBwYXJhbXMubWF4RWFnZXJMb2FkQ291bnQlNUNuJTVDdCU1Q3QlNUN0KSUyMCU3QiU1Q24lNUN0JTVDdCU1Q3QlNUN0Z2xvYmFsTWVkaWEubWVkaWFDb3VudFNzciUyQiUyQiUzQiU1Q24lNUN0JTVDdCU1Q3QlNUN0aW1nLnJlbW92ZUF0dHJpYnV0ZSglNUMlMjJsb2FkaW5nJTVDJTIyKSUzQiU1Q24lNUN0JTVDdCU1Q3QlNUN0Y3VyckRhdGEubG9hZGluZyUyMCUzRCUyMCU1QyUyMiU1QyUyMiUzQiU1Q24lNUNuJTVDdCU1Q3QlNUN0JTVDdGNvbnN0JTIwb2JzZXJ2ZXIlMjAlM0QlMjBuZXclMjBQZXJmb3JtYW5jZU9ic2VydmVyKChlbnRyaWVzKSUyMCUzRCUzRSUyMCU3QiU1Q24lNUN0JTVDdCU1Q3QlNUN0JTVDdGVudHJpZXMuZ2V0RW50cmllcygpLmZvckVhY2goKGVudHJ5KSUyMCUzRCUzRSUyMCU3QiU1Q24lNUN0JTVDdCU1Q3QlNUN0JTVDdCU1Q3RpZiUyMChzcmNTZXQuaW5jbHVkZXMoZW50cnkubmFtZSkpJTIwJTdCJTVDbiU1Q3QlNUN0JTVDdCU1Q3QlNUN0JTVDdCU1Q3RnbG9iYWxNZWRpYS5wZXJmb3JtYW5jZUVudHJpZXMlMjAlM0QlMjBnbG9iYWxNZWRpYS5wZXJmb3JtYW5jZUVudHJpZXMlMjAlN0MlN0MlMjAlNUIlNUQlM0IlNUNuJTVDdCU1Q3QlNUN0JTVDdCU1Q3QlNUN0JTVDdGdsb2JhbE1lZGlhLnBlcmZvcm1hbmNlRW50cmllcy5wdXNoKGVudHJ5KSUzQiU1Q24lNUN0JTVDdCU1Q3QlNUN0JTVDdCU1Q3QlNUN0b2JzZXJ2ZXIuZGlzY29ubmVjdCgpJTNCJTVDbiU1Q3QlNUN0JTVDdCU1Q3QlNUN0JTVDdCU3RCU1Q24lNUN0JTVDdCU1Q3QlNUN0JTVDdCU3RCklM0IlNUNuJTVDdCU1Q3QlNUN0JTVDdCU3RCklM0IlNUNuJTVDdCU1Q3QlNUN0JTVDdG9ic2VydmVyLm9ic2VydmUoJTdCJTIwdHlwZSUzQSUyMCdyZXNvdXJjZSclMjAlN0QpJTNCJTVDbiU1Q3QlNUN0JTVDdCU3RCU1Q24lNUNuJTVDdCU1Q3QlNUN0aWYlMjAoZGF0YVVSSSklMjAlN0IlNUNuJTVDdCU1Q3QlNUN0JTVDdGltZy5zcmMlMjAlM0QlMjBkYXRhVVJJJTNCJTVDbiU1Q3QlNUN0JTVDdCU3RCU1Q24lNUN0JTVDdCU1Q3RpZiUyMChzcmNTZXQpJTIwJTdCJTVDbiU1Q3QlNUN0JTVDdCU1Q3RpbWcuc3Jjc2V0JTIwJTNEJTIwc3JjU2V0JTNCJTVDbiU1Q3QlNUN0JTVDdCU3RCU1Q24lNUN0JTVDdCU1Q3RjdXJyRGF0YS5sb2FkUHJvbWlzZSUyMCUzRCUyMG5ldyUyMFByb21pc2UlM0N2b2lkJTNFKGZ1bmN0aW9uJTIwKHJlc29sdmUlMkMlMjByZWplY3QpJTIwJTdCJTVDbiU1Q3QlNUN0JTVDdCU1Q3QlMkYlMkYlMjBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUlMjAlNDByZXBvJTJGaW50ZXJuYWwlMkZkb20tZXZlbnRzJTJGbm8tdW5zYWZlLWV2ZW50LWxpc3RlbmVycyU1Q24lNUN0JTVDdCU1Q3QlNUN0aW1nLmFkZEV2ZW50TGlzdGVuZXIoJTVDJTIybG9hZCU1QyUyMiUyQyUyMCgpJTIwJTNEJTNFJTIwcmVzb2x2ZSgpKSUzQiU1Q24lNUN0JTVDdCU1Q3QlNUN0JTJGJTJGJTIwZXNsaW50LWRpc2FibGUtbmV4dC1saW5lJTIwJTQwcmVwbyUyRmludGVybmFsJTJGZG9tLWV2ZW50cyUyRm5vLXVuc2FmZS1ldmVudC1saXN0ZW5lcnMlNUNuJTVDdCU1Q3QlNUN0JTVDdGltZy5hZGRFdmVudExpc3RlbmVyKCU1QyUyMmVycm9yJTVDJTIyJTJDJTIwKCklMjAlM0QlM0UlMjByZWplY3QobmV3JTIwRXJyb3IoJTVDJTIyRmFpbGVkJTIwdG8lMjBsb2FkJTIwaW1hZ2UlNUMlMjIpKSklM0IlNUNuJTVDdCU1Q3QlNUN0JTdEKSUzQiU1Q24lNUN0JTVDdCU3RCU1Q24lNUNuJTVDdCU1Q3RtZWRpYUNhcmRTc3IlNUJrZXklNUQlMjAlM0QlMjBpc1ByZXZpb3VzSW1hZ2VMYXJnZXIlMjAlM0YlMjBwcmV2RGF0YSUyMCUzQSUyMGN1cnJEYXRhJTNCJTVDbiU1Q3QlN0QlMjBlbHNlJTIwJTdCJTVDbiU1Q3QlNUN0bWVkaWFDYXJkU3NyJTVCa2V5JTVEJTIwJTNEJTIwJTdCJTVDbiU1Q3QlNUN0JTVDdGRhdGFVUkklM0ElMjBwYXJhbURhdGFVUkklMkMlNUNuJTVDdCU1Q3QlNUN0ZGltZW5zaW9ucyUyQyU1Q24lNUN0JTVDdCU1Q3RlcnJvciUyQyU1Q24lNUN0JTVDdCU3RCUzQiU1Q24lNUN0JTdEJTVDbiU1Q24lNUN0c2NyaXB0JTNGLnJlbW92ZSgpJTNCJTVDbiU1Q24lNUN0JTJGJTJGJTIwdGhpcyUyMHJlcGxhY2UlMjB3aWxsJTIwYmUlMjB1c2VkJTIwYXMlMjBhJTIwcGxhY2Vob2xkZXIlMjBmb3IlMjB0aGUlMjBzdHJpbmdpZmllZCUyMHBhcmFtcyUyMHRvJTIwYmUlMjBpbmplY3RlZCUyMGludG8lMjB0aGUlMjBzY3JpcHQlNUNuJTdEKSglN0IlMjByZXBsYWNlJTNBJTIwJTVDJTIyJTVDJTIyJTIwJTdEKSUzQiU1Q24lMjIlMkMlMjJpc0VudHJ5JTIyJTNBdHJ1ZSU3RCU1RCU1RCUyQyUyMm9wdGlvbnMlMjIlM0ElN0IlMjJlbnRyaWVzJTIyJTNBJTVCJTVEJTJDJTIybWluaWZ5JTIyJTNBdHJ1ZSUyQyUyMnNjb3BlSG9pc3QlMjIlM0F0cnVlJTJDJTIyc291cmNlTWFwcyUyMiUzQWZhbHNlJTJDJTIycHVibGljVXJsJTIyJTNBJTIyJTJGX19yZXBsX2Rpc3QlMjIlMkMlMjJ0YXJnZXRUeXBlJTIyJTNBJTIyYnJvd3NlcnMlMjIlMkMlMjJ0YXJnZXRFbnYlMjIlM0ElMjJzaW5jZSUyMDIwMTUlMjIlMkMlMjJvdXRwdXRGb3JtYXQlMjIlM0FudWxsJTJDJTIyaG1yJTIyJTNBZmFsc2UlMkMlMjJtb2RlJTIyJTNBJTIycHJvZHVjdGlvbiUyMiUyQyUyMnJlbmRlckdyYXBocyUyMiUzQWZhbHNlJTJDJTIydmlld1NvdXJjZW1hcHMlMjIlM0FmYWxzZSUyQyUyMmRlcGVuZGVuY2llcyUyMiUzQSU1QiU1RCUyQyUyMm51bVdvcmtlcnMlMjIlM0EwJTdEJTJDJTIydXNlVGFicyUyMiUzQXRydWUlMkMlMjJicm93c2VyQ29sbGFwc2VkJTIyJTNBJTVCJTVEJTJDJTIydmlld3MlMjIlM0ElNUIlMjIlMkZzcmMlMkZpbmRleC50cyUyMiU1RCUyQyUyMmN1cnJlbnRWaWV3JTIyJTNBMCU3RA==
8
+ * Ensure the settings have: Minification on and
9
+ * 3. Copy the minified code into globalScope.tsx replacing the existing string where it says PASTE HERE
10
+ * 4. Run the tests and make sure they pass
11
+ * 5. TEST IN PRODUCTS BEFORE MERGING
12
+ *
13
+ */
14
+
15
+ (function (params) {
16
+ var script = document.currentScript;
17
+ var globalMedia = window.__MEDIA_INTERNAL = window.__MEDIA_INTERNAL || {};
18
+ var mediaCardSsr = globalMedia.mediaCardSsr = globalMedia.mediaCardSsr || {};
19
+ var key = params.key,
20
+ paramDataURI = params.dataURI,
21
+ paramMode = params.mode,
22
+ paramSrcSet = params.srcSet,
23
+ dimensions = params.dimensions,
24
+ error = params.error,
25
+ featureFlags = params.featureFlags;
26
+ if (featureFlags["media-perf-uplift-mutation-fix"]) {
27
+ var _prevData$dimensions, _script$parentElement;
28
+ var prevData = mediaCardSsr[key];
29
+ var isPreviousImageLarger = prevData && prevData.mode === paramMode && ((_prevData$dimensions = prevData.dimensions) === null || _prevData$dimensions === void 0 ? void 0 : _prevData$dimensions.width) && (dimensions === null || dimensions === void 0 ? void 0 : dimensions.width) && prevData.dimensions.width > dimensions.width;
30
+ var srcSet = isPreviousImageLarger ? prevData.srcSet : paramSrcSet;
31
+ var dataURI = isPreviousImageLarger ? prevData.dataURI : paramDataURI;
32
+ var currData = {
33
+ dataURI: dataURI,
34
+ dimensions: dimensions,
35
+ error: error,
36
+ srcSet: srcSet,
37
+ loading: "lazy",
38
+ loadPromise: undefined,
39
+ mode: paramMode
40
+ };
41
+ var img = script === null || script === void 0 || (_script$parentElement = script.parentElement) === null || _script$parentElement === void 0 ? void 0 : _script$parentElement.querySelector("img");
42
+ globalMedia.mediaCountSsr = globalMedia.mediaCountSsr || 0;
43
+ if (img) {
44
+ if (featureFlags["media-perf-lazy-loading-optimisation"] && globalMedia.mediaCountSsr < params.maxEagerLoadCount) {
45
+ globalMedia.mediaCountSsr++;
46
+ img.removeAttribute("loading");
47
+ currData.loading = "";
48
+ var observer = new PerformanceObserver(function (entries) {
49
+ entries.getEntries().forEach(function (entry) {
50
+ if (srcSet.includes(entry.name)) {
51
+ globalMedia.performanceEntries = globalMedia.performanceEntries || [];
52
+ globalMedia.performanceEntries.push(entry);
53
+ observer.disconnect();
54
+ }
55
+ });
56
+ });
57
+ observer.observe({
58
+ type: 'resource'
59
+ });
60
+ }
61
+ if (dataURI) {
62
+ img.src = dataURI;
63
+ }
64
+ if (srcSet) {
65
+ img.srcset = srcSet;
66
+ }
67
+ currData.loadPromise = new Promise(function (resolve, reject) {
68
+ // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
69
+ img.addEventListener("load", function () {
70
+ return resolve();
71
+ });
72
+ // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
73
+ img.addEventListener("error", function () {
74
+ return reject(new Error("Failed to load image"));
75
+ });
76
+ });
77
+ }
78
+ mediaCardSsr[key] = isPreviousImageLarger ? prevData : currData;
79
+ } else {
80
+ mediaCardSsr[key] = {
81
+ dataURI: paramDataURI,
82
+ dimensions: dimensions,
83
+ error: error
84
+ };
85
+ }
86
+ script === null || script === void 0 || script.remove();
87
+
88
+ // this replace will be used as a placeholder for the stringified params to be injected into the script
89
+ })({
90
+ replace: ""
91
+ });
@@ -108,12 +108,19 @@ export var useFilePreview = function useFilePreview(_ref) {
108
108
  });
109
109
  }
110
110
  if (!(ssrData !== null && ssrData !== void 0 && ssrData.dataURI)) {
111
- try {
112
- return getSSRPreview(ssr, mediaClient, identifier.id, imageURLParams, mediaBlobUrlAttrs);
113
- } catch (e) {
114
- ssrReliabilityRef.current = _objectSpread(_objectSpread({}, ssrReliabilityRef.current), {}, _defineProperty({}, ssr, _objectSpread({
115
- status: 'fail'
116
- }, extractErrorInfo(e, traceContext))));
111
+ // Only attempt SSR preview generation if:
112
+ // 1. We're on the server (ssr='server'), OR
113
+ // 2. We're on the client AND there is SSR data (meaning SSR actually happened)
114
+ // If ssr='client' but there's no SSR data, it means this is a client-side navigation
115
+ // where no SSR occurred, so we should skip SSR preview generation entirely.
116
+ if (ssr === 'server' || ssrData) {
117
+ try {
118
+ return getSSRPreview(ssr, mediaClient, identifier.id, imageURLParams, mediaBlobUrlAttrs);
119
+ } catch (e) {
120
+ ssrReliabilityRef.current = _objectSpread(_objectSpread({}, ssrReliabilityRef.current), {}, _defineProperty({}, ssr, _objectSpread({
121
+ status: 'fail'
122
+ }, extractErrorInfo(e, traceContext))));
123
+ }
117
124
  }
118
125
  } else {
119
126
  var _dimensions = ssrData.dimensions,
@@ -299,7 +306,7 @@ export var useFilePreview = function useFilePreview(_ref) {
299
306
  client: createFailedSSRObject(failedPreview, traceContext)
300
307
  });
301
308
  }
302
- var isSSR = isSSRDataPreview(failedPreview) || (fg('jfp-magma-fix-failed-ssr-preview-load') ? isSSRClientPreview(failedPreview) : false);
309
+ var isSSR = isSSRDataPreview(failedPreview) || isSSRClientPreview(failedPreview);
303
310
 
304
311
  // If the preview failed and it comes from server (global scope / ssrData), it means that we have reused it in client and the error counts for both: server & client.
305
312
  if (isSSR) {
@@ -5,10 +5,12 @@ import { type MediaFilePreviewErrorInfo } from '../analytics';
5
5
  import { type MediaCardSsr } from './types';
6
6
  export declare const GLOBAL_MEDIA_CARD_SSR = "mediaCardSsr";
7
7
  export declare const GLOBAL_MEDIA_COUNT_SSR = "mediaCountSsr";
8
+ export declare const GLOBAL_MEDIA_PERFORMANCE_ENTRIES = "performanceEntries";
8
9
  export declare const GLOBAL_MEDIA_NAMESPACE = "__MEDIA_INTERNAL";
9
10
  export type MediaGlobalScope = {
10
11
  [GLOBAL_MEDIA_CARD_SSR]?: MediaCardSsr;
11
12
  [GLOBAL_MEDIA_COUNT_SSR]?: number;
13
+ [GLOBAL_MEDIA_PERFORMANCE_ENTRIES]?: PerformanceEntry[];
12
14
  };
13
15
  type MediaFeatureFlags = {
14
16
  'media-perf-uplift-mutation-fix'?: boolean;
@@ -16,9 +18,6 @@ type MediaFeatureFlags = {
16
18
  };
17
19
  export declare function getMediaGlobalScope(globalScope?: any): MediaGlobalScope;
18
20
  export declare function getMediaCardSSR(globalScope?: any): MediaCardSsr;
19
- export declare function getMediaCountSSR(globalScope?: any): number;
20
- export declare function incrementMediaCountSSR(globalScope?: any): void;
21
21
  export declare const getKey: ({ id, collectionName, occurrenceKey }: FileIdentifier, resizeMode?: string) => string;
22
- export declare const storeDataURI: (key: string, paramDataURI?: string, paramMode?: string, paramSrcSet?: string, dimensions?: Partial<NumericalCardDimensions>, error?: MediaFilePreviewErrorInfo, featureFlags?: MediaFeatureFlags, globalScope?: any) => void;
23
22
  export declare const generateScriptProps: (identifier: FileIdentifier, dataURI?: string, mode?: string, srcSet?: string, dimensions?: Partial<NumericalCardDimensions>, error?: MediaFilePreviewErrorInfo, featureFlags?: MediaFeatureFlags) => React.ScriptHTMLAttributes<HTMLScriptElement>;
24
23
  export {};
File without changes
@@ -39,5 +39,5 @@ export declare const useFilePreview: ({ resizeMode, identifier, ssr, dimensions,
39
39
  onImageError: (failedPreview?: MediaFilePreview) => void;
40
40
  onImageLoad: (newPreview?: MediaFilePreview) => void;
41
41
  getSsrScriptProps: (() => import("react").ScriptHTMLAttributes<HTMLScriptElement>) | undefined;
42
- copyNodeRef: (instance: HTMLDivElement | HTMLImageElement | null) => void;
42
+ copyNodeRef: (instance: HTMLDivElement | HTMLImageElement | null) => void | import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES];
43
43
  };
@@ -5,10 +5,12 @@ import { type MediaFilePreviewErrorInfo } from '../analytics';
5
5
  import { type MediaCardSsr } from './types';
6
6
  export declare const GLOBAL_MEDIA_CARD_SSR = "mediaCardSsr";
7
7
  export declare const GLOBAL_MEDIA_COUNT_SSR = "mediaCountSsr";
8
+ export declare const GLOBAL_MEDIA_PERFORMANCE_ENTRIES = "performanceEntries";
8
9
  export declare const GLOBAL_MEDIA_NAMESPACE = "__MEDIA_INTERNAL";
9
10
  export type MediaGlobalScope = {
10
11
  [GLOBAL_MEDIA_CARD_SSR]?: MediaCardSsr;
11
12
  [GLOBAL_MEDIA_COUNT_SSR]?: number;
13
+ [GLOBAL_MEDIA_PERFORMANCE_ENTRIES]?: PerformanceEntry[];
12
14
  };
13
15
  type MediaFeatureFlags = {
14
16
  'media-perf-uplift-mutation-fix'?: boolean;
@@ -16,9 +18,6 @@ type MediaFeatureFlags = {
16
18
  };
17
19
  export declare function getMediaGlobalScope(globalScope?: any): MediaGlobalScope;
18
20
  export declare function getMediaCardSSR(globalScope?: any): MediaCardSsr;
19
- export declare function getMediaCountSSR(globalScope?: any): number;
20
- export declare function incrementMediaCountSSR(globalScope?: any): void;
21
21
  export declare const getKey: ({ id, collectionName, occurrenceKey }: FileIdentifier, resizeMode?: string) => string;
22
- export declare const storeDataURI: (key: string, paramDataURI?: string, paramMode?: string, paramSrcSet?: string, dimensions?: Partial<NumericalCardDimensions>, error?: MediaFilePreviewErrorInfo, featureFlags?: MediaFeatureFlags, globalScope?: any) => void;
23
22
  export declare const generateScriptProps: (identifier: FileIdentifier, dataURI?: string, mode?: string, srcSet?: string, dimensions?: Partial<NumericalCardDimensions>, error?: MediaFilePreviewErrorInfo, featureFlags?: MediaFeatureFlags) => React.ScriptHTMLAttributes<HTMLScriptElement>;
24
23
  export {};
@@ -39,5 +39,5 @@ export declare const useFilePreview: ({ resizeMode, identifier, ssr, dimensions,
39
39
  onImageError: (failedPreview?: MediaFilePreview) => void;
40
40
  onImageLoad: (newPreview?: MediaFilePreview) => void;
41
41
  getSsrScriptProps: (() => import("react").ScriptHTMLAttributes<HTMLScriptElement>) | undefined;
42
- copyNodeRef: (instance: HTMLDivElement | HTMLImageElement | null) => void;
42
+ copyNodeRef: (instance: HTMLDivElement | HTMLImageElement | null) => void | import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES];
43
43
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/media-file-preview",
3
- "version": "0.15.1",
3
+ "version": "0.15.3",
4
4
  "description": "A React Hook to fetch and render file previews. It's overloaded with fancy features like SSR, lazy loading, memory cache and local preview.",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -30,12 +30,12 @@
30
30
  "sideEffects": false,
31
31
  "atlaskit:src": "src/index.ts",
32
32
  "dependencies": {
33
- "@atlaskit/media-client": "^35.6.0",
33
+ "@atlaskit/media-client": "^35.7.0",
34
34
  "@atlaskit/media-client-react": "^4.1.0",
35
35
  "@atlaskit/media-common": "^12.3.0",
36
36
  "@atlaskit/media-ui": "^28.7.0",
37
37
  "@atlaskit/platform-feature-flags": "^1.1.0",
38
- "@atlaskit/react-ufo": "^4.15.0",
38
+ "@atlaskit/react-ufo": "^4.17.0",
39
39
  "@babel/runtime": "^7.0.0",
40
40
  "eventemitter2": "^4.1.0",
41
41
  "lru_map": "^0.4.1"
@@ -49,7 +49,7 @@
49
49
  "@af/visual-regression": "workspace:^",
50
50
  "@atlaskit/media-state": "^1.8.0",
51
51
  "@atlaskit/media-test-data": "^3.2.0",
52
- "@atlaskit/section-message": "^8.9.0",
52
+ "@atlaskit/section-message": "^8.12.0",
53
53
  "@atlaskit/ssr": "workspace:^",
54
54
  "@atlassian/feature-flags-test-utils": "^1.0.0",
55
55
  "@testing-library/react": "^13.4.0",
@@ -99,9 +99,6 @@
99
99
  "media-perf-uplift-mutation-fix": {
100
100
  "type": "boolean"
101
101
  },
102
- "jfp-magma-fix-failed-ssr-preview-load": {
103
- "type": "boolean"
104
- },
105
102
  "media-perf-lazy-loading-optimisation": {
106
103
  "type": "boolean"
107
104
  }
@@ -1,37 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.printScript = exports.printFunctionCall = void 0;
8
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
9
- var printParam = function printParam(param) {
10
- if (typeof param === 'string') {
11
- return "'".concat(param, "'");
12
- } else if ((0, _typeof2.default)(param) === 'object') {
13
- return JSON.stringify(param);
14
- } else if (param === undefined) {
15
- return 'undefined';
16
- }
17
- return param;
18
- };
19
- var printParams = function printParams(args) {
20
- return args.map(function (arg) {
21
- return printParam(arg);
22
- }).join(',');
23
- };
24
- var printFunctionCall = exports.printFunctionCall = function printFunctionCall(fn) {
25
- for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
26
- args[_key - 1] = arguments[_key];
27
- }
28
- return "(".concat(fn.toString(), ")(").concat(printParams(args), ");");
29
- };
30
-
31
- // Removing the script tag after execution to prevent hydration
32
- // mismatch issues after SSR. We don't want to render different
33
- // HTML on the client and server https://react.dev/reference/react-dom/client/hydrateRoot
34
- // Note: document.currentScript gets incorrectly transpiled to globalThis.currentScript so we need to use it here to avoid transpilation
35
- var printScript = exports.printScript = function printScript(statements) {
36
- return "(function(){\n\t\t\t let script = document.currentScript;\n \t\t\t ".concat(statements.join(';'), "\n\t\t\t document.currentScript.remove();\n\t\t})();\n\t\t");
37
- };
@@ -1,23 +0,0 @@
1
- const printParam = param => {
2
- if (typeof param === 'string') {
3
- return `'${param}'`;
4
- } else if (typeof param === 'object') {
5
- return JSON.stringify(param);
6
- } else if (param === undefined) {
7
- return 'undefined';
8
- }
9
- return param;
10
- };
11
- const printParams = args => args.map(arg => printParam(arg)).join(',');
12
- export const printFunctionCall = (fn, ...args) => `(${fn.toString()})(${printParams(args)});`;
13
-
14
- // Removing the script tag after execution to prevent hydration
15
- // mismatch issues after SSR. We don't want to render different
16
- // HTML on the client and server https://react.dev/reference/react-dom/client/hydrateRoot
17
- // Note: document.currentScript gets incorrectly transpiled to globalThis.currentScript so we need to use it here to avoid transpilation
18
- export const printScript = statements => `(function(){
19
- let script = document.currentScript;
20
- ${statements.join(';')}
21
- document.currentScript.remove();
22
- })();
23
- `;
@@ -1,30 +0,0 @@
1
- import _typeof from "@babel/runtime/helpers/typeof";
2
- var printParam = function printParam(param) {
3
- if (typeof param === 'string') {
4
- return "'".concat(param, "'");
5
- } else if (_typeof(param) === 'object') {
6
- return JSON.stringify(param);
7
- } else if (param === undefined) {
8
- return 'undefined';
9
- }
10
- return param;
11
- };
12
- var printParams = function printParams(args) {
13
- return args.map(function (arg) {
14
- return printParam(arg);
15
- }).join(',');
16
- };
17
- export var printFunctionCall = function printFunctionCall(fn) {
18
- for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
19
- args[_key - 1] = arguments[_key];
20
- }
21
- return "(".concat(fn.toString(), ")(").concat(printParams(args), ");");
22
- };
23
-
24
- // Removing the script tag after execution to prevent hydration
25
- // mismatch issues after SSR. We don't want to render different
26
- // HTML on the client and server https://react.dev/reference/react-dom/client/hydrateRoot
27
- // Note: document.currentScript gets incorrectly transpiled to globalThis.currentScript so we need to use it here to avoid transpilation
28
- export var printScript = function printScript(statements) {
29
- return "(function(){\n\t\t\t let script = document.currentScript;\n \t\t\t ".concat(statements.join(';'), "\n\t\t\t document.currentScript.remove();\n\t\t})();\n\t\t");
30
- };
@@ -1,2 +0,0 @@
1
- export declare const printFunctionCall: <T extends Array<any>>(fn: (...args: T) => void, ...args: T) => string;
2
- export declare const printScript: (statements: string[]) => string;
@@ -1,2 +0,0 @@
1
- export declare const printFunctionCall: <T extends Array<any>>(fn: (...args: T) => void, ...args: T) => string;
2
- export declare const printScript: (statements: string[]) => string;