@browserless.io/browserless 2.38.0 → 2.38.2

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.
Files changed (213) hide show
  1. package/CHANGELOG.md +26 -1
  2. package/build/browsers/index.js +12 -6
  3. package/build/routes/management/http/kill.get.js +2 -2
  4. package/build/shared/utils/function/handler.js +2 -2
  5. package/build/utils.d.ts +1 -0
  6. package/build/utils.js +1 -0
  7. package/build/utils.spec.d.ts +1 -0
  8. package/build/utils.spec.js +27 -0
  9. package/extensions/ublocklite/_locales/be/messages.json +5 -5
  10. package/extensions/ublocklite/_locales/id/messages.json +9 -9
  11. package/extensions/ublocklite/_locales/ja/messages.json +4 -4
  12. package/extensions/ublocklite/_locales/pt_PT/messages.json +1 -1
  13. package/extensions/ublocklite/_locales/th/messages.json +2 -2
  14. package/extensions/ublocklite/_locales/uk/messages.json +9 -9
  15. package/extensions/ublocklite/_locales/vi/messages.json +5 -5
  16. package/extensions/ublocklite/_locales/zh_CN/messages.json +8 -8
  17. package/extensions/ublocklite/js/jsonpath.js +2 -2
  18. package/extensions/ublocklite/js/static-filtering-parser.js +3 -1
  19. package/extensions/ublocklite/js/utils.js +1 -3
  20. package/extensions/ublocklite/manifest.json +1 -1
  21. package/extensions/ublocklite/rulesets/generic-details.json +2 -0
  22. package/extensions/ublocklite/rulesets/main/adguard-mobile.json +1 -2
  23. package/extensions/ublocklite/rulesets/main/adguard-spyware-url.json +7 -4
  24. package/extensions/ublocklite/rulesets/main/annoyances-cookies.json +2 -1
  25. package/extensions/ublocklite/rulesets/main/chn-0.json +23 -13
  26. package/extensions/ublocklite/rulesets/main/deu-0.json +2 -1
  27. package/extensions/ublocklite/rulesets/main/dpollock-0.json +1 -0
  28. package/extensions/ublocklite/rulesets/main/easylist.json +12 -4
  29. package/extensions/ublocklite/rulesets/main/easyprivacy.json +19 -6
  30. package/extensions/ublocklite/rulesets/main/fra-0.json +2 -2
  31. package/extensions/ublocklite/rulesets/main/hrv-0.json +6 -15
  32. package/extensions/ublocklite/rulesets/main/idn-0.json +6 -2
  33. package/extensions/ublocklite/rulesets/main/ind-0.json +27 -11
  34. package/extensions/ublocklite/rulesets/main/isr-0.json +1 -0
  35. package/extensions/ublocklite/rulesets/main/jpn-1.json +9 -4
  36. package/extensions/ublocklite/rulesets/main/kor-1.json +3 -2
  37. package/extensions/ublocklite/rulesets/main/nld-0.json +9 -7
  38. package/extensions/ublocklite/rulesets/main/nor-0.json +6 -3
  39. package/extensions/ublocklite/rulesets/main/pgl.json +10 -3
  40. package/extensions/ublocklite/rulesets/main/pol-0.json +2 -0
  41. package/extensions/ublocklite/rulesets/main/rus-0.json +11 -9
  42. package/extensions/ublocklite/rulesets/main/rus-1.json +2 -1
  43. package/extensions/ublocklite/rulesets/main/spa-1.json +2 -1
  44. package/extensions/ublocklite/rulesets/main/stevenblack-hosts.json +15646 -4853
  45. package/extensions/ublocklite/rulesets/main/swe-1.json +7 -9
  46. package/extensions/ublocklite/rulesets/main/tur-0.json +3 -4
  47. package/extensions/ublocklite/rulesets/main/ublock-badware.json +4 -7
  48. package/extensions/ublocklite/rulesets/main/ublock-filters.json +46 -21
  49. package/extensions/ublocklite/rulesets/main/ukr-0.json +3 -5
  50. package/extensions/ublocklite/rulesets/main/urlhaus-full.json +1554 -196
  51. package/extensions/ublocklite/rulesets/main/vie-1.json +26 -26
  52. package/extensions/ublocklite/rulesets/regex/chn-0.json +2 -2
  53. package/extensions/ublocklite/rulesets/regex/hrv-0.json +20 -0
  54. package/extensions/ublocklite/rulesets/regex/jpn-1.json +1 -1
  55. package/extensions/ublocklite/rulesets/regex/ublock-filters.json +10 -9
  56. package/extensions/ublocklite/rulesets/ruleset-details.json +160 -160
  57. package/extensions/ublocklite/rulesets/scripting/generic/annoyances-notifications.js +1 -1
  58. package/extensions/ublocklite/rulesets/scripting/generic/chn-0.js +1 -1
  59. package/extensions/ublocklite/rulesets/scripting/generic/easylist.js +1 -1
  60. package/extensions/ublocklite/rulesets/scripting/generic/hrv-0.js +1 -1
  61. package/extensions/ublocklite/rulesets/scripting/generic/rus-0.js +1 -1
  62. package/extensions/ublocklite/rulesets/scripting/generic/spa-1.js +2 -2
  63. package/extensions/ublocklite/rulesets/scripting/generic/ublock-filters.js +3 -3
  64. package/extensions/ublocklite/rulesets/scripting/generic/vie-1.js +1 -1
  65. package/extensions/ublocklite/rulesets/scripting/generichigh/rus-0.css +1 -0
  66. package/extensions/ublocklite/rulesets/scripting/procedural/annoyances-cookies.js +1 -1
  67. package/extensions/ublocklite/rulesets/scripting/procedural/annoyances-overlays.js +2 -2
  68. package/extensions/ublocklite/rulesets/scripting/procedural/easylist.js +3 -3
  69. package/extensions/ublocklite/rulesets/scripting/procedural/hrv-0.js +3 -3
  70. package/extensions/ublocklite/rulesets/scripting/procedural/jpn-1.js +3 -3
  71. package/extensions/ublocklite/rulesets/scripting/procedural/rou-1.js +3 -3
  72. package/extensions/ublocklite/rulesets/scripting/procedural/rus-0.js +3 -3
  73. package/extensions/ublocklite/rulesets/scripting/procedural/swe-1.js +2 -2
  74. package/extensions/ublocklite/rulesets/scripting/procedural/tur-0.js +3 -3
  75. package/extensions/ublocklite/rulesets/scripting/procedural/ublock-filters.js +3 -3
  76. package/extensions/ublocklite/rulesets/scripting/procedural/vie-1.js +3 -3
  77. package/extensions/ublocklite/rulesets/scripting/scriptlet/adguard-mobile.abort-on-property-read.js +2 -2
  78. package/extensions/ublocklite/rulesets/scripting/scriptlet/annoyances-cookies.remove-node-text.js +1 -1
  79. package/extensions/ublocklite/rulesets/scripting/scriptlet/annoyances-cookies.set-cookie.js +2 -2
  80. package/extensions/ublocklite/rulesets/scripting/scriptlet/annoyances-cookies.trusted-click-element.js +3 -3
  81. package/extensions/ublocklite/rulesets/scripting/scriptlet/annoyances-cookies.trusted-set-cookie.js +2 -2
  82. package/extensions/ublocklite/rulesets/scripting/scriptlet/annoyances-overlays.addEventListener-defuser.js +1 -1
  83. package/extensions/ublocklite/rulesets/scripting/scriptlet/annoyances-overlays.prevent-fetch.js +10 -5
  84. package/extensions/ublocklite/rulesets/scripting/scriptlet/annoyances-overlays.remove-node-text.js +2 -2
  85. package/extensions/ublocklite/rulesets/scripting/scriptlet/chn-0.abort-on-property-read.js +2 -2
  86. package/extensions/ublocklite/rulesets/scripting/scriptlet/chn-0.abort-on-stack-trace.js +2 -2
  87. package/extensions/ublocklite/rulesets/scripting/scriptlet/chn-0.prevent-fetch.js +10 -5
  88. package/extensions/ublocklite/rulesets/scripting/scriptlet/easyprivacy.prevent-fetch.js +10 -5
  89. package/extensions/ublocklite/rulesets/scripting/scriptlet/fin-0.set-constant.js +541 -0
  90. package/extensions/ublocklite/rulesets/scripting/scriptlet/fra-0.prevent-fetch.js +10 -5
  91. package/extensions/ublocklite/rulesets/scripting/scriptlet/hrv-0.set-constant.js +541 -0
  92. package/extensions/ublocklite/rulesets/scripting/scriptlet/idn-0.prevent-fetch.js +10 -5
  93. package/extensions/ublocklite/rulesets/scripting/scriptlet/irn-0.prevent-fetch.js +10 -5
  94. package/extensions/ublocklite/rulesets/scripting/scriptlet/isr-0.prevent-fetch.js +10 -5
  95. package/extensions/ublocklite/rulesets/scripting/scriptlet/jpn-1.prevent-fetch.js +10 -5
  96. package/extensions/ublocklite/rulesets/scripting/scriptlet/kor-1.json-prune-xhr-response.js +1 -1
  97. package/extensions/ublocklite/rulesets/scripting/scriptlet/kor-1.prevent-fetch.js +10 -5
  98. package/extensions/ublocklite/rulesets/scripting/scriptlet/nld-0.abort-current-script.js +2 -2
  99. package/extensions/ublocklite/rulesets/scripting/scriptlet/nld-0.prevent-fetch.js +11 -6
  100. package/extensions/ublocklite/rulesets/scripting/scriptlet/nld-0.xml-prune.js +1 -1
  101. package/extensions/ublocklite/rulesets/scripting/scriptlet/nor-0.prevent-fetch.js +10 -5
  102. package/extensions/ublocklite/rulesets/scripting/scriptlet/rus-0.abort-on-property-read.js +2 -2
  103. package/extensions/ublocklite/rulesets/scripting/scriptlet/rus-0.abort-on-stack-trace.js +1 -1
  104. package/extensions/ublocklite/rulesets/scripting/scriptlet/rus-0.addEventListener-defuser.js +3 -3
  105. package/extensions/ublocklite/rulesets/scripting/scriptlet/rus-0.href-sanitizer.js +2 -2
  106. package/extensions/ublocklite/rulesets/scripting/scriptlet/rus-0.prevent-fetch.js +10 -5
  107. package/extensions/ublocklite/rulesets/scripting/scriptlet/rus-0.remove-attr.js +2 -2
  108. package/extensions/ublocklite/rulesets/scripting/scriptlet/rus-0.remove-cookie.js +1 -1
  109. package/extensions/ublocklite/rulesets/scripting/scriptlet/rus-0.set-attr.js +1 -1
  110. package/extensions/ublocklite/rulesets/scripting/scriptlet/rus-0.set-constant.js +2 -2
  111. package/extensions/ublocklite/rulesets/scripting/scriptlet/rus-1.prevent-fetch.js +10 -5
  112. package/extensions/ublocklite/rulesets/scripting/scriptlet/spa-1.prevent-fetch.js +10 -5
  113. package/extensions/ublocklite/rulesets/scripting/scriptlet/tur-0.addEventListener-defuser.js +2 -2
  114. package/extensions/ublocklite/rulesets/scripting/scriptlet/tur-0.prevent-fetch.js +10 -5
  115. package/extensions/ublocklite/rulesets/scripting/scriptlet/{fin-0.spoof-css.js → tur-0.remove-cookie.js} +69 -115
  116. package/extensions/ublocklite/rulesets/scripting/scriptlet/tur-0.set-constant.js +2 -2
  117. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-experimental.trusted-json-edit-fetch-request.js +941 -0
  118. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-experimental.trusted-json-edit-xhr-request.js +3 -3
  119. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-experimental.trusted-replace-node-text.js +1 -1
  120. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.abort-current-script.js +3 -3
  121. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.abort-on-property-read.js +1 -1
  122. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.abort-on-stack-trace.js +1 -1
  123. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.addEventListener-defuser.js +2 -2
  124. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.json-edit-fetch-response.js +2 -2
  125. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.json-edit-xhr-response.js +2 -2
  126. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.json-edit.js +2 -2
  127. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.json-prune-fetch-response.js +2 -2
  128. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.jsonl-edit-xhr-response.js +2 -2
  129. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.noeval-if.js +1 -1
  130. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.prevent-fetch.js +12 -7
  131. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.prevent-setInterval.js +3 -3
  132. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.prevent-setTimeout.js +3 -3
  133. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.prevent-window-open.js +2 -2
  134. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.prevent-xhr.js +1 -1
  135. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.remove-node-text.js +3 -3
  136. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.set-constant.js +3 -3
  137. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.set-cookie.js +2 -2
  138. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.set-local-storage-item.js +2 -2
  139. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.spoof-css.js +3 -3
  140. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.trusted-json-edit-fetch-request.js +941 -0
  141. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.trusted-json-edit-fetch-response.js +2 -2
  142. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.trusted-json-edit.js +2 -2
  143. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.trusted-prevent-fetch.js +10 -5
  144. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.trusted-replace-argument.js +2 -2
  145. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.trusted-replace-node-text.js +2 -2
  146. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.trusted-replace-outbound-text.js +2 -2
  147. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.trusted-set-attr.js +3 -3
  148. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.trusted-set-constant.js +2 -2
  149. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.trusted-suppress-native-method.js +2 -2
  150. package/extensions/ublocklite/rulesets/scripting/scriptlet/ubol-tests.jsonl-edit-fetch-response.js +2 -2
  151. package/extensions/ublocklite/rulesets/scripting/scriptlet/ubol-tests.jsonl-edit-xhr-response.js +2 -2
  152. package/extensions/ublocklite/rulesets/scripting/scriptlet/ukr-0.prevent-fetch.js +10 -5
  153. package/extensions/ublocklite/rulesets/scripting/scriptlet/vie-1.abort-current-script.js +2 -2
  154. package/extensions/ublocklite/rulesets/scripting/scriptlet/vie-1.abort-on-property-read.js +1 -1
  155. package/extensions/ublocklite/rulesets/scripting/scriptlet/vie-1.prevent-fetch.js +10 -5
  156. package/extensions/ublocklite/rulesets/scripting/scriptlet/vie-1.set-constant.js +2 -2
  157. package/extensions/ublocklite/rulesets/scripting/specific/adguard-mobile.js +3 -3
  158. package/extensions/ublocklite/rulesets/scripting/specific/annoyances-cookies.js +3 -3
  159. package/extensions/ublocklite/rulesets/scripting/specific/annoyances-notifications.js +3 -3
  160. package/extensions/ublocklite/rulesets/scripting/specific/annoyances-others.js +3 -3
  161. package/extensions/ublocklite/rulesets/scripting/specific/annoyances-overlays.js +3 -3
  162. package/extensions/ublocklite/rulesets/scripting/specific/annoyances-social.js +2 -2
  163. package/extensions/ublocklite/rulesets/scripting/specific/chn-0.js +3 -3
  164. package/extensions/ublocklite/rulesets/scripting/specific/deu-0.js +3 -3
  165. package/extensions/ublocklite/rulesets/scripting/specific/easylist.js +3 -3
  166. package/extensions/ublocklite/rulesets/scripting/specific/est-0.js +3 -3
  167. package/extensions/ublocklite/rulesets/scripting/specific/fin-0.js +3 -3
  168. package/extensions/ublocklite/rulesets/scripting/specific/fra-0.js +3 -3
  169. package/extensions/ublocklite/rulesets/scripting/specific/hrv-0.js +4 -4
  170. package/extensions/ublocklite/rulesets/scripting/specific/hun-0.js +3 -3
  171. package/extensions/ublocklite/rulesets/scripting/specific/idn-0.js +3 -3
  172. package/extensions/ublocklite/rulesets/scripting/specific/ind-0.js +3 -3
  173. package/extensions/ublocklite/rulesets/scripting/specific/ita-0.js +3 -3
  174. package/extensions/ublocklite/rulesets/scripting/specific/jpn-1.js +3 -3
  175. package/extensions/ublocklite/rulesets/scripting/specific/kor-1.js +3 -3
  176. package/extensions/ublocklite/rulesets/scripting/specific/nld-0.js +3 -3
  177. package/extensions/ublocklite/rulesets/scripting/specific/nor-0.js +3 -3
  178. package/extensions/ublocklite/rulesets/scripting/specific/pol-0.js +3 -3
  179. package/extensions/ublocklite/rulesets/scripting/specific/rou-1.js +3 -3
  180. package/extensions/ublocklite/rulesets/scripting/specific/rus-0.js +3 -3
  181. package/extensions/ublocklite/rulesets/scripting/specific/spa-0.js +3 -3
  182. package/extensions/ublocklite/rulesets/scripting/specific/spa-1.js +3 -3
  183. package/extensions/ublocklite/rulesets/scripting/specific/swe-1.js +3 -3
  184. package/extensions/ublocklite/rulesets/scripting/specific/tur-0.js +3 -3
  185. package/extensions/ublocklite/rulesets/scripting/specific/ublock-badware.js +3 -3
  186. package/extensions/ublocklite/rulesets/scripting/specific/ublock-filters.js +3 -3
  187. package/extensions/ublocklite/rulesets/scripting/specific/ukr-0.js +1 -1
  188. package/extensions/ublocklite/rulesets/scripting/specific/vie-1.js +3 -3
  189. package/extensions/ublocklite/rulesets/scriptlet-details.json +113 -60
  190. package/extensions/ublocklite/rulesets/strictblock/chn-0.json +117 -2
  191. package/extensions/ublocklite/rulesets/strictblock/dpollock-0.json +1 -0
  192. package/extensions/ublocklite/rulesets/strictblock/easylist.json +1 -1
  193. package/extensions/ublocklite/rulesets/strictblock/easyprivacy.json +7 -1
  194. package/extensions/ublocklite/rulesets/strictblock/hrv-0.json +8 -1
  195. package/extensions/ublocklite/rulesets/strictblock/jpn-1.json +134 -133
  196. package/extensions/ublocklite/rulesets/strictblock/nor-0.json +1 -1
  197. package/extensions/ublocklite/rulesets/strictblock/pgl.json +10 -3
  198. package/extensions/ublocklite/rulesets/strictblock/stevenblack-hosts.json +15646 -4853
  199. package/extensions/ublocklite/rulesets/strictblock/tur-0.json +1 -0
  200. package/extensions/ublocklite/rulesets/strictblock/ublock-badware.json +10 -10
  201. package/extensions/ublocklite/rulesets/strictblock/ublock-filters.json +3 -3
  202. package/extensions/ublocklite/rulesets/strictblock/ukr-0.json +1 -0
  203. package/extensions/ublocklite/rulesets/strictblock/urlhaus-full.json +1554 -196
  204. package/extensions/ublocklite/ublock.zip +0 -0
  205. package/package.json +1 -1
  206. package/src/browsers/index.ts +17 -8
  207. package/src/routes/management/http/kill.get.ts +2 -1
  208. package/src/shared/utils/function/handler.ts +2 -1
  209. package/src/utils.spec.ts +62 -0
  210. package/src/utils.ts +3 -0
  211. package/static/docs/swagger.json +2 -2
  212. package/static/docs/swagger.min.json +1 -1
  213. package/extensions/ublocklite/rulesets/scripting/procedural/ublock-experimental.js +0 -42
