// ==UserScript== // @name ArXiv Hub · 论桥 / 一篇论文,全部入口 // @name:zh-CN ArXiv Hub · 论桥 / 一篇论文,全部入口 // @namespace https://github.com/Peaceful-World-X/ArXivHub // @version v1.2.4 // @description ArXiv Hub paper links, citation and like counts, text document actions, and personal shortcuts, with TLDR summaries. // @description:zh-CN 与论桥论文页同步的导航、引用数和点赞数,支持文字原文入口、自定义网站、Zotero TLDR 与 ArXiv TLDR。 // @author Peaceful-World-X // @license MIT // @homepageURL https://github.com/Peaceful-World-X/ArXivHub // @supportURL https://github.com/Peaceful-World-X/ArXivHub/issues // @updateURL https://raw.githubusercontent.com/Peaceful-World-X/ArXivHub/main/ArXivHub.user.js // @downloadURL https://raw.githubusercontent.com/Peaceful-World-X/ArXivHub/main/ArXivHub.user.js // @match https://www.alphaxiv.org/abs/* // @match https://alphaxiv.org/abs/* // @match https://arxiv.org/abs/* // @match https://www.arxiv.org/abs/* // @match https://www.arxivisual.org/abs/* // @match https://arxivisual.org/abs/* // @match https://arxivhub.github.io/* // @match http://localhost/* // @match http://127.0.0.1/* // @icon https://raw.githubusercontent.com/Peaceful-World-X/ArXivHub/main/public/favicon.svg // @grant GM_xmlhttpRequest // @grant GM_getValue // @grant GM_setValue // @grant GM_deleteValue // @grant GM_setClipboard // @connect arxivtldr.org // @connect api.semanticscholar.org // @connect api.alphaxiv.org // @connect api.openalex.org // @connect www.semanticscholar.org // @connect r.jina.ai // @connect cdn.hjfy.top // @run-at document-idle // ==/UserScript== /** * @changelog 更新日志 * * v1.2.4 (2026-10-13) * - 静态网页,脚本辅助获取 TLDR * * v1.2.3 (2026-10-05) * - 宣传版本 * - 同步论文页快捷入口:PDF、HTML、MD、TeX、TB、BibTex。 * - 支持引用量、点赞数、ArXiv TLDR 和 Zotero TLDR。 * - 支持自定义网站,入口可添加、编辑和删除。 * */ /* global GM_xmlhttpRequest, GM_getValue, GM_setValue, GM_deleteValue, GM_setClipboard */ (function () { 'use strict'; /** * true = 打开 arXiv / alphaXiv 后自动打开 Papers.cool * false = 只添加导航入口 */ const AUTO_REDIRECT = false; /** * true = 在 arXiv 右侧栏直接显示 ArXiv TLDR 摘要 * false = 不显示摘要卡片 */ const SHOW_ARXIV_TLDR = true; /** * true = 显示 Zotero TLDR 同源摘要(Semantic Scholar tldr 字段) * false = 不显示 */ const SHOW_ZOTERO_STYLE_TLDR = true; /** * true = 在 arXiv 彩色书签中显示 alphaXiv * false = 不显示 * */ const SHOW_ALPHAXIV_CARD = true; /** * ArXiv TLDR 默认展开,显示首段摘要。 * 这里只控制初始 UI 状态;摘要仍会在后台加载,展开时无需等待。 */ const ARXIV_TLDR_DEFAULT_COLLAPSED = false; // 成功摘要永久保留;每次打开仍后台刷新,失败或暂无摘要不覆盖上次成功结果。 // 已收录但暂时没有 TLDR 的结果只缓存 12 小时,便于新论文稍后补齐。 const SEMANTIC_SCHOLAR_TLDR_EMPTY_CACHE_TTL = 12 * 60 * 60 * 1000; // 匿名请求共享公共额度。429 时进入冷却,避免刷新页面继续打 API。 const SEMANTIC_SCHOLAR_DEFAULT_COOLDOWN_MS = 15 * 60 * 1000; // 即使配置了 API Key,也主动控制在约 1 req/s 以下。 const SEMANTIC_SCHOLAR_MIN_REQUEST_INTERVAL_MS = 1250; // Semantic Scholar API Key 仅保存在 Tampermonkey 本地存储中。 const SEMANTIC_SCHOLAR_API_KEY_STORAGE = 'arxiv-bridge-semantic-scholar-api-key'; const SEMANTIC_SCHOLAR_COOLDOWN_STORAGE = 'arxiv-bridge-semantic-scholar-cooldown-until'; const SEMANTIC_SCHOLAR_LAST_REQUEST_STORAGE = 'arxiv-bridge-semantic-scholar-last-request-at'; // ArXiv TLDR 生成中时额外重试 2 次,共请求最多 3 次。 const ARXIV_TLDR_MAX_RETRIES = 2; /** * 当 ArXiv TLDR 的 Next.js 页面只返回 hydration shell 时, * 使用 Jina Reader 读取同一个公开页面作为最终兜底。 * 这里只发送公开的论文 URL,不发送任何账号或浏览器数据。 */ const USE_JINA_FALLBACK = true; // ── 节点 ID ── const ALPHAXIV_PAPERS_ID = 'papers-cool-nav-link'; const ALPHAXIV_HJFY_ID = 'hjfy-nav-link'; const BOOKMARKS_ID = 'arxivhub-bookmarks'; const DOCUMENT_LINKS_ID = 'arxivhub-document-links'; const METRICS_ID = 'arxivhub-paper-metrics'; const CUSTOM_DIALOG_ID = 'arxivhub-custom-sites-dialog'; const CUSTOM_SITE_STORAGE = 'arxivhub-custom-sites-v1'; const HUB_URL = 'https://arxivhub.github.io/'; const ZOTERO_TLDR_CARD_ID = 'zotero-style-tldr-sidebar-card'; const ARXIV_TLDR_CARD_ID = 'arxivtldr-sidebar-card'; const ARXIV_VISUAL_STATUS_ID = 'arxivisual-status-badge'; // ── 图标 ── const PAPERS_ICON = 'https://papers.cool/static/favicon.ico'; // 幻觉翻译彩色圆形图标 const HJFY_ICON = 'https://cdn.hjfy.top/web/assets/logo-CXAgV_6N.svg'; // GitHub Raw 加载失败时的备用地址 const HJFY_ICON_FALLBACK = 'https://cdn.jsdelivr.net/gh/yuchenwu73/ArXiv-Hjfy-Switcher@main/icons/icon128.png'; // Hub logo: public/favicon.svg. // Bundled official brand assets keep the bookmark icons independent of third-party requests. const BOOKMARK_ICONS = { "hub": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiI+CiAgPHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiByeD0iOCIgZmlsbD0iI2ZmZjFlZSIvPgogIDxwYXRoIGZpbGw9IiMyYjFiMWMiIGQ9Ik0xNiA0LjUgNiAyNy41aDQuOEwxNiA5LjhsNS4yIDE3LjdIMjZaIi8+CiAgPHJlY3QgeD0iMTEiIHk9IjE4LjYiIHdpZHRoPSIxMCIgaGVpZ2h0PSIyLjgiIGZpbGw9IiNiMzFiMWIiLz4KPC9zdmc+Cg==", "alphaxiv": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAAAAAAAAQCEeRdzAAADm0lEQVR4nO1Y3UsUURRf+yIK7EMrIvogzGzTnXtnVn3dEKQgiKjXeqm3oqCH8nGCIAj6A+zBUPZjdsyNgoQgUugLeg6RqKc+6AMhiMjK1X5nndnuXmfZnd0rGtwfHNA713N/59zfnHPGSERDQ0NDQ0NDQ6MWNAzFYltThnHI4bwPdt3l/EzaMA4+jMXW1+rUjUbXuIyxu4xtVEm2BGOJxKo05yeynI+D+DRsrmiMTTmm2Q87ENbvHJKCvzsPv+8ypnkr1dGxSTl5HLIiw/kpkP1UQrzUZmBjg4axIwz5rGlext99933gnGGlQRB5xzCOwvkXiXAe9guZmxXXQeBZNUGQbCjzAvmC0U04ltWrhDzJxsu8TP4DZHMDh12A3aNApCDGk5bVUc6vjaSk5mXzWSL/Hu/USUpa3eTJiRtM/hvsdL9lrca2BuzZkmUsKwWQpyCCbiJANkXyw5z30HMl5MvI5hsyf1beT3LwgpBv4ikCXSfuKyObj17m6ydfTjakTboRce9od3djsqWlkX5Ot7Y2I7gBP4gMY3lYjm6InttLLRtap+D8vVQpsP4IdvV2IrGW1nJdXU3eTcwSeV9CBdkwtmxk0+Ba1i4QfOLJ5DeCu+QHUZAJY9cynZ07i78vJ9kQeTy779X9uWIQpnlY9mtT/zDNc4sumzKlMlA2XuZnSvaaZlIeA4h8erFlQ0hbVjOcPvAaU1WyEcj8QfCO3DkLVQmZX1TZiOScWMzEAS/CyMaTjpPifLe410bmPfKyHEtkA8m1IHltyoJAdvegUjwOIxs583aVskGxaMX6RCbk7FQRInECVZIwsslUkE1h8uTcgDwnhVusanYKDchmAw4YqkY2wkgcWG3cSGSlnyCsXXGkcbzS7FQTcM29yOjPamQTpkl5HduVAig7O9UMEBgUDqEKNRIkm1QNTcprdq6zcHZSJyc4fCU4n4IdEZ9Xkk2lJuWNHQMBQYzdUVGdQGRCcPwVjnv8Z/Z8qay7SeXa2ppkOSEpkynG9tUdAPSfFbKSh+OBVDy+d8SytuMD/KKqJmX/k9M0znntxuP76yZPgNNjcCi+xDMoqSSrl7AfKmcbkhP89NF/JpSQJ9ALC43mpPlogamabegLT/WIEUFWo7iF5zRtBpCnj/k3GAmOKz9YJaisZQyDms8oaRTvwlu8H9SdbyYZ64wsZ/I+Cl9q0ehmGupG0IXT7e3bqJYvNS8NDQ0NDY3/En8B4l2kMyQQvysAAAAASUVORK5CYII=", "paperlayer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJQYXBlcmxheWVyIj4KICA8ZGVmcz4KICAgIDxjbGlwUGF0aCBpZD0icGwtdW5kZXIiPgogICAgICA8cmVjdCB4PSItMTMiIHk9Ii0xMyIgd2lkdGg9IjI2IiBoZWlnaHQ9IjI2IiByeD0iNy41IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMiwzOS41KSBzY2FsZSgxLDAuNikgcm90YXRlKDQ1KSIvPgogICAgPC9jbGlwUGF0aD4KICA8L2RlZnM+CiAgPCEtLSBkZWVwIGxheWVyIC0tPgogIDxyZWN0IHg9Ii0xMyIgeT0iLTEzIiB3aWR0aD0iMjYiIGhlaWdodD0iMjYiIHJ4PSI3LjUiIGZpbGw9IiMyNDU2Y2UiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMyLDM5LjUpIHNjYWxlKDEsMC42KSByb3RhdGUoNDUpIi8+CiAgPCEtLSB0b3AgbGF5ZXIgLS0+CiAgPHJlY3QgeD0iLTEzIiB5PSItMTMiIHdpZHRoPSIyNiIgaGVpZ2h0PSIyNiIgcng9IjcuNSIgZmlsbD0iI2E5YzZmMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzIsMjQuNSkgc2NhbGUoMSwwLjYpIHJvdGF0ZSg0NSkiLz4KICA8IS0tIG92ZXJsYXA6IHRvcC1vdmVyLWRlZXAgYmxlbmQsIGZha2VkIHdpdGggYSBjbGlwcGVkIG1pZC10b25lIHNvIG5vIHJlYWwgdHJhbnNwYXJlbmN5IGlzIG5lZWRlZCAtLT4KICA8ZyBjbGlwLXBhdGg9InVybCgjcGwtdW5kZXIpIj4KICAgIDxyZWN0IHg9Ii0xMyIgeT0iLTEzIiB3aWR0aD0iMjYiIGhlaWdodD0iMjYiIHJ4PSI3LjUiIGZpbGw9IiM2ZjkzZTQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMyLDI0LjUpIHNjYWxlKDEsMC42KSByb3RhdGUoNDUpIi8+CiAgPC9nPgo8L3N2Zz4K", "hjfy": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjQ4cHgiIGhlaWdodD0iMjQ4cHgiIHZpZXdCb3g9IjAgMCAyNDggMjQ4IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPHRpdGxlPmxvbGxpcG9wPC90aXRsZT4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJsb2xsaXBvcCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4xLCAwLjAwMDIpIiBmaWxsLXJ1bGU9Im5vbnplcm8iPgogICAgICAgICAgICA8cGF0aCBkPSJNMTg1Ljg1LDE2LjQ3ODc2NzEgQzE2NS4yNTMsNC41ODc3NjcxMiAxNDIuNjcxLC0wLjU3NjIzMjg4MiAxMjAuNTIyLDAuMDUwNzY3MTE3NyBDMTIwLjA1NiwwLjA3NTc2NzExNzcgMTE5LjU5LDAuMTA1NzY3MTE4IDExOS4xMjQsMC4xMzk3NjcxMTggQzg2Ljk5LDIuNDkyNzY3MTIgNTYuMjE2LDI1Ljk5Mjc2NzEgNTYuMjE2LDYxLjgzMDc2NzEgQzU2LjIxNiw5Ni4wNDQ3NjcxIDk0LjMzNCwxMzkuMTc0NzY3IDEyMy44OTksMTIzLjc4MDc2NyBMMjI4LjY0Miw1Ny45MDk3NjcxIEMyMTguMjg3LDQxLjM3Nzc2NzEgMjAzLjkyNCwyNi45MTM3NjcxIDE4NS44NSwxNi40Nzg3NjcxIEwxODUuODUsMTYuNDc4NzY3MSBaIiBpZD0iUGF0aCIgZmlsbD0iI0ZGRTA3NyI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNMTIzLjksMTIzLjc3OTc2NyBMMzkuMTA3LDIwOC4yODA3NjcgTDQ3LjMxMSwyMTYuNTY4NzY3IEM1MS44NzgsMjIwLjE2OTc2NyA1Ni43NiwyMjMuNDg4NzY3IDYxLjk0OSwyMjYuNDg0NzY3IEM4Mi41NDYsMjM4LjM3NTc2NyAxMDUuMTIsMjQyLjEyMjc2NyAxMjcuMjc3LDI0Mi4xMjI3NjcgQzE2NS4xMzksMjQyLjEyMjc2NyAxODcuMjkyLDIwOS41NDM3NjcgMTg3LjI5MiwyMDkuNTQzNzY3IEMxODkuODE2LDIwMi44MDE3NjcgMTkwLjU1LDE5My4zNTY3NjcgMTkwLjU1LDE4NS43Mjg3NjcgQzE5MC41NSwxNTEuNTE2NzY3IDE1Ny4yMTIsMTA4Ljg3NTc2NyAxMjMuOSwxMjMuNzc5NzY3IEwxMjMuOSwxMjMuNzc5NzY3IFoiIGlkPSJQYXRoIiBmaWxsPSIjQ0JCMEYyIj48L3BhdGg+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMzkuMzExLDEyNy43NzE3NjcgQzIzNC4xNiwxMTYuNDgwNzY3IDIyMi44NjksOTkuOTIxNzY3MSAyMTEuMjkzLDkzLjIzNzc2NzEgQzE4MS42NjMsNzYuMTMwNzY3MSAxMzIuNDUyLDg4LjM1MDc2NzEgMTIzLjksMTIzLjc4MDc2NyBDMTU4LjExNCwxMjMuNzgwNzY3IDE4NS44NSwxNTEuNTE2NzY3IDE4NS44NSwxODUuNzMwNzY3IEMxODUuODUsMTkzLjM1Nzc2NyAxODQuNDY5LDIwMC42NTg3NjcgMTgxLjk0NywyMDcuNDAyNzY3IEwxODYuMjA4LDIxOS45NzA3NjcgQzE4Ni4yMDgsMjE5Ljk3MDc2NyAyMTguMjQ3LDIwMS4wMjE3NjcgMjI4Ljc3OCwxODEuNTI3NzY3IEMyMzcuNTksMTY0LjE2MTc2NyAyMzkuMzExLDEyNy43NzE3NjcgMjM5LjMxMSwxMjcuNzcxNzY3IFoiIGlkPSJQYXRoIiBmaWxsPSIjMUJBRERFIj48L3BhdGg+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik02MS45NSwxNi40Nzk3NjcxIEM0MS4zNTMsMjguMzcxNzY3MSAyNS41OSw0NS4zNDY3NjcxIDE1LjA1OCw2NC44NDA3NjcxIEMxNC44NDksNjUuMjUxNzY3MSAxNC42MDYsNjUuNjY5NzY3MSAxNC40MDIsNjYuMDg2NzY3MSBDMC4wMTcsOTUuNTE3NzY3MSA0LjE5NSwxNDEuNDQwNzY3IDMyLjQzNCwxNTcuNzQ0NzY3IEM2Mi4wNjQsMTc0Ljg1MTc2NyAxMjUuOTM2LDE1Ni4xMTU3NjcgMTIzLjksMTIzLjc4MDc2NyBDODkuNjg2LDEyMy43ODA3NjcgNjEuOTUsOTYuMDQ0NzY3MSA2MS45NSw2MS44MzA3NjcxIEM2MS45NSwyOS4yMzA3NjcxIDg3LjE1MiwyLjU4ODc2NzEyIDExOS4xMjUsMC4xMzk3NjcxMTggQzk5LjYzLDAuODQwNzY3MTE4IDgwLjAyNCw2LjA0NDc2NzEyIDYxLjk1LDE2LjQ3OTc2NzEgWiIgaWQ9IlBhdGgiIGZpbGw9IiNGRkFBNUEiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZD0iTTIyOS4zNjQsNTguOTg5NzY3MSBDMjExLjUyLDMxLjYwOTc2NzEgMTc1LjIxOCwyMi42MTc3NjcxIDE0Ni41NzUsMzkuMTU0NzY3MSBDMTE2Ljk0NSw1Ni4yNjE3NjcxIDEwNi43OTMsOTQuMTQ5NzY3MSAxMjMuOSwxMjMuNzc5NzY3IEMxNDEuMDA3LDk0LjE0OTc2NzEgMTc4Ljg5NSw4My45OTc3NjcxIDIwOC41MjUsMTAxLjEwNDc2NyBDMjIwLjA5OCwxMDcuNzg2NzY3IDIyOC42NjMsMTE3LjcyNTc2NyAyMzMuODIxLDEyOS4wMTU3NjcgTDI0MS4zNzUsMTI0LjgzOTc2NyBDMjQ0LjUyNCw4Ni4yODY3NjcxIDIyOS4zNjQsNTguOTg5NzY3MSAyMjkuMzY0LDU4Ljk4OTc2NzEgTDIyOS4zNjQsNTguOTg5NzY3MSBaIiBpZD0iUGF0aCIgZmlsbD0iIzk4REI3QyI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNMCwxMjMuNzc5NzY3IEMwLDE0Ny41NjI3NjcgNi44MTksMTY5LjcwMTc2NyAxOC40MzYsMTg4LjU2OTc2NyBDMTkuOTM4LDE5MC44NzM3NjcgMjEuNzM3LDE5My42NjE3NjcgMjMuMDU5LDE5NS4yMDU3NjcgQzI1LjYwOSwxOTguMTgxNzY3IDI5Ljc2OCwyMDMuNDkzNzY3IDMzLjMwMiwyMDYuMTIzNzY3IEMzNi40MjYsMjA4LjQ0ODc2NyAzOS4xMDcsMjA4LjI4MDc2NyAzOS4xMDcsMjA4LjI4MDc2NyBDNTcuNTg3LDIxOC41NjE3NjcgODEuNjE4LDIxOS43MjQ3NjcgMTAxLjIyNCwyMDguNDA0NzY3IEMxMzAuODU0LDE5MS4yOTc3NjcgMTQxLjAwNiwxNTMuNDA5NzY3IDEyMy44OTksMTIzLjc3OTc2NyBDMTA2Ljc5MiwxNTMuNDA5NzY3IDY4LjkwNCwxNjMuNTYxNzY3IDM5LjI3NCwxNDYuNDU0NzY3IEMxMS4wNDEsMTMwLjE1NDc2NyAwLjUzNSw5NC45OTg3NjcxIDE0LjQwMSw2Ni4wODU3NjcxIEM1LjI2Miw4My4zMTk3NjcxIDAsMTAyLjkxMDc2NyAwLDEyMy43Nzk3NjcgWiIgaWQ9IlBhdGgiIGZpbGw9IiNGRjVGN0EiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZD0iTTEwOS45NTksMjI5Ljk2Mzc2NyBDODMuNiwyMjkuOTYzNzY3IDU5LjM2NCwyMjIuMDc5NzY3IDM5LjEwNywyMDguMjgxNzY3IEMzNC4xMzUsMjA1LjM1ODc2NyAyOS4zMjIsMjAxLjUxOTc2NyAyNS4yNjEsMTk3LjIwNzc2NyBDMjQuNTI1LDE5Ni41NDE3NjcgMjMuNzc5LDE5NS44ODg3NjcgMjMuMDU5LDE5NS4yMDY3NjcgQzMzLjAzNSwyMDkuMzk4NzY3IDQ1LjkzMiwyMjEuODMzNzY3IDYxLjk1LDIzMS4wODE3NjcgQzgyLjU0NywyNDIuOTcyNzY3IDEwNS4xMjksMjQ4LjEzNjc2NyAxMjcuMjc4LDI0Ny41MTA3NjcgQzEyNy43NCwyNDcuNDg1NzY3IDEyOC4yMDMsMjQ3LjQ1NTc2NyAxMjguNjY3LDI0Ny40MjA3NjcgQzE1My4zNDQsMjQ1LjU2Mzc2NyAxNzkuNTIsMjI5Ljc1OTc2NyAxODEuOTQ3LDIwNy40MDM3NjcgQzE2MS41MjYsMjIxLjU1Njc2NyAxMzYuNjg4LDIyOS45NjM3NjcgMTA5Ljk1OSwyMjkuOTYzNzY3IFoiIGlkPSJQYXRoIiBmaWxsPSIjQjg5NkU4Ij48L3BhdGg+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMzMuODQyLDEyOC45MzA3NjcgQzIyNy4yMDYsMTYxLjMyMjc2NyAyMDguMTIsMTg5LjI1NDc2NyAxODEuODc3LDIwNy40NTE3NjcgQzE3My42MDIsMjI5LjQ5Nzc2NyAxNTMuMTMzLDI0NS41NDU3NjcgMTI4LjY2NywyNDcuNDE4NzY3IEMxNDguMTYxLDI0Ni43MTc3NjcgMTY3Ljc3NywyNDEuNTEzNzY3IDE4NS44NTEsMjMxLjA3OTc2NyBDMjA2LjQ0OCwyMTkuMTg3NzY3IDIyMi44MSwyMDIuNTI1NzY3IDIzMi43NDIsMTgyLjcxODc2NyBDMjMyLjk1MywxODIuMjk3NzY3IDIzMy4xNjIsMTgxLjg3MTc2NyAyMzMuMzY3LDE4MS40NDA3NjcgQzI0Mi40MjMsMTYyLjQ1ODc2NyAyNDYuMTk4LDEzMy44NDk3NjcgMjMzLjg0MiwxMjguOTMwNzY3IEwyMzMuODQyLDEyOC45MzA3NjcgWiIgaWQ9IlBhdGgiIGZpbGw9IiMwMDhDREYiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZD0iTTI0Ny44LDEyMy43Nzk3NjcgQzI0Ny44LDk5Ljk5Njc2NzEgMjQwLjk4MSw3Ny44NTc3NjcxIDIyOS4zNjQsNTguOTg5NzY3MSBMMjI5LjM2NCw1OC45ODk3NjcxIEMyMzQuNDA0LDcyLjYyMjc2NzEgMjM2LjM5MSw4OC4xNDg3NjcxIDIzNi4zOTEsMTAzLjUzMjc2NyBDMjM2LjM5MSwxMTIuMjYxNzY3IDIzNS41MDcsMTIwLjc4NTc2NyAyMzMuODIxLDEyOS4wMTY3NjcgQzI0MS4yMTgsMTQ1LjI1NDc2NyAyNDEuNTM5LDE2NC40MDM3NjcgMjMzLjM2NywxODEuNDQxNzY3IEMyNDIuNTA5LDE2NC4yMDc3NjcgMjQ3LjgsMTQ0LjY0OTc2NyAyNDcuOCwxMjMuNzc5NzY3IFoiIGlkPSJQYXRoIiBmaWxsPSIjNzdDQzdEIj48L3BhdGg+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=", "papers-cool": "data:image/png;base64,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", "pith": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNiAxNiIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJQaXRoIj4KPHJlY3QgeD0iMyIgeT0iMyIgd2lkdGg9IjEwIiBoZWlnaHQ9IjEwIiBmaWxsPSIjMGQwZDBjIiBzaGFwZS1yZW5kZXJpbmc9ImNyaXNwRWRnZXMiLz4KPC9zdmc+Cg==", "pwc": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAYAAABS3GwHAAACTElEQVR4nO3dsQkCURBFURVL2ECMtv+qfidrZiCYCDIL95wKXnKZcK7Px3ZcIOo2PQAmCYA0AZAmANIEQJoASBMAaQIgTQCkCYA0AZAmANIEQJoASBMAaQIgTQCkCYA0AZAmANIEQJoASBMAaQIgTQCkCYA0AZAmANIEQJoASBMAaQIgTQCkCYA0AZB2nx7waa01PYE/2/d9esKbC0CaAEgTAGkCIE0ApAmANAGQJgDSBECaAEgTAGkCIE0ApAmANAGQJgDSBECaAEgTAGkCIE0ApAmANAGQJgDSBECaAEgTAGkCIE0ApAmANAGQJgDSBECaAEgTAGmn+xF2Nmf6Z/Urf9e+cwFIEwBpAiBNAKQJgDQBkCYA0gRAmgBIEwBpAiBNAKQJgDQBkCYA0gRAmgBIEwBpAiBNAKQJgDQBkCYA0gRAmgBIEwBpAiBNAKQJgDQBkCYA0gRAmgBIEwBpAiBNAKQJgDQBkCYA0gRAmgBIEwBpAiBNAKQJgDQBkCYA0gRA2n16wNmttaYn8EcuAGkCIE0ApAmANAGQJgDSBECaAEgTAGkCIE0ApAmANAGQJgDSBECaAEgTAGkCIE0ApAmANAGQJgDSBECaAEgTAGkCIE0ApAmANAGQJgDSBECaAEgTAGkCIE0ApF2fj+2YHgFTXADSBECaAEgTAGkCIE0ApAmANAGQJgDSBECaAEgTAGkCIE0ApAmANAGQJgDSBECaAEgTAGkCIE0ApAmANAGQJgDSBECaAEgTAGkCIE0ApAmANAGQJgDSBEDaC3g1DK/ZfgonAAAAAElFTkSuQmCC", "gist-science": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+PHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iMTUiIGZpbGw9IiMyNDU2ZDYiLz48dGV4dCB4PSIzMiIgeT0iNDciIGZvbnQtZmFtaWx5PSJHZW9yZ2lhLHNlcmlmIiBmb250LXdlaWdodD0iNjAwIiBmb250LXNpemU9IjQ0IiBmaWxsPSIjZmZmIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5nPC90ZXh0Pjwvc3ZnPgo=", "arxivmax": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJhclhpdk1heCI+CiAgPHN0eWxlPgogICAgLyogVGludCB0aGUgYWNjZW50IGZvciBmYXZpY29uIHZhcmlhbnRzOiBub3JtYWwgI2Q4Nzc1OSDCtyBibHVlICM1YjhjZDggKi8KICAgIC5iZyAgICB7IGZpbGw6ICMyZjI3MjA7IH0KICAgIC5pbmstcyB7IHN0cm9rZTogI2ZiZjdmMTsgfQogICAgLmFjYy1zIHsgc3Ryb2tlOiAjZDg3NzU5OyB9CiAgICAuYWNjLWYgeyBmaWxsOiAjZDg3NzU5OyB9CiAgPC9zdHlsZT4KICA8cmVjdCBjbGFzcz0iYmciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgcng9IjEzIiAvPgogIDwhLS0gaW5rIGRpYWdvbmFsICsgYWNjZW50IGRpYWdvbmFsIGZvcm0gdGhlIFg7IGFjY2VudCB0aXAgcmlzZXMgaW50byBhbiBBSSBzcGFyayAtLT4KICA8ZyBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS13aWR0aD0iOCIgZmlsbD0ibm9uZSI+CiAgICA8cGF0aCBjbGFzcz0iaW5rLXMiIGQ9Ik0xOCAxOCA0NiA0NiIgLz4KICAgIDxwYXRoIGNsYXNzPSJhY2MtcyIgZD0iTTE4IDQ2IDM5IDI1IiAvPgogIDwvZz4KICA8cGF0aCBjbGFzcz0iYWNjLWYiIGQ9Ik00NiAxMSBDNDggMTYgNDggMTYgNTMgMTggQzQ4IDIwIDQ4IDIwIDQ2IDI1IEM0NCAyMCA0NCAyMCAzOSAxOCBDNDQgMTYgNDQgMTYgNDYgMTEgWiIgLz4KPC9zdmc+Cg==", "openreview": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADAEAIAAACNLicTAAAACXBIWXMAAC4jAAAuIwF4pT92AAALKGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDAgNzkuMTYwNDUxLCAyMDE3LzA1LzA2LTAxOjA4OjIxICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgKE1hY2ludG9zaCkiIHhtcDpDcmVhdGVEYXRlPSIyMDE4LTAyLTAxVDE4OjA0OjE1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDE4LTAyLTAxVDE4OjIwOjM0KzA3OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOC0wMi0wMVQxODoyMDozNCswNzowMCIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpmNjlkMWYxZi05ZTdmLTRhZDktODRkZC02ZGM3NzUwZjNlZjYiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDpiMDhiZWZiZS04ODA1LTQ0NDYtOTQ1Zi03MzA4ZWM2ODhmMGQiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo5ODkzYTA3Zi1iMDI5LTQ5ZmItOTY4NS1lYjU3M2FjYzJiYjgiIHRpZmY6T3JpZW50YXRpb249IjEiIHRpZmY6WFJlc29sdXRpb249IjMwMDAwMDAvMTAwMDAiIHRpZmY6WVJlc29sdXRpb249IjMwMDAwMDAvMTAwMDAiIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiIGV4aWY6Q29sb3JTcGFjZT0iMSIgZXhpZjpQaXhlbFhEaW1lbnNpb249IjUxMiIgZXhpZjpQaXhlbFlEaW1lbnNpb249IjUxMiI+IDxwaG90b3Nob3A6VGV4dExheWVycz4gPHJkZjpCYWc+IDxyZGY6bGkgcGhvdG9zaG9wOkxheWVyTmFtZT0iT3BlbiBSZXZpZXcgLm5ldCIgcGhvdG9zaG9wOkxheWVyVGV4dD0iT3BlbiBSZXZpZXcgLm5ldCIvPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOlRleHRMYXllcnM+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OTg5M2EwN2YtYjAyOS00OWZiLTk2ODUtZWI1NzNhY2MyYmI4IiBzdEV2dDp3aGVuPSIyMDE4LTAyLTAxVDE4OjA0OjE1KzA3OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgKE1hY2ludG9zaCkiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmY4OWVkODZmLTNkOTktNGMxNC1iOWI2LTMzZTdjNWI0ZDkwYyIgc3RFdnQ6d2hlbj0iMjAxOC0wMi0wMVQxODoxODo1OSswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDoyNTI0ODNhNS00NGUyLTRjMmMtYTRiNi00M2NmZjUxMTlhYjQiIHN0RXZ0OndoZW49IjIwMTgtMDItMDFUMTg6MjA6MzQrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvcG5nIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZjY5ZDFmMWYtOWU3Zi00YWQ5LTg0ZGQtNmRjNzc1MGYzZWY2IiBzdEV2dDp3aGVuPSIyMDE4LTAyLTAxVDE4OjIwOjM0KzA3OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjI1MjQ4M2E1LTQ0ZTItNGMyYy1h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", "emergent-mind": "data:image/png;base64,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", "xiaohongshu": "data:image/png;base64,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", "x-search": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAAY1BMVEUAAAD///+bm5uRkZH6+vr09PSfn5/s7Ozj4+NgYGDNzc2wsLB5eXnY2Nh8fHzb29tISEgoKCgjIyNNTU1xcXFbW1umpqY0NDTFxcW/v79ra2sUFBQ9PT2IiIhTU1NmZmYcHBxImQpCAAADWElEQVR4nO2a3WKyMAyGi/gzNkXnZP5tbvd/ld+nbWISW0DacrI8Z52FBJu+fck0RlEURVEURVEURVFCzCd+yj4XV/er5z8DE/guAnx3X7sh0xcD4xtzDGXw1XXllkyeDY5vzCKQQOc9Z2Tye0QC20ACxWv7dS9k6kdEfGNOoQxaC/GVTNxFxTfmLZTBpt81vXZMK/ht1ssrOxhPg1eUJP5bdHxj4F5rOzzDeBWYT1eto1T60Yin+YHxxDudCsBLivj/BRHud7JjXOKLZ3IqAWCs4I5bO24rg1QCwJm6O4KmhssgnQAwcF2PdoxlMRcTUwoAA3dWbcefMG7YtLQCwMBH29vxGsbeNIs0AsCA4oLKhkDr+5TkAsDYi1tfYPwJMzIIAKMWi4vqUNlxFgFgoDtxxxCqw/k2zCMADHAnoD+gDrfvO5MAMPBLdvrzQSo+mwAwsMyd/kxg3GQUAAbGcfpDn5t8HRnBlXbj6UP89ALAgThuo29k/BwCwJDupOTx8wgAQ7oTXgaZBIAh3QkVoFwCwBHu5OseP58AMKQ7wVfYvBuQIN3JYcwKuCHdCZTB8NfwZxHuBL3CcawEpDtBr1CPlYF0J+gV9mNlIN0JeIURpNDwiM6d4KIcxkpAupMljHs0sNKAu9+5E1yUzgZWGvBQQncybhnUBcHaYlyU3J7kSkPjgwvZib2ZkX3BcccQWsaWBlYaHqygO4i7G1hp8PRP7UH4O04ZrEhgcRDim0POMqAd7Br9kDsIsQzyuTMiANdXc+lOspcBFYCb7qM7sQrY2ceMhAqAa44Id1LBx/4+ZiRUABbyb670sYHl62PGQgXgDH+U7iRjGVABIIce7gtX+mKN0kEFoPIl5p452MeMhAoAtx3SneBWbTy3GYwQAIbsnXj7mJE8CABD9k5YAysJHgFgYO/Ebo7HPmYkPgHgwKfumbGBVXlnP41XABiyd7Jqn/4kAQFg4DPveM4pyiAoAP5Z1p1gHyG+bxAWAI7onWDn4hQZv00AGPjMi/WVe//qNyp+uwAwQj84iOpcdAkA4xDIIKIMugWAMQtkMLyB1i0AwXwZQxtYfQSAsQwkMLAM6P9Bempq6HcngzoXl0mJ9P4pTulnvh2SgaIoiqIoiqIoivI3+AdwJhvQeZpDGgAAAABJRU5ErkJggg==", "reddit-search": "data:image/png;base64,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", "zhihu-search": "data:image/x-icon;base64,AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAABMLAAATCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ZQBg/2cAv/9lAP7/ZgD//2YA//9mAf//ZgD//2YA//9mAP//ZgD//2YA//9mAP//ZgD//2YA//9mAf7/ZgH//2YB//9lAP//ZgD//2YB/v9nAP7/agH//2sA//9sAe7/bwC//3EAXwAAAAAAAAAAAAAAAAAAAAD/YAAQ/2YAz/9lAP7/ZgD//2YA//9lAP7/ZgD//2YA//9mAP//ZgD//2YB/v9lAf7/ZgH//2UA//9mAf7/ZgH//2YA//9mAP//ZgH//2YA//9nAf//aAD//2kA//9rAP//bAD//24A//9wAP//cQD+/3QAv/9wABAAAAAAAAAAAP9lAb//ZQH+/2YA//9mAP//ZgH//2YA//9mAP//ZgD//2YA//9mAP//ZgD//2YA//9mAP//ZwH//2YA//9mAf7/ZgD//2YA//9mAP//ZwD//2gA/v9qAP//bAD//2wB/v9uAP//cAD//3IA//9zAP//dQD//3cAzwAAAAD/ZgBf/2YA//9mAP//ZgH+/2YA//9mAP//ZgH//2YA//9lAP7/ZgH//2YB/v9lAP7/ZgD//2UB/v9lAP7/ZgH+/2UB/v9mAP//ZgH//2cA//9pAP//agD//2wA//9uAP//bwD//3AA//9xAf7/dAD//3UA//92AP//eAH//3kAX/9nAL//ZQD//2YB//9mAP//ZgD//2YA//9mAP//ZgD//2UA/v9lAP7/ZgD//2YA//9mAf//ZgD//2YA//9mAP//ZgH//2cB//9nAP//aQD//2sA//9sAP//bgH//28B/v9wAP7/cgH//3MA//91AP7/dgD//3gA//95AP7/ewC//2YB7v9mAf//ZgD//2UA/v9mAf//jUD//59g//+MQP//ZgD//2UA/v9lAf7/ZgH//2YA//9lAP7/ZgD//2UA/v9mAf7/aAD//2kA//9rAP//bAH+/20A/v9vAP//cQH+/3MA//9zAf7/dQD+/3YA//95AP//egD//3sB/v99Af//ZgD//2YB/v9lAP//ZgD//2UA/v+gYP//9e/////////Yv///eSD+/2YA//9mAP//ZgH//2UA/v9mAf//xaD//2gA//9qAf//awD//2wB/v/JoP//lED//3EA//9zAP//dAD//3YB//93AP//eAD+/3oA//97AP//fQH+/38A//9lAP7/ZgH//2YA//9mAP//ZgD//2YA//+CMP//9e/////////s3///ZgD//2YB/v9lAP7/ZgD//6lw////////cxD//2wA//9tAP//bgD///bv////////wpD//30R//91Af7/eAD//3kA//96AP7/fAH//30B/v+AAf//gAD//2YA//9mAP7/ZgD//2YA//9mAP//ZgD//2YA//+fYP////////////+zgP7/ZQH+/2YA//96If//9e////////9+IP//pGD//////////////////////////////////////////////////3wA/v9+Af//gAD//4AA/v+CAP7/ZQD+/2YA//9mAf//ZgH//2UA//9mAf//ZgH+/2YA///FoP///////+zf//95IP//ZwD//9m/////////2r///20B//+lYP//////////////////l0D//9Wv////////////////////////fgD//4AB//+AAf7/ggD+/4QB//9mAP//ZgD//2YA//9mAP//ZgD//2YA//9mAf//ZgH+/3gh/v///////////6Fg//+scP7///////bv//+AIP7/bwD+/6Zg////////3L///3UA//92Af7/eAD//3oA//+LIP////////////+AAP//gQH+/4IB/v+EAP//hQD//2YA//9mAP//ZQD+/2YB//9nAf//ZgD//2UB/v9mAP//ZgD//8ag////////2r///+zf////////rnD//3AA//9xAP//p2D////////dv///dwD+/3kA//95Af7/fAD//40h/v///////////4IA//+DAP//hQD//4YA//+IAP//ZgH+/2YA//9mAP//ZgD//2YA//9mAf//ZQD+/2YA//9nAP//jkD+///////27///fyD//8CQ//9wAP//cQH+/3MA//+oYP///////96///95AP//egD+/3wB//9+Af//jyD/////////////gwD//4UA//+HAf//iAH//4kA//9mAf7/ZgD//2YA//9mAP//ZgH//2YA//9mAP//ZgD+/2gB/v9qAP//9u////////+JMf7/cAH//3EA//9zAP//dAH+/6lg////////3r///3sB//99Af//fQD+/38A//+RIf7///////////+FAf//hwH//4gB/v+KAP//igH+/2YB//9mAf7/ZgH+/2YA//9mAf//cBD//3oh/v97IP7/fSD//34g///kz////////51Q//9xAf7/cwD//3UA//92AP//q2H+///////ev///fQD//34A//9/AP//gAH+/5Ig/////////////4cA//+JAf//iQD+/4sA/v+NAf7/ZgD//2YB//9mAf7/ZgD//2YB/v+9kP///////////////////////////////////////////////////////+7f//+tYP7//////9+///9+Af//gAH+/4EA//+DAP//lCD/////////////iQH//4oB//+MAf//jgH//48A//9mAP//ZgH//2YB/v9mAP//aAD//3wg///av///7N///+3f///t3///9u/////////37///7t///+7f///v3///zp///61g////////37///4AB//+BAP//gwD//4QA/v+VIP////////////+LAf//jAD//44B//+PAP//kQD+/2YB//9mAP//ZwD//2kA//9pAP//awD//20B//9uAP7/cAD//3EA//+5gP///////8uf//93AP//eQH//3oA/v97AP//rmD////////gv///ggD//4MB/v+FAP//hgH+/5ch/v///////////4wA/v+OAP//jwD//5EA//+TAf7/ZgD//2cA//9pAf//agD//2wA//9tAP//bwD//3AA//9yAP//cwD//7mA////////zJ///3kA//97Af//fAD//34A//+vYP///////+C///+EAP//hQD//4cA//+HAf7/mCD/////////////jwD//5AA/v+RAf//kwH+/5QA//9nAP//aQH//2oB/v9sAf7/bQD//5tQ//+vcP7/ehH+/3QB//91AP//uoD////////Nn///ewD//3wB/v9+AP//gAD//7Bh////////4L///4UA//+HAP7/iAD//4oB/v+aIP////////////+QAP//kgD//5MA//+UAP//lwD+/2kA//9qAP//bAD//20A//9vAP//lED////////u3///hyD//3cB//+8gP///////86f//98AP//fgD//4AA//+BAP//sWD////////gv///iAH//4kA//+KAP//jAH//5sg/////////////5IB//+TAf//lQD//5cB/v+YAP//agD+/20B//9uAf//cAH//3EA//9yAP//3L/////////DkP//eAH+/7yA////////z5///34A//+AAf//gQD//4MB/v+yYP///////+G///+JAf//igD//4wA//+OAP//nSD/////////////lAH//5UA//+XAf7/mAD//5oA//9sAf7/bgH+/3AA//9xAP//cwD//3QA/v+pYP////////fv///ev///79/////////37///37///9+////fv///s2D//7Nh////////9+///+G////jv///47///+O////jv/////////////+VAP//lwD+/5gA//+aAP//mwD//24A//9wAP//cQD//3MA/v91AP//dgD//4gg//////////////////////////////////////////////////+0YP//tGD//////////////////////////////////////////////////5gA/v+ZAf//mgD//5wA//+eAf//cQD//3EB/v9zAP//dQD//3YA//94AP//eQH+/9av////////x5D//6BA/v+hQP//oUD//6NA/v+kQP//pUD//4kB//+REf//qUD//6pA//+rQP//rED//61A//+uQP//r0D//7BA//+yQP//mQD//5sA/v+cAf//ngD+/58A//9yAP//dAH//3UA//92AP//eAH+/3kA/v97Af//rWD////////nz///gQD//4IA//+FAf//hgH//4cA/v+JAP//igD+/4wA//+NAP//jwD//5AA//+SAf7/kwD//5YB/v+WAP//mAD//5oA/v+bAP//nQH//54A/v+fAP//oQD//3QA//91Af//dwD//3gA//96Af//ewD//30A//9/AP//t3D///fv//+TIP7/hAD//4UA//+HAP//iAD+/4sA//+MAf//jQD//48A//+RAf//kgH//5QA//+VAP//lwH+/5gB/v+aAP//mwH//50B//+eAP//oAD+/6EA//+jAO//dwG//3cA//95AP//egH+/3sA//99AP//fwD//4AA//+CAf//hAD//4UA//+GAP7/hwH+/4kA//+LAf7/jAD//44B/v+PAP//kQH+/5MA//+VAf7/lQD//5cA//+YAP//mgD//5wB//+dAP//nwH//6AA//+iAf//owH//6QAv/94AGD/eQH//3oA//98Af//fgH//4AA//+AAP//ggH//4MA//+FAP7/hgH//4gA//+KAP//iwH//40A//+OAP//kAD//5EA//+TAP//lQD//5YB/v+XAP//mQD//5sA/v+cAf7/nQH//58A//+gAP//ogH//6MA//+lAP//pgBfAAAAAP96Ac//fAD//34B/v+AAf//gQD//4IB//+DAf7/hgH//4YA/v+IAf7/igH+/4sB/v+NAP//jgD+/5AA/v+RAP//kwD+/5UA//+XAP7/lwD//5kA//+aAP//nAD//54B/v+fAP//oQD//6IB//+kAf7/pQD//6cAvwAAAAAAAAAA/4AAEP99AL//gAH+/4EA//+DAP//hAH+/4UA//+HAf//iQH//4oA//+LAP//jQH+/44A//+QAP//kgH+/5QA/v+UAP//lgD//5gA//+ZAP//mwD//5wA//+dAP//nwH//6EB//+iAf//owD//6UA//+nAM//nwAQAAAAAAAAAAAAAAAAAAAAAP+BAF//gwC//4QA7/+FAP7/hwD//4kB/v+KAP//jAD//40A//+QAf7/kAD//5IB//+UAf//lQD//5cA//+YAP//mgH+/5sA//+dAf7/ngD//58A//+hAP//owH//6QA//+lAL//pgBfAAAAAAAAAAAAAAAA4AAAB4AAAAGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABgAAAAeAAAAc=", "hf-papers": "data:image/x-icon;base64,AAABAAEAMDAAAAEAIACoJQAAFgAAACgAAAAwAAAAYAAAAAEAIAAAAAAAACQAACAcAAAgHAAAAAAAAAAAAAD///8AqKioAM/PzwDCwsIA////APLy8gC5ubkBk5OTAmhoaAJKSkoDODg4BCYmJgUICAgFAAAABQAAAAUAAAAFAAAABR4eHgU8PDwEXl5eA5iYmALh4eEB////AP///wD///8A////AOTk5AGXl5cCVVVVAzc3NwQYGBgFAAAABQAAAAUAAAAFAAAABQkJCQUoKCgFOjo6BE5OTgNvb28CnJycAcbGxgHt7e0A////APn5+QD+/v4A////AAAAAAD///8A39/fAPr6+gDm5uYAr6+vAXR0dAJKSkoDKCgoBQAAAAUAAAAEAAAABkxMTAuhoaEUu7u7HcrKyiPHx8chs7OzGXJycg0AAAAFAAAABDAwMARWVlYDc3NzAoGBgQKAgIACcHBwAlRUVAMmJiYEAAAABAAAAAaDg4MPuLi4G8rKyiLJyckiuLi4HJmZmRM7OzsKAAAABQAAAAQAAAAFLi4uBU1NTQN4eHgCsrKyAfHx8QD///8A////APHx8QD///8A////ALCwsAFpaWkCOzs7BAAAAAUAAAAEVFRUC9HR0SXu7u5P+Pj4fv38+6b///3C///90////tz///7a///9zf79/K/39/d33d3dMSEhIQkAAAAGCwsLBQAAAAUAAAAFDg4OBgAAAAZTU1ML5eXlOvr5+YH//v21///+z////tv///7b///90f/+/b/8/Puh9/f3eOvr60nIyMghMzMzCgAAAAQAAAAFQEBABHBwcAKzs7MB+/v7AMHBwQD19fUBkZGRAkVFRQQAAAAEAAAABsXFxR/x8fFa/fz7ov///tv////3+v3//+v2///X7f//xub//7bi//+74///z+r//+j1///+/v/////+4ff393u0tLQboaGhFbm5uRm1tbUZmJiYE8jIyCL6+vmO///+6fj8///e8f//yOf//7bi//+74///zOj//97w///x+f///v7///////X///7V+/v6me7u7lC1tbUaAAAABgAAAAVMTEwDk5OTAubm5gB7e3sCKSkpBAAAAAXQ0NAk9/f3ev///s/////58Pj//8Tm//+Kzv//Vrr//zKs//8bpP//EKD//wee//8Jnv//FaH//y+r//9vw///0Ov///////r///3J///9xv///c////3O///9wv///s34/P/+rtz//1O4//8ipv//EKD//wee//8Jnv//E6H//yKm//89sP//aMD//5/W///X7f//+fz///////b//v3G9vb2bcDAwB0AAAAFNzc3BJCQkAIgICAERkZGCfHx8Vb///7P/v7//9fu//+Kzv//PrH//xGg//8Am///AJz//wCg//8Epv//B6r//wmt//8JrP//Baf//wCg//8Am///JKf//53W//++4///q9v//53Y//+k2v//tt///8Xm//9wxf//DJ///wCc//8Co///B6r//wmt//8JrP//Bqn//wOk//8An///AJv//wOc//8epf//V7r//6ja///q9v///////f79/cPr6+tGDg4OBzU1NQQAAAAG9PT0YP///+7i8v//eMf//yCm//8Am///AJ3//wWn//8OtP//FMD//xnJ//8czv//HdD//x7R//8d0f//HM///xjH//8Msf//AJ3//wee//8Mn///BZz//wCc//8DnP//CZ3//w+g//8Dnf//AqL//xG7//8ay///HdD//x7R//8d0f//Hc///xvM//8Yxv//Erz//wqv//4Co///AJz//wed//84r///odj///b7//////7j7+/vSwAAAATn5+cx///+29Ts//89sP//AJv//wGg//8LsP//FsP//xzP//8e0///HtP//x7T//8e0v//HtL//x7S//8e0v//HtL//x7T//8d0P//DLL//wCc//8BoP//Cq///g2y//4Msv//B6r//wCd//8BoP//FMD//x7T//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0///HtP//x7S//8ay///Erz//geq//8Anf//CJ7//3LE///0+v////79xtPT0x/7+vp49/v//Vi7//8Am///CKv//xjG//8e0v//HM7//xTA//8Zyf//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0///Gsr//wSj//8Dof/+Gcn//h7T//8f0///Ebr//wCc//8Lr///HtH//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//xbD//8Xxf//HtL//x3Q//8Tvf//A6P//wed//+h1///////9vb29ln//vyT4/L//yan//8Bof//Gcj//xzP//8Tvv//CKr//wiq//8ZyP//H9P//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtH//wqt//8Anf//FcL//h/T//8e0v//DLH//wCc//8Tvv//H9P//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtP//xO9//4Gpv/+C7D//xfF//8e0f//ELr//wCb//9pwP///////Pr6+nH8+/p68Pj//T6x//8Anf//CKr//wms//8LsP//FMD//xzP//8bzf//Gcj//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtH//wmt//8Anf//FcL//h7T//8e0v//DLH//wCc//8Tvf//H9P//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8d0P//GMf//x3Q//8ay///Ebr//gqt//8Krf//Bab//wCc//+GzP//////9/X19Vv9/PyQ8fj//0Gy//8AnP//Cq7//xjG//8e0v//HdH//xO///8HqP//ELn//x7T//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0///GMf//wOh//8Dov/+Gsr//h7T//8e0///Erz//wCc//8Jrf//HdD//x7S//8e0v//HtL//x7S//8e0v//HtL//x7T//8czv//Ca3//gqu//8Yx///HtP//x3P//8Uv///BaX//wGc//+Kzv//////+/j4+HD//vyq2+///x6k//8DpP//G8z//x7R//8XxP//Cq3//wSk//8Ruf//HdD//xrK//8ayv//HtL//x7S//8e0v//HtL//x7S//8bzf//Cav//wCc//8Ns//+HtH//x7S//8e0v//G8v//wWm//8Anf//ELj//x7R//8e0v//HtL//x7S//8e0v//HtH//xjH//8cz///Gsv//guv//0Eo//+DrX//xrK//8f0///E77//wCc//9Xu////P3///z8+4n//fyJ5vT//y+r//8An///DLD//wms//8Dov//Cq7//xjH//8e0///FsL//wan//8Vwf//Gsv//wyx//8Vwf//HtP//xzP//8Kr///AJz//weo//4ay//+HtL//x7S//8e0v//HtL//xTA//8CoP//AZ///xK8//8e0v//HdD//w+2//8QuP//Hc///w2z//4Krf//G8z//x7R//4Uv//9Bqf//gSj//8LsP//CKv//wCb//9yxP//////+vn5+Wjx8PA+//7/54zQ//8Enf//AJz//wWl//8Uv///HdH//x7S//8Tvv//BKP//w+3//8d0P//DLH//wKf//8Vwf//HtL//w+3//8AnP//BaX//hjH//4e0///HtL//x7S//8e0v//HtL//x7S//8Su///AZ7//wOh//8Xxf//HtH//wyy//4Bnv//FMD//xvN//4Iqv/+B6n//xnI//8f0///G83//g62//0Cn//+AJz//x6m///N6f/////+1uLi4inj4+Ml///+2qHX//8EnP//B6n//xrK//8f1P//HM7//w61//8CoP//Drb//x7R//8Wwv//A6L//xO+//8e0v//F8b//wKh//8CoP//FcL//h7T//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0f//DrT//gCc//8JrP//Hc///xzP//8Lsf/+B6j//xzO//8ay//+B6n//gSk//8UwP//HtL//x7T//8UwP/+AKD//ySn///f8P/////9xMHBwRTq6uoo////3ojN//8Am///DrT//xzP//8Vwv//CKr//wCd//8OtP//HdH//xzO//8Hqf//Cq3//x7R//8d0f//C6///wCc//8OtP//HtL//x7S//8e0///HtX//x3V//8d1f//HtT//x7S//8e0v//G8z//gan//4Anf//E7///x/T//8Zyf/+A6L//g+4//8e0///Gsr//geo//4Bn///DbP//xnJ//8by///Bab//xOh///N6f/////+ytPT0xbQ0NAR///+urvi//8QoP//AKD//wam//8Bn///AJz//wqu//8dz///HtL//w+3//8AnP//DbP//x/U//8Yxv//AqD//wSj//8ayv//HtT//x7R//8ivf//J6X//yma//8nov//I7n//x/P//8e1P//HtP//xK8//8Anf//CKv//x3Q//8czv//BaX//wOh//8Xxf//H9P//xjH//4Eo///AJz//wOi//8Fpv//AJz//z2w///s9v////79n5GRkQcAAAAA+/r5WPn8//SNz///I6f//wWe//8Anf//AZ7//xbD//8f1P//FcL//wKg//8AnP//B6j//xjH//8Msf//AJz//w2z//8e1P//Ir7y/zB1/P85RP//PDX//z0x//88NP//OkH//zJr//8ktfn/HtT//xvN//8Fpf//AZ///xO+//8Uv///Ap///wCc//8Hqf//G8z//x/T//8Nsv//AJz//wGd//8Qof//PLD//8Lk///////o9fX1QP///wBgYGABoaGiCPv6+nP9/v/q0uv//y+s//8AnP//AJ7//xC4//8Tvf//BKP//wCd//8Dof//AJ3//wKh//8Anf//BKP//xjJ//8jut7/NlZq/z0wuv89Mf//PTL//z0y4f89Mvb/PTH//z4v5/84Snz/JazM/x7U//8Ruv/+AJ3//wGf//8Bn///AJ3//wOh//8AnP//Caz//xXC//8JrP//AJz//wie//+V0///7vf//////t/4+PheYmJiBKGhoQHn5+cBHBwcAi4vLwb//fuR1+3//xyl//8Anv//AZ7//wCd//8Anf//AJ3//w2y//8Xxf//Cq7//wSk//8Iqv//FsP//x/L9v8zZXP/PTEt/z00Rv89M6v/PTLR/z00Wf89M57/PTLM/z00aP89MS7/NlZe/yHD6/8d0f//ELj//wWm//8Fpf//D7b//xfF//8GqP//AJz//wCd//8Anf//AJ3//wCc//+Nz///////+PT09F0AAAADTU1NAv///wDv7+8AT09PA2lpaQj///2mst7//wed//8IrP//Erz//wms//8Jrf//E73//x3P//8e0///HdD//xvM//8dz///HtX//yigvv88Nzf/PTQy/z00Mf89NDX/PTRB/z0zMP89NDn/PTQ8/z00MP89NDL/PTMx/yuNpv8e1P//HtL//xzO//8bzf//HtL//x7T//8ay///D7b//wir//8LsP//DrT//gCc//9dvP///P3//vf392cAAAABgYGBAv///wDn5+cAICAgAr6+vhH///7DktH//wCb//8Otf//H9P//x3R//8d0f//HtP//x7S//8e0v//HtL//x7S//8e0v//HtL+/zFvgP8+MS7/PTQy/z0yL/89MjD/PDg3/zs9Pf88OTn/PTMw/z0yL/89NDH/PTEv/zVdaP8fzPj/HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x3Q//8e0v//GMf//wCf//9Asf//8/n///z7+4cAAAADc3NzAv///wDi4uIAAAAAAtra2hr///7Sfcj//wCb//8Ruv//H9P//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//IMr0/zdUXP8+Lyz/PDc2/zZYYf8siJ//JqjJ/ySz1v8lq83/K46n/zRfav88Ojv/PjAt/zlGSf8iv+f/HtP//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0///Gsv//gGi//8rq///6PX///78+5snJycFZmZmAv///wDi4uIAAAAAAeDg3x7///7ZdcT//wCb//8Svf//H9P//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0///IMn0/zRfa/81XWj/KJy6/yDJ8/8e1P//HtT//x7U//8e1P//HtX//x/M9/8npsb/M2d1/zZVXf8iv+b/HtP//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//G8z//wKj//8nqP//5PL////+/aZpaWkHWlpaAv///wDj4+MAAAAAAeDg4B7////YdsX//wCb//8Svf//H9P//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtH+/yHD6/8fy/b/HtT//x7T//8e0v//HtL//x7S//8e0v//HtL//x7S//8e1P//H875/yHC6v8e0P3/HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//G8z//wKj//8nqP//5PP////+/aVlZWUHYGBgAv///wDq6uoAAAAAAtra2hj///7Qfsr//wCb//8Ruv//HtP//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7T//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7T//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0///Gsr//gGh//8tq///6vb///79/JkXFxcEdnZ2Av///wD8/PwAKioqAr+/vw////7Al9P//wGb//8NtP//HtL//x7S//8e0v//HdD//xHA//8Nu///GMr//x7S//8e0///HtT//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e1P//HtP//x7S//8e0f//FMT//w26//8Wx///HtL//x7S//8e0///F8b//wCe//9Dsv//9fr///z8+4MAAAACiYmJAf///wD///8AbGxsAm9ubgb///2it+D//wme//8JrP//HdH//x7S//8e0///Fsb//wOt//8CrP//C7j//x3S//8mq83/KpKt/x7Q/P8e1P//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtT//x/M+P8rjqj/JLLV/x7U//8Zy///BbD//wKs//8Is///HM///x7S//8f0///E77//wCc//9ivv///f7//vj4+GQAAAAApqamAT4+PgD///8AnZ2dAQAAAAH//fp42u///x+l//8Do///G8z//x7S//8e0///F8j//wSv//8CrP//DLv//yG/5/84TlX/PDg4/y5/lf8ufpH/KZy4/x7T//8e0v//HtL//x7S//8e0v//HtL//x7S//8qlK//LoGV/y95jf89NTT/Nldg/yHG7/8azf//BrH//wKs//8Jtf//HM///x7S//8e0v//DbP//gCb//+S0f//////8fHx8T4AAAAA1NTUAa2trQCTk5MAz8/PAf///wD39vVF9fr/9Ey2//8Anf//FcH//x7T//8e0v//HdH//xXF//8SwP//GtD//yekxP88NjX/PTMx/z0zMP8+Lyv/M2l2/x7R/v8e0v//HtL//x7S//8e0v//HtL//x/O+f81XWb/Pi8s/z0zMP89MzH/PDo7/yWw0/8d1P//F8j//xHA//8Zy///HtL//x7S//8czv//Baf//xGh///G5//////+0dvb2xoAAAAB////APLy8gDd3d0A////AAAAAAHe3t4Z///+z5HR//8Bm///C7D//x7R//8e0v//HtL//x7S//8e0///HtT//yS12f86QEP/PTIv/z0zMf8+MC7/Ln6S/x7T//8e0v//HtL//x7S//8e0v//HtL//x7R/v8xcYL/PjAt/z0zMf8+MS//OUdL/yK95P8e0///HtL//x7T//8e0v//HtL//x7T//8Vwf/+AJ3//0Cx///x+P///v38mFhYWAV+fn4B////AP///wDa2toA////AJOTkwEEBAQD//78idju//8hpv//AaH//xjH//8e0///HtL//x7S//8e0v//HtL//x7Q/f8rjaf/OUVK/zs8P/8zY3H/Ir7l/x7T//8e0v//HtL//x7S//8e0v//HtL//x7T//8jt9z/NVxn/zs8Pv85SE7/Kpay/x7S//8e0v//HtL//x7S//8e0v//HtL//x3Q//8Krv/+AZz//5DR///////29vb2Tv///wC/v78BQ0NDAP///wD///8AoKCgAOXl5QH///8A8/PyOP3+/+pzxf//AJv//wyx//8e0f//HtL//x7S//8e0v//HtL//x7S//8e0f7/Ir3k/yS02f8gyvX/HtP//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0///IMjy/yS02P8iv+b/HtL//x7S//8e0v//HtL//x7S//8e0v//HtP//xXC//8Anv//LKr//+Dx//////7B1NTUFAAAAAHg4OAAz8/PAP///wD///8A/Pz8AP///wBqamoBnZ2eCP///ZvV7P//I6f//wCf//8Vwf//HtP//x7S//8e0v//HtL//x7S//8e0v//HtP//x7U//8e0///HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtP//x7U//8e0///HtL//x7S//8e0v//HtL//x7S//8e0v//G83//wep//8DnP//j9D///////r5+fhgAAAAAL29vQH///8AvLy8AAAAAAAAAAAA////AHl5eQDe3t4BAAAAAPLy8jT////jkNH//wSd//8Fpv//Gsr//x7T//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8d0f//DbT//wCc//9FtP//7Pb////+/rfS0tISAAAAAfb29gDIyMgAqKioAAAAAAAAAAAA////AOTk5AD///8AmJiYARsbHAP+/Pt28fn//Fi7//8Am///Caz//xvN//8e0///HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8Ru///AJ7//x+m///F5v//////6fT19UH///8Azc3NAT4+PgBlZWUA////AAAAAAAAAAAAAAAAAP///wDn5+cA5ubmAAAAAAHX2NgS///9q9zw//87sP//AJv//wqt//8bzP//HtP//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtH//xK7//8An///EKH//6LY///////6+/v7dU1NTQSOjo4B////AN/f3wBqamoAAAAAAAAAAAAAAAAAAAAAAP///wD4+PgA////ANra2gEAAAAA7u7uJv///sfS6///OK7//wCb//8Iqv//GMf//x7T//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7T//8czv//D7b//wCe//8PoP//ldL///3+///+/f2Yy8vLDQAAAAH///8A09PTAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A9/f3AP7+/gDKysoB////APPz8zT///7P1Oz//0Kz//8Am///A6P//xK8//8cz///HtP//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0///HtL//xfF//8JrP//AJz//xqk//+c1v///P3///7+/aPf398WAAAAAN3d3QEAAAAAkpKSAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8AvLy8AQAAAADz8/My///+w+Tz//9qwv//DJ///wCd//8Iqv//FL///xzO//8e0v//HtP//x7T//8e0v//HtL//x7S//8e0v//HtL//x7S//8e0///HtP//x3Q//8Yxv//DbP//wGg//8Am///Oa///7zi///////7/v79muDg4BYAAAAA5eXlAf///wDb29sAgoKCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////APX19QD8/PwA////AMDAwAH///8A7e3tIv///aL4/P/5qtv//zqv//8EnP//AJ3//wWn//8Otf//FcL//xrK//8czv//HdD//x3R//8d0f//Hc///xvM//8Xxv//Ebv//wms//8AoP//AJv//xul//98yP//5PP//////+v8/Px50dHRDgAAAADm5uYB////AOvr6wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD09PQA6enpAP///wDV1dUB////ANLS0g38+/tn////1+n1//+a1f//QrL//xCg//8Am///AJ3//wGh//8Fpv//B6r//wms//8Iq///Bqj//wKj//8Anv//AJv//wad//8pqf//dMb//87q///+/v/7///+vPf390VycnIEAAAAAOXl5QGTk5MAwcHBAMTExAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A5ubmAO3t7QD///8A+Pj4AAAAAAAAAAAB8fHxJv/+/YX////b8fj//sLk//+Ey///Trf//yyq//8Zo///EaD//wyf//8Pn///FaH//yOm//8/sf//bML//6na///h8v////7/+f///sf7+/pn4+PjFP///wChoaEB////AKmpqQC8vLwAq6urAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMXFxQDS0tIA09PTAP///wDU1NQB////AERERALy8fEl/v38bP///rX////k+Pv/+uf0///V7P//yef//8Hk///F5f//z+r//9/x///y+f////7/9f///tn///2i+/v6VeXl5Rb///8AAAAAANjY2ADa2toA8fHxAMPDwwDd3d0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AODg4AD///8A/f39ALS0tAH///8A////ANTU1Av09PMp/Pv6U//+/Hr///2Y///+qv///rL///6x///+pv///ZH+/fxv+fn5Ru/v7x+oqKgG////AP///wDU1NQA5+fnAP///wDFxcUAo6OjADg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////APb29gDu7u4A5+fnAL6+vgD///8A/f39ACQkJAD///8A////AP///wBOTk4CtbW1BsHBwQi8vLwHqampBQAAAAH///8A////AP///wCqqqoA////AP///wDOzs4A1tbWAAAAAABjY2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3t7eAKurqwD8/PwA5ubmAEBAQAD///8A////APz8/ADV1dUAxMTEAJeXlwChoaEAw8PDAOTk5AD///8A////AP///wCNjY0A7u7uAP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAgAAAAAABAACAAAAAAAEAAMAAAAAAAwAAwAAAAAAHAADgAAAAAAcAAOAAAAAADwAA8AAAAAAfAAD4AAAAAD8AAPwAAAAAfwAA/wAAAAD/AAD/gAAAAf8AAP/AAAAH/wAA//gAAB//AAA=", "google-scholar": "data:image/png;base64,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" }; // BEGIN ARXIVHUB SHARED // Generated by web/scripts/sync-userscript.mjs; edit the shared web/src/lib sources. function createSharedPaperServices(fetch, localStorage) { var ArxivHubShared=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});function t(e){let t=new Map,n=new Map,r=`arxivhub:${e.namespace}:`;function i(t){return!!(t&&typeof t==`object`&&`value`in t&&`at`in t&&typeof t.at==`number`&&Number.isFinite(t.at)&&t.at<=Date.now()&&(t.value===null||e.valid(t.value)))}function a(n){let a=t.get(n);try{let e=JSON.parse(localStorage.getItem(r+n)??`null`);i(e)&&(!a||a.value===null&&e.value!==null||e.at>a.at&&(a.value===null||e.value!==null))&&(a=e)}catch{}if(!a)return;let o=Date.now()-a.at;if(o<0||a.value===null&&o>=e.missingTtl){t.delete(n);return}return t.set(n,a),{...a,stale:o>=(a.value===null?e.missingTtl:e.ttl)}}function o(i,o,s=!1){let c=a(i);if(!s&&c&&!c.stale)return Promise.resolve(c.value);let l=n.get(i);return l||(l=Promise.resolve().then(o).then(n=>{if(n!==null&&!e.valid(n))throw Error(`Invalid paper metric`);let o=a(i);if(n!==null||o?.value===null||!o){let e={value:n,at:Date.now()};t.set(i,e);try{localStorage.setItem(r+i,JSON.stringify(e))}catch{}}return n}).finally(()=>n.delete(i)),n.set(i,l)),l}return{peek:a,get:o}}let n=`arxivhub:semantic-scholar:retry-at`,r=864e5,i=0,a=0;var o=class extends Error{};function s(e){let t=e?.trim().replace(/^https?:\/\/(?:dx\.)?doi\.org\//i,``).replace(/^doi:\s*/i,``).toLowerCase();return t&&/^10\.\d{4,9}\/\S+$/.test(t)&&!/^10\.48550\/arxiv\./.test(t)?t:null}function c(e){return!e||typeof e!=`object`?!1:`paperId`in e&&typeof e.paperId==`string`&&/^[a-f0-9]{40}$/i.test(e.paperId)&&`citationCount`in e&&typeof e.citationCount==`number`&&Number.isSafeInteger(e.citationCount)&&e.citationCount>=0}let l=t({namespace:`semantic-scholar:v1`,ttl:r,missingTtl:r/24,valid:c});function u(e,t){if(/^[a-f0-9]{40}$/i.test(t)){if(!c(e)||e.paperId.toLowerCase()!==t.toLowerCase())throw Error(`Invalid Semantic Scholar paper ID`);return{paperId:e.paperId,citationCount:e.citationCount}}let n=t.startsWith(`DOI:`),r=t.replace(/^(?:ARXIV|DOI):/,``),i=n?`DOI`:`ArXiv`,a=e=>(n?e:e.replace(/v\d+$/i,``)).toLowerCase();if(!c(e)||!(`externalIds`in e)||!e.externalIds||typeof e.externalIds!=`object`||!(i in e.externalIds)||typeof e.externalIds[i]!=`string`||a(e.externalIds[i])!==a(r))throw Error(`Invalid Semantic Scholar paper or citation count`);return{paperId:e.paperId,citationCount:e.citationCount}}function d(){try{i=Math.max(i,Number(localStorage.getItem(n))||0)}catch{}if(i>Date.now())throw new o(`Semantic Scholar rate limited`)}async function f(){d();let e=Math.max(Date.now(),a);a=e+3e3;let t=e-Date.now();t>0&&await new Promise(e=>setTimeout(e,t)),d()}function p(e=null){let t=e&&/^\d+$/.test(e)?Number(e)*1e3:0,r=e&&!t?Date.parse(e):0;i=Math.max(Date.now()+6e4,t?Date.now()+t:r||0);try{localStorage.setItem(n,String(i))}catch{}throw new o(`Semantic Scholar rate limited`)}function m(e,t){/Target URL returned error 429|Too Many Requests/i.test(e)&&p();let n=`Markdown Content:`,r=(e.includes(n)?e.slice(e.indexOf(n)+17):e).trim(),i=JSON.parse(r),a=/^(?:ARXIV|DOI):|^[a-f0-9]{40}$/i.test(t)?t:`ARXIV:${t}`;if(i&&typeof i==`object`&&`error`in i&&i.error===`Paper with id ${a} not found`)return null;if(/Target URL returned error [45]\d\d/i.test(e))throw Error(`Semantic Scholar source unavailable`);return u(i,t)}async function ee(e){let t=e.indexOf(`:`),n=`https://api.semanticscholar.org/graph/v1/paper/${t<0?e:`${e.slice(0,t)}:${encodeURIComponent(e.slice(t+1))}`}?fields=citationCount,externalIds`;await f();try{let t=await fetch(n,{signal:AbortSignal.timeout(8e3)});if(t.status===429&&p(t.headers.get(`retry-after`)),t.status===404)return null;if(!t.ok)throw Error(`Semantic Scholar ${t.status}`);return u(await t.json(),e)}catch(e){if(e instanceof o)throw e}await f();let r=await fetch(`https://r.jina.ai/${n}`,{headers:{Accept:`text/plain`},signal:AbortSignal.timeout(1e4)});if(r.status===429&&p(r.headers.get(`retry-after`)),!r.ok)throw Error(`Semantic Scholar Reader ${r.status}`);return m(await r.text(),e)}async function h(e,t){return l.get(e,()=>ee(e),t)}function g(e,t,n){let r=e.replace(/v\d+$/i,``),i=l.peek(`ARXIV:${r}`),a=s(t),o=a?l.peek(`DOI:${a}`):void 0,c=[n&&/^[a-f0-9]{40}$/i.test(n)?l.peek(n):void 0,i,o].filter(e=>!!e);return c.filter(e=>e.value).sort((e,t)=>t.at-e.at)[0]??c[0]}async function te(e,t,n,r=!1){let i=e.replace(/v\d+$/i,``);if(!/^(?:\d{4}\.\d{4,5}|[a-z-]+(?:\.[a-z]{2})?\/\d{7})$/i.test(i))throw Error(`Invalid arXiv ID`);let a=g(i,t,n);if(!r&&a?.value&&!a.stale)return a.value;if(n&&/^[a-f0-9]{40}$/i.test(n)){let e=await h(n,r);if(e)return e}let o=await h(`ARXIV:${i}`,r),c=s(t);return o===null&&c?h(`DOI:${c}`,r):o}let _=`https://www.semanticscholar.org`,v=/^[a-f0-9]{40}$/i,y={"1706.03762":{title:`Attention is All you Need`,paperId:`204e3073870fae3d05bcbc2f6a8e263d9b72e776`},"2303.08774":{title:`GPT-4 Technical Report`,paperId:`163b4d6a79a5b19af88b8585456363340d9efd04`},"2608.05594":{title:`JTA: Joint Testability Architecture for Scenario-Based Validation of Safety-Critical Software`,paperId:`a5641fd9bbe87d5da393ea06817a9bd325acd07b`}},ne=`arxivhub:semantic-scholar-page:retry-at`,b=0,x=t({namespace:`semantic-scholar-page:v1`,ttl:864e5,missingTtl:3e5,valid:c});function S(e){return e.trim().replace(/v\d+$/i,``).toLowerCase()}function C(e){return e.normalize(`NFKC`).replace(/&/gi,`&`).replace(/&(?:quot|#34);/gi,`"`).replace(/&(?:apos|#39);/gi,`'`).replace(/&(?:nbsp|#160);/gi,` `).replace(/[*_`]/g,``).replace(/[’‘]/g,`'`).replace(/[‐‑‒–—]/g,`-`).replace(/\s+/g,` `).trim().toLowerCase()}function w(e=``){return e.trim().replace(/^https?:\/\/(?:dx\.)?doi\.org\//i,``).replace(/^doi:\s*/i,``).toLowerCase()}function re(e){let t=e.match(/^URL Source:\s*(https?:\/\/\S+)\s*$/m)?.[1];if(!t)throw Error(`Semantic Scholar Reader source is missing`);let n=new URL(t);if(n.origin!==_||n.username||n.password)throw Error(`Untrusted Semantic Scholar source`);return n}function ie(e){return e.origin===_?e.pathname.match(/^\/paper\/(?:[^/]+\/)?([a-f0-9]{40})\/?$/i)?.[1].toLowerCase():void 0}function ae(e){let t=e.indexOf(`Markdown Content:`);if(t<0||/Target URL returned error [45]\d\d/i.test(e.slice(0,t)))throw Error(`Semantic Scholar source unavailable`);let n=e.slice(t+17).trim();if(!n)throw Error(`Semantic Scholar source is empty`);return n}function oe(e){return Array.from(e.matchAll(/\]\((https?:\/\/[^\s)]+)(?:\s+"[^"]*")?\)/g),e=>{try{return new URL(e[1])}catch{return null}}).filter(e=>e!==null)}var T=class extends Error{},E=class extends Error{};function se(e,t,n,r,i=!0){let a=S(n.id),o=y[a],s=n.title?.trim()||o?.title;if(!e)throw Error(`Semantic Scholar paper title is missing`);if(s&&C(e)!==C(s))throw new T(`Semantic Scholar paper title does not match`);let c=t.filter(e=>/^(?:www\.)?arxiv\.org$/i.test(e.hostname)).map(e=>e.pathname.match(/^\/(?:abs|pdf)\/(.+)$/)?.[1]).filter(e=>!!e).map(e=>S(decodeURIComponent(e).replace(/\.pdf$/i,``))),l=w(n.doi),u=t.filter(e=>/^(?:dx\.)?doi\.org$/i.test(e.hostname)).map(e=>w(decodeURIComponent(e.pathname.slice(1)))),d=`10.48550/arxiv.${a}`,f=u.filter(e=>e.startsWith(`10.48550/arxiv.`)),p=c.includes(a)||f.includes(d),m=i&&(o?.paperId===r.toLowerCase()||n.paperId?.toLowerCase()===r.toLowerCase());if(c.length>0&&!c.includes(a)||f.length>0&&!f.includes(d)||l&&u.length>0&&!u.includes(l)&&!p||!p&&!(l&&u.includes(l))&&!m)throw new T(`Semantic Scholar external identifiers do not match`)}function ce(e,t,n){if(!v.test(n)||ie(re(e))!==n.toLowerCase())throw new T(`Semantic Scholar paper URL does not match`);let r=ae(e),i=r.split(/^##\s/m,1)[0];se(i.match(/^#\s+(.+)$/m)?.[1],oe(i),t,n);let a=Array.from(i.matchAll(/^([\d,]+) Citations?\s*$/gm),e=>e[1]),o=Array.from(r.matchAll(/^## ([\d,]+) Citations?\s*$/gm),e=>e[1]);if(!a.length&&!o.length)throw new E(`Missing Semantic Scholar citation total`);let s=[...a,...o].map(e=>/^(?:\d+|\d{1,3}(?:,\d{3})+)$/.test(e)?Number(e.replaceAll(`,`,``)):NaN);if(!a.length||!s.every(e=>Number.isSafeInteger(e)&&e>=0&&e===s[0]))throw Error(`Missing or inconsistent Semantic Scholar citation total`);return{paperId:n.toLowerCase(),citationCount:s[0]}}function D(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}function le(e,t,n){let r=Array.from(e.matchAll(/]*>([\s\S]*?)<\/script>/gi),e=>e[1].match(/^\s*var\s+DATA\s*=\s*'([A-Za-z0-9+/=]+)';?\s*$/)?.[1]).filter(e=>!!e);if(!v.test(n)||r.length!==1)throw Error(`Invalid Semantic Scholar page data`);let i=JSON.parse(decodeURIComponent(atob(r[0])));if(!Array.isArray(i))throw Error(`Invalid Semantic Scholar page data`);let a=i.map(D).filter(e=>e.actionType===`API_REQUEST_COMPLETE`&&e.requestType===`PAPER_DETAIL`),o=a[0],s=n.toLowerCase(),c=D(D(o?.resultData).paper);if(a.length!==1||o.responseStatus!==200||D(o.pathParams).paperId!==s||c.id!==s)throw new T(`Semantic Scholar page data identity does not match`);let l=D(c.title).text,u=D(c.primaryPaperLink).url;if(typeof l!=`string`||typeof u!=`string`)throw Error(`Missing Semantic Scholar page identity`);se(l,[new URL(u)],t,n,!1);let d=D(c.citationStats).numCitations;if(typeof d!=`number`||!Number.isSafeInteger(d)||d<0)throw Error(`Invalid Semantic Scholar page citation total`);return{paperId:s,citationCount:d}}function O(e){let t=new URL(`/search`,_);return t.searchParams.set(`q`,e.trim()),t.searchParams.set(`sort`,`relevance`),t.href}function k(e){return x.peek(S(e))}function A(e){let t=S(e.id),n=e.paperId&&v.test(e.paperId)?e.paperId:k(t)?.value?.paperId||y[t]?.paperId;return n?`${_}/paper/${n.toLowerCase()}`:e.title?.trim()?O(e.title):`${_}/`}function j(e=null){let t=e&&/^\d+$/.test(e)?Number(e)*1e3:0,n=e&&!t?Date.parse(e):0;b=Math.max(Date.now()+6e4,t?Date.now()+t:n||0);try{localStorage.setItem(ne,String(b))}catch{}throw Error(`Semantic Scholar Reader rate limited`)}async function M(e,t=!1){try{b=Math.max(b,Number(localStorage.getItem(ne))||0)}catch{}if(b>Date.now())throw Error(`Semantic Scholar Reader rate limited`);let n=await fetch(`https://r.jina.ai/${e}`,{headers:t?{Accept:`text/html`,"X-Return-Format":`html`}:{Accept:`text/plain`},signal:AbortSignal.timeout(t?2e4:12e3)});if(n.status===429&&j(n.headers.get(`retry-after`)),n.status===404)return null;if(!n.ok)throw Error(`Semantic Scholar Reader ${n.status}`);let r=await n.text(),i=r.slice(0,Math.max(0,r.indexOf(`Markdown Content:`)));return/Target URL returned error 429/i.test(i)&&j(),/Target URL returned error 404/i.test(i)?null:r}async function N(e,t){let n=`${_}/paper/${t}`,r=await M(n);if(r===null)return null;try{return ce(r,e,t)}catch(r){if(!(r instanceof E))throw r;let i=await M(n,!0);if(i===null)throw Error(`Semantic Scholar page data unavailable`);return le(i,e,t)}}async function ue(e){let t=e.title.trim(),n=await M(O(t));if(n===null)return null;let r=re(n);if(r.pathname!==`/search`||C(r.searchParams.get(`q`)||``)!==C(t))throw Error(`Semantic Scholar search source does not match`);let i=[...new Set(oe(ae(n)).map(ie).filter(e=>!!e))].slice(0,3),a;for(let t of i)try{let n=await N(e,t);if(n!==null)return n}catch(e){if(e instanceof T||(a=e),b>Date.now())throw e}if(a)throw a;return null}async function de(e,t=!1){let n=S(e.id);if(!/^(?:\d{4}\.\d{4,5}|[a-z-]+(?:\.[a-z]{2})?\/\d{7})$/i.test(n))throw Error(`Invalid arXiv ID`);let r=k(n);if(!t&&r?.value&&!r.stale)return r.value;let i=e.paperId&&v.test(e.paperId)?e.paperId.toLowerCase():r?.value?.paperId||y[n]?.paperId;if(!i&&!e.title?.trim())return null;let a={...e,id:n,paperId:i},o=`${n}:lookup:${i||JSON.stringify([C(e.title||``),w(e.doi)])}`,s=await x.get(o,async()=>i?N(a,i):ue(a),t);return s===null?null:x.get(n,async()=>s,!0)}function P(e){let t=e.trim().replace(/v\d+$/i,``).toLowerCase();if(!/^(?:\d{4}\.\d{4,5}|[a-z-]+(?:\.[a-z]{2})?\/\d{7})$/.test(t))throw Error(`Invalid arXiv ID`);return t}function F(e){return e.normalize(`NFKC`).toLowerCase().replace(/[^\p{L}\p{N}]+/gu,``)}function fe(e){return!!(e&&typeof e==`object`&&`citationCount`in e&&typeof e.citationCount==`number`&&Number.isSafeInteger(e.citationCount)&&e.citationCount>=0&&`url`in e&&typeof e.url==`string`&&/^https:\/\/openalex\.org\/W\d+$/.test(e.url))}function pe(e,t){if(typeof e!=`string`)return!1;try{let n=new URL(e);if(!/^https?:$/.test(n.protocol))return!1;let r=decodeURIComponent(n.pathname),i;return/^(?:(?:www|export)\.)?arxiv\.org$/.test(n.hostname)?i=r.match(/^\/(?:abs|pdf|html)\/(.+?)\/?$/)?.[1].replace(/\.pdf$/i,``):/^(?:dx\.)?doi\.org$/.test(n.hostname)&&(i=r.match(/^\/10\.48550\/arxiv\.(.+?)\/?$/i)?.[1]),i!==void 0&&P(i)===t}catch{return!1}}function me(e,t){let n=P(t.id);if(!e||typeof e!=`object`||!(`title`in e)||typeof e.title!=`string`||t.title&&F(e.title)!==F(t.title)||!(`locations`in e)||!Array.isArray(e.locations)||!e.locations.some(e=>e&&typeof e==`object`&&(`landing_page_url`in e&&pe(e.landing_page_url,n)||`pdf_url`in e&&pe(e.pdf_url,n))))return null;let r={citationCount:`cited_by_count`in e?e.cited_by_count:void 0,url:`id`in e?e.id:void 0};if(!fe(r))throw Error(`Invalid OpenAlex citation count or work URL`);return r}function he(e,t){let n=P(t.id),r=F(t.title??``);if(!e||typeof e!=`object`||!(`results`in e)||!Array.isArray(e.results))throw Error(`Invalid OpenAlex search response`);if(!r)return null;for(let r of e.results){let e=me(r,{...t,id:n});if(e)return e}return null}let I=864e5,ge=`arxivhub:openalex-citations:retry-at`,L=`arxivhub:openalex-citations:budget-retry-at`,R=`arxivhub:openalex-work-id:v1:`,z=0,B=0,V=new Map,H=t({namespace:`openalex-citations:v1`,ttl:I,missingTtl:3e5,valid:fe});function _e(e){try{return H.peek(P(e))}catch{return}}function U(e,t){let n={workId:t.url.split(`/`).at(-1),at:Date.now()};V.set(e,n);try{localStorage.setItem(R+e,JSON.stringify(n))}catch{}}function W(e){let t=P(e),n=H.peek(t)?.value;if(n)return n.url.split(`/`).at(-1);let r=V.get(t);try{let e=JSON.parse(localStorage.getItem(R+t)??`null`);e&&typeof e.workId==`string`&&/^W\d+$/.test(e.workId)&&Number.isFinite(e.at)&&(!r||e.at>r.at)&&(r=e)}catch{}return r&&r.at<=Date.now()&&Date.now()-r.at<180*I?r.workId:void 0}function ve(e){V.delete(e);try{localStorage.removeItem(R+e)}catch{}}var G=class extends Error{};function ye(e=!1){try{let e=Number(localStorage.getItem(ge));Number.isFinite(e)&&(z=Math.max(z,e));let t=Number(localStorage.getItem(L));Number.isFinite(t)&&(B=Math.max(B,t))}catch{}if(z>Date.now())throw Error(`OpenAlex 429`);if(e&&B>Date.now())throw Error(`OpenAlex daily budget exhausted`)}function be(e,t=!1){let n=Date.now(),r=e?.trim()??``,i=/^\d+$/.test(r)?n+Number(r)*1e3:Date.parse(r),a=(Math.floor(n/I)+1)*I,o=t?a:n+3e5,s=Math.max(t?a:0,Number.isFinite(i)&&i>n?i:o);t?B=Math.max(B,s):z=Math.max(z,s);try{localStorage.setItem(t?L:ge,String(t?B:z))}catch{}throw Error(t?`OpenAlex daily budget exhausted`:`OpenAlex 429`)}async function xe(e,t=!1){ye(t);let n=await fetch(e.href,{credentials:`omit`,signal:AbortSignal.timeout(1e4)});if(!n.ok){let e=await Se(n),t=/insufficient\s+budget|\bdaily\s+(?:budget|quota|credits?(?:\s+limit)?)(?:\s+(?:is|has|been|already|fully)){0,4}\s+(?:exhausted|exceeded|depleted)\b/i.test(e);if((t||n.status===429)&&be(n.headers.get(`retry-after`),t),n.status===404)return null;throw Error(`OpenAlex ${n.status}`)}return n.json()}async function Se(e){let t=e.body?.getReader();if(!t)return``;let n=new TextDecoder,r=4096,i=``;try{for(;r>0;){let{done:e,value:a}=await t.read();if(e)break;let o=a.subarray(0,r);i+=n.decode(o,{stream:!0}),r-=o.byteLength}return i+n.decode()}catch{return i}finally{await t.cancel().catch(()=>void 0)}}async function Ce(e,t=!1){let n=P(e.id),r=e.title?.trim(),i=e.doi?.trim().replace(/^https?:\/\/(?:dx\.)?doi\.org\//i,``).replace(/^doi:\s*/i,``),a=i&&/^10\.\d{4,9}\/\S+$/.test(i)?i:void 0;if(!r&&!a&&!W(n))return H.peek(n)?.value??null;try{return await H.get(n,async()=>{let e=W(n),t={id:n,title:r},i=[e,a?`doi:${a}`:void 0].filter(e=>!!e);for(let r of i){let i=new URL(`https://api.openalex.org/works/${encodeURIComponent(r)}`);i.searchParams.set(`select`,`id,title,cited_by_count,locations`);let a=await xe(i),o=a===null?null:me(a,t);if(o)return U(n,o),o;r===e&&ve(n)}if(!r||!F(r))throw new G;let o=new URL(`https://api.openalex.org/works`);o.searchParams.set(`search`,r),o.searchParams.set(`per-page`,`5`),o.searchParams.set(`select`,`id,title,cited_by_count,locations`);let s=await xe(o,!0),c=s===null?null:he(s,{id:n,title:r});if(c===null)throw new G;return U(n,c),c},t)}catch(e){if(e instanceof G)return null;throw e}}function we(e){return A(e).match(/\/([a-f0-9]{40})(?:[?#]|$)/i)?.[1]??g(e.id,e.doi)?.value?.paperId}function Te(e,t){return{citationCount:t.citationCount,url:A({...e,paperId:t.paperId}),source:`Semantic Scholar`}}function K(e){let t=[g(e.id,e.doi,we(e)),k(e.id)].filter(e=>e?.value).sort((e,t)=>t.at-e.at)[0];return t?.value?{...t,value:Te(e,t.value)}:void 0}function q(e){let t=K(e);if(t)return t;let n=_e(e.id);return n?.value?{...n,value:{...n.value,source:`OpenAlex`}}:void 0}function Ee(e){return q(e)?.value?.url??A(e)}async function De(e,t=!1){let n=q(e);if(!t&&n?.value?.source===`Semantic Scholar`&&!n.stale)return n.value;let r,i=we(e);for(let n of[()=>de({...e,paperId:i},t),()=>te(e.id,e.doi,i,t)])try{let t=await n();if(t)return Te(e,t)}catch(e){r=e}if(K(e))throw r??Error(`Could not refresh cached citations`);if(!t&&n?.value&&!n.stale)return n.value;try{let n=await Ce(e,t),r=K(e);if(r?.value)return r.value;if(n)return{...n,source:`OpenAlex`}}catch(e){r=e}if(n?.value)throw r??Error(`Could not refresh cached citations`);if(r)throw r;return null}function J(e){let t=e.trim().replace(/v\d+$/i,``);if(!/^(?:\d{4}\.\d{4,5}|[a-z-]+(?:\.[a-z]{2})?\/\d{7})$/i.test(t))throw Error(`Invalid arXiv ID`);return t}let Oe=new Map,Y=new Map,ke=`arxivhub:alphaxiv:retry-at`,X=0;function Z(){try{let e=Number(localStorage.getItem(ke));Number.isFinite(e)&&(X=Math.max(X,e))}catch{}if(X>Date.now())throw Error(`alphaXiv rate limited`)}function Q(e){let t=Date.now(),n=e?.trim()??``,r=/^\d+$/.test(n)?t+Number(n)*1e3:Date.parse(n);X=Math.max(t+6e4,Number.isFinite(r)?r:0);try{localStorage.setItem(ke,String(X))}catch{}throw Error(`alphaXiv rate limited`)}async function Ae(e){Z();let t=await fetch(`https://r.jina.ai/${e}`,{credentials:`omit`,headers:{Accept:`text/plain`},signal:AbortSignal.timeout(12e3)});if(t.status===429&&Q(t.headers.get(`retry-after`)),t.status===404)return null;if(!t.ok)throw Error(`alphaXiv Reader ${t.status}`);let n=await t.text();if(/Target URL returned error 429/i.test(n)&&Q(null),/Target URL returned error 404/i.test(n))return null;if(/Target URL returned error [45]\d\d/i.test(n))throw Error(`alphaXiv source unavailable`);let r=`Markdown Content:`,i=n.includes(r)?n.slice(n.indexOf(r)+17).trim():n.trim();return JSON.parse(i)}async function je(e,t=!1){let n=J(e),r=Oe.get(n),i=r?Date.now()-r.at:1/0;if(!t&&r&&i>=0&&i<(r.value===null?5:15)*60*1e3)return r.value;let a=Y.get(n);return a||(a=(async()=>{Z();let e=`https://api.alphaxiv.org/papers/v3/${encodeURIComponent(n)}/preview`,t;try{let n=await fetch(e,{credentials:`omit`,signal:AbortSignal.timeout(1e4)});if(n.status===429&&Q(n.headers.get(`retry-after`)),n.status===404)return null;if(!n.ok)throw Error(`alphaXiv ${n.status}`);t=await n.json()}catch(n){if(!(n instanceof TypeError)&&!(n instanceof DOMException))throw n;if(t=await Ae(e),t===null)return null}if(!t||typeof t!=`object`||Array.isArray(t)||!(`universal_paper_id`in t)||typeof t.universal_paper_id!=`string`||J(t.universal_paper_id)!==n)throw Error(`Invalid alphaXiv paper identity`);return t})().then(e=>(Oe.set(n,{value:e,at:Date.now()}),e)).finally(()=>Y.delete(n)),Y.set(n,a)),a}function Me(e,t){let n=J(t);if(e===null)return null;if(!e||typeof e!=`object`||!(`universal_paper_id`in e)||typeof e.universal_paper_id!=`string`||J(e.universal_paper_id)!==n||!(`metrics`in e)||!e.metrics||typeof e.metrics!=`object`||!(`public_total_votes`in e.metrics))throw Error(`Invalid alphaXiv paper or like count`);let r=e.metrics.public_total_votes;if(typeof r!=`number`||!Number.isSafeInteger(r)||r<0)throw Error(`Invalid alphaXiv like count`);return r}function Ne(e){try{return Fe.peek(J(e))}catch{return}}async function Pe(e,t=!1){let n=J(e);return Fe.get(n,async()=>Me(await je(n,t),n),t)}let Fe=t({namespace:`alphaxiv-likes:v1`,ttl:9e5,missingTtl:3e5,valid:e=>typeof e==`number`&&Number.isSafeInteger(e)&&e>=0}),Ie=[`alphaxiv`,`paperlayer`,`hjfy`,`papers-cool`,`pith`,`pwc`,`gist-science`,`arxivmax`,`openreview`,`emergent-mind`],Le=[`xiaohongshu`,`x-search`,`reddit-search`,`zhihu-search`,`hf-papers`,`google-scholar`],Re=[{id:`pdf`,label:`PDF`},{id:`html`,label:`HTML`},{id:`md`,label:`MD`},{id:`src`,label:`TeX`},{id:`tb`,label:`TB`},{id:`doi`,label:`DOI`},{id:`bibtex`,label:`BibTex`}];function ze(e){let t=`10.48550/arXiv.${e.id.replace(/v\d+$/i,``)}`,n=e.doi?.trim().replace(/^doi:\s*/i,``)??``;if(/^https?:\/\//i.test(n))try{let e=new URL(n);n=/^(?:dx\.)?doi\.org$/i.test(e.hostname)?decodeURIComponent(e.pathname.slice(1)):``}catch{return t}return/^10\.\d{4,9}\/\S+$/.test(n)&&!/^10\.48550\/arxiv\./i.test(n)?n:t}function Be(e,t){let n=encodeURIComponent(t.id).replaceAll(`%2F`,`/`);switch(e){case`pdf`:case`html`:case`src`:return`https://arxiv.org/${e}/${n}`;case`md`:return`https://www.arxiv2md.org/api/markdown?url=${encodeURIComponent(t.id)}`;case`tb`:return`https://arxiv.org/tb/${n.replace(/v\d+$/i,``)}`;case`doi`:return`https://doi.org/${encodeURIComponent(ze(t)).replaceAll(`%2F`,`/`)}`;case`bibtex`:return null}}function Ve(e){let t=e.replace(/\\[a-zA-Z]+/g,``).toLowerCase().normalize(`NFKD`).replace(/[^\p{ASCII}]/gu,``).replace(/\./g,`-`).replace(/[^a-z0-9\s-]/g,``).trim().replace(/\s+/g,`-`).replace(/-+/g,`-`).replace(/^-+|-+$/g,``);if(t.length>45){let e=t[45]===`-`;if(t=t.slice(0,45),!e){let e=t.lastIndexOf(`-`);t=e>0?t.slice(0,e):``}}return t}function He(e,t){if(e.id===`catalyzex`){let n=Ve(t.title??``);return n?e.url.replace(`{titleSlug}`,n):`${e.home}s/${encodeURIComponent(t.title?.trim()||t.id)}`}if(e.id===`moonlight`){let n=(t.title??``).replace(/\\[a-zA-Z]+/g,``).normalize(`NFKD`).toLowerCase().replace(/[^a-z0-9\s-]/g,``).trim().replace(/[\s-]+/g,`-`).replace(/^-+|-+$/g,``);return n?e.url.replace(`{titleSlug}`,n):`${e.home}/explore`}let n=encodeURIComponent(t.title||t.id);return e.url.replaceAll(`{id}`,t.id).replaceAll(`{titleEnc}`,n).replaceAll(`{doi}`,t.doi??`10.48550/arXiv.${t.id}`)}let $=[{id:`alphaxiv`,label:`alphaXiv`,labelEn:`alphaXiv`,urlTemplate:`https://www.alphaxiv.org/abs/{id}`,home:`https://www.alphaxiv.org/`},{id:`paperlayer`,label:`Paperlayer`,labelEn:`Paperlayer`,urlTemplate:`https://paperlayer.ai/abs/{id}/zh`,home:`https://paperlayer.ai/`},{id:`hjfy`,label:`幻觉翻译`,labelEn:`HJFY`,urlTemplate:`https://hjfy.top/arxiv/{id}`,home:`https://hjfy.top/`},{id:`papers-cool`,label:`Cool Papers`,labelEn:`Papers.cool`,urlTemplate:`https://papers.cool/arxiv/{id}`,home:`https://papers.cool/`},{id:`pith`,label:`Pith`,labelEn:`Pith`,urlTemplate:`https://pith.science/paper/{id}`,home:`https://pith.science/`},{id:`pwc`,label:`Papers with Code`,labelEn:`Papers with Code`,urlTemplate:`https://paperswithcode.co/paper/{id}`,home:`https://paperswithcode.co/`},{id:`gist-science`,label:`Gist Science`,labelEn:`Gist Science`,urlTemplate:`https://gist.science/zh/paper/{id}`,home:`https://gist.science/`},{id:`arxivmax`,label:`arXivMax`,labelEn:`arXivMax`,urlTemplate:`https://www.arxivmax.com/papers/{id}`,home:`https://www.arxivmax.com/`},{id:`openreview`,label:`OpenReview`,labelEn:`OpenReview`,urlTemplate:`https://openreview.net/search?term={titleEnc}`,home:`https://openreview.net/`},{id:`emergent-mind`,label:`Emergent Mind`,labelEn:`Emergent Mind`,urlTemplate:`https://www.emergentmind.com/papers/{id}`,home:`https://www.emergentmind.com/`},{id:`xiaohongshu`,label:`小红书搜索`,labelEn:`Xiaohongshu`,urlTemplate:`https://www.xiaohongshu.com/search_result?keyword={titleEnc}`,home:`https://www.xiaohongshu.com/`},{id:`x-search`,label:`X 讨论搜索`,labelEn:`X Search`,urlTemplate:`https://x.com/search?q={titleEnc}`,home:`https://x.com/`},{id:`reddit-search`,label:`Reddit 搜索`,labelEn:`Reddit Search`,urlTemplate:`https://www.reddit.com/search/?q={titleEnc}`,home:`https://www.reddit.com/`},{id:`zhihu-search`,label:`知乎搜索`,labelEn:`Zhihu Search`,urlTemplate:`https://www.zhihu.com/search?type=content&q={titleEnc}`,home:`https://www.zhihu.com/`},{id:`hf-papers`,label:`Hugging Face Papers`,labelEn:`Hugging Face Papers`,urlTemplate:`https://huggingface.co/papers/{id}`,home:`https://huggingface.co/papers`},{id:`google-scholar`,label:`Google Scholar`,labelEn:`Google Scholar`,urlTemplate:`https://scholar.google.com/scholar_lookup?arxiv_id={id}`,home:`https://scholar.google.com/`}],Ue=Ie.map(e=>$.find(t=>t.id===e)),We=Le.map(e=>$.find(t=>t.id===e));function Ge(e,t){let n=$.find(t=>t.id===e);if(!n)throw Error(`Unknown paper navigation tool: `+e);return He({id:n.id,home:n.home,url:n.urlTemplate},t)}return e.DOCUMENT_ACTIONS=Re,e.PAPER_QUICK_IDS=Ie,e.PAPER_SOCIAL_IDS=Le,e.buildToolUrl=He,e.citationPageUrl=Ee,e.documentLinkUrl=Be,e.fetchAlphaXivLikes=Pe,e.fetchPaperCitations=De,e.getSiteUrl=Ge,e.paperDoi=ze,e.quickSites=Ue,e.readCachedAlphaXivLikes=Ne,e.readCachedPaperCitations=q,e.socialSites=We,e})({}); return ArxivHubShared; } // END ARXIVHUB SHARED const paperServices = createSharedPaperServices(fetchWithGM, { getItem: (key) => gmGet(`arxivhub-metrics:${key}`, null), setItem: (key, value) => gmSet(`arxivhub-metrics:${key}`, String(value)), removeItem: (key) => gmDelete(`arxivhub-metrics:${key}`), }); const BOOKMARK_COLORS = [ ['#b53b56', '#fcecf1'], ['#5264a1', '#eef0fd'], ['#69813b', '#f0f5df'], ['#278355', '#e7f4ea'], ['#7952a3', '#f1eafa'], ['#397ac1', '#e7f0fc'], ['#775f46', '#f4ede5'], ['#308584', '#e4f4f2'], ['#a54f43', '#f7e9e2'], ['#9b7613', '#fff4cf'], ]; const HUB_SITE = { id: 'hub', label: 'ArXiv Hub · 论桥', color: '#b31b1b', background: '#f8e0dc', url: (id) => `${HUB_URL}p/${id.replaceAll('/', '~')}` }; const BOOKMARK_SITES = paperServices.quickSites.map((site, index) => ({ ...site, color: BOOKMARK_COLORS[index % BOOKMARK_COLORS.length][0], background: BOOKMARK_COLORS[index % BOOKMARK_COLORS.length][1], url: (id, title) => paperServices.getSiteUrl(site.id, { id, title }), })); const SOCIAL_SITES = paperServices.socialSites.map((site) => ({ ...site, url: (id, title) => paperServices.getSiteUrl(site.id, { id, title }), })); // ── 共用样式与 UI ── // Scoped styles keep the native sidebar intact; bookmark rows share a fixed height. function ensureBridgeStyles() { if (document.getElementById('arxiv-bridge-styles')) return; const style = document.createElement('style'); style.id = 'arxiv-bridge-styles'; style.textContent = ` #arxivhub-document-links { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)) minmax(38px, 1.25fr); gap: 2px; width: 100%; margin: 0 0 6px; } #arxivhub-document-links .ab-document-link { display: flex; min-width: 0; align-items: center; justify-content: center; height: 36px; padding: 0; box-sizing: border-box; border: 1px solid #dfd2cf; border-radius: 6px; background: #fff8f6; color: #922222; font: 700 10px Arial, sans-serif; text-decoration: none; cursor: pointer; } #arxivhub-document-links .ab-document-link:hover { background: #f8e0dc; border-color: #b31b1b; } #arxivhub-document-links .ab-document-link:focus-visible { outline: 2px solid #b31b1b; outline-offset: 2px; } #arxivhub-document-links .ab-document-link[data-copied="true"] { color: #15803d; background: #ecfdf3; } #arxivhub-paper-metrics { display: flex; gap: 6px; margin: 0 0 6px; font: 12px Arial, "Microsoft YaHei", sans-serif; } #arxivhub-paper-metrics a { display: flex; flex: 1; min-width: 0; height: 30px; box-sizing: border-box; align-items: center; justify-content: center; gap: 5px; padding: 0 6px; border: 1px solid #eadbd6; border-radius: 8px; background: #fcebe6; color: #755650; text-decoration: none; white-space: nowrap; font-variant-numeric: tabular-nums; } #arxivhub-paper-metrics .ab-metric-icon { flex: 0 0 16px; width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; } #arxivhub-paper-metrics a:hover { color: #b31b1b; border-color: #b31b1b; } #arxivhub-paper-metrics a:focus-visible { outline: 2px solid #b31b1b; outline-offset: 2px; } #arxivhub-bookmarks { display: flex; flex-direction: column; gap: 4px; width: 100%; margin: 0 0 10px; padding: 0; overflow: hidden; font-family: Arial, "Microsoft YaHei", "PingFang SC", sans-serif; } #arxivhub-bookmarks .ab-bookmark { display: flex; align-items: center; gap: 7px; width: 100%; height: 36px; padding: 0 8px; box-sizing: border-box; border: 1px solid var(--ab-background); border-left: 3px solid var(--ab-color); border-radius: 6px; background: var(--ab-background); color: #292626; font-size: 13px; font-weight: 600; letter-spacing: 0; line-height: 1.2; text-decoration: none; transition: box-shadow 140ms ease, border-color 140ms ease; } #arxivhub-bookmarks .ab-bookmark:hover { border-color: var(--ab-color); box-shadow: 0 2px 6px rgba(0, 0, 0, .1); } #arxivhub-bookmarks .ab-bookmark:focus-visible { outline: 2px solid var(--ab-color); outline-offset: 2px; } #arxivhub-bookmarks .ab-bookmark > img { padding: 2px; border: 1px solid rgba(0, 0, 0, .1); border-radius: 50%; background: #fff; box-sizing: border-box; } #arxivhub-bookmarks .ab-bookmark > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } #arxivhub-bookmarks .ab-hub { height: 40px; margin-bottom: 2px; color: #921b1b; font-size: 14px; font-weight: 700; } #arxivhub-bookmarks .ab-sites { display: flex; flex-direction: column; gap: 4px; } #arxivhub-bookmarks .ab-social { display: flex; flex-direction: column; gap: 4px; min-width: 0; width: 100%; padding: 3px 0 0; } #arxivhub-bookmarks .ab-social-row { display: flex; flex: 0 0 auto; flex-wrap: nowrap; justify-content: flex-start; gap: 4px; min-width: 0; width: 100%; max-width: 100%; overflow-x: auto; scrollbar-width: thin; } #arxivhub-bookmarks .ab-social-custom:empty { display: none; } #arxivhub-bookmarks .ab-social-link { display: flex; flex: 0 0 32px; align-items: center; justify-content: center; width: 32px; height: 32px; padding: 0; box-sizing: border-box; border: 1px solid #dedbd7; border-radius: 50%; background: #fff; color: #9b2929; font: 600 14px Arial, sans-serif; box-shadow: 0 1px 2px rgba(0,0,0,.08); text-decoration: none; cursor: pointer; } #arxivhub-bookmarks .ab-social-link:hover { background: #fcecea; border-color: #b31b1b; } #arxivhub-bookmarks .ab-social-link:focus-visible { outline: 2px solid #b31b1b; outline-offset: 2px; } #arxivhub-bookmarks .ab-social-link img { border-radius: 50%; } #arxivhub-bookmarks .ab-social-link span { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); } #arxivhub-bookmarks .ab-add-site { font-size: 23px; line-height: 1; } #arxivhub-custom-sites-dialog { width: min(430px, calc(100vw - 48px)); padding: 22px; border: 1px solid #dec5b8; border-radius: 14px; background: #fbefe5; color: #392822; font: 14px/1.6 Arial, "Microsoft YaHei", sans-serif; box-sizing: border-box; } #arxivhub-custom-sites-dialog::backdrop { background: rgba(35, 22, 16, .35); } #arxivhub-custom-sites-dialog h2 { margin: 0 0 12px; font-size: 19px; } #arxivhub-custom-sites-dialog label { display: block; margin: 10px 0 4px; } #arxivhub-custom-sites-dialog input { width: 100%; box-sizing: border-box; margin-top: 3px; padding: 8px; border: 1px solid #d9baaa; border-radius: 6px; background: #fffaf6; color: #392822; font: inherit; } #arxivhub-custom-sites-dialog p { font-size: 12px; margin: 8px 0; } #arxivhub-custom-sites-dialog button { padding: 6px 12px; border: 1px solid #ceb0a0; border-radius: 6px; background: #fffaf6; color: #813d27; font: inherit; cursor: pointer; } #arxivhub-custom-sites-dialog .ab-custom-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 12px; } #arxivhub-custom-sites-dialog .ab-custom-list { margin-top: 16px; padding-top: 8px; border-top: 1px solid #dec5b8; } #arxivhub-custom-sites-dialog .ab-custom-row { display: flex; align-items: center; gap: 6px; padding: 5px 0; } #arxivhub-custom-sites-dialog .ab-custom-row span { flex: 1; min-width: 0; overflow-wrap: anywhere; } #arxivhub-custom-sites-dialog [role="alert"] { color: #a32323; } @media (max-width: 640px) { #arxivhub-bookmarks .ab-social-link { flex-basis: 44px; width: 44px; height: 44px; } #arxivhub-document-links .ab-document-link { height: 44px; font-size: 11px; } } @media (max-width: 360px) { #arxivhub-bookmarks .ab-social-row { gap: 3px; overflow: hidden; } #arxivhub-bookmarks .ab-social-link { flex-basis: 32px; width: 32px; height: 32px; } } @media (prefers-reduced-motion: reduce) { #arxivhub-bookmarks .ab-bookmark { transition: none; } } .ab-card { --ab-row-height: 38px; width: 100%; margin: 0; padding: 0 10px; border: 0; border-bottom: 2px solid #dedbd7; background: #fff; box-sizing: border-box; font-family: Arial, "Microsoft YaHei", "PingFang SC", sans-serif; } .ab-card .ab-row { display: flex; align-items: center; gap: 8px; min-height: var(--ab-row-height); box-sizing: border-box; } .ab-card a { text-decoration: none; } .ab-summary-semantic { --ab-title: #185d8d; background: #f7fbff; } .ab-summary-arxiv { --ab-title: #b31b1b; background: #fffaf7; } .ab-summary-header { justify-content: space-between; } .ab-card .ab-summary-title { color: var(--ab-title); font-size: 14px; font-weight: 700; line-height: 1.25; } .ab-card .ab-summary-toggle { flex: 0 0 auto; margin: 0; padding: 3px 6px; border: 1px solid #d4cbc5; border-radius: 4px; background: #fff; color: #666; font: 11px/1.2 Arial, "Microsoft YaHei", sans-serif; cursor: pointer; } .ab-summary-body:not([hidden]) { padding-bottom: 8px; } .ab-card [hidden] { display: none !important; } .ab-card a:focus-visible, .ab-card button:focus-visible, .ab-nav-link:focus-visible { outline: 2px solid #b42335; outline-offset: 2px; } .ab-tldr-message { padding: 12px 0 4px; color: #666; font-size: 13px; line-height: 1.5; } .ab-card p.ab-tldr-message { margin: 0; padding: 0 0 4px; } .ab-nav-link { display: inline-flex; align-items: center; justify-content: center; height: 48px; margin: 0; padding: 0 14px; border: 0; border-bottom: 2px solid transparent; background: transparent; color: #4b5563; font-size: 16px; font-weight: 400; line-height: 1; text-decoration: none; cursor: pointer; white-space: nowrap; box-sizing: border-box; } .ab-nav-link:hover, .ab-nav-link:focus-visible { color: var(--ab-hover); border-bottom-color: var(--ab-hover); } .ab-visual-status { position: fixed; top: 16px; right: 16px; z-index: 2147483000; display: inline-flex; align-items: center; gap: 8px; max-width: min(360px, calc(100vw - 32px)); padding: 10px 14px; border: 1px solid; border-radius: 12px; box-shadow: 0 8px 28px rgba(0, 0, 0, .28); box-sizing: border-box; font: 13px/1.35 Arial, "Microsoft YaHei", "PingFang SC", sans-serif; backdrop-filter: blur(12px); } .ab-visual-status a { color: inherit; font-weight: 700; text-decoration: none; white-space: nowrap; } .ab-visual-status strong { font-weight: 700; } .ab-visual-status[data-state="unavailable"] { border-color: rgba(248, 113, 113, .55); background: rgba(69, 10, 10, .88); color: #fecaca; } .ab-visual-status[data-state="available"] { border-color: rgba(74, 222, 128, .5); background: rgba(5, 46, 22, .88); color: #bbf7d0; } `; (document.head || document.documentElement).appendChild(style); } // 统一外链属性,所有服务继续在新标签页打开。 function createExternalLink(url, title = '') { const link = document.createElement('a'); link.href = url; link.target = '_blank'; link.rel = 'noopener noreferrer'; link.title = title; return link; } // 两种摘要共用卡片和折叠逻辑,正文加载不影响用户选择的折叠状态。 function createSummaryCard({ id, arxivId, url, title, tooltip, theme, bodyKey, collapsed, onExpand }) { const card = document.createElement('section'); card.id = id; card.dataset.arxivId = arxivId; card.className = `ab-card ab-summary-${theme}`; const header = document.createElement('div'); header.className = 'ab-row ab-summary-header'; const link = createExternalLink(url, tooltip); link.className = 'ab-summary-title'; link.textContent = title; const body = document.createElement('div'); body.id = `${id}-body`; body.className = 'ab-summary-body'; body.dataset[bodyKey] = 'true'; body.setAttribute('aria-live', 'polite'); const toggle = document.createElement('button'); toggle.type = 'button'; toggle.className = 'ab-summary-toggle'; toggle.setAttribute('aria-controls', body.id); // 同步可见状态、按钮文字与无障碍属性。 const setCollapsed = (value) => { body.hidden = value; body.style.display = value ? 'none' : ''; toggle.textContent = value ? '展开' : '收起'; toggle.setAttribute('aria-expanded', String(!value)); }; setCollapsed(collapsed); toggle.addEventListener('click', () => { setCollapsed(!body.hidden); if (!body.hidden) onExpand?.(card); }); header.append(link, toggle); card.append(header, body); return card; } // ── 获取 arXiv ID ── function getArxivId() { const match = location.pathname.match(/^\/abs\/(.+?)\/?$/); if (!match) return null; try { const id = decodeURIComponent(match[1]); return /^(?:\d{4}\.\d{4,5}|[a-z][a-z.-]*\/\d{7})(?:v\d+)?$/i.test(id) ? id : null; } catch { return null; } } function getPaperTitle() { const meta = document.querySelector('meta[name="citation_title"]'); if (meta?.content.trim()) return normalizeText(meta.content); const heading = document.querySelector('h1.title, h1'); if (!heading) return getArxivId(); const title = heading.cloneNode(true); title.querySelectorAll('.descriptor').forEach((node) => node.remove()); return normalizeText(title.textContent) || getArxivId(); } function getPaperContext() { const id = (getArxivId() || '').replace(/v\d+$/i, ''); const doi = document.querySelector('meta[name="citation_doi"]')?.content?.trim(); return { id, title: getPaperTitle() || id, doi: doi || undefined }; } // The shared website code receives a public GET-only GM transport and private GM storage. function fetchWithGM(input, options = {}) { const url = new URL(String(input)); const allowed = ['api.semanticscholar.org', 'www.semanticscholar.org', 'r.jina.ai', 'api.alphaxiv.org', 'api.openalex.org']; if (url.protocol !== 'https:' || !allowed.includes(url.hostname) || url.username || url.password || (options.method && options.method !== 'GET')) { return Promise.reject(new Error('Unsupported paper request')); } return new Promise((resolve, reject) => { let request; let finished = false; const finish = (callback, value) => { if (finished) return; finished = true; options.signal?.removeEventListener('abort', abort); callback(value); }; const abort = () => { request?.abort?.(); finish(reject, options.signal?.reason || new DOMException('Aborted', 'AbortError')); }; if (options.signal?.aborted) { abort(); return; } options.signal?.addEventListener('abort', abort, { once: true }); const headers = Object.fromEntries(new Headers(options.headers || {})); if (url.hostname === 'api.semanticscholar.org') { const key = getSemanticScholarApiKey(); if (key) headers['x-api-key'] = key; } try { request = GM_xmlhttpRequest({ method: 'GET', url: url.href, headers, anonymous: true, timeout: 25000, onload: (response) => { try { if (!response.status) throw new Error('Paper request failed'); const responseHeaders = new Headers(); for (const line of (response.responseHeaders || '').split(/\r?\n/)) { const colon = line.indexOf(':'); if (colon > 0) responseHeaders.append(line.slice(0, colon).trim(), line.slice(colon + 1).trim()); } finish(resolve, new Response([204, 205, 304].includes(response.status) ? null : response.responseText, { status: response.status, headers: responseHeaders })); } catch (error) { finish(reject, error); } }, onerror: () => finish(reject, new Error('Paper request failed')), ontimeout: () => finish(reject, new Error('Paper request timed out')), onabort: () => finish(reject, new DOMException('Aborted', 'AbortError')), }); } catch (error) { finish(reject, error); } }); } function customSiteUrl(template, ctx) { const replacements = { id: ctx.id, title: ctx.title || ctx.id, url: `https://arxiv.org/abs/${ctx.id}`, doi: paperServices.paperDoi(ctx) }; if (/\{(?!id\}|title\}|url\}|doi\})[^}]*\}/.test(template)) throw new Error('网址模板只支持 {id}、{title}、{url}、{doi}。'); const value = template.replace(/\{(id|title|url|doi)\}/g, (_match, key) => encodeURIComponent(replacements[key])); const url = new URL(value); if (!['https:', 'http:'].includes(url.protocol) || url.username || url.password) throw new Error('请使用不含账号密码的 HTTP 或 HTTPS 网址。'); return url.href; } function loadCustomSites() { const sites = gmGet(CUSTOM_SITE_STORAGE, []); if (!Array.isArray(sites)) return []; return sites.filter((site) => { if (!site || typeof site.id !== 'string' || !/^[\w-]{1,80}$/.test(site.id) || typeof site.name !== 'string' || !site.name.trim() || typeof site.url !== 'string') return false; try { customSiteUrl(site.url, { id: '1706.03762', title: 'Paper title' }); return true; } catch { return false; } }).slice(0, 30); } function syncCustomSites(social, ctx) { const sites = loadCustomSites(); const signature = JSON.stringify(sites); const customRow = social.querySelector('.ab-social-custom'); if (!customRow) return; if (customRow.dataset.customSites !== signature) { customRow.querySelectorAll('[data-custom-site]').forEach((node) => node.remove()); for (const site of sites) { const link = createExternalLink(customSiteUrl(site.url, ctx), site.name); link.className = 'ab-social-link'; link.dataset.customSite = site.id; link.setAttribute('aria-label', site.name); link.textContent = Array.from(site.name.trim()).slice(0, 2).join(''); customRow.appendChild(link); } customRow.dataset.customSites = signature; } for (const link of customRow.querySelectorAll('[data-custom-site]')) { const site = sites.find((item) => item.id === link.dataset.customSite); const href = customSiteUrl(site.url, ctx); if (link.href !== href) link.href = href; } } function openCustomSitesDialog() { if (document.getElementById(CUSTOM_DIALOG_ID)) return; const dialog = document.createElement('dialog'); dialog.id = CUSTOM_DIALOG_ID; dialog.setAttribute('aria-label', '自定义跳转网站'); const heading = document.createElement('h2'); heading.textContent = '自定义跳转网站'; const form = document.createElement('form'); const nameLabel = document.createElement('label'); nameLabel.textContent = '名称'; const name = document.createElement('input'); name.name = 'name'; name.required = true; name.maxLength = 32; nameLabel.appendChild(name); const urlLabel = document.createElement('label'); urlLabel.textContent = '网址模板'; const url = document.createElement('input'); url.name = 'url'; url.required = true; url.maxLength = 2048; url.placeholder = 'https://example.com/search?q={title}'; urlLabel.appendChild(url); const hint = document.createElement('p'); hint.textContent = '可使用 {id}、{title}、{url}、{doi},自动填入当前论文。标题和链接会自动编码。'; const error = document.createElement('p'); error.setAttribute('role', 'alert'); const actions = document.createElement('div'); actions.className = 'ab-custom-actions'; const cancel = document.createElement('button'); cancel.type = 'button'; cancel.textContent = '取消'; cancel.addEventListener('click', () => dialog.close()); const save = document.createElement('button'); save.type = 'submit'; save.textContent = '保存'; actions.append(cancel, save); const list = document.createElement('div'); list.className = 'ab-custom-list'; let editing = null; const renderList = () => { list.replaceChildren(); for (const site of loadCustomSites()) { const row = document.createElement('div'); row.className = 'ab-custom-row'; const label = document.createElement('span'); label.textContent = site.name; const edit = document.createElement('button'); edit.type = 'button'; edit.textContent = '编辑'; edit.setAttribute('aria-label', `编辑 ${site.name}`); edit.addEventListener('click', () => { editing = site.id; name.value = site.name; url.value = site.url; error.textContent = ''; name.focus(); }); const remove = document.createElement('button'); remove.type = 'button'; remove.textContent = '删除'; remove.setAttribute('aria-label', `删除 ${site.name}`); remove.addEventListener('click', () => { gmSet(CUSTOM_SITE_STORAGE, loadCustomSites().filter((item) => item.id !== site.id)); if (editing === site.id) { editing = null; form.reset(); } renderList(); main(); }); row.append(label, edit, remove); list.appendChild(row); } }; form.addEventListener('submit', (event) => { event.preventDefault(); try { if (!name.value.trim()) throw new Error('请输入网站名称。'); let template = url.value.trim(); if (!/^[a-z][a-z\d+.-]*:/i.test(template)) template = `https://${template}`; customSiteUrl(template, getPaperContext()); const sites = loadCustomSites(); if (!editing && sites.length >= 30) throw new Error('最多保存 30 个自定义网站。'); const site = { id: editing || crypto.randomUUID(), name: name.value.trim(), url: template }; gmSet(CUSTOM_SITE_STORAGE, editing ? sites.map((item) => item.id === editing ? site : item) : [...sites, site]); main(); dialog.close(); } catch (reason) { error.textContent = reason.message || '请检查网址模板。'; } }); form.append(nameLabel, urlLabel, hint, error, actions); dialog.append(heading, form, list); dialog.addEventListener('close', () => dialog.remove(), { once: true }); document.body.appendChild(dialog); renderList(); dialog.showModal(); name.focus(); } function ensurePaperBookmarks() { const arxivId = getArxivId(); if (!arxivId) return null; const id = arxivId.replace(/v\d+$/i, ''); const title = getPaperTitle() || id; let nav = document.getElementById(BOOKMARKS_ID); if (!nav) { nav = document.createElement('nav'); nav.id = BOOKMARKS_ID; nav.setAttribute('aria-label', 'ArXiv Hub · 论桥 论文入口'); const sites = document.createElement('div'); sites.className = 'ab-sites'; for (const site of [HUB_SITE, ...BOOKMARK_SITES]) { if (site.id === 'alphaxiv' && !SHOW_ALPHAXIV_CARD) continue; const link = createExternalLink(site.url(id, title)); link.dataset.bookmark = site.id; link.className = `ab-bookmark${site.id === 'hub' ? ' ab-hub' : ''}`; link.style.setProperty('--ab-color', site.color); link.style.setProperty('--ab-background', site.background); appendBrand(link, site.label, BOOKMARK_ICONS[site.id], 26, 0); if (site.id === 'hub') nav.appendChild(link); else sites.appendChild(link); } nav.appendChild(sites); const social = document.createElement('div'); social.className = 'ab-social'; social.setAttribute('role', 'group'); social.setAttribute('aria-label', '论文讨论与检索'); const defaults = document.createElement('div'); defaults.className = 'ab-social-row ab-social-defaults'; const add = document.createElement('button'); add.type = 'button'; add.className = 'ab-social-link ab-add-site'; add.textContent = '+'; add.setAttribute('aria-label', '添加自定义网站'); add.title = '添加自定义网站'; add.addEventListener('click', openCustomSitesDialog); defaults.appendChild(add); for (const site of SOCIAL_SITES) { const link = createExternalLink(site.url(id, title)); link.dataset.bookmark = site.id; link.className = 'ab-social-link'; link.setAttribute('aria-label', site.label); appendBrand(link, site.label, BOOKMARK_ICONS[site.id], 22, 0); defaults.appendChild(link); } const custom = document.createElement('div'); custom.className = 'ab-social-row ab-social-custom'; social.append(defaults, custom); nav.appendChild(social); } for (const site of [HUB_SITE, ...BOOKMARK_SITES, ...SOCIAL_SITES]) { const link = nav.querySelector(`[data-bookmark="${site.id}"]`); if (!link) continue; const href = site.url(id, title); if (link.href !== href) link.href = href; const tooltip = `${site.label} · ${title}`; if (link.title !== tooltip) link.title = tooltip; } syncCustomSites(nav.querySelector('.ab-social'), getPaperContext()); if (nav.dataset.arxivId !== arxivId) nav.dataset.arxivId = arxivId; return nav; } function ensureDocumentLinks(sidebar) { const id = getArxivId(); if (!id) return null; const canonical = id.replace(/v\d+$/i, ''); // 油猴脚本顶部隐藏 DOI,避免与网页端的复制按钮重复。 const formats = paperServices.DOCUMENT_ACTIONS.filter((format) => format.id !== 'doi'); const titles = { pdf: 'PDF', html: 'HTML', md: 'Markdown 全文', src: 'TeX 源码', tb: 'arXiv 外部引用(Trackbacks)', doi: 'DOI', bibtex: '复制 BibTeX' }; let nav = document.getElementById(DOCUMENT_LINKS_ID); if (!nav) { nav = document.createElement('nav'); nav.id = DOCUMENT_LINKS_ID; nav.setAttribute('aria-label', '论文原文'); for (const format of formats) { const link = format.id === 'bibtex' ? document.createElement('button') : createExternalLink(''); link.className = 'ab-document-link'; link.dataset.documentFormat = format.id; link.title = titles[format.id] || format.label; link.setAttribute('aria-label', titles[format.id] || format.label); link.textContent = format.label; if (format.id === 'bibtex') { link.type = 'button'; link.addEventListener('click', () => copyPaperBibtex(link)); } nav.appendChild(link); } } for (const format of formats) { if (format.id === 'bibtex') continue; let href = paperServices.documentLinkUrl(format.id, { ...getPaperContext(), id }); // Prefer the native download URLs, especially the versioned HTML link. for (const nativeLink of sidebar.querySelectorAll('.full-text a[href]')) { try { const url = new URL(nativeLink.href, location.href); const match = url.pathname.match(/^\/(pdf|html|src)\/(.+)$/); if (url.protocol !== 'https:' || !/^(www\.)?arxiv\.org$/i.test(url.hostname) || match?.[1] !== format.id) continue; if (decodeURIComponent(match[2]).replace(/\.pdf$/i, '').replace(/v\d+$/i, '') !== canonical) continue; href = url.href; break; } catch { continue; } } const link = nav.querySelector(`[data-document-format="${format.id}"]`); if (link.href !== href) link.href = href; } return nav; } async function copyPaperBibtex(button) { const ctx = getPaperContext(); const authors = [...document.querySelectorAll('meta[name="citation_author"]')].map((meta) => meta.content.trim()).filter(Boolean); const date = document.querySelector('meta[name="citation_date"], meta[name="citation_publication_date"]')?.content; const year = date?.match(/\b\d{4}\b/)?.[0] || (/^\d{4}\./.test(ctx.id) ? String(2000 + Number(ctx.id.slice(0, 2))) : ''); const category = document.querySelector('.primary-subject')?.textContent?.match(/\(([^)]+)\)/)?.[1]; const fields = [ ['title', ctx.title], ['author', authors.join(' and ')], ['year', year], ['eprint', ctx.id], ['archivePrefix', 'arXiv'], ['primaryClass', category], ['url', `https://arxiv.org/abs/${ctx.id}`], ['doi', paperServices.paperDoi(ctx)], ].filter(([, value]) => value); const bibtex = `@article{arxiv${ctx.id.replace(/[^a-z0-9]/gi, '')},\n${fields.map(([key, value]) => ` ${key}={${value}}`).join(',\n')}\n}`; try { if (typeof GM_setClipboard === 'function') GM_setClipboard(bibtex, 'text'); else await navigator.clipboard.writeText(bibtex); button.textContent = '✓'; button.dataset.copied = 'true'; } catch { button.textContent = '!'; button.title = '复制失败,请重试'; } clearTimeout(button.copyTimer); button.copyTimer = setTimeout(() => { button.textContent = 'BibTex'; button.dataset.copied = 'false'; button.title = '复制 BibTeX'; }, 600); } // 用统一的线性 SVG 区分引用与点赞,避免依赖字体或远程图标。 function createMetricIcon(kind) { const ns = 'http://www.w3.org/2000/svg'; const icon = document.createElementNS(ns, 'svg'); icon.setAttribute('class', 'ab-metric-icon'); icon.setAttribute('viewBox', '0 0 24 24'); icon.setAttribute('aria-hidden', 'true'); icon.setAttribute('focusable', 'false'); const path = document.createElementNS(ns, 'path'); path.setAttribute('d', kind === 'citations' ? 'M9 6H5a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h4V6Zm0 8c0 3-2 5-5 5M21 6h-4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h4V6Zm0 8c0 3-2 5-5 5' : 'M7 10H4a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h3V10Zm0 0 5-7a2 2 0 0 1 2 2l-1 5h6a2 2 0 0 1 2 2l-2 7a2 2 0 0 1-2 2H7'); icon.appendChild(path); return icon; } function ensurePaperMetrics() { const ctx = getPaperContext(); if (!ctx.id) return null; let row = document.getElementById(METRICS_ID); if (!row) { row = document.createElement('div'); row.id = METRICS_ID; for (const [key, label] of [['citations', '引用'], ['likes', '点赞']]) { const link = createExternalLink(''); link.dataset.metric = key; link.setAttribute('aria-label', label); const value = document.createElement('span'); value.className = 'ab-metric-value'; value.textContent = `${label} -`; link.append(createMetricIcon(key), value); row.appendChild(link); } } const requestKey = JSON.stringify(ctx); if (row.dataset.requestKey === requestKey) return row; row.dataset.requestKey = requestKey; for (const [key, label, source, read, load, fallback] of [ ['citations', '引用', 'Semantic Scholar', () => paperServices.readCachedPaperCitations(ctx), () => paperServices.fetchPaperCitations(ctx, true), () => paperServices.citationPageUrl(ctx)], ['likes', '点赞', 'alphaXiv', () => paperServices.readCachedAlphaXivLikes(ctx.id), () => paperServices.fetchAlphaXivLikes(ctx.id, true), () => `https://www.alphaxiv.org/abs/${ctx.id}`], ]) { const link = row.querySelector(`[data-metric="${key}"]`); const render = (refreshFailed = false) => { const cached = read(); const value = cached?.value; const count = key === 'citations' ? value?.citationCount : value; const valid = Number.isSafeInteger(count) && count >= 0; link.querySelector('.ab-metric-value').textContent = `${label} ${valid ? count.toLocaleString('zh-CN') : '-'}`; link.dataset.count = valid ? String(count) : '-'; link.href = key === 'citations' ? value?.url || fallback() : fallback(); link.title = `${key === 'citations' ? value?.source || source : source}${valid ? ` · 获取于 ${new Date(cached.at).toLocaleString('zh-CN')}${refreshFailed ? ' · 更新失败,显示缓存' : ''}` : ' · 暂无可用数据'}`; }; render(); void load().then( (value) => { if (row.isConnected && row.dataset.requestKey === requestKey) render(value === null); }, () => { if (row.isConnected && row.dataset.requestKey === requestKey) render(true); }, ); } return row; } // ── 生成目标 URL ── function getPapersCoolUrl() { const id = getArxivId(); return id ? `https://papers.cool/arxiv/${id}` : null; } function getHjfyUrl() { const id = getArxivId(); return id ? `https://hjfy.top/arxiv/${id}` : null; } function getArxivVisualUrl() { const id = getArxivId(); return id ? `https://www.arxivisual.org/abs/${id}` : null; } function isArxivVisualHost() { return /(^|\.)arxivisual\.org$/i.test(location.hostname); } function getArxivTldrUrl() { const id = getArxivId(); return id ? `https://arxivtldr.org/abs/${id}` : null; } function getSemanticScholarApiUrl(arxivId) { if (!arxivId) { return null; } const canonicalArxivId = arxivId.replace(/v\d+$/i, ''); const paperId = encodeURIComponent(`ARXIV:${canonicalArxivId}`); return ( `https://api.semanticscholar.org/graph/v1/paper/${paperId}` + '?fields=title,url,tldr,externalIds' ); } function getSemanticScholarSearchUrl(arxivId) { if (!arxivId) { return null; } const ctx = { ...getPaperContext(), id: arxivId.replace(/v\d+$/i, '') }; const known = paperServices.citationPageUrl(ctx); return known.startsWith('https://www.semanticscholar.org/') ? known : 'https://www.semanticscholar.org/search?q=' + encodeURIComponent(ctx.title); } // ── alphaXiv 辅助函数 ── // 优先匹配承载文字的内层节点,避免把整个导航容器误当成按钮。 function findElementByExactText(text) { return Array.from(document.querySelectorAll('a, button, div, span')).find( (el) => el.textContent.trim() === text && !Array.from(el.children).some((child) => child.textContent.trim() === text) ); } function getClickableNavItem(el) { if (!el) { return null; } return el.closest('a, button, [role="tab"], [role="button"]') || el; } // ── 添加图标 + 文字 ── // 通过 GM 请求读取 HJFY SVG,绕过 arXiv 页面上的跨域资源 ORB 拦截。 function loadSvgIcon(icon, url, fallbackUrl) { if (typeof GM_xmlhttpRequest !== 'function') { icon.src = url; return; } const fallbackIcon = () => { if (fallbackUrl) { icon.src = fallbackUrl; } else { icon.style.display = 'none'; } }; GM_xmlhttpRequest({ method: 'GET', url, timeout: 10000, headers: {Accept: 'image/svg+xml,text/plain;q=0.9,*/*;q=0.8'}, onload: (response) => { if (response.status >= 200 && response.status < 300 && response.responseText) { icon.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(response.responseText)}`; } else { fallbackIcon(); } }, ontimeout: fallbackIcon, onerror: fallbackIcon }); } function appendBrand(link, text, iconUrl, size, marginRight, fallbackUrl = null) { const icon = document.createElement('img'); const inlineSvg = iconUrl === HJFY_ICON; icon.src = inlineSvg ? 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=' : iconUrl; icon.alt = ''; icon.setAttribute('aria-hidden', 'true'); icon.style.cssText = ` width: ${size}px; height: ${size}px; margin-right: ${marginRight}px; object-fit: contain; flex: 0 0 auto; display: block; `; /** * 主地址加载失败时尝试备用地址。 */ if (inlineSvg) { loadSvgIcon(icon, iconUrl, fallbackUrl); } else if (fallbackUrl) { let fallbackUsed = false; icon.addEventListener('error', () => { if (!fallbackUsed) { fallbackUsed = true; icon.src = fallbackUrl; return; } icon.style.display = 'none'; }); } else { icon.addEventListener('error', () => { icon.style.display = 'none'; }); } const span = document.createElement('span'); span.textContent = text; link.append(icon, span); } // ── alphaXiv 顶部导航样式 ── // 创建 alphaXiv 顶栏入口,继承相邻导航项的字体。 function createAlphaLink({ id, url, text, icon, iconFallback = null, referenceEl, hoverColor }) { const link = createExternalLink(url, `在${text}中查看这篇论文`); link.id = id; link.className = 'ab-nav-link'; link.style.setProperty('--ab-hover', hoverColor); appendBrand(link, text, icon, 18, 8, iconFallback); if (referenceEl) { const style = getComputedStyle(referenceEl); for (const property of ['fontSize', 'fontWeight', 'fontFamily']) { link.style[property] = style[property]; } } return link; } // ── alphaXiv ── function insertAlphaXivLinks() { const papersUrl = getPapersCoolUrl(); const hjfyUrl = getHjfyUrl(); if (!papersUrl || !hjfyUrl) { return; } let papersLink = document.getElementById(ALPHAXIV_PAPERS_ID); let hjfyLink = document.getElementById(ALPHAXIV_HJFY_ID); /** * 两个入口都已经存在: * * 只更新 URL,不再操作 DOM。 * * 防止 MutationObserver * 无限触发导致页面一直加载。 */ if (papersLink && hjfyLink) { if (papersLink.href !== papersUrl) papersLink.href = papersUrl; if (hjfyLink.href !== hjfyUrl) hjfyLink.href = hjfyUrl; return; } const audioText = findElementByExactText('Audio') || findElementByExactText('音频'); const assistantText = findElementByExactText('Assistant') || findElementByExactText('助手'); const notesText = findElementByExactText('Notes') || findElementByExactText('我的笔记'); const commentsText = findElementByExactText('Comments') || findElementByExactText('评论'); const audioItem = getClickableNavItem(audioText); const assistantItem = getClickableNavItem(assistantText); const notesItem = getClickableNavItem(notesText); const commentsItem = getClickableNavItem(commentsText); const reference = audioItem || assistantItem || notesItem || commentsItem; // Papers.cool if (!papersLink) { papersLink = createAlphaLink({ id: ALPHAXIV_PAPERS_ID, url: papersUrl, text: 'Papers.cool', icon: PAPERS_ICON, referenceEl: reference, hoverColor: '#991b1b' }); } // 幻觉翻译 if (!hjfyLink) { hjfyLink = createAlphaLink({ id: ALPHAXIV_HJFY_ID, url: hjfyUrl, text: '幻觉翻译', icon: HJFY_ICON, iconFallback: HJFY_ICON_FALLBACK, referenceEl: reference, hoverColor: '#2563eb' }); } // 优先跟在 Audio / Assistant 后面,否则放到 Notes 前面。 const anchor = audioItem?.parentElement ? audioItem : assistantItem; if (anchor?.parentElement) { anchor.insertAdjacentElement('afterend', papersLink); papersLink.insertAdjacentElement('afterend', hjfyLink); } else if (notesItem?.parentElement) { notesItem.insertAdjacentElement('beforebegin', papersLink); papersLink.insertAdjacentElement('afterend', hjfyLink); } } // ── Zotero TLDR(Semantic Scholar) ── /** * Zotero TLDR 的数据源是 Semantic Scholar 的 `tldr` 字段。 * Semantic Scholar 匿名 API 使用共享额度,偶尔会直接返回 429。 * 脚本做了四层保护: * 1) 成功 TLDR 永久保留,打开时后台刷新; * 2) 跨标签页限速; * 3) 429 冷却,不因刷新继续请求; * 4) 可选 API Key(只保存在 Tampermonkey 本地)。 */ function gmGet(key, fallback = null) { try { const value = GM_getValue(key, fallback); return value === undefined ? fallback : value; } catch { return fallback; } } function gmSet(key, value) { try { GM_setValue(key, value); } catch { // 忽略 Tampermonkey 存储异常。 } } function gmDelete(key) { try { GM_deleteValue(key); } catch { // 忽略 Tampermonkey 存储异常。 } } function getSemanticScholarApiKey() { const value = gmGet(SEMANTIC_SCHOLAR_API_KEY_STORAGE, ''); return typeof value === 'string' ? value.trim() : ''; } function setSemanticScholarApiKey(value) { const key = (value || '').trim(); if (key) { gmSet(SEMANTIC_SCHOLAR_API_KEY_STORAGE, key); } else { gmDelete(SEMANTIC_SCHOLAR_API_KEY_STORAGE); } // 更换 key 后允许立即重新尝试。 gmDelete(SEMANTIC_SCHOLAR_COOLDOWN_STORAGE); } function getSemanticScholarCooldownUntil() { const raw = Number(gmGet(SEMANTIC_SCHOLAR_COOLDOWN_STORAGE, 0)); return Number.isFinite(raw) ? raw : 0; } function setSemanticScholarCooldown(ms) { gmSet(SEMANTIC_SCHOLAR_COOLDOWN_STORAGE, Date.now() + Math.max(1000, ms)); } function clearExpiredSemanticScholarCooldown() { const until = getSemanticScholarCooldownUntil(); if (until && until <= Date.now()) { gmDelete(SEMANTIC_SCHOLAR_COOLDOWN_STORAGE); return 0; } return until; } function parseResponseHeader(rawHeaders, headerName) { if (!rawHeaders) { return ''; } const wanted = headerName.toLowerCase(); const line = String(rawHeaders) .split(/\r?\n/) .find((item) => { const index = item.indexOf(':'); if (index < 0) { return false; } return item.slice(0, index).trim().toLowerCase() === wanted; }); if (!line) { return ''; } return line.slice(line.indexOf(':') + 1).trim(); } function parseRetryAfterMs(rawHeaders) { const value = parseResponseHeader(rawHeaders, 'retry-after'); if (!value) { return 0; } const seconds = Number(value); if (Number.isFinite(seconds) && seconds >= 0) { return seconds * 1000; } const date = Date.parse(value); if (Number.isFinite(date)) { return Math.max(0, date - Date.now()); } return 0; } async function waitForSemanticScholarSlot() { const lastRequestAt = Number(gmGet(SEMANTIC_SCHOLAR_LAST_REQUEST_STORAGE, 0)); const waitMs = Math.max( 0, SEMANTIC_SCHOLAR_MIN_REQUEST_INTERVAL_MS - (Date.now() - lastRequestAt) ); if (waitMs > 0) { await new Promise((resolve) => window.setTimeout(resolve, waitMs)); } gmSet(SEMANTIC_SCHOLAR_LAST_REQUEST_STORAGE, Date.now()); } async function requestSemanticScholarJson(url) { const checkCooldown = () => { const cooldownUntil = clearExpiredSemanticScholarCooldown(); if (cooldownUntil > Date.now()) { const error = new Error('Semantic Scholar 当前处于限流冷却中'); error.code = 'RATE_LIMIT_COOLDOWN'; error.cooldownUntil = cooldownUntil; throw error; } }; checkCooldown(); await waitForSemanticScholarSlot(); // 等待配额时其他论文/标签页可能收到了 429,发出请求前再次检查。 checkCooldown(); const headers = { Accept: 'application/json' }; const apiKey = getSemanticScholarApiKey(); if (apiKey) { // Semantic Scholar 官方要求 header 名为 x-api-key。 headers['x-api-key'] = apiKey; } return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: 'GET', url, timeout: 20000, headers, onload: (response) => { if (response.status >= 200 && response.status < 300) { clearExpiredSemanticScholarCooldown(); try { resolve(JSON.parse(response.responseText || '{}')); } catch { reject(new Error('Semantic Scholar 返回了无效 JSON')); } return; } if (response.status === 404) { const error = new Error('Semantic Scholar 暂未收录这篇论文'); error.code = 'NOT_FOUND'; reject(error); return; } if (response.status === 401) { const error = new Error('Semantic Scholar API Key 无效或未获授权'); error.code = 'BAD_API_KEY'; reject(error); return; } if (response.status === 429) { const retryAfter = parseRetryAfterMs(response.responseHeaders); const cooldownMs = Math.max( retryAfter, SEMANTIC_SCHOLAR_DEFAULT_COOLDOWN_MS ); setSemanticScholarCooldown(cooldownMs); const error = new Error('Semantic Scholar API 当前限流'); error.code = 'RATE_LIMIT'; error.cooldownUntil = Date.now() + cooldownMs; reject(error); return; } reject(new Error(`Semantic Scholar HTTP ${response.status}`)); }, ontimeout: () => { reject(new Error('Semantic Scholar 请求超时')); }, onerror: () => { reject(new Error('Semantic Scholar 网络请求失败')); } }); }); } function getSemanticTldrCacheKey(arxivId) { const canonical = (arxivId || '').replace(/v\d+$/i, ''); return `semantic-scholar-tldr-cache-v2:${canonical}`; } function hasSemanticTldr(data) { return typeof data?.text === 'string' && Boolean(data.text.trim()); } function loadSemanticTldrCache(arxivId) { return loadLocalCache(getSemanticTldrCacheKey(arxivId), hasSemanticTldr, SEMANTIC_SCHOLAR_TLDR_EMPTY_CACHE_TTL); } function saveSemanticTldrCache(arxivId, data) { if (!hasSemanticTldr(data)) { const cached = loadSemanticTldrCache(arxivId); if (hasSemanticTldr(cached)) return cached; } return saveLocalCache(getSemanticTldrCacheKey(arxivId), data); } const tldrMemoryCache = new Map(); // GM 存储跨站共享。兼容旧 localStorage 记录(含 vN 论文 ID),迁移时保留获取时间。 // 成功记录始终优先;只有从未成功过的空结果才有过期时间。 function loadLocalCache(key, hasSummary, emptyTtl = 0) { let success = null; let empty = null; const consider = (raw) => { try { const record = typeof raw === 'string' ? JSON.parse(raw) : raw; if (!Number.isFinite(record?.savedAt) || record.savedAt <= 0 || record.savedAt > Date.now() || !record.data || typeof record.data !== 'object') return; if (hasSummary(record.data)) { if (!success || record.savedAt > success.savedAt) success = record; } else if (emptyTtl && Date.now() - record.savedAt < emptyTtl) { if (!empty || record.savedAt > empty.savedAt) empty = record; } } catch { // 内容损坏不影响其他来源的缓存或后续网络请求。 } }; const shared = gmGet(key); consider(shared); consider(tldrMemoryCache.get(key)); try { consider(localStorage.getItem(key)); for (let index = 0; index < localStorage.length; index += 1) { const legacyKey = localStorage.key(index); if (legacyKey?.startsWith(key) && /^v\d+$/i.test(legacyKey.slice(key.length))) { consider(localStorage.getItem(legacyKey)); } } } catch { // 禁用站点存储时仍可使用 GM / 内存缓存。 } const cached = success || empty; if (!cached) return null; tldrMemoryCache.set(key, cached); if (success && success !== shared) gmSet(key, success); return { ...cached.data, savedAt: cached.savedAt }; } function saveLocalCache(key, data) { const record = { savedAt: Date.now(), data }; tldrMemoryCache.set(key, record); gmSet(key, record); try { localStorage.setItem(key, JSON.stringify(record)); } catch { // 缓存写入失败不影响摘要展示。 } return { ...data, savedAt: record.savedAt }; } function parseSemanticScholarTldr(data) { const text = normalizeText(data?.tldr?.text); return { text, model: normalizeText(data?.tldr?.model), title: normalizeText(data?.title), url: typeof data?.url === 'string' && data.url.trim() ? data.url.trim() : null, paperId: typeof data?.paperId === 'string' ? data.paperId : null }; } function formatCooldown(until) { const remaining = Math.max(0, until - Date.now()); const minutes = Math.max(1, Math.ceil(remaining / 60000)); return `${minutes} 分钟`; } function createSmallActionButton(text) { const button = document.createElement('button'); button.type = 'button'; button.textContent = text; button.style.cssText = ` padding: 4px 8px; border: 1px solid #b9cbd7; border-radius: 4px; background: #ffffff; color: #185d8d; font-size: 11px; line-height: 1.2; cursor: pointer; `; return button; } function renderSemanticTldrState(card, state, data = null) { const body = card.querySelector('[data-semantic-tldr-body]'); if (!body) { return; } body.replaceChildren(); const message = document.createElement('div'); message.style.cssText = ` padding: 10px 0 2px; font-size: 13px; line-height: 1.55; `; if (state === 'loading') { message.textContent = '正在加载 Zotero TLDR(Semantic Scholar)…'; message.style.color = '#666666'; body.appendChild(message); return; } if (state === 'empty') { message.textContent = 'Semantic Scholar 已收录该论文,但目前没有 TLDR。脚本将在缓存过期后再次检查。'; message.style.color = '#666666'; body.appendChild(message); return; } if (state === 'rate_limit' || state === 'bad_key') { const hasKey = Boolean(getSemanticScholarApiKey()); if (state === 'bad_key') { message.textContent = '已配置的 Semantic Scholar API Key 无效或未获授权。'; } else if (hasKey) { message.textContent = `Semantic Scholar 当前限流。脚本已暂停自动请求 ${formatCooldown(data?.cooldownUntil || Date.now() + SEMANTIC_SCHOLAR_DEFAULT_COOLDOWN_MS)},不会因刷新页面继续触发。`; } else { message.textContent = `Semantic Scholar 匿名 API 当前限流。匿名用户共享公共额度,因此即使本脚本只请求一次也可能收到 429。脚本已暂停自动请求 ${formatCooldown(data?.cooldownUntil || Date.now() + SEMANTIC_SCHOLAR_DEFAULT_COOLDOWN_MS)}。`; } message.style.color = '#8a3b12'; body.appendChild(message); const actions = document.createElement('div'); actions.style.cssText = ` display: flex; flex-wrap: wrap; gap: 6px; margin-top: 9px; `; const keyButton = createSmallActionButton(hasKey ? '更新 API Key' : '设置 API Key'); keyButton.addEventListener('click', () => configureSemanticScholarApiKey(card, card.dataset.arxivId) ); const retryButton = createSmallActionButton('强制重试'); retryButton.addEventListener('click', () => { gmDelete(SEMANTIC_SCHOLAR_COOLDOWN_STORAGE); loadSemanticTldrCard(card, card.dataset.arxivId, true); }); actions.append(keyButton, retryButton); body.appendChild(actions); return; } if (state === 'error') { message.textContent = data?.message || '暂时无法读取 Semantic Scholar TLDR。'; message.style.color = '#8a3b12'; body.appendChild(message); return; } if (state === 'ready' && data?.text) { const paragraph = document.createElement('p'); renderTldrMath(paragraph, data.text); paragraph.style.cssText = ` margin: 10px 0 0; color: #27333f; font-size: 13px; line-height: 1.6; `; body.appendChild(paragraph); const source = document.createElement('div'); source.textContent = data.model ? `Semantic Scholar TLDR · ${data.model}` : 'Semantic Scholar TLDR'; source.style.cssText = ` margin-top: 9px; color: #89939d; font-size: 10px; line-height: 1.3; `; body.appendChild(source); } } // Zotero TLDR 默认收起,数据源仍为 Semantic Scholar。 function createSemanticTldrCard(arxivId, pageUrl) { const card = createSummaryCard({ id: ZOTERO_TLDR_CARD_ID, arxivId, url: pageUrl, title: 'Zotero TLDR ↗', tooltip: '数据源:Semantic Scholar TLDR', theme: 'semantic', bodyKey: 'semanticTldrBody', collapsed: true, onExpand: (card) => loadSemanticTldrCard(card, arxivId) }); renderSemanticTldrState(card, 'loading'); return card; } function configureSemanticScholarApiKey(card, arxivId) { const current = getSemanticScholarApiKey(); const input = window.prompt( '输入 Semantic Scholar API Key。\n\nKey 只保存在本机 Tampermonkey 存储中,不会发送到除 api.semanticscholar.org 之外的网站。\n\n留空并确认可删除现有 Key。', current ); if (input === null) { return; } setSemanticScholarApiKey(input); loadSemanticTldrCard(card, arxivId, true); } const semanticTldrRequests = new Map(); function readSemanticTldrData(arxivId, force = false) { const id = arxivId.replace(/v\d+$/i, ''); if (semanticTldrRequests.has(id)) return semanticTldrRequests.get(id); const cached = loadSemanticTldrCache(id); // 冷却空结果,但已有摘要时每次读取都尝试更新。 if (!force && cached && !hasSemanticTldr(cached)) return Promise.resolve(cached); const request = (async () => { const apiUrl = getSemanticScholarApiUrl(id); if (!apiUrl) throw new Error('无法生成 Semantic Scholar 查询地址。'); const data = parseSemanticScholarTldr(await requestSemanticScholarJson(apiUrl)); // 空响应不能把旧摘要或旧获取时间冒充为一次新成功。 if (hasSemanticTldr(data) || !hasSemanticTldr(loadSemanticTldrCache(id))) { return saveSemanticTldrCache(id, data); } return data; })().finally(() => semanticTldrRequests.delete(id)); semanticTldrRequests.set(id, request); return request; } async function loadSemanticTldrCard(card, arxivId, force = false) { const showSummary = (data) => { if (!hasSemanticTldr(data)) return false; // Semantic Scholar 返回的 url 比搜索页更准确,缓存命中时也更新链接。 const link = card.querySelector('a'); if (data.url && link) link.href = data.url; renderSemanticTldrState(card, 'ready', data); return true; }; const cached = loadSemanticTldrCache(arxivId); if (!showSummary(cached)) { renderSemanticTldrState(card, cached && !force ? 'empty' : 'loading', cached); } try { const data = await readSemanticTldrData(arxivId, force); if (!showSummary(data) && !showSummary(loadSemanticTldrCache(arxivId))) { renderSemanticTldrState(card, 'empty', data); } } catch (error) { // 包括限流、无效 key、网络错误:保留最后一次成功的正文和获取时间。 if (showSummary(loadSemanticTldrCache(arxivId))) return; if (error?.code === 'RATE_LIMIT' || error?.code === 'RATE_LIMIT_COOLDOWN') { renderSemanticTldrState(card, 'rate_limit', { cooldownUntil: error.cooldownUntil || getSemanticScholarCooldownUntil() }); return; } if (error?.code === 'BAD_API_KEY') { renderSemanticTldrState(card, 'bad_key'); return; } renderSemanticTldrState(card, 'error', { message: error?.message || '暂时无法读取 Semantic Scholar TLDR。' }); } } function ensureSemanticTldrCard(_sidebar) { if (!SHOW_ZOTERO_STYLE_TLDR) { return null; } const arxivId = getArxivId(); if (!arxivId) { return null; } let card = document.getElementById(ZOTERO_TLDR_CARD_ID); if (card && card.dataset.arxivId !== arxivId) { card.remove(); card = null; } if (card) { return card; } card = createSemanticTldrCard(arxivId, getSemanticScholarSearchUrl(arxivId)); loadSemanticTldrCard(card, arxivId); return card; } // ── ArXiv TLDR 右侧摘要卡片 ── function normalizeText(text) { return (text || '').replace(/\s+/g, ' ').trim(); } function findHeading(root, expectedText) { const expected = expectedText.toLowerCase(); return ( Array.from(root.querySelectorAll('h1, h2, h3, h4, h5, h6')).find((el) => { const text = normalizeText(el.textContent).toLowerCase(); return expected === 'tldr' ? /^tl;?dr$/i.test(text) : text === expected || text.startsWith(`${expected} `); }) || null ); } function collectSectionElements(root, heading) { if (!heading) { return []; } const elements = Array.from(root.querySelectorAll('h1, h2, h3, h4, h5, h6, p, ul, ol, li')); const start = elements.indexOf(heading); if (start < 0) { return []; } const result = []; for (let i = start + 1; i < elements.length; i += 1) { const el = elements[i]; if (/^H[1-6]$/.test(el.tagName)) { break; } result.push(el); } return result; } function isLikelyTldrContent(text) { const value = normalizeText(text); if (!value || value.length < 24) { return false; } const lower = value.toLowerCase(); if ( /^(tldr|key contributions|why it matters|original abstract|ask this paper)$/i.test( value ) || /^https?:\/\//i.test(value) || lower.includes('className'.toLowerCase()) || /^(?:summarizing paper|generating(?: ai)? summary|too many requests)|weekly free summary limit/i.test(value) || lower.includes('arxiv tldr — summaries powered by ai') ) { return false; } // Tailwind / CSS class、路由片段和 React 内部 token 不应被当成正文。 if ( (/\b(?:flex|grid|gap-|px-|py-|mt-|mb-|text-|bg-|border-|rounded-|font-|leading-|hover:|sm:|md:|lg:)\b/i.test( value ) && value.split(/\s+/).length > 3) || /^\$[A-Za-z0-9:_-]+$/.test(value) || /^[A-Za-z0-9_./:$-]+$/.test(value) ) { return false; } return value.split(/\s+/).length >= 5 || (value.match(/\p{Script=Han}/gu) || []).length >= 12; } function parseArxivTldrHtml(html) { const parser = new DOMParser(); const doc = parser.parseFromString(html, 'text/html'); /** * 严格模式: * 只接受真实 DOM / template 中明确存在的 TLDR 标题区块。 * * 旧版曾从 Next.js React Flight 的无序字符串流和 * meta description 中猜 TLDR;这可能把 Original Abstract * 的第一段误判成 TLDR。这里彻底禁用这种猜测。 */ const roots = [ doc.body, ...Array.from(doc.querySelectorAll('template')).map((template) => template.content) ].filter(Boolean); let tldr = ''; let pending = false; for (const root of roots) { const heading = findHeading(root, 'TLDR'); if (!heading) continue; const elements = collectSectionElements(root, heading); const text = normalizeText(elements.find((el) => el.tagName === 'P')?.textContent); if (isLikelyTldrContent(text)) tldr = text; pending = !tldr && /summarizing paper|generating(?: AI)? summary/i.test(root.textContent || ''); break; } return { tldr, pending }; } function parseArxivTldrMarkdown(text) { const source = (text || '').replace(/\r\n/g, '\n') .replace(/^([^\n]+)\n(?:={3,}|-{3,})\s*$/gm, '## $1') .replace(/^(#{1,6})\s+TL;DR\s*#*\s*$/gim, '$1 TLDR'); const lines = source.split('\n'); const start = lines.findIndex((line) => /^#{1,6}[ \t]+TLDR[ \t]*#*[ \t]*$/i.test(line)); if (start < 0) return { tldr: '', pending: false }; let end = start + 1; while (end < lines.length && !/^#{1,6}[ \t]+/.test(lines[end])) end += 1; const tldrRaw = lines.slice(start + 1, end).join('\n').trim(); const tldr = normalizeText( (tldrRaw.split(/\n\s*\n/).find((part) => part.trim() && !/^\s*(?:[-*+]\s|\d+[.)]\s|[#><]|`{3,}|~{3,})/.test(part)) || '') .split(/\n(?=[ \t]*(?:[-*+][ \t]+|\d+[.)][ \t]+|>|`{3,}|~{3,}))/)[0] .replace(/!?\[([^\]]+)\]\([^\n)]+\)/g, '$1') ); const cleanTldr = tldrMathParts(tldr).map((part) => part.formula !== undefined ? part.text : part.text.replace(/[*_`]/g, '')).join(''); return { tldr: isLikelyTldrContent(cleanTldr) ? cleanTldr : '', pending: false }; } function requestArxivTldrHtml(url, timeout = 10000) { return requestText(url, 'text/html,application/xhtml+xml', timeout); } function getJinaReaderUrl(url) { return `https://r.jina.ai/${url}`; } // HTML 和 Reader 共用请求封装;同步异常也会转成 Promise 拒绝。 function requestText(url, accept = 'text/plain,text/markdown,text/html,*/*', timeout = 20000) { return new Promise((resolve, reject) => { if (typeof GM_xmlhttpRequest !== 'function') { reject(new Error('GM_xmlhttpRequest unavailable')); return; } let settled = false; let request; const finish = (error, text) => { if (settled) return; settled = true; clearTimeout(timer); if (error) reject(error); else resolve(text); }; const timer = setTimeout(() => { finish(new Error('Request timeout')); request?.abort?.(); }, timeout); try { request = GM_xmlhttpRequest({ method: 'GET', url, timeout, anonymous: true, headers: { Accept: accept }, onload: (response) => { if (response.status >= 200 && response.status < 300) { finish(null, response.responseText || ''); } else { finish(new Error(`HTTP ${response.status}`)); } }, ontimeout: () => finish(new Error('Request timeout')), onerror: () => finish(new Error('Network error')), onabort: () => finish(new Error('Request aborted')) }); } catch (error) { finish(error); } }); } function getTldrCacheKey(arxivId) { return `arxivtldr-cache-v3:${arxivId.replace(/v\d+$/i, '')}`; } function hasArxivTldr(data) { return typeof data?.tldr === 'string' && isLikelyTldrContent(data.tldr); } function loadTldrCache(arxivId) { return loadLocalCache(getTldrCacheKey(arxivId), hasArxivTldr); } function saveTldrCache(arxivId, data) { if (!hasArxivTldr(data)) return loadTldrCache(arxivId); return saveLocalCache(getTldrCacheKey(arxivId), data); } const tldrRequests = new Map(); // 只返回这次请求的结果;调用方先显示缓存,刷新失败不能伪装成新成功。 function readArxivTldrData(arxivId, onPending = () => {}) { const id = arxivId.replace(/v\d+$/i, ''); if (tldrRequests.has(id)) return tldrRequests.get(id); const request = (async () => { // Leave time for Reader within the web bridge's 32-second wait. const deadline = Date.now() + 30000; const url = `https://arxivtldr.org/abs/${id}`; let error = null; for (let attempt = 0; attempt <= ARXIV_TLDR_MAX_RETRIES; attempt += 1) { const remaining = deadline - Date.now() - (USE_JINA_FALLBACK ? 10000 : 0); if (remaining <= 0) break; try { const data = parseArxivTldrHtml(await requestArxivTldrHtml(url, Math.min(10000, remaining))); if (data.tldr) { return saveTldrCache(id, data); } const retryRemaining = deadline - Date.now() - (USE_JINA_FALLBACK ? 10000 : 0); if (!data.pending || attempt === ARXIV_TLDR_MAX_RETRIES || retryRemaining < 3200) break; onPending(); await new Promise((resolve) => setTimeout(resolve, 2200)); } catch (reason) { error = reason; break; } } if (USE_JINA_FALLBACK && deadline > Date.now()) { try { const data = parseArxivTldrMarkdown(await requestText(getJinaReaderUrl(url), 'text/plain', Math.min(10000, deadline - Date.now()))); if (data.tldr) { return saveTldrCache(id, data); } } catch (reason) { error = reason; } } if (error) throw error; return null; })().finally(() => tldrRequests.delete(id)); tldrRequests.set(id, request); return request; } function tldrMathParts(text) { const parts = []; const delimiters = /\$\$?|\\\(|\\\[/g; const escaped = (index) => { let count = 0; while (index > 0 && text[--index] === '\\') count += 1; return count % 2 === 1; }; let start = 0; let match; while ((match = delimiters.exec(text))) { if (escaped(match.index)) continue; const open = match[0]; const close = open === '\\(' ? '\\)' : open === '\\[' ? '\\]' : open; const contentStart = match.index + open.length; let end = text.indexOf(close, contentStart); while (end >= 0 && escaped(end)) end = text.indexOf(close, end + close.length); if (end < 0) continue; const formula = text.slice(contentStart, end); if (!formula.trim() || (open === '$' && /[\n$]/.test(formula))) continue; parts.push({ text: text.slice(start, match.index) }); parts.push({ text: text.slice(match.index, end + close.length), formula }); start = end + close.length; delimiters.lastIndex = start; } parts.push({ text: text.slice(start) }); return parts; } function renderTldrMath(element, text) { const symbols = { alpha: 'α', beta: 'β', gamma: 'γ', delta: 'δ', epsilon: 'ε', theta: 'θ', lambda: 'λ', mu: 'μ', nu: 'ν', pi: 'π', rho: 'ρ', sigma: 'σ', tau: 'τ', phi: 'φ', psi: 'ψ', omega: 'ω', Gamma: 'Γ', Delta: 'Δ', Theta: 'Θ', Lambda: 'Λ', Pi: 'Π', Sigma: 'Σ', Phi: 'Φ', Psi: 'Ψ', Omega: 'Ω', times: '×', cdot: '·', pm: '±', leq: '≤', geq: '≥', neq: '≠', approx: '≈', infty: '∞', to: '→', rightarrow: '→', leftarrow: '←', in: '∈', sum: '∑' }; function parse(formula) { let index = 0; const fragment = () => document.createDocumentFragment(); function atom(depth) { if (depth > 16 || index >= formula.length) throw new Error('Invalid math group'); const node = fragment(); const char = formula[index++]; if (char === '{') { node.append(sequence(depth + 1)); if (formula[index++] !== '}') throw new Error('Unclosed math group'); } else if (char === '\\') { const command = /^[A-Za-z]+/.exec(formula.slice(index))?.[0]; if (!command) { const escaped = formula[index++]; if (!['{', '}', '_', '%', '$', '#', '&', ',', ';', '!'].includes(escaped)) throw new Error('Unsupported escape'); node.append(document.createTextNode([',', ';', '!'].includes(escaped) ? ' ' : escaped)); } else { index += command.length; if (Object.hasOwn(symbols, command)) node.append(document.createTextNode(symbols[command])); else if (['text', 'mathrm', 'mathbf', 'mathit', 'operatorname'].includes(command)) { while (/\s/.test(formula[index] || '') && index < formula.length) index += 1; if (formula[index] !== '{') throw new Error('Missing math group'); node.append(atom(depth + 1)); } else throw new Error('Unsupported math command'); } } else { if (/[}\^_$]/.test(char)) throw new Error('Invalid math token'); node.append(document.createTextNode(char)); } return node; } function sequence(depth) { const node = fragment(); let hasBase = false; const scripts = new Set(); while (index < formula.length && formula[index] !== '}') { const char = formula[index]; if (char === '_' || char === '^') { if (!hasBase || scripts.has(char)) throw new Error('Invalid math script'); scripts.add(char); index += 1; const script = document.createElement(char === '_' ? 'sub' : 'sup'); script.append(atom(depth + 1)); node.append(script); } else { node.append(atom(depth + 1)); hasBase = !/\s/.test(char); scripts.clear(); } } return node; } const node = sequence(0); if (index !== formula.length) throw new Error('Unbalanced math'); return node; } element.replaceChildren(); for (const part of tldrMathParts(String(text || ''))) { if (part.formula !== undefined) { try { // Unknown formulas stay literal; summary text never becomes HTML. element.append(parse(part.formula)); continue; } catch { /* Preserve unsupported LaTeX verbatim. */ } } element.append(document.createTextNode(part.text)); } } function firstTldrParagraph(text) { return normalizeText(String(text || '').split(/\n\s*\n/).find((part) => part.trim())); } // Only display the TLDR's first paragraph, not contributions or other sections. function renderTldrCardState(card, state, data = null) { const body = card.querySelector('[data-arxivtldr-body]'); if (!body) return; body.replaceChildren(); const messages = { loading: '正在加载 ArXiv TLDR…', pending: 'ArXiv TLDR 正在生成这篇论文的摘要,稍后会自动重试。', error: data?.message || '暂时无法读取 ArXiv TLDR。可点击标题打开原页面。' }; if (messages[state]) { const message = document.createElement('div'); message.className = 'ab-tldr-message'; message.textContent = messages[state]; if (state === 'error') message.style.color = '#8a3b12'; body.appendChild(message); } else if (state === 'ready' && data) { const paragraph = document.createElement('p'); paragraph.className = 'ab-tldr-message'; paragraph.style.color = '#333'; renderTldrMath(paragraph, firstTldrParagraph(data.tldr) || '暂无 TLDR 摘要,可点击标题查看原文。'); body.appendChild(paragraph); } } // ArXiv TLDR starts expanded; subsequent updates keep the user's toggle state. function createArxivTldrCard(arxivId, url) { const card = createSummaryCard({ id: ARXIV_TLDR_CARD_ID, arxivId, url, title: 'ArXiv TLDR ↗', tooltip: '打开 ArXiv TLDR 完整页面', theme: 'arxiv', bodyKey: 'arxivtldrBody', collapsed: ARXIV_TLDR_DEFAULT_COLLAPSED, onExpand: (card) => loadArxivTldrCard(card, arxivId) }); renderTldrCardState(card, 'loading'); return card; } async function loadArxivTldrCard(card, arxivId) { const cached = loadTldrCache(arxivId); renderTldrCardState(card, cached ? 'ready' : 'loading', cached); try { const data = await readArxivTldrData(arxivId, () => { if (!loadTldrCache(arxivId)) renderTldrCardState(card, 'pending'); }); const summary = data || loadTldrCache(arxivId); renderTldrCardState(card, summary ? 'ready' : 'error', summary || { message: '暂未读取到摘要,请点击标题打开原页面。' }); } catch (error) { const summary = loadTldrCache(arxivId); renderTldrCardState(card, summary ? 'ready' : 'error', summary || { message: `暂时无法读取摘要:${error.message}。可点击标题打开原页面。` }); } } function ensureArxivTldrCard(_sidebar) { if (!SHOW_ARXIV_TLDR) { return null; } const arxivId = getArxivId(); const url = getArxivTldrUrl(); if (!arxivId || !url) { return null; } let card = document.getElementById(ARXIV_TLDR_CARD_ID); if (card && card.dataset.arxivId !== arxivId) { card.remove(); card = null; } if (card) return card; card = createArxivTldrCard(arxivId, url); loadArxivTldrCard(card, arxivId); return card; } // 读取 arXivisual 的公开状态文本;只把明确状态转换成标志,避免把加载骨架误报为已生成。 function getArxivVisualState() { const text = normalizeText(document.body?.innerText || ''); if ( /paper not yet processed/i.test(text) || /hasn't been visualized yet/i.test(text) || /has not been visualized yet/i.test(text) ) { return 'unavailable'; } if ( /interactive scrollytelling|visualized paper|key concepts|chapter/i.test(text) ) { return 'available'; } return null; } // 在 arXivisual 页面右上角显示状态,未处理和已处理使用不同颜色与图标。 function ensureArxivVisualStatus() { const state = getArxivVisualState(); if (!state) { document.getElementById(ARXIV_VISUAL_STATUS_ID)?.remove(); return; } let badge = document.getElementById(ARXIV_VISUAL_STATUS_ID); if (badge?.dataset.state === state && badge.dataset.arxivId === getArxivId()) return; if (!badge) { badge = document.createElement('div'); badge.id = ARXIV_VISUAL_STATUS_ID; badge.className = 'ab-visual-status'; badge.setAttribute('role', 'status'); badge.setAttribute('aria-live', 'polite'); document.body.appendChild(badge); } badge.dataset.state = state; badge.dataset.arxivId = getArxivId(); badge.replaceChildren(); const icon = document.createElement('span'); icon.setAttribute('aria-hidden', 'true'); icon.textContent = state === 'unavailable' ? '⚠' : '✓'; const text = document.createElement('strong'); text.textContent = state === 'unavailable' ? 'arXivisual:未生成可视化' : 'arXivisual:已有可视化'; const link = createExternalLink( getArxivVisualUrl(), '打开 arXivisual 当前论文页' ); link.textContent = '查看页面'; badge.append(icon, text, link); } // ── arXiv ── function insertArxivLinks() { const sidebar = document.querySelector('.extra-services'); if (!sidebar) return; const bookmarks = ensurePaperBookmarks(); if (!bookmarks) return; const documents = ensureDocumentLinks(sidebar); const metrics = ensurePaperMetrics(); const semanticTldrCard = ensureSemanticTldrCard(sidebar); const tldrCard = ensureArxivTldrCard(sidebar); // Keep native sidebar sections intact and avoid reordering already-mounted nodes. [documents, metrics, tldrCard, semanticTldrCard, bookmarks].filter(Boolean).forEach((node, index) => { const anchor = sidebar.children[index] || null; if (anchor !== node) sidebar.insertBefore(node, anchor); }); } // ── 主函数 ── let redirectedUrl = null; function main() { const papersUrl = getPapersCoolUrl(); if (!papersUrl) { [DOCUMENT_LINKS_ID, METRICS_ID, BOOKMARKS_ID, CUSTOM_DIALOG_ID, ZOTERO_TLDR_CARD_ID, ARXIV_TLDR_CARD_ID, ARXIV_VISUAL_STATUS_ID, ALPHAXIV_PAPERS_ID, ALPHAXIV_HJFY_ID] .forEach((id) => document.getElementById(id)?.remove()); return; } ensureBridgeStyles(); if (isArxivVisualHost()) { ensureArxivVisualStatus(); return; } // 自动打开 Papers.cool if (AUTO_REDIRECT) { if (redirectedUrl !== papersUrl) { redirectedUrl = papersUrl; window.open(papersUrl, '_blank', 'noopener,noreferrer'); } return; } // arXiv if (/^(www\.)?arxiv\.org$/i.test(location.hostname)) { insertArxivLinks(); return; } // alphaXiv if (location.hostname.endsWith('alphaxiv.org')) { insertAlphaXivLinks(); } } // Only expose public TLDR text, never arbitrary URLs or privileged storage. function installHubTldrBridge() { if (typeof GM_xmlhttpRequest !== 'function') return; window.addEventListener('message', (event) => { const message = event.data; if (event.source !== window || event.origin !== location.origin || message?.channel !== 'arxivhub:tldr:v1') return; if (typeof message.requestId !== 'string' || message.requestId.length > 80) return; const reply = (data) => window.postMessage({ channel: message.channel, requestId: message.requestId, ...data }, location.origin); if (message.type === 'ping') { reply({ type: 'ready' }); return; } if (message.type !== 'request' || typeof message.id !== 'string' || !/^(?:\d{4}\.\d{4,5}|[a-z-]+(?:\.[A-Z]{2})?\/\d{7})(?:v\d+)?$/i.test(message.id)) return; const id = message.id.replace(/v\d+$/i, ''); const cached = loadTldrCache(id); if (cached) reply({ type: 'cache', ok: true, text: cached.tldr, at: cached.savedAt }); void readArxivTldrData(id).then( (data) => reply({ type: 'result', ok: true, text: data?.tldr || null, at: data?.savedAt ?? null }), () => reply({ type: 'result', ok: false }), ); }); } const hubHost = location.hostname === 'arxivhub.github.io'; const localHub = ['localhost', '127.0.0.1'].includes(location.hostname); if (hubHost || localHub) { installHubTldrBridge(); return; } // ── 首次执行 ── main(); // ── 监听动态页面 ── // Handle delayed sidebars, title updates and client-side navigation without duplicate nodes. if (/(^|\.)(arxiv|alphaxiv|arxivisual)\.org$/i.test(location.hostname)) { let timer = null; const observer = new MutationObserver(() => { clearTimeout(timer); timer = setTimeout(main, 200); }); observer.observe(document.documentElement, { childList: true, subtree: true, characterData: true, attributes: true, attributeFilter: ['content', 'href'] }); window.addEventListener('popstate', main); } })();