sourcemonkey 0.0.0-stage → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (367) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +87 -2
  3. package/dist/bytes.js +37 -0
  4. package/dist/channel-placeholder.js +5 -0
  5. package/dist/collection-scan.js +17 -0
  6. package/dist/collections.html +353 -0
  7. package/dist/compare.html +358 -0
  8. package/dist/composed-source.js +205 -0
  9. package/dist/connect-prompt.html +47 -0
  10. package/dist/debug/icons.html +211 -0
  11. package/dist/debug/storage.html +163 -0
  12. package/dist/debug-log.js +75 -0
  13. package/dist/diagnostic-location.js +64 -0
  14. package/dist/eval-hook.js +308 -0
  15. package/dist/extension/background.js +5263 -0
  16. package/dist/extension/channel.js +133 -0
  17. package/dist/extension/code-links.js +187 -0
  18. package/dist/extension/code-tabs.js +460 -0
  19. package/dist/extension/collection-dialog.js +619 -0
  20. package/dist/extension/collection-display.js +322 -0
  21. package/dist/extension/collections.js +2905 -0
  22. package/dist/extension/compare.js +867 -0
  23. package/dist/extension/concurrency.js +186 -0
  24. package/dist/extension/connect-grants.js +109 -0
  25. package/dist/extension/connect-prompt-page.js +70 -0
  26. package/dist/extension/connect-prompt.js +266 -0
  27. package/dist/extension/copy-button.js +63 -0
  28. package/dist/extension/copy-dialog.js +502 -0
  29. package/dist/extension/copy-preference.js +66 -0
  30. package/dist/extension/debug/icons.js +203 -0
  31. package/dist/extension/debug/storage.js +365 -0
  32. package/dist/extension/deep-link.js +77 -0
  33. package/dist/extension/delete-dialog.js +432 -0
  34. package/dist/extension/delete-icon.js +40 -0
  35. package/dist/extension/details-tooltips.js +66 -0
  36. package/dist/extension/directories.js +679 -0
  37. package/dist/extension/export-backup.js +407 -0
  38. package/dist/extension/export-dialog.js +142 -0
  39. package/dist/extension/file-access.js +74 -0
  40. package/dist/extension/file-changes.js +346 -0
  41. package/dist/extension/frame-info.js +85 -0
  42. package/dist/extension/github-provider.js +336 -0
  43. package/dist/extension/glyph.js +84 -0
  44. package/dist/extension/gm-bindings.js +601 -0
  45. package/dist/extension/gm-download.js +419 -0
  46. package/dist/extension/gm-menu.js +228 -0
  47. package/dist/extension/gm-notification.js +141 -0
  48. package/dist/extension/gm-originator-map.js +23 -0
  49. package/dist/extension/gm-tab-data.js +121 -0
  50. package/dist/extension/gm-tab.js +160 -0
  51. package/dist/extension/gm-url-change.js +111 -0
  52. package/dist/extension/gm-url-scheme.js +27 -0
  53. package/dist/extension/gm-values.js +176 -0
  54. package/dist/extension/gm-window-control.js +104 -0
  55. package/dist/extension/gm-xhr-headers.js +333 -0
  56. package/dist/extension/gm-xhr.js +584 -0
  57. package/dist/extension/injector.js +3145 -0
  58. package/dist/extension/install-capture.js +277 -0
  59. package/dist/extension/line-diff.js +233 -0
  60. package/dist/extension/local-copy.js +560 -0
  61. package/dist/extension/local-delete.js +276 -0
  62. package/dist/extension/location-kinds.js +108 -0
  63. package/dist/extension/log-format.js +158 -0
  64. package/dist/extension/managed-changes.js +361 -0
  65. package/dist/extension/managed-items.js +57 -0
  66. package/dist/extension/match-index.js +375 -0
  67. package/dist/extension/missing-scripts.js +66 -0
  68. package/dist/extension/more-menu.js +109 -0
  69. package/dist/extension/move-dialog.js +197 -0
  70. package/dist/extension/offscreen.js +37 -0
  71. package/dist/extension/options.js +504 -0
  72. package/dist/extension/page-heading.js +170 -0
  73. package/dist/extension/page-links.js +199 -0
  74. package/dist/extension/parse-check-client.js +70 -0
  75. package/dist/extension/parse-check.js +161 -0
  76. package/dist/extension/parse-sandbox-host.js +172 -0
  77. package/dist/extension/parse-sandbox.js +175 -0
  78. package/dist/extension/popup-commands-open.js +41 -0
  79. package/dist/extension/popup-view.js +387 -0
  80. package/dist/extension/popup.js +703 -0
  81. package/dist/extension/prism-userscript.js +53 -0
  82. package/dist/extension/refresh-error.js +136 -0
  83. package/dist/extension/refresh-targets.js +160 -0
  84. package/dist/extension/related-versions.js +1144 -0
  85. package/dist/extension/resize-observer-loop.js +19 -0
  86. package/dist/extension/row-cache.js +387 -0
  87. package/dist/extension/script-blobs.js +413 -0
  88. package/dist/extension/script-details.js +658 -0
  89. package/dist/extension/script-enablement.js +285 -0
  90. package/dist/extension/script-identity.js +310 -0
  91. package/dist/extension/script-keys.js +54 -0
  92. package/dist/extension/script-log-id.js +155 -0
  93. package/dist/extension/script-log.js +290 -0
  94. package/dist/extension/script-rejection.js +104 -0
  95. package/dist/extension/script-sites.js +158 -0
  96. package/dist/extension/script-store.js +3507 -0
  97. package/dist/extension/script-updater.js +991 -0
  98. package/dist/extension/script-url-hash.js +61 -0
  99. package/dist/extension/select-all.js +37 -0
  100. package/dist/extension/select-open-guard.js +90 -0
  101. package/dist/extension/site-icon.js +1261 -0
  102. package/dist/extension/sm-dev-link.js +302 -0
  103. package/dist/extension/solo-click.js +58 -0
  104. package/dist/extension/sticky-numbers.js +188 -0
  105. package/dist/extension/storage-breakdown.js +253 -0
  106. package/dist/extension/storage-scan.js +86 -0
  107. package/dist/extension/storage-usage.js +194 -0
  108. package/dist/extension/structural-keys.js +29 -0
  109. package/dist/extension/sw-teardown.js +36 -0
  110. package/dist/extension/tab-status.js +403 -0
  111. package/dist/extension/toolbar-summary.js +105 -0
  112. package/dist/extension/user-scripts-access.js +43 -0
  113. package/dist/extension/userscript.js +3672 -0
  114. package/dist/extension/value-store.js +204 -0
  115. package/dist/extension/version-probe-fetch.js +68 -0
  116. package/dist/extension/worker-client.js +109 -0
  117. package/dist/extension/worker-ops.js +171 -0
  118. package/dist/extension/zip-writer.js +24 -0
  119. package/dist/external-files.js +878 -0
  120. package/dist/file-loader.js +436 -0
  121. package/dist/file-locations.js +439 -0
  122. package/dist/generated-wrappers.js +5 -0
  123. package/dist/github-auth.js +148 -0
  124. package/dist/github-urls.js +46 -0
  125. package/dist/gm-api-catalog.js +217 -0
  126. package/dist/gm-connect.js +273 -0
  127. package/dist/gm-xhr-types.js +5 -0
  128. package/dist/http-read.js +142 -0
  129. package/dist/icons/icon-128.png +0 -0
  130. package/dist/icons/icon-16.png +0 -0
  131. package/dist/icons/icon-48.png +0 -0
  132. package/dist/local-file-overrides.js +558 -0
  133. package/dist/manifest.json +38 -0
  134. package/dist/markup-response.js +126 -0
  135. package/dist/match-targets.js +305 -0
  136. package/dist/menu-captions.js +22 -0
  137. package/dist/offscreen.html +39 -0
  138. package/dist/options.html +197 -0
  139. package/dist/parse-check-protocol.js +51 -0
  140. package/dist/parse-location.js +171 -0
  141. package/dist/parse-sandbox.html +56 -0
  142. package/dist/phase-timing.js +155 -0
  143. package/dist/popup.html +197 -0
  144. package/dist/public-suffixes.js +6957 -0
  145. package/dist/run-context.js +31 -0
  146. package/dist/runtime-messages.js +34 -0
  147. package/dist/sandboxed-page.js +35 -0
  148. package/dist/script-build.js +787 -0
  149. package/dist/script-display.js +383 -0
  150. package/dist/script-icon.js +43 -0
  151. package/dist/script-links.js +204 -0
  152. package/dist/script-source-url.js +214 -0
  153. package/dist/script-world.js +65 -0
  154. package/dist/sm-dev-protocol.js +84 -0
  155. package/dist/source-map.js +177 -0
  156. package/dist/stack-link.js +138 -0
  157. package/dist/styles.css +825 -0
  158. package/dist/unsafe-window-use.js +229 -0
  159. package/dist/url-match.js +734 -0
  160. package/dist/userscript-header.js +248 -0
  161. package/dist/userscript.html +1165 -0
  162. package/dist/vendor/fflate.LICENSE +21 -0
  163. package/dist/vendor/fflate.js +2692 -0
  164. package/dist/vendor/prism/prism-line-numbers.css +1 -0
  165. package/dist/vendor/prism/prism-line-numbers.js +1 -0
  166. package/dist/vendor/prism/prism.css +1 -0
  167. package/dist/vendor/prism/prism.js +1946 -0
  168. package/dist/version-compare.js +141 -0
  169. package/dist/version-probe.js +120 -0
  170. package/lib/build-info.json +1 -0
  171. package/lib/bytes.d.ts +3 -0
  172. package/lib/bytes.js +37 -0
  173. package/lib/channel-placeholder.d.ts +1 -0
  174. package/lib/channel-placeholder.js +5 -0
  175. package/lib/collection-scan.d.ts +8 -0
  176. package/lib/collection-scan.js +17 -0
  177. package/lib/composed-source.d.ts +28 -0
  178. package/lib/composed-source.js +205 -0
  179. package/lib/debug-log.d.ts +9 -0
  180. package/lib/debug-log.js +75 -0
  181. package/lib/diagnostic-location.d.ts +8 -0
  182. package/lib/diagnostic-location.js +64 -0
  183. package/lib/eval-hook.d.ts +34 -0
  184. package/lib/eval-hook.js +308 -0
  185. package/lib/external-files.d.ts +111 -0
  186. package/lib/external-files.js +878 -0
  187. package/lib/file-loader.d.ts +48 -0
  188. package/lib/file-loader.js +436 -0
  189. package/lib/file-locations.d.ts +44 -0
  190. package/lib/file-locations.js +439 -0
  191. package/lib/generated-wrappers.d.ts +11 -0
  192. package/lib/generated-wrappers.js +5 -0
  193. package/lib/github-auth.d.ts +12 -0
  194. package/lib/github-auth.js +148 -0
  195. package/lib/github-urls.d.ts +1 -0
  196. package/lib/github-urls.js +46 -0
  197. package/lib/gm-api-catalog.d.ts +24 -0
  198. package/lib/gm-api-catalog.js +217 -0
  199. package/lib/gm-connect.d.ts +34 -0
  200. package/lib/gm-connect.js +273 -0
  201. package/lib/gm-xhr-types.d.ts +68 -0
  202. package/lib/gm-xhr-types.js +5 -0
  203. package/lib/harness/browser-extensions.d.ts +73 -0
  204. package/lib/harness/browser-extensions.js +285 -0
  205. package/lib/harness/browser-lang.d.ts +20 -0
  206. package/lib/harness/browser-lang.js +86 -0
  207. package/lib/harness/browser-launch.d.ts +14 -0
  208. package/lib/harness/browser-launch.js +184 -0
  209. package/lib/harness/checks.d.ts +110 -0
  210. package/lib/harness/checks.js +321 -0
  211. package/lib/harness/cli.d.ts +2 -0
  212. package/lib/harness/cli.js +2259 -0
  213. package/lib/harness/command-args.d.ts +91 -0
  214. package/lib/harness/command-args.js +369 -0
  215. package/lib/harness/command-lines.d.ts +80 -0
  216. package/lib/harness/command-lines.js +180 -0
  217. package/lib/harness/command-list.d.ts +206 -0
  218. package/lib/harness/command-list.js +1475 -0
  219. package/lib/harness/console-commands.d.ts +463 -0
  220. package/lib/harness/console-commands.js +3216 -0
  221. package/lib/harness/download-watch.d.ts +21 -0
  222. package/lib/harness/download-watch.js +156 -0
  223. package/lib/harness/extension-backend.d.ts +41 -0
  224. package/lib/harness/extension-backend.js +100 -0
  225. package/lib/harness/extension-host.d.ts +112 -0
  226. package/lib/harness/extension-host.js +552 -0
  227. package/lib/harness/extension-launch.d.ts +67 -0
  228. package/lib/harness/extension-launch.js +285 -0
  229. package/lib/harness/extension-link.d.ts +315 -0
  230. package/lib/harness/extension-link.js +607 -0
  231. package/lib/harness/external-manager.d.ts +146 -0
  232. package/lib/harness/external-manager.js +414 -0
  233. package/lib/harness/fixture.d.ts +165 -0
  234. package/lib/harness/fixture.js +461 -0
  235. package/lib/harness/frame-sessions.d.ts +71 -0
  236. package/lib/harness/frame-sessions.js +248 -0
  237. package/lib/harness/frames.d.ts +68 -0
  238. package/lib/harness/frames.js +216 -0
  239. package/lib/harness/help-format.d.ts +17 -0
  240. package/lib/harness/help-format.js +127 -0
  241. package/lib/harness/host.d.ts +352 -0
  242. package/lib/harness/host.js +423 -0
  243. package/lib/harness/index.d.ts +8 -0
  244. package/lib/harness/index.js +10 -0
  245. package/lib/harness/input-file.d.ts +18 -0
  246. package/lib/harness/input-file.js +61 -0
  247. package/lib/harness/json-output.d.ts +565 -0
  248. package/lib/harness/json-output.js +71 -0
  249. package/lib/harness/manager-actions.d.ts +21 -0
  250. package/lib/harness/manager-actions.js +129 -0
  251. package/lib/harness/manager-commands.d.ts +142 -0
  252. package/lib/harness/manager-commands.js +1196 -0
  253. package/lib/harness/manager-fetch.d.ts +33 -0
  254. package/lib/harness/manager-fetch.js +239 -0
  255. package/lib/harness/managers.d.ts +24 -0
  256. package/lib/harness/managers.js +27 -0
  257. package/lib/harness/output-style.d.ts +125 -0
  258. package/lib/harness/output-style.js +322 -0
  259. package/lib/harness/page-commands.d.ts +134 -0
  260. package/lib/harness/page-commands.js +1141 -0
  261. package/lib/harness/page-output.d.ts +67 -0
  262. package/lib/harness/page-output.js +139 -0
  263. package/lib/harness/page-watch.d.ts +171 -0
  264. package/lib/harness/page-watch.js +607 -0
  265. package/lib/harness/parse-check-node.d.ts +3 -0
  266. package/lib/harness/parse-check-node.js +132 -0
  267. package/lib/harness/path-args.d.ts +22 -0
  268. package/lib/harness/path-args.js +148 -0
  269. package/lib/harness/playwright-chromium.d.ts +16 -0
  270. package/lib/harness/playwright-chromium.js +86 -0
  271. package/lib/harness/prepare.d.ts +168 -0
  272. package/lib/harness/prepare.js +364 -0
  273. package/lib/harness/prompt-editor.d.ts +17 -0
  274. package/lib/harness/prompt-editor.js +354 -0
  275. package/lib/harness/prompt-history.d.ts +13 -0
  276. package/lib/harness/prompt-history.js +89 -0
  277. package/lib/harness/rebuild-advice.d.ts +6 -0
  278. package/lib/harness/rebuild-advice.js +39 -0
  279. package/lib/harness/run-log.d.ts +47 -0
  280. package/lib/harness/run-log.js +140 -0
  281. package/lib/harness/run-logs.d.ts +132 -0
  282. package/lib/harness/run-logs.js +241 -0
  283. package/lib/harness/run.d.ts +194 -0
  284. package/lib/harness/run.js +1973 -0
  285. package/lib/harness/runs.d.ts +229 -0
  286. package/lib/harness/runs.js +726 -0
  287. package/lib/harness/save-html.d.ts +39 -0
  288. package/lib/harness/save-html.js +89 -0
  289. package/lib/harness/saved-pages.d.ts +120 -0
  290. package/lib/harness/saved-pages.js +275 -0
  291. package/lib/harness/script-mark.d.ts +17 -0
  292. package/lib/harness/script-mark.js +56 -0
  293. package/lib/harness/snapshot.d.ts +143 -0
  294. package/lib/harness/snapshot.js +474 -0
  295. package/lib/harness/stuck-tabs.d.ts +19 -0
  296. package/lib/harness/stuck-tabs.js +131 -0
  297. package/lib/harness/tab-refs.d.ts +20 -0
  298. package/lib/harness/tab-refs.js +80 -0
  299. package/lib/harness/tampermonkey.d.ts +71 -0
  300. package/lib/harness/tampermonkey.js +356 -0
  301. package/lib/harness/tm-ids.d.ts +18 -0
  302. package/lib/harness/tm-ids.js +88 -0
  303. package/lib/harness/violentmonkey.d.ts +34 -0
  304. package/lib/harness/violentmonkey.js +162 -0
  305. package/lib/harness/wait.d.ts +77 -0
  306. package/lib/harness/wait.js +458 -0
  307. package/lib/http-read.d.ts +30 -0
  308. package/lib/http-read.js +142 -0
  309. package/lib/local-file-overrides.d.ts +35 -0
  310. package/lib/local-file-overrides.js +558 -0
  311. package/lib/manifest.json +38 -0
  312. package/lib/markup-response.d.ts +11 -0
  313. package/lib/markup-response.js +126 -0
  314. package/lib/match-targets.d.ts +18 -0
  315. package/lib/match-targets.js +305 -0
  316. package/lib/menu-captions.d.ts +1 -0
  317. package/lib/menu-captions.js +22 -0
  318. package/lib/parse-check-protocol.d.ts +27 -0
  319. package/lib/parse-check-protocol.js +51 -0
  320. package/lib/parse-location.d.ts +12 -0
  321. package/lib/parse-location.js +171 -0
  322. package/lib/phase-timing.d.ts +12 -0
  323. package/lib/phase-timing.js +155 -0
  324. package/lib/public-suffixes.d.ts +1 -0
  325. package/lib/public-suffixes.js +6957 -0
  326. package/lib/run-context.d.ts +2 -0
  327. package/lib/run-context.js +31 -0
  328. package/lib/runtime-messages.d.ts +10 -0
  329. package/lib/runtime-messages.js +34 -0
  330. package/lib/sandboxed-page.d.ts +5 -0
  331. package/lib/sandboxed-page.js +35 -0
  332. package/lib/script-build.d.ts +111 -0
  333. package/lib/script-build.js +787 -0
  334. package/lib/script-display.d.ts +51 -0
  335. package/lib/script-display.js +383 -0
  336. package/lib/script-icon.d.ts +16 -0
  337. package/lib/script-icon.js +43 -0
  338. package/lib/script-links.d.ts +24 -0
  339. package/lib/script-links.js +204 -0
  340. package/lib/script-source-url.d.ts +8 -0
  341. package/lib/script-source-url.js +214 -0
  342. package/lib/script-world.d.ts +6 -0
  343. package/lib/script-world.js +65 -0
  344. package/lib/sm-dev-protocol.d.ts +251 -0
  345. package/lib/sm-dev-protocol.js +84 -0
  346. package/lib/source-map.d.ts +32 -0
  347. package/lib/source-map.js +177 -0
  348. package/lib/stack-link.d.ts +15 -0
  349. package/lib/stack-link.js +138 -0
  350. package/lib/unsafe-window-use.d.ts +1 -0
  351. package/lib/unsafe-window-use.js +229 -0
  352. package/lib/url-match.d.ts +40 -0
  353. package/lib/url-match.js +734 -0
  354. package/lib/userscript-header.d.ts +33 -0
  355. package/lib/userscript-header.js +248 -0
  356. package/lib/version-compare.d.ts +6 -0
  357. package/lib/version-compare.js +141 -0
  358. package/lib/version-probe.d.ts +17 -0
  359. package/lib/version-probe.js +120 -0
  360. package/package.json +55 -3
  361. package/skills/SourceMonkey-dev/SKILL.md +868 -0
  362. package/skills/SourceMonkey-dev/references/cdp.md +293 -0
  363. package/skills/SourceMonkey-dev/references/commands.md +297 -0
  364. package/skills/SourceMonkey-dev/references/other-managers.md +63 -0
  365. package/skills/SourceMonkey-dev/references/specs.md +46 -0
  366. package/skills/SourceMonkey-friction/SKILL.md +103 -0
  367. package/skills/SourceMonkey-friction/references/template.md +59 -0