@@ -0,0 +1,541 @@
1
+ /*******************************************************************************
2
+
3
+ uBlock Origin Lite - a comprehensive, MV3-compliant content blocker
4
+ Copyright (C) 2014-present Raymond Hill
5
+
6
+ This program is free software: you can redistribute it and/or modify
7
+ it under the terms of the GNU General Public License as published by
8
+ the Free Software Foundation, either version 3 of the License, or
9
+ (at your option) any later version.
10
+
11
+ This program is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU General Public License for more details.
15
+
16
+ You should have received a copy of the GNU General Public License
17
+ along with this program. If not, see {http://www.gnu.org/licenses/}.
18
+
19
+ Home: https://github.com/gorhill/uBlock
20
+
21
+ */
22
+
23
+ // ruleset: hrv-0
24
+
25
+ // Important!
26
+ // Isolate from global scope
27
+
28
+ // Start of local scope
29
+ (function uBOL_setConstant() {
30
+
31
+ /******************************************************************************/
32
+
33
+ function setConstant(
34
+ ...args
35
+ ) {
36
+ setConstantFn(false, ...args);
37
+ }
38
+
39
+ function setConstantFn(
40
+ trusted = false,
41
+ chain = '',
42
+ rawValue = ''
43
+ ) {
44
+ if ( chain === '' ) { return; }
45
+ const safe = safeSelf();
46
+ const logPrefix = safe.makeLogPrefix('set-constant', chain, rawValue);
47
+ const extraArgs = safe.getExtraArgs(Array.from(arguments), 3);
48
+ function setConstant(chain, rawValue) {
49
+ const trappedProp = (( ) => {
50
+ const pos = chain.lastIndexOf('.');
51
+ if ( pos === -1 ) { return chain; }
52
+ return chain.slice(pos+1);
53
+ })();
54
+ const cloakFunc = fn => {
55
+ safe.Object_defineProperty(fn, 'name', { value: trappedProp });
56
+ return new Proxy(fn, {
57
+ defineProperty(target, prop) {
58
+ if ( prop !== 'toString' ) {
59
+ return Reflect.defineProperty(...arguments);
60
+ }
61
+ return true;
62
+ },
63
+ deleteProperty(target, prop) {
64
+ if ( prop !== 'toString' ) {
65
+ return Reflect.deleteProperty(...arguments);
66
+ }
67
+ return true;
68
+ },
69
+ get(target, prop) {
70
+ if ( prop === 'toString' ) {
71
+ return function() {
72
+ return `function ${trappedProp}() { [native code] }`;
73
+ }.bind(null);
74
+ }
75
+ return Reflect.get(...arguments);
76
+ },
77
+ });
78
+ };
79
+ if ( trappedProp === '' ) { return; }
80
+ const thisScript = document.currentScript;
81
+ let normalValue = validateConstantFn(trusted, rawValue, extraArgs);
82
+ if ( rawValue === 'noopFunc' || rawValue === 'trueFunc' || rawValue === 'falseFunc' ) {
83
+ normalValue = cloakFunc(normalValue);
84
+ }
85
+ let aborted = false;
86
+ const mustAbort = function(v) {
87
+ if ( trusted ) { return false; }
88
+ if ( aborted ) { return true; }
89
+ aborted =
90
+ (v !== undefined && v !== null) &&
91
+ (normalValue !== undefined && normalValue !== null) &&
92
+ (typeof v !== typeof normalValue);
93
+ if ( aborted ) {
94
+ safe.uboLog(logPrefix, `Aborted because value set to ${v}`);
95
+ }
96
+ return aborted;
97
+ };
98
+ // https://github.com/uBlockOrigin/uBlock-issues/issues/156
99
+ // Support multiple trappers for the same property.
100
+ const trapProp = function(owner, prop, configurable, handler) {
101
+ if ( handler.init(configurable ? owner[prop] : normalValue) === false ) { return; }
102
+ const odesc = safe.Object_getOwnPropertyDescriptor(owner, prop);
103
+ let prevGetter, prevSetter;
104
+ if ( odesc instanceof safe.Object ) {
105
+ owner[prop] = normalValue;
106
+ if ( odesc.get instanceof Function ) {
107
+ prevGetter = odesc.get;
108
+ }
109
+ if ( odesc.set instanceof Function ) {
110
+ prevSetter = odesc.set;
111
+ }
112
+ }
113
+ try {
114
+ safe.Object_defineProperty(owner, prop, {
115
+ configurable,
116
+ get() {
117
+ if ( prevGetter !== undefined ) {
118
+ prevGetter();
119
+ }
120
+ return handler.getter();
121
+ },
122
+ set(a) {
123
+ if ( prevSetter !== undefined ) {
124
+ prevSetter(a);
125
+ }
126
+ handler.setter(a);
127
+ }
128
+ });
129
+ safe.uboLog(logPrefix, 'Trap installed');
130
+ } catch(ex) {
131
+ safe.uboErr(logPrefix, ex);
132
+ }
133
+ };
134
+ const trapChain = function(owner, chain) {
135
+ const pos = chain.indexOf('.');
136
+ if ( pos === -1 ) {
137
+ trapProp(owner, chain, false, {
138
+ v: undefined,
139
+ init: function(v) {
140
+ if ( mustAbort(v) ) { return false; }
141
+ this.v = v;
142
+ return true;
143
+ },
144
+ getter: function() {
145
+ if ( document.currentScript === thisScript ) {
146
+ return this.v;
147
+ }
148
+ safe.uboLog(logPrefix, 'Property read');
149
+ return normalValue;
150
+ },
151
+ setter: function(a) {
152
+ if ( mustAbort(a) === false ) { return; }
153
+ normalValue = a;
154
+ }
155
+ });
156
+ return;
157
+ }
158
+ const prop = chain.slice(0, pos);
159
+ const v = owner[prop];
160
+ chain = chain.slice(pos + 1);
161
+ if ( v instanceof safe.Object || typeof v === 'object' && v !== null ) {
162
+ trapChain(v, chain);
163
+ return;
164
+ }
165
+ trapProp(owner, prop, true, {
166
+ v: undefined,
167
+ init: function(v) {
168
+ this.v = v;
169
+ return true;
170
+ },
171
+ getter: function() {
172
+ return this.v;
173
+ },
174
+ setter: function(a) {
175
+ this.v = a;
176
+ if ( a instanceof safe.Object ) {
177
+ trapChain(a, chain);
178
+ }
179
+ }
180
+ });
181
+ };
182
+ trapChain(window, chain);
183
+ }
184
+ runAt(( ) => {
185
+ setConstant(chain, rawValue);
186
+ }, extraArgs.runAt);
187
+ }
188
+
189
+ function runAt(fn, when) {
190
+ const intFromReadyState = state => {
191
+ const targets = {
192
+ 'loading': 1, 'asap': 1,
193
+ 'interactive': 2, 'end': 2, '2': 2,
194
+ 'complete': 3, 'idle': 3, '3': 3,
195
+ };
196
+ const tokens = Array.isArray(state) ? state : [ state ];
197
+ for ( const token of tokens ) {
198
+ const prop = `${token}`;
199
+ if ( Object.hasOwn(targets, prop) === false ) { continue; }
200
+ return targets[prop];
201
+ }
202
+ return 0;
203
+ };
204
+ const runAt = intFromReadyState(when);
205
+ if ( intFromReadyState(document.readyState) >= runAt ) {
206
+ fn(); return;
207
+ }
208
+ const onStateChange = ( ) => {
209
+ if ( intFromReadyState(document.readyState) < runAt ) { return; }
210
+ fn();
211
+ safe.removeEventListener.apply(document, args);
212
+ };
213
+ const safe = safeSelf();
214
+ const args = [ 'readystatechange', onStateChange, { capture: true } ];
215
+ safe.addEventListener.apply(document, args);
216
+ }
217
+
218
+ function safeSelf() {
219
+ if ( scriptletGlobals.safeSelf ) {
220
+ return scriptletGlobals.safeSelf;
221
+ }
222
+ const self = globalThis;
223
+ const safe = {
224
+ 'Array_from': Array.from,
225
+ 'Error': self.Error,
226
+ 'Function_toStringFn': self.Function.prototype.toString,
227
+ 'Function_toString': thisArg => safe.Function_toStringFn.call(thisArg),
228
+ 'Math_floor': Math.floor,
229
+ 'Math_max': Math.max,
230
+ 'Math_min': Math.min,
231
+ 'Math_random': Math.random,
232
+ 'Object': Object,
233
+ 'Object_defineProperty': Object.defineProperty.bind(Object),
234
+ 'Object_defineProperties': Object.defineProperties.bind(Object),
235
+ 'Object_fromEntries': Object.fromEntries.bind(Object),
236
+ 'Object_getOwnPropertyDescriptor': Object.getOwnPropertyDescriptor.bind(Object),
237
+ 'Object_hasOwn': Object.hasOwn.bind(Object),
238
+ 'RegExp': self.RegExp,
239
+ 'RegExp_test': self.RegExp.prototype.test,
240
+ 'RegExp_exec': self.RegExp.prototype.exec,
241
+ 'Request_clone': self.Request.prototype.clone,
242
+ 'String': self.String,
243
+ 'String_fromCharCode': String.fromCharCode,
244
+ 'String_split': String.prototype.split,
245
+ 'XMLHttpRequest': self.XMLHttpRequest,
246
+ 'addEventListener': self.EventTarget.prototype.addEventListener,
247
+ 'removeEventListener': self.EventTarget.prototype.removeEventListener,
248
+ 'fetch': self.fetch,
249
+ 'JSON': self.JSON,
250
+ 'JSON_parseFn': self.JSON.parse,
251
+ 'JSON_stringifyFn': self.JSON.stringify,
252
+ 'JSON_parse': (...args) => safe.JSON_parseFn.call(safe.JSON, ...args),
253
+ 'JSON_stringify': (...args) => safe.JSON_stringifyFn.call(safe.JSON, ...args),
254
+ 'log': console.log.bind(console),
255
+ // Properties
256
+ logLevel: 0,
257
+ // Methods
258
+ makeLogPrefix(...args) {
259
+ return this.sendToLogger && `[${args.join(' \u205D ')}]` || '';
260
+ },
261
+ uboLog(...args) {
262
+ if ( this.sendToLogger === undefined ) { return; }
263
+ if ( args === undefined || args[0] === '' ) { return; }
264
+ return this.sendToLogger('info', ...args);
265
+
266
+ },
267
+ uboErr(...args) {
268
+ if ( this.sendToLogger === undefined ) { return; }
269
+ if ( args === undefined || args[0] === '' ) { return; }
270
+ return this.sendToLogger('error', ...args);
271
+ },
272
+ escapeRegexChars(s) {
273
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
274
+ },
275
+ initPattern(pattern, options = {}) {
276
+ if ( pattern === '' ) {
277
+ return { matchAll: true, expect: true };
278
+ }
279
+ const expect = (options.canNegate !== true || pattern.startsWith('!') === false);
280
+ if ( expect === false ) {
281
+ pattern = pattern.slice(1);
282
+ }
283
+ const match = /^\/(.+)\/([gimsu]*)$/.exec(pattern);
284
+ if ( match !== null ) {
285
+ return {
286
+ re: new this.RegExp(
287
+ match[1],
288
+ match[2] || options.flags
289
+ ),
290
+ expect,
291
+ };
292
+ }
293
+ if ( options.flags !== undefined ) {
294
+ return {
295
+ re: new this.RegExp(this.escapeRegexChars(pattern),
296
+ options.flags
297
+ ),
298
+ expect,
299
+ };
300
+ }
301
+ return { pattern, expect };
302
+ },
303
+ testPattern(details, haystack) {
304
+ if ( details.matchAll ) { return true; }
305
+ if ( details.re ) {
306
+ return this.RegExp_test.call(details.re, haystack) === details.expect;
307
+ }
308
+ return haystack.includes(details.pattern) === details.expect;
309
+ },
310
+ patternToRegex(pattern, flags = undefined, verbatim = false) {
311
+ if ( pattern === '' ) { return /^/; }
312
+ const match = /^\/(.+)\/([gimsu]*)$/.exec(pattern);
313
+ if ( match === null ) {
314
+ const reStr = this.escapeRegexChars(pattern);
315
+ return new RegExp(verbatim ? `^${reStr}$` : reStr, flags);
316
+ }
317
+ try {
318
+ return new RegExp(match[1], match[2] || undefined);
319
+ }
320
+ catch {
321
+ }
322
+ return /^/;
323
+ },
324
+ getExtraArgs(args, offset = 0) {
325
+ const entries = args.slice(offset).reduce((out, v, i, a) => {
326
+ if ( (i & 1) === 0 ) {
327
+ const rawValue = a[i+1];
328
+ const value = /^\d+$/.test(rawValue)
329
+ ? parseInt(rawValue, 10)
330
+ : rawValue;
331
+ out.push([ a[i], value ]);
332
+ }
333
+ return out;
334
+ }, []);
335
+ return this.Object_fromEntries(entries);
336
+ },
337
+ onIdle(fn, options) {
338
+ if ( self.requestIdleCallback ) {
339
+ return self.requestIdleCallback(fn, options);
340
+ }
341
+ return self.requestAnimationFrame(fn);
342
+ },
343
+ offIdle(id) {
344
+ if ( self.requestIdleCallback ) {
345
+ return self.cancelIdleCallback(id);
346
+ }
347
+ return self.cancelAnimationFrame(id);
348
+ }
349
+ };
350
+ scriptletGlobals.safeSelf = safe;
351
+ if ( scriptletGlobals.bcSecret === undefined ) { return safe; }
352
+ // This is executed only when the logger is opened
353
+ safe.logLevel = scriptletGlobals.logLevel || 1;
354
+ let lastLogType = '';
355
+ let lastLogText = '';
356
+ let lastLogTime = 0;
357
+ safe.toLogText = (type, ...args) => {
358
+ if ( args.length === 0 ) { return; }
359
+ const text = `[${document.location.hostname || document.location.href}]${args.join(' ')}`;
360
+ if ( text === lastLogText && type === lastLogType ) {
361
+ if ( (Date.now() - lastLogTime) < 5000 ) { return; }
362
+ }
363
+ lastLogType = type;
364
+ lastLogText = text;
365
+ lastLogTime = Date.now();
366
+ return text;
367
+ };
368
+ try {
369
+ const bc = new self.BroadcastChannel(scriptletGlobals.bcSecret);
370
+ let bcBuffer = [];
371
+ safe.sendToLogger = (type, ...args) => {
372
+ const text = safe.toLogText(type, ...args);
373
+ if ( text === undefined ) { return; }
374
+ if ( bcBuffer === undefined ) {
375
+ return bc.postMessage({ what: 'messageToLogger', type, text });
376
+ }
377
+ bcBuffer.push({ type, text });
378
+ };
379
+ bc.onmessage = ev => {
380
+ const msg = ev.data;
381
+ switch ( msg ) {
382
+ case 'iamready!':
383
+ if ( bcBuffer === undefined ) { break; }
384
+ bcBuffer.forEach(({ type, text }) =>
385
+ bc.postMessage({ what: 'messageToLogger', type, text })
386
+ );
387
+ bcBuffer = undefined;
388
+ break;
389
+ case 'setScriptletLogLevelToOne':
390
+ safe.logLevel = 1;
391
+ break;
392
+ case 'setScriptletLogLevelToTwo':
393
+ safe.logLevel = 2;
394
+ break;
395
+ }
396
+ };
397
+ bc.postMessage('areyouready?');
398
+ } catch {
399
+ safe.sendToLogger = (type, ...args) => {
400
+ const text = safe.toLogText(type, ...args);
401
+ if ( text === undefined ) { return; }
402
+ safe.log(`uBO ${text}`);
403
+ };
404
+ }
405
+ return safe;
406
+ }
407
+
408
+ function validateConstantFn(trusted, raw, extraArgs = {}) {
409
+ const safe = safeSelf();
410
+ let value;
411
+ if ( raw === 'undefined' ) {
412
+ value = undefined;
413
+ } else if ( raw === 'false' ) {
414
+ value = false;
415
+ } else if ( raw === 'true' ) {
416
+ value = true;
417
+ } else if ( raw === 'null' ) {
418
+ value = null;
419
+ } else if ( raw === "''" || raw === '' ) {
420
+ value = '';
421
+ } else if ( raw === '[]' || raw === 'emptyArr' ) {
422
+ value = [];
423
+ } else if ( raw === '{}' || raw === 'emptyObj' ) {
424
+ value = {};
425
+ } else if ( raw === 'noopFunc' ) {
426
+ value = function(){};
427
+ } else if ( raw === 'trueFunc' ) {
428
+ value = function(){ return true; };
429
+ } else if ( raw === 'falseFunc' ) {
430
+ value = function(){ return false; };
431
+ } else if ( raw === 'throwFunc' ) {
432
+ value = function(){ throw ''; };
433
+ } else if ( /^-?\d+$/.test(raw) ) {
434
+ value = parseInt(raw);
435
+ if ( isNaN(raw) ) { return; }
436
+ if ( Math.abs(raw) > 0x7FFF ) { return; }
437
+ } else if ( trusted ) {
438
+ if ( raw.startsWith('json:') ) {
439
+ try { value = safe.JSON_parse(raw.slice(5)); } catch { return; }
440
+ } else if ( raw.startsWith('{') && raw.endsWith('}') ) {
441
+ try { value = safe.JSON_parse(raw).value; } catch { return; }
442
+ }
443
+ } else {
444
+ return;
445
+ }
446
+ if ( extraArgs.as !== undefined ) {
447
+ if ( extraArgs.as === 'function' ) {
448
+ return ( ) => value;
449
+ } else if ( extraArgs.as === 'callback' ) {
450
+ return ( ) => (( ) => value);
451
+ } else if ( extraArgs.as === 'resolved' ) {
452
+ return Promise.resolve(value);
453
+ } else if ( extraArgs.as === 'rejected' ) {
454
+ return Promise.reject(value);
455
+ }
456
+ }
457
+ return value;
458
+ }
459
+
460
+ /******************************************************************************/
461
+
462
+ const scriptletGlobals = {}; // eslint-disable-line
463
+ const argsList = [["googletag.destroySlots","noopFunc"]];
464
+ const hostnamesMap = new Map([["olx.ba",0]]);
465
+ const exceptionsMap = new Map([]);
466
+ const hasEntities = false;
467
+ const hasAncestors = false;
468
+
469
+ const collectArgIndices = (hn, map, out) => {
470
+ let argsIndices = map.get(hn);
471
+ if ( argsIndices === undefined ) { return; }
472
+ if ( typeof argsIndices !== 'number' ) {
473
+ for ( const argsIndex of argsIndices ) {
474
+ out.add(argsIndex);
475
+ }
476
+ } else {
477
+ out.add(argsIndices);
478
+ }
479
+ };
480
+
481
+ const indicesFromHostname = (hostname, suffix = '') => {
482
+ const hnParts = hostname.split('.');
483
+ const hnpartslen = hnParts.length;
484
+ if ( hnpartslen === 0 ) { return; }
485
+ for ( let i = 0; i < hnpartslen; i++ ) {
486
+ const hn = `${hnParts.slice(i).join('.')}${suffix}`;
487
+ collectArgIndices(hn, hostnamesMap, todoIndices);
488
+ collectArgIndices(hn, exceptionsMap, tonotdoIndices);
489
+ }
490
+ if ( hasEntities ) {
491
+ const n = hnpartslen - 1;
492
+ for ( let i = 0; i < n; i++ ) {
493
+ for ( let j = n; j > i; j-- ) {
494
+ const en = `${hnParts.slice(i,j).join('.')}.*${suffix}`;
495
+ collectArgIndices(en, hostnamesMap, todoIndices);
496
+ collectArgIndices(en, exceptionsMap, tonotdoIndices);
497
+ }
498
+ }
499
+ }
500
+ };
501
+
502
+ const entries = (( ) => {
503
+ const docloc = document.location;
504
+ const origins = [ docloc.origin ];
505
+ if ( docloc.ancestorOrigins ) {
506
+ origins.push(...docloc.ancestorOrigins);
507
+ }
508
+ return origins.map((origin, i) => {
509
+ const beg = origin.lastIndexOf('://');
510
+ if ( beg === -1 ) { return; }
511
+ const hn = origin.slice(beg+3)
512
+ const end = hn.indexOf(':');
513
+ return { hn: end === -1 ? hn : hn.slice(0, end), i };
514
+ }).filter(a => a !== undefined);
515
+ })();
516
+ if ( entries.length === 0 ) { return; }
517
+
518
+ const todoIndices = new Set();
519
+ const tonotdoIndices = new Set();
520
+
521
+ indicesFromHostname(entries[0].hn);
522
+ if ( hasAncestors ) {
523
+ for ( const entry of entries ) {
524
+ if ( entry.i === 0 ) { continue; }
525
+ indicesFromHostname(entry.hn, '>>');
526
+ }
527
+ }
528
+
529
+ // Apply scriplets
530
+ for ( const i of todoIndices ) {
531
+ if ( tonotdoIndices.has(i) ) { continue; }
532
+ try { setConstant(...argsList[i]); }
533
+ catch { }
534
+ }
535
+
536
+ /******************************************************************************/
537
+
538
+ // End of local scope
539
+ })();
540
+
541
+ void 0;
@@ -72,9 +72,14 @@ function preventFetchFn(
72
72
  const responseProps = {
73
73
  statusText: { value: 'OK' },
74
74
  };
75
+ const responseHeaders = {};
75
76
  if ( /^\{.*\}$/.test(responseType) ) {
76
77
  try {
77
78
  Object.entries(JSON.parse(responseType)).forEach(([ p, v ]) => {
79
+ if ( p === 'headers' && trusted ) {
80
+ Object.assign(responseHeaders, v);
81
+ return;
82
+ }
78
83
  if ( validResponseProps[p] === undefined ) { return; }
79
84
  if ( validResponseProps[p].includes(v) === false ) { return; }
80
85
  responseProps[p] = { value: v };
@@ -127,11 +132,11 @@ function preventFetchFn(
127
132
  }
128
133
  return Promise.resolve(generateContentFn(trusted, responseBody)).then(text => {
129
134
  safe.uboLog(logPrefix, `Prevented with response "${text}"`);
130
- const response = new Response(text, {
131
- headers: {
132
- 'Content-Length': text.length,
133
- }
134
- });
135
+ const headers = Object.assign({}, responseHeaders);
136
+ if ( headers['content-length'] === undefined ) {
137
+ headers['content-length'] = text.length;
138
+ }
139
+ const response = new Response(text, { headers });
135
140
  const props = Object.assign(
136
141
  { url: { value: details.url } },
137
142
  responseProps
@@ -72,9 +72,14 @@ function preventFetchFn(
72
72
  const responseProps = {
73
73
  statusText: { value: 'OK' },
74
74
  };
75
+ const responseHeaders = {};
75
76
  if ( /^\{.*\}$/.test(responseType) ) {
76
77
  try {
77
78
  Object.entries(JSON.parse(responseType)).forEach(([ p, v ]) => {
79
+ if ( p === 'headers' && trusted ) {
80
+ Object.assign(responseHeaders, v);
81
+ return;
82
+ }
78
83
  if ( validResponseProps[p] === undefined ) { return; }
79
84
  if ( validResponseProps[p].includes(v) === false ) { return; }
80
85
  responseProps[p] = { value: v };
@@ -127,11 +132,11 @@ function preventFetchFn(
127
132
  }
128
133
  return Promise.resolve(generateContentFn(trusted, responseBody)).then(text => {
129
134
  safe.uboLog(logPrefix, `Prevented with response "${text}"`);
130
- const response = new Response(text, {
131
- headers: {
132
- 'Content-Length': text.length,
133
- }
134
- });
135
+ const headers = Object.assign({}, responseHeaders);
136
+ if ( headers['content-length'] === undefined ) {
137
+ headers['content-length'] = text.length;
138
+ }
139
+ const response = new Response(text, { headers });
135
140
  const props = Object.assign(
136
141
  { url: { value: details.url } },
137
142
  responseProps
@@ -72,9 +72,14 @@ function preventFetchFn(
72
72
  const responseProps = {
73
73
  statusText: { value: 'OK' },
74
74
  };
75
+ const responseHeaders = {};
75
76
  if ( /^\{.*\}$/.test(responseType) ) {
76
77
  try {
77
78
  Object.entries(JSON.parse(responseType)).forEach(([ p, v ]) => {
79
+ if ( p === 'headers' && trusted ) {
80
+ Object.assign(responseHeaders, v);
81
+ return;
82
+ }
78
83
  if ( validResponseProps[p] === undefined ) { return; }
79
84
  if ( validResponseProps[p].includes(v) === false ) { return; }
80
85
  responseProps[p] = { value: v };
@@ -127,11 +132,11 @@ function preventFetchFn(
127
132
  }
128
133
  return Promise.resolve(generateContentFn(trusted, responseBody)).then(text => {
129
134
  safe.uboLog(logPrefix, `Prevented with response "${text}"`);
130
- const response = new Response(text, {
131
- headers: {
132
- 'Content-Length': text.length,
133
- }
134
- });
135
+ const headers = Object.assign({}, responseHeaders);
136
+ if ( headers['content-length'] === undefined ) {
137
+ headers['content-length'] = text.length;
138
+ }
139
+ const response = new Response(text, { headers });
135
140
  const props = Object.assign(
136
141
  { url: { value: details.url } },
137
142
  responseProps
@@ -72,9 +72,14 @@ function preventFetchFn(
72
72
  const responseProps = {
73
73
  statusText: { value: 'OK' },
74
74
  };
75
+ const responseHeaders = {};
75
76
  if ( /^\{.*\}$/.test(responseType) ) {
76
77
  try {
77
78
  Object.entries(JSON.parse(responseType)).forEach(([ p, v ]) => {
79
+ if ( p === 'headers' && trusted ) {
80
+ Object.assign(responseHeaders, v);
81
+ return;
82
+ }
78
83
  if ( validResponseProps[p] === undefined ) { return; }
79
84
  if ( validResponseProps[p].includes(v) === false ) { return; }
80
85
  responseProps[p] = { value: v };
@@ -127,11 +132,11 @@ function preventFetchFn(
127
132
  }
128
133
  return Promise.resolve(generateContentFn(trusted, responseBody)).then(text => {
129
134
  safe.uboLog(logPrefix, `Prevented with response "${text}"`);
130
- const response = new Response(text, {
131
- headers: {
132
- 'Content-Length': text.length,
133
- }
134
- });
135
+ const headers = Object.assign({}, responseHeaders);
136
+ if ( headers['content-length'] === undefined ) {
137
+ headers['content-length'] = text.length;
138
+ }
139
+ const response = new Response(text, { headers });
135
140
  const props = Object.assign(
136
141
  { url: { value: details.url } },
137
142
  responseProps
@@ -516,7 +516,7 @@ function getRandomTokenFn() {
516
516
  /******************************************************************************/
517
517
 
518
518
  const scriptletGlobals = {}; // eslint-disable-line
519
- const argsList = [["content.playerAdDisplayResponse","","propsToMatch","url:api.chzzk.naver.com/service/t/"],["layers.[-].metadata.name.{=}.POI_Ads","","propsToMatch","url:/PCWeb_Real.json"]];
519
+ const argsList = [["adBreaks.[-].adSources.[].withRemindAd ads.[-].eventTracking.ackImpressions eventTracking.[-].ackImpressions","","propsToMatch","url:api.chzzk.naver.com/service/t/"],["layers.[-].metadata.name.{=}.POI_Ads","","propsToMatch","url:/PCWeb_Real.json"]];
520
520
  const hostnamesMap = new Map([["chzzk.naver.com",0],["map.naver.com",1]]);
521
521
  const exceptionsMap = new Map([]);
522
522
  const hasEntities = false;