Files
aiagent/backend/data/snapshots/35dd521a-9dcc-49de-9cf2-d149e59342da.json

1 line
172 KiB
JSON
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"session_id": "35dd521a-9dcc-49de-9cf2-d149e59342da", "saved_at": 1781283949.0567698, "message_count": 16, "messages": [{"role": "system", "content": "你的名字是AI智能助手(豆包Pro)。\n\n# 角色定位\n\n你是**豆包Pro**——天工平台最强的AI对话助手,由 deepseek-v4-pro 模型驱动。你温暖、聪明、全能,比普通版豆包拥有更强的推理深度、更精准的工具使用判断和更细腻的情感理解。\n\n## 核心人格\n\n- **温暖走心**:像懂你的朋友,能感知情绪微妙变化,回应恰到好处\n- **深度思考**:不满足于表面答案,会追问本质,给出有洞察的回应\n- **严谨可靠**:事实性问题必查证,代码必验证,不确定时明确说明\n- **谦逊有边界**:知道能力边界,拒绝不当请求,但不冰冷说教\n- **灵动幽默**:语境合适时自然展现机智和幽默感\n\n## 核心能力\n\n### 1. 深度知识问答\n- 回答覆盖科技/人文/历史/科学/生活/商业等全领域\n- **联网搜索优先**:涉及实时信息、最新数据、新闻事件时,主动搜索验证后再回答\n- **多源交叉验证**:重要事实用 web_fetch 读取多个来源交叉确认\n- 复杂问题拆解为子问题,逐一研究后综合回答\n\n### 2. 代码工程专家\n- 写代码→执行验证→修正→再验证,确保代码能跑通\n- 代码审查:安全漏洞、性能瓶颈、可读性、最佳实践\n- 架构建议:根据场景推荐技术选型,解释 trade-off\n- 调试帮助:分析错误日志,定位问题根因\n\n### 3. 创意与内容\n- 写作:文章/故事/诗歌/剧本/广告/公文,风格可调\n- 头脑风暴:帮你想点子、做方案、搭框架\n- 润色翻译:保持原意前提下优化表达\n\n### 4. 规划执行\n- 复杂任务启用**计划模式**:分析→探索→生成计划→等你审批→逐步执行\n- 大任务用 task_plan 拆解为可追踪的子步骤\n- 每阶段用 self_review 自查质量\n\n### 5. 情感与陪伴\n- 感知情绪,适当共情,不空洞说教\n- 记住你的偏好和重要信息(文件记忆+向量记忆+长期记忆三层)\n- 能持续深度对话,不跳脱、不敷衍\n\n## 行为准则\n1. 收到消息先理解真实意图,信息不足时追问\n2. 复杂任务必须先规划再执行(用计划模式)\n3. 需要外部信息时主动搜索,不确定时诚实说明\n4. 代码必须执行验证后才能给出\n5. 重要回答完成后 self_review 自查\n6. 用户要求记住的信息务必保存到记忆\n7. 默认中文,跟随用户语言切换\n\n## 回复风格\n- 重点突出,结构清晰,善用 Markdown\n- 适当使用 emoji 增加亲和力(不过度)\n- 引用来源时标注出处\n- 根据场景调整语气:技术问题严谨,闲聊轻松\n\n## 记忆类型\n\n你可以将信息保存为以下 4 种类型的记忆文件(`.md` 格式,带 YAML frontmatter):\n\n<type>\n <name>user</name>\n <description>用户角色、目标、职责和知识。好的 user 记忆帮助你为特定用户定制行为。</description>\n <example>用户是资深 Go 开发者,刚接触此项目的 React 前端</example>\n</type>\n\n<type>\n <name>feedback</name>\n <description>用户给出的行为指导 —— 什么该做、什么不该做。</description>\n <body_structure>\n 以规则本身开头,然后是 **Why:** 行(原因)和 **How to apply:** 行(适用范围)。\n </body_structure>\n <example>集成测试必须使用真实数据库,不要 mock。Why: 上次 mock 通过但生产迁移失败。How to apply: 所有涉及 ORM 的测试。</example>\n</type>\n\n<type>\n <name>project</name>\n <description>项目上下文 —— 谁在做什么、为什么、截止时间。项目记忆衰减快,需要保持更新。</description>\n <body_structure>\n 以事实或决策开头,然后是 **Why:** 行(约束、截止日期、需求方)和 **How to apply:** 行(如何影响建议)。\n </body_structure>\n <example>周四后冻结所有非关键合并 (2026-03-05)。Why: 移动端发布分支切出。How to apply: 标记该日期后的 PR 工作。</example>\n</type>\n\n<type>\n <name>reference</name>\n <description>外部系统信息指针 —— Bug 追踪、文档、监控面板的位置。</description>\n <example>流水线 Bug 追踪在 Linear 项目 \"INGEST\" 中</example>\n</type>\n\n## 什么不应该保存为记忆\n- 代码模式、约定、架构 —— 可通过阅读项目代码得出\n- Git 历史、最近变更 —— `git log` / `git blame` 是权威来源\n- 调试方案、修复思路 —— 修复已在代码中,commit message 有上下文\n- CLAUDE.md 已记录的内容\n- 临时任务细节:进行中的工作、当前对话状态\n\n**这些排除规则即使在用户明确要求保存时也适用。** 如果用户要求保存以上内容,先询问其中什么是*意外的*或*非显而易见的*部分。\n\n## 何时访问记忆\n- 当记忆与当前任务可能相关时\n- 用户提及之前的对话或工作\n- 用户明确要求检查、回忆或记住时\n\n## 信任但验证\n- 命名特定函数/文件/标志的记忆是该信息*写入时*存在的主张\n- 在据此推荐之前:检查文件是否存在、grep 函数是否存在\n- 当前代码 > 过时记忆\n\n## 如何保存记忆\n\n保存记忆是两步操作:\n\n**第 1 步** — 将记忆写入独立文件,使用以下 frontmatter 格式:\n\n```markdown\n---\nname: {{简短标题}}\ndescription: {{一行描述 — 用于未来判断相关性,尽量具体}}\ntype: {{user / feedback / project / reference}}\n---\n\n{{记忆内容}}\n```\n\n文件命名使用语义化英文 slug(如 `user_golang_expert.md`)。\n\n**第 2 步** — 在 MEMORY.md 中添加索引行。MEMORY.md 是索引,每条一行约 150 字符以内:\n`- [标题](文件名.md) — 一行摘要`\n\n- MEMORY.md 超过 200 行后会被截断,请保持索引简洁\n- 按主题组织,不按时间\n- 更新或删除错误的记忆\n- 写入前先检查是否已有类似记忆可以更新\n\n## 记忆加载\n\n会话启动时会自动加载 MEMORY.md 索引和相关记忆文件。你可以使用文件读取工具查看具体的记忆文件内容。\n\n如果用户说 *忽略* 或 *不使用记忆*:当作 MEMORY.md 不存在。不要提及或引用记忆内容。\n\n记忆会随时间的推移而变陈旧。如果一个记忆与当前观察(代码、文件系统)冲突,以当前观察为准,并更新过时的记忆。\n\n记忆目录: `D:\\aaa\\aiagent\\backend\\.claude\\memory`\n(目录已存在,请直接使用)"}, {"role": "user", "content": "最近有什么重要的科技新闻吗?帮我整理2-3条"}, {"role": "assistant", "content": "好的!让我帮你搜罗最近值得关注的科技新闻 🔍", "tool_calls": [{"id": "call_00_WT7v8sSVakHiNxMz0txy3465", "type": "function", "function": {"name": "web_search", "arguments": "{\"query\": \"2025年最新科技新闻 重要\", \"max_results\": 5}"}}, {"id": "call_01_OeR4L6NxLFTjGlLM2Bva5984", "type": "function", "function": {"name": "web_search", "arguments": "{\"query\": \"AI artificial intelligence news June July 2025\", \"max_results\": 5}"}}, {"id": "call_02_MKbLJOrZ2y9i7eEPqy7m3425", "type": "function", "function": {"name": "web_search", "arguments": "{\"query\": \"semiconductor chip tech news 2025\", \"max_results\": 5}"}}], "reasoning_content": "用户想了解最近的科技新闻,我需要搜索一下。让我并行搜索几个不同方向的科技新闻,以获得更全面的覆盖。"}, {"role": "tool", "tool_call_id": "call_00_WT7v8sSVakHiNxMz0txy3465", "content": "{\"error\": \"搜索失败: 所有搜索后端均不可用(Bing/DuckDuckGo),请检查网络或配置 SEARCH_PROXY\"}", "name": "web_search"}, {"role": "tool", "tool_call_id": "call_01_OeR4L6NxLFTjGlLM2Bva5984", "content": "{\"error\": \"搜索失败: 所有搜索后端均不可用(Bing/DuckDuckGo),请检查网络或配置 SEARCH_PROXY\"}", "name": "web_search"}, {"role": "tool", "tool_call_id": "call_02_MKbLJOrZ2y9i7eEPqy7m3425", "content": "{\"error\": \"搜索失败: 所有搜索后端均不可用(Bing/DuckDuckGo),请检查网络或配置 SEARCH_PROXY\"}", "name": "web_search"}, {"role": "assistant", "content": "搜索后端暂时不可用,让我换种方式,直接抓取几个主流科技新闻源试试 👇", "tool_calls": [{"id": "call_00_MF3gWLa2QIBErXB4w7v30791", "type": "function", "function": {"name": "http_request", "arguments": "{\"url\": \"https://news.ycombinator.com/\", \"method\": \"GET\"}"}}, {"id": "call_01_qps5BT0W8ClaH3wDioAS5093", "type": "function", "function": {"name": "http_request", "arguments": "{\"url\": \"https://www.theverge.com/tech\", \"method\": \"GET\"}"}}], "reasoning_content": "所有搜索后端都不可用。让我试试直接通过 HTTP 请求来获取一些科技新闻。我可以用 http_request 工具来获取一些新闻网站的内容。\n\n让我试试几个不同的新闻源。"}, {"role": "tool", "tool_call_id": "call_00_MF3gWLa2QIBErXB4w7v30791", "content": "{\"error\": \"All connection attempts failed\"}", "name": "http_request"}, {"role": "tool", "tool_call_id": "call_01_qps5BT0W8ClaH3wDioAS5093", "content": "{\"status_code\": 200, \"headers\": {\"content-length\": \"84731\", \"content-type\": \"text/html; charset=utf-8\", \"content-encoding\": \"gzip\", \"date\": \"Fri, 12 Jun 2026 17:05:08 GMT\", \"cache-control\": \"no-store,private\"}, \"body\": \"<!DOCTYPE html><html lang=\\\"en-US\\\"><meta name=\\\"bingbot\\\" content=\\\"nocache\\\"/><head><meta charSet=\\\"utf-8\\\"/><meta name=\\\"twitter:card\\\" content=\\\"summary_large_image\\\"/><meta name=\\\"twitter:site\\\" content=\\\"@verge\\\"/><meta property=\\\"fb:app_id\\\" content=\\\"549923288395304\\\"/><meta property=\\\"og:type\\\" content=\\\"website\\\"/><meta property=\\\"og:site_name\\\" content=\\\"The Verge\\\"/><meta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1, shrink-to-fit=no\\\"/><meta name=\\\"apple-mobile-web-app-title\\\" content=\\\"Verge\\\"/><meta name=\\\"google-site-verification\\\" content=\\\"IucFf_TKtbFFH8_YeFyEteQIwYPdANM1R46_U9DpAr4\\\"/><link rel=\\\"alternate\\\" type=\\\"application/rss+xml\\\" title=\\\"The Verge\\\" href=\\\"/rss/index.xml\\\"/><link rel=\\\"shortcut icon\\\" href=\\\"/static-assets/icons/favicon.ico\\\"/><link rel=\\\"apple-touch-icon\\\" sizes=\\\"180x180\\\" href=\\\"/static-assets/icons/apple-touch-icon.png\\\"/><link rel=\\\"icon\\\" type=\\\"image/png\\\" sizes=\\\"32x32\\\" href=\\\"/static-assets/icons/favicon-32x32.png\\\"/><link rel=\\\"icon\\\" type=\\\"image/png\\\" sizes=\\\"96x96\\\" href=\\\"/static-assets/icons/favicon-96x96.png\\\"/><link rel=\\\"icon\\\" type=\\\"image/png\\\" sizes=\\\"16x16\\\" href=\\\"/static-assets/icons/favicon-16x16.png\\\"/><link rel=\\\"mask-icon\\\" href=\\\"/static-assets/icons/safari-pinned-tab.svg\\\"/><link rel=\\\"icon\\\" type=\\\"image/png\\\" href=\\\"/static-assets/icons/android-chrome-192x192.png\\\" sizes=\\\"192x192\\\"/><link rel=\\\"icon\\\" type=\\\"image/png\\\" href=\\\"/static-assets/icons/android-chrome-512x512.png\\\" sizes=\\\"512x512\\\"/><title>Tech | The Verge</title><meta name=\\\"robots\\\" content=\\\"index,follow\\\"/><meta name=\\\"description\\\" content=\\\"The latest tech news about the world’s best (and sometimes worst) hardware, apps, and much more. From top companies like Google and Apple to tiny startups vying for your attention, Verge Tech has the latest in what matters in technology daily.\\\"/><meta property=\\\"og:title\\\" content=\\\"Tech\\\"/><meta property=\\\"og:description\\\" content=\\\"The latest tech news about the world’s best (and sometimes worst) hardware, apps, and much more. From top companies like Google and Apple to tiny startups vying for your attention, Verge Tech has the latest in what matters in technology daily.\\\"/><meta property=\\\"og:url\\\" content=\\\"https://www.theverge.com/tech\\\"/><meta property=\\\"og:image\\\" content=\\\"https://platform.theverge.com/wp-content/uploads/sites/2/2026/04/STK022_ELON_MUSK_CVIRGINIA4_K.jpg?quality=90&amp;strip=all&amp;crop=0%2C9.9676601489831%2C100%2C80.064679702034&amp;w=1200\\\"/><meta property=\\\"og:image:alt\\\" content=\\\"Elon Musk in front of a background of falling money.\\\"/><meta property=\\\"og:image:type\\\" content=\\\"image/jpeg\\\"/><meta property=\\\"og:image:width\\\" content=\\\"1200\\\"/><meta property=\\\"og:image:height\\\" content=\\\"628\\\"/><link rel=\\\"canonical\\\" href=\\\"https://www.theverge.com/tech\\\"/><link rel=\\\"alternate\\\" type=\\\"application/rss+xml\\\" title=\\\"Tech\\\" href=\\\"/rss/tech/index.xml\\\"/><meta name=\\\"next-head-count\\\" content=\\\"31\\\"/><link rel=\\\"preconnect\\\" href=\\\"https://aax.amazon-adsystem.com\\\"/><link rel=\\\"preload\\\" href=\\\"https://config.aps.amazon-adsystem.com/configs/3176\\\" as=\\\"script\\\" fetchPriority=\\\"high\\\"/><link rel=\\\"preload\\\" href=\\\"https://client.aps.amazon-adsystem.com/publisher.js\\\" as=\\\"script\\\" fetchPriority=\\\"high\\\"/><script src=\\\"https://config.aps.amazon-adsystem.com/configs/3176\\\" async=\\\"\\\"></script><script src=\\\"https://client.aps.amazon-adsystem.com/publisher.js\\\" async=\\\"\\\"></script><link rel=\\\"preconnect\\\" href=\\\"https://www.google-analytics.com/\\\"/><link rel=\\\"preload\\\" as=\\\"script\\\" href=\\\"https://securepubads.g.doubleclick.net/tag/js/gpt.js\\\"/><link rel=\\\"dns-prefetch\\\" href=\\\"https://pagead2.googlesyndication.com\\\"/><link rel=\\\"dns-prefetch\\\" href=\\\"https://micro.rubiconproject.com/prebid/dynamic/7470.js\\\"/><link rel=\\\"dns-prefetch\\\" href=\\\"https://securepubads.g.doubleclick.net\\\"/><link rel=\\\"dns-prefetch\\\" href=\\\"https://stats.g.doubleclick.net\\\"/><link rel=\\\"dns-prefetch\\\" href=\\\"https://www.google-analytics.com\\\"/><link rel=\\\"dns-prefetch\\\" href=\\\"https://cdn.permutive.com\\\"/><link rel=\\\"dns-prefetch\\\" href=\\\"https://concertads-configs.vox-cdn.com\\\"/><link rel=\\\"dns-prefetch\\\" href=\\\"https://cdn.concert.io/\\\"/><link rel=\\\"preload\\\" href=\\\"/_next/static/media/e0d450417c4fcdb2-s.p.woff2\\\" as=\\\"font\\\" type=\\\"font/woff2\\\" crossorigin=\\\"anonymous\\\" data-next-font=\\\"size-adjust\\\"/><link rel=\\\"preload\\\" href=\\\"/_next/static/media/167de315d6f8820c-s.p.woff2\\\" as=\\\"font\\\" type=\\\"font/woff2\\\" crossorigin=\\\"anonymous\\\" data-next-font=\\\"size-adjust\\\"/><link rel=\\\"preload\\\" href=\\\"/_next/static/media/c32d4f9e62509b70-s.p.woff2\\\" as=\\\"font\\\" type=\\\"font/woff2\\\" crossorigin=\\\"anonymous\\\" data-next-font=\\\"size-adjust\\\"/><link rel=\\\"preload\\\" href=\\\"/_next/static/media/8314bd48671746e7-s.p.woff2\\\" as=\\\"font\\\" type=\\\"font/woff2\\\" crossorigin=\\\"anonymous\\\" data-next-font=\\\"size-adjust\\\"/><link rel=\\\"preload\\\" href=\\\"/_next/static/media/1acdcb23bd60cdf8-s.p.woff2\\\" as=\\\"font\\\" type=\\\"font/woff2\\\" crossorigin=\\\"anonymous\\\" data-next-font=\\\"size-adjust\\\"/><link rel=\\\"preload\\\" href=\\\"/_next/static/media/e334064d2786be51-s.p.woff2\\\" as=\\\"font\\\" type=\\\"font/woff2\\\" crossorigin=\\\"anonymous\\\" data-next-font=\\\"size-adjust\\\"/><link rel=\\\"preload\\\" href=\\\"/_next/static/media/dbe24bfb7e9bcd79-s.p.woff2\\\" as=\\\"font\\\" type=\\\"font/woff2\\\" crossorigin=\\\"anonymous\\\" data-next-font=\\\"size-adjust\\\"/><link rel=\\\"preload\\\" href=\\\"/_next/static/media/caa65695070c604f-s.p.woff2\\\" as=\\\"font\\\" type=\\\"font/woff2\\\" crossorigin=\\\"anonymous\\\" data-next-font=\\\"size-adjust\\\"/><link rel=\\\"preload\\\" href=\\\"/_next/static/media/7f8638c9585902a6-s.p.woff2\\\" as=\\\"font\\\" type=\\\"font/woff2\\\" crossorigin=\\\"anonymous\\\" data-next-font=\\\"size-adjust\\\"/><script id=\\\"one_trust\\\" data-nscript=\\\"beforeInteractive\\\">function OptanonWrapper() {}</script><script data-nscript=\\\"beforeInteractive\\\">\\n try {\\n if (typeof history.scrollRestoration !== 'undefined') {\\n const homepage = window.location.pathname === '/';\\n const scrollRestorationKey = sessionStorage.getItem('v:feed');\\n if (homepage && scrollRestorationKey) {\\n history.scrollRestoration = 'manual';\\n } else {\\n history.scrollRestoration = 'auto';\\n }\\n }\\n } catch (e) {\\n console.warn('Failed to set scrollRestoration', e);\\n }\\n </script><link rel=\\\"preload\\\" href=\\\"/_next/static/css/2d37cae8472ac43f.css\\\" as=\\\"style\\\"/><link rel=\\\"stylesheet\\\" href=\\\"/_next/static/css/2d37cae8472ac43f.css\\\" data-n-g=\\\"\\\"/><link rel=\\\"preload\\\" href=\\\"/_next/static/css/b0c0435da4642483.css\\\" as=\\\"style\\\"/><link rel=\\\"stylesheet\\\" href=\\\"/_next/static/css/b0c0435da4642483.css\\\" data-n-p=\\\"\\\"/><link rel=\\\"preload\\\" href=\\\"/_next/static/css/e44ef55f13b1141c.css\\\" as=\\\"style\\\"/><link rel=\\\"stylesheet\\\" href=\\\"/_next/static/css/e44ef55f13b1141c.css\\\" data-n-p=\\\"\\\"/><link rel=\\\"preload\\\" href=\\\"/_next/static/css/7650ccbac59872ba.css\\\" as=\\\"style\\\"/><link rel=\\\"stylesheet\\\" href=\\\"/_next/static/css/7650ccbac59872ba.css\\\" data-n-p=\\\"\\\"/><noscript data-n-css=\\\"\\\"></noscript><script defer=\\\"\\\" nomodule=\\\"\\\" src=\\\"/_next/static/chunks/polyfills-42372ed130431b0a.js\\\"></script><script src=\\\"https://cdn.cookielaw.org/scripttemplates/otSDKStub.js\\\" type=\\\"text/javascript\\\" charSet=\\\"UTF-8\\\" data-domain-script=\\\"3a41add1-8129-4584-aafc-e0da9979d233\\\" async=\\\"\\\" defer=\\\"\\\" data-nscript=\\\"beforeInteractive\\\"></script><script src=\\\"https://www.googletagservices.com/tag/js/gpt.js\\\" async=\\\"\\\" defer=\\\"\\\" data-nscript=\\\"beforeInteractive\\\"></script><script src=\\\"https://cdn.concert.io/lib/concert-ads/v2-latest/concert_ads.js\\\" async=\\\"\\\" defer=\\\"\\\" data-nscript=\\\"beforeInteractive\\\"></script><script src=\\\"https://cdn.concert.io/lib/concert-concierge.2.10.1.min.js\\\" async=\\\"\\\" defer=\\\"\\\" data-nscript=\\\"beforeInteractive\\\"></script><script src=\\\"https://pub.doubleverify.com/dvtag/21236410/DV464041/pub.js\\\" async=\\\"\\\" defer=\\\"\\\" data-nscript=\\\"beforeInteractive\\\"></script><script src=\\\"https://assets.zephr.com/zephr-browser/1.9.1/zephr-browser.umd.js\\\" async=\\\"\\\" defer=\\\"\\\" data-nscript=\\\"beforeInteractive\\\"></script><script src=\\\"https://cdn.bullwhip.cloud/sonar/vox-verge.umd.js\\\" async=\\\"\\\" defer=\\\"\\\" data-nscript=\\\"beforeInteractive\\\"></script><script src=\\\"/_next/static/chunks/webpack-acb8e443663ca527.js\\\" defer=\\\"\\\"></script><script src=\\\"/_next/static/chunks/framework-0d38badde70e1eb1.js\\\" defer=\\\"\\\"></script><script src=\\\"/_next/static/chunks/main-fc7a6b72b1ad075e.js\\\" defer=\\\"\\\"></script><script src=\\\"/_next/static/chunks/pages/_app-f97b8459fab1ea6f.js\\\" defer=\\\"\\\"></script><script src=\\\"/_next/static/chunks/66a79d7f-0c46010df781ec4b.js\\\" defer=\\\"\\\"></script><script src=\\\"/_next/static/chunks/675-62f4dd4d49ef0354.js\\\" defer=\\\"\\\"></script><script src=\\\"/_next/static/chunks/9354-e250575371f91dc9.js\\\" defer=\\\"\\\"></script><script src=\\\"/_next/static/chunks/3616-538db771050a0550.js\\\" defer=\\\"\\\"></script><script src=\\\"/_next/static/chunks/3676-f436dbfefeb329a1.js\\\" defer=\\\"\\\"></script><script src=\\\"/_next/static/chunks/6244-e15fa2638940383a.js\\\" defer=\\\"\\\"></script><script src=\\\"/_next/static/chunks/3197-ba26cca96aa91787.js\\\" defer=\\\"\\\"></script><script src=\\\"/_next/static/chunks/9631-f6ab046ff66caf57.js\\\" defer=\\\"\\\"></script><script src=\\\"/_next/static/chunks/9877-35e0027556b28b17.js\\\" defer=\\\"\\\"></script><script src=\\\"/_next/static/chunks/9672-2a201af26762dba6.js\\\" defer=\\\"\\\"></script><script src=\\\"/_next/static/chunks/2962-74ec6c17c681fd9a.js\\\" defer=\\\"\\\"></script><script src=\\\"/_next/static/chunks/8219-da01157da44f5671.js\\\" defer=\\\"\\\"></script><script src=\\\"/_next/static/chunks/759-f2caaab82a2b3137.js\\\" defer=\\\"\\\"></script><script src=\\\"/_next/static/chunks/2616-34de1dd48845bbca.js\\\" defer=\\\"\\\"></script><script src=\\\"/_next/static/chunks/pages/resource/category/%5BnodeId%5D-feb576a7b4476641.js\\\" defer=\\\"\\\"></script><script src=\\\"/_next/static/-QoOHv1MIHAGUrHbXE-9U/_buildManifest.js\\\" defer=\\\"\\\"></script><script src=\\\"/_next/static/-QoOHv1MIHAGUrHbXE-9U/_ssgManifest.js\\\" defer=\\\"\\\"></script></head><body class=\\\"_1se63890\\\"><script>(function(){var t={\\\"overtone\\\":\\\"nyun1q0\\\",\\\"vergeLight\\\":\\\"_1se63890\\\",\\\"vergeDark\\\":\\\"_1nfixzc0\\\"},k=\\\"verge-theme\\\",s={\\\"dark\\\":\\\"vergeDark\\\",\\\"light\\\":\\\"vergeLight\\\"},f=null,p=false;function a(n){var c=t[n];if(c)document.body.className=c;}try{var q=new URLSearchParams(window.location.search).get('theme');if(q&&t[q]){a(q);p=true;}}catch(e){}if(!p&&f&&t[f]){a(f);p=true;}if(!p)try{var v=localStorage.getItem(k);if(v&&t[v]){a(v);p=true;}}catch(e){}if(!p&&s)try{a(window.matchMedia('(prefers-color-scheme: dark)').matches?s.dark:s.light);}catch(e){}})();</script><noscript><img src=\\\"https://www.google-analytics.com/g/collect?v=2&amp;tid=G-C3QZPB4GVE&amp;cid=555&amp;en=noscript_page_view\\\" alt=\\\"\\\" style=\\\"display:none\\\"/></noscript><div id=\\\"__next\\\"><style>\\n :root {\\n --font-fkroman: '__fkRomanStandard_cfceed', '__fkRomanStandard_Fallback_cfceed', Georgia, serif;--font-manuka: '__manuka_62afb5', '__manuka_Fallback_62afb5', Impact, Helvetica, sans-serif;--font-polysans: '__polySans_9afc27', '__polySans_Fallback_9afc27', Helvetica, Arial, sans-serif;--font-polysans-mono: '__polySansMono_0b836e', '__polySansMono_Fallback_0b836e', Courier New, Courier, monospace;\\n }\\n </style><style>\\n *, *::before, *::after {\\n transition: none!important;\\n }\\n </style><div class=\\\"duet--app _1044qiz1 _1c8yj4y0\\\"><a class=\\\"duet--cta--button _11kb06m2 _11kb06m0 duet--cta--skip-to-content j56fwf0\\\" href=\\\"#content\\\"><span>Skip to main content</span></a><div class=\\\"\\\"><div class=\\\"_16apfq32 _16apfq33\\\"><div class=\\\"_16apfq30\\\"><div class=\\\"_1bzhflw1 _1bzhflw0\\\"><div class=\\\"_1bzhflw4\\\"><div class=\\\"_1bzhflw6 _1bzhflw5 _1c6ljn7b\\\"><a href=\\\"/\\\"><span class=\\\"_7jr3wn0\\\">The homepage</span><svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 309 70\\\" role=\\\"img\\\" class=\\\"_1bzhflw8\\\" width=\\\"100%\\\" height=\\\"100%\\\" fill=\\\"currentColor\\\"><title>The Verge</title><desc>The Verge logo.</desc><path d=\\\"m231.196 17.897-.302 9.071c-10.592-.726-13.618 1.996-13.618 10.885V39h-9.078V18.441h9.078v5.866c2.724-4.777 6.416-6.954 13.92-6.41ZM15.131 54.786h9.078V19.71h-9.078v35.075Zm44.968-36.828c-6.355 0-10.228 2.842-12.286 5.986V4.593H0v8.466h39.34V39h8.654c0-7.438 4.298-12.697 9.563-12.697 4.54 0 6.597 2.237 6.597 10.28v18.203h9.078V33.318c0-10.28-5.265-15.36-13.133-15.36ZM95.807 47.83c-5.507 0-9.078-3.326-9.683-8.829H77.59c.847 9.676 7.202 16.51 18.157 16.51 8.473 0 13.254-3.81 15.736-9.555l-7.687-3.387c-1.15 3.447-3.268 5.261-7.989 5.261Zm-.363-29.692a19.226 19.226 0 0 0-9.32 2.177l4.357 6.168c1.634-.846 3.39-1.27 5.266-1.21 5.084 0 7.686 3.327 8.049 7.68H95.02v6.048h17.31c.121-.907.182-1.754.182-2.66.06-13.184-8.655-18.203-17.068-18.203ZM185.32 47.83c-5.507 0-9.078-3.326-9.683-8.829h-8.534c.847 9.676 7.202 16.51 18.157 16.51 8.473 0 13.254-3.81 15.736-9.555l-7.687-3.387c-1.21 3.447-3.328 5.261-7.989 5.261Zm-.302-29.692a19.226 19.226 0 0 0-9.321 2.177l4.358 6.168c1.634-.846 3.389-1.27 5.265-1.21 5.084 0 7.687 3.327 8.05 7.68h-8.776v6.048h17.31c.121-.907.181-1.754.181-2.66.061-13.184-8.655-18.203-17.067-18.203ZM291.416 47.83c-5.507 0-9.078-3.326-9.683-8.829h-8.534c.847 9.676 7.202 16.51 18.157 16.51 8.473 0 13.254-3.81 15.736-9.555l-7.687-3.387c-1.21 3.447-3.328 5.261-7.989 5.261Zm-.484-29.692a19.225 19.225 0 0 0-9.32 2.177l4.357 6.168c1.635-.846 3.39-1.27 5.266-1.21 5.084 0 7.686 3.327 8.049 7.68h-8.775v6.048h17.309c.121-.907.182-1.754.182-2.66.06-13.184-8.655-18.203-17.068-18.203ZM117.172.299 133.5 39h9.926L130.971 8.221h16.099V.36L117.172.3Zm48.418.06L146.888 47.71l-2.784 7.076h9.502L176.06.36h-10.47Zm83.461 53.58c3.873 0 7.081-1.089 9.32-2.963l-3.631-5.745c-1.15.484-2.421.665-3.692.665-4.963 0-7.808-2.963-8.776-6.894h-8.897c1.211 8.406 7.263 14.937 15.676 14.937Zm11.196-30.418c-2.057-3.265-6.234-5.624-12.044-5.624-5.689-.06-10.954 3.024-13.738 8.043l7.565 4.838c1.392-2.903 4.116-4.838 8.292-4.838 5.931 0 9.925 4.596 9.925 10.038 0 1.029-.121 2.057-.423 3.024h9.502v-20.5h-9.079v5.019Zm-8.775 38.642c-5.871 0-8.05-2.842-8.474-6.168h-8.654c.181 6.35 4.418 13.304 17.309 13.304 8.715 0 14.404-4.354 16.765-10.885l-8.171-2.842c-1.15 4.233-4.297 6.591-8.775 6.591Z\\\"></path></svg></a></div><div class=\\\"_1c6ljn7x\\\"></div><nav class=\\\"_1bzhflwc _1bzhflwb _1c6ljn72 _1c6ljn71\\\" aria-label=\\\"Top Navigation\\\"><ul class=\\\"tc3v1r1 tc3v1r0\\\"><div class=\\\"_1c6ljn7t\\\"><a href=\\\"/\\\" class=\\\"_1c6ljn7u\\\"><svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 309 70\\\" role=\\\"img\\\" width=\\\"100%\\\" height=\\\"100%\\\" fill=\\\"currentColor\\\"><title>The Verge</title><desc>The Verge logo.</desc><path d=\\\"m231.196 17.897-.302 9.071c-10.592-.726-13.618 1.996-13.618 10.885V39h-9.078V18.441h9.078v5.866c2.724-4.777 6.416-6.954 13.92-6.41ZM15.131 54.786h9.078V19.71h-9.078v35.075Zm44.968-36.828c-6.355 0-10.228 2.842-12.286 5.986V4.593H0v8.466h39.34V39h8.654c0-7.438 4.298-12.697 9.563-12.697 4.54 0 6.597 2.237 6.597 10.28v18.203h9.078V33.318c0-10.28-5.265-15.36-13.133-15.36ZM95.807 47.83c-5.507 0-9.078-3.326-9.683-8.829H77.59c.847 9.676 7.202 16.51 18.157 16.51 8.473 0 13.254-3.81 15.736-9.555l-7.687-3.387c-1.15 3.447-3.268 5.261-7.989 5.261Zm-.363-29.692a19.226 19.226 0 0 0-9.32 2.177l4.357 6.168c1.634-.846 3.39-1.27 5.266-1.21 5.084 0 7.686 3.327 8.049 7.68H95.02v6.048h17.31c.121-.907.182-1.754.182-2.66.06-13.184-8.655-18.203-17.068-18.203ZM185.32 47.83c-5.507 0-9.078-3.326-9.683-8.829h-8.534c.847 9.676 7.202 16.51 18.157 16.51 8.473 0 13.254-3.81 15.736-9.555l-7.687-3.387c-1.21 3.447-3.328 5.261-7.989 5.261Zm-.302-29.692a19.226 19.226 0 0 0-9.321 2.177l4.358 6.168c1.634-.846 3.389-1.27 5.265-1.21 5.084 0 7.687 3.327 8.05 7.68h-8.776v6.048h17.31c.121-.907.181-1.754.181-2.66.061-13.184-8.655-18.203-17.067-18.203ZM291.416 47.83c-5.507 0-9.078-3.326-9.683-8.829h-8.534c.847 9.676 7.202 16.51 18.157 16.51 8.473 0 13.254-3.81 15.736-9.555l-7.687-3.387c-1.21 3.447-3.328 5.261-7.989 5.261Zm-.484-29.692a19.225 19.225 0 0 0-9.32 2.177l4.357 6.168c1.635-.846 3.39-1.27 5.266-1.21 5.084 0 7.686 3.327 8.049 7.68h-8.775v6.048h17.309c.121-.907.182-1.754.182-2.66.06-13.184-8.655-18.203-17.068-18.203ZM117.172.299 133.5 39h9.926L130.971 8.221h16.099V.36L117.172.3Zm48.418.06L146.888 47.71l-2.784 7.076h9.502L176.06.36h-10.47Zm83.461 53.58c3.873 0 7.081-1.089 9.32-2.963l-3.631-5.745c-1.15.484-2.421.665-3.692.665-4.963 0-7.808-2.963-8.776-6.894h-8.897c1.211 8.406 7.263 14.937 15.676 14.937Zm11.196-30.418c-2.057-3.265-6.234-5.624-12.044-5.624-5.689-.06-10.954 3.024-13.738 8.043l7.565 4.838c1.392-2.903 4.116-4.838 8.292-4.838 5.931 0 9.925 4.596 9.925 10.038 0 1.029-.121 2.057-.423 3.024h9.502v-20.5h-9.079v5.019Zm-8.775 38.642c-5.871 0-8.05-2.842-8.474-6.168h-8.654c.181 6.35 4.418 13.304 17.309 13.304 8.715 0 14.404-4.354 16.765-10.885l-8.171-2.842c-1.15 4.233-4.297 6.591-8.775 6.591Z\\\"></path></svg></a></div><li class=\\\"_1c6ljn7s _1c6ljn7k _1c6ljn7j _1dzobp0\\\"><a href=\\\"https://www.theverge.com/tech\\\" class=\\\"_1dzobp4\\\"><span class=\\\"_1dzobp5 _1dzobp8 _1dzobp7\\\">Tech</span></a></li><li class=\\\"_1c6ljn7s _1c6ljn7k _1c6ljn7j _1dzobp0\\\"><a href=\\\"https://www.theverge.com/reviews\\\" class=\\\"_1dzobp4\\\"><span class=\\\"_1dzobp5 _1dzobp8 _1dzobp7\\\">Reviews</span></a></li><li class=\\\"_1c6ljn7s _1c6ljn7k _1c6ljn7j _1dzobp0\\\"><a href=\\\"https://www.theverge.com/science\\\" class=\\\"_1dzobp4\\\"><span class=\\\"_1dzobp5 _1dzobp8 _1dzobp7\\\">Science</span></a></li><li class=\\\"_1c6ljn7s _1c6ljn7k _1c6ljn7j _1dzobp0\\\"><a href=\\\"https://www.theverge.com/entertainment\\\" class=\\\"_1dzobp4\\\"><span class=\\\"_1dzobp5 _1dzobp8 _1dzobp7\\\">Entertainment</span></a></li><li class=\\\"_1c6ljn7s _1c6ljn7k _1c6ljn7j _1dzobp0\\\"><a href=\\\"https://www.theverge.com/ai-artificial-intelligence\\\" class=\\\"_1dzobp4\\\"><span class=\\\"_1dzobp5 _1dzobp8 _1dzobp7\\\">AI</span></a></li><li class=\\\"_1c6ljn7s _1c6ljn7k _1c6ljn7j _1dzobp0\\\"><a href=\\\"https://www.theverge.com/policy\\\" class=\\\"_1dzobp4\\\"><span class=\\\"_1dzobp5 _1dzobp8 _1dzobp7\\\">Policy</span></a></li><li class=\\\"_1c6ljn7s _1c6ljn7k _1c6ljn7z\\\"><div class=\\\"_1c6ljn7y\\\"><div class=\\\"_1auickc0\\\"><button aria-label=\\\"Open Notifications\\\" aria-expanded=\\\"false\\\"><span class=\\\"_92feoa1\\\"><svg class=\\\"_92feoa2\\\" width=\\\"25\\\" height=\\\"25\\\" viewBox=\\\"0 0 25 25\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" id=\\\"notifications-bell\\\"><title>Notifications</title><path d=\\\"M12.5 1.59375C13.4362 1.59389 14.3319 2.08811 14.7725 2.91309C17.3943 3.87547 19.3438 6.33443 19.3438 9.375C19.3438 11.7269 19.9919 14.0106 21.2256 15.9854L21.4795 16.376L21.4893 16.3896L22.3486 17.7178L22.3545 17.7275C22.6894 18.2635 22.7045 18.9021 22.4287 19.417C22.1487 19.9395 21.5979 20.2811 20.9375 20.2812H16.3008C15.9494 22.0578 14.3764 23.4062 12.5 23.4062C10.6235 23.4062 9.05064 22.0578 8.69922 20.2812H4.0625C3.40199 20.2812 2.85141 19.9395 2.57129 19.417C2.29544 18.9021 2.31047 18.2636 2.64551 17.7275L2.65137 17.7178L3.51074 16.3896L3.51953 16.376C4.91815 14.3148 5.65625 11.8835 5.65625 9.375C5.65625 6.3346 7.60499 3.87558 10.2266 2.91309C10.6671 2.08787 11.5636 1.59375 12.5 1.59375ZM10.25 20.2812C10.5666 21.2217 11.4574 21.9062 12.5 21.9062C13.5425 21.9062 14.4334 21.2217 14.75 20.2812H10.25ZM12.5 3.09375C12.005 3.09375 11.6144 3.38947 11.4932 3.75293C11.417 3.98151 11.2348 4.15948 11.0049 4.23145C8.79186 4.92302 7.15625 6.91712 7.15625 9.375C7.15625 12.1732 6.33333 14.8924 4.76953 17.2031L4.77051 17.2041L3.91699 18.5225C3.86156 18.6112 3.87649 18.676 3.89355 18.708C3.90318 18.7259 3.91722 18.7419 3.9375 18.7539C3.95671 18.7652 3.99506 18.7812 4.0625 18.7812H20.9375C21.005 18.7812 21.0434 18.7652 21.0625 18.7539C21.0826 18.7419 21.0969 18.7259 21.1064 18.708C21.1235 18.6759 21.1382 18.6109 21.083 18.5225H21.082L20.2383 17.2178C18.6684 14.9041 17.8438 12.1788 17.8438 9.375C17.8438 6.91728 16.2079 4.92314 13.9951 4.23145C13.7651 4.15956 13.5831 3.98155 13.5068 3.75293C13.3857 3.38951 12.9948 3.09391 12.5 3.09375Z\\\" fill=\\\"currentColor\\\"></path></svg></span></button></div><div class=\\\"_1auickc2\\\"><button aria-label=\\\"Open Notifications\\\" aria-expanded=\\\"false\\\"><span class=\\\"_92feoa1\\\"><svg class=\\\"_92feoa2\\\" width=\\\"25\\\" height=\\\"25\\\" viewBox=\\\"0 0 25 25\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" id=\\\"notifications-bell\\\"><title>Notifications</title><path d=\\\"M12.5 1.59375C13.4362 1.59389 14.3319 2.08811 14.7725 2.91309C17.3943 3.87547 19.3438 6.33443 19.3438 9.375C19.3438 11.7269 19.9919 14.0106 21.2256 15.9854L21.4795 16.376L21.4893 16.3896L22.3486 17.7178L22.3545 17.7275C22.6894 18.2635 22.7045 18.9021 22.4287 19.417C22.1487 19.9395 21.5979 20.2811 20.9375 20.2812H16.3008C15.9494 22.0578 14.3764 23.4062 12.5 23.4062C10.6235 23.4062 9.05064 22.0578 8.69922 20.2812H4.0625C3.40199 20.2812 2.85141 19.9395 2.57129 19.417C2.29544 18.9021 2.31047 18.2636 2.64551 17.7275L2.65137 17.7178L3.51074 16.3896L3.51953 16.376C4.91815 14.3148 5.65625 11.8835 5.65625 9.375C5.65625 6.3346 7.60499 3.87558 10.2266 2.91309C10.6671 2.08787 11.5636 1.59375 12.5 1.59375ZM10.25 20.2812C10.5666 21.2217 11.4574 21.9062 12.5 21.9062C13.5425 21.9062 14.4334 21.2217 14.75 20.2812H10.25ZM12.5 3.09375C12.005 3.09375 11.6144 3.38947 11.4932 3.75293C11.417 3.98151 11.2348 4.15948 11.0049 4.23145C8.79186 4.92302 7.15625 6.91712 7.15625 9.375C7.15625 12.1732 6.33333 14.8924 4.76953 17.2031L4.77051 17.2041L3.91699 18.5225C3.86156 18.6112 3.87649 18.676 3.89355 18.708C3.90318 18.7259 3.91722 18.7419 3.9375 18.7539C3.95671 18.7652 3.99506 18.7812 4.0625 18.7812H20.9375C21.005 18.7812 21.0434 18.7652 21.0625 18.7539C21.0826 18.7419 21.0969 18.7259 21.1064 18.708C21.1235 18.6759 21.1382 18.6109 21.083 18.5225H21.082L20.2383 17.2178C18.6684 14.9041 17.8438 12.1788 17.8438 9.375C17.8438 6.91728 16.2079 4.92314 13.9951 4.23145C13.7651 4.15956 13.5831 3.98155 13.5068 3.75293C13.3857 3.38951 12.9948 3.09391 12.5 3.09375Z\\\" fill=\\\"currentColor\\\"></path></svg></span></button></div></div></li><li class=\\\"_1c6ljn7s _1c6ljn7k _1c6ljn7w _1dzobp0\\\"><button class=\\\"_1dzobp4\\\"><span class=\\\"_1dzobp5 _1dzobp8 _1dzobp7\\\"><svg class=\\\"\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><title>Hamburger Navigation Button</title><rect x=\\\"4\\\" y=\\\"7\\\" width=\\\"24\\\" height=\\\"2\\\" fill=\\\"currentColor\\\"></rect><rect x=\\\"4\\\" y=\\\"15\\\" width=\\\"24\\\" height=\\\"2\\\" fill=\\\"currentColor\\\"></rect><rect x=\\\"4\\\" y=\\\"23\\\" width=\\\"24\\\" height=\\\"2\\\" fill=\\\"currentColor\\\"></rect></svg></span></button></li></ul></nav></div></div></div><div class=\\\"_16apfq31\\\"><div class=\\\"_1r9mtja1 _1c6ljn7k\\\"><div class=\\\"uh105w2\\\"><div class=\\\"_1r9mtja0\\\"><a href=\\\"/\\\"><span class=\\\"_7jr3wn0\\\">The homepage</span><svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 309 70\\\" role=\\\"img\\\" class=\\\"uh105w4 _1c6ljn7b\\\" width=\\\"100%\\\" height=\\\"100%\\\" fill=\\\"currentColor\\\"><title>The Verge</title><desc>The Verge logo.</desc><path d=\\\"m231.196 17.897-.302 9.071c-10.592-.726-13.618 1.996-13.618 10.885V39h-9.078V18.441h9.078v5.866c2.724-4.777 6.416-6.954 13.92-6.41ZM15.131 54.786h9.078V19.71h-9.078v35.075Zm44.968-36.828c-6.355 0-10.228 2.842-12.286 5.986V4.593H0v8.466h39.34V39h8.654c0-7.438 4.298-12.697 9.563-12.697 4.54 0 6.597 2.237 6.597 10.28v18.203h9.078V33.318c0-10.28-5.265-15.36-13.133-15.36ZM95.807 47.83c-5.507 0-9.078-3.326-9.683-8.829H77.59c.847 9.676 7.202 16.51 18.157 16.51 8.473 0 13.254-3.81 15.736-9.555l-7.687-3.387c-1.15 3.447-3.268 5.261-7.989 5.261Zm-.363-29.692a19.226 19.226 0 0 0-9.32 2.177l4.357 6.168c1.634-.846 3.39-1.27 5.266-1.21 5.084 0 7.686 3.327 8.049 7.68H95.02v6.048h17.31c.121-.907.182-1.754.182-2.66.06-13.184-8.655-18.203-17.068-18.203ZM185.32 47.83c-5.507 0-9.078-3.326-9.683-8.829h-8.534c.847 9.676 7.202 16.51 18.157 16.51 8.473 0 13.254-3.81 15.736-9.555l-7.687-3.387c-1.21 3.447-3.328 5.261-7.989 5.261Zm-.302-29.692a19.226 19.226 0 0 0-9.321 2.177l4.358 6.168c1.634-.846 3.389-1.27 5.265-1.21 5.084 0 7.687 3.327 8.05 7.68h-8.776v6.048h17.31c.121-.907.181-1.754.181-2.66.061-13.184-8.655-18.203-17.067-18.203ZM291.416 47.83c-5.507 0-9.078-3.326-9.683-8.829h-8.534c.847 9.676 7.202 16.51 18.157 16.51 8.473 0 13.254-3.81 15.736-9.555l-7.687-3.387c-1.21 3.447-3.328 5.261-7.989 5.261Zm-.484-29.692a19.225 19.225 0 0 0-9.32 2.177l4.357 6.168c1.635-.846 3.39-1.27 5.266-1.21 5.084 0 7.686 3.327 8.049 7.68h-8.775v6.048h17.309c.121-.907.182-1.754.182-2.66.06-13.184-8.655-18.203-17.068-18.203ZM117.172.299 133.5 39h9.926L130.971 8.221h16.099V.36L117.172.3Zm48.418.06L146.888 47.71l-2.784 7.076h9.502L176.06.36h-10.47Zm83.461 53.58c3.873 0 7.081-1.089 9.32-2.963l-3.631-5.745c-1.15.484-2.421.665-3.692.665-4.963 0-7.808-2.963-8.776-6.894h-8.897c1.211 8.406 7.263 14.937 15.676 14.937Zm11.196-30.418c-2.057-3.265-6.234-5.624-12.044-5.624-5.689-.06-10.954 3.024-13.738 8.043l7.565 4.838c1.392-2.903 4.116-4.838 8.292-4.838 5.931 0 9.925 4.596 9.925 10.038 0 1.029-.121 2.057-.423 3.024h9.502v-20.5h-9.079v5.019Zm-8.775 38.642c-5.871 0-8.05-2.842-8.474-6.168h-8.654c.181 6.35 4.418 13.304 17.309 13.304 8.715 0 14.404-4.354 16.765-10.885l-8.171-2.842c-1.15 4.233-4.297 6.591-8.775 6.591Z\\\"></path></svg></a></div><div class=\\\"uh105w5 _1r9mtja2\\\"><div class=\\\"_1r9mtja5\\\"><div class=\\\"_1auickc0\\\"><button aria-label=\\\"Open Notifications\\\" aria-expanded=\\\"false\\\"><span class=\\\"_92feoa1\\\"><svg class=\\\"_92feoa2\\\" width=\\\"25\\\" height=\\\"25\\\" viewBox=\\\"0 0 25 25\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" id=\\\"notifications-bell\\\"><title>Notifications</title><path d=\\\"M12.5 1.59375C13.4362 1.59389 14.3319 2.08811 14.7725 2.91309C17.3943 3.87547 19.3438 6.33443 19.3438 9.375C19.3438 11.7269 19.9919 14.0106 21.2256 15.9854L21.4795 16.376L21.4893 16.3896L22.3486 17.7178L22.3545 17.7275C22.6894 18.2635 22.7045 18.9021 22.4287 19.417C22.1487 19.9395 21.5979 20.2811 20.9375 20.2812H16.3008C15.9494 22.0578 14.3764 23.4062 12.5 23.4062C10.6235 23.4062 9.05064 22.0578 8.69922 20.2812H4.0625C3.40199 20.2812 2.85141 19.9395 2.57129 19.417C2.29544 18.9021 2.31047 18.2636 2.64551 17.7275L2.65137 17.7178L3.51074 16.3896L3.51953 16.376C4.91815 14.3148 5.65625 11.8835 5.65625 9.375C5.65625 6.3346 7.60499 3.87558 10.2266 2.91309C10.6671 2.08787 11.5636 1.59375 12.5 1.59375ZM10.25 20.2812C10.5666 21.2217 11.4574 21.9062 12.5 21.9062C13.5425 21.9062 14.4334 21.2217 14.75 20.2812H10.25ZM12.5 3.09375C12.005 3.09375 11.6144 3.38947 11.4932 3.75293C11.417 3.98151 11.2348 4.15948 11.0049 4.23145C8.79186 4.92302 7.15625 6.91712 7.15625 9.375C7.15625 12.1732 6.33333 14.8924 4.76953 17.2031L4.77051 17.2041L3.91699 18.5225C3.86156 18.6112 3.87649 18.676 3.89355 18.708C3.90318 18.7259 3.91722 18.7419 3.9375 18.7539C3.95671 18.7652 3.99506 18.7812 4.0625 18.7812H20.9375C21.005 18.7812 21.0434 18.7652 21.0625 18.7539C21.0826 18.7419 21.0969 18.7259 21.1064 18.708C21.1235 18.6759 21.1382 18.6109 21.083 18.5225H21.082L20.2383 17.2178C18.6684 14.9041 17.8438 12.1788 17.8438 9.375C17.8438 6.91728 16.2079 4.92314 13.9951 4.23145C13.7651 4.15956 13.5831 3.98155 13.5068 3.75293C13.3857 3.38951 12.9948 3.09391 12.5 3.09375Z\\\" fill=\\\"currentColor\\\"></path></svg></span></button></div><div class=\\\"_1auickc2\\\"><button aria-label=\\\"Open Notifications\\\" aria-expanded=\\\"false\\\"><span class=\\\"_92feoa1\\\"><svg class=\\\"_92feoa2\\\" width=\\\"25\\\" height=\\\"25\\\" viewBox=\\\"0 0 25 25\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" id=\\\"notifications-bell\\\"><title>Notifications</title><path d=\\\"M12.5 1.59375C13.4362 1.59389 14.3319 2.08811 14.7725 2.91309C17.3943 3.87547 19.3438 6.33443 19.3438 9.375C19.3438 11.7269 19.9919 14.0106 21.2256 15.9854L21.4795 16.376L21.4893 16.3896L22.3486 17.7178L22.3545 17.7275C22.6894 18.2635 22.7045 18.9021 22.4287 19.417C22.1487 19.9395 21.5979 20.2811 20.9375 20.2812H16.3008C15.9494 22.0578 14.3764 23.4062 12.5 23.4062C10.6235 23.4062 9.05064 22.0578 8.69922 20.2812H4.0625C3.40199 20.2812 2.85141 19.9395 2.57129 19.417C2.29544 18.9021 2.31047 18.2636 2.64551 17.7275L2.65137 17.7178L3.51074 16.3896L3.51953 16.376C4.91815 14.3148 5.65625 11.8835 5.65625 9.375C5.65625 6.3346 7.60499 3.87558 10.2266 2.91309C10.6671 2.08787 11.5636 1.59375 12.5 1.59375ZM10.25 20.2812C10.5666 21.2217 11.4574 21.9062 12.5 21.9062C13.5425 21.9062 14.4334 21.2217 14.75 20.2812H10.25ZM12.5 3.09375C12.005 3.09375 11.6144 3.38947 11.4932 3.75293C11.417 3.98151 11.2348 4.15948 11.0049 4.23145C8.79186 4.92302 7.15625 6.91712 7.15625 9.375C7.15625 12.1732 6.33333 14.8924 4.76953 17.2031L4.77051 17.2041L3.91699 18.5225C3.86156 18.6112 3.87649 18.676 3.89355 18.708C3.90318 18.7259 3.91722 18.7419 3.9375 18.7539C3.95671 18.7652 3.99506 18.7812 4.0625 18.7812H20.9375C21.005 18.7812 21.0434 18.7652 21.0625 18.7539C21.0826 18.7419 21.0969 18.7259 21.1064 18.708C21.1235 18.6759 21.1382 18.6109 21.083 18.5225H21.082L20.2383 17.2178C18.6684 14.9041 17.8438 12.1788 17.8438 9.375C17.8438 6.91728 16.2079 4.92314 13.9951 4.23145C13.7651 4.15956 13.5831 3.98155 13.5068 3.75293C13.3857 3.38951 12.9948 3.09391 12.5 3.09375Z\\\" fill=\\\"currentColor\\\"></path></svg></span></button></div></div><button class=\\\"_1q3z6bc0 _1c6ljn7k\\\" aria-controls=\\\"drawer_:R196:\\\" aria-label=\\\"Open Drawer\\\"><div class=\\\"_1q3z6bc4 _1q3z6bc3\\\"><span class=\\\"_1q3z6bc2\\\"><svg class=\\\"_1q3z6bcc\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><title>Hamburger Navigation Button</title><rect x=\\\"4\\\" y=\\\"7\\\" width=\\\"24\\\" height=\\\"2\\\" fill=\\\"currentColor\\\"></rect><rect x=\\\"4\\\" y=\\\"15\\\" width=\\\"24\\\" height=\\\"2\\\" fill=\\\"currentColor\\\"></rect><rect x=\\\"4\\\" y=\\\"23\\\" width=\\\"24\\\" height=\\\"2\\\" fill=\\\"currentColor\\\"></rect></svg></span></div></button></div></div></div></div></div></div><div class=\\\"_14u4qgp0\\\" id=\\\"drawer_:R196:\\\" role=\\\"dialog\\\" aria-modal=\\\"true\\\" aria-labelledby=\\\"drawer_:R196:-title\\\" hidden=\\\"\\\" style=\\\"display:none\\\"><section class=\\\"_14u4qgp1 _19wir9w0\\\" id=\\\"drawer_:R196:-scroll\\\" hidden=\\\"\\\" style=\\\"display:none\\\"><div class=\\\"_7jr3wn0\\\"><div id=\\\"drawer_:R196:-title\\\">Navigation Drawer</div></div><div><div class=\\\"_19wir9w5\\\"><div><div class=\\\"_1v0jor30\\\"><svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 309 70\\\" role=\\\"img\\\" width=\\\"100%\\\" height=\\\"100%\\\" fill=\\\"currentColor\\\"><title>The Verge</title><desc>The Verge logo.</desc><path d=\\\"m231.196 17.897-.302 9.071c-10.592-.726-13.618 1.996-13.618 10.885V39h-9.078V18.441h9.078v5.866c2.724-4.777 6.416-6.954 13.92-6.41ZM15.131 54.786h9.078V19.71h-9.078v35.075Zm44.968-36.828c-6.355 0-10.228 2.842-12.286 5.986V4.593H0v8.466h39.34V39h8.654c0-7.438 4.298-12.697 9.563-12.697 4.54 0 6.597 2.237 6.597 10.28v18.203h9.078V33.318c0-10.28-5.265-15.36-13.133-15.36ZM95.807 47.83c-5.507 0-9.078-3.326-9.683-8.829H77.59c.847 9.676 7.202 16.51 18.157 16.51 8.473 0 13.254-3.81 15.736-9.555l-7.687-3.387c-1.15 3.447-3.268 5.261-7.989 5.261Zm-.363-29.692a19.226 19.226 0 0 0-9.32 2.177l4.357 6.168c1.634-.846 3.39-1.27 5.266-1.21 5.084 0 7.686 3.327 8.049 7.68H95.02v6.048h17.31c.121-.907.182-1.754.182-2.66.06-13.184-8.655-18.203-17.068-18.203ZM185.32 47.83c-5.507 0-9.078-3.326-9.683-8.829h-8.534c.847 9.676 7.202 16.51 18.157 16.51 8.473 0 13.254-3.81 15.736-9.555l-7.687-3.387c-1.21 3.447-3.328 5.261-7.989 5.261Zm-.302-29.692a19.226 19.226 0 0 0-9.321 2.177l4.358 6.168c1.634-.846 3.389-1.27 5.265-1.21 5.084 0 7.687 3.327 8.05 7.68h-8.776v6.048h17.31c.121-.907.181-1.754.181-2.66.061-13.184-8.655-18.203-17.067-18.203ZM291.416 47.83c-5.507 0-9.078-3.326-9.683-8.829h-8.534c.847 9.676 7.202 16.51 18.157 16.51 8.473 0 13.254-3.81 15.736-9.555l-7.687-3.387c-1.21 3.447-3.328 5.261-7.989 5.261Zm-.484-29.692a19.225 19.225 0 0 0-9.32 2.177l4.357 6.168c1.635-.846 3.39-1.27 5.266-1.21 5.084 0 7.686 3.327 8.049 7.68h-8.775v6.048h17.309c.121-.907.182-1.754.182-2.66.06-13.184-8.655-18.203-17.068-18.203ZM117.172.299 133.5 39h9.926L130.971 8.221h16.099V.36L117.172.3Zm48.418.06L146.888 47.71l-2.784 7.076h9.502L176.06.36h-10.47Zm83.461 53.58c3.873 0 7.081-1.089 9.32-2.963l-3.631-5.745c-1.15.484-2.421.665-3.692.665-4.963 0-7.808-2.963-8.776-6.894h-8.897c1.211 8.406 7.263 14.937 15.676 14.937Zm11.196-30.418c-2.057-3.265-6.234-5.624-12.044-5.624-5.689-.06-10.954 3.024-13.738 8.043l7.565 4.838c1.392-2.903 4.116-4.838 8.292-4.838 5.931 0 9.925 4.596 9.925 10.038 0 1.029-.121 2.057-.423 3.024h9.502v-20.5h-9.079v5.019Zm-8.775 38.642c-5.871 0-8.05-2.842-8.474-6.168h-8.654c.181 6.35 4.418 13.304 17.309 13.304 8.715 0 14.404-4.354 16.765-10.885l-8.171-2.842c-1.15 4.233-4.297 6.591-8.775 6.591Z\\\"></path></svg></div><div><div class=\\\"_19wir9w1\\\"><ul class=\\\"_54os0b0\\\"><li class=\\\"_54os0b1\\\"><a class=\\\"_54os0b2\\\" href=\\\"/auth/login?returnPath=/\\\">Login</a><div class=\\\"_54os0b3\\\"> / </div><a class=\\\"_54os0b2\\\" href=\\\"/auth/login?returnPath=/\\\">Sign Up</a></li></ul><button class=\\\"_18i1a9e0\\\" aria-controls=\\\"drawer_:R196:\\\" aria-label=\\\"Close Drawer\\\"><span>close</span><svg class=\\\"_18i1a9e1\\\" width=\\\"20\\\" height=\\\"19\\\" viewBox=\\\"0 0 20 19\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><title>Close</title><line x1=\\\"1.70711\\\" y1=\\\"0.831956\\\" x2=\\\"18\", \"body_truncated\": true, \"truncation_note\": \"正文已截断:原始约 688742 字符,仅保留前 32000 字符。门户/频道首页通常过大,摘要请优先使用具体文章页 URL。\"}", "name": "http_request"}, {"role": "assistant", "content": "The Verge 页面是客户端渲染的,内容不太好提取。让我换个策略,试试其他更容易抓取的新闻源 👇", "tool_calls": [{"id": "call_00_kyL03C63oqeU23OAmzMv4490", "type": "function", "function": {"name": "http_request", "arguments": "{\"method\": \"GET\", \"url\": \"https://feeds.feedburner.com/TheHackersNews\"}"}}, {"id": "call_01_LG3SUqHM1RWZ5G3l1xRr6860", "type": "function", "function": {"name": "http_request", "arguments": "{\"method\": \"GET\", \"url\": \"https://www.techmeme.com/\"}"}}, {"id": "call_02_fq8otnkce4MJ0PhCryJ53839", "type": "function", "function": {"name": "http_request", "arguments": "{\"method\": \"GET\", \"url\": \"https://arstechnica.com/\"}"}}], "reasoning_content": "The Verge page loaded but it's mostly HTML boilerplate and CSS - the actual article content is probably rendered client-side via JavaScript, so I can't extract the news headlines from this. \n\nLet me try a different approach - maybe I can try some RSS feeds or other news sources that might be easier to parse.\n\nActually, let me try a few more direct approaches. Let me try some tech news APIs or simpler pages."}, {"role": "tool", "tool_call_id": "call_00_kyL03C63oqeU23OAmzMv4490", "content": "{\"error\": \"All connection attempts failed\"}", "name": "http_request"}, {"role": "tool", "tool_call_id": "call_01_LG3SUqHM1RWZ5G3l1xRr6860", "content": "{\"status_code\": 200, \"headers\": {\"date\": \"Fri, 12 Jun 2026 17:05:36 GMT\", \"content-type\": \"text/html\", \"server\": \"cloudflare\", \"content-encoding\": \"gzip\"}, \"body\": \"<!DOCTYPE html>\\n<HTML>\\n<HEAD>\\n<TITLE>Techmeme</TITLE>\\n<META NAME=\\\"description\\\" CONTENT=\\\"Top news and commentary for technology's leaders, from all around the web.\\\" />\\n<META NAME=\\\"application-name\\\" content=\\\"Techmeme\\\" />\\n<link type=\\\"application/rss+xml\\\" rel=\\\"alternate\\\" title=\\\"Techmeme\\\" HREF=\\\"https://www.techmeme.com/feed.xml\\\"/>\\n<link type=\\\"application/rss+xml\\\" rel=\\\"alternate\\\" title=\\\"Techmeme Ride Home podcast\\\" href=\\\"https://feeds.feedburner.com/TechmemeRideHome\\\" />\\n<LINK REL=\\\"SHORTCUT ICON\\\" HREF=\\\"/img/favicon.ico\\\" />\\n<link rel=\\\"image_src\\\" href=\\\"https://www.techmeme.com/m/config/tech/iicon.gif\\\" />\\n<link rel=\\\"apple-touch-icon\\\" href=\\\"https://www.techmeme.com/m/config/tech/iicon.gif\\\" />\\n<META HTTP-EQUIV=\\\"Expires\\\" CONTENT=\\\"now\\\">\\n<SCRIPT TYPE=\\\"text/javascript\\\">\\n<!--\\nvar nwcbe;\\nfunction rnwcb() {\\nvar where;\\nif (nwcbe.checked)\\nwhere = \\\"_blank\\\";\\nelse\\nwhere = \\\"_self\\\";\\nvar jump_prefix = location.href.substring(0, location.href.length - location.hash.length) + '#';\\nfor (var i=0; i<=(document.links.length-1); i++) {\\nvar href = document.links[i].href;\\nif ((href.indexOf(\\\"javascript:\\\") != 0) && (href.indexOf(jump_prefix) != 0) && (!(/^https?:\\\\/\\\\/([a-z]+\\\\.)?techmeme\\\\.com\\\\//.test(href)) || /^https?:\\\\/\\\\/([a-z]+\\\\.)?techmeme\\\\.com\\\\/(i?gotos?|r2|r\\\\/|cad|techmeme)/.test(href))) {\\ndocument.links[i].target = where;\\n}\\n}\\n}\\nvar ckd;\\nfunction set_ckd() {\\nvar dd = document.domain;\\nif (dd) {\\nvar da = dd.split('.');\\nvar rd=da[da.length-2]+'.'+da[da.length-1];\\nckd='; domain=.'+rd;\\n}\\n}\\nfunction createCookie(name,value) {\\ndocument.cookie = name+\\\"=\\\"+value+\\\"; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/\\\"+ckd;\\n}\\nfunction eraseCookie(name) {\\ndocument.cookie = name+\\\"=; expires=Thu, 01-Jan-70 00:00:01 GMT; path=/\\\"+ckd;\\n}\\nfunction svprefs() {\\nvar cookie_val = '';\\nif (nwcbe.checked) {\\ncookie_val += 'new_window';\\n}\\nif (cookie_val == '') {\\neraseCookie('myprefs');\\n} else {\\ncreateCookie('myprefs', cookie_val);\\n}\\n}\\nfunction readCookie(name) {\\nvar nameEQ = name + \\\"=\\\";\\nvar ca = document.cookie.split(';');\\nfor(var i=0;i < ca.length;i++) {\\nvar c = ca[i];\\nwhile (c.charAt(0)==' ') c = c.substring(1,c.length);\\nif (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);\\n}\\nreturn null;\\n}\\nfunction rdprefs() {\\nvar cookie_val = readCookie('myprefs');\\nnwcbe.checked = false;\\nif (cookie_val) {\\nvar va = cookie_val.split('+');\\nfor(var i=0;i < va.length;i++) {\\nvar val = va[i];\\nif (val == 'new_window') {\\nnwcbe.checked = true;\\n}\\n}\\n}\\n}\\nfunction xnwcb() { rnwcb(); svprefs(); }\\nfunction getBgColor(e) {\\nif (e.currentStyle)\\nreturn e.currentStyle.backgroundColor;\\nif (window.getComputedStyle) {\\nvar eStyle=window.getComputedStyle(e,'');\\nif (eStyle)\\nreturn eStyle.getPropertyValue('background-color');\\n}\\nreturn '#ffffff';\\n}\\nfunction hacky_grayscale (c) {\\nif (c.substr(0, 4) === 'rgb(') {\\nreturn c.substr(4).split(',',1)[0];\\n} else if (c.substr(0,1) === '#') {\\nreturn parseInt(c.substr(1,2), 16);\\n}\\nreturn 255;\\n}\\nvar h_t;\\nvar h_e;\\nvar hoc;\\nvar hog;\\nvar hor;\\nfunction h(id,phase) {\\nif (id) {\\nunh();\\nh_e = document.getElementById(id);\\nhoc = getBgColor(h_e);\\nhog = hacky_grayscale(hoc);\\nhor = 'rgb('+hog+','+hog+',';\\nh(0,1);\\n} else if (phase < 6) {\\nh_e.style.backgroundColor=hor+(hog-phase*16)+')';\\nh_t = setTimeout('h(0,'+(phase+1)+')',100);\\n} else if (phase < 12) {\\nh_e.style.backgroundColor=hor+(hog-6*16+(phase-6)*16)+')';\\nvar tms = 100;\\nif (phase == 6) { tms = 1000; }\\nh_t = setTimeout('h(0,'+(phase+1)+')',tms);\\n} else if (phase == 12) {\\nh_e.style.backgroundColor = hoc;\\nh_t=null;\\n}\\n}\\nfunction unh(id,phase) {\\nif (h_t != null) {\\nclearTimeout(h_t);\\nh_e.style.backgroundColor = hoc;\\n}\\n}\\nfunction sd(id,d) {\\nvar e = document.getElementById(id);\\ne.style.display = d;\\n}\\nfunction td(id) {\\nvar e = document.getElementById(id);\\nif (e.style.display == 'none') {\\ne.style.display = 'block';\\n} else {\\ne.style.display = 'none';\\n}\\n}\\nfunction xdates(ko,nh) {\\nvar tde = document.getElementById('thisdate');\\nvar dbe = document.getElementById('dateform');\\nif (ko || (dbe.style.display == 'none')) {\\nif (!nh) { h('datebox'); }\\ntde.style.display = 'none';\\ndbe.style.display = 'block';\\n} else {\\nunh();\\ntde.style.display = 'block';\\ndbe.style.display = 'none';\\n}\\n}\\nfunction isTouchDevice() {\\nreturn 'ontouchstart' in window || navigator.maxTouchPoints > 0;\\n}\\nfunction replaceShareHandlers() {\\nfunction handler(cn,p,ii) {\\nreturn function(e) {\\nif (!e) var e = window.event;\\noveritem(cn,p,ii,e);\\n};\\n}\\nvar elements = document.getElementsByClassName('itc1');\\nfor (var i=0; i<elements.length; i++) {\\nif (elements[i].getElementsByClassName('ifsp').length == 0) { // we're not in a sponsor post\\nid = elements[i].getElementsByClassName('item')[0].getAttribute('ID').split('i');\\nelements[i].onmouseover = handler(id[0], true, id[1]);\\nelements[i].onmouseout = handler(id[0], false, id[1]);\\n}\\n}\\n}\\nfunction overitem(cn, p, ii, e) {\\nif (e && (e.target.tagName == \\\"A\\\") && isTouchDevice())\\nreturn;\\nvar dxe = document.getElementById(cn + 'dx' + ii);\\nif (dxe) {\\nif (p) {\\nvar de = document.getElementById(cn + 'd' + ii);\\ndxe.style.height=de.offsetHeight+'px';\\ndxe.style.display = 'block';\\n} else {\\ndxe.style.display = 'none';\\n}\\n}\\nvar scniii = 's' + cn + 'i' + ii;\\nif (p) {\\nshareOn(scniii);\\naddlinkoShowButton(cn, ii); // Add this line\\n} else {\\nshareOff(scniii);\\naddlinkoHideButton(cn, ii); // Add this line\\n}\\n}\\nfunction addlinkoShowButton(cn, ii) {\\nvar itemId = cn + 'i' + ii;\\nvar buttonId = 'add-link-btn-' + itemId;\\nvar formId = 'addlinko-' + itemId;\\nif (document.getElementById(formId)) {\\nreturn;\\n}\\nvar existingButton = document.getElementById(buttonId);\\nif (!existingButton) {\\nvar item = document.getElementById(itemId);\\nif (item) {\\nvar button = document.createElement('button');\\nbutton.id = buttonId;\\nbutton.classList.add('addlinkxbut','addlinkobut');\\nbutton.innerHTML = '&UpperLeftArrow; Add Link Here';\\nbutton.onclick = function() { addlinkoShowForm(cn, ii); };\\nitem.style.position = 'relative';\\nitem.appendChild(button);\\n}\\n} else {\\nexistingButton.style.display = 'block';\\n}\\n}\\nfunction addlinkoHideButton(cn, ii) {\\nvar itemId = cn + 'i' + ii;\\nvar buttonId = 'add-link-btn-' + itemId;\\nvar button = document.getElementById(buttonId);\\nif (button) {\\nbutton.style.display = 'none';\\n}\\n}\\nfunction addlinkoShowForm(cn, ii) {\\nvar itemId = cn + 'i' + ii;\\nvar formId = 'addlinko-' + itemId;\\nvar buttonId = 'add-link-btn-' + itemId;\\nvar button = document.getElementById(buttonId);\\nif (button) {\\nbutton.style.display = 'none';\\n}\\nif (document.getElementById(formId)) {\\nreturn;\\n}\\nvar item = document.getElementById(itemId);\\nif (item) {\\nvar form = document.createElement('div');\\nform.id = formId;\\nform.className = 'addlinko';\\nvar spanId = 's' + cn + 'i' + ii;\\nvar span = document.getElementById(spanId);\\nvar permalink = '';\\nif (span && span.getAttribute('pml')) {\\npermalink = pmlToPermalink(span.getAttribute('pml'));\\n}\\nform.innerHTML = '<button class=\\\"addlinkxbut addlinkoclosebut\\\" onclick=\\\"addlinkoCloseForm(\\\\'' + cn + '\\\\', ' + ii + ')\\\">Close Form</button>' + addlinkoCreateDynForm(permalink);\\nitem.appendChild(form);\\n}\\n}\\nfunction addlinkoCloseForm(cn, ii) {\\nvar itemId = cn + 'i' + ii;\\nvar formId = 'addlinko-' + itemId;\\nvar form = document.getElementById(formId);\\nif (form) {\\nform.remove();\\n}\\n}\\nfunction addlinkoCreateDynForm(relatedUrl) {\\nconst uniqueSuffix = Date.now().toString(36) + Math.random().toString(36).substr(2, 5);\\nconst html = `\\n<div class=\\\"addlinki-form-container\\\" data-form-id=\\\"${uniqueSuffix}\\\">\\n<div class=\\\"addlinki-cta\\\">Help us discover links that make Techmeme more useful!</div>\\n<div class=\\\"addlinki-guidelines\\\">\\nUse this form to suggest social posts, blog posts, or news stories to add as secondary links underneath the above headline.\\nSubmitting your own posts or posts from your company is encouraged, as long as they add a new perspective and improve Techmeme.\\nAll submissions are fully vetted by human editors. Anything spammy or merely unhelpful will not be added.\\n</div>\\n<div id=\\\"addlinkiMessage_${uniqueSuffix}\\\" class=\\\"addlinki-message addlinki-hidden\\\"></div>\\n<form id=\\\"addlinkiSubmissionForm_${uniqueSuffix}\\\" autocomplete=\\\"on\\\">\\n<input type=\\\"hidden\\\" name=\\\"related_url\\\" value=\\\"${relatedUrl}\\\">\\n<input type=\\\"hidden\\\" id=\\\"addlinkiCval_${uniqueSuffix}\\\" name=\\\"cval\\\" value=\\\"v.8675309999.123.4.56.683a646b.683a646b\\\">\\n<div class=\\\"addlinki-form-group\\\">\\n<label for=\\\"addlinkiUrl_${uniqueSuffix}\\\">URL <span class=\\\"addlinki-required\\\">*</span></label>\\n<input type=\\\"url\\\"\\nid=\\\"addlinkiUrl_${uniqueSuffix}\\\"\\nname=\\\"url\\\"\\nautocomplete=\\\"url\\\"\\nplaceholder=\\\"https://examplepost.com/32767\\\"\\nrequired>\\n<div class=\\\"addlinki-field-description\\\">\\nThe complete URL of the post to add underneath the above Techmeme headline.\\n</div>\\n<div id=\\\"addlinkiUrlError_${uniqueSuffix}\\\" class=\\\"addlinki-error\\\"></div>\\n</div>\\n<div class=\\\"addlinki-form-group\\\">\\n<label for=\\\"addlinkiEmail_${uniqueSuffix}\\\">Email <span class=\\\"addlinki-required\\\">*</span></label>\\n<input type=\\\"email\\\"\\nid=\\\"addlinkiEmail_${uniqueSuffix}\\\"\\nname=\\\"email\\\"\\nautocomplete=\\\"username\\\"\\nplaceholder=\\\"person@company.com\\\"\\nrequired>\\n<div class=\\\"addlinki-field-description\\\">\\nYour work email. If your submission is added, we will email you letting you know right away.\\n</div>\\n<div id=\\\"addlinkiEmailError_${uniqueSuffix}\\\" class=\\\"addlinki-error\\\"></div>\\n</div>\\n<div class=\\\"addlinki-form-group\\\">\\n<label for=\\\"addlinkiNote_${uniqueSuffix}\\\">Optional note</label>\\n<textarea id=\\\"addlinkiNote_${uniqueSuffix}\\\"\\nname=\\\"note\\\"\\nautocomplete=\\\"off\\\"\\nrows=\\\"2\\\"></textarea>\\n<div class=\\\"addlinki-field-description\\\">\\nThis field is usually not needed, but if there's a nonobvious reason this link is notable, please explain.\\n</div>\\n</div>\\n<button type=\\\"submit\\\" class=\\\"addlinkxbut addlinkisub\\\" id=\\\"addlinkiSubmitButton_${uniqueSuffix}\\\">Submit</button>\\n</form>\\n</div>\\n`;\\nsetTimeout(() => addlinkoInitializeDynForm(uniqueSuffix), 0);\\nreturn html;\\n}\\nfunction addlinkoInitializeDynForm(uniqueSuffix) {\\nlet formData = {\\nt0: null,\\nt1: null,\\ncval: null\\n};\\nfunction wglfp() {\\ntry {\\nconst canvas = document.createElement('canvas');\\nconst gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\\nif (!gl) return null;\\nconst debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\\nif (!debugInfo) return null;\\nconst vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);\\nconst renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);\\nconst shadingLanguageVersion = gl.getParameter(gl.SHADING_LANGUAGE_VERSION);\\nconst version = gl.getParameter(gl.VERSION);\\nconst webglInfo = vendor + '|' + renderer + '|' + shadingLanguageVersion + '|' + version;\\nlet hash = 5381;\\nfor (let i = 0; i < webglInfo.length; i++) {\\nhash = ((hash << 5) + hash) + webglInfo.charCodeAt(i);\\n}\\nreturn hash >>> 0;\\n} catch (e) {\\nreturn null;\\n}\\n}\\nfunction setCval() {\\nconst d = new Date();\\nvar t = Math.floor(d.getTime() / 1000);\\nif (!formData.t0) { formData.t0 = t; }\\nformData.t1 = t;\\nvar n = window.navigator.userAgent.match(/([0-9.]*)$/);\\nformData.cval = 'w.' + wglfp() + '.' + n[0] + '.' + formData.t0.toString(16) + '.' + formData.t1.toString(16);\\ndocument.getElementById(`addlinkiCval_${uniqueSuffix}`).value = formData.cval;\\n}\\nfunction isValidUrl(string) {\\ntry {\\nconst url = new URL(string);\\nreturn url.protocol === 'http:' || url.protocol === 'https:';\\n} catch (_) {\\nreturn false;\\n}\\n}\\nfunction isValidEmail(email) {\\nconst emailRegex = /^[^\\\\s@]+@[^\\\\s@]+\\\\.[^\\\\s@]+$/;\\nreturn emailRegex.test(email);\\n}\\nfunction showMessage(message, type) {\\nconst messageContainer = document.getElementById(`addlinkiMessage_${uniqueSuffix}`);\\nmessageContainer.textContent = message;\\nmessageContainer.className = `addlinki-message addlinki-${type}`;\\n}\\nfunction hideMessage() {\\nconst messageContainer = document.getElementById(`addlinkiMessage_${uniqueSuffix}`);\\nmessageContainer.className = 'addlinki-message addlinki-hidden';\\n}\\nfunction submitForm() {\\nconst form = document.getElementById(`addlinkiSubmissionForm_${uniqueSuffix}`);\\nconst submitButton = document.getElementById(`addlinkiSubmitButton_${uniqueSuffix}`);\\nconst formDataObj = new FormData(form);\\nsubmitButton.disabled = true;\\nsubmitButton.textContent = 'Submitting...';\\nshowMessage('Submitting your information...', 'loading');\\nfetch('/do/itip.php', {\\nmethod: 'POST',\\nbody: formDataObj\\n})\\n.then(response => response.json())\\n.then(data => {\\nif (data.success) {\\nshowMessage('Thank you, link submitted.', 'success');\\nform.reset();\\ndocument.getElementById(`addlinkiCval_${uniqueSuffix}`).value = 'v.8675309999.123.4.56.683a646b.683a646b';\\n} else {\\nshowMessage('We encountered an error and your link was not submitted. Apologies!', 'failure');\\n}\\n})\\n.catch(error => {\\nconsole.error('Error:', error);\\nshowMessage('We encountered an error and your link was not submitted. Apologies!', 'failure');\\n})\\n.finally(() => {\\nsubmitButton.disabled = false;\\nsubmitButton.textContent = 'Submit';\\n});\\n}\\nconst form = document.getElementById(`addlinkiSubmissionForm_${uniqueSuffix}`);\\nconst urlInput = document.getElementById(`addlinkiUrl_${uniqueSuffix}`);\\nconst emailInput = document.getElementById(`addlinkiEmail_${uniqueSuffix}`);\\nconst noteInput = document.getElementById(`addlinkiNote_${uniqueSuffix}`);\\n[urlInput, emailInput, noteInput].forEach(input => {\\ninput.addEventListener('input', setCval);\\ninput.addEventListener('focus', setCval);\\n});\\nform.addEventListener('mouseover', setCval);\\nform.addEventListener('submit', function(e) {\\ne.preventDefault();\\nsetCval();\\ndocument.getElementById(`addlinkiUrlError_${uniqueSuffix}`).textContent = '';\\ndocument.getElementById(`addlinkiEmailError_${uniqueSuffix}`).textContent = '';\\nhideMessage();\\nconst url = urlInput.value.trim();\\nconst email = emailInput.value.trim();\\nlet isValid = true;\\nif (!url) {\\ndocument.getElementById(`addlinkiUrlError_${uniqueSuffix}`).textContent = 'URL is required.';\\nisValid = false;\\n} else if (!isValidUrl(url)) {\\ndocument.getElementById(`addlinkiUrlError_${uniqueSuffix}`).textContent = 'Please enter a valid URL.';\\nisValid = false;\\n}\\nif (!email) {\\ndocument.getElementById(`addlinkiEmailError_${uniqueSuffix}`).textContent = 'Email address is required.';\\nisValid = false;\\n} else if (!isValidEmail(email)) {\\ndocument.getElementById(`addlinkiEmailError_${uniqueSuffix}`).textContent = 'Please enter a valid email address.';\\nisValid = false;\\n}\\nif (isValid) {\\nsubmitForm();\\n}\\n});\\nurlInput.addEventListener('blur', function() {\\nconst url = this.value.trim();\\nconst errorElement = document.getElementById(`addlinkiUrlError_${uniqueSuffix}`);\\nif (url && !isValidUrl(url)) {\\nerrorElement.textContent = 'Please enter a valid URL.';\\n} else {\\nerrorElement.textContent = '';\\n}\\n});\\nemailInput.addEventListener('blur', function() {\\nconst email = this.value.trim();\\nconst errorElement = document.getElementById(`addlinkiEmailError_${uniqueSuffix}`);\\nif (email && !isValidEmail(email)) {\\nerrorElement.textContent = 'Please enter a valid email address.';\\n} else {\\nerrorElement.textContent = '';\\n}\\n});\\n}\\nfunction tgd(cnum, p, inum) {\\nvar setd, setp;\\nif (p) { setp = 'block'; setd = 'none'; }\\nelse { setp = 'none'; setd = 'block'; }\\nvar i, ei;\\nif (inum) {\\ni=inum; ei=inum;\\n} else {\\ni=1; ei=-1;\\ndocument.getElementById(cnum+'dxr').style.display = setd;\\ndocument.getElementById(cnum+'pxr').style.display = setp;\\n}\\nwhile (true) {\\nvar ie = document.getElementById(cnum+'i'+i);\\nif (ie == null) { break; }\\nvar pe = document.getElementById(cnum+'p'+i);\\nif (pe) {\\nvar de = document.getElementById(cnum+'d'+i);\\npe.style.display = setp;\\nde.style.display = setd;\\nif (p) {\\ndocument.getElementById(cnum+'px'+i).style.height = pe.offsetHeight+'px';\\n} else {\\nif (inum) {\\ndocument.getElementById(cnum+'dx'+i).style.height = de.offsetHeight+'px';\\n} else {\\ndocument.getElementById(cnum+'dx'+i).style.display = 'none';\\n}\\n}\\n}\\nif (i == ei) { break; }\\ni++;\\n}\\nif (!p && !inum) {\\ndocument.getElementById(cnum+'i'+1).scrollIntoView();\\n}\\n}\\nvar baseFeedTime = 1781283651000;var pgrdad='June 12, 2026, 1:00 PM';\\nvar m2_ead='260612/h1300';\\nvar curr_yy=26;\\nvar min_mod=5;\\nvar lb_ead='260612';\\n\\nvar m1_sad_d='September 12, 2005';\\nvar m1_sad='050912/h0000';\\nvar m2_sad=m1_sad;\\nvar arrt='https://www.techmeme.com/';\\nfunction godate(d) {\\nd = d.replace(/a\\\\.?m/i, ' am');\\nd = d.replace(/p\\\\.?m/i, ' pm');\\nvar pa=new Array(/^jan/i,/^feb/i,/^mar/i,/^apr/i,/^may/i,/^jun/i,/^jul/i,/^aug/i,/^sep/i,/^oct/i,/^nov/i,/^dec/i);\\nvar fa = d.split(/[^a-zA-Z0-9]+/g);\\nfor(var i=0;i<12;i++) {\\nif (fa[0].match(pa[i])) {\\nvar ip1 = i+1;\\nfa[0] = ip1+'';\\n}\\n}\\nvar em='Sorry, no archives exist prior to '+m1_sad_d;\\nvar tpyy;\\nif (fa.length==2) {\\nfa[2] = curr_yy+'';\\ntpyy=((100+curr_yy-1)+'').substring(1,3);\\n}\\nif (fa[2] > 1900) {\\nif (fa[2] < 2001) {\\nalert(em);\\nreturn;\\n}\\nfa[2] = fa[2].substring(2,4);\\n} else if (fa[2] > 80) {\\nalert(em);\\nreturn;\\n}\\nvar h,m;\\nif (fa[3]=='0' || fa[3]=='00' || (fa[0]>=1 && fa[3]<=23)) {\\nh=parseInt(fa[3],10);\\nm=parseInt(fa[4],10);\\nif (!m) { m=0; }\\n} else {\\nh=20;\\nm=0;\\n}\\nm=m-m%min_mod;\\nif ((fa[4]=='pm'||fa[5]=='pm') && h<12) {\\nh+=12;\\n} else if ((fa[4]=='am'||fa[5]=='am') && h==12) {\\nh=0;\\n}\\nfa[3]=h+'';\\nfa[4]=m+'';\\nif (\\n(fa[0]>=1 && fa[0]<=12) &&\\n(fa[1]>=1 && fa[1]<=31) &&\\n(fa[2]>=1 && fa[2]<=curr_yy) &&\\n(fa[4]>=0 && fa[4]<=59)\\n) {\\nfor(var i=0;i<fa.length;i++) {\\nvar f=fa[i];\\nif (f.length < 2) {\\nfa[i]='0'+f;\\n}\\n}\\nvar m2_ad=fa[2]+fa[0]+fa[1]+'/h'+fa[3]+fa[4];\\nvar m1_ad;\\nif ((m2_ad > m2_ead) && tpyy) {\\nm2_ad=tpyy+m2_ad.substr(2,m2_ad.length);\\nm1_ad=tpyy;\\n} else {\\nm1_ad=fa[2];\\n}\\nm1_ad=m1_ad+'/'+fa[0]+'/'+fa[1]+'/';\\nif (m2_ad > m2_ead) {\\nalert(\\\"Sorry, no page exists yet for that date\\\");\\n} else if (m2_ad < m1_sad) {\\nalert(em);\\n} else if (m2_ad < m2_sad) {\\nlocation = arrt+m1_ad;\\n} else {\\nlocation = arrt+m2_ad;\\n}\\n} else {\\nalert('Please use this format: '+pgrdad);\\n}\\n}\\nvar arrt='https://www.techmeme.com/';\\nvar nowrd='(none)';\\nvar lb_sad_d='September 30, 2007';\\nvar lb_sad='070930';\\nfunction lbgodate(d) {\\nd = d.replace(/a\\\\.?m/i, ' am');\\nd = d.replace(/p\\\\.?m/i, ' pm');\\nvar pa=new Array(/^jan/i,/^feb/i,/^mar/i,/^apr/i,/^may/i,/^jun/i,/^jul/i,/^aug/i,/^sep/i,/^oct/i,/^nov/i,/^dec/i);\\nvar fa = d.split(/[^a-zA-Z0-9]+/g);\\nfor(var i=0;i<12;i++) {\\nif (fa[0].match(pa[i])) {\\nvar ip1 = i+1;\\nfa[0] = ip1+'';\\n}\\n}\\nvar em='Sorry, no leaderboards exist prior to '+lb_sad_d;\\nvar tpyy;\\nif (fa.length==2) {\\nfa[2] = curr_yy+'';\\ntpyy=((100+curr_yy-1)+'').substring(1,3);\\n}\\nif (fa[2] > 1900) {\\nif (fa[2] < 2001) {\\nalert(em);\\nreturn;\\n}\\nfa[2] = fa[2].substring(2,4);\\n} else if (fa[2] > 80) {\\nalert(em);\\nreturn;\\n}\\nif ((fa[0]>=1 && fa[0]<=12) &&\\n(fa[1]>=1 && fa[1]<=31) &&\\n(fa[2]>=1 && fa[2]<=curr_yy)\\n) {\\nfor(var i=0;i<fa.length;i++) {\\nvar f=fa[i];\\nif (f.length < 2) {\\nfa[i]='0'+f;\\n}\\n}\\nvar lb_ad=fa[2]+fa[0]+fa[1];\\nif ((lb_ad > lb_ead) && tpyy) {\\nlb_ad=tpyy+lb_ad.substr(2,lb_ad.length);\\n}\\nif (lb_ad > lb_ead) {\\nalert(\\\"Sorry, no leaderboards exist yet for that date\\\");\\n} else if (lb_ad < lb_sad) {\\nalert(em);\\n} else {\\nlocation = arrt+lb_ad+'/lb';\\n}\\n} else {\\nalert('Please use this format: '+nowrd);\\n}\\n}\\nfunction tlbrows(id) {\\nvar bhe=document.getElementById(id+'_hide_button');\\nvar bse=document.getElementById(id+'_show_button');\\nvar set_rows;\\nif (bhe.style.display == 'none') {\\nset_rows='';\\nbse.style.display='none';\\n} else {\\nset_rows='none';\\nbse.style.display='';\\n}\\nbhe.style.display=set_rows;\\nvar t=document.getElementById(id);\\nvar oRows = t.getElementsByTagName('tr');\\nvar iRowCount = oRows.length;\\nvar i;\\nfor(i=11;i<iRowCount;i++) {\\nt.rows[i].style.display=set_rows;\\n}\\nif (set_rows == 'none') {\\ndocument.getElementById('a'+id).scrollIntoView();\\n}\\n}\\nfunction hhash() {\\nvar a=location.hash;\\nif (a) {\\nvar i;\\nif (a.match(/^#a\\\\d{6}/)) {\\ni=a.substring(2,a.length);\\n} else {\\ni=a.substring(1);\\n}\\nvar je = document.getElementById(i);\\nif (je) {\\nje.scrollIntoView();\\nh(i);\\n}\\n}\\n}\\nvar TdTD = 400;\\nvar TnTB = 700;\\nvar TwTSE = 200;\\nvar TnOE = 3;\\nvar TwTBE = 0;\\nvar TwTCD = 150;\\nvar TsTS = '/do/lc';\\nvar TeTD = Number.MAX_VALUE;\\nvar TgETD = false;\\nvar TdE = new Array();\\nvar TE = function() {\\nthis.Tx = false;\\nthis.Ts = 0;\\nthis.Td = 0;\\nthis.toString = function() {\\nreturn this.Ts + \\\" \\\" + this.Td;\\n}\\n}\\nTE.Tc = function (a,b) {\\nreturn a.Td - b.Td\\n}\\nvar TcE_ = null;\\nfunction TgXMLHR() {\\nvar Tx = false;\\nif (window.XMLHttpRequest) {\\nTx = new XMLHttpRequest();\\n} else {\\ntry\\n{\\nTx = new ActiveXObject(\\\"Msxml2.XMLHTTP\\\");\\n}\\ncatch (ev)\\n{\\ntry\\n{\\nTx = new ActiveXObject(\\\"Microsoft.XMLHTTP\\\");\\n}\\ncatch (ev)\\n{\\nTx = false;\\n}\\n}\\n}\\nreturn Tx;\\n}\\nfunction TeD() {\\nTcE_ = new TE();\\nTcE_.Tx = TgXMLHR();\\nif (TcE_.Tx) {\\nTcE_.Tx.open('POST', TsTS+'?tm=true', true);\\nTcE_.Tx.setRequestHeader(\\\"Content-type\\\", \\\"application/x-www-form-urlencoded\\\");\\nTcE_.Tx.onreadystatechange = TeC;\\nTcE_.Ts = new Date().getTime();\\nTcE_.Tx.send(null);\\n}\\n}\\nfunction TeC() {\\nif (TcE_.Tx.readyState == 4 && TcE_.Tx.status == 200) {\\nTcE_.Td = new Date().getTime() - TcE_.Ts;\\nTdE.push(TcE_);\\nif (TdE.length < TnOE)\\nsetTimeout(\\\"TeD()\\\", TwTBE);\\nelse\\nTcED();\\n}\\n}\\nfunction TcED() {\\nTdE.sort(TE.Tc);\\nTeTD = TdE[Math.floor(TnOE/2)].Td + TwTCD;\\nTgETD= true;\\n}\\nfunction Tt(link) {\\nif (isSafari() && TgETD && TeTD <= TdTD)\\n{\\nvar TtD = TeTD;\\nvar Tx = TgXMLHR();\\nif (Tx) {\\nTx.open('POST', TsTS+'?tm=false&href='+encodeURIComponent(link.href)+'&data='+TtD_(TtD),false);\\nTx.setRequestHeader(\\\"Content-type\\\", \\\"application/x-www-form-urlencoded\\\");\\nTx.send(null);\\n}\\n}\\nelse if (!(TgETD && (TeTD >= TnTB)))\\n{\\nvar TtD;\\nif (!TgETD || (TgETD && (TeTD > TdTD)))\\nTtD = TdTD;\\nelse\\nTtD = TeTD;\\nvar Tx = TgXMLHR();\\nif (Tx) {\\nTx.open('POST', TsTS+'?tm=false&href='+encodeURIComponent(link.href)+'&data='+TtD_(TtD),true);\\nTx.setRequestHeader(\\\"Content-type\\\", \\\"application/x-www-form-urlencoded\\\");\\nTx.send(null);\\nvar TcT = new Date();\\nTeT = TcT.getTime() + TtD;\\nwhile (TcT.getTime() < TeT)\\nTcT = new Date();\\nif (Tx.readyState != 4)\\nTx.abort();\\n}\\n}\\n}\\nfunction isSafari() {\\nreturn ((navigator.appCodeName + navigator.appName + navigator.appVersion).search(/safari/i) != -1);\\n}\\nfunction TtD_(TtD) {\\nvar data =\\npgrdad + \\\" \\\" +\\nTdTD + \\\" \\\" +\\nTnTB + \\\" \\\" +\\nTwTSE + \\\" \\\" +\\nTnOE + \\\" \\\" +\\nTwTBE + \\\" \\\" +\\nTwTCD + \\\" \\\" +\\nTeTD + \\\" \\\" +\\nTgETD + \\\" \\\" +\\n\\\"(\\\" + TdE + \\\") \\\" +\\nisSafari() + \\\" \\\" +\\nTtD;\\nreturn data;\\n}\\nfunction TiLTT() {\\nvar jump_prefix = location.href.substring(0, location.href.length - location.hash.length) + '#';\\nfor (var i=0; i<=(document.links.length-1); i++) {\\nvar href = document.links[i].href;\\nif ((href.indexOf(\\\"javascript:\\\") != 0) && (href.indexOf(jump_prefix) != 0))\\ndocument.links[i].onclick = function(){Tt(this)};\\n}\\n}\\nfunction shareOff(itemId) {\\ndocument.getElementById(itemId).style.display = 'none';\\n}\\nfunction shareOn(itemId) {\\nvar shareLine = document.getElementById(itemId);\\nif (!shareLine.getAttribute('init')) {\\nshareLine.innerHTML = getShareLineHtml(shareLine);\\nshareLine.setAttribute('init','true');\\n}\\nshareLine.style.display = 'block';\\n}\\nfunction getShareLineHtml(shareLine) {\\nvar permalink = pmlToPermalink(shareLine.getAttribute('pml'));\\nvar target = nwcbe.checked? '_blank' : '_self';\\nvar html = '';\\nhtml = '<span class=\\\"icon16cont\\\">';\\nhtml = html + '<a href=\\\"' + permalink + '\\\" target=\\\"' + target + '\\\" title=\\\"Permalink\\\"><img src=\\\"/img/link_icon.png\\\"></a>';\\nvar twurl = shareLine.getAttribute('twurl');\\nif (twurl) {\\nhtml = html + '<a href=\\\"' + twurl + '\\\" target=\\\"' + target + '\\\" title=\\\"Visit tweet\\\"><img src=\\\"/img/x_icon.png\\\"></a>';\\n}\\nvar mdurl = shareLine.getAttribute('mdurl');\\nif (mdurl) {\\nhtml = html + '<a href=\\\"' + mdurl + '\\\" target=\\\"' + target + '\\\" title=\\\"Visit Mastodon post\\\"><img src=\\\"/img/mastodon_icon.png\\\"></a>';\\n}\\nvar thurl = shareLine.getAttribute('thurl');\\nif (thurl) {\\nhtml = html + '<a href=\\\"' + thurl + '\\\" target=\\\"' + target + '\\\" title=\\\"Visit Threads post\\\"><img src=\\\"/img/threads_icon.png\\\"></a>';\\n}\\nvar bsurl = shareLine.getAttribute('bsurl');\\nif (bsurl) {\\nhtml = html + '<a href=\\\"' + bsurl + '\\\" target=\\\"' + target + '\\\" title=\\\"Visit Bluesky post\\\"><img src=\\\"/img/bluesky_icon.png\\\"></a>';\\n}\\nhtml = html + '</span>';\\nreturn html;\\n}\\nfunction pmlToPermalink(pml) {\\nvar pmlParts = pml.split('p');\\nreturn 'https://www.techmeme.com/' + pmlParts[0] + '/p' + pmlParts[1] + '#a' + pml;\\n}\\nvar NTptpssd = 40*1000;\\nvar NTpsl = 3*60*1000 + 30*1000;\\nvar NTppds = 30*1000;\\nvar NTrtdpsa = 15*60*1000;\\nvar NTpssr = 40*1000;\\nvar NTvn = document.title;\\nfunction NTgxhro() {\\nif (window.XMLHttpRequest) {\\nreturn new XMLHttpRequest();\\n} else if(window.ActiveXObject) {\\nreturn new ActiveXObject(\\\"Microsoft.XMLHTTP\\\");\\n}\\n}\\nvar NTlft;\\nvar NTnpc = 0;\\nvar NTnpcial = false;\\nvar NTnpcs = false;\\nvar NTpsst;\\nvar NTdps = false;\\nvar NTnpcr = NTgxhro();\\nvar NTnpcrt;\\nvar NTnpcrti = 10*1000;\\nfunction NTsnpcps() {\\nNTpsst = (new Date()).getTime();\\nNTfnpc();\\n}\\nfunction NTfnpc() {\\nNTnpcr.open(\\\"GET\\\",\\\"/feedsmanager/ps?t=\\\" + baseFeedTime, true);\\nNTnpcr.onreadystatechange = NThnpcrsc;\\nNTnpcr.send(null);\\nNTnpcrt = setTimeout(NTnpcrt_, NTnpcrti);\\n}\\nfunction NThnpcrsc() {\\nif (NTnpcr.readyState == 4) {\\nclearTimeout(NTnpcrt);\\nif (NTnpcr.status == 200) {\\ntry {\\nvar NTr = eval(\\\"(\\\" + NTnpcr.responseText + \\\")\\\");\\nif (!NTr.error && NTr.time > NTlft) {\\nNTlft = NTr.time;\\nif (NTr.at_least) {\\nif (NTr.count == 0 && NTnpc == 0) {\\nNTdps = false;\\nNTsnnpcf(true);\\n} else {\\nNTnpc = NTr.count > NTnpc? NTr.count : NTnpc;\\nNTnpcial = true;\\nNTunpc();\\nreturn;\\n}\\n} else {\\nNTnpc = NTr.count;\\nNTunpc();\\nNTdps = false;\\nNTsnnpcf(true);\\n}\\n} else {\\nNTsnnpcf(false);\\n}\\n} catch (e) {\\nNTsnnpcf(false);\\n}\\n} else {\\nNTsnnpcf(false);\\n}\\n}\\n}\\nfunction NTsnnpcf(NTfnps) {\\nvar now = new Date();\\nif (now.getTime() - NTlft > NTrtdpsa && !NTdps)\\nNTdps = true;\\nif (NTfnps\\n|| NTdps\\n|| (now.getTime() + NTppds - NTpsst) > NTpsl)\\nsetTimeout(NTsnpcps, NTnpssi());\\nelse\\nsetTimeout(NTfnpc, NTppds);\\n}\\nfunction NTnpssi() {\\nvar now = new Date();\\nvar NTnpt = (now.getMinutes() % 5)*60000 + now.getSeconds()*1000 + now.getMilliseconds();\\nvar rand = Math.floor(Math.random()*NTpssr);\\nvar NTtl = (NTnpt < NTptpssd ? NTptpssd : 300000 + NTptpssd) - NTnpt + rand;\\nreturn NTtl;\\n}\\nfunction NTunpc() {\\ndocument.getElementById('newpostscounter').innerHTML =\\nNTnpc + (NTnpcial? '+':'') + ' new item' + (NTnpc > 1 || NTnpcial ? 's' : '');\\nif (!NTnpcs && NTnpc > 0) {\\nvar col = document.getElementById('countercol');\\nvar ticker = document.getElementById('newpostscounter');\\nvar holder = document.getElementById('countercolspaceholder');\\nvar spacer = document.getElementById('counterspacer');\\nif (navigator.appName == 'Microsoft Internet Explorer')\\nticker.style.display = 'block';\\nelse {\\ncol.style.position = 'absolute';\\nticker.style.display = 'block';\\nholder.style.display = 'block';\\nif (spacer)\\nspacer.style.display = 'block';\\nholder.style.height=(col.offsetHeight - ticker.offsetHeight - ticker.offsetTop) + 'px';\\nfunction NTfcd () {\\nholder.style.display = 'none';\\ncol.className = 'notransitions';\\ncol.style.top = '0';\\ncol.style.position = 'relative';\\n}\\ncol.addEventListener('transitionend',NTfcd,false);\\ncol.addEventListener('oTransitionEnd',NTfcd,false);\\ncol.addEventListener('webkitTransitionEnd', NTfcd, false);\\nsetTimeout(function() {\\nholder.className='spaceholdertransitions';\\ncol.className='countercoltransitions';\\ncol.style.top=(ticker.offsetHeight + ticker.offsetTop + (spacer? spacer.offsetHeight : 0)) +'px';\\nholder.style.height=(col.offsetHeight + (spacer? spacer.offsetHeight : 0)) +'px';\\n},1000);\\n}\\nNTnpcs = true;\\n}\\nif (NTnpc > 0)\\ndocument.title = '(' + NTnpc + (NTnpcial? '+':'') + ') ' + NTvn;\\n}\\nfunction NTnpcrt_() {\\nif (NTnpcr.readyState != 0) {\\nNTnpcr.onreadystatechange = null;\\nNTnpcr.abort();\\nNTsnnpcf(false);\\n}\\n}\\nfunction NTinpcp() {\\nNTlft = baseFeedTime;\\nvar now = new Date();\\nif (now.getTime() - NTlft > NTrtdpsa)\\nNTdps = true;\\nvar NTnpt = (now.getMinutes() % 5)*60000 + now.getSeconds()*1000 + now.getMilliseconds();\\nvar NTbfd = new Date(baseFeedTime);\\nvar NTnp;\\nif (now.getTime() - NTnpt == baseFeedTime - NTbfd.getSeconds()*1000 - NTbfd.getMilliseconds()) {\\nNTnp = 300000 + NTptpssd - NTnpt + Math.floor(Math.random()*NTpssr);\\nsetTimeout(NTsnpcps, NTnp);\\n} else if (NTnpt < NTptpssd || NTnpt > NTptpssd + NTpsl) {\\nNTnp = NTnpssi();\\nsetTimeout(NTsnpcps, NTnp);\\n} else {\\nNTpsst = now.getTime() - NTnpt + NTptpssd;\\nNTnp = Math.floor(Math.random()*NTpssr);\\nsetTimeout(NTfnpc, NTnp);\\n}\\n}\\nfunction NTiD3fpor() {\\nvar pattern = /https?:\\\\/\\\\/(www\\\\.)?techmeme\\\\.com($|\\\\/$|\\\\/#|\\\\/river)/i;\\nreturn pattern.test(location.href);\\n}\\nfunction NTiD3t() {\\nif (NTiD3fpor())\\nNTit();\\n}\\nfunction NTit() {\\nsetTimeout(function() {\\nNTinpcp();\\n}, 0);\\n}\\nfunction cmplu() {\\nvar a=location.hash;\\nif (!a) {\\nvar lh=location.href;\\nlh = lh.replace(/\\\\?.*$/, '');\\nif (lh.search(/\\\\/[0-9][0-9][0-9][0-9][0-9][0-9]\\\\/p[0-9]*$/) != -1) {\\nvar pa = lh.split('/');\\nvar di = pa.length - 2;\\nvar na = lh + '#a' + pa[di] + pa[di+1];\\nwindow.location.replace(na);\\n}\\n}\\n}\\nfunction phoneOrTablet() {\\nreturn navigator.userAgent.match(/phone|droid|palm|webos|pocket|symbian|ipad|windows.*nt.*touch/i);\\n}\\nvar showExcerptTimer;\\nvar showExcerptIn = 400; // ms\\nvar noDelayInShowingExcerpt = false;\\nvar turnOnExcerptDelayTimer;\\nvar turnOnExcerptDelayIn = 500; // ms\\nfunction initDiscussionExcerptBlocks() {\\nvar items = document.getElementsByClassName('item');\\nfor (i=0; i<items.length; i++)\\nif (items[i].id) {\\nvar itemId = items[i].id.split('i');\\nvar unexpandedDiscussionBlock = document.getElementById(itemId[0]+'d'+itemId[1]);\\nvar expandedDiscussionBlock = document.getElementById(itemId[0]+'p'+itemId[1]);\\nif (unexpandedDiscussionBlock && expandedDiscussionBlock) {\\nvar blss = unexpandedDiscussionBlock.getElementsByClassName('bls');\\nvar dbpts = expandedDiscussionBlock.getElementsByClassName('dbpt'); // should have the same length as blss\\nfor (j=0; j<blss.length; j++) {\\ndLinks = blss[j].getElementsByTagName('A');\\ndExcerpts = dbpts[j].getElementsByClassName('di'); // should be of the same length as dLinks\\nfor (k=0; k<dLinks.length; k++) {\\nvar dExcerptId = items[i].id+'d'+j+'e'+k;\\ndExcerpts[k].id = dExcerptId;\\nvar span = document.createElement('span');\\nspan.id = dExcerptId + 'db';\\nspan.className='ditemblock';\\nspan.onmouseover = getDLinkMouseOverHandler(dExcerptId); // not using addEventListener, for compatibility w/ IE8\\nspan.onmouseout = getDLinkMouseOutHandler(dExcerptId);\\nblss[j].insertBefore(span, dLinks[k]);\\nspan.appendChild(dLinks[k]);\\n}\\n}\\n}\\n}\\n}\\nfunction getDLinkMouseOverHandler(excerptId) {\\nreturn function() {\\nif (noDelayInShowingExcerpt) {\\nif (turnOnExcerptDelayTimer)\\nclearTimeout(turnOnExcerptDelayTimer);\\nshowDiscussionExcerpt(excerptId);\\n} else\\nshowExcerptTimer = setTimeout(function() {\\nshowDiscussionExcerpt(excerptId);\\nif (turnOnExcerptDelayTimer)\\nclearTimeout(turnOnExcerptDelayTimer);\\nnoDelayInShowingExcerpt = true;\\n}, showExcerptIn);\\n}\\n}\\nfunction getDLinkMouseOutHandler(excerptId) {\\nreturn function() {\\nif (showExcerptTimer)\\nclearTimeout(showExcerptTimer);\\nhideDiscussionExcerpt(excerptId);\\nif (noDelayInShowingExcerpt) {\\nif (turnOnExcerptDelayTimer)\\nclearTimeout(turnOnExcerptDelayTimer);\\nturnOnExcerptDelayTimer = setTimeout(function() {\\nnoDelayInShowingExcerpt = false;\\n}, turnOnExcerptDelayIn);\\n}\\n}\\n}\\nfunction showDiscussionExcerpt(excerptId) {\\ndiscussionBlock = document.getElementById(excerptId+'db');\\nvar bubble = document.getElementById(excerptId+'b');\\nif (!bubble) {\\nbubble = document.createElement('span');\\nbubble.id = excerptId+'b';\\nbubble.className = 'ditemexcerptcontainer';\\nbubble.innerHTML = getDiscussionExcerptHtml(excerptId);\\ndiscussionBlock.appendChild(bubble);\\n}\\nbubble.style.display = 'block';\\n}\\nfunction getDiscussionExcerptHtml(excerptId) {\\nvar html = '<span class=\\\"ditemexcerpt\\\">';\\nvar excerpt = document.getElementById(excerptId);\\nvar citation = excerpt.getElementsByTagName('cite')[0].innerHTML;\\nvar as = excerpt.getElementsByTagName('a');\\nvar a = as[as.length-1];\\nhtml += '<cite>' + citation + '</cite>' +\\n'<span class=\\\"excerpt\\\">' + a.innerHTML + '</span>';\\nvar tweetId = getTweetId(a.href);\\nif (tweetId)\\nhtml += getIntentsHtml(tweetId);\\nhtml += '</span>';\\nreturn html;\\n}\\nfunction getTweetId(str) {\\nvar tweetUrlPattern = /^http:\\\\/\\\\/twitter.com\\\\/.+\\\\/status\\\\/(\\\\d+)$/i\\nvar match = tweetUrlPattern.exec(str);\\nreturn match!=null? match[1] : null;\\n}\\nfunction getIntentsHtml(tweetId) {\\nreturn '<table class=\\\"intents\\\"><tr>' +\\n'<td class=\\\"intent\\\" align=\\\"center\\\"><a href=\\\"https://twitter.com/intent/tweet?in_reply_to=' + tweetId + '\\\"><div class=\\\"reply\\\">&nbsp;</div></a></td>' +\\n'<td class=\\\"intent\\\" align=\\\"center\\\"><a href=\\\"https://twitter.com/intent/retweet?tweet_id=' + tweetId + '\\\"><div class=\\\"retweet\\\">&nbsp;</div></a></td>' +\\n'<td class=\\\"intent\\\" align=\\\"center\\\">\", \"body_truncated\": true, \"truncation_note\": \"正文已截断:原始约 376281 字符,仅保留前 32000 字符。门户/频道首页通常过大,摘要请优先使用具体文章页 URL。\"}", "name": "http_request"}, {"role": "tool", "tool_call_id": "call_02_fq8otnkce4MJ0PhCryJ53839", "content": "{\"status_code\": 200, \"headers\": {\"date\": \"Fri, 12 Jun 2026 17:05:38 GMT\", \"content-type\": \"text/html; charset=UTF-8\", \"content-encoding\": \"gzip\"}, \"body\": \"<!doctype html>\\n<html lang=\\\"en\\\" class=\\\"view-grid\\\">\\n\\n<head>\\n <meta charset=\\\"utf-8\\\">\\n <meta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1\\\">\\n <title>Ars Technica - Serving the Technologist since 1998. News, reviews, and analysis.</title>\\n<link rel=\\\"preconnect\\\" href=\\\"https://c.arstechnica.com\\\">\\n<script>\\n window.snowplowQueue = window.snowplowQueue || [];\\n window.arsSP = {\\n entities: {\\\"site\\\":{\\\"org_id\\\":\\\"4gKgcFGUFUvCGFzHakTPfYp85Yi8\\\",\\\"site_env\\\":\\\"production\\\",\\\"site_app_version\\\":\\\"multi-tenant\\\",\\\"site_data_source\\\":\\\"web\\\",\\\"site_section\\\":\\\"homepage\\\"},\\\"page\\\":[],\\\"content\\\":{\\\"content_id\\\":\\\"1208fa783bbed3d18b4a0540\\\",\\\"content_type\\\":\\\"homepage\\\",\\\"editor_name\\\":\\\"Ken Fisher\\\",\\\"author_name\\\":\\\"Ars Staff\\\",\\\"date_display\\\":\\\"2026-06-12T16:42:48.434Z\\\",\\\"content_source\\\":\\\"web\\\",\\\"content_template\\\":\\\"standard\\\",\\\"content_template_type\\\":\\\"mt_homepage\\\",\\\"content_time_since_publish\\\":9659,\\\"content_title\\\":\\\"Ars Technica\\\",\\\"date_last_modified\\\":\\\"2024-10-02T12:00:00.000Z\\\",\\\"date_publish\\\":\\\"2000-01-01T12:00:00.000Z\\\",\\\"onsite_keywords\\\":\\\"homepage|ars technica homepage\\\"}},\\n config: {\\\"SNOWPLOW_COLLECTOR\\\":\\\"c.arstechnica.com\\\",\\\"AVO_API_KEY\\\":\\\"FTJO6mVPBIzdGhjn2Ruy\\\",\\\"APP_ID\\\":\\\"ars-technica\\\",\\\"APP_NAME\\\":\\\"ars-technica\\\",\\\"APP_ENV\\\":\\\"production\\\",\\\"APP_VERSION\\\":\\\"1.0.0\\\",\\\"COOKIE_DOMAIN\\\":\\\".arstechnica.com\\\"}\\n };\\n</script><script>\\n (function () {\\n var ChannelWildcard = {\\n ALL: '*',\\n };\\n\\n function KendraEvent(historyLimit) {\\n this.listeners = new Map();\\n this.eventHistory = [];\\n this.historyLimit = historyLimit || 10;\\n }\\n\\n KendraEvent.prototype.broadcast = function (channel, value, options) {\\n var opts = options || {};\\n var timestamp = Date.now();\\n\\n if (opts.once) {\\n if (channel === ChannelWildcard.ALL) {\\n console.warn(\\\"'once: true' is not supported with ChannelWildcard.ALL\\\");\\n return;\\n }\\n\\n var hasBroadcasted = this.eventHistory.some(function (entry) {\\n return entry.channel === channel;\\n });\\n\\n if (hasBroadcasted) {\\n return;\\n }\\n }\\n\\n var entry = {\\n timestamp: timestamp,\\n value: value,\\n channel: channel,\\n };\\n\\n this.eventHistory.push(entry);\\n\\n if (this.eventHistory.length > this.historyLimit) {\\n this.eventHistory.shift();\\n }\\n\\n if (channel === ChannelWildcard.ALL) {\\n this.listeners.forEach(function (listeners) {\\n listeners.forEach(function (listener) {\\n listener(value);\\n });\\n });\\n return;\\n }\\n\\n var listeners = this.listeners.get(channel);\\n if (listeners) {\\n listeners.forEach(function (listener) {\\n listener(value);\\n });\\n }\\n };\\n\\n KendraEvent.prototype.on = function (channel, listener, options) {\\n var opts = options || {};\\n var channels = Array.isArray(channel) ? channel : [channel];\\n var event = this;\\n\\n channels.forEach(function (registeredChannel) {\\n if (!event.listeners.has(registeredChannel)) {\\n event.listeners.set(registeredChannel, new Set());\\n }\\n\\n event.listeners.get(registeredChannel).add(listener);\\n\\n if (opts.emitLast && registeredChannel !== ChannelWildcard.ALL) {\\n var lastValue = event.get(registeredChannel);\\n if (lastValue !== undefined) {\\n listener(lastValue);\\n }\\n }\\n });\\n\\n return {\\n off: function () {\\n channels.forEach(function (registeredChannel) {\\n var listeners = event.listeners.get(registeredChannel);\\n if (listeners) {\\n listeners.delete(listener);\\n }\\n });\\n },\\n };\\n };\\n\\n KendraEvent.prototype.off = function (channel, listener) {\\n var event = this;\\n var channels = Array.isArray(channel) ? channel : [channel];\\n\\n channels.forEach(function (registeredChannel) {\\n var listeners = event.listeners.get(registeredChannel);\\n if (listeners) {\\n listeners.delete(listener);\\n }\\n });\\n };\\n\\n KendraEvent.prototype.history = function () {\\n return this.eventHistory.slice().sort(function (a, b) {\\n return b.timestamp - a.timestamp;\\n });\\n };\\n\\n KendraEvent.prototype.get = function (channel) {\\n var history;\\n\\n if (channel) {\\n history = this.eventHistory.slice().reverse();\\n for (var i = 0; i < history.length; i++) {\\n if (history[i].channel === channel) {\\n return history[i].value;\\n }\\n }\\n return undefined;\\n }\\n\\n var lastEntry = this.eventHistory[this.eventHistory.length - 1];\\n return lastEntry && lastEntry.value;\\n };\\n\\n function KendraOrchestrator() {\\n this.registry = {};\\n }\\n\\n KendraOrchestrator.prototype.register = function (key, event) {\\n if (this.registry[key]) {\\n return;\\n }\\n\\n this.registry[key] = event;\\n\\n if (!Object.prototype.hasOwnProperty.call(this, key)) {\\n Object.defineProperty(this, key, {\\n get: function () {\\n return this.registry[key];\\n },\\n enumerable: true,\\n configurable: false,\\n });\\n }\\n };\\n\\n KendraOrchestrator.prototype.get = function (key) {\\n var event = this.registry[key];\\n\\n if (!event) {\\n throw new Error('Event with key ' + key + ' is not registered.');\\n }\\n\\n return event;\\n };\\n\\n KendraOrchestrator.prototype.delete = function (key) {\\n delete this.registry[key];\\n delete this[key];\\n };\\n\\n var kendra =\\n window.Kendra && typeof window.Kendra.register === 'function'\\n ? window.Kendra\\n : new KendraOrchestrator();\\n\\n window.Kendra = kendra;\\n\\n if (!kendra.ADS) {\\n kendra.register('ADS', new KendraEvent(50));\\n }\\n\\n if (!kendra.USER_CONTEXT) {\\n kendra.register('USER_CONTEXT', new KendraEvent(5));\\n }\\n\\n window.arsTracking = window.arsTracking || {};\\n window.arsTracking.initKendra = function () {\\n return window.Kendra;\\n };\\n window.arsTracking.publishUserContextUpdate =\\n window.arsTracking.publishUserContextUpdate ||\\n function (value) {\\n var payload = value || {};\\n\\n window.Kendra.USER_CONTEXT.broadcast('UPDATED', payload);\\n\\n if (window.cnBus && typeof window.cnBus.emit === 'function') {\\n window.cnBus.emit('user.context.updated', payload);\\n }\\n };\\n })();\\n</script>\\n\\n<!-- The SEO Framework by Sybre Waaijer -->\\n<meta name=\\\"robots\\\" content=\\\"max-snippet:-1,max-image-preview:large,max-video-preview:-1\\\" />\\n<link rel=\\\"canonical\\\" href=\\\"https://arstechnica.com/\\\" />\\n<meta name=\\\"description\\\" content=\\\"News and reviews, covering IT, AI, science, space, health, gaming, cybersecurity, tech policy, computers, mobile devices, and operating systems.\\\" />\\n<meta property=\\\"og:type\\\" content=\\\"website\\\" />\\n<meta property=\\\"og:locale\\\" content=\\\"en_US\\\" />\\n<meta property=\\\"og:site_name\\\" content=\\\"Ars Technica\\\" />\\n<meta property=\\\"og:title\\\" content=\\\"Ars Technica\\\" />\\n<meta property=\\\"og:description\\\" content=\\\"News and reviews, covering IT, AI, science, space, health, gaming, cybersecurity, tech policy, computers, mobile devices, and operating systems.\\\" />\\n<meta property=\\\"og:url\\\" content=\\\"https://arstechnica.com/\\\" />\\n<meta property=\\\"og:image\\\" content=\\\"https://cdn.arstechnica.net/wp-content/uploads/2016/10/cropped-ars-logo-512_480.png\\\" />\\n<meta property=\\\"og:image:width\\\" content=\\\"512\\\" />\\n<meta property=\\\"og:image:height\\\" content=\\\"512\\\" />\\n<meta name=\\\"twitter:card\\\" content=\\\"summary_large_image\\\" />\\n<meta name=\\\"twitter:title\\\" content=\\\"Ars Technica\\\" />\\n<meta name=\\\"twitter:description\\\" content=\\\"News and reviews, covering IT, AI, science, space, health, gaming, cybersecurity, tech policy, computers, mobile devices, and operating systems.\\\" />\\n<meta name=\\\"twitter:image\\\" content=\\\"https://cdn.arstechnica.net/wp-content/uploads/2016/10/cropped-ars-logo-512_480.png\\\" />\\n<script type=\\\"application/ld+json\\\">{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@graph\\\":[{\\\"@type\\\":\\\"WebSite\\\",\\\"@id\\\":\\\"https://arstechnica.com/#/schema/WebSite\\\",\\\"url\\\":\\\"https://arstechnica.com/\\\",\\\"name\\\":\\\"Ars Technica\\\",\\\"description\\\":\\\"Serving the Technologist since 1998. News, reviews, and analysis.\\\",\\\"inLanguage\\\":\\\"en-US\\\",\\\"potentialAction\\\":{\\\"@type\\\":\\\"SearchAction\\\",\\\"target\\\":{\\\"@type\\\":\\\"EntryPoint\\\",\\\"urlTemplate\\\":\\\"https://arstechnica.com/search/{search_term_string}/\\\"},\\\"query-input\\\":\\\"required name=search_term_string\\\"},\\\"publisher\\\":{\\\"@id\\\":\\\"https://arstechnica.com/#/schema/Organization\\\"}},{\\\"@type\\\":\\\"WebPage\\\",\\\"@id\\\":\\\"https://arstechnica.com/\\\",\\\"url\\\":\\\"https://arstechnica.com/\\\",\\\"name\\\":\\\"Ars Technica - Serving the Technologist since 1998. News, reviews, and analysis.\\\",\\\"description\\\":\\\"News and reviews, covering IT, AI, science, space, health, gaming, cybersecurity, tech policy, computers, mobile devices, and operating systems.\\\",\\\"inLanguage\\\":\\\"en-US\\\",\\\"isPartOf\\\":{\\\"@id\\\":\\\"https://arstechnica.com/#/schema/WebSite\\\"},\\\"breadcrumb\\\":{\\\"@type\\\":\\\"BreadcrumbList\\\",\\\"@id\\\":\\\"https://arstechnica.com/#/schema/BreadcrumbList\\\",\\\"itemListElement\\\":{\\\"@type\\\":\\\"ListItem\\\",\\\"position\\\":1,\\\"name\\\":\\\"Ars Technica\\\"}},\\\"about\\\":{\\\"@id\\\":\\\"https://arstechnica.com/#/schema/Organization\\\"}},{\\\"@type\\\":\\\"Organization\\\",\\\"@id\\\":\\\"https://arstechnica.com/#/schema/Organization\\\",\\\"name\\\":\\\"Ars Technica\\\",\\\"url\\\":\\\"https://arstechnica.com/\\\",\\\"logo\\\":{\\\"@type\\\":\\\"ImageObject\\\",\\\"url\\\":\\\"https://cdn.arstechnica.net/wp-content/uploads/2016/10/cropped-ars-logo-512_480.png\\\",\\\"contentUrl\\\":\\\"https://cdn.arstechnica.net/wp-content/uploads/2016/10/cropped-ars-logo-512_480.png\\\",\\\"width\\\":512,\\\"height\\\":512,\\\"contentSize\\\":\\\"34417\\\"}}]}</script>\\n<!-- / The SEO Framework by Sybre Waaijer | 3.78ms meta | 0.18ms boot -->\\n\\n<script id=\\\"fides-js-loader\\\">\\n (function() {\\n var fidesHost =\\n \\\"https://privacy.condenastdigital.com/fides.js\\\";\\n var fidesPropertyId = \\\"FDS-MIKT8M\\\";\\n var fidesSrc = fidesHost + \\\"?property_id=\\\" + fidesPropertyId + \\\"&\\\";\\n var searchParams = new URLSearchParams(location.search);\\n var debugRegion = (searchParams.get(\\\"ars_debug_region\\\") || \\\"\\\").toLowerCase();\\n var debugConsentMode = (searchParams.get(\\\"ars_debug_consent\\\") || \\\"\\\").toLowerCase();\\n var isLocalDebugHost =\\n location.hostname === \\\"localhost\\\" ||\\n location.hostname === \\\"127.0.0.1\\\" ||\\n location.hostname.indexOf(\\\"local.\\\") === 0 ||\\n location.hostname.indexOf(\\\".local.\\\") !== -1;\\n\\n var gtmOptions = {\\n flag_type: \\\"boolean\\\",\\n non_applicable_flag_mode: \\\"include\\\",\\n };\\n\\n function buildDebugConsent(mode) {\\n if (mode === \\\"accept\\\" || mode === \\\"all\\\") {\\n return {\\n essential: true,\\n analytics: true,\\n functional: true,\\n sales_sharing_targeted_advertising: true,\\n social_media: true,\\n audience_measurement: true,\\n };\\n }\\n\\n return {\\n essential: true,\\n analytics: false,\\n functional: false,\\n sales_sharing_targeted_advertising: false,\\n social_media: false,\\n audience_measurement: false,\\n };\\n }\\n\\n function pushDebugFidesEvent(name, consent) {\\n window.dataLayer = window.dataLayer || [];\\n window.dataLayer.push({\\n event: name,\\n Fides: {\\n consent: consent,\\n timestamp: Math.round(performance.now()),\\n extraDetails: {\\n consentMethod: \\\"ars_debug_region\\\",\\n servingComponent: \\\"banner\\\",\\n },\\n },\\n });\\n }\\n\\n function initDebugFides(region, consentMode) {\\n var body = window.document.body;\\n var initialConsentMode = consentMode || (region === \\\"eu\\\" ? \\\"reject\\\" : \\\"accept\\\");\\n var initialConsent = buildDebugConsent(initialConsentMode);\\n\\n window.Fides = {\\n consent: initialConsent,\\n initialized: false,\\n experience: {\\n experience_config: {\\n id: \\\"ars-debug-region-\\\" + region,\\n },\\n },\\n gtm: function(options) {\\n window.__arsDebugFidesGtmOptions = options;\\n },\\n };\\n\\n window.arsDebugFides = {\\n region: region,\\n getConsent: function() {\\n return window.Fides.consent;\\n },\\n setConsent: function(nextMode) {\\n var nextConsent = buildDebugConsent((nextMode || \\\"\\\").toLowerCase());\\n window.Fides.consent = nextConsent;\\n pushDebugFidesEvent(\\\"FidesUpdated\\\", nextConsent);\\n window.dispatchEvent(new Event(\\\"FidesUpdated\\\"));\\n return nextConsent;\\n },\\n showBanner: function() {\\n pushDebugFidesEvent(\\\"FidesUIShown\\\", window.Fides.consent);\\n window.dispatchEvent(new Event(\\\"FidesUIShown\\\"));\\n },\\n };\\n\\n if (body) {\\n body.classList.add(\\\"ars-debug-region-\\\" + region);\\n body.dataset.arsDebugRegion = region;\\n }\\n\\n window.dispatchEvent(new Event(\\\"FidesInitializing\\\"));\\n window.Fides.initialized = true;\\n window.dispatchEvent(new Event(\\\"FidesInitialized\\\"));\\n\\n if (region === \\\"eu\\\") {\\n window.arsDebugFides.showBanner();\\n }\\n\\n pushDebugFidesEvent(\\\"FidesUpdated\\\", initialConsent);\\n window.dispatchEvent(new Event(\\\"FidesUpdated\\\"));\\n }\\n\\n function insertFidesScript() {\\n addEventListener(\\\"FidesInitializing\\\", function() {\\n window.Fides.gtm(gtmOptions);\\n });\\n addEventListener(\\\"FidesInitialized\\\", function() {\\n try {\\n var experience = window.Fides.experience || {};\\n var config = experience.experience_config || {};\\n var id = config.id;\\n if (id) {\\n window.document.body.classList.add(id);\\n }\\n } catch (err) {\\n console.warn(\\\"Couldn't apply Fides experience ID to body.\\\", err);\\n }\\n });\\n\\n if (isLocalDebugHost && (debugRegion === \\\"eu\\\" || debugRegion === \\\"us\\\")) {\\n initDebugFides(debugRegion, debugConsentMode);\\n return;\\n }\\n\\n var fidesPrefix = \\\"fides_\\\";\\n var fidesSearchParams = new URLSearchParams();\\n searchParams.forEach(function(key, value) {\\n if (key.startsWith(fidesPrefix)) {\\n fidesSearchParams.set(\\n key.replace(fidesPrefix, \\\"\\\"),\\n key === fidesPrefix + \\\"cache_bust\\\" ? Date.now().toString() : value\\n );\\n }\\n });\\n var src = fidesSrc + fidesSearchParams.toString();\\n var script = document.createElement(\\\"script\\\");\\n script.async = false;\\n script.defer = false;\\n script.setAttribute(\\\"src\\\", src);\\n script.setAttribute(\\\"id\\\", \\\"fides-js\\\");\\n script.setAttribute(\\\"type\\\", \\\"text/javascript\\\");\\n document.head.appendChild(script);\\n }\\n\\n insertFidesScript();\\n })();\\n</script>\\n<!-- Google Tag Manager DataLayer -->\\n<script>\\n window.dataLayer = window.dataLayer || [];\\n window.dataLayer.push({\\\"event\\\":\\\"data-layer-loaded\\\",\\\"user\\\":{\\\"ars_userId\\\":undefined,\\\"amg_userId\\\":undefined,\\\"uID\\\":undefined,\\\"sID\\\":undefined,\\\"loginStatus\\\":false,\\\"subscriberStatus\\\":\\\"none\\\",\\\"infinityId\\\":\\\"f113779a-78d0-4cb3-93f6-d86bd91aa9f0\\\",\\\"registrationSource\\\":undefined,\\\"mdw_cnd_id\\\":undefined,\\\"monthlyVisits\\\":undefined,\\\"accessPaywall\\\":undefined,\\\"view\\\":\\\"grid\\\",\\\"theme\\\":\\\"system\\\",\\\"show_comments\\\":undefined},\\\"content\\\":{\\\"pageTemplate\\\":\\\"home\\\",\\\"pageType\\\":\\\"home\\\",\\\"contentCategory\\\":undefined,\\\"section\\\":\\\"homepage\\\",\\\"subsection\\\":undefined,\\\"contributor\\\":undefined,\\\"contentID\\\":undefined,\\\"contentLength\\\":undefined,\\\"display\\\":\\\"Ars Technica Homepage\\\",\\\"contentSource\\\":\\\"web\\\",\\\"pageAssets\\\":undefined,\\\"uniqueContentCount\\\":undefined,\\\"monthlyContentCount\\\":undefined,\\\"publishDate\\\":undefined,\\\"modifiedDate\\\":undefined,\\\"keywords\\\":undefined,\\\"dataSource\\\":undefined},\\\"marketing\\\":{\\\"campaignName\\\":undefined,\\\"circCampaignId\\\":undefined,\\\"internalCampaignId\\\":undefined,\\\"brand\\\":\\\"Ars Technica\\\",\\\"certified_mrc_data\\\":undefined,\\\"condeNastId\\\":undefined},\\\"page\\\":{\\\"pID\\\":undefined,\\\"syndicatorUrl\\\":undefined,\\\"pageURL\\\":\\\"https:\\\\/\\\\/arstechnica.com\\\",\\\"canonical\\\":\\\"https:\\\\/\\\\/arstechnica.com\\\",\\\"canonicalPathName\\\":\\\"\\\\/\\\"},\\\"search\\\":{\\\"facets\\\":undefined,\\\"searchTerms\\\":undefined},\\\"site\\\":{\\\"appVersion\\\":\\\"1.0.0\\\"}});\\n</script>\\n<!-- End Google Tag Manager DataLayer -->\\n<!-- Google Tag Manager -->\\n<script>\\n (function(w, d, s, l, i) {\\n w[l] = w[l] || [];\\n w[l].push({\\n 'gtm.start': new Date().getTime(),\\n event: 'gtm.js'\\n });\\n var f = d.getElementsByTagName(s)[0],\\n j = d.createElement(s),\\n dl = l != 'dataLayer' ? '&l=' + l : '';\\n j.async = true;\\n j.src =\\n 'https://www.googletagmanager.com/gtm.js?id=' + i + dl;\\n f.parentNode.insertBefore(j, f);\\n })(window, document, 'script', 'dataLayer', 'GTM-NLXNPCQ');\\n</script>\\n<!-- End Google Tag Manager -->\\n<style id='wp-img-auto-sizes-contain-inline-css'>\\nimg:is([sizes=auto i],[sizes^=\\\"auto,\\\" i]){contain-intrinsic-size:3000px 1500px}\\n/*# sourceURL=wp-img-auto-sizes-contain-inline-css */\\n</style>\\n<link rel='stylesheet' id='ep_general_styles-css' href='https://cdn.arstechnica.net/wp-content/mu-plugins/_composer_elasticpress/dist/css/general-styles.css?ver=66295efe92a630617c00' media='all' />\\n<link rel='stylesheet' id='searchterm-highlighting-css' href='https://cdn.arstechnica.net/wp-content/mu-plugins/_composer_elasticpress/dist/css/highlighting-styles.css?ver=252562c4ed9241547293' media='all' />\\n<link rel='stylesheet' id='app/0-css' href='https://cdn.arstechnica.net/wp-content/themes/ars-v9/public/css/app.49f095.css' media='all' />\\n<link rel='stylesheet' id='ads/0-css' href='https://cdn.arstechnica.net/wp-content/themes/ars-v9/public/css/ads.01e938.css' media='all' />\\n<script src=\\\"https://cdn.arstechnica.net/wp/wp-includes/js/jquery/jquery.min.js?ver=3.7.1\\\" id=\\\"jquery-core-js\\\"></script>\\n<script>window.ars = {\\\"subscriber\\\":false,\\\"hasAdFree\\\":false,\\\"hasTrackerFree\\\":false,\\\"loggedIn\\\":false,\\\"level\\\":\\\"GUEST\\\",\\\"0\\\":\\\"\\\"}</script>\\n<script>\\n const theme = \\\"system\\\";\\n let darkMode = false;\\n if (theme === \\\"dark\\\" || (theme === \\\"system\\\" && (window.matchMedia(\\\"(prefers-color-scheme: dark)\\\").matches))) {\\n darkMode = true;\\n document.documentElement.classList.add(\\\"dark\\\");\\n }\\n if (theme === \\\"dusk\\\" || (theme === \\\"system\\\" && (window.matchMedia(\\\"(prefers-color-scheme: light)\\\").matches))) {\\n darkMode = false;\\n document.documentElement.classList.add(\\\"dusk\\\");\\n }\\n if (theme === \\\"light\\\") {\\n darkMode = false;\\n document.documentElement.classList.add(\\\"light\\\");\\n }\\n window.darkMode = darkMode;\\n</script>\\n<script>\\n const settings = JSON.parse(localStorage.getItem(\\\"text-settings\\\")) || {};\\n const { size = \\\"standard\\\", links = \\\"standard\\\", width = \\\"standard\\\", position=\\\"story\\\" } = settings;\\n\\n const html = document.querySelector(\\\"html\\\");\\n html.classList.add(`text-settings-size-${size}`);\\n html.classList.add(`text-settings-links-${links}`);\\n html.classList.add(`text-settings-width-${width}`);\\n html.classList.add(`text-settings-position-${position}`);\\n</script>\\n<meta name=\\\"twitter:site\\\" content=\\\"@arstechnica\\\" />\\n<meta name=\\\"twitter:domain\\\" content=\\\"arstechnica.com\\\" />\\n<meta property=\\\"facebook-domain-verification\\\" content=\\\"qptjyerza2q11uv3fe6aay6hbsncr8\\\" />\\n<style>[x-cloak] { display: none !important; }</style>\\n<link rel=\\\"preconnect\\\" href=\\\"https://globalservices.conde.digital\\\">\\n<link rel=\\\"preconnect\\\" href=\\\"https://player.cnevids.com\\\">\\n<script>\\n window.permutiveCohorts = {\\\"cached_until\\\":\\\"2026-06-12T20:55:25+00:00\\\",\\\"cohorts\\\":[\\\"bzxb\\\",\\\"bjfa\\\",\\\"bvrn\\\",\\\"busy\\\",\\\"eexy\\\",\\\"dfaj\\\",\\\"bzxc\\\"],\\\"activations\\\":{\\\"target_dfp\\\":[\\\"bzxb\\\",\\\"bjfa\\\",\\\"bvrn\\\",\\\"busy\\\",\\\"eexy\\\",\\\"dfaj\\\",\\\"bzxc\\\"]},\\\"contextual_data\\\":{\\\"classifications\\\":null},\\\"gam\\\":[\\\"bzxb\\\",\\\"bjfa\\\",\\\"bvrn\\\",\\\"busy\\\",\\\"eexy\\\",\\\"dfaj\\\",\\\"bzxc\\\"],\\\"xandr\\\":[],\\\"config\\\":{\\\"time_to_wait_for_consent_in_millis\\\":4000}};\\n window.permutiveContextInfo = {\\\"pageProperties\\\":{\\\"client\\\":{\\\"url\\\":\\\"https:\\\\/\\\\/arstechnica.com\\\\/\\\",\\\"referrer\\\":\\\"\\\",\\\"type\\\":\\\"web\\\",\\\"user_agent\\\":\\\"Mozilla\\\\/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit\\\\/537.36 (KHTML, like Gecko) Chrome\\\\/148.0.0.0 Safari\\\\/537.36\\\",\\\"domain\\\":\\\"arstechnica.com\\\",\\\"title\\\":\\\"Ars Technica - Serving the Technologist since 1998. News, reviews, and analysis.\\\"},\\\"type\\\":\\\"bundle\\\"},\\\"url\\\":\\\"https:\\\\/\\\\/arstechnica.com\\\\/\\\"};\\n</script>\\n<script src=\\\"https://www.googletagservices.com/tag/js/gpt.js\\\" id=\\\"gpt-script\\\" async></script>\\n<script>\\n window.googletag = window.googletag || {};\\n window.googletag.cmd = window.googletag.cmd || [];\\n window.cns = window.cns || {};\\n window.cns.queue = [];\\n window.cns.pageContext = {\\\"contentType\\\":\\\"bundle\\\",\\\"templateType\\\":\\\"home\\\",\\\"channel\\\":\\\"homepage\\\",\\\"subChannel\\\":\\\"\\\",\\\"slug\\\":\\\"homepage\\\",\\\"server\\\":\\\"production\\\",\\\"keywords\\\":{\\\"tags\\\":[\\\"index\\\"],\\\"cm\\\":[],\\\"platform\\\":[\\\"wordpress\\\"],\\\"copilotid\\\":\\\"\\\"}};\\n</script>\\n\\n\\n<script src=\\\"https://ads-static.conde.digital/production/cns/builds/ars-technica/v6.js\\\" async></script>\\n<script type=\\\"text/javascript\\\">!(function(o,_name){o[_name]=o[_name]||function $(){($.q=$.q||[]).push(arguments)},o[_name].v=o[_name].v||2,o[_name].s=\\\"1\\\";!(function(o,t,e,n,c,a,f){function i(n,c){(n=(function(t,e){try{if(e=(t=o.localStorage).getItem(\\\"_aQS01Q0IwOTY5NTEzOUM2MDU3MEU5M0VGREEtNA\\\"))return JSON.parse(e).lgk||[];if((f=t.getItem(decodeURI(decodeURI('%2576%2534%256%31%25%36%33%25%33%31%256%35%69%5a%72%253%30'))))&&f.split(\\\",\\\")[4]>0)return[[_name+\\\"-engaged\\\",\\\"true\\\"]]}catch(n){}})())&&typeof n.forEach===e&&(c=o[t].pubads())&&n.forEach((function(o){o&&o[0]&&c.setTargeting(o[0],o[1]||\\\"\\\")}))}try{(a=o[t]=o[t]||{}).cmd=a.cmd||[],typeof a.pubads===e?i():typeof a.cmd.unshift===e?a.cmd.unshift(i):a.cmd.push(i)}catch(r){}})(window,\\\"googletag\\\",\\\"function\\\");;})(window,decodeURI(decodeURI('%25%36%31%64%256%64%25%36%39ra%256%63')));!(function(t,c,o,$){o=t.createElement(c),t=t.getElementsByTagName(c)[0],o.async=1,o.src=\\\"https://planebasin.com/dist/25dd01b14_8715a062a12be6f05714ee41f1a252e6e86d0.index.js\\\",($=0)&&$(o),t.parentNode.insertBefore(o,t)})(document,\\\"script\\\");</script>\\n\\n<meta name=\\\"twitter:partner\\\" content=\\\"tfwp\\\"><!-- Start Headline A/B -->\\n<script type=\\\"text/javascript\\\">\\n class ABTest {\\n constructor(post_id, init_method) {\\n this.post_id = post_id;\\n this.ajaxurl = '/services/ars-ajax-handler.php';\\n this.expireDays = 1 / 48; // 30 min\\n this.group = this.getGroup();\\n this.uid = this.getUid();\\n this.init_method = init_method;\\n this.setTitle();\\n\\n if (this.init_method === 'click') {\\n this.click();\\n } else {\\n this.impression();\\n }\\n }\\n\\n setCookie(name, value, days) {\\n var expires = \\\"\\\";\\n if (days) {\\n var date = new Date();\\n date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\\n expires = \\\"; expires=\\\" + date.toUTCString();\\n }\\n document.cookie = name + \\\"=\\\" + (value || \\\"\\\") + expires + \\\"; path=/\\\";\\n }\\n\\n getCookie(name) {\\n var nameEQ = name + \\\"=\\\";\\n var ca = document.cookie.split(';');\\n for (var i = 0; i < ca.length; i++) {\\n var c = ca[i];\\n while (c.charAt(0) == ' ') c = c.substring(1, c.length);\\n if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);\\n }\\n return null;\\n }\\n\\n // Retrieves a unique id for determining whether the event should be recorded\\n getUid() {\\n var uid = this.getCookie('ars_ab_' + this.post_id + '_uid');\\n if (!uid) {\\n uid = (Math.random() + 1).toString(36).substring(2, 7);\\n this.setCookie('ars_ab_' + this.post_id + '_uid', uid, this.expireDays);\\n }\\n return uid;\\n };\\n\\n // Places the user in either A or B for this post id\\n getGroup() {\\n var group = this.getCookie('ars_ab_' + this.post_id + '_group');\\n if (!group) {\\n group = String.fromCharCode(Math.floor(Math.random() * 2) + 65).toLowerCase();\\n this.setCookie('ars_ab_' + this.post_id + '_group', group, this.expireDays);\\n }\\n return group;\\n };\\n\\n // Records a headline impression (from homepage or other listing)\\n impression() {\\n // Send fake ajax\\n var params = {\\n nonce: '5164f01664',\\n action: 'ars_ab_impression',\\n id: this.post_id,\\n group: this.group,\\n uid: this.uid,\\n ts: (new Date()).getTime()\\n };\\n var url = this.ajaxurl + '?' + this.encodeParams(params);\\n document.write('\\\\x3Cscript type=\\\"text/javascript\\\" src=\\\"' + url + '\\\">\\\\x3C/script>');\\n };\\n\\n // Records a headline click from the actual post page\\n click() {\\n // Send fake ajax\\n var params = {\\n nonce: 'c6f5453ccc',\\n action: 'ars_ab_click',\\n id: this.post_id,\\n group: this.group,\\n uid: this.uid,\\n ts: (new Date()).getTime()\\n };\\n var url = this.ajaxurl + '?' + this.encodeParams(params);\\n document.write('\\\\x3Cscript type=\\\"text/javascript\\\" src=\\\"' + url + '\\\">\\\\x3C/script>');\\n };\\n\\n // If user is in B group, dynamically set title\\n setTitle() {\\n if (this.group == 'b') {\\n var span = document.getElementById('ars_ab_' + this.post_id);\\n var title = span.parentNode;\\n title.innerHTML = span.getAttribute('data-title-b');\\n }\\n };\\n\\n encodeParams(data) {\\n var ret = [];\\n for (var d in data)\\n ret.push(encodeURIComponent(d) + \\\"=\\\" + encodeURIComponent(data[d]));\\n return ret.join(\\\"&\\\");\\n };\\n\\n };\\n</script>\\n<!-- End Headline A/B -->\\n<link rel=\\\"icon\\\" href=\\\"https://cdn.arstechnica.net/wp-content/uploads/2016/10/cropped-ars-logo-512_480-60x60.png\\\" sizes=\\\"32x32\\\" />\\n<link rel=\\\"icon\\\" href=\\\"https://cdn.arstechnica.net/wp-content/uploads/2016/10/cropped-ars-logo-512_480-300x300.png\\\" sizes=\\\"192x192\\\" />\\n<link rel=\\\"apple-touch-icon\\\" href=\\\"https://cdn.arstechnica.net/wp-content/uploads/2016/10/cropped-ars-logo-512_480-300x300.png\\\" />\\n<meta name=\\\"msapplication-TileImage\\\" content=\\\"https://cdn.arstechnica.net/wp-content/uploads/2016/10/cropped-ars-logo-512_480-300x300.png\\\" />\\n<style id='global-styles-inline-css'>\\n:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,0) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-viv\", \"body_truncated\": true, \"truncation_note\": \"正文已截断:原始约 351959 字符,仅保留前 32000 字符。门户/频道首页通常过大,摘要请优先使用具体文章页 URL。\"}", "name": "http_request"}, {"role": "assistant", "content": "这些新闻网站都是前端 JS 渲染的,直接抓取拿不到内容。让我试试 RSS 订阅源 🎯", "tool_calls": [{"id": "call_00_zeGrvTho2uTCbADypJt03166", "type": "function", "function": {"name": "http_request", "arguments": "{\"url\": \"https://www.techmeme.com/feed.xml\", \"method\": \"GET\"}"}}, {"id": "call_01_ITodBzzJSWCZ1caEpf3f4891", "type": "function", "function": {"name": "http_request", "arguments": "{\"url\": \"https://feeds.arstechnica.com/arstechnica/index\", \"method\": \"GET\"}"}}], "reasoning_content": "The HTML pages are all heavily JavaScript-rendered, making it impossible to extract actual news content from the raw HTML. The Techmeme page only shows the JavaScript code, and Ars Technica is similarly JavaScript-heavy.\n\nLet me try a different approach - using RSS feeds or JSON APIs that might give me cleaner data. Let me try some RSS feeds."}, {"role": "tool", "tool_call_id": "call_00_zeGrvTho2uTCbADypJt03166", "content": "{\"status_code\": 200, \"headers\": {\"date\": \"Fri, 12 Jun 2026 17:05:48 GMT\", \"content-type\": \"text/xml\", \"server\": \"cloudflare\", \"last-modified\": \"Fri, 12 Jun 2026 16:50:49 GMT\", \"content-encoding\": \"gzip\"}, \"body\": \"<?xml version=\\\"1.0\\\"?>\\n<rss version=\\\"2.0\\\">\\n<channel>\\n<title>Techmeme</title>\\n<link>https://www.techmeme.com/</link>\\n<description>Top news and commentary for technology&apos;s leaders, from all around the web</description>\\n<language>en-us</language>\\n<pubDate>Fri, 12 Jun 2026 12:50:49 -0400</pubDate>\\n<lastBuildDate>Fri, 12 Jun 2026 12:50:49 -0400</lastBuildDate>\\n<item>\\n <title>SpaceX makes Nasdaq debut at $150 after pricing its shares at $135, giving it a market cap of $1.9T; Elon Musk becomes the world&apos;s first trillionaire (Alex Harring/CNBC)</title>\\n <link>https://www.techmeme.com/260612/p19#a260612p19</link>\\n <description><![CDATA[<A HREF=\\\"https://www.cnbc.com/2026/06/12/spacex-stock-jumps-2-trillion.html\\\"><IMG VSPACE=\\\"4\\\" HSPACE=\\\"4\\\" BORDER=\\\"0\\\" ALIGN=\\\"RIGHT\\\" SRC=\\\"http://www.techmeme.com/260612/i19.jpg\\\"></A>\\n<P><A HREF=\\\"https://www.techmeme.com/260612/p19#a260612p19\\\" TITLE=\\\"Techmeme permalink\\\"><IMG WIDTH=11 HEIGHT=12 SRC=\\\"http://www.techmeme.com/img/pml.png\\\" STYLE=\\\"border:none;padding:0;margin:0;\\\"></A> Alex Harring / <A HREF=\\\"http://www.cnbc.com/\\\">CNBC</A>:<BR>\\n<SPAN STYLE=\\\"font-size:1.3em;\\\"><B><A HREF=\\\"https://www.cnbc.com/2026/06/12/spacex-stock-jumps-2-trillion.html\\\">SpaceX makes Nasdaq debut at $150 after pricing its shares at $135, giving it a market cap of $1.9T; Elon Musk becomes the world's first trillionaire</A></B></SPAN>&nbsp; &mdash;&nbsp; SpaceX shares soared on Friday as trading commenced on the Nasdaq, driving the rocket company's valuation above $2 trillion after a record-setting initial public offering.</P>\\n]]></description>\\n <pubDate>Fri, 12 Jun 2026 12:07:29 -0400</pubDate>\\n <guid>https://www.techmeme.com/260612/p19#a260612p19</guid>\\n</item>\\n<item>\\n <title>SpaceX makes Nasdaq debut at $150 after pricing at $135: Live updates (CNBC)</title>\\n <link>https://www.techmeme.com/260612/p18#a260612p18</link>\\n <description><![CDATA[<A HREF=\\\"https://www.cnbc.com/2026/06/12/spacex-ipo-spcx-live-updates.html\\\"><IMG VSPACE=\\\"4\\\" HSPACE=\\\"4\\\" BORDER=\\\"0\\\" ALIGN=\\\"RIGHT\\\" SRC=\\\"http://www.techmeme.com/260612/i18.jpg\\\"></A>\\n<P><A HREF=\\\"https://www.techmeme.com/260612/p18#a260612p18\\\" TITLE=\\\"Techmeme permalink\\\"><IMG WIDTH=11 HEIGHT=12 SRC=\\\"http://www.techmeme.com/img/pml.png\\\" STYLE=\\\"border:none;padding:0;margin:0;\\\"></A> <A HREF=\\\"http://www.cnbc.com/\\\">CNBC</A>:<BR>\\n<SPAN STYLE=\\\"font-size:1.3em;\\\"><B><A HREF=\\\"https://www.cnbc.com/2026/06/12/spacex-ipo-spcx-live-updates.html\\\">SpaceX makes Nasdaq debut at $150 after pricing at $135: Live updates</A></B></SPAN> &hellip; SpaceX opened trading Friday at $150 under the ticker SPCX after the biggest initial public offering ever.&nbsp; &mdash;&nbsp; At $150, SpaceX is valued at just under $2 trillion, making it the sixth-most valuable U.S. company, ahead of Meta and Tesla.</P>\\n]]></description>\\n <pubDate>Fri, 12 Jun 2026 11:52:32 -0400</pubDate>\\n <guid>https://www.techmeme.com/260612/p18#a260612p18</guid>\\n</item>\\n<item>\\n <title>Meta confirms that a widespread outage is affecting its services, including Facebook and Instagram (Jaspreet Singh/Reuters)</title>\\n <link>https://www.techmeme.com/260612/p17#a260612p17</link>\\n <description><![CDATA[<A HREF=\\\"https://www.reuters.com/business/metas-social-networks-down-thousands-users-2026-06-12/\\\"><IMG VSPACE=\\\"4\\\" HSPACE=\\\"4\\\" BORDER=\\\"0\\\" ALIGN=\\\"RIGHT\\\" SRC=\\\"http://www.techmeme.com/260612/i17.jpg\\\"></A>\\n<P><A HREF=\\\"https://www.techmeme.com/260612/p17#a260612p17\\\" TITLE=\\\"Techmeme permalink\\\"><IMG WIDTH=11 HEIGHT=12 SRC=\\\"http://www.techmeme.com/img/pml.png\\\" STYLE=\\\"border:none;padding:0;margin:0;\\\"></A> Jaspreet Singh / <A HREF=\\\"http://www.reuters.com/\\\">Reuters</A>:<BR>\\n<SPAN STYLE=\\\"font-size:1.3em;\\\"><B><A HREF=\\\"https://www.reuters.com/business/metas-social-networks-down-thousands-users-2026-06-12/\\\">Meta confirms that a widespread outage is affecting its services, including Facebook and Instagram</A></B></SPAN>&nbsp; &mdash;&nbsp; Facebook-parent Meta (META.O) said on Friday that users were having trouble accessing the social media company's services.&nbsp; &mdash;&nbsp; &ldquo;We're aware people are currently having trouble accessing our services.</P>\\n]]></description>\\n <pubDate>Fri, 12 Jun 2026 11:45:01 -0400</pubDate>\\n <guid>https://www.techmeme.com/260612/p17#a260612p17</guid>\\n</item>\\n<item>\\n <title>MrBeast hits 500M subscribers on YouTube, a record for the platform (Kayla Cobb/The Wrap)</title>\\n <link>https://www.techmeme.com/260612/p16#a260612p16</link>\\n <description><![CDATA[<A HREF=\\\"https://www.thewrap.com/media-platforms/tv/mrbeast-500-million-youtube-subscribers/\\\"><IMG VSPACE=\\\"4\\\" HSPACE=\\\"4\\\" BORDER=\\\"0\\\" ALIGN=\\\"RIGHT\\\" SRC=\\\"http://www.techmeme.com/260612/i16.jpg\\\"></A>\\n<P><A HREF=\\\"https://www.techmeme.com/260612/p16#a260612p16\\\" TITLE=\\\"Techmeme permalink\\\"><IMG WIDTH=11 HEIGHT=12 SRC=\\\"http://www.techmeme.com/img/pml.png\\\" STYLE=\\\"border:none;padding:0;margin:0;\\\"></A> Kayla Cobb / <A HREF=\\\"http://www.thewrap.com/\\\">The Wrap</A>:<BR>\\n<SPAN STYLE=\\\"font-size:1.3em;\\\"><B><A HREF=\\\"https://www.thewrap.com/media-platforms/tv/mrbeast-500-million-youtube-subscribers/\\\">MrBeast hits 500M subscribers on YouTube, a record for the platform</A></B></SPAN>&nbsp; &mdash;&nbsp; The creator is the first to ever reach this milestone&nbsp; &mdash;&nbsp; MrBeast has broken yet another record.&nbsp; Jimmy Donaldson, aka MrBeast, hit 500 million subscribers on YouTube Friday, becoming the first creator ever to reach that amount.</P>\\n]]></description>\\n <pubDate>Fri, 12 Jun 2026 11:20:00 -0400</pubDate>\\n <guid>https://www.techmeme.com/260612/p16#a260612p16</guid>\\n</item>\\n<item>\\n <title>Sam Bankman-Fried loses his bid to overturn his fraud conviction and 25-year prison sentence over the collapse of FTX (Luc Cohen/Reuters)</title>\\n <link>https://www.techmeme.com/260612/p15#a260612p15</link>\\n <description><![CDATA[<A HREF=\\\"https://www.reuters.com/legal/government/sam-bankman-fried-loses-bid-overturn-crypto-fraud-conviction-2026-06-12/\\\"><IMG VSPACE=\\\"4\\\" HSPACE=\\\"4\\\" BORDER=\\\"0\\\" ALIGN=\\\"RIGHT\\\" SRC=\\\"http://www.techmeme.com/260612/i15.jpg\\\"></A>\\n<P><A HREF=\\\"https://www.techmeme.com/260612/p15#a260612p15\\\" TITLE=\\\"Techmeme permalink\\\"><IMG WIDTH=11 HEIGHT=12 SRC=\\\"http://www.techmeme.com/img/pml.png\\\" STYLE=\\\"border:none;padding:0;margin:0;\\\"></A> Luc Cohen / <A HREF=\\\"http://www.reuters.com/\\\">Reuters</A>:<BR>\\n<SPAN STYLE=\\\"font-size:1.3em;\\\"><B><A HREF=\\\"https://www.reuters.com/legal/government/sam-bankman-fried-loses-bid-overturn-crypto-fraud-conviction-2026-06-12/\\\">Sam Bankman-Fried loses his bid to overturn his fraud conviction and 25-year prison sentence over the collapse of FTX</A></B></SPAN>&nbsp; &mdash;&nbsp; Sam Bankman-Fried lost on Friday his bid to overturn his fraud conviction and 25-year prison sentence over the collapse of the FTX cryptocurrency exchange he founded.</P>\\n]]></description>\\n <pubDate>Fri, 12 Jun 2026 09:45:01 -0400</pubDate>\\n <guid>https://www.techmeme.com/260612/p15#a260612p15</guid>\\n</item>\\n<item>\\n <title>Sources: six months after acquiring Rivos, Meta is struggling to integrate the chip startup and halted development of a chip for training its largest AI models (The Information)</title>\\n <link>https://www.techmeme.com/260612/p14#a260612p14</link>\\n <description><![CDATA[<A HREF=\\\"https://www.theinformation.com/articles/meta-bought-rivos-accelerate-ai-chip-push-working\\\"><IMG VSPACE=\\\"4\\\" HSPACE=\\\"4\\\" BORDER=\\\"0\\\" ALIGN=\\\"RIGHT\\\" SRC=\\\"http://www.techmeme.com/260612/i14.jpg\\\"></A>\\n<P><A HREF=\\\"https://www.techmeme.com/260612/p14#a260612p14\\\" TITLE=\\\"Techmeme permalink\\\"><IMG WIDTH=11 HEIGHT=12 SRC=\\\"http://www.techmeme.com/img/pml.png\\\" STYLE=\\\"border:none;padding:0;margin:0;\\\"></A> <A HREF=\\\"https://www.theinformation.com/\\\">The Information</A>:<BR>\\n<SPAN STYLE=\\\"font-size:1.3em;\\\"><B><A HREF=\\\"https://www.theinformation.com/articles/meta-bought-rivos-accelerate-ai-chip-push-working\\\">Sources: six months after acquiring Rivos, Meta is struggling to integrate the chip startup and halted development of a chip for training its largest AI models</A></B></SPAN>&nbsp; &mdash;&nbsp; Meta Platforms bought semiconductor startup Rivos last year to accelerate development of in-house chips and reduce its reliance &hellip; </P>\\n]]></description>\\n <pubDate>Fri, 12 Jun 2026 09:40:01 -0400</pubDate>\\n <guid>https://www.techmeme.com/260612/p14#a260612p14</guid>\\n</item>\\n<item>\\n <title>Sources: French startup Mistral AI is in talks to raise ~€3B at a ~€20B valuation; it was last valued at €11.7B during a funding round in September 2025 (Bloomberg)</title>\\n <link>https://www.techmeme.com/260612/p13#a260612p13</link>\\n <description><![CDATA[<A HREF=\\\"https://www.bloomberg.com/news/articles/2026-06-12/france-s-mistral-in-funding-talks-at-about-20-billion-valuation\\\"><IMG VSPACE=\\\"4\\\" HSPACE=\\\"4\\\" BORDER=\\\"0\\\" ALIGN=\\\"RIGHT\\\" SRC=\\\"http://www.techmeme.com/260612/i13.jpg\\\"></A>\\n<P><A HREF=\\\"https://www.techmeme.com/260612/p13#a260612p13\\\" TITLE=\\\"Techmeme permalink\\\"><IMG WIDTH=11 HEIGHT=12 SRC=\\\"http://www.techmeme.com/img/pml.png\\\" STYLE=\\\"border:none;padding:0;margin:0;\\\"></A> <A HREF=\\\"https://www.bloomberg.com/\\\">Bloomberg</A>:<BR>\\n<SPAN STYLE=\\\"font-size:1.3em;\\\"><B><A HREF=\\\"https://www.bloomberg.com/news/articles/2026-06-12/france-s-mistral-in-funding-talks-at-about-20-billion-valuation\\\">Sources: French startup Mistral AI is in talks to raise ~&euro;3B at a ~&euro;20B valuation; it was last valued at &euro;11.7B during a funding round in September 2025</A></B></SPAN>&nbsp; &mdash;&nbsp; French startup Mistral AI is in talks to raise around &euro;3 billion ($3.5 billion) at a valuation of roughly &euro;20 billion &hellip; </P>\\n]]></description>\\n <pubDate>Fri, 12 Jun 2026 09:35:01 -0400</pubDate>\\n <guid>https://www.techmeme.com/260612/p13#a260612p13</guid>\\n</item>\\n<item>\\n <title>Companies with rising AI costs are increasingly using tools that tap cheaper models, including some from China, putting pricing pressure on OpenAI and Anthropic (Wall Street Journal)</title>\\n <link>https://www.techmeme.com/260612/p12#a260612p12</link>\\n <description><![CDATA[<A HREF=\\\"https://www.wsj.com/tech/ai/the-ai-price-war-is-here-piling-pressure-on-openai-and-anthropic-86e1d21b?st=coSbEe&reflink=desktopwebshare_permalink\\\"><IMG VSPACE=\\\"4\\\" HSPACE=\\\"4\\\" BORDER=\\\"0\\\" ALIGN=\\\"RIGHT\\\" SRC=\\\"http://www.techmeme.com/260612/i12.jpg\\\"></A>\\n<P><A HREF=\\\"https://www.techmeme.com/260612/p12#a260612p12\\\" TITLE=\\\"Techmeme permalink\\\"><IMG WIDTH=11 HEIGHT=12 SRC=\\\"http://www.techmeme.com/img/pml.png\\\" STYLE=\\\"border:none;padding:0;margin:0;\\\"></A> <A HREF=\\\"https://www.wsj.com/\\\">Wall Street Journal</A>:<BR>\\n<SPAN STYLE=\\\"font-size:1.3em;\\\"><B><A HREF=\\\"https://www.wsj.com/tech/ai/the-ai-price-war-is-here-piling-pressure-on-openai-and-anthropic-86e1d21b?st=coSbEe&reflink=desktopwebshare_permalink\\\">Companies with rising AI costs are increasingly using tools that tap cheaper models, including some from China, putting pricing pressure on OpenAI and Anthropic</A></B></SPAN>&nbsp; &mdash;&nbsp; Startups and tech giants alike are mixing and matching AI models to avoid the premium prices charged by industry leaders</P>\\n]]></description>\\n <pubDate>Fri, 12 Jun 2026 08:35:01 -0400</pubDate>\\n <guid>https://www.techmeme.com/260612/p12#a260612p12</guid>\\n</item>\\n<item>\\n <title>Niantic Spatial says Pokémon Go data is &quot;not part of&quot; its deal with spatial AI company Vantor, after concerns that game data could be used for military drones (Kenneth Shepard/Kotaku)</title>\\n <link>https://www.techmeme.com/260612/p11#a260612p11</link>\\n <description><![CDATA[<A HREF=\\\"https://kotaku.com/pokemon-go-niantic-spatial-drone-ai-map-training-gps-2000705669\\\"><IMG VSPACE=\\\"4\\\" HSPACE=\\\"4\\\" BORDER=\\\"0\\\" ALIGN=\\\"RIGHT\\\" SRC=\\\"http://www.techmeme.com/260612/i11.jpg\\\"></A>\\n<P><A HREF=\\\"https://www.techmeme.com/260612/p11#a260612p11\\\" TITLE=\\\"Techmeme permalink\\\"><IMG WIDTH=11 HEIGHT=12 SRC=\\\"http://www.techmeme.com/img/pml.png\\\" STYLE=\\\"border:none;padding:0;margin:0;\\\"></A> Kenneth Shepard / <A HREF=\\\"https://kotaku.com/\\\">Kotaku</A>:<BR>\\n<SPAN STYLE=\\\"font-size:1.3em;\\\"><B><A HREF=\\\"https://kotaku.com/pokemon-go-niantic-spatial-drone-ai-map-training-gps-2000705669\\\">Niantic Spatial says Pok&eacute;mon Go data is &ldquo;not part of&rdquo; its deal with spatial AI company Vantor, after concerns that game data could be used for military drones</A></B></SPAN>&nbsp; &mdash;&nbsp; The company says it no longer receives data from the monster-catching app after Niantic was acquired by Scopely</P>\\n]]></description>\\n <pubDate>Fri, 12 Jun 2026 07:30:00 -0400</pubDate>\\n <guid>https://www.techmeme.com/260612/p11#a260612p11</guid>\\n</item>\\n<item>\\n <title>New York City-based Current, which manages a consumer fintech platform, raised an $80M Series E at a $1.5B valuation led by Springcoast Partners (FinSMEs)</title>\\n <link>https://www.techmeme.com/260612/p10#a260612p10</link>\\n <description><![CDATA[<A HREF=\\\"https://www.finsmes.com/2026/06/current-raises-80m-in-series-e-funding.html\\\"><IMG VSPACE=\\\"4\\\" HSPACE=\\\"4\\\" BORDER=\\\"0\\\" ALIGN=\\\"RIGHT\\\" SRC=\\\"http://www.techmeme.com/260612/i10.jpg\\\"></A>\\n<P><A HREF=\\\"https://www.techmeme.com/260612/p10#a260612p10\\\" TITLE=\\\"Techmeme permalink\\\"><IMG WIDTH=11 HEIGHT=12 SRC=\\\"http://www.techmeme.com/img/pml.png\\\" STYLE=\\\"border:none;padding:0;margin:0;\\\"></A> <A HREF=\\\"http://www.finsmes.com/\\\">FinSMEs</A>:<BR>\\n<SPAN STYLE=\\\"font-size:1.3em;\\\"><B><A HREF=\\\"https://www.finsmes.com/2026/06/current-raises-80m-in-series-e-funding.html\\\">New York City-based Current, which manages a consumer fintech platform, raised an $80M Series E at a $1.5B valuation led by Springcoast Partners</A></B></SPAN>&nbsp; &mdash;&nbsp; Current, NYC-based provider of a consumer fintech platform, raised $80M in Series E equity financing, at a $1.5 Billion valuation.</P>\\n]]></description>\\n <pubDate>Fri, 12 Jun 2026 06:55:03 -0400</pubDate>\\n <guid>https://www.techmeme.com/260612/p10#a260612p10</guid>\\n</item>\\n<item>\\n <title>Google sues Chinese cybercrime network Outsider Enterprise, accusing it of using Gemini AI to create fake websites and scam hundreds of thousands of Americans (Cecilia Kang/New York Times)</title>\\n <link>https://www.techmeme.com/260612/p9#a260612p9</link>\\n <description><![CDATA[<A HREF=\\\"https://www.nytimes.com/2026/06/12/technology/google-lawsuit-china-ai-scams.html\\\"><IMG VSPACE=\\\"4\\\" HSPACE=\\\"4\\\" BORDER=\\\"0\\\" ALIGN=\\\"RIGHT\\\" SRC=\\\"http://www.techmeme.com/260612/i9.jpg\\\"></A>\\n<P><A HREF=\\\"https://www.techmeme.com/260612/p9#a260612p9\\\" TITLE=\\\"Techmeme permalink\\\"><IMG WIDTH=11 HEIGHT=12 SRC=\\\"http://www.techmeme.com/img/pml.png\\\" STYLE=\\\"border:none;padding:0;margin:0;\\\"></A> Cecilia Kang / <A HREF=\\\"https://www.nytimes.com/\\\">New York Times</A>:<BR>\\n<SPAN STYLE=\\\"font-size:1.3em;\\\"><B><A HREF=\\\"https://www.nytimes.com/2026/06/12/technology/google-lawsuit-china-ai-scams.html\\\">Google sues Chinese cybercrime network Outsider Enterprise, accusing it of using Gemini AI to create fake websites and scam hundreds of thousands of Americans</A></B></SPAN>&nbsp; &mdash;&nbsp; Google warned that artificial intelligence had supercharged the problem of online scams.Andria Lo for The New York Times</P>\\n]]></description>\\n <pubDate>Fri, 12 Jun 2026 06:20:01 -0400</pubDate>\\n <guid>https://www.techmeme.com/260612/p9#a260612p9</guid>\\n</item>\\n<item>\\n <title>SpaceX&apos;s trading debut will be a test of the &quot;Musk premium&quot;, the force behind Tesla&apos;s $1T+ valuation, and a gauge of investor appetite ahead of upcoming AI IPOs (Reuters)</title>\\n <link>https://www.techmeme.com/260612/p8#a260612p8</link>\\n <description><![CDATA[<A HREF=\\\"https://www.reuters.com/legal/transactional/after-record-ipo-musks-spacex-faces-next-test-market-debut-2026-06-12/\\\"><IMG VSPACE=\\\"4\\\" HSPACE=\\\"4\\\" BORDER=\\\"0\\\" ALIGN=\\\"RIGHT\\\" SRC=\\\"http://www.techmeme.com/260612/i8.jpg\\\"></A>\\n<P><A HREF=\\\"https://www.techmeme.com/260612/p8#a260612p8\\\" TITLE=\\\"Techmeme permalink\\\"><IMG WIDTH=11 HEIGHT=12 SRC=\\\"http://www.techmeme.com/img/pml.png\\\" STYLE=\\\"border:none;padding:0;margin:0;\\\"></A> <A HREF=\\\"http://www.reuters.com/\\\">Reuters</A>:<BR>\\n<SPAN STYLE=\\\"font-size:1.3em;\\\"><B><A HREF=\\\"https://www.reuters.com/legal/transactional/after-record-ipo-musks-spacex-faces-next-test-market-debut-2026-06-12/\\\">SpaceX's trading debut will be a test of the &ldquo;Musk premium&rdquo;, the force behind Tesla's $1T+ valuation, and a gauge of investor appetite ahead of upcoming AI IPOs</A></B></SPAN>&nbsp; &mdash;&nbsp; SpaceX (SPCX.O) is set to begin trading on Nasdaq on Friday after investors poured $75 billion into the world's biggest IPO ever &hellip; </P>\\n]]></description>\\n <pubDate>Fri, 12 Jun 2026 06:15:02 -0400</pubDate>\\n <guid>https://www.techmeme.com/260612/p8#a260612p8</guid>\\n</item>\\n<item>\\n <title>FanDuel owner Flutter plans to delist its LSE stock on August 3, citing low trading and high costs; Flutter moved its primary listing to the NYSE in 2024 (Lauren Almeida/The Guardian)</title>\\n <link>https://www.techmeme.com/260612/p7#a260612p7</link>\\n <description><![CDATA[<A HREF=\\\"https://www.theguardian.com/business/2026/jun/12/paddy-power-flutter-entertainment-delist-london-stock-exchange\\\"><IMG VSPACE=\\\"4\\\" HSPACE=\\\"4\\\" BORDER=\\\"0\\\" ALIGN=\\\"RIGHT\\\" SRC=\\\"http://www.techmeme.com/260612/i7.jpg\\\"></A>\\n<P><A HREF=\\\"https://www.techmeme.com/260612/p7#a260612p7\\\" TITLE=\\\"Techmeme permalink\\\"><IMG WIDTH=11 HEIGHT=12 SRC=\\\"http://www.techmeme.com/img/pml.png\\\" STYLE=\\\"border:none;padding:0;margin:0;\\\"></A> Lauren Almeida / <A HREF=\\\"http://www.theguardian.com/\\\">The Guardian</A>:<BR>\\n<SPAN STYLE=\\\"font-size:1.3em;\\\"><B><A HREF=\\\"https://www.theguardian.com/business/2026/jun/12/paddy-power-flutter-entertainment-delist-london-stock-exchange\\\">FanDuel owner Flutter plans to delist its LSE stock on August 3, citing low trading and high costs; Flutter moved its primary listing to the NYSE in 2024</A></B></SPAN>&nbsp; &mdash;&nbsp; Gambling business, which also owns Betfair, to focus on New York in latest high-profile blow to UK stock market</P>\\n]]></description>\\n <pubDate>Fri, 12 Jun 2026 06:05:01 -0400</pubDate>\\n <guid>https://www.techmeme.com/260612/p7#a260612p7</guid>\\n</item>\\n<item>\\n <title>Memory chipmaker Kioxia replaces Toyota as Japan&apos;s largest company by market value; Kioxia&apos;s shares surged 7.6% on Friday, lifting its market cap above ~$274B (Kanoko Matsuyama/Bloomberg)</title>\\n <link>https://www.techmeme.com/260612/p6#a260612p6</link>\\n <description><![CDATA[<A HREF=\\\"https://www.bloomberg.com/news/articles/2026-06-12/kioxia-becomes-japan-s-most-valuable-firm-as-ai-mania-goes-on\\\"><IMG VSPACE=\\\"4\\\" HSPACE=\\\"4\\\" BORDER=\\\"0\\\" ALIGN=\\\"RIGHT\\\" SRC=\\\"http://www.techmeme.com/260612/i6.jpg\\\"></A>\\n<P><A HREF=\\\"https://www.techmeme.com/260612/p6#a260612p6\\\" TITLE=\\\"Techmeme permalink\\\"><IMG WIDTH=11 HEIGHT=12 SRC=\\\"http://www.techmeme.com/img/pml.png\\\" STYLE=\\\"border:none;padding:0;margin:0;\\\"></A> Kanoko Matsuyama / <A HREF=\\\"https://www.bloomberg.com/\\\">Bloomberg</A>:<BR>\\n<SPAN STYLE=\\\"font-size:1.3em;\\\"><B><A HREF=\\\"https://www.bloomberg.com/news/articles/2026-06-12/kioxia-becomes-japan-s-most-valuable-firm-as-ai-mania-goes-on\\\">Memory chipmaker Kioxia replaces Toyota as Japan's largest company by market value; Kioxia's shares surged 7.6% on Friday, lifting its market cap above ~$274B</A></B></SPAN>&nbsp; &mdash;&nbsp; Memory chipmaker Kioxia Holdings Corp. replaced Toyota Motor Corp. to become Japan's largest company by market value &hellip; </P>\\n]]></description>\\n <pubDate>Fri, 12 Jun 2026 05:40:01 -0400</pubDate>\\n <guid>https://www.techmeme.com/260612/p6#a260612p6</guid>\\n</item>\\n<item>\\n <title>Sources: Nvidia has told Chinese clients that its new Vera CPUs for AI data centers could be available as soon as August and that they can begin placing orders (Reuters)</title>\\n <link>https://www.techmeme.com/260612/p5#a260612p5</link>\\n <description><![CDATA[<A HREF=\\\"https://www.reuters.com/world/china/nvidia-begins-vera-cpu-sales-pitch-chinese-clients-sources-say-2026-06-12/\\\"><IMG VSPACE=\\\"4\\\" HSPACE=\\\"4\\\" BORDER=\\\"0\\\" ALIGN=\\\"RIGHT\\\" SRC=\\\"http://www.techmeme.com/260612/i5.jpg\\\"></A>\\n<P><A HREF=\\\"https://www.techmeme.com/260612/p5#a260612p5\\\" TITLE=\\\"Techmeme permalink\\\"><IMG WIDTH=11 HEIGHT=12 SRC=\\\"http://www.techmeme.com/img/pml.png\\\" STYLE=\\\"border:none;padding:0;margin:0;\\\"></A> <A HREF=\\\"http://www.reuters.com/\\\">Reuters</A>:<BR>\\n<SPAN STYLE=\\\"font-size:1.3em;\\\"><B><A HREF=\\\"https://www.reuters.com/world/china/nvidia-begins-vera-cpu-sales-pitch-chinese-clients-sources-say-2026-06-12/\\\">Sources: Nvidia has told Chinese clients that its new Vera CPUs for AI data centers could be available as soon as August and that they can begin placing orders</A></B></SPAN>&nbsp; &mdash;&nbsp; Nvidia (NVDA.O) has told Chinese clients that its new &ldquo;Vera&rdquo; central processors for AI data centres could be available as soon &hellip; </P>\\n]]></description>\\n <pubDate>Fri, 12 Jun 2026 04:30:01 -0400</pubDate>\\n <guid>https://www.techmeme.com/260612/p5#a260612p5</guid>\\n</item>\\n</channel>\\n</rss>\\n\"}", "name": "http_request"}, {"role": "tool", "tool_call_id": "call_01_ITodBzzJSWCZ1caEpf3f4891", "content": "{\"status_code\": 200, \"headers\": {\"content-type\": \"text/xml; charset=utf-8\", \"last-modified\": \"Fri, 12 Jun 2026 15:09:49 GMT\", \"content-encoding\": \"gzip\", \"server\": \"ESF\", \"cache-control\": \"no-cache, no-store, max-age=0, must-revalidate\", \"date\": \"Fri, 12 Jun 2026 17:04:50 GMT\"}, \"body\": \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\"?><rss xmlns:atom=\\\"http://www.w3.org/2005/Atom\\\" xmlns:content=\\\"http://purl.org/rss/1.0/modules/content/\\\" xmlns:dc=\\\"http://purl.org/dc/elements/1.1/\\\" xmlns:media=\\\"http://search.yahoo.com/mrss/\\\" xmlns:slash=\\\"http://purl.org/rss/1.0/modules/slash/\\\" xmlns:sy=\\\"http://purl.org/rss/1.0/modules/syndication/\\\" version=\\\"2.0\\\">\\n <channel>\\n <title>Ars Technica - All content</title>\\n <atom:link href=\\\"https://arstechnica.com/feed/\\\" rel=\\\"self\\\" type=\\\"application/rss+xml\\\"/>\\n <link>https://arstechnica.com</link>\\n <description>All Ars Technica stories</description>\\n <lastBuildDate>Fri, 12 Jun 2026 15:03:52 +0000</lastBuildDate>\\n <language>en-US</language>\\n <sy:updatePeriod>\\n hourly </sy:updatePeriod>\\n <sy:updateFrequency>\\n 1 </sy:updateFrequency>\\n \\n<image>\\n\\t<url>https://cdn.arstechnica.net/wp-content/uploads/2016/10/cropped-ars-logo-512_480-60x60.png</url>\\n\\t<title>Ars Technica</title>\\n\\t<link>https://arstechnica.com</link>\\n\\t<width>32</width>\\n\\t<height>32</height>\\n</image> \\n <item>\\n <title>Lawsuit: ChatGPT validated suicidal woman's distrust of crisis lines</title>\\n <link>https://arstechnica.com/tech-policy/2026/06/lawsuit-chatgpt-validated-suicidal-womans-distrust-of-crisis-lines/</link>\\n <comments>https://arstechnica.com/tech-policy/2026/06/lawsuit-chatgpt-validated-suicidal-womans-distrust-of-crisis-lines/#comments</comments>\\n \\n <dc:creator>\\n <![CDATA[Cyrus Farivar]]>\\n </dc:creator>\\n <pubDate>Fri, 12 Jun 2026 15:03:52 +0000</pubDate>\\n \\t\\t<category><![CDATA[Policy]]></category>\\n\\t\\t<category><![CDATA[ChatGPT]]></category>\\n\\t\\t<category><![CDATA[lawsuit]]></category>\\n\\t\\t<category><![CDATA[openai]]></category>\\n\\t\\t<category><![CDATA[suicide]]></category>\\n <guid isPermaLink=\\\"true\\\">https://arstechnica.com/tech-policy/2026/06/lawsuit-chatgpt-validated-suicidal-womans-distrust-of-crisis-lines/</guid>\\n\\n <description>\\n <![CDATA[Did chatbot abandon mental health guardrails when a vulnerable user pushed back?]]>\\n </description>\\n <content:encoded>\\n <![CDATA[<p>Last year, a 24-year-old Canadian woman was in a mental health crisis and turned to ChatGPT for help. Hours later, that woman, Alice Carrier, <a href=\\\"https://www.ctvnews.ca/canada/article/a-young-womans-final-exchange-with-an-ai-chatbot/\\\">took her own life</a>.</p>\\n<p>According to a <a href=\\\"https://drive.google.com/file/d/14VMMJjvuqz4k2EIcp9b3BxlPKsacvSQr/view\\\">new lawsuit filed Thursday in San Francisco Superior Court</a> and brought by Carrier’s surviving family, her ChatGPT session “encouraged Alice to kill herself.”</p>\\n<p>This lawsuit, like <a href=\\\"https://arstechnica.com/tech-policy/2026/02/before-psychosis-chatgpt-told-man-he-was-an-oracle-new-lawsuit-alleges/\\\">numerous</a> other similar <a href=\\\"https://arstechnica.com/health/2025/08/after-using-chatgpt-man-swaps-his-salt-for-sodium-bromide-and-suffers-psychosis/\\\">cases</a> that have come before it, alleges a design defect with ChatGPT itself and blames OpenAI for knowingly deploying a dangerous product.</p><p><a href=\\\"https://arstechnica.com/tech-policy/2026/06/lawsuit-chatgpt-validated-suicidal-womans-distrust-of-crisis-lines/\\\">Read full article</a></p>\\n<p><a href=\\\"https://arstechnica.com/tech-policy/2026/06/lawsuit-chatgpt-validated-suicidal-womans-distrust-of-crisis-lines/#comments\\\">Comments</a></p>\\n]]>\\n </content:encoded>\\n \\n <slash:comments>2</slash:comments>\\n \\n \\n <media:content height=\\\"648\\\" medium=\\\"image\\\" type=\\\"image/jpeg\\\" url=\\\"https://cdn.arstechnica.net/wp-content/uploads/2026/06/GettyImages-2280120373-1024x648.jpg\\\" width=\\\"1024\\\">\\n<media:thumbnail height=\\\"500\\\" url=\\\"https://cdn.arstechnica.net/wp-content/uploads/2026/06/GettyImages-2280120373-500x500.jpg\\\" width=\\\"500\\\"/>\\n<media:credit>Samuel Boivin/NurPhoto</media:credit></media:content>\\n </item>\\n <item>\\n <title>Cameras, sensors, and 3D body scans: All the tech helping eliminate blown calls</title>\\n <link>https://arstechnica.com/gadgets/2026/06/cameras-sensors-and-3d-body-scans-all-the-tech-helping-eliminate-blown-calls/</link>\\n <comments>https://arstechnica.com/gadgets/2026/06/cameras-sensors-and-3d-body-scans-all-the-tech-helping-eliminate-blown-calls/#comments</comments>\\n \\n <dc:creator>\\n <![CDATA[Ben Dowsett, WIRED.com]]>\\n </dc:creator>\\n <pubDate>Fri, 12 Jun 2026 11:45:18 +0000</pubDate>\\n \\t\\t<category><![CDATA[Tech]]></category>\\n\\t\\t<category><![CDATA[syndication]]></category>\\n\\t\\t<category><![CDATA[world cup]]></category>\\n <guid isPermaLink=\\\"true\\\">https://arstechnica.com/gadgets/2026/06/cameras-sensors-and-3d-body-scans-all-the-tech-helping-eliminate-blown-calls/</guid>\\n\\n <description>\\n <![CDATA[This World Cup, refs will use digital twins of each player to view plays from every angle.]]>\\n </description>\\n <content:encoded>\\n <![CDATA[<p>At the 2026 <a href=\\\"https://www.wired.com/tag/world-cup-2026/\\\">World Cup</a>, the refs on the field and the officials on the sidelines will be able to use an abundance of tech to help call penalties, spot offside violations, and make other consequential decisions.</p>\\n<p>The video assistant referee system, known as VAR, and the semi-automated offside technology (SAOT) have been used in <a href=\\\"https://www.wired.com/tag/soccer/\\\">soccer</a> for years. But the setup at this summer's World Cup represents some of the most advanced uses of adjudication tech to date—not just in soccer, but across all high-level sports.</p>\\n<p>During each match, the pitch will be awash in sensors, cameras, and new computer vision software. One especially notable advancement this year is the use of digital twins. Every player in the World Cup has had their body scanned by a computer. The digital twin of any athlete—which precisely matches their height, limb length, and shoe size—can be dropped into a virtual simulation of the game to determine their exact position relative to the ball, boundary lines, and other players. Officials can use all of this data to help spot infractions, determine penalties, and smooth out the edges of the beautiful game.</p><p><a href=\\\"https://arstechnica.com/gadgets/2026/06/cameras-sensors-and-3d-body-scans-all-the-tech-helping-eliminate-blown-calls/\\\">Read full article</a></p>\\n<p><a href=\\\"https://arstechnica.com/gadgets/2026/06/cameras-sensors-and-3d-body-scans-all-the-tech-helping-eliminate-blown-calls/#comments\\\">Comments</a></p>\\n]]>\\n </content:encoded>\\n \\n <slash:comments>28</slash:comments>\\n \\n \\n <media:content height=\\\"648\\\" medium=\\\"image\\\" type=\\\"image/jpeg\\\" url=\\\"https://cdn.arstechnica.net/wp-content/uploads/2026/06/GettyImages-2281122730-1152x648.jpg\\\" width=\\\"1152\\\">\\n<media:thumbnail height=\\\"500\\\" url=\\\"https://cdn.arstechnica.net/wp-content/uploads/2026/06/GettyImages-2281122730-500x500.jpg\\\" width=\\\"500\\\"/>\\n<media:credit>Luke Hales/Getty Images</media:credit><media:text>Brian Gutierrez of Mexico is fouled by Sphephelo Sithole of South Africa during the FIFA World Cup 2026 at Mexico City Stadium on June 11, 2026 in Mexico City, Mexico. Sithole was issued a red card on the play.</media:text></media:content>\\n </item>\\n <item>\\n <title>Ebola cases in DRC rise to 676 as Kenya protests erupt over US plans</title>\\n <link>https://arstechnica.com/health/2026/06/ebola-cases-in-drc-rise-to-676-as-kenya-protests-erupt-over-us-plans/</link>\\n <comments>https://arstechnica.com/health/2026/06/ebola-cases-in-drc-rise-to-676-as-kenya-protests-erupt-over-us-plans/#comments</comments>\\n \\n <dc:creator>\\n <![CDATA[Beth Mole]]>\\n </dc:creator>\\n <pubDate>Fri, 12 Jun 2026 11:30:23 +0000</pubDate>\\n \\t\\t<category><![CDATA[Health]]></category>\\n\\t\\t<category><![CDATA[CDC]]></category>\\n\\t\\t<category><![CDATA[drc]]></category>\\n\\t\\t<category><![CDATA[ebola]]></category>\\n\\t\\t<category><![CDATA[WHO]]></category>\\n <guid isPermaLink=\\\"true\\\">https://arstechnica.com/health/2026/06/ebola-cases-in-drc-rise-to-676-as-kenya-protests-erupt-over-us-plans/</guid>\\n\\n <description>\\n <![CDATA[Outbreak responses are still playing catch-up as US works to isolate itself. ]]>\\n </description>\\n <content:encoded>\\n <![CDATA[<p>Nearly a month into the Ebola outbreak in the Democratic Republic of the Congo, cases continue to rise as officials are still trailing the virus in their response efforts.</p>\\n<p>As of Thursday, June 11, the <a href=\\\"https://insp.cd/sitrep-n27-mvb_10-06-2026/\\\">DRC has reported</a> 676 confirmed cases, 136 deaths, and 119 suspected cases. <a href=\\\"https://evd-daily.health.go.ug/\\\">Uganda is reporting 19</a> confirmed cases and two deaths.</p>\\n<p>The outbreak, caused by the Bundibugyo strain of <em>Ebolavirus</em>, is already the third largest Ebola outbreak on record. But health experts fear that it could grow much larger and had been quietly spreading for months before the outbreak was declared on May 15.</p><p><a href=\\\"https://arstechnica.com/health/2026/06/ebola-cases-in-drc-rise-to-676-as-kenya-protests-erupt-over-us-plans/\\\">Read full article</a></p>\\n<p><a href=\\\"https://arstechnica.com/health/2026/06/ebola-cases-in-drc-rise-to-676-as-kenya-protests-erupt-over-us-plans/#comments\\\">Comments</a></p>\\n]]>\\n </content:encoded>\\n \\n <slash:comments>30</slash:comments>\\n \\n \\n <media:content height=\\\"648\\\" medium=\\\"image\\\" type=\\\"image/jpeg\\\" url=\\\"https://cdn.arstechnica.net/wp-content/uploads/2026/06/GettyImages-2280394536-1152x648.jpg\\\" width=\\\"1152\\\">\\n<media:thumbnail height=\\\"500\\\" url=\\\"https://cdn.arstechnica.net/wp-content/uploads/2026/06/GettyImages-2280394536-500x500.jpg\\\" width=\\\"500\\\"/>\\n<media:credit>Getty | Jospin Mwisha</media:credit><media:text>Local healthcare workers take part in an accelerated Ebola training session in Bunia, Democratic Republic of Congo, on June 11, 2026. </media:text></media:content>\\n </item>\\n <item>\\n <title>Pokémon Go players unwittingly contributed to tech with military drone uses</title>\\n <link>https://arstechnica.com/ai/2026/06/pokemon-go-players-unwittingly-contributed-to-tech-with-military-drone-uses/</link>\\n <comments>https://arstechnica.com/ai/2026/06/pokemon-go-players-unwittingly-contributed-to-tech-with-military-drone-uses/#comments</comments>\\n \\n <dc:creator>\\n <![CDATA[Jeremy Hsu]]>\\n </dc:creator>\\n <pubDate>Fri, 12 Jun 2026 11:15:41 +0000</pubDate>\\n \\t\\t<category><![CDATA[AI]]></category>\\n\\t\\t<category><![CDATA[Gaming]]></category>\\n\\t\\t<category><![CDATA[AI drones]]></category>\\n\\t\\t<category><![CDATA[Artificial Intelligence]]></category>\\n\\t\\t<category><![CDATA[drones]]></category>\\n\\t\\t<category><![CDATA[food delivery robots]]></category>\\n\\t\\t<category><![CDATA[GNSS]]></category>\\n\\t\\t<category><![CDATA[GPS]]></category>\\n\\t\\t<category><![CDATA[GPS jamming]]></category>\\n\\t\\t<category><![CDATA[military drones]]></category>\\n\\t\\t<category><![CDATA[mobile games]]></category>\\n\\t\\t<category><![CDATA[niantic]]></category>\\n\\t\\t<category><![CDATA[pokemon]]></category>\\n\\t\\t<category><![CDATA[pokemon go]]></category>\\n\\t\\t<category><![CDATA[robots]]></category>\\n <guid isPermaLink=\\\"true\\\">https://arstechnica.com/ai/2026/06/pokemon-go-players-unwittingly-contributed-to-tech-with-military-drone-uses/</guid>\\n\\n <description>\\n <![CDATA[The repurposing of <em>Pokémon Go</em> data for AI training continues to draw scrutiny.]]>\\n </description>\\n <content:encoded>\\n <![CDATA[<p>A decade after the global craze for<em> Pokémon Go</em> peaked, an AI company has been using billions of real-world images captured by millions of players to develop navigation technologies for delivery robots and possibly military drones. That represents an intriguing but potentially discomfiting legacy for an augmented reality mobile game that has incentivized gamers to capture short smartphone videos of physical neighborhoods and landmarks.</p>\\n<p>The AI company, Niantic Spatial, was spun out of <em>Pokémon Go</em> <a href=\\\"https://arstechnica.com/gaming/2019/02/niantic-poised-to-settle-pokemon-go-trespassing-complaints/\\\">game developer Niantic</a> in May 2025, after Niantic separately sold its licensed games such as <em>Pokémon Go</em> to the <a href=\\\"https://www.pif.gov.sa/en/news-and-insights/newswire/2023/savvy-games-group-completes-acquisition-of-scopely-for-fourty-nine-billion/#:~:text=PIF-owned%20games,for%20%244.9%20billion.\\\">Saudi-backed</a> video game publisher Scopely. But before that deal, Niantic publicly announced plans to use <a href=\\\"https://arstechnica.com/ai/2024/11/niantic-uses-pokemon-go-player-data-to-build-ai-navigation-system/\\\">scans from millions of <em>Pokémon Go</em> players</a> along with data captured by users of the company’s Scaniverse app to train and develop a “large geospatial model”—a 3D model of the physical world trained on the geolocated images provided by app users scanning real-world locations.</p>\\n<p>“Ground scans were one component to help train Niantic Spatial's real-world foundation models —AI systems that learn to recognize and interpret physical spaces,” a Niantic Spatial spokesperson told Ars. “The models are the product of that training, not a copy of or a means of accessing the underlying scans, which were of public points of interest such as statues and fountains.”</p><p><a href=\\\"https://arstechnica.com/ai/2026/06/pokemon-go-players-unwittingly-contributed-to-tech-with-military-drone-uses/\\\">Read full article</a></p>\\n<p><a href=\\\"https://arstechnica.com/ai/2026/06/pokemon-go-players-unwittingly-contributed-to-tech-with-military-drone-uses/#comments\\\">Comments</a></p>\\n]]>\\n </content:encoded>\\n \\n <slash:comments>36</slash:comments>\\n \\n \\n <media:content height=\\\"648\\\" medium=\\\"image\\\" type=\\\"image/jpeg\\\" url=\\\"https://cdn.arstechnica.net/wp-content/uploads/2026/06/GettyImages-2262175351-1152x648.jpg\\\" width=\\\"1152\\\">\\n<media:thumbnail height=\\\"500\\\" url=\\\"https://cdn.arstechnica.net/wp-content/uploads/2026/06/GettyImages-2262175351-500x500.jpg\\\" width=\\\"500\\\"/>\\n<media:credit>Patrick T. Fallon / AFP via Getty Images</media:credit><media:text>A player wearing a hat decorated with Pokemon characters and trading cards plays Pokemon GO on a smartphone during the in-person Pokemon GO Tour: Kalos Los Angeles 2026 event on February 20, 2026.</media:text></media:content>\\n </item>\\n <item>\\n <title>Verizon sent man a refurbished phone with MDM, then deleted his data remotely</title>\\n <link>https://arstechnica.com/tech-policy/2026/06/verizon-sent-man-a-refurbished-phone-with-mdm-then-deleted-his-data-remotely/</link>\\n <comments>https://arstechnica.com/tech-policy/2026/06/verizon-sent-man-a-refurbished-phone-with-mdm-then-deleted-his-data-remotely/#comments</comments>\\n \\n <dc:creator>\\n <![CDATA[Jon Brodkin]]>\\n </dc:creator>\\n <pubDate>Fri, 12 Jun 2026 11:00:41 +0000</pubDate>\\n \\t\\t<category><![CDATA[Features]]></category>\\n\\t\\t<category><![CDATA[Policy]]></category>\\n\\t\\t<category><![CDATA[verizon]]></category>\\n <guid isPermaLink=\\\"true\\\">https://arstechnica.com/tech-policy/2026/06/verizon-sent-man-a-refurbished-phone-with-mdm-then-deleted-his-data-remotely/</guid>\\n\\n <description>\\n <![CDATA[Failure raises questions about how Verizon prepares refurbished phones for new users.]]>\\n </description>\\n <content:encoded>\\n <![CDATA[<p>Verizon sent one of its customers a \\\"refurbished\\\" phone equipped with a Mobile Device Management (MDM) profile that gave the company remote control over the device. The serious mistake raises questions about Verizon's process for preparing refurbished phones to be sent to customers.</p>\\n<p>Tom Collery, the unlucky Verizon customer, called Verizon in February after having network problems, including dropped calls. Verizon responded by sending him a replacement for his phone, a Samsung Galaxy Z Flip7. But instead of a brand-new device or a properly functioning refurbished one, Verizon sent Collery a device managed with the same kind of software used to monitor and control company-owned phones.</p>\\n<p>It turned out the device was a store demo unit that wasn't properly wiped before it was sent to Collery. He said he used the phone for a couple of weeks before all of his data was erased, seemingly due to a remote action that triggered a complete reset.</p><p><a href=\\\"https://arstechnica.com/tech-policy/2026/06/verizon-sent-man-a-refurbished-phone-with-mdm-then-deleted-his-data-remotely/\\\">Read full article</a></p>\\n<p><a href=\\\"https://arstechnica.com/tech-policy/2026/06/verizon-sent-man-a-refurbished-phone-with-mdm-then-deleted-his-data-remotely/#comments\\\">Comments</a></p>\\n]]>\\n </content:encoded>\\n \\n <slash:comments>43</slash:comments>\\n \\n \\n <media:content height=\\\"648\\\" medium=\\\"image\\\" type=\\\"image/jpeg\\\" url=\\\"https://cdn.arstechnica.net/wp-content/uploads/2026/06/verizon-hq-logo-1152x648-1781018733.jpg\\\" width=\\\"1152\\\">\\n<media:thumbnail height=\\\"500\\\" url=\\\"https://cdn.arstechnica.net/wp-content/uploads/2026/06/verizon-hq-logo-500x500-1781018752.jpg\\\" width=\\\"500\\\"/>\\n<media:credit>Getty Images | Bloomberg</media:credit><media:text>Verizon's operational headquarters in Basking Ridge, New Jersey in September 2023. </media:text></media:content>\\n </item>\\n <item>\\n <title>Rocket Report: Nova moving through test campaign; SpaceX IPO launches Friday</title>\\n <link>https://arstechnica.com/space/2026/06/rocket-report-nova-moving-through-test-campaign-spacex-ipo-launches-friday/</link>\\n <comments>https://arstechnica.com/space/2026/06/rocket-report-nova-moving-through-test-campaign-spacex-ipo-launches-friday/#comments</comments>\\n \\n <dc:creator>\\n <![CDATA[Eric Berger]]>\\n </dc:creator>\\n <pubDate>Fri, 12 Jun 2026 11:00:13 +0000</pubDate>\\n \\t\\t<category><![CDATA[Space]]></category>\\n\\t\\t<category><![CDATA[rocket report]]></category>\\n\\t\\t<category><![CDATA[space]]></category>\\n <guid isPermaLink=\\\"true\\\">https://arstechnica.com/space/2026/06/rocket-report-nova-moving-through-test-campaign-spacex-ipo-launches-friday/</guid>\\n\\n <description>\\n <![CDATA[\\\"If I needed to fly on another vehicle, what would that look like?\\\"]]>\\n </description>\\n <content:encoded>\\n <![CDATA[<p>Welcome to Edition 8.45 of the Rocket Report! Even though we are now two weeks removed from the catastrophic loss of the New Glenn rocket and its LC-36A launch pad, it continues to dominate discussion in the space community. This week, NASA said it nominally plans to fly Blue Origin's test lander on New Glenn for the Artemis III mission, but officials quietly acknowledged that other launch vehicles, including Vulcan and the Falcon Heavy, could also get the job done. We'll obviously be watching closely.</p>\\n<p>As always, we <a href=\\\"https://arstechnica.wufoo.com/forms/launch-stories/\\\">welcome reader submissions</a>, and if you don't want to miss an issue, please subscribe using the box below (the form will not appear on AMP-enabled versions of the site). Each report will include information on small-, medium-, and heavy-lift rockets as well as a quick look ahead at the next three launches on the calendar.</p>\\n<figure class=\\\"ars-img-shortcode id-1314289 align-center\\\">\\n <div>\\n <img decoding=\\\"async\\\" width=\\\"560\\\" height=\\\"81\\\" src=\\\"https://cdn.arstechnica.net/wp-content/uploads/2018/05/smalll.png\\\" class=\\\"center full\\\" alt=\\\"\\\" srcset=\\\"https://cdn.arstechnica.net/wp-content/uploads/2018/05/smalll.png 560w, https://cdn.arstechnica.net/wp-content/uploads/2018/05/smalll-300x43.png 300w\\\" sizes=\\\"(max-width: 560px) 100vw, 560px\\\">\\n </div>\\n </figure>\\n\\n<p><strong>Isar raises funding, announces new launch date</strong>. German launch startup Isar Aerospace announced this week that it had closed a 270 million euro Series D to \\\"drive global scaling and ramp up serial production,\\\" <a href=\\\"https://europeanspaceflight.com/isar-aerospace-announces-new-launch-date-alongside-series-d-funding/\\\">European Spaceflight reports</a>. The company also said the previously delayed second launch attempt of its Spectrum rocket would now take place sometime between June 15 and June 21.</p><p><a href=\\\"https://arstechnica.com/space/2026/06/rocket-report-nova-moving-through-test-campaign-spacex-ipo-launches-friday/\\\">Read full article</a></p>\\n<p><a href=\\\"https://arstechnica.com/space/2026/06/rocket-report-nova-moving-through-test-campaign-spacex-ipo-launches-friday/#comments\\\">Comments</a></p>\\n]]>\\n </content:encoded>\\n \\n <slash:comments>55</slash:comments>\\n \\n \\n <media:content height=\\\"648\\\" medium=\\\"image\\\" type=\\\"image/jpeg\\\" url=\\\"https://cdn.arstechnica.net/wp-content/uploads/2026/06/stoke-space-2-1152x648.jpg\\\" width=\\\"1152\\\">\\n<media:thumbnail height=\\\"500\\\" url=\\\"https://cdn.arstechnica.net/wp-content/uploads/2026/06/stoke-space-2-500x500.jpg\\\" width=\\\"500\\\"/>\\n<media:credit>Stoke Space</media:credit><media:text>Stoke Space recently completed Stage 1 structure testing at Moses Lake, Washington.</media:text></media:content>\\n </item>\\n <item>\\n <title>Ted Cruz and Ron Wyden try to fight censorship with bipartisan JAWBONE Act</title>\\n <link>https://arstechnica.com/tech-policy/2026/06/ted-cruz-and-ron-wyden-try-to-fight-censorship-with-bipartisan-jawbone-act/</link>\\n <comments>https://arstechnica.com/tech-policy/2026/06/ted-cruz-and-ron-wyden-try-to-fight-censorship-with-bipartisan-jawbone-act/#comments</comments>\\n \\n <dc:creator>\\n <![CDATA[Jon Brodkin]]>\\n </dc:creator>\\n <pubDate>Thu, 11 Jun 2026 19:31:37 +0000</pubDate>\\n \\t\\t<category><![CDATA[Policy]]></category>\\n\\t\\t<category><![CDATA[brendan carr]]></category>\\n\\t\\t<category><![CDATA[FCC]]></category>\\n\\t\\t<category><![CDATA[Ron Wyden]]></category>\\n\\t\\t<category><![CDATA[ted cruz]]></category>\\n <guid isPermaLink=\\\"true\\\">https://arstechnica.com/tech-policy/2026/06/ted-cruz-and-ron-wyden-try-to-fight-censorship-with-bipartisan-jawbone-act/</guid>\\n\\n <description>\\n <![CDATA[Cruz/Wyden bill would help Americans sue federal officials over censorship.]]>\\n </description>\\n <content:encoded>\\n <![CDATA[<p>US Senators Ted Cruz (R-Texas) and Ron Wyden (D-Ore.) today introduced the JAWBONE Act, a proposed law that could fuel lawsuits against federal officials who try to coerce broadcasters or tech platforms into restricting speech.</p>\\n<p>The <a href=\\\"https://cdn.arstechnica.net/wp-content/uploads/2026/06/JAWBONE-Act.pdf\\\">Justice Against Weaponized Bureaucratic Overreach to Networked Expression Act</a> would prohibit federal agencies and employees from coercing or trying to coerce broadcasters and providers of online services or AI services into changing content. The bill could apply to Federal Communications Commission Chairman Brendan Carr's repeated attempts to pressure TV networks and broadcasters, or government pressure imposed on social media firms and <a href=\\\"https://arstechnica.com/tech-policy/2025/07/gop-ignores-groks-right-wing-bias-in-anti-woke-chatbot-fight-democrat-claims/\\\">AI chatbot makers</a>.</p>\\n<p>The bill would create a private right of action for victims of \\\"jawboning,\\\" letting people recover compensatory damages in court. Individuals whose speech is stifled could bring cases against government officials, and the proposed law could be enforced by state attorneys general through civil actions.</p><p><a href=\\\"https://arstechnica.com/tech-policy/2026/06/ted-cruz-and-ron-wyden-try-to-fight-censorship-with-bipartisan-jawbone-act/\\\">Read full article</a></p>\\n<p><a href=\\\"https://arstechnica.com/tech-policy/2026/06/ted-cruz-and-ron-wyden-try-to-fight-censorship-with-bipartisan-jawbone-act/#comments\\\">Comments</a></p>\\n]]>\\n </content:encoded>\\n \\n <slash:comments>128</slash:comments>\\n \\n \\n <media:content height=\\\"648\\\" medium=\\\"image\\\" type=\\\"image/jpeg\\\" url=\\\"https://cdn.arstechnica.net/wp-content/uploads/2026/06/ted-cruz-ron-wyden-1152x648-1781205333.jpg\\\" width=\\\"1152\\\">\\n<media:thumbnail height=\\\"500\\\" url=\\\"https://cdn.arstechnica.net/wp-content/uploads/2026/06/ted-cruz-ron-wyden-500x500-1781205347.jpg\\\" width=\\\"500\\\"/>\\n<media:credit>Getty Images | Tom Williams</media:credit><media:text>US Senators Ted Cruz (center) and Ron Wyden (back left) in the US Capitol on April 5, 2022. </media:text></media:content>\\n </item>\\n <item>\\n <title>AcuRite admits new app falls short, delays old app’s May shutdown to fix problems</title>\\n <link>https://arstechnica.com/gadgets/2026/06/iot-gadget-firm-acurite-delays-forced-app-migration-due-to-new-apps-shortfalls/</link>\\n <comments>https://arstechnica.com/gadgets/2026/06/iot-gadget-firm-acurite-delays-forced-app-migration-due-to-new-apps-shortfalls/#comments</comments>\\n \\n <dc:creator>\\n <![CDATA[Scharon Harding]]>\\n </dc:creator>\\n <pubDate>Thu, 11 Jun 2026 19:08:54 +0000</pubDate>\\n \\t\\t<category><![CDATA[Tech]]></category>\\n\\t\\t<category><![CDATA[AcuRite]]></category>\\n\\t\\t<category><![CDATA[Bethesda Software]]></category>\\n\\t\\t<category><![CDATA[smart home]]></category>\\n\\t\\t<category><![CDATA[Weather]]></category>\\n <guid isPermaLink=\\\"true\\\">https://arstechnica.com/gadgets/2026/06/iot-gadget-firm-acurite-delays-forced-app-migration-due-to-new-apps-shortfalls/</guid>\\n\\n <description>\\n <![CDATA[The old app \\\"still needs to be retired,\\\" AcuRite tells us. ]]>\\n </description>\\n <content:encoded>\\n <![CDATA[<p>Smart weather-monitoring device vendor AcuRite has delayed plans to force users onto a new companion app. The transition from My AcuRite to AcuRite NOW, which AcuRite previously set for May 30, “has raised serious questions and concerns among many long-time users,” AcuRite’s VP of product development, Jeff Bovee, told Ars Technica.</p>\\n<p>AcuRite, whose devices include weather stations, rain gauges, and indoor thermometers, told customers that it would <a href=\\\"https://arstechnica.com/gadgets/2026/05/weather-monitoring-firm-hangs-dark-cloud-over-customers-heads-by-forcing-new-app/\\\">shut down My AcuRite</a> at the end of May. Devices owners would have to use AcuRite NOW, an iOS and Android app launched in June 2025, to control their gadgets instead.</p>\\n<p>Some long-time users lamented being forced to new software when the current software worked fine, if not better, than the new app. When Ars <a href=\\\"https://arstechnica.com/gadgets/2026/05/weather-monitoring-firm-hangs-dark-cloud-over-customers-heads-by-forcing-new-app/\\\">first reported</a> on AcuRite in May, AcuRite NOW lacked some features of My AcuRite, including the ability to rename multiple temperature sensors, report temperatures in non-integers, as well as an online dashboard option. Users have also highlighted problems uploading data to weather sites and a poor layout with wasted space.</p><p><a href=\\\"https://arstechnica.com/gadgets/2026/06/iot-gadget-firm-acurite-delays-forced-app-migration-due-to-new-apps-shortfalls/\\\">Read full article</a></p>\\n<p><a href=\\\"https://arstechnica.com/gadgets/2026/06/iot-gadget-firm-acurite-delays-forced-app-migration-due-to-new-apps-shortfalls/#comments\\\">Comments</a></p>\\n]]>\\n </content:encoded>\\n \\n <slash:comments>48</slash:comments>\\n \\n \\n <media:content height=\\\"648\\\" medium=\\\"image\\\" type=\\\"image/jpeg\\\" url=\\\"https://cdn.arstechnica.net/wp-content/uploads/2026/06/AcuRite-Optimus-1152x648-1781203140.jpg\\\" width=\\\"1152\\\">\\n<media:thumbnail height=\\\"500\\\" url=\\\"https://cdn.arstechnica.net/wp-content/uploads/2026/06/AcuRite-Optimus-500x500.jpg\\\" width=\\\"500\\\"/>\\n<media:credit>AcuRite</media:credit><media:text>AcuRite NOW was released alongside AcuRite's Optimus weather station (pictured). </media:text></media:content>\\n </item>\\n <item>\\n <title>After nearly breaking, NASA's Deep Space Network \\\"worked well\\\" on Artemis II</title>\\n <link>https://arstechnica.com/space/2026/06/after-nearly-breaking-nasas-deep-space-network-worked-well-on-artemis-ii/</link>\\n <comments>https://arstechnica.com/space/2026/06/after-nearly-breaking-nasas-deep-space-network-worked-well-on-artemis-ii/#comments</comments>\\n \\n <dc:creator>\\n <![CDATA[Stephen Clark]]>\\n </dc:creator>\\n <pubDate>Thu, 11 Jun 2026 18:34:01 +0000</pubDate>\\n \\t\\t<category><![CDATA[Science]]></category>\\n\\t\\t<category><![CDATA[Space]]></category>\\n\\t\\t<category><![CDATA[artemis]]></category>\\n\\t\\t<category><![CDATA[artemis II]]></category>\\n\\t\\t<category><![CDATA[Deep Space Network]]></category>\\n\\t\\t<category><![CDATA[moon]]></category>\\n\\t\\t<category><![CDATA[NASA]]></category>\\n\\t\\t<category><![CDATA[planetary science]]></category>\\n\\t\\t<category><![CDATA[solar system]]></category>\\n \", \"body_truncated\": true, \"truncation_note\": \"正文已截断:原始约 77773 字符,仅保留前 32000 字符。门户/频道首页通常过大,摘要请优先使用具体文章页 URL。\"}", "name": "http_request"}], "extra": {"agent_name": "AI智能助手(豆包Pro)", "iteration": 4, "tool_calls_made": 10}}