@@ -0,0 +1,5 @@
1
+ /* Generated by scripts/build.mjs. Do not edit. */
2
+
3
+ export const WRAPPER_PRELUDE = "(function(){\"use strict\";if(typeof self===\"undefined\")return;var e=\"__SM_KEY__\";var n=function(e){var n=document.__smGate;if(typeof n!==\"function\"){var t=Object.create(null),r=Object.create,i=Reflect.apply,a=Promise;var o=console.info.bind(console);var rs=function(e){return new a(function(n){n(e)})};var rj=function(e){return new a(function(n,t){t(e)})};n=function(e){if(typeof e!==\"string\")return void 0;var n=t[e];if(!n){n=r(null);n.apply=i;n.resolve=rs;n.reject=rj;n.info=o;t[e]=n}return n};var u=r(null);u.value=n;Object.defineProperty(document,\"__smGate\",u)}return n(e)}(e);var t=\"sourcemonkey-sync-\"+e;var r=\"sourcemonkey-reply-\"+e;var i=Reflect.apply;var a=Object.hasOwn;var o=Object.create;var u=Object.defineProperty;var c=setTimeout;var s=clearTimeout;var f=queueMicrotask;function bare(e){if(!e||typeof e!==\"object\")return e;var n=o(null);var t=X(e);for(var r=0;r<t.length;r++)n[t[r]]=e[t[r]];return n}function dataDesc(e,n,t,r){var i=o(null);i.value=e;i.writable=n;i.enumerable=t;i.configurable=r;return i}function drainQueue(e){var t=n.cfgQueue;if(!t)return;n.cfgQueue=null;for(var r=0;r<t.length;r++){try{e(t[r])}catch(e){try{console.info(\"[SourceMonkey] prelude init threw for\",t[r]&&t[r].id,e)}catch(e){}}}}if(n.prelude&&n.prelude.scripts){drainQueue(n.prelude.init);return}var d=o(null);function makeEntry(e){return{cfg:e,matched:true,decision:null,runAtFired:false,replayLoad:false,pendingRun:null,runRegistered:false,loadedAtRun:e.loadedAt,asyncListenersInstalled:false,send}}function hasOwnRuntimeChannel(){try{return typeof chrome!==\"undefined\"&&!!chrome.runtime&&typeof chrome.runtime.id===\"string\"&&typeof chrome.runtime.sendMessage===\"function\"}catch(e){return false}}var l=hasOwnRuntimeChannel();var v=l?chrome.runtime.sendMessage.bind(chrome.runtime):null;var y=eval;var p=null;var m=null;var g=null;var h=null;var w=null;try{p=CustomEvent}catch(e){}try{g=JSON.stringify;h=JSON.parse}catch(e){}try{w=Object.getOwnPropertyDescriptor(CustomEvent.prototype,\"detail\").get}catch(e){}try{if(document&&typeof document.dispatchEvent===\"function\"){m=document.dispatchEvent.bind(document)}}catch(e){}var b=[];var S=false;function dispatchToBridge(e){var n=o(null);n.detail=e;n.cancelable=true;return!m(new p(t,n))}function bridgeDispatch(e,n){try{if(!p||!m||!g)return false;var t=g({requestId:n==null?undefined:n,payload:e});if(!dispatchToBridge(t))holdForBridge(t,n);return true}catch(e){return false}}function addHeld(e,n){u(e,e.length,dataDesc(n,true,true,true))}function holdForBridge(e,n){addHeld(b,{detail:e,requestId:n});if(S)return;S=true;try{window.addEventListener(\"sourcemonkey-bridge-ready\",resendHeld,true)}catch(e){}}function dropHeld(e){var n=[];for(var t=0;t<b.length;t++){if(b[t].requestId!==e)addHeld(n,b[t])}b=n}function resendHeld(){var e=b;b=[];for(var n=0;n<e.length;n++){try{if(!dispatchToBridge(e[n].detail))addHeld(b,e[n])}catch(e){}}}var k=Object.create(null);function onReply(e,n){k[e]=n}function offReply(e){delete k[e]}if(!l){try{document.addEventListener(r,function(e){try{var n=bare(h(i(w,e,[])));if(!n||typeof n.requestId!==\"string\")return;f(function(){var e=k[n.requestId];if(!e)return;delete k[n.requestId];e(n.reply)})}catch(e){}},true)}catch(e){}}var A=false;try{A=self.origin===\"null\"}catch(e){}function send(e){try{e.opaqueOrigin=A}catch(e){}try{if(l){var n=v(e);if(n&&typeof n.catch===\"function\")n.catch(function(){});return}}catch(e){}bridgeDispatch(e,null)}function hasGmRuntime(){return!!n.gm}var R=1e4;var E=\"SourceMonkey could not be asked whether to run it\";function noDecision(e){return{action:\"skip\",reason:\"no-decision\",detail:e}}function askFailed(e){return noDecision(\"Asking SourceMonkey whether to run it failed: \"+(e&&e.message||String(e)))}function sentence(e){return String(e).replace(/\\.+\\s*$/,\"\")+\".\"}function awaitDecision(e,n){var t=e.cfg;var r=!!(t.matching&&t.matching.tld);var decided=function(e){e=bare(e);if(e&&typeof e===\"object\"&&(e.action===\"run\"||e.action===\"run-new\"||e.action===\"skip\"))return e;if(e&&typeof e===\"object\"&&typeof e.bridgeError===\"string\")return noDecision(e.bridgeError);return noDecision(\"SourceMonkey's answer whether to run it was unreadable\")};var i=noDecision(\"SourceMonkey did not answer whether to run it within \"+R/1e3+\" seconds\");var a=false;var finish=function(e){if(a)return;a=true;try{n(e)}catch(e){}};var cleanup=function(){};var o=c(function(){seal(i)},R);var seal=function(e){try{s(o)}catch(e){}try{cleanup()}catch(e){}finish(e)};try{if(l){var u=v({type:\"sm:check-pending\",id:t.id,name:t.name,loadedAt:t.loadedAt,url:location.href,needsValues:!!t.needsGmValues,tld:r});if(u&&typeof u.then===\"function\"){u.then(function(e){seal(decided(e))},function(e){seal(askFailed(e))})}else{seal(noDecision(E))}return}var f=\"sm-\"+Math.random().toString(36).slice(2)+\"-\"+Date.now();var d={type:\"sm:check-pending\",id:t.id,name:t.name,loadedAt:t.loadedAt,url:location.href,needsValues:!!t.needsGmValues,tld:r};onReply(f,function(e){seal(decided(e))});cleanup=function(){offReply(f);dropHeld(f)};var y=bridgeDispatch(d,f);if(!y)seal(noDecision(E))}catch(e){seal(askFailed(e))}}var L=new WeakSet;function stackHitsScript(e,n){try{var t=e&&typeof e===\"object\"&&e.stack;if(typeof t!==\"string\")return false;if(t.indexOf(n.cfg.sourceUrl)!==-1)return true}catch(e){}return false}function filenameHitsScript(e,n){try{if(typeof e!==\"string\")return false;if(e.indexOf(n.cfg.sourceUrl)!==-1)return true}catch(e){}return false}function reportAsync(e,n,t){try{if(n&&typeof n===\"object\"){if(L.has(n))return;L.add(n)}}catch(e){}var r;try{r=n&&n.message?String(n.message):String(n)}catch(e){r=\"(unstringifiable error)\"}var i=\"\";try{if(n&&typeof n.stack===\"string\")i=n.stack}catch(e){}try{console.info(\"[SourceMonkey] caught async \"+t+\" in\",e.cfg.name)}catch(e){}send({type:\"sm:error\",id:e.cfg.id,name:e.cfg.name,loadedAt:e.loadedAtRun,url:location.href,message:r,stack:i})}var O=5e3;var M=0;var D=false;function sendFocusSignal(){var e=Date.now();if(e-M<O)return;M=e;send({type:\"sm:focus\",url:location.href})}function installFocusSignal(){if(D)return;D=true;try{window.addEventListener(\"focus\",sendFocusSignal);document.addEventListener(\"visibilitychange\",function(){if(!document.hidden)sendFocusSignal()})}catch(e){}}function installAsyncListeners(e){if(e.asyncListenersInstalled)return;e.asyncListenersInstalled=true;try{window.addEventListener(\"error\",function(n){if(!n)return;if(filenameHitsScript(n.filename,e)||stackHitsScript(n.error,e)){reportAsync(e,n.error||n.message||\"error\",\"error\")}},true);window.addEventListener(\"unhandledrejection\",function(n){if(n&&stackHitsScript(n.reason,e)){reportAsync(e,n.reason,\"unhandledrejection\")}},true)}catch(e){}}var F=200;var I=null;try{window.addEventListener(\"load\",function(e){I=e},{once:true})}catch(e){}var P=false;function runWithLoadReplay(e){var n=window;var t=o(null);var r=0;var a=_(n,\"addEventListener\");var u=n.addEventListener;var c=n.onload;var s=false;try{n.addEventListener=function(e,a){var o=this==null||isSandbox(this)?n:this;if(e===\"load\"&&o===n&&a){t[r++]=a;return}return i(u,o,arguments)};s=true}catch(e){}try{P=s;e()}finally{P=false;if(s){try{if(a)Q(n,\"addEventListener\",a);else delete n.addEventListener}catch(e){}}try{if(n.onload!==c&&typeof n.onload===\"function\")t[r++]=n.onload}catch(e){}}var f=I;for(var d=0;d<r;d++)replayLoad(t[d],f)}function replayLoad(e,n){c(function(){if(typeof e===\"function\")i(e,window,[n]);else if(e&&typeof e.handleEvent===\"function\"){i(e.handleEvent,e,[n])}},0)}function waitForRunAt(e,n){if(e===\"document-start\"){waitForNode(function(){return document.documentElement},false,true,n);return}if(e===\"document-body\"){waitForNode(function(){return document.body},true,false,n);return}if(e===\"document-end\"){if(document.readyState!==\"loading\"){n();return}document.addEventListener(\"DOMContentLoaded\",function(){n()},{once:true});return}if(document.readyState===\"complete\"){n();return}var t=false;var r=null;var runIdle=function(){if(t)return;t=true;if(r!==null)s(r);window.removeEventListener(\"load\",runIdle);document.removeEventListener(\"readystatechange\",onReadyState);document.removeEventListener(\"DOMContentLoaded\",onContentLoaded);n(true)};var onReadyState=function(){if(document.readyState===\"complete\")runIdle()};var onContentLoaded=function(){if(r===null)r=c(runIdle,F)};window.addEventListener(\"load\",runIdle);document.addEventListener(\"readystatechange\",onReadyState);if(document.readyState===\"loading\"){document.addEventListener(\"DOMContentLoaded\",onContentLoaded)}else{onContentLoaded()}}function waitForNode(e,n,t,r){if(e()){r();return}var i=false;var a=null;var finish=function(e){if(i)return;i=true;try{if(a)a.disconnect()}catch(e){}try{document.removeEventListener(\"DOMContentLoaded\",onEnd,true)}catch(e){}if(e)r()};var onEnd=function(){finish(!!e()||t)};if(document.readyState!==\"loading\"){onEnd();return}try{a=new MutationObserver(function(){if(e())finish(true)});a.observe(document,{childList:true,subtree:n});document.addEventListener(\"DOMContentLoaded\",onEnd,true)}catch(e){finish(true)}}function testRx(e,n){try{return new RegExp(e[0],e[1]).test(n)}catch(e){return false}}function matchScript(e,n){for(var t=0;t<n.exclude.length;t++)if(testRx(n.exclude[t],e))return false;for(var r=0;r<n.include.length;r++)if(testRx(n.include[r],e))return true;return false}function inTopFrame(){try{return window.top===window}catch(e){return false}}function emitStartupLogs(e){var n=e.startupLogs;if(!n||!n.length)return;for(var t=0;t<n.length;t++){var r=n[t];try{console.info(\"[SourceMonkey] \"+e.name+\": \"+r.message)}catch(e){}}}function initScript(e){if(!e||!e.id)return;if(d[e.id]){if(e.manualRun)return rerunManual(d[e.id],e);return d[e.id]}var n=makeEntry(e);d[e.id]=n;if(e.matching){n.matched=matchScript(location.href,e.matching);if(!n.matched)return n}installAsyncListeners(n);installFocusSignal();if(inTopFrame())emitStartupLogs(e);if(e.manualRun){startManualRun(n,e);return n}waitForRunAt(e.runAt,function(e){n.runAtFired=true;n.replayLoad=!!e;flushPending(n)});if(canSkipDecision(e)){n.decision=bare({action:\"run\"});return n}awaitDecision(n,function(t){n.decision=t;if(t&&t.startupLogs===true&&!inTopFrame())emitStartupLogs(e);if(n.decision.action===\"skip\"){if(n.decision.reason===\"no-match\"){n.matched=false;n.pendingRun=null;return}if(n.decision.reason===\"no-decision\"){try{console.info(\"[SourceMonkey] \"+e.name+\": It did not run. \"+sentence(n.decision.detail))}catch(e){}}send({type:\"sm:abandoned\",id:e.id,name:e.name,loadedAt:e.loadedAt,url:location.href,reason:n.decision.reason||\"skip\",detail:n.decision.detail});n.pendingRun=null;return}flushPending(n)});return n}function startManualRun(e,n){e.runAtFired=true;e.decision=bare({action:\"run\"});if(n.manualRun.gmValues){e.decision.gmValues=n.manualRun.gmValues;e.decision.gmSeq=n.manualRun.gmSeq}}function rerunManual(e,t){try{if(n.gm&&typeof n.gm.retireRun===\"function\")n.gm.retireRun(t.id)}catch(e){}e.cfg=t;e.matched=t.matching?matchScript(location.href,t.matching):true;e.pendingRun=null;e.runRegistered=false;e.replayLoad=false;e.loadedAtRun=t.loadedAt;if(e.matched){installAsyncListeners(e);startManualRun(e,t)}return e}function canSkipDecision(e){if(e.runAt!==\"document-start\")return false;if(e.needsGmValues)return false;if(e.matching&&e.matching.tld)return false;if(e.needsGmRuntime&&!hasGmRuntime())return false;try{if(window.top!==window)return false;var n=performance.getEntriesByType(\"navigation\")[0];if(!n||n.type===\"reload\")return false}catch(e){return false}if(typeof e.run===\"string\")return smDevMarker(j+e.run);return!smDevMarker(x)}var x=\"sourcemonkey-sm-dev\";var j=\"sourcemonkey-sm-dev-run:\";function smDevMarker(e){try{var n=new CustomEvent(e,{cancelable:true});window.dispatchEvent(n);return n.defaultPrevented}catch(e){return false}}function flushPending(e){if(!e.runAtFired||!e.decision)return;if(e.decision.action===\"skip\")return;var n=e.pendingRun;e.pendingRun=null;if(typeof n!==\"function\")return;if(e.replayLoad&&I){runWithLoadReplay(function(){runMain(e,n)})}else{runMain(e,n)}}function runMain(e,t){var r=e.cfg;var i=e.decision;if(i.action===\"run-new\"&&typeof i.body===\"string\"){var a=typeof i.loadedAt===\"number\"?i.loadedAt:r.loadedAt;var o=false;var u=null;var c=true;if(i.needsRuntime&&!hasGmRuntime()){c=false;try{console.info(\"[SourceMonkey] \"+r.name+\": The updated copy needs the GM runtime, which this page does not have yet, so the previous version ran. Reload the page to pick it up.\")}catch(e){}}if(c&&i.seedValues){c=false;var s=i.gmValues;if(s&&typeof s===\"object\"){try{n.gm.storage.init(r.id,s,i.gmSeq);c=true}catch(e){}}if(!c){try{console.info(\"[SourceMonkey] \"+r.name+\": Could not load this script's stored GM values for the updated copy, so the previous version ran. Reload the page to retry.\")}catch(e){}}}if(c){try{y(i.body+\"\\n//# sourceURL=\"+r.sourceUrl)}catch(e){u=e;var f=e&&e.message?String(e.message):String(e);if(f.indexOf(\"unsafe-eval\")!==-1||f.indexOf(\"Content Security Policy\")!==-1){o=true}}}if(o||!c){if(o){try{console.info(\"[SourceMonkey] swap blocked by page CSP for \"+r.name+\", running prior version\")}catch(e){}}}else{e.loadedAtRun=a;try{console.log(\"[SourceMonkey] script\",r.name,\"running on\",location.href,\"(swapped to newer version)\")}catch(e){}send({type:\"sm:swapped\",id:r.id,name:r.name,fromLoadedAt:r.loadedAt,loadedAt:a,gmSeq:i.gmSeq,url:location.href});if(u){var d=u&&u.message?u.message:String(u);var l=u&&typeof u.stack===\"string\"?u.stack:\"\";try{console.info(\"[SourceMonkey] swapped script\",r.name,\"threw:\",u)}catch(e){}send({type:\"sm:error\",id:r.id,name:r.name,loadedAt:a,url:location.href,message:d,stack:l})}return}}try{console.log(\"[SourceMonkey] script\",r.name,\"running on\",location.href)}catch(e){}send({type:\"sm:start\",id:r.id,name:r.name,loadedAt:r.loadedAt,gmSeq:i.gmSeq,url:location.href});try{t(e)}catch(e){var v=e&&e.message?e.message:String(e);var p=e&&typeof e.stack===\"string\"?e.stack:\"\";try{console.info(\"[SourceMonkey] script\",r.name,\"threw:\",e)}catch(e){}send({type:\"sm:error\",id:r.id,name:r.name,loadedAt:r.loadedAt,url:location.href,message:v,stack:p})}}n.run=function(e,n){var t=d[e];if(!t)return;t.runRegistered=true;if(!t.matched)return;t.pendingRun=n;flushPending(t)};n.sealed=function(e){var n=d[e];if(!n||n.runRegistered)return;if(!n.matched)return;var t=\"Script source failed to parse (a @require or the script body has a syntax error); nothing was run\";try{console.info(\"[SourceMonkey]\",n.cfg.name+\":\",t)}catch(e){}send({type:\"sm:error\",id:n.cfg.id,name:n.cfg.name,loadedAt:n.loadedAtRun,url:location.href,message:t})};var T=Proxy;var W=WeakMap;var q=W.prototype.get;var N=W.prototype.set;var C=W.prototype.has;function wmGet(e,n){return i(q,e,[n])}function wmSet(e,n,t){i(N,e,[n,t])}function wmHas(e,n){return i(C,e,[n])}var B=Reflect.construct;var H=Reflect.defineProperty;var G=Reflect.deleteProperty;var V=Reflect.get;var K=Reflect.set;var _=Object.getOwnPropertyDescriptor;var U=Object.getPrototypeOf;var Q=Object.defineProperty;var X=Reflect.ownKeys;var Y=Function.prototype.toString;var z=Function.prototype.bind;var J=Object.prototype;var $=Symbol.unscopables;var Z=/\\{\\s*\\[native code\\]\\s*\\}\\s*$/;var ee=new W;var ne=new W;var te=new W;function isSandbox(e){return!!(e&&typeof e===\"object\"&&wmHas(ee,e))}var re=Object.create(null);(\"addEventListener alert atob blur btoa cancelAnimationFrame cancelIdleCallback \"+\"captureEvents clearInterval clearTimeout close confirm createImageBitmap \"+\"dispatchEvent fetch find focus getComputedStyle getSelection matchMedia \"+\"moveBy moveTo open postMessage print prompt queueMicrotask releaseEvents \"+\"removeEventListener reportError requestAnimationFrame requestIdleCallback \"+\"resizeBy resizeTo scroll scrollBy scrollTo setInterval setTimeout \"+\"showDirectoryPicker stop structuredClone webkitCancelAnimationFrame \"+\"webkitRequestAnimationFrame\").split(\" \").forEach(function(e){re[e]=true});function isNative(e){var n=wmGet(te,e);if(n===undefined){try{n=Z.test(i(Y,e,[]))}catch(e){n=false}wmSet(te,e,n)}return n}var ie=new W;function hasStatics(e){var n=wmGet(ie,e);if(n===undefined){var t=X(e);n=false;for(var r=0;r<t.length;r++){if(t[r]!==\"length\"&&t[r]!==\"name\"){n=true;break}}wmSet(ie,e,n)}return n}function isWindowMethod(e,n){if(typeof n!==\"function\"||e===\"eval\")return false;if(typeof e===\"string\"&&re[e])return true;if(a(n,\"prototype\"))return false;if(a(J,e)&&J[e]===n)return false;return isNative(n)&&!hasStatics(n)}function boundToWindow(e){var n=wmGet(ne,e);if(!n){if(isNative(e)){n=i(z,e,[window])}else{n=function(){if(new.target!==undefined)return B(e,arguments,new.target===n?e:new.target);return i(e,window,arguments)}}wmSet(ne,e,n)}return n}var ae=o(null);var oe=o(null);var ue=[];var ce={};var se=o(null);(\"Object Function Array Number Boolean String Symbol BigInt Date RegExp \"+\"Error TypeError RangeError SyntaxError ReferenceError EvalError URIError \"+\"AggregateError Promise Proxy Reflect JSON Math Intl Atomics Map Set \"+\"WeakMap WeakSet WeakRef FinalizationRegistry ArrayBuffer SharedArrayBuffer \"+\"DataView Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array \"+\"Int32Array Uint32Array Float32Array Float64Array BigInt64Array \"+\"BigUint64Array NaN Infinity \"+\"XMLHttpRequest WebSocket EventSource MutationObserver \"+\"IntersectionObserver Worker Request Response Headers Image \"+\"Event CustomEvent\").split(\" \").forEach(function(e){se[e]=true});if(!l)(function(){for(var e=window;e;e=U(e)){var n=X(e);for(var t=0;t<n.length;t++){var r=n[t];if(typeof r!==\"string\"||r in ae||isOurKey(r))continue;var i;if(e===window&&r[0]>=\"A\"&&r[0]<=\"Z\"&&!se[r]){i=ce}else{i=bare(_(e,r));if(!i)continue}ae[r]=i;if(e===window){oe[r]=true;ue.push(r)}}}})();function builtinDescriptor(e){var n=ae[e];if(n!==ce)return n||null;n=bare(_(window,e));if(!n){delete ae[e];delete oe[e];return null}ae[e]=n;return n}function isLiveName(e){if(typeof e!==\"string\")return false;if(isIndex(e))return true;if(P&&e===\"addEventListener\")return true;var t=n.liveWindowNames;return!!(t&&t[e]===true)}function isIndex(e){if(!(e[0]>=\"0\"&&e[0]<=\"9\"))return false;return\"\"+(e>>>0)===e&&e!==\"4294967295\"}var fe=o(null);(\"opener event length frames parent self external clientInformation \"+\"innerWidth innerHeight outerWidth outerHeight screenX screenY \"+\"screenLeft screenTop scrollX scrollY pageXOffset pageYOffset \"+\"devicePixelRatio origin screen performance visualViewport \"+\"locationbar menubar personalbar scrollbars statusbar toolbar\").split(\" \").forEach(function(e){fe[e]=true});function isBuiltin(e){return e in ae&&(ae[e]!==ce||builtinDescriptor(e)!==null)}function isShown(e){return typeof e!==\"string\"||isBuiltin(e)||isLiveName(e)}function shownDescriptor(e){if(typeof e!==\"string\"||isLiveName(e))return windowDescriptor(e);return builtinDescriptor(e)}function isOurKey(e){return typeof e===\"string\"&&e[0]===\"_\"&&e[1]===\"_\"&&e[2]===\"s\"&&e[3]===\"m\"}function windowDescriptor(e){for(var n=window;n;n=U(n)){var t=bare(_(n,e));if(t)return t}return null}function isWindowAlias(e){return e===\"window\"||e===\"self\"||e===\"globalThis\"}function isSelfAlias(e){return e===\"top\"||e===\"parent\"||e===\"frames\"}function makeSandbox(e){var n=o(null);var t;var r=X(e);for(var u=0;u<r.length;u++){if(e[r[u]]===undefined)continue;Q(n,r[u],dataDesc(e[r[u]],true,false,true))}var c=o(null);function pageValue(e){var n;if(typeof e!==\"string\"||isLiveName(e)){n=window[e]}else{if(e in c)return c[e];var r=builtinDescriptor(e);if(!r)return undefined;if(!r.get&&!r.set&&\"value\"in r){n=r.value;if(n===window&&(isWindowAlias(e)||isSelfAlias(e)))n=t;else if(isWindowMethod(e,n))n=boundToWindow(n);c[e]=n;return n}n=r.get?i(r.get,window,[]):undefined}if(n===window&&(isWindowAlias(e)||isSelfAlias(e)))return t;if(isWindowMethod(e,n))return boundToWindow(n);return n}t=new T(n,{has:function(e,n){if(isOurKey(n))return n in window;if(n in e)return true;return isShown(n)&&(typeof n!==\"string\"||isLiveName(n)?n in window:true)},get:function(e,n){if(isOurKey(n))return window[n];if(a(e,n)){var r=V(e,n,t);if(typeof n===\"string\"&&re[n]&&typeof r===\"function\"){var i=_(e,n);if(i&&(i.configurable||i.writable))return boundToWindow(r)}return r}return pageValue(n)},set:function(e,n,r){if(isOurKey(n)){window[n]=r;return true}if(a(e,n))return K(e,n,r,t);var o=shownDescriptor(n);if(o&&o.set&&!(typeof n===\"string\"&&fe[n]===true)){i(o.set,window,[r]);return true}if(typeof n===\"string\"&&fe[n]===true){return H(e,n,dataDesc(r,true,true,true))}if(o&&(o.get||!o.writable))return false;return H(e,n,dataDesc(r,true,true,true))},defineProperty:function(e,n,t){if(isOurKey(n))return H(window,n,t);return H(e,n,t)},deleteProperty:function(e,n){if(isOurKey(n))return G(window,n);return G(e,n)},getOwnPropertyDescriptor:function(e,n){if(!isOurKey(n)&&a(e,n))return _(e,n);var t;if(isOurKey(n)||typeof n!==\"string\"||isLiveName(n)){t=_(window,n)}else if(oe[n]){t=bare(builtinDescriptor(n))||undefined}if(!t)return undefined;t.configurable=true;if(\"value\"in t)t.value=pageValue(n);return t},ownKeys:function(e){var n=o(null);var t=[];var add=function(e){if(typeof e===\"symbol\"){for(var r=0;r<t.length;r++)if(t[r]===e)return}else{if(n[e])return;n[e]=true}Q(t,t.length,dataDesc(e,true,true,true))};var r;for(r=0;r<ue.length;r++){if(oe[ue[r]])add(ue[r])}var i=X(window);for(r=0;r<i.length;r++){if(typeof i[r]===\"symbol\"||isLiveName(i[r]))add(i[r])}var a=X(e);for(r=0;r<a.length;r++)add(a[r]);return t},getPrototypeOf:function(){return U(window)},setPrototypeOf:function(){return false},preventExtensions:function(){return false}});var s=new T(o(null),{has:function(e,t){if(typeof t!==\"string\"||isOurKey(t))return false;if(a(n,t)||isWindowAlias(t))return true;if(!isSelfAlias(t)&&isBuiltin(t)||isLiveName(t))return true;return isSelfAlias(t)&&window[t]===window},get:function(e,n){if(n===$)return undefined;return t[n]},set:function(e,n,r){return K(t,n,r)}});wmSet(ee,t,s);return t}function scopeOf(e){return ee&&wmGet(ee,e)||e}function callAs(e,n){return i(e,n,[])}n.prelude={scripts:d,init:initScript,decisionTimeoutMs:R,send,sandbox:makeSandbox,scopeOf,callAs};if(!l){var announce=function(){try{if(p&&m)m(new p(\"sourcemonkey-main-ready\"))}catch(e){}};try{window.addEventListener(\"sourcemonkey-bridge-ready\",announce,true)}catch(e){}announce()}drainQueue(initScript)})();";
4
+ export const WRAPPER_BRIDGE = "(function(){\"use strict\";var e=\"__SM_KEY__\";var t=\"__SM_ONLY__\";var r=t===\"_\"+\"_SM_ONLY__\"?null:t;function ours(e){return r===null||typeof e!==\"string\"||e===r}function scriptOf(e){return e.type.indexOf(\"sm:gm-\")===0?e.scriptId:e.id}var n=\"sourcemonkey-reply-\"+e;var o=\"sourcemonkey-push-\"+e;var a=\"sourcemonkey-sync-\"+e;var i=\"sourcemonkey-bridge-ready\";var s=\"sourcemonkey-insert-\"+e;var m=\"sourcemonkey-main-ready\";var c=[\"sm:start\",\"sm:error\",\"sm:swapped\",\"sm:abandoned\",\"sm:check-pending\",\"sm:focus\",\"sm:gm-batch-write\",\"sm:gm-xhr-start\",\"sm:gm-xhr-abort\",\"sm:gm-tab-open\",\"sm:gm-tab-close\",\"sm:gm-notification-show\",\"sm:gm-menu-register\",\"sm:gm-menu-unregister\",\"sm:gm-download-start\",\"sm:gm-download-abort\",\"sm:gm-window-close\",\"sm:gm-window-focus\",\"sm:gm-tab-data\",\"sm:gm-resync\",\"sm:gm-log\",\"sm:gm-dom-blocked\",\"sm:gm-call\"];var u=[\"sm:gm-value-update\",\"sm:gm-values-stale\",\"sm:gm-xhr-event\",\"sm:gm-tab-closed\",\"sm:gm-notification-event\",\"sm:gm-menu-fire\",\"sm:gm-download-event\"];var f=[\"sm:gm-resync-hint\",\"sm:url-change\"];if(typeof chrome===\"undefined\"||!chrome.runtime||!chrome.runtime.sendMessage)return;var d=\"__smBridgeInstalled_\"+e;if(window[d])return;window[d]=true;function stamp(e){var t={};for(var r in e){if(r===\"__viaBridge\"||r===\"__proto__\")continue;if(Object.prototype.hasOwnProperty.call(e,r))t[r]=e[r]}t.__viaBridge=true;return t}function relay(e,t){if(!e||typeof e!==\"object\")return;if(c.indexOf(e.type)===-1)return;if(!ours(scriptOf(e)))return;if(typeof t!==\"string\"){var r=chrome.runtime.sendMessage(stamp(e));if(r&&typeof r.catch===\"function\")r.catch(function(){});return}var post=function(e){try{toPage(n,{requestId:t,reply:e||{bridgeError:\"SourceMonkey gave no answer\"}})}catch(e){}};var failed=function(e){post({bridgeError:\"Asking SourceMonkey failed: \"+(e&&e.message||String(e))})};try{var o=chrome.runtime.sendMessage(stamp(e));if(o&&typeof o.then===\"function\"){o.then(post,failed)}else{post(null)}}catch(e){failed(e)}}function toPage(e,t){document.dispatchEvent(new CustomEvent(e,{detail:JSON.stringify(t)}))}document.addEventListener(a,function(e){try{if(e&&typeof e.preventDefault===\"function\")e.preventDefault();if(!e||typeof e.detail!==\"string\")return;var t=JSON.parse(e.detail);if(!t||typeof t!==\"object\")return;relay(t.payload,t.requestId)}catch(e){}},true);var g=null;try{g=Node.prototype.appendChild}catch(e){}if(g)window.addEventListener(s,function(e){try{var t=e.relatedTarget;var r=e.composedPath()[0];if(!(t instanceof Element)||!(r instanceof Node))return;g.call(r,t);e.preventDefault();e.stopImmediatePropagation()}catch(e){}},true);var p=null;try{p=chrome.runtime.id}catch(e){}try{if(chrome.runtime.onMessage&&typeof chrome.runtime.onMessage.addListener===\"function\"){chrome.runtime.onMessage.addListener(function(e,t){try{if(!t||t.id!==p||t.tab)return;if(!e||typeof e!==\"object\")return;if(f.indexOf(e.type)===-1){if(u.indexOf(e.type)===-1)return;if(e.smWorld!==\"MAIN\")return;if(!ours(e.smScript))return}toPage(o,e)}catch(e){}})}}catch(e){}var y=false;try{window.addEventListener(m,function(){y=true},true)}catch(e){}try{window.dispatchEvent(new CustomEvent(i))}catch(e){}var SM_MAIN_IN_FRAMES=true;var l=SM_MAIN_IN_FRAMES||window===window.top;if(!y&&l){setTimeout(function(){if(y)return;try{var e=chrome.runtime.sendMessage({type:\"sm:main-blocked\"});if(e&&typeof e.catch===\"function\")e.catch(function(){})}catch(e){}},0)}})();";
5
+ export const WRAPPER_GM_RUNTIME = "(function(){\"use strict\";if(typeof window===\"undefined\")return;var e=\"__SM_KEY__\";var r=function(e){var r=document.__smGate;if(typeof r!==\"function\"){var t=Object.create(null),n=Object.create,a=Reflect.apply,o=Promise;var i=console.info.bind(console);var rs=function(e){return new o(function(r){r(e)})};var rj=function(e){return new o(function(r,t){t(e)})};r=function(e){if(typeof e!==\"string\")return void 0;var r=t[e];if(!r){r=n(null);r.apply=a;r.resolve=rs;r.reject=rj;r.info=i;t[e]=r}return r};var u=n(null);u.value=r;Object.defineProperty(document,\"__smGate\",u)}return r(e)}(e);if(r.gm)return;var t=Promise;var n=Error;var a=Date.now.bind(Date);var o=Number.prototype.toString;var i=Math.random;var u=JSON.stringify;var l=Object.keys;var c=Array.isArray;var s=Object.prototype.toString;var f=Date;var d=Date.prototype.getTime;var y=RegExp;var p=typeof Map===\"function\"?Map:null;var v=p?Map.prototype.forEach:null;var h=typeof Set===\"function\"?Set:null;var g=h?Set.prototype.forEach:null;var m=typeof BigInt===\"function\"?BigInt:null;var b=typeof Uint8Array===\"function\"?Uint8Array:null;var w=typeof DataView===\"function\"?DataView:null;var S=String.fromCharCode;var k=typeof btoa===\"function\"?btoa:null;var M=typeof atob===\"function\"?atob:null;var C=typeof ReadableStream===\"function\"?ReadableStream:null;var T=typeof DOMException===\"function\"?DOMException:n;var x=Object.getPrototypeOf;var E=null;var q=null;var B=null;var I=null;var R=null;var A=null;(function(){function getter(e,r){var t=Object.getOwnPropertyDescriptor(e,r);return t&&typeof t.get===\"function\"?t.get:null}try{E=getter(RegExp.prototype,\"source\");q=getter(RegExp.prototype,\"flags\")}catch(e){}try{B=getter(ArrayBuffer.prototype,\"byteLength\");I=getter(DataView.prototype,\"byteLength\");R=getter(x(Uint8Array.prototype),\"length\");A=x(Uint8Array.prototype).subarray}catch(e){}})();var O={};var U={};(function(){var e;var r=[\"Int8Array\",\"Uint8Array\",\"Uint8ClampedArray\",\"Int16Array\",\"Uint16Array\",\"Int32Array\",\"Uint32Array\",\"Float16Array\",\"Float32Array\",\"Float64Array\",\"BigInt64Array\",\"BigUint64Array\"];for(e=0;e<r.length;e++){try{if(typeof window[r[e]]===\"function\")O[r[e]]=window[r[e]]}catch(e){}}var t=[\"Error\",\"EvalError\",\"RangeError\",\"ReferenceError\",\"SyntaxError\",\"TypeError\",\"URIError\"];for(e=0;e<t.length;e++){try{if(typeof window[t[e]]===\"function\")U[t[e]]=window[t[e]]}catch(e){}}})();var j=Object.create;var L=Object.defineProperty;var N=Reflect.apply;var _=setTimeout;var D=clearTimeout;var P=queueMicrotask;var X=Object.getOwnPropertyDescriptor;var G=Object.prototype.hasOwnProperty;var F=null;var V=null;var K=null;try{F=document.createElement.bind(document);V=Node.prototype.appendChild;K=Element.prototype.setAttribute}catch(e){}var W=null;try{if(typeof navigator!==\"undefined\"&&navigator.clipboard&&typeof navigator.clipboard.writeText===\"function\"){W=navigator.clipboard.writeText.bind(navigator.clipboard)}}catch(e){}var H=typeof Blob===\"function\"?Blob:null;var J=null;try{if(typeof URL!==\"undefined\"&&typeof URL.createObjectURL===\"function\"){J=URL.createObjectURL.bind(URL)}}catch(e){}var z=null;try{z=chrome.runtime.id}catch(e){}var Q=null;try{if(typeof z===\"string\"&&typeof chrome.runtime.sendMessage===\"function\"){Q=chrome.runtime.sendMessage.bind(chrome.runtime)}}catch(e){}var Y=\"sourcemonkey-reply-\"+e;var $=\"sourcemonkey-push-\"+e;var Z=\"sourcemonkey-sync-\"+e;var ee=\"sourcemonkey-insert-\"+e;var re=3e4;var te=null;var ne=1;var ae=[];function dispatchPush(e){for(var r=0;r<ae.length;r++){try{ae[r](e)}catch(e){}}}var oe=JSON.parse;var ie=null;try{ie=Object.getOwnPropertyDescriptor(CustomEvent.prototype,\"detail\").get}catch(e){}function bare(e){if(!e||typeof e!==\"object\")return e;var r=j(null);var t=l(e);for(var n=0;n<t.length;n++)r[t[n]]=e[t[n]];return r}function detailOf(e){return bare(oe(N(ie,e,[])))}function installBridgeListener(){var e=j(null);try{document.addEventListener($,function(e){try{var r=detailOf(e);if(r&&typeof r===\"object\")P(function(){dispatchPush(r)})}catch(e){}},true);document.addEventListener(Y,function(r){try{var t=detailOf(r);if(!t||typeof t.requestId!==\"string\")return;P(function(){var r=e[t.requestId];if(!r)return;delete e[t.requestId];try{D(r.timer)}catch(e){}r.resolve(bare(t.reply))})}catch(e){}},true)}catch(e){return}te=e}if(!Q)installBridgeListener();var ue=null;var le=null;try{ue=CustomEvent}catch(e){}try{if(document&&typeof document.dispatchEvent===\"function\"){le=document.dispatchEvent.bind(document)}}catch(e){}function bridgeDispatch(e,r){if(!ue||!le){throw new n(\"[SourceMonkey] GM bridge unavailable\")}var t;try{var a=j(null);a.requestId=r;a.payload=e;t=u(a)}catch(e){throw new n(\"[SourceMonkey] This call carries a value SourceMonkey cannot send. \"+\"Pass data that survives JSON: no circular references, functions, or BigInt\")}if(!dispatchToBridge(t))holdForBridge(t,r)}var ce=\"sourcemonkey-bridge-ready\";var se=[];var fe=false;function dispatchToBridge(e){var r=j(null);r.detail=e;r.cancelable=true;return!le(new ue(Z,r))}function holdForBridge(e,r){setOwnBare(se,se.length,{detail:e,requestId:r});if(fe)return;fe=true;try{window.addEventListener(ce,resendHeld,true)}catch(e){}}function dropHeld(e){var r=[];for(var t=0;t<se.length;t++){if(se[t].requestId!==e)setOwnBare(r,r.length,se[t])}se=r}function resendHeld(){var e=se;se=[];for(var r=0;r<e.length;r++){try{if(!dispatchToBridge(e[r].detail))setOwnBare(se,se.length,e[r])}catch(e){}}}function bridgeSend(e){if(!te){return t.reject(new n(\"[SourceMonkey] GM bridge unavailable\"))}var r=\"gm-\"+ne+++\"-\"+randomPart();return new t(function(t,a){var o=_(function(){delete te[r];dropHeld(r);a(new n(\"[SourceMonkey] GM bridge timed out after \"+re+\"ms\"))},re);te[r]={resolve:t,timer:o};try{bridgeDispatch(e,r)}catch(e){delete te[r];try{D(o)}catch(e){}a(e)}})}function transportSendNow(e){if(Q){var r=Q(e);if(r&&typeof r.catch===\"function\")r.catch(function(){});return}try{bridgeDispatch(e)}catch(e){}}var de=t.prototype.then;function guarded(e){setOwnBare(e,\"then\",guardedThen);setOwnBare(e,\"catch\",guardedCatch);setOwnBare(e,\"constructor\",undefined);return e}function setOwnBare(e,r,t){var n=j(null);n.value=t;n.writable=true;n.enumerable=false;n.configurable=true;L(e,r,n)}function guardedThen(e,r){return guarded(N(de,this,[e,r]))}function guardedCatch(e){return guarded(N(de,this,[undefined,e]))}function transportSend(e){if(Q){try{var r=Q(e);if(r&&typeof r.then===\"function\")return r;return t.resolve(r)}catch(e){return t.reject(e)}}return guarded(bridgeSend(e))}function onPush(e){ae.push(e)}if(Q){try{if(chrome.runtime.onMessage&&typeof chrome.runtime.onMessage.addListener===\"function\"){chrome.runtime.onMessage.addListener(function(e,r){if(!r||r.id!==z||r.tab)return;if(!e||typeof e!==\"object\")return;dispatchPush(e)})}}catch(e){}}var ye=j(null);var pe={};var ve=\"__smv__\";var he=1;var ge={};var me={};var be=32768;function bytesToBase64(e){var r=\"\";var t=N(R,e,[]);for(var n=0;n<t;n+=be){var a=N(A,e,[n,n+be]);var o=j(null);o.value=N(R,a,[]);L(a,\"length\",o);r+=N(S,null,a)}return k(r)}function base64ToBytes(e){var r=M(e);var t=new b(r.length);for(var n=0;n<r.length;n++)t[n]=r.charCodeAt(n);return t}var we=!!(k&&M&&b&&B&&I&&R);function encodeBranded(e,r,t){var n=N(s,e,[]);if(n===\"[object Date]\"){t.plain=false;var a=N(d,e,[]);return[\"d\",a===a?a:\"nan\"]}if(n===\"[object RegExp]\"&&E&&q){var o=N(E,e,[]);var i=N(q,e,[]);t.plain=false;return[\"re\",String(o),String(i)]}if(we&&n===\"[object ArrayBuffer]\"){N(B,e,[]);t.plain=false;return[\"ab\",bytesToBase64(new b(e))]}if(we&&n===\"[object DataView]\"){N(I,e,[]);t.plain=false;return[\"dv\",bytesToBase64(new b(e.buffer,e.byteOffset,e.byteLength))]}if(we){var u=n.slice(8,n.length-1);if(N(G,O,[u])){N(R,e,[]);t.plain=false;return[\"ta\",u,bytesToBase64(new b(e.buffer,e.byteOffset,e.byteLength))]}}if(n===\"[object Error]\"&&x(e)!==Object.prototype){t.plain=false;var c=[];var f=l(e);for(var y=0;y<f.length;y++){var m=encodeNode(e[f[y]],r,t);if(m!==ge)c.push([f[y],m])}return[\"err\",String(e.name),String(e.message),e.stack===undefined?null:String(e.stack),c]}if(p&&n===\"[object Map]\"){t.plain=false;var w=[];N(v,e,[function(e,n){var a=encodeNode(n,r,t);var o=encodeNode(e,r,t);w.push([a===ge?[\"u\"]:a,o===ge?[\"u\"]:o])}]);return[\"m\",w]}if(h&&n===\"[object Set]\"){t.plain=false;var S=[];N(g,e,[function(e){var n=encodeNode(e,r,t);S.push(n===ge?[\"u\"]:n)}]);return[\"s\",S]}return me}function encodeNode(e,r,t){var a=typeof e;if(e===null)return[\"p\",null];if(a===\"string\"||a===\"boolean\")return[\"p\",e];if(a===\"number\"){if(e!==e){t.plain=false;return[\"nan\"]}if(e===Infinity){t.plain=false;return[\"inf\"]}if(e===-Infinity){t.plain=false;return[\"-inf\"]}if(e===0&&1/e===-Infinity){t.plain=false;return[\"-0\"]}return[\"p\",e]}if(a===\"undefined\"){t.plain=false;return[\"u\"]}if(a===\"bigint\"){t.plain=false;return[\"big\",String(e)]}if(a===\"function\"||a===\"symbol\")return ge;if(a!==\"object\")return ge;for(var o=0;o<r.length;o++){if(r[o]===e){throw new n(\"[SourceMonkey] GM_setValue: a stored value cannot contain a circular reference\")}}r.push(e);try{if(c(e)){var i=[];for(var u=0;u<e.length;u++){var s=encodeNode(e[u],r,t);i.push(s===ge?[\"p\",null]:s)}return[\"a\",i]}var f=t.plain;var d;try{d=encodeBranded(e,r,t)}catch(e){d=me}if(d!==me)return d;t.plain=f;var y=e.toJSON;if(typeof y===\"function\"){var p=encodeNode(y.call(e),r,t);return p===ge?[\"u\"]:p}var v=l(e);var h=[];for(var g=0;g<v.length;g++){var m=encodeNode(e[v[g]],r,t);if(m===ge)continue;if(v[g]===ve)t.plain=false;h.push([v[g],m])}return[\"o\",h]}finally{r.pop()}}function encodeValue(e){var r={plain:true};var t=encodeNode(e,[],r);if(t===ge){r.plain=false;t=[\"u\"]}if(r.plain)return e;var n={};n[ve]=he;n.v=t;return n}function setDecoded(e,r,t){if(r===\"__proto__\"){L(e,r,{value:t,writable:true,enumerable:true,configurable:true})}else{e[r]=t}}function decodeNode(e){if(!c(e))return undefined;var r;switch(e[0]){case\"p\":return e[1];case\"u\":return undefined;case\"nan\":return NaN;case\"inf\":return Infinity;case\"-inf\":return-Infinity;case\"-0\":return-0;case\"big\":return m?m(e[1]):e[1];case\"d\":return new f(typeof e[1]===\"number\"?e[1]:NaN);case\"re\":return new y(e[1],e[2]);case\"ab\":return base64ToBytes(e[1]).buffer;case\"dv\":return new w(base64ToBytes(e[1]).buffer);case\"ta\":{var t=base64ToBytes(e[2]);if(!N(G,O,[e[1]]))return t;return new O[e[1]](t.buffer)}case\"err\":{var a=N(G,U,[e[1]])?U[e[1]]:n;var o=new a(e[2]);if(o.name!==e[1])o.name=e[1];if(e[3]!==null&&e[3]!==undefined){try{o.stack=e[3]}catch(e){}}var i=e[4];if(c(i)){for(r=0;r<i.length;r++)setDecoded(o,i[r][0],decodeNode(i[r][1]))}return o}case\"a\":{var u=[];for(r=0;r<e[1].length;r++)u.push(decodeNode(e[1][r]));return u}case\"o\":{var l={};for(r=0;r<e[1].length;r++)setDecoded(l,e[1][r][0],decodeNode(e[1][r][1]));return l}case\"m\":{var s=new p;for(r=0;r<e[1].length;r++)s.set(decodeNode(e[1][r][0]),decodeNode(e[1][r][1]));return s}case\"s\":{var d=new h;for(r=0;r<e[1].length;r++)d.add(decodeNode(e[1][r]));return d}default:return undefined}}function decodeValue(e){if(!e||typeof e!==\"object\"||c(e))return e;if(!N(G,e,[ve]))return e;if(e[ve]!==he)return e;try{return decodeNode(e.v)}catch(r){try{console.info(\"[SourceMonkey] stored value could not be decoded:\",r)}catch(e){}return e}}function ensureStore(e){var r=ye[e];if(r)return r;r={cache:{},pending:[],sendQueued:false,ready:false,listeners:null,nextListenerId:1,resyncInFlight:false,resyncAgain:false,lastResyncAt:0,seqByKey:j(null),snapSeq:0,unanswered:j(null),held:j(null)};ye[e]=r;return r}function knownSeq(e,r){return N(G,e.seqByKey,[r])?e.seqByKey[r]:e.snapSeq}function pinKnownSeq(e,r){if(!N(G,e.seqByKey,[r]))e.seqByKey[r]=e.snapSeq}function adoptSnapshotSeq(e,r){var t=l(e.seqByKey);for(var n=0;n<t.length;n++){var a=t[n];if(!hasUnanswered(e,a)&&e.seqByKey[a]<=r)delete e.seqByKey[a]}if(r>e.snapSeq)e.snapSeq=r}function hasUnanswered(e,r){return N(G,e.unanswered,[r])&&e.unanswered[r]>0}function fireListeners(e,r,t,n,a){var o=ye[e];if(!o||!o.listeners)return;var i=l(o.listeners);for(var u=0;u<i.length;u++){var c=o.listeners[i[u]];if(!c||c.key!==r)continue;try{c.callback(r,t,n,a)}catch(e){reportCallbackError(e)}}}function scheduleFlush(e){var r=ye[e];if(!r||r.sendQueued)return;r.sendQueued=true;var run=function(){flushStore(e,\"task\")};if(P)P(run);else t.resolve().then(run)}function flushStore(e,r){var t=ye[e];if(!t)return;t.sendQueued=false;if(t.pending.length===0)return;var n=t.pending;t.pending=[];var a=[];for(var o=0;o<n.length;o++){var i=n[o];if(i.value===pe){a.push({key:i.key,deleted:true})}else{a.push({key:i.key,value:i.value})}}var u=false;var answer=function(r){if(u)return;u=true;settleBatch(e,n,r)};try{var l={type:\"sm:gm-batch-write\",scriptId:e,writes:a};if(r===\"pagehide\"){transportSendNow(l);answer(null);return}var c=transportSend(l);if(c&&typeof c.then===\"function\"){c.then(function(r){if(r&&r.ok===true&&typeof r.seq===\"number\"){answer(r.seq);return}try{console.info(\"[SourceMonkey] storage flush not confirmed\",e,r&&r.error)}catch(e){}answer(null)},function(r){try{console.info(\"[SourceMonkey] storage flush rejected\",e,r&&r.message)}catch(e){}answer(null)})}else{answer(null)}}catch(r){try{console.info(\"[SourceMonkey] storage flush threw\",e,r&&r.message)}catch(e){}answer(null)}}function settleBatch(e,r,t){var n=ye[e];if(!n)return;var a=[];for(var o=0;o<r.length;o++){var i=r[o].key;if(hasUnanswered(n,i))n.unanswered[i]--;if(t!==null&&t>knownSeq(n,i))n.seqByKey[i]=t;a.push(i)}for(var u=0;u<a.length;u++){var l=a[u];if(hasUnanswered(n,l)||!N(G,n.held,[l]))continue;var c=n.held[l];delete n.held[l];applyRemoteWrite(e,n,c.write,c.seq)}}function flushAll(e){var r=l(ye);for(var t=0;t<r.length;t++){if(ye[r[t]].pending.length)flushStore(r[t],e)}}try{window.addEventListener(\"pagehide\",function(){flushAll(\"pagehide\")},{capture:true});window.addEventListener(\"visibilitychange\",function(){if(!document)return;if(document.visibilityState===\"hidden\")flushAll(\"task\");else resyncListeningStores()},{capture:true})}catch(e){}function applyRemoteUpdate(e,r,t){if(!r||!r.length||typeof t!==\"number\")return;var n=ye[e];if(!n||!n.ready)return;for(var a=0;a<r.length;a++)applyRemoteWrite(e,n,r[a],t)}function applyRemoteWrite(e,r,t,n){var a=t.key;if(hasUnanswered(r,a)){var o=r.held[a];if(!o||o.seq<=n)r.held[a]={write:t,seq:n};return}var i=N(G,r.seqByKey,[a]);if(i?n<r.seqByKey[a]:n<=r.snapSeq)return;r.seqByKey[a]=n;var u=N(G,r.cache,[a])?r.cache[a]:undefined;if(t.deleted){if(!N(G,r.cache,[a]))return;delete r.cache[a];fireListeners(e,a,u,undefined,true)}else{var l=decodeValue(t.value);r.cache[a]=l;fireListeners(e,a,u,l,true)}}var Se=5e3;function hasValueListeners(e){return!!(e&&e.listeners&&l(e.listeners).length>0)}function sameStoredValue(e,r){if(e===r)return true;if(e===null||r===null)return false;if(typeof e!==\"object\"||typeof r!==\"object\")return false;try{return u(e)===u(r)}catch(e){return false}}function applyResyncSnapshot(e,r,t){var n=ye[e];if(!n||!n.ready||!r||typeof t!==\"number\")return;var stale=function(e){if(hasUnanswered(n,e)){pinKnownSeq(n,e);return true}return knownSeq(n,e)>t};var a=j(null);var o=l(r);for(var i=0;i<o.length;i++){var u=o[i];a[u]=true;if(stale(u))continue;var c=N(G,n.cache,[u]);var s=c?n.cache[u]:undefined;var f=false;var d=null;if(c){try{d=encodeValue(s);f=true}catch(e){}}if(f&&sameStoredValue(d,r[u]))continue;var y=decodeValue(r[u]);n.cache[u]=y;fireListeners(e,u,s,y,true)}var p=l(n.cache);for(var v=0;v<p.length;v++){var h=p[v];if(a[h]||stale(h))continue;var g=n.cache[h];delete n.cache[h];fireListeners(e,h,g,undefined,true)}adoptSnapshotSeq(n,t)}function requestResync(e,r){var t=ye[e];if(!t||!t.ready)return;if(t.resyncInFlight){if(r)t.resyncAgain=true;return}var n=a();if(!r&&t.lastResyncAt&&n-t.lastResyncAt<Se)return;t.lastResyncAt=n;t.resyncInFlight=true;var done=function(){t.resyncInFlight=false;if(t.resyncAgain){t.resyncAgain=false;requestResync(e,true)}};transportSend({type:\"sm:gm-resync\",scriptId:e}).then(function(r){if(r&&r.ok&&r.values)applyResyncSnapshot(e,r.values,r.seq);done()},done)}function resyncListeningStores(){var e=l(ye);for(var r=0;r<e.length;r++){if(hasValueListeners(ye[e[r]]))requestResync(e[r])}}try{window.addEventListener(\"pageshow\",function(e){if(!e||!e.persisted)return;var r=l(ye);for(var t=0;t<r.length;t++)requestResync(r[t],true)},{capture:true})}catch(e){}onPush(function(e){if(e.type===\"sm:gm-resync-hint\"){resyncListeningStores();return}if(e.type===\"sm:gm-values-stale\"){if(typeof e.scriptId===\"string\")requestResync(e.scriptId,true);return}if(e.type!==\"sm:gm-value-update\")return;if(typeof e.scriptId!==\"string\")return;if(!e.writes||typeof e.writes.length!==\"number\")return;applyRemoteUpdate(e.scriptId,e.writes,e.seq)});var ke={init:function(e,r,t){var n=ensureStore(e);var a=typeof t===\"number\"?t:0;var o=j(null);var i=l(r||{});for(var u=0;u<i.length;u++)o[i[u]]=decodeValue(r[i[u]]);if(n.ready){var keep=function(e){if(hasUnanswered(n,e)){pinKnownSeq(n,e);return true}return knownSeq(n,e)>a};var c=l(n.cache);for(var s=0;s<c.length;s++){var f=c[s];if(keep(f))o[f]=n.cache[f]}for(var d=0;d<i.length;d++){var y=i[d];if(N(G,n.cache,[y]))continue;if(keep(y))delete o[y]}}n.cache=o;adoptSnapshotSeq(n,a);n.ready=true},get:function(e,r,t){var n=ye[e];if(!n||!n.ready)return t;if(N(G,n.cache,[r]))return n.cache[r];return t},set:function(e,r,t){var n=ensureStore(e);var a=encodeValue(t);var o=N(G,n.cache,[r])?n.cache[r]:undefined;n.cache[r]=t;n.unanswered[r]=(hasUnanswered(n,r)?n.unanswered[r]:0)+1;n.pending.push({key:r,value:a});scheduleFlush(e);fireListeners(e,r,o,t,false)},del:function(e,r){var t=ensureStore(e);var n=N(G,t.cache,[r])?t.cache[r]:undefined;delete t.cache[r];t.unanswered[r]=(hasUnanswered(t,r)?t.unanswered[r]:0)+1;t.pending.push({key:r,value:pe});scheduleFlush(e);fireListeners(e,r,n,undefined,false)},list:function(e){var r=ye[e];if(!r||!r.ready)return[];return l(r.cache)},addValueChangeListener:function(e,r,t){if(typeof t!==\"function\"){throw new n(\"[SourceMonkey] GM_addValueChangeListener: callback must be a function\")}var a=ensureStore(e);if(!a.listeners)a.listeners=j(null);var o=String(a.nextListenerId++);a.listeners[o]={key:String(r),callback:t};return o},encodeValue,decodeValue,removeValueChangeListener:function(e,r){var t=ye[e];if(!t||!t.listeners)return;var n=String(r);if(N(G,t.listeners,[n]))delete t.listeners[n]}};function defaultParent(){return document.head||document.documentElement}function defaultParentFor(e){var r=String(e).toUpperCase();if(r===\"SCRIPT\"||r===\"STYLE\"||r===\"LINK\"||r===\"META\"||r===\"TITLE\"||r===\"BASE\"){return document.head||document.documentElement}return document.body||document.head||document.documentElement}function applyAttr(e,r,t){if(t===false)return;var n=t===true?\"\":String(t);if(K){N(K,e,[r,n])}else{e.setAttribute(r,n)}}var Me=null;var Ce=null;var Te=null;var xe=null;var Ee=null;var qe=null;var Be=null;var Ie=null;try{Me=MouseEvent;Ce=EventTarget.prototype.dispatchEvent;Te=Node.prototype.getRootNode;xe=X(Node.prototype,\"parentNode\").get;Ee=X(Node.prototype,\"ownerDocument\").get;qe=X(ShadowRoot.prototype,\"host\").get;Be=X(ShadowRoot.prototype,\"mode\").get;Ie=ShadowRoot}catch(e){}function inClosedShadowRoot(e){for(var r=0;r<64;r++){var t=N(Te,e,[]);if(!(t instanceof Ie))return false;if(N(Be,t,[])===\"closed\")return true;e=N(qe,t,[])}return true}function insertViaBridge(e,r){if(Q||!Me||!Ce||!Be)return\"no-bridge\";try{if(inClosedShadowRoot(e))return\"closed-shadow-root\";var t=j(null);t.relatedTarget=r;t.cancelable=true;t.composed=true;var n=new Me(ee,t);var a=N(Ce,e,[n])===false&&N(xe,r,[])===e;if(a)return null;return(N(Ee,e,[])||e)===document?\"no-bridge\":\"other-document\"}catch(e){return\"no-bridge\"}}function insertNode(e,r){var t=insertViaBridge(e,r);if(t===null)return null;if(V)N(V,e,[r]);else e.appendChild(r);return t}var Re=j(null);function reportBlockedStyle(e,r,t){if(Re[e])return;Re[e]=true;var n=t===\"closed-shadow-root\"?\"SourceMonkey can't exempt a style added inside a closed shadow root.\":t===\"other-document\"?\"SourceMonkey can't exempt a style added to another frame's document.\":\"SourceMonkey couldn't exempt it: its isolated-world helper wasn't loaded in this document yet.\";var a=\"The page's Content Security Policy blocked the style \"+r+\" added, so its rules don't apply. \"+n+\" Add @inject-into content to run\"+\" the script isolated from the page, where all its styles are exempt.\";try{console.info(\"[SourceMonkey:\"+e+\"] \"+a)}catch(e){}transportSend({type:\"sm:gm-dom-blocked\",scriptId:e,api:r,why:t}).catch(function(){})}function styleWasBlocked(e){try{if(e.type&&!/^text\\/css$/i.test(e.type))return false;return e.isConnected===true&&e.sheet===null}catch(e){return false}}var Ae={addStyle:function(e,r){var t=F?F(\"style\"):document.createElement(\"style\");t.textContent=String(r==null?\"\":r);var n=defaultParent();if(n){var a=insertNode(n,t);if(a!==null&&styleWasBlocked(t))reportBlockedStyle(e,\"GM_addStyle\",a)}return t},addElement:function(e,r,t,a){var o,i,u;if(r&&typeof r===\"object\"&&typeof r.nodeType===\"number\"){o=r;i=t;u=a}else{o=null;i=r;u=t}if(i==null||typeof i===\"string\"&&i.trim()===\"\"){throw new n(\"[SourceMonkey] GM_addElement: tag name is required\")}if(!o)o=defaultParentFor(i);var c=F?F(String(i)):document.createElement(String(i));if(u&&typeof u===\"object\"){var s=l(u);for(var f=0;f<s.length;f++){var d=s[f];if(d===\"textContent\"){c.textContent=String(u[d]==null?\"\":u[d])}else{try{applyAttr(c,d,u[d])}catch(e){}}}}if(o){var y=insertNode(o,c);if(y!==null&&String(i).toUpperCase()===\"STYLE\"&&styleWasBlocked(c)){reportBlockedStyle(e,\"GM_addElement\",y)}}return c}};var Oe=j(null);function ensureResourceBox(e){var r=Oe[e];if(r)return r;r={byName:j(null),textCache:j(null),urlCache:j(null)};Oe[e]=r;return r}function _resDecodeBase64(e){var r=atob(e);var t=r.length;var n=new Uint8Array(t);for(var a=0;a<t;a++)n[a]=r.charCodeAt(a);return n}var Ue={init:function(e,r){var t=ensureResourceBox(e);t.byName=j(null);t.textCache=j(null);t.urlCache=j(null);if(!r||typeof r!==\"object\")return;var n=l(r);for(var a=0;a<n.length;a++){var o=n[a];var i=r[o];if(i&&typeof i===\"object\"){t.byName[o]={b64:String(i.b64||\"\"),ct:String(i.ct||\"\")}}}},getText:function(e,r){var t=Oe[e];if(!t)return undefined;var n=String(r);if(N(G,t.textCache,[n]))return t.textCache[n];if(!N(G,t.byName,[n]))return undefined;var a=_resDecodeBase64(t.byName[n].b64);var o;try{o=new TextDecoder(\"utf-8\",{fatal:false}).decode(a)}catch(e){o=\"\"}t.textCache[n]=o;return o},getUrl:function(e,r){var t=Oe[e];if(!t)return undefined;var n=String(r);if(N(G,t.urlCache,[n]))return t.urlCache[n];if(!N(G,t.byName,[n]))return undefined;if(!H||!J)return undefined;var a=t.byName[n];var o=_resDecodeBase64(a.b64);var i=a.ct||\"application/octet-stream\";var u;try{u=new H([o],{type:i})}catch(e){return undefined}var l;try{l=J(u)}catch(e){return undefined}t.urlCache[n]=l;return l}};var je=j(null);var Le=1;var Ne=typeof TextDecoder===\"function\"?TextDecoder:null;var _e=Ne?Ne.prototype.decode:null;var De=b&&typeof b.fromBase64===\"function\"?b.fromBase64:null;var Pe=String.prototype.charCodeAt;var Xe=String.prototype.indexOf;var Ge=Symbol.iterator;var Fe=typeof DOMParser===\"function\"?DOMParser:null;var Ve=Fe?Fe.prototype.parseFromString:null;var Ke=typeof URL===\"function\"?URL:null;var We=null;var He=null;var Je=null;var ze=null;var Qe=null;var Ye=null;var $e=null;var Ze=null;var er=String.prototype.toLowerCase;var rr=String.prototype.slice;var tr=String.prototype.trim;var nr=String;var ar=null;var or=null;var ir=typeof FileReader===\"function\"?FileReader:null;var ur=null;var lr=null;var cr=null;var sr=null;var fr=null;var dr=typeof ArrayBuffer===\"function\"?ArrayBuffer.isView:null;var yr=null;var pr=null;var vr=null;(function(){function getter(e,r){var t=X(e,r);return t&&typeof t.get===\"function\"?t.get:null}try{var e=x(b.prototype);We=e.set;He=getter(e,\"buffer\");Je=getter(e,\"byteLength\")}catch(e){}try{ar=getter(Blob.prototype,\"size\");or=getter(Blob.prototype,\"type\");ur=FileReader.prototype.readAsArrayBuffer;lr=getter(FileReader.prototype,\"result\");cr=getter(FileReader.prototype,\"error\");sr=EventTarget.prototype.addEventListener;fr=getter(File.prototype,\"name\")}catch(e){}try{yr=FormData.prototype.entries;pr=x(N(yr,new FormData,[])).next}catch(e){}try{vr=URLSearchParams.prototype.toString}catch(e){}try{ze=getter(Ke.prototype,\"href\")}catch(e){}try{Qe=getter(Node.prototype,\"baseURI\")}catch(e){}try{var r=ReadableStreamDefaultController.prototype;Ye=r.enqueue;$e=r.close;Ze=r.error}catch(e){}})();function setOwn(e,r,t){var n=j(null);n.value=t;n.writable=true;n.enumerable=true;n.configurable=true;L(e,r,n)}function plainCopy(e){var r={};var t=l(e);for(var n=0;n<t.length;n++)setOwn(r,t[n],e[t[n]]);return r}function ownIterable(e){setOwn(e,Ge,function(){var r=0;return{next:function(){return r<e.length?{value:e[r++],done:false}:{value:undefined,done:true}}}});return e}function randomPart(){return N(o,i()*4294967296>>>0,[36])}function decodeBase64(e){if(De)return N(De,b,[e]);var r=M(e);var t=r.length;var n=new b(t);for(var a=0;a<t;a++)n[a]=N(Pe,r,[a]);return n}function charsetOf(e){if(typeof e!==\"string\")return\"\";var r=N(er,e,[]);var t=N(Xe,r,[\"charset=\"]);if(t<0)return\"\";var n=N(rr,r,[t+8]);var a=N(Xe,n,[\";\"]);if(a>=0)n=N(rr,n,[0,a]);n=N(tr,n,[]);if(n.length>1&&(n[0]==='\"'||n[0]===\"'\"))n=N(rr,n,[1,-1]);return n}function responseDecoder(e,r){var t=e.responseType===\"json\"?\"\":charsetOf(e.overrideMimeType)||charsetOf(r);if(t){try{return new Ne(t)}catch(e){}}return new Ne}function responseMime(e,r){return typeof e.overrideMimeType===\"string\"&&e.overrideMimeType?e.overrideMimeType:r||\"\"}function encodeRequestBody(e,r,t){if(e===undefined||e===null)return t(bare({}));if(typeof e===\"string\"){if(!r)return t(bare({data:e}));var n=new b(e.length);for(var a=0;a<e.length;a++)n[a]=N(Pe,e,[a])&255;return t(bare({body:bare({kind:\"bytes\",data:bytesToBase64(n),type:\"\"})}))}if(typeof e!==\"object\")return t(bare({data:nr(e)}));var o=null;try{o=N(yr,e,[])}catch(e){}if(o){var i=[];for(;;){var u=N(pr,o,[]);if(u.done)break;setOwn(i,i.length,u.value)}var l=jsonArray();var next=function(e){if(e===i.length)return t(bare({body:bare({kind:\"form\",entries:l})}));var r=nr(i[e][0]);var n=i[e][1];if(typeof n===\"string\"){setOwn(l,l.length,bare({name:r,value:n}));return next(e+1)}readBlob(n,function(a){if(typeof a!==\"string\")return t(a);setOwn(l,l.length,bare({name:r,data:a,filename:N(fr,n,[]),type:N(or,n,[])}));next(e+1)})};return next(0)}try{return t(bare({body:bare({kind:\"params\",data:N(vr,e,[])})}))}catch(e){}var c=false;try{N(ar,e,[]);c=true}catch(e){}var s=false;try{N(B,e,[]);s=true}catch(e){}if(c||s||dr&&dr(e)){var f=c?e:new H(ownIterable([e]));var d=c?N(or,e,[]):\"\";return readBlob(f,function(e){if(typeof e!==\"string\")return t(e);t(bare({body:bare({kind:\"bytes\",data:e,type:d})}))})}t(bare({data:nr(e)}))}function jsonArray(){var e=[];var r=j(null);r.value=undefined;L(e,\"toJSON\",r);return e}function readBlob(e,r){var t;try{t=new ir;var a=j(null);a.once=true;N(sr,t,[\"loadend\",function(){var e=N(lr,t,[]);if(!e){var a=N(cr,t,[]);return r(new n(nr(a&&a.message||\"The body could not be read\")))}try{r(bytesToBase64(new b(e)))}catch(e){r(e)}},a]);N(ur,t,[e])}catch(e){r(e instanceof n?e:new n(nr(e)))}}var hr=typeof reportError===\"function\"?reportError:null;function reportCallbackError(e){if(!(e instanceof n)){try{console.info(\"[SourceMonkey] A callback threw:\",e)}catch(e){}return}if(hr){try{N(hr,self,[e]);return}catch(e){}}_(function(){throw e},0)}function isTextResponseType(e){return e!==\"blob\"&&e!==\"arraybuffer\"&&e!==\"stream\"}function xhrBodyStream(e,r){var t=j(null);t.start=function(e){r.streamController=e};t.cancel=function(){r.streamController=null;if(je[e]===r)abortRequest(e)};return new C(t)}function xhrState(e){var r=e.head;return{readyState:e.readyState,status:r?r.status:0,statusText:r?r.statusText:\"\",finalUrl:r?r.finalUrl:e.url,responseHeaders:r?r.responseHeaders:\"\",responseText:e.text,response:e.stream?e.stream:e.text!==\"\"&&(e.responseType===\"\"||e.responseType===\"text\")?e.text:null,context:e.context}}function setReadyState(e,r){e.readyState=r;callXhrCallback(e.onreadystatechange,xhrState(e))}function xhrStarted(e){if(e.readyState>0)return;e.readyState=1;callXhrCallback(e.onloadstart,xhrState(e))}function streamXhrEvent(e,r){var t=je[e];if(!t)return;armXhrTtl(e,t);var live=function(){return je[e]===t};xhrStarted(t);if(!live())return;if(r.kind===\"headers\"){t.head=r;t.total=typeof r.total===\"number\"?r.total:null;if(t.decodes)t.decoder=responseDecoder(t,r.mimeType);setReadyState(t,2);return}if(t.decodes&&!t.decoder)t.decoder=responseDecoder(t,\"\");var n=decodeBase64(r.data);try{if(t.decoder)t.text+=N(_e,t.decoder,[n,{stream:true}]);else if(t.stream){if(t.streamController)N(Ye,t.streamController,[n])}else setOwn(t.pieces,t.pieces.length,n)}catch(r){failXhrBody(e,r);return}t.loaded=r.loaded;if(t.readyState<3)setReadyState(t,3);if(!live())return;var a=xhrState(t);setOwn(a,\"lengthComputable\",t.total!==null);setOwn(a,\"loaded\",t.loaded);setOwn(a,\"total\",t.total!==null?t.total:0);callXhrCallback(t.onprogress,a)}function failXhrBody(e,r){stopXhrInWorker(e);dispatchXhrEvent(e,{kind:\"error\",message:tooLargeMessage(r)})}function tooLargeMessage(e){return\"[SourceMonkey] GM_xmlhttpRequest: The response is too large for the page to hold (\"+String(e&&e.message||e)+\"). For a large file, use responseType 'blob' or 'stream'\"}function stopXhrInWorker(e){try{Kr.sendAsync({type:\"sm:gm-xhr-abort\",id:e}).catch(function(){})}catch(e){}}function finishXhrBody(e,r){var t=e.responseType;var n=responseMime(e,r.responseMimeType);if(e.stream){setOwn(r,\"responseText\",\"\");setOwn(r,\"response\",e.stream);if(e.streamController){try{N($e,e.streamController,[])}catch(e){}}return}if(!e.decodes){setOwn(r,\"responseText\",\"\");if(t===\"blob\"){var a=j(null);a.type=n;setOwn(r,\"response\",new H(ownIterable(e.pieces),a))}else{var o=0;for(var i=0;i<e.pieces.length;i++)o+=N(Je,e.pieces[i],[]);var u=new b(o);var l=0;for(var c=0;c<e.pieces.length;c++){N(We,u,[e.pieces[c],l]);l+=N(Je,e.pieces[c],[])}setOwn(r,\"response\",N(He,u,[]))}e.pieces=[];return}var s=e.text+(e.decoder?N(_e,e.decoder,[]):\"\");setOwn(r,\"responseText\",s);var f;if(t===\"json\"){try{f=oe(s)}catch(e){f=null}}else if(t===\"document\"){var d=N(Xe,n,[\"xml\"])!==-1?\"application/xml\":\"text/html\";try{f=N(Ve,new Fe,[s,d])}catch(e){f=null}}else{f=s}setOwn(r,\"response\",f)}function dispatchXhrEvent(e,r){var t=je[e];if(!t)return;delete je[e];settleXhr(t,r,false)}function abortRequest(e){var r=je[e];if(!r)return;delete je[e];stopXhrInWorker(e);if(r.ttlTimer){try{D(r.ttlTimer)}catch(e){}r.ttlTimer=null}_(function(){settleXhr(r,bare({kind:\"abort\"}),true)},0)}function settleXhr(e,r,t){if(e.ttlTimer){try{D(e.ttlTimer)}catch(e){}}e.readyState=4;var a;var o=r.kind;if(o===\"load\"&&r.response&&typeof r.response===\"object\"){try{a=plainCopy(bare(r.response));finishXhrBody(e,a);setOwn(a,\"readyState\",4);setOwn(a,\"context\",e.context)}catch(r){o=\"error\";a=emptyXhrResponse(e);setOwn(a,\"error\",tooLargeMessage(r))}}else{a=emptyXhrResponse(e);if(o===\"error\")setOwn(a,\"error\",r.message);if(e.stream){setOwn(a,\"response\",e.stream);if(e.streamController){var i=o===\"error\"?new n(r.message||\"[SourceMonkey] GM_xmlhttpRequest: The request failed\"):new T(o===\"timeout\"?\"[SourceMonkey] GM_xmlhttpRequest: The request timed out\":\"[SourceMonkey] GM_xmlhttpRequest: The request was aborted\",o===\"timeout\"?\"TimeoutError\":\"AbortError\");try{N(Ze,e.streamController,[i])}catch(e){}e.streamController=null}}}var u;if(o===\"load\")u=e.onload;else if(o===\"error\")u=e.onerror;else if(o===\"timeout\")u=e.ontimeout;else if(o===\"abort\")u=e.onabort;if(!t)callXhrCallback(e.onreadystatechange,a);callXhrCallback(u,a);callXhrCallback(e.onloadend,a);if(e.settle)e.settle(o===\"load\",a)}function emptyXhrResponse(e){return{readyState:4,status:0,statusText:\"\",responseText:\"\",response:null,responseHeaders:\"\",finalUrl:e.head?e.head.finalUrl:e.url,context:e.context}}function callXhrCallback(e,r){if(typeof e!==\"function\")return;try{e(r)}catch(e){reportCallbackError(e)}}var gr=5*60*1e3;function armXhrTtl(e,r){if(r.ttlTimer){try{D(r.ttlTimer)}catch(e){}}r.ttlTimer=_(function(){stopXhrInWorker(e);dispatchXhrEvent(e,{kind:\"error\",message:\"[SourceMonkey] GM_xmlhttpRequest: No message from SourceMonkey for \"+gr/6e4+\" minutes, so the page stopped waiting for this request\"})},gr)}onPush(function(e){if(e.type!==\"sm:gm-xhr-event\")return;if(typeof e.id!==\"string\"||!e.event||typeof e.event!==\"object\")return;var r=bare(e.event);if(r.kind===\"headers\"||r.kind===\"progress\")streamXhrEvent(e.id,r);else dispatchXhrEvent(e.id,r)});function urlArg(e){if(e===null||typeof e!==\"object\")return e;try{return N(ze,e,[])}catch(e){}return typeof e.href===\"string\"&&!(\"url\"in e)?e.href:e}var mr={start:function(e,r,a){if(!r||typeof r!==\"object\"){var o=new n(\"[SourceMonkey] GM_xmlhttpRequest: details object required\");if(a)return guarded(new t(function(e,r){r(o)}));throw o}r=bare(r);var i=null;var u=null;if(a){u=guarded(new t(function(e,r){i=function(t,n){if(!t)return r(n);setOwnBare(n,\"then\",undefined);e(n)}}))}var l=u||{};var c=urlArg(r.url);if(typeof c!==\"string\"||!c){var s=new n(\"[SourceMonkey] GM_xmlhttpRequest: url required\");if(typeof r.onerror!==\"function\"&&!u)throw s;callXhrCallback(r.onerror,s);if(i)i(false,s);setOwn(l,\"abort\",function(){});return l}c=resolvePageUrl(c);var f=\"xhr-\"+Le+++\"-\"+randomPart();var d=typeof r.responseType===\"string\"?r.responseType:\"\";var y={onloadstart:r.onloadstart,onprogress:r.onprogress,onreadystatechange:r.onreadystatechange,onload:r.onload,onerror:r.onerror,ontimeout:r.ontimeout,onabort:r.onabort,onloadend:r.onloadend,url:c,responseType:d,overrideMimeType:r.overrideMimeType,context:r.context,settle:i,ttlTimer:null,readyState:0,head:null,total:null,loaded:0,decodes:isTextResponseType(d),decoder:null,text:\"\",pieces:[],stream:null,streamController:null};if(d===\"stream\"&&C)y.stream=xhrBodyStream(f,y);je[f]=y;armXhrTtl(f,y);var p=j(null);p.method=typeof r.method===\"string\"?r.method:\"GET\";p.url=c;p.headers=plainHeaders(r.headers);p.timeout=typeof r.timeout===\"number\"?r.timeout:undefined;p.responseType=typeof r.responseType===\"string\"?r.responseType:undefined;p.anonymous=r.anonymous?true:undefined;p.nocache=r.nocache?true:undefined;p.revalidate=r.revalidate?true:undefined;p.redirect=typeof r.redirect===\"string\"?r.redirect:undefined;var send=function(r){if(je[f]!==y)return;if(r instanceof n){xhrStarted(y);dispatchXhrEvent(f,{kind:\"error\",message:\"[SourceMonkey] GM_xmlhttpRequest: Could not read the request body: \"+nr(r.message||r)});return}p.data=r.data;p.body=r.body;var t=j(null);t.type=\"sm:gm-xhr-start\";t.id=f;t.scriptId=e;t.request=p;Kr.sendAsync(t).then(function(e){if(e&&e.ok===true){var r=je[f];if(r)xhrStarted(r);return}var t=je[f];if(t)xhrStarted(t);var n=e&&e.error||\"SourceMonkey did not accept the request\";dispatchXhrEvent(f,{kind:\"error\",message:\"[SourceMonkey] GM_xmlhttpRequest: \"+n})},function(e){var r=je[f];if(r)xhrStarted(r);dispatchXhrEvent(f,{kind:\"error\",message:String(e&&e.message||e)})})};try{encodeRequestBody(r.data,!!r.binary,send)}catch(e){send(e instanceof n?e:new n(nr(e)))}setOwn(l,\"abort\",function(){abortRequest(f)});return l}};var br=null;try{if(typeof console!==\"undefined\"&&typeof console.log===\"function\"){br=console.log.bind(console)}}catch(e){}var _renderArg=function(e){if(e===null)return\"null\";if(e===undefined)return\"undefined\";var r=typeof e;if(r===\"string\")return e;if(r===\"number\"||r===\"boolean\"||r===\"bigint\")return String(e);if(r===\"function\")return\"[Function: \"+(e.name||\"anonymous\")+\"]\";if(e instanceof Error){var t=\"\";try{t=e.stack?\"\\n\"+e.stack:\"\"}catch(e){}return String(e.message||e)+t}try{return JSON.stringify(e)}catch(e){}try{return String(e)}catch(e){return\"[unserializable]\"}};var _renderArgs=function(e){var r=[];for(var t=0;t<e.length;t++)r.push(_renderArg(e[t]));return r.join(\" \")};var wr={write:function(e,r){if(br){var t=[\"[SourceMonkey:\"+e+\"]\"];for(var n=0;n<r.length;n++)t.push(r[n]);try{N(br,null,t)}catch(e){}}try{var a=_renderArgs(r);var o=transportSend({type:\"sm:gm-log\",scriptId:e,message:a});if(o&&typeof o.catch===\"function\")o.catch(function(){})}catch(e){}}};var Sr=j(null);var kr=1;var Mr={open:function(e,r,t){r=urlArg(r);if(typeof r!==\"string\"||!r){throw new n(\"[SourceMonkey] GM_openInTab: url required\")}var a=true;var o=false;if(typeof t===\"boolean\"){a=!t}else if(t&&typeof t===\"object\"){if(typeof t.active===\"boolean\")a=t.active;else if(typeof t.loadInBackground===\"boolean\")a=!t.loadInBackground;if(typeof t.insert===\"boolean\")o=t.insert}var i=\"tab-\"+kr+++\"-\"+Math.random().toString(36).slice(2,10);var u={closed:false,onclose:null,tabId:null};Sr[i]=u;var l={get closed(){return u.closed},set onclose(e){u.onclose=typeof e===\"function\"?e:null},get onclose(){return u.onclose},close:function(){if(u.closed)return;Kr.sendAsync({type:\"sm:gm-tab-close\",requestId:i}).catch(function(){})}};Kr.sendAsync({type:\"sm:gm-tab-open\",scriptId:e,requestId:i,url:r,active:a,insert:o}).then(function(e){if(e&&e.ok&&typeof e.tabId===\"number\"){u.tabId=e.tabId}else{var r=e&&e.error||\"SourceMonkey did not accept the request\";try{console.info(\"[SourceMonkey] GM_openInTab failed:\",r)}catch(e){}dispatchTabClose(i)}},function(e){try{console.info(\"[SourceMonkey] GM_openInTab send failed:\",e&&e.message||e)}catch(e){}dispatchTabClose(i)});return l}};function dispatchTabClose(e){var r=Sr[e];if(!r||r.closed)return;r.closed=true;delete Sr[e];var t=r.onclose;if(typeof t===\"function\"){try{t()}catch(e){reportCallbackError(e)}}}function tabDataCall(e,r,t){var a=Kr.sendAsync(r).then(function(r){if(r&&r.ok)return r.value;throw new n(\"[SourceMonkey] \"+e+\": \"+(r&&r.error||\"SourceMonkey sent no reply\"))});a.then(function(r){if(typeof t!==\"function\")return;try{t(r)}catch(r){try{console.info(\"[SourceMonkey] \"+e+\" callback threw:\",r)}catch(e){}}},function(r){var t=r&&r.message||String(r);if(t.indexOf(\"[SourceMonkey]\")!==0)t=\"[SourceMonkey] \"+e+\": \"+t;try{console.info(t)}catch(e){}});return typeof t===\"function\"?undefined:a}var Cr={get:function(e,r){return tabDataCall(\"GM_getTab\",{type:\"sm:gm-tab-data\",scriptId:e,action:\"get\"},r)},save:function(e,r,t){var n=r;if(r!=null&&typeof r===\"object\"){n={};var a=l(r);for(var o=0;o<a.length;o++)n[a[o]]=r[a[o]]}return tabDataCall(\"GM_saveTab\",{type:\"sm:gm-tab-data\",scriptId:e,action:\"save\",data:n},t)},list:function(e,r){return tabDataCall(\"GM_getTabs\",{type:\"sm:gm-tab-data\",scriptId:e,action:\"list\"},r)}};var Tr=j(null);var xr=1;var Er={show:function(e,r){var a=null;var o=null;var i=null;if(r[0]&&typeof r[0]===\"object\"){var u=r[0];a={text:u.text!=null?String(u.text):\"\",title:u.title!=null?String(u.title):\"\",image:u.image!=null?String(u.image):\"\",timeout:typeof u.timeout===\"number\"?u.timeout:0,silent:!!u.silent,tag:u.tag!=null?String(u.tag):\"\"};if(typeof u.onclick===\"function\")o=u.onclick;if(typeof u.ondone===\"function\")i=u.ondone;if(typeof r[1]===\"function\")i=r[1]}else{a={text:r[0]!=null?String(r[0]):\"\",title:r[1]!=null?String(r[1]):\"\",image:r[2]!=null?String(r[2]):\"\",timeout:0,silent:false,tag:\"\"};if(typeof r[3]===\"function\")o=r[3]}if(!a.text){return t.reject(new n(\"[SourceMonkey] GM_notification: `text` is required\"))}var l=\"notif-\"+xr+++\"-\"+Math.random().toString(36).slice(2,10);Tr[l]={onclick:o,ondone:i};return Kr.sendAsync({type:\"sm:gm-notification-show\",scriptId:e,requestId:l,details:a}).then(function(e){if(!e||!e.ok){delete Tr[l];throw new n(\"[SourceMonkey] GM_notification: \"+(e&&e.error||\"show failed\"))}return e.notificationId},function(e){delete Tr[l];throw e})}};function dispatchNotificationEvent(e,r){var t=Tr[e];if(!t)return;if(r===\"clicked\"){var n=t.onclick;if(typeof n===\"function\"){try{n()}catch(e){reportCallbackError(e)}}}else if(r===\"closed\"){delete Tr[e];var a=t.ondone;if(typeof a===\"function\"){try{a()}catch(e){reportCallbackError(e)}}}}var qr=j(null);var Br=1;var Ir=250;function normalizeDownloadArgs(e,r){var t=null;e=urlArg(e);if(typeof e===\"string\"){t={url:e,name:r}}else if(e&&typeof e===\"object\"){t=e}else{throw new n(\"[SourceMonkey] GM_download: details object or url required\")}var a=urlArg(t.url);if(typeof a!==\"string\"||!a){throw new n(\"[SourceMonkey] GM_download: url required\")}return{url:resolvePageUrl(a),name:t.name!=null?String(t.name):\"\",headers:plainHeaders(t.headers),saveAs:!!t.saveAs,timeout:typeof t.timeout===\"number\"?t.timeout:0,onload:typeof t.onload===\"function\"?t.onload:null,onerror:typeof t.onerror===\"function\"?t.onerror:null,ontimeout:typeof t.ontimeout===\"function\"?t.ontimeout:null,onprogress:typeof t.onprogress===\"function\"?t.onprogress:null,onabort:typeof t.onabort===\"function\"?t.onabort:null}}function resolvePageUrl(e){try{var r=Qe&&N(Qe,document,[])||location.href;return N(ze,new Ke(e,r),[])}catch(r){return e}}function plainHeaders(e){if(!e||typeof e!==\"object\")return undefined;var r=null;var t=l(e);for(var n=0;n<t.length;n++){var a=e[t[n]];if(c(a)){var o=\"\";for(var i=0;i<a.length;i++){var u=a[i];if(u!==null&&(typeof u===\"object\"||typeof u===\"function\"||typeof u===\"symbol\")){o=null;break}o+=(i?\",\":\"\")+(u===undefined||u===null?\"\":u)}if(o===null)continue;a=o}if(a===undefined||typeof a===\"function\"||typeof a===\"symbol\"||a!==null&&typeof a===\"object\")continue;if(!r)r=j(null);r[t[n]]=\"\"+a}return r||undefined}function isInPageDownloadUrl(e){var r=\"\";try{r=new URL(e).protocol}catch(e){return false}return r===\"blob:\"||r===\"data:\"}function downloadViaAnchor(e,r){try{var t=F?F(\"a\"):document.createElement(\"a\");t.href=e;t.download=r||\"\";t.style.display=\"none\";var n=document.body||document.documentElement;if(!n)return\"no document to append the download anchor to\";if(V)N(V,n,[t]);else n.appendChild(t);try{t.click()}finally{try{n.removeChild(t)}catch(e){}}return null}catch(e){return String(e&&e.message||e)}}var Rr={start:function(e,r,t){var n=normalizeDownloadArgs(r,t);var a=\"dl-\"+Br+++\"-\"+Math.random().toString(36).slice(2,10);var o=isInPageDownloadUrl(n.url);qr[a]={onload:n.onload,onerror:n.onerror,ontimeout:n.ontimeout,onprogress:n.onprogress,onabort:n.onabort,transport:o?\"page\":\"sw\"};if(o){var i=downloadViaAnchor(n.url,n.name);if(i!==null){_(function(){dispatchDownloadEvent(a,{kind:\"error\",error:\"not_succeeded\",details:{message:i}})},0)}else{_(function(){dispatchDownloadEvent(a,{kind:\"load\",downloadId:-1,filename:n.name,finalUrl:n.url,totalBytes:0})},Ir)}}else{Kr.sendAsync({type:\"sm:gm-download-start\",scriptId:e,requestId:a,url:n.url,name:n.name,headers:n.headers,saveAs:n.saveAs,timeout:n.timeout,wantsProgress:!!n.onprogress}).then(function(e){if(e&&e.ok===true)return;dispatchDownloadEvent(a,{kind:\"error\",error:\"not_supported\",details:{message:e&&e.error||\"SourceMonkey did not accept the request\"}})},function(e){dispatchDownloadEvent(a,{kind:\"error\",error:\"not_supported\",details:{message:String(e&&e.message||e)}})})}return{abort:function(){var e=qr[a];if(!e)return;if(e.transport===\"sw\"){Kr.sendAsync({type:\"sm:gm-download-abort\",requestId:a}).catch(function(){})}dispatchDownloadEvent(a,{kind:\"error\",error:\"download_canceled\",details:{current:\"USER_CANCELED\"}})}}}};function dispatchDownloadEvent(e,r){var t=qr[e];if(!t)return;if(r.kind===\"progress\"){if(typeof t.onprogress!==\"function\")return;try{t.onprogress({lengthComputable:!!r.lengthComputable,loaded:r.loaded,total:r.total})}catch(e){reportCallbackError(e)}return}delete qr[e];var n=null;var a=null;if(r.kind===\"load\"){n=t.onload;a={downloadId:r.downloadId,filename:r.filename,finalUrl:r.finalUrl,totalBytes:r.totalBytes}}else if(r.kind===\"timeout\"){n=t.ontimeout;a={}}else if(r.kind===\"error\"){a={error:r.error,details:r.details||{}};n=r.error===\"download_canceled\"&&typeof t.onabort===\"function\"?t.onabort:t.onerror}if(typeof n!==\"function\")return;try{n(a)}catch(e){reportCallbackError(e)}}var Ar=j(null);var Or=1;function ensureMenuScript(e){var r=Ar[e];if(r)return r;r=j(null);Ar[e]=r;return r}var Ur={register:function(e,r,t,a){if(typeof t!==\"function\"){throw new n(\"[SourceMonkey] GM_registerMenuCommand: callback must be a function\")}var o;if(a&&typeof a===\"object\"&&a.id!=null){o=String(a.id)}else{o=\"mc-\"+Or+++\"-\"+Math.random().toString(36).slice(2,10)}ensureMenuScript(e)[o]=t;var i=String(r==null?\"\":r);Kr.sendAsync({type:\"sm:gm-menu-register\",scriptId:e,commandId:o,name:i}).catch(function(e){try{console.info(\"[SourceMonkey] GM_registerMenuCommand send failed:\",e&&e.message||e)}catch(e){}});return o},unregister:function(e,r){var t=String(r);var n=Ar[e];if(n&&N(G,n,[t]))delete n[t];Kr.sendAsync({type:\"sm:gm-menu-unregister\",scriptId:e,commandId:t}).catch(function(e){try{console.info(\"[SourceMonkey] GM_unregisterMenuCommand send failed:\",e&&e.message||e)}catch(e){}})}};function retireMenuCommands(e){var r=Ar[e];if(!r)return;var t=l(r);for(var n=0;n<t.length;n++)Ur.unregister(e,t[n])}function dispatchMenuFire(e,r){var t=Ar[e];if(!t)return;var n=t[r];if(typeof n!==\"function\")return;try{n()}catch(e){reportCallbackError(e)}}var jr=false;var Lr=false;var Nr=[];var _r=null;var Dr=null;var Pr=null;var Xr=null;function addUrlChangeHandler(e){if(typeof e!==\"function\")return;if(Nr.indexOf(e)!==-1)return;Nr.push(e)}function removeUrlChangeHandler(e){var r=Nr.indexOf(e);if(r!==-1)Nr.splice(r,1)}function makeUrlChangeInfo(e){var r=j(null);r.url=e;return r}function dispatchUrlChange(e){if(Nr.length===0)return;var r=Nr.slice();var t=makeUrlChangeInfo(e);for(var n=0;n<r.length;n++){var a=r[n];try{a(t)}catch(e){reportCallbackError(e)}}}function noteUrlChanged(e){if(!jr)return;if(typeof e!==\"string\"||e===\"\")return;dispatchUrlChange(e)}function isUrlChangeType(e){return e===\"urlchange\"}function ensureUrlChangeProperty(){if(N(G,window,[\"onurlchange\"]))return;try{L(window,\"onurlchange\",{get:function(){return _r},set:function(e){_r=e===undefined?null:e;if(typeof e===\"function\"){if(!Dr){Dr=function(e){if(typeof _r===\"function\")_r(e)}}addUrlChangeHandler(Dr)}else if(e!==null&&e!==undefined){try{console.info(\"[SourceMonkey] window.onurlchange must be a function; ignoring\",typeof e)}catch(e){}}},configurable:true,enumerable:true})}catch(e){}}function ensureUrlChangePatch(){if(Lr)return true;var e=null;var r=null;try{e=window.addEventListener;r=window.removeEventListener;window.addEventListener=function(e,r){if(isUrlChangeType(e)){addUrlChangeHandler(r);return undefined}return N(Pr,this==null?window:this,arguments)};window.removeEventListener=function(e,r){if(isUrlChangeType(e)){removeUrlChangeHandler(r);return undefined}return N(Xr,this==null?window:this,arguments)};Pr=e;Xr=r;Lr=true;return true}catch(t){try{window.addEventListener=e}catch(e){}try{window.removeEventListener=r}catch(e){}return false}}function installUrlChange(){if(!ensureUrlChangePatch())return;jr=true;ensureUrlChangeProperty();if(!r.liveWindowNames){var e=j(null);e.onurlchange=true;e.addEventListener=true;e.removeEventListener=true;r.liveWindowNames=e}}var Gr={enable:function(e){installUrlChange()}};var Fr=j(null);function isTopFrame(){try{return window.top===window.self}catch(e){return false}}function makeWindowControl(e,r){if(r!==\"close\"&&r!==\"focus\")return undefined;if(r===\"close\"&&!isTopFrame())return undefined;var t=r===\"close\"?\"sm:gm-window-close\":\"sm:gm-window-focus\";return function(){try{var n=Kr.sendAsync({type:t,scriptId:e});if(n&&typeof n.then===\"function\"){n.then(function(e){if(e&&e.ok)return;var t=e&&e.error?e.error:\"SourceMonkey sent no reply\";try{console.info(\"[SourceMonkey] window.\"+r+\":\",t)}catch(e){}},function(e){try{console.info(\"[SourceMonkey] window.\"+r+\" send failed:\",e&&e.message||e)}catch(e){}})}}catch(e){try{console.info(\"[SourceMonkey] window.\"+r+\" failed:\",e)}catch(e){}}return undefined}}function installWindowControl(e,r){if(Fr[r])return;var t=makeWindowControl(e,r);if(!t)return;try{L(window,r,{value:t,writable:true,configurable:true,enumerable:true});Fr[r]=true}catch(e){try{window[r]=t;Fr[r]=true}catch(e){}}}var Vr={enable:function(e,r){if(r!==\"close\"&&r!==\"focus\")return;installWindowControl(e,r)},make:makeWindowControl};onPush(function(e){if(e.type===\"sm:gm-tab-closed\"&&typeof e.requestId===\"string\"){dispatchTabClose(e.requestId)}else if(e.type===\"sm:gm-notification-event\"&&typeof e.requestId===\"string\"&&typeof e.event===\"string\"){dispatchNotificationEvent(e.requestId,e.event)}else if(e.type===\"sm:gm-menu-fire\"&&typeof e.scriptId===\"string\"&&typeof e.commandId===\"string\"){dispatchMenuFire(e.scriptId,e.commandId)}else if(e.type===\"sm:gm-download-event\"&&typeof e.requestId===\"string\"&&e.event){dispatchDownloadEvent(e.requestId,e.event)}else if(e.type===\"sm:url-change\"&&typeof e.url===\"string\"){noteUrlChanged(e.url)}});var Kr={sendAsync:function(e){return transportSend(e)},storage:ke,dom:Ae,resource:Ue,xhr:mr,log:wr,tab:Mr,tabData:Cr,notification:Er,download:Rr,menu:Ur,retireRun:function(e){retireMenuCommands(e);var r=ye[e];if(r)r.listeners=null},urlchange:Gr,windowControl:Vr,clipboard:{write:function(e){if(!W){return t.reject(new n(\"[SourceMonkey] navigator.clipboard.writeText unavailable\"))}try{return W(String(e==null?\"\":e))}catch(e){return t.reject(e)}}}};try{Object.defineProperty(r,\"gm\",{value:Kr,enumerable:true})}catch(e){r.gm=Kr}})();";
@@ -0,0 +1,12 @@
1
+ export declare const GITHUB_AUTH_TOKEN_KEY = "githubAuthToken";
2
+ export declare function getGithubAuthToken(): string;
3
+ export declare function _setGithubAuthTokenForTests(value: string): void;
4
+ export declare function loadGithubAuthToken(): Promise<void>;
5
+ export declare function ensureGithubAuthTokenLoaded(): Promise<void>;
6
+ export declare function setGithubAuthToken(token: string): void;
7
+ export declare function installGithubAuthListener(): void;
8
+ export declare function isGithubAuthUrl(url: string): boolean;
9
+ export declare function githubAuthHeaders(url: string): Record<string, string>;
10
+ export declare function isGithubAuthInUse(url: string): boolean;
11
+ export declare function isGithubAuthInUseForCollection(collectionPath: string): boolean;
12
+ export declare function githubTokenLogSuffix(url: string): string;
@@ -0,0 +1,148 @@
1
+ // GitHub personal access token storage + helper for attaching the
2
+ // `Authorization: Bearer <token>` header onto requests that target a
3
+ // GitHub host (so we can fetch private repos and lift the
4
+ // unauthenticated 60/hour rate limit to 5000/hour).
5
+ //
6
+ // Mirrors `debug-log.ts`'s shape: one chrome.storage.local key, a
7
+ // cached in-memory copy, a `load…` for boot-time hydration, and an
8
+ // `install…Listener` for live updates without an SW restart.
9
+ //
10
+ // Hosts we attach the header to:
11
+ // - api.github.com (Contents API, repo metadata)
12
+ // - raw.githubusercontent.com (raw bytes for blob URLs we rewrite to)
13
+ // Any other URL passes through untouched. Sending the header to
14
+ // non-GitHub hosts would leak the token, so the gate is strict.
15
+ //
16
+ // Notable omission: `github.com/<o>/<r>/raw/<ref>/<path>` (the "Raw"
17
+ // button URL). GitHub serves a 302 to raw.githubusercontent.com on
18
+ // that route, and the Fetch spec strips the `Authorization` header
19
+ // on cross-origin redirects — so the auth header would never reach
20
+ // raw, and the github.com hop itself doesn't honour our PAT for the
21
+ // bytes either. `normalizeGithubInput` rewrites `/blob/` and bare-
22
+ // repo URLs to the raw form at add time; users with a `/raw/` URL
23
+ // in hand can paste either the `/blob/` form (auto-rewritten) or the
24
+ // `raw.githubusercontent.com` form directly.
25
+ export const GITHUB_AUTH_TOKEN_KEY = 'githubAuthToken';
26
+ let cachedToken = '';
27
+ export function getGithubAuthToken() {
28
+ return cachedToken;
29
+ }
30
+ // Test/debug hook. Production callers should toggle the storage key
31
+ // instead so the change persists and is observed via onChanged.
32
+ export function _setGithubAuthTokenForTests(value) {
33
+ cachedToken = value;
34
+ }
35
+ export async function loadGithubAuthToken() {
36
+ try {
37
+ const got = await chrome.storage.local.get(GITHUB_AUTH_TOKEN_KEY);
38
+ const raw = got[GITHUB_AUTH_TOKEN_KEY];
39
+ cachedToken = typeof raw === 'string' ? raw : '';
40
+ }
41
+ catch {
42
+ cachedToken = '';
43
+ }
44
+ }
45
+ // The load, memoized. A service worker that woke up to answer a fetch
46
+ // request has a startup read in flight; a caller that needs the token
47
+ // to be *there* awaits this instead of racing it. Subsequent changes
48
+ // arrive through the onChanged listener below, so one load is enough.
49
+ let loadOnce = null;
50
+ export function ensureGithubAuthTokenLoaded() {
51
+ if (!loadOnce)
52
+ loadOnce = loadGithubAuthToken();
53
+ return loadOnce;
54
+ }
55
+ // The worker's `writeSetting` publishes the token at once, so a refresh
56
+ // it runs next doesn't wait for the change event.
57
+ export function setGithubAuthToken(token) {
58
+ cachedToken = token;
59
+ }
60
+ export function installGithubAuthListener() {
61
+ chrome.storage.onChanged.addListener((changes, areaName) => {
62
+ if (areaName !== 'local')
63
+ return;
64
+ const change = changes[GITHUB_AUTH_TOKEN_KEY];
65
+ if (!change)
66
+ return;
67
+ cachedToken = typeof change.newValue === 'string' ? change.newValue : '';
68
+ });
69
+ }
70
+ // True if the URL targets a GitHub-controlled host we'd want to
71
+ // authenticate against. Pure function — exported for unit tests.
72
+ export function isGithubAuthUrl(url) {
73
+ let parsed;
74
+ try {
75
+ parsed = new URL(url);
76
+ }
77
+ catch {
78
+ return false;
79
+ }
80
+ const host = parsed.hostname.toLowerCase();
81
+ if (host === 'api.github.com')
82
+ return true;
83
+ if (host === 'raw.githubusercontent.com')
84
+ return true;
85
+ // `github.com` itself is intentionally NOT in the gate — the only
86
+ // bytes-serving route on that host (`/<o>/<r>/raw/...`) 302s to
87
+ // raw.githubusercontent.com, and the Fetch spec strips
88
+ // `Authorization` on cross-origin redirects. See the module header.
89
+ return false;
90
+ }
91
+ // Return the `Authorization` header (and the `X-GitHub-Api-Version`
92
+ // pinning header) for a GitHub URL when a token is set; an empty
93
+ // object otherwise. Safe to spread into a `headers` object that may
94
+ // already carry an `Accept`. Callers should ALWAYS go through this
95
+ // helper rather than reading `cachedToken` directly so the host gate
96
+ // can't be accidentally skipped.
97
+ export function githubAuthHeaders(url) {
98
+ if (!cachedToken)
99
+ return {};
100
+ if (!isGithubAuthUrl(url))
101
+ return {};
102
+ return {
103
+ Authorization: `Bearer ${cachedToken}`,
104
+ // Pin the REST API version. Optional for the endpoints we hit
105
+ // today, but cheap insurance against a future shape change.
106
+ 'X-GitHub-Api-Version': '2022-11-28',
107
+ };
108
+ }
109
+ // True when a request to this URL would actually carry the GitHub
110
+ // auth header (URL is GitHub-eligible AND a token is configured).
111
+ // Same predicate `githubAuthHeaders` uses; exposed so log/UI callers
112
+ // can mirror its decision without re-running the header build.
113
+ export function isGithubAuthInUse(url) {
114
+ if (!cachedToken)
115
+ return false;
116
+ return isGithubAuthUrl(url);
117
+ }
118
+ // True when a *collection URL* (the stored collectionPath, not a
119
+ // per-fetch URL) describes content SourceMonkey reaches through GitHub
120
+ // — covers the github-dir case where `collectionPath` is a
121
+ // `github.com/<o>/<r>/tree/...` page URL but the actual scan + per-
122
+ // script fetches go to api.github.com + raw.githubusercontent.com.
123
+ // Returns true iff a token is configured AND the collection URL is
124
+ // recognisably GitHub. Used by the collection-refresh log line.
125
+ export function isGithubAuthInUseForCollection(collectionPath) {
126
+ if (!cachedToken)
127
+ return false;
128
+ if (isGithubAuthUrl(collectionPath))
129
+ return true;
130
+ // github.com page URLs (`/blob/`, `/tree/`, bare repo) aren't
131
+ // fetched directly — but a github-dir collection resolves to authed
132
+ // api.github.com + raw.githubusercontent.com calls. Recognise the
133
+ // github.com host so those collections get the suffix too.
134
+ try {
135
+ const host = new URL(collectionPath).hostname.toLowerCase();
136
+ return host === 'github.com';
137
+ }
138
+ catch {
139
+ return false;
140
+ }
141
+ }
142
+ // Log-line suffix used by the updater so the SW console makes it
143
+ // obvious when a collection refresh / per-script check is going out
144
+ // authenticated. Empty string when no token would apply, so callers
145
+ // can unconditionally `${label}${githubTokenLogSuffix(url)}`.
146
+ export function githubTokenLogSuffix(url) {
147
+ return isGithubAuthInUseForCollection(url) ? ' (with GitHub token)' : '';
148
+ }
@@ -0,0 +1 @@
1
+ export declare function githubRawToBlobUrl(rawUrl: string): string | null;
@@ -0,0 +1,46 @@
1
+ // A GitHub raw URL's page on github.com. Its own module so code that
2
+ // only shows links (match-targets.ts) needn't load the GitHub provider.
3
+ // Reverse of `githubFileUrlToRaw` (github-provider.ts): take a
4
+ // raw-content GitHub URL and return its
5
+ // `github.com/<o>/<r>/blob/<ref>/<path>` counterpart — the
6
+ // page a human would open in a browser. Used wherever the UI surfaces
7
+ // a github URL for clicking (collections-page bubble, viewer Location
8
+ // row): the raw URL is what we fetch from, but the blob URL is what
9
+ // the user wants to see.
10
+ //
11
+ // "Raw" here covers both hosts GitHub serves raw bytes from:
12
+ // - `raw.githubusercontent.com/<o>/<r>/[refs/<type>/]<ref>/<path>`
13
+ // - `github.com/<o>/<r>/raw/[refs/<type>/]<ref>/<path>` (the form
14
+ // produced by github.com's own "Raw" button — it 302s to the
15
+ // `raw.githubusercontent.com` host but we may store the URL in
16
+ // this form when the user pastes it directly, or when a manifest
17
+ // entry resolves to a URL in this shape).
18
+ //
19
+ // The optional `/refs/<type>/` segment is the new-style raw URL.
20
+ // `<type>` is typically `heads` (branch) but can also be `tags` or
21
+ // `pull` — we accept any single segment there so tag URLs map
22
+ // correctly to `blob/<tag>/<path>`. Both stripped shapes resolve to
23
+ // the same content.
24
+ //
25
+ // Limitation shared with github-provider.ts: branch names
26
+ // containing `/` (e.g. `feature/foo`) are not supported — the
27
+ // first ref segment is taken and the rest folded into the path.
28
+ //
29
+ // Returns null for any URL that isn't a recognised raw URL — callers
30
+ // fall back to the original URL.
31
+ //
32
+ // Query strings + fragments get stripped — they don't carry over to
33
+ // the github.com page (a `?token=…` is raw-only; an `#L42` fragment
34
+ // would point at the wrong viewer anchor).
35
+ export function githubRawToBlobUrl(rawUrl) {
36
+ // Two regexes (rather than one with alternation) because owner/repo
37
+ // sit at different positions in the two shapes.
38
+ let m = /^https?:\/\/raw\.githubusercontent\.com\/([^\/]+)\/([^\/]+)\/(?:refs\/[^\/]+\/)?([^\/]+)\/([^?#]+)/i.exec(rawUrl);
39
+ if (!m) {
40
+ m = /^https?:\/\/github\.com\/([^\/]+)\/([^\/]+)\/raw\/(?:refs\/[^\/]+\/)?([^\/]+)\/([^?#]+)/i.exec(rawUrl);
41
+ }
42
+ if (!m)
43
+ return null;
44
+ const [, owner, repo, ref, path] = m;
45
+ return `https://github.com/${owner}/${repo}/blob/${ref}/${path}`;
46
+ }
@@ -0,0 +1,24 @@
1
+ import { type ParsedHeader } from './userscript-header.js';
2
+ export type ApiKind = 'sync' | 'async';
3
+ export type ApiSubsystem = 'info' | 'log' | 'storage' | 'storage-listener' | 'dom' | 'resource' | 'menu' | 'xhr' | 'clipboard' | 'notification' | 'tab' | 'tab-data' | 'download' | 'unsafe-window' | 'url-change' | 'window-control';
4
+ export declare const STORAGE_SUBSYSTEMS: readonly ApiSubsystem[];
5
+ export declare const BRIDGE_DENIED = "This page is not allowed to act for that userscript";
6
+ export type ApiRequirement = 'connect' | 'resource';
7
+ export interface GmApiSpec {
8
+ name: string;
9
+ gmDotName?: string;
10
+ kind: ApiKind;
11
+ gmDotPromised?: boolean;
12
+ subsystem: ApiSubsystem;
13
+ requires?: readonly ApiRequirement[];
14
+ }
15
+ export declare const GM_APIS: readonly GmApiSpec[];
16
+ export declare function findApi(name: string): GmApiSpec | undefined;
17
+ export declare function canonicalizeGrant(raw: string): string | null;
18
+ export declare function resolveGrants(rawGrants: readonly string[]): {
19
+ granted: Set<string>;
20
+ hasNone: boolean;
21
+ unknown: string[];
22
+ };
23
+ export declare function isSupportedApi(name: string): boolean;
24
+ export declare function grantedSubsystems(header: ParsedHeader | null | undefined): Set<ApiSubsystem>;