# msgid "" msgstr "" "Project-Id-Version: REA website\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: website/public/blog/index.html:107 msgctxt "page:blog/index.html" msgid "Skip to content" msgstr "" #: website/public/blog/index.html:117 #: website/public/blog/reverse-engineering-models/index.html:117 #: website/public/blog/touhou-reconstruction/index.html:117 #: website/public/contributors/index.html:118 #: website/public/examples/dino-lab/index.html:118 website/public/faq/index.html:117 #: website/public/first-investigation/index.html:117 #: website/public/get-started/index.html:117 #: website/public/guides/browser/index.html:117 website/public/guides/index.html:117 #: website/public/guides/javascript/index.html:117 #: website/public/guides/native/index.html:117 website/public/index.html:119 #: website/public/showcase/aegis/index.html:118 #: website/public/showcase/ctf/index.html:117 #: website/public/showcase/dx-ball/index.html:117 website/public/showcase/index.html:117 #: website/public/showcase/notion/index.html:117 #: website/public/showcase/th04/index.html:117 msgctxt "shared" msgid "Get started" msgstr "" #: website/public/blog/index.html:118 #: website/public/blog/reverse-engineering-models/index.html:118 #: website/public/blog/touhou-reconstruction/index.html:118 #: website/public/contributors/index.html:119 #: website/public/examples/dino-lab/index.html:119 website/public/faq/index.html:118 #: website/public/first-investigation/index.html:118 #: website/public/get-started/index.html:118 #: website/public/guides/browser/index.html:118 website/public/guides/index.html:118 #: website/public/guides/javascript/index.html:118 #: website/public/guides/native/index.html:118 website/public/index.html:120 #: website/public/showcase/aegis/index.html:119 #: website/public/showcase/ctf/index.html:118 #: website/public/showcase/dx-ball/index.html:118 website/public/showcase/index.html:118 #: website/public/showcase/notion/index.html:118 #: website/public/showcase/th04/index.html:118 msgctxt "shared" msgid "Showcases" msgstr "" #: website/public/blog/index.html:119 #: website/public/blog/reverse-engineering-models/index.html:119 #: website/public/blog/touhou-reconstruction/index.html:119 #: website/public/contributors/index.html:120 #: website/public/examples/dino-lab/index.html:120 website/public/faq/index.html:119 #: website/public/first-investigation/index.html:119 #: website/public/get-started/index.html:119 #: website/public/guides/browser/index.html:119 website/public/guides/index.html:119 #: website/public/guides/javascript/index.html:119 #: website/public/guides/native/index.html:119 website/public/index.html:121 #: website/public/showcase/aegis/index.html:120 #: website/public/showcase/ctf/index.html:119 #: website/public/showcase/dx-ball/index.html:119 website/public/showcase/index.html:119 #: website/public/showcase/notion/index.html:119 #: website/public/showcase/th04/index.html:119 msgctxt "shared" msgid "Blog" msgstr "" #: website/public/blog/index.html:120 #: website/public/blog/reverse-engineering-models/index.html:120 #: website/public/blog/touhou-reconstruction/index.html:120 #: website/public/contributors/index.html:121 #: website/public/examples/dino-lab/index.html:121 website/public/faq/index.html:120 #: website/public/first-investigation/index.html:120 #: website/public/get-started/index.html:120 #: website/public/guides/browser/index.html:120 website/public/guides/index.html:120 #: website/public/guides/javascript/index.html:120 #: website/public/guides/native/index.html:120 website/public/index.html:122 #: website/public/showcase/aegis/index.html:121 #: website/public/showcase/ctf/index.html:120 #: website/public/showcase/dx-ball/index.html:120 website/public/showcase/index.html:120 #: website/public/showcase/notion/index.html:120 #: website/public/showcase/th04/index.html:120 msgctxt "shared" msgid "Guides" msgstr "" #: website/public/blog/index.html:122 website/public/blog/index.html:241 #: website/public/blog/reverse-engineering-models/index.html:122 #: website/public/blog/reverse-engineering-models/index.html:880 #: website/public/blog/touhou-reconstruction/index.html:122 #: website/public/blog/touhou-reconstruction/index.html:1077 #: website/public/contributors/index.html:123 #: website/public/contributors/index.html:1128 #: website/public/examples/dino-lab/index.html:123 #: website/public/examples/dino-lab/index.html:472 website/public/faq/index.html:122 #: website/public/faq/index.html:570 website/public/first-investigation/index.html:122 #: website/public/first-investigation/index.html:531 #: website/public/get-started/index.html:122 website/public/get-started/index.html:1814 #: website/public/guides/browser/index.html:122 #: website/public/guides/browser/index.html:504 website/public/guides/index.html:122 #: website/public/guides/index.html:279 website/public/guides/javascript/index.html:122 #: website/public/guides/javascript/index.html:500 #: website/public/guides/native/index.html:122 #: website/public/guides/native/index.html:506 website/public/index.html:124 #: website/public/index.html:1219 website/public/showcase/aegis/index.html:123 #: website/public/showcase/aegis/index.html:805 #: website/public/showcase/ctf/index.html:122 website/public/showcase/ctf/index.html:774 #: website/public/showcase/dx-ball/index.html:122 #: website/public/showcase/dx-ball/index.html:782 website/public/showcase/index.html:122 #: website/public/showcase/index.html:314 website/public/showcase/notion/index.html:122 #: website/public/showcase/notion/index.html:628 #: website/public/showcase/th04/index.html:122 #: website/public/showcase/th04/index.html:797 msgctxt "shared" msgid "Contributors" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/index.html:199 #, python-brace-format msgctxt "page:blog/index.html" msgid "{ph0}Home{ph1} / Blog" msgstr "" #: website/public/blog/index.html:200 msgctxt "page:blog/index.html" msgid "Blog." msgstr "" #: website/public/blog/index.html:201 msgctxt "page:blog/index.html" msgid "Thoughts on reverse engineering." msgstr "" #. {ph0}:
#: website/public/blog/index.html:205 #, python-brace-format msgctxt "page:blog/index.html" msgid "Model specialization{ph0}Essay" msgstr "" #: website/public/blog/index.html:207 msgctxt "page:blog/index.html" msgid "Does reverse engineering need a bigger model?" msgstr "" #: website/public/blog/index.html:208 msgctxt "page:blog/index.html" msgid "" "What Touhou reconstruction suggests about general models, specialist models and " "learning from compiler feedback." msgstr "" #: website/public/blog/index.html:212 website/public/blog/index.html:227 msgctxt "page:blog/index.html" msgid "Read the article" msgstr "" #: website/public/blog/index.html:215 msgctxt "page:blog/index.html" msgid "By N0zoM1z0 · 13 October 2026" msgstr "" #. {ph0}:
#: website/public/blog/index.html:219 #, python-brace-format msgctxt "page:blog/index.html" msgid "Game reconstruction{ph0}Essay" msgstr "" #: website/public/blog/index.html:221 msgctxt "page:blog/index.html" msgid "The industrial revolution in reverse engineering" msgstr "" #: website/public/blog/index.html:222 msgctxt "page:blog/index.html" msgid "" "What manual RE and reconstructing TH08, TH095 and TH04 taught me about agents, " "verification and knowledge that compounds across projects." msgstr "" #: website/public/blog/index.html:230 msgctxt "page:blog/index.html" msgid "By N0zoM1z0 · 10 October 2026" msgstr "" #: website/public/blog/index.html:242 #: website/public/blog/reverse-engineering-models/index.html:881 #: website/public/blog/touhou-reconstruction/index.html:1078 #: website/public/contributors/index.html:1129 #: website/public/examples/dino-lab/index.html:473 website/public/faq/index.html:571 #: website/public/first-investigation/index.html:532 #: website/public/get-started/index.html:1815 #: website/public/guides/browser/index.html:505 website/public/guides/index.html:280 #: website/public/guides/javascript/index.html:501 #: website/public/guides/native/index.html:507 website/public/index.html:1220 #: website/public/showcase/aegis/index.html:806 #: website/public/showcase/ctf/index.html:775 #: website/public/showcase/dx-ball/index.html:783 website/public/showcase/index.html:315 #: website/public/showcase/notion/index.html:629 #: website/public/showcase/th04/index.html:798 msgctxt "shared" msgid "Source" msgstr "" #: website/public/blog/index.html:243 #: website/public/blog/reverse-engineering-models/index.html:882 #: website/public/blog/touhou-reconstruction/index.html:1079 #: website/public/contributors/index.html:1130 #: website/public/examples/dino-lab/index.html:474 website/public/faq/index.html:572 #: website/public/first-investigation/index.html:533 #: website/public/get-started/index.html:1816 #: website/public/guides/browser/index.html:506 website/public/guides/index.html:281 #: website/public/guides/javascript/index.html:502 #: website/public/guides/native/index.html:508 website/public/index.html:1221 #: website/public/showcase/aegis/index.html:807 #: website/public/showcase/ctf/index.html:776 #: website/public/showcase/dx-ball/index.html:784 website/public/showcase/index.html:316 #: website/public/showcase/notion/index.html:630 #: website/public/showcase/th04/index.html:799 msgctxt "shared" msgid "MIT license" msgstr "" #: website/public/blog/index.html:244 #: website/public/blog/reverse-engineering-models/index.html:883 #: website/public/blog/touhou-reconstruction/index.html:1080 #: website/public/contributors/index.html:1131 #: website/public/examples/dino-lab/index.html:475 website/public/faq/index.html:573 #: website/public/first-investigation/index.html:534 #: website/public/get-started/index.html:1817 #: website/public/guides/browser/index.html:507 website/public/guides/index.html:282 #: website/public/guides/javascript/index.html:503 #: website/public/guides/native/index.html:509 website/public/index.html:1222 #: website/public/showcase/aegis/index.html:808 #: website/public/showcase/ctf/index.html:777 #: website/public/showcase/dx-ball/index.html:785 website/public/showcase/index.html:317 #: website/public/showcase/notion/index.html:631 #: website/public/showcase/th04/index.html:800 msgctxt "shared" msgid "Join the community" msgstr "" #: website/public/blog/index.html:245 #: website/public/blog/reverse-engineering-models/index.html:884 #: website/public/blog/touhou-reconstruction/index.html:1081 #: website/public/contributors/index.html:1132 #: website/public/examples/dino-lab/index.html:476 website/public/faq/index.html:574 #: website/public/first-investigation/index.html:535 #: website/public/get-started/index.html:1818 #: website/public/guides/browser/index.html:508 website/public/guides/index.html:283 #: website/public/guides/javascript/index.html:504 #: website/public/guides/native/index.html:510 website/public/index.html:1223 #: website/public/showcase/aegis/index.html:809 #: website/public/showcase/ctf/index.html:778 #: website/public/showcase/dx-ball/index.html:786 website/public/showcase/index.html:318 #: website/public/showcase/notion/index.html:632 #: website/public/showcase/th04/index.html:801 msgctxt "shared" msgid "Follow us on X" msgstr "" #. {ph0}: #: website/public/blog/index.html:250 #: website/public/blog/reverse-engineering-models/index.html:889 #: website/public/blog/touhou-reconstruction/index.html:1086 #: website/public/contributors/index.html:1137 #: website/public/examples/dino-lab/index.html:481 website/public/faq/index.html:579 #: website/public/first-investigation/index.html:540 #: website/public/get-started/index.html:1823 #: website/public/guides/browser/index.html:513 website/public/guides/index.html:288 #: website/public/guides/javascript/index.html:509 #: website/public/guides/native/index.html:515 website/public/index.html:1228 #: website/public/showcase/aegis/index.html:814 #: website/public/showcase/ctf/index.html:783 #: website/public/showcase/dx-ball/index.html:791 website/public/showcase/index.html:323 #: website/public/showcase/notion/index.html:637 #: website/public/showcase/th04/index.html:806 #, python-brace-format msgctxt "shared" msgid "{ph0}↑{ph1} Top" msgstr "" #: website/public/blog/index.html:6 msgctxt "page:blog/index.html" msgid "REA Blog — Thoughts on Reverse Engineering" msgstr "" #: website/public/blog/index.html:7 msgctxt "page:blog/index.html" msgid "" "Thoughts on reverse engineering, drawing on practical experience with REA and AI " "agents." msgstr "" #: website/public/blog/index.html:79 website/public/blog/index.html:92 #: website/public/blog/reverse-engineering-models/index.html:79 #: website/public/blog/reverse-engineering-models/index.html:92 #: website/public/blog/touhou-reconstruction/index.html:79 #: website/public/blog/touhou-reconstruction/index.html:92 #: website/public/contributors/index.html:79 website/public/contributors/index.html:92 #: website/public/examples/dino-lab/index.html:79 #: website/public/examples/dino-lab/index.html:92 website/public/faq/index.html:79 #: website/public/faq/index.html:92 website/public/first-investigation/index.html:79 #: website/public/first-investigation/index.html:92 #: website/public/get-started/index.html:79 website/public/get-started/index.html:92 #: website/public/guides/browser/index.html:79 #: website/public/guides/browser/index.html:92 website/public/guides/index.html:79 #: website/public/guides/index.html:92 website/public/guides/javascript/index.html:79 #: website/public/guides/javascript/index.html:92 #: website/public/guides/native/index.html:79 website/public/guides/native/index.html:92 #: website/public/index.html:79 website/public/index.html:92 #: website/public/showcase/aegis/index.html:79 #: website/public/showcase/aegis/index.html:92 website/public/showcase/ctf/index.html:79 #: website/public/showcase/ctf/index.html:92 #: website/public/showcase/dx-ball/index.html:79 #: website/public/showcase/dx-ball/index.html:92 website/public/showcase/index.html:79 #: website/public/showcase/index.html:92 website/public/showcase/notion/index.html:79 #: website/public/showcase/notion/index.html:92 #: website/public/showcase/th04/index.html:79 website/public/showcase/th04/index.html:92 msgctxt "shared" msgid "REA — Find out how software works. Reverse engineering with your coding agent." msgstr "" #: website/public/blog/index.html:112 #: website/public/blog/reverse-engineering-models/index.html:112 #: website/public/blog/touhou-reconstruction/index.html:112 #: website/public/contributors/index.html:113 #: website/public/examples/dino-lab/index.html:113 website/public/faq/index.html:112 #: website/public/first-investigation/index.html:112 #: website/public/get-started/index.html:112 #: website/public/guides/browser/index.html:112 website/public/guides/index.html:112 #: website/public/guides/javascript/index.html:112 #: website/public/guides/native/index.html:112 website/public/index.html:114 #: website/public/showcase/aegis/index.html:113 #: website/public/showcase/ctf/index.html:112 #: website/public/showcase/dx-ball/index.html:112 website/public/showcase/index.html:112 #: website/public/showcase/notion/index.html:112 #: website/public/showcase/th04/index.html:112 msgctxt "shared" msgid "REA home" msgstr "" #: website/public/blog/index.html:116 #: website/public/blog/reverse-engineering-models/index.html:116 #: website/public/blog/touhou-reconstruction/index.html:116 #: website/public/contributors/index.html:117 #: website/public/examples/dino-lab/index.html:117 website/public/faq/index.html:116 #: website/public/first-investigation/index.html:116 #: website/public/get-started/index.html:116 #: website/public/guides/browser/index.html:116 website/public/guides/index.html:116 #: website/public/guides/javascript/index.html:116 #: website/public/guides/native/index.html:116 website/public/index.html:118 #: website/public/showcase/aegis/index.html:117 #: website/public/showcase/ctf/index.html:116 #: website/public/showcase/dx-ball/index.html:116 website/public/showcase/index.html:116 #: website/public/showcase/notion/index.html:116 #: website/public/showcase/th04/index.html:116 msgctxt "shared" msgid "Main navigation" msgstr "" #: website/public/blog/index.html:135 #: website/public/blog/reverse-engineering-models/index.html:135 #: website/public/blog/touhou-reconstruction/index.html:135 #: website/public/contributors/index.html:136 #: website/public/examples/dino-lab/index.html:136 website/public/faq/index.html:135 #: website/public/first-investigation/index.html:135 #: website/public/get-started/index.html:135 #: website/public/guides/browser/index.html:135 website/public/guides/index.html:135 #: website/public/guides/javascript/index.html:135 #: website/public/guides/native/index.html:135 website/public/index.html:137 #: website/public/showcase/aegis/index.html:136 #: website/public/showcase/ctf/index.html:135 #: website/public/showcase/dx-ball/index.html:135 website/public/showcase/index.html:135 #: website/public/showcase/notion/index.html:135 #: website/public/showcase/th04/index.html:135 msgctxt "shared" msgid "REA on GitHub" msgstr "" #: website/public/blog/index.html:155 #: website/public/blog/reverse-engineering-models/index.html:155 #: website/public/blog/touhou-reconstruction/index.html:155 #: website/public/contributors/index.html:156 #: website/public/examples/dino-lab/index.html:156 website/public/faq/index.html:155 #: website/public/first-investigation/index.html:155 #: website/public/get-started/index.html:155 #: website/public/guides/browser/index.html:155 website/public/guides/index.html:155 #: website/public/guides/javascript/index.html:155 #: website/public/guides/native/index.html:155 website/public/index.html:157 #: website/public/showcase/aegis/index.html:156 #: website/public/showcase/ctf/index.html:155 #: website/public/showcase/dx-ball/index.html:155 website/public/showcase/index.html:155 #: website/public/showcase/notion/index.html:155 #: website/public/showcase/th04/index.html:155 msgctxt "shared" msgid "Join REA on Discord" msgstr "" #: website/public/blog/index.html:174 #: website/public/blog/reverse-engineering-models/index.html:174 #: website/public/blog/touhou-reconstruction/index.html:174 #: website/public/contributors/index.html:175 #: website/public/examples/dino-lab/index.html:175 website/public/faq/index.html:174 #: website/public/first-investigation/index.html:174 #: website/public/get-started/index.html:174 #: website/public/guides/browser/index.html:174 website/public/guides/index.html:174 #: website/public/guides/javascript/index.html:174 #: website/public/guides/native/index.html:174 website/public/index.html:176 #: website/public/showcase/aegis/index.html:175 #: website/public/showcase/ctf/index.html:174 #: website/public/showcase/dx-ball/index.html:174 website/public/showcase/index.html:174 #: website/public/showcase/notion/index.html:174 #: website/public/showcase/th04/index.html:174 msgctxt "shared" msgid "Follow REA on X" msgstr "" #: website/public/blog/index.html:250 msgctxt "page:blog/index.html" msgid "Back to top" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:107 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Skip to content" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/blog/reverse-engineering-models/index.html:199 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "{ph0}Home{ph1} / {ph2}Blog{ph3} / Models and RE" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:202 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Essay" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:203 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Does reverse engineering need a bigger model?" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:204 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "By N0zoM1z0 · 13 October 2026" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:206 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Takeaway" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:208 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "{ph0}Model capability changes the hypotheses an agent can find.{ph1} Later sessions " "have solved problems that earlier work left unresolved." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:216 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "{ph0}A familiar compiler gives specialization something concrete to learn.{ph1} Some " "exact matches depend on narrow, reusable source patterns." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:223 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "{ph0}Give repository knowledge a fair comparison.{ph1} A smaller model with good " "retrieval may already know enough to make progress." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:228 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "{ph0}Train the next useful experiment, and test its oracle.{ph1} The value of feedback" " depends on what the checker actually verifies." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:235 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "{ph0}Measure accepted reconstruction against time and cost.{ph1} That is the result I " "want from the whole agent." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:246 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "In this article" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:248 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "{ph0}What better models changed{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:249 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "{ph0}Why specialize?{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:250 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "{ph0}Where experience lives{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:251 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "{ph0}Learning the next experiment{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:252 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "{ph0}RE and reinforcement learning{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:253 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "{ph0}When the oracle is wrong{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:254 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "{ph0}A comparison worth running{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:255 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "{ph0}What kind of agent?{ph1}" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:263 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "What better models changed" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:264 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Since August 2026, I have been exploring how much reverse engineering an agent can " "carry out with access to a program and a way to check its work. Most of my experience " "comes from reconstructing games, especially Touhou. As I have changed models, the " "repositories have kept a record of what each session managed to recover." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:272 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Much of that work aims at exact reconstruction: we compile the maintained source under" " a pinned historical toolchain and check whether it reproduces the target function. " "When a later model succeeds where earlier work stalled, the source changes show what " "made that progress possible." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:279 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "The temporary values had to stay alive together" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:280 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Much of a TH09 attack function's logic had already been reconstructed, but the " "compiler still stored temporary results differently from the original. The remaining " "problem was how long those results needed to stay alive and when their storage could " "be reused." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/blog/reverse-engineering-models/index.html:287 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "A {ph0}GPT-6-Sol checkpoint{ph1} recorded this mismatch after testing several ordinary" " source arrangements. When {ph2}GPT-6.1-Sol returned to the problem{ph3}, it found a " "useful hypothesis about how long those temporary values needed to stay alive." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:301 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "The function produced temporary results and copied them into animation positions. In " "C++, a temporary result stays alive until the expression using it finishes. Grouping " "the real operations into one expression kept those results alive together, so the " "compiler could no longer reuse the same storage for all of them." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:308 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "One result still shared storage with a value used later for collision checks. Giving " "that value its own lifetime resolved the remaining overlap. After several targeted " "experiments, {ph0}a clean rebuild confirmed that the full function matched{ph1}." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:317 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "What interests me is how the discovery and the tests worked together. The lifetime " "hypothesis gave the agent a new direction; compiler feedback helped it refine that " "hypothesis into a source arrangement that matched." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:323 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "A different control-flow graph" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:324 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "A second TH09 function shows why that new direction can matter. Here, the obstacle was" " how several branches shared their final work. {ph0}GPT-6.1-Sol's earlier work{ph1} " "got parts of the function to match, but the branches still joined up differently from " "the original." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/blog/reverse-engineering-models/index.html:335 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "{ph0}GPT-6-Astra changed the surrounding control-flow graph{ph1}. The main paths now " "led to a shared final update and return. In that source structure, the compiler " "combined the branches in the same way as the original. The complete function matched, " "and a {ph2}separate rebuild check confirmed it{ph3}." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:347 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "{ph0}Changing the representation opened a more productive search space.{ph1} Both " "cases give me a reason to take general model capability seriously: an agent can keep " "trying local variations for a long time before finding a better way to express the " "surrounding work." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:356 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "At the same time, the later sessions started with earlier source and recorded " "failures. That accumulated work was part of their advantage. The history lets us " "inspect the discoveries and their checks; a controlled comparison would help separate " "the effect of the model from the experience it inherited." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:363 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "This is where the question becomes interesting to me. Some of the progress came from " "finding a new representation, while much of the remaining work involved testing source" " forms against a familiar compiler. How much needs broad reasoning ability, and how " "much could a model learn through repeated experience with that compiler and code?" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:373 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Why might a specialist do well?" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:374 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Touhou gives us a concrete reason to expect that experience to help. Much of the game " "code comes from the same author, ZUN, so recurring habits are a reasonable starting " "assumption. The repositories back that up with useful examples: related loops and " "helper arrangements have supplied hypotheses across games." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:381 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Those source patterns become more specific when we include the compiler. Under a " "particular version and set of options, small changes in source can produce repeatable " "differences in machine code. Some of those differences are surprisingly obscure." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: Supervisor::LoadDat #. {ph4}: #: website/public/blog/reverse-engineering-models/index.html:387 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "In TH095, for example, {ph0}even the name used for a local variable could change where" " VC7.1 stored it{ph1}. Moving the declaration alone did not solve the layout, but an " "earlier background function had revealed a naming pattern that affected the compiler's" " choice. That gave us a more promising hypothesis for {ph2}the reconstruction of " "{ph3}{ph4}." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:401 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Reusing that pattern for the file-size variable produced the required layout without " "adding storage. The full function then matched." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:406 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "This is the sort of narrow detail a general model may not know when it arrives. A " "specialist trained on this compiler could encounter many such cases and learn which " "source variations are worth testing first." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:412 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "The opportunity is especially clear in final matching problems where we already " "understand the behavior. We are then asking which ordinary source form this compiler " "turns into the observed instructions. Specialization could help the model propose " "those forms more efficiently, while the target still determines which hypotheses " "survive." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:420 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "The useful patterns would have to retain their context, though. TH08 uses an earlier " "Visual C++ version than TH095 and TH09. TH04 uses a different DOS-era compiler, and " "its {ph0}player reconstruction{ph1} needed different hypotheses about source patterns " "and how the compiled code was combined into an executable. Shared authorship gives us " "a prior, but each target tells us whether it applies. Distinguishing those contexts is" " part of what a specialist would need to learn." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:436 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Where should that experience live?" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:437 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Before deciding to teach those patterns through model training, I would look at the " "knowledge we already keep in the repository. In the {ph0}previous essay{ph1}, I wrote " "about it becoming the project's working memory. That memory includes compiler lessons," " along with the source and failed experiments that made them useful." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:446 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "By retrieving that record, an agent can start with a known result and inspect how we " "reached it. It can also avoid alternatives that have already failed in the same " "context. The starting point improves without changing the model's weights." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:452 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "When reconstructing TH09's enemy-spawn function, a {ph0}GPT-6-Luna-max session{ph1} " "drew a hypothesis from TH08's corresponding source family. That earlier source " "suggested how to structure the loop and handle failures within it. TH09's own evidence" " supplied the game-specific details, and clean rebuilds confirmed the complete match." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:463 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "{ph0}\"The model did not know that compiler quirk\" and \"the model could not use it\"" " are different problems.{ph1} Retrieval may solve the first, but turning that fact " "into a useful candidate still takes work. And if the candidate fails, the model must " "decide what the result means for its next attempt. Knowing the relevant pattern is " "only the beginning of that process." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:473 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "For that reason, I would include a smaller general model with good retrieval in any " "comparison. Giving it the same library of experience would help us identify what " "training adds: better candidate generation, better decisions after feedback, or both." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:481 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Learning the next useful experiment" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:482 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Those decisions after feedback are what I would most like to study. In agentic " "reconstruction, the model proposes an explanation and tests it against the program. " "Even when the candidate fails, the result can narrow the remaining possibilities and " "suggest a more useful next experiment." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:489 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Consider the temporary-results example again. Its final source shows the arrangement " "that worked, but the route to that source contains more information. Each of the " "following experiments helped identify what still needed to change." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:502 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Experiment" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:503 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "What its result taught us" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:508 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Try a different way to copy the results" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:509 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "The copy code changes, but the function still differs." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:514 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Use the returned values directly" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:515 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Copying follows the original pattern, but temporary storage still differs." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:521 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Keep the temporary results alive together" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:522 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "They get separate storage, but one still overlaps a value used later for collision " "checks." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:528 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Keep the collision-check value separate" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:529 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "A clean rebuild confirms the complete match." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:534 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Selected experiments from the attack-function reconstruction above, grouped by what " "they taught us." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:538 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "A training record that keeps this sequence can teach more than the final source alone." " It connects each proposed change to an observed result and the next decision. Keeping" " ineffective variations matters too: they tell a later agent which hypotheses have " "already been tested in that context." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:545 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "{ph0}I would want the model to learn how to use feedback.{ph1} A neutral result is a " "reason to reconsider the variation; a changed mismatch may point to another cause. " "When local edits stop being informative, the agent should be able to revisit the " "source representation or inspect the evidence again." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:554 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Learning to make those choices requires autonomy. Sometimes the useful next step is " "inspecting another caller rather than compiling another edit. A rigid sequence of " "required rewrites would remove that choice, along with part of the behavior we want " "the model to learn." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:563 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Why RE is interesting for reinforcement learning" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:564 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Bounded reconstruction gives us a practical environment for studying these choices. " "Once the target and compiler are pinned, many source experiments produce quick, " "repeatable feedback. The agent can compile a candidate, inspect the mismatch and use " "that observation to choose its next step." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:571 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Reinforcement learning could train that decision-making process through the feedback " "it receives. A candidate accepted by a defined check gives us a concrete outcome, " "while the sequence of attempts lets us observe how much work it took to reach it." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/blog/reverse-engineering-models/index.html:577 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "There is already research supporting this direction. {ph0}LLM4Decompile{ph1} studies " "models specialized for decompilation. {ph2}AutoDecompiler{ph3} trains multi-turn " "refinement using compiler and execution feedback. Their studies focus on functional " "recovery. For this work, I would use them as a starting point for the related task of " "finding source that matches a historical compiler's output." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:589 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "To reach such a well-defined task, though, we may first need to establish what a " "function owns or devise a new runtime measurement. In TH08, for example, a " "{ph0}collision difference led back to how the original program handled floating-point " "calculations{ph1}. Before the agent could test a useful correction, it had to work out" " what to measure." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:600 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "This suggests another role for a broadly capable model: helping make the problem " "checkable in the first place. Once that check exists, we can investigate how far a " "learned search policy can get with it." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:608 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "When the oracle is wrong" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:609 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Once we train against that check, its coverage becomes part of what the model learns. " "I call the reference or checker an oracle. Even if it gives a repeatable answer, we " "still need to understand what that answer covers." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:615 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "TH08 showed how much can hide outside that coverage. Some reconstructed functions " "passed their exact comparisons with wrong floating constants. The comparator adjusted " "relocated addresses before checking instructions, but it checked the values behind " "those addresses only when they had been explicitly recorded for verification. Other " "literal references could pass without their values being examined." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: 1.0f #. {ph3}: 32.0f #: website/public/blog/reverse-engineering-models/index.html:624 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "To close that gap, a {ph0}wider audit{ph1} found incorrect constants in functions that" " had already been accepted. In one calculation, the reconstructed source added {ph2} " "where the original added {ph3}." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:634 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "{ph0}A learner rewarded by the old check could learn to produce the wrong " "reconstruction.{ph1} We had not trained an RL model against this oracle; the observed " "failure was in the check itself. But using that check as a reward would have made the " "same blind spot part of the learning environment." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:644 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "A functional test can have a similar blind spot. {ph0}Differential-fuzzing research on" " LLM decompilers{ph1} has found behavior differences beyond the supplied tests. " "Passing those tests therefore needs to be read in terms of the cases they exercise, " "just as an instruction match needs to be read in terms of the bytes and data it " "checks." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:654 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Before using either kind of check as a reward, I would test it with deliberate " "failures. I would also keep final acceptance outside the candidate's editable source, " "so the model has to satisfy the check through its reconstruction. Otherwise, something" " like a byte array copied from the target could satisfy a naive score without " "recovering useful source." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:662 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "{ph0}Improving the learner and improving its oracle belong to the same research " "problem.{ph1} As the learner gets better at optimizing the feedback we give it, " "understanding that feedback becomes more important too." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:672 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "A comparison worth running" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:673 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "With those checks in place, I would start the comparison on a fixed VC7.1 task family." " First, I would establish baselines for a strong general model and a smaller one. " "Adding repository knowledge to the smaller model would show what retrieval changes. " "From there, supervised specialization and an RL-trained version would let us examine " "what training adds." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:681 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "To make those comparisons informative, each model would receive the same target " "evidence and tools. For the training-specific comparisons, I would keep the base model" " and available knowledge fixed as well. Repeated trials would help distinguish a " "reliable search strategy from a lucky candidate." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:688 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "I would then separate two starting conditions: reconstructing a function from its " "instructions, and closing the last few differences in maintained source. A specialist " "might be excellent at the second task while a general model does much of the work " "needed to reach it. Measuring them separately would reveal that division of work." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:696 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Both tasks need genuinely held-out examples. Because related Touhou games share engine" " code, holding out a game's name would still allow nearly identical functions to " "appear in training. I would instead hold out source families and keep their accepted " "answers out of both training and retrieval." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:703 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "On those examples, the outcome would be complete, independently validated matches. " "Giving each model the same candidate or compile budget would help compare search " "quality. Measuring elapsed time and total cost, including compilation, would tell us " "whether that quality produces an efficient workflow. Training costs would need their " "own accounting too." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:711 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Both views matter because a cheaper proposal can become an expensive workflow if it " "causes more uninformative compiles. Conversely, a slower model may pay for itself by " "finding a useful experiment sooner. The comparison should capture those costs." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:717 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Counting accepted results also keeps intermediate progress in perspective. One TH09 " "{ph0}replay-save candidate{ph1} looked promising because the compiled function had the" " expected size, but a full comparison still found substantial differences. Changes in " "how the compiler arranges instructions can also make a candidate look closer without " "resolving the underlying problem. Such diagnostics can guide the next experiment, but " "I would validate any reward for \"getting closer\" against the full acceptance check." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:732 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "I would be interested in the pattern across these results. If a specialist does well " "within a familiar compiler family, does that advantage survive a toolchain change? And" " once both models have good retrieval, how much does training still add? The answers " "would help us decide where each kind of model is most useful." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:741 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "What kind of agent does this suggest?" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:742 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "If the models turn out to help at different stages, a useful arrangement might be a " "broad agent with access to a specialist. Once a task becomes a familiar compiler " "search, it could ask the specialist for candidates. If the results stop making sense, " "the broader agent could return to the target evidence or investigate the measurement " "itself." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:750 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "In that arrangement, specialization becomes a tool the agent can choose as the " "investigation develops. The agent keeps the freedom to change direction that made the " "earlier breakthroughs possible." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:755 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "This follows naturally from the industrial shift I described in the previous essay. " "Being able to run many more experiments changes how we organize the work. It also " "gives us a reason to ask which decisions need broad judgment and which improve through" " repeated experience with a particular craft." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:762 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "For now, the strongest general model has earned its place in my workflow by opening " "problems I had left unresolved. Those successes are what make me want to examine the " "work more closely: how much depended on the model's breadth, and how much could be " "handled by a model trained in this particular kind of reconstruction?" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:770 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "{ph0}The repositories give us a way to test the question.{ph1} I would like to use " "that record to build the comparison and see what we learn." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:780 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Evidence and model attribution" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/reverse-engineering-models/index.html:781 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "{ph0}Detailed evidence notes{ph1} include the recorded comparisons and experiment " "context." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:788 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "The examples describe historical function-level comparisons recorded in the linked " "commits. Whole-game runtime checks are separate milestones. Source and matching " "records were reviewed on 13 October 2026." msgstr "" #. {ph0}: gpt-dots #. {ph1}: gpt-web #: website/public/blog/reverse-engineering-models/index.html:794 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "The TH09 label {ph0} identifies GPT-6-Astra. {ph1} changed with the model used at the " "time, so that label alone does not identify an individual run. Explicit model names in" " the other cited commits establish their recorded attribution; the histories do not " "contain uniform per-run cost or effort measurements." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/blog/reverse-engineering-models/index.html:803 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "{ph0}TH09 temporary lifetimes:{ph1} the {ph2}earlier context review{ph3} and " "{ph4}complete cold reconstruction{ph5}." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #. {ph6}: #. {ph7}: #: website/public/blog/reverse-engineering-models/index.html:815 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "{ph0}TH09 Front callback:{ph1} {ph2}non-exact diagnostic regions{ph3}, {ph4}Astra's " "new graph{ph5} and its {ph6}accepted recompile replay{ph7}." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #. {ph6}: #. {ph7}: #: website/public/blog/reverse-engineering-models/index.html:831 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "{ph0}Compiler knowledge:{ph1} {ph2}TH095 identifier-bucket reuse{ph3}, {ph4}TH04 " "player source and linker order{ph5} and {ph6}Luna's TH09 enemy-spawn closure{ph7}." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #. {ph6}: #. {ph7}: #: website/public/blog/reverse-engineering-models/index.html:847 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "{ph0}Checks and diagnostics:{ph1} {ph2}TH08 floating-literal audit{ph3}, {ph4}TH08 " "numerical investigation{ph5} and {ph6}TH09 replay-save reconstruction{ph7}." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:864 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "The proposed specialist and RL comparisons are future experiments. The project " "histories motivate them; no trained specialist was evaluated for this essay." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:6 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Does reverse engineering need a bigger model? | REA" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:7 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "What Touhou reconstruction taught me about general models, specialist models and " "learning to propose better hypotheses from compiler feedback." msgstr "" #: website/public/blog/reverse-engineering-models/index.html:245 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "On this page" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:258 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Models and reverse engineering essay" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:496 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Selected reconstruction experiments" msgstr "" #: website/public/blog/reverse-engineering-models/index.html:889 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Back to top" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:107 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Skip to content" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/blog/touhou-reconstruction/index.html:199 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}Home{ph1} / {ph2}Blog{ph3} / Touhou reconstruction" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:203 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Essay · Touhou reconstruction" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:204 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "The industrial revolution in reverse engineering." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:205 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "By N0zoM1z0 · 10 October 2026" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:207 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Takeaway" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:209 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "{ph0}Give agents autonomy over the investigation.{ph1} Set a clear goal and acceptance" " criteria, then let the agent decide what to try next." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:214 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "{ph0}Use the repository and Git as working memory.{ph1} Keep the reasoning with the " "code. Git checkpoints let the next session continue after the conversation ends." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:219 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "{ph0}Let evidence decide what you claim.{ph1} A confident explanation still needs " "testing. “Unknown” is a valid answer when the evidence is incomplete." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:224 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "{ph0}Test the oracle too.{ph1} Try cases it should reject. If it misses a bug, revisit" " the earlier results that depended on it." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:229 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "{ph0}We are in the early days of RE's industrial revolution.{ph1} The methods are " "still taking shape. There is plenty left to explore." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:241 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "How experience compounds" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:242 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}Human direction{ph1} · Goal and acceptance criteria" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:330 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Autonomy" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:331 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Agent" msgstr "" #. {ph0}:
#: website/public/blog/touhou-reconstruction/index.html:332 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Choose an experiment.{ph0}Propose a hypothesis." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:335 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Verification" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:336 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Oracle" msgstr "" #. {ph0}:
#: website/public/blog/touhou-reconstruction/index.html:337 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Test against a{ph0}concrete reference." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:340 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Repository" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:341 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Working memory" msgstr "" #. {ph0}:
#: website/public/blog/touhou-reconstruction/index.html:342 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Code, evidence,{ph0}checks and lessons." msgstr "" #. {ph0}:
#. {ph1}: #. {ph2}: #: website/public/blog/touhou-reconstruction/index.html:344 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Mismatch{ph0}{ph1}Revise the hypothesis{ph2}" msgstr "" #. {ph0}:
#. {ph1}: #. {ph2}: #: website/public/blog/touhou-reconstruction/index.html:347 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "A better{ph0}{ph1}starting point{ph2}" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:350 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Reuse" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:351 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}Pass{ph1} · Keep the result and its evidence" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:363 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "Each project leaves the next with a better starting point. That includes fixing the " "checks when we discover a gap." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:370 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "In this article" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:372 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}August 2026{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:373 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}TH08: the continuation{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:374 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}Two approaches{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:375 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}TH095: compounding{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:376 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}TH04: across architectures{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:377 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}From exact to readable{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:380 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}The industrial shift{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:381 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}What becomes possible{ph1}" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:386 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "What changed in August 2026" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:387 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "Before this work, I had done a lot of manual reverse engineering. I would inspect a " "function until I had an explanation, then test that explanation against the program. " "Getting further meant spending more of my own time on the next function. It also meant" " keeping an increasingly large picture in my head." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:394 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "Most of my RE work is on games. I reconstruct them so their behavior can be understood" " and eventually carried into a port or a mod. That is the experience behind this " "article. The method can be useful elsewhere, but each field needs to establish what it" " can check against a reliable reference." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:401 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "In August 2026, I started exploring agent-driven RE seriously. I wanted to see how far" " an agent could get with access to the program and ordinary development tools. Touhou " "reconstruction gave me a substantial project in which to find out." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:407 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The early progress was startling. An investigation could keep moving without me " "choosing every individual step. A failed comparison might send the agent to another " "caller. It could write a small diagnostic and use the result to decide what to try " "next. Giving it that freedom made a difference: I could spend more attention on the " "project's direction and on whether its checks were trustworthy." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:416 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The pace got my attention first. Then I began wondering what would survive beyond the " "current project. Would the next game benefit from everything we had just learned?" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:423 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "TH08: building on human work" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/blog/touhou-reconstruction/index.html:424 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "{ph0}TH08{ph1}, Imperishable Night, began as a continuation of {ph2}GensokyoClub's " "reconstruction{ph3}. Their public source gave me a substantial foundation. It came " "with knowledge of the build and a history of contributions that I preserved in the " "continuation." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:433 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The imported history ends at the public 10 August checkpoint. My independent " "continuation began on 13 August. By 19 August, the ledger recorded source for all " "1,107 identified game functions." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:438 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "A playable Linux reconstruction port was committed on 24 August, roughly eleven days " "after the continuation began. A Web edition followed. The native Linux 64-bit release " "arrived on 30 August." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:443 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "What struck me was that the work had reached a program people could run. Getting there" " required following problems beyond an individual function. Even when two functions " "looked correct in isolation, they could accidentally use separate copies of state that" " should have been shared." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:450 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "This made reference checks central to the work. I call them {ph0}oracles{ph1}. A code " "comparison can tell us whether a reconstructed function reproduces the original " "instructions. A runtime check can tell us whether an exercised route reaches the " "expected state. The agent proposes an explanation and tests it; a mismatch gives it " "something specific to investigate." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:458 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "An exact match with the wrong constant" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:459 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "An oracle is software someone wrote. TH08 gave me a clear reminder of how much can " "depend on that software." msgstr "" #. {ph0}: 0.0 #. {ph1}: 128.0 #: website/public/blog/touhou-reconstruction/index.html:463 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "In September, a bug reported by a downstream Switch port led back to item auto-" "collection. The reconstructed source checked player power against {ph0}. The original " "used {ph1}, the maximum-power threshold." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:469 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "Normal power is non-negative, so the reconstructed power check was effectively always " "satisfied. Above the collection line, the game could attract items without requiring " "maximum power. The other exceptions in the condition were correct. This one constant " "changed the behavior." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:476 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}Yet the function had already passed the exact comparison.{ph1}" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:482 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "A rebuild can put a constant at a different address. The comparison tool accounted for" " that by adjusting addresses in the compiled instructions before comparing them with " "the original. But it never checked the floating-point value stored at the referenced " "address." msgstr "" #. {ph0}: 128.0 #. {ph1}: 0.0 #: website/public/blog/touhou-reconstruction/index.html:489 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "That left a hole in the check. It could point the reconstructed instruction at the " "original's {ph0} while the source still said {ph1}. The instruction bytes matched. The" " source meant something different." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/blog/touhou-reconstruction/index.html:495 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The {ph0}2 September fix{ph1} corrected the source and made the comparison check the " "referenced constant's actual bytes. A {ph2}wider audit{ph3} then examined 1,548 " "floating-literal references. It found another twelve incorrect references across five " "accepted functions." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:506 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The comparison now checks every such floating literal. Its tests include deliberately " "wrong values to make sure they are rejected. We also had to revisit results that had " "passed the weaker check." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:511 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "{ph0}The oracle needed reconstructing too.{ph1} Repairing it was part of repairing the" " game." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:515 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "That matters when the team is mostly one person working with agents. I cannot " "personally inspect every line they produce, so much of my confidence rests on their " "checks. A shared oracle's blind spot can affect many investigations before I notice " "it. I have to understand what the checker actually verifies and test it against cases " "that ought to fail." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:523 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "As the work continued, those checks became part of the repository. So did the reasons " "for source changes and notes that let a later session pick up where an earlier one " "stopped. {ph0}The repository was becoming the project's working memory.{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:532 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "{ph0}A successful batch gave us both recovered code and a better environment for the " "next batch.{ph1}" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:540 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Two different ideas of reconstruction" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:541 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "GensokyoClub's {ph0}public README{ph1} makes its disagreement with this kind of work " "explicit. The notice announces that further development will happen privately until " "completion. One passage reads:" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:552 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The rise of grifters (AI decompilations and ports) in this space taking from our work " "paints a bad image for future decompilation efforts…" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:558 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The notice also describes the psychological toll on the maintainers. Their " "contribution policy excludes pull requests produced primarily with AI. They have put " "their free time into difficult work, and that work helped make my continuation " "possible. I respect the effort behind it. The disagreement I want to discuss is about " "how reconstruction should proceed and how a contribution should be judged." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:567 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "In the manual workflow I knew, developing an understanding of a function and " "reconstructing it usually fell to the same person. A project relied heavily on that " "person's expertise. Trust in the contributor mattered because so much of the reasoning" " happened while they worked." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:574 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "Existing projects already preserve knowledge in their source and build tools. What " "changed for me was that an agent could use that knowledge to pursue the next " "investigation on its own." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:579 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "In my continuation, I decide the objective and the standard for accepting a result. " "The agent has broad freedom to investigate. Its proposed reconstruction then has to " "survive the relevant checks. I want another person to be able to examine why we chose " "an implementation, even if an agent did most of the work." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:586 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "This can be a difficult transition. Years of careful work may become the foundation " "for a continuation that moves much faster. That raises real questions about credit. It" " also changes what maintainers need to know before accepting a contribution." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:592 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The industrial analogy helps me think about this. In a craft, much of the process " "depends on the skill of the person carrying it out. Machinery changes where that skill" " is needed. Someone still has to design the process and recognize when its output is " "wrong. Different communities can choose how much of that change they want to take on." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:600 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "My choice is to continue openly, with the inherited work credited and its history " "preserved. I want the new work to be reviewable. That gives us a way to ask how far " "this approach can go and to learn from what goes wrong along the way." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/blog/touhou-reconstruction/index.html:606 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "Source: GensokyoClub's {ph0}README notice{ph1}, checked on 10 October 2026, and its " "{ph2}contribution policy{ph3}. The quotation is a shortened excerpt. TH08's " "{ph4}credits and provenance{ph5} record the continuation boundary." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:624 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "TH095: experience starts compounding" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:625 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "{ph0}TH095{ph1}, Shoot the Bullet, made the value of that experience much easier to " "see. Its repository began on 29 August with zero confirmed game functions in the " "ledger. We still had to learn the game. But we already knew much more about how to " "begin a reconstruction and how to keep it moving." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:633 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "By 7 September, all 697 identified game functions had source. By 8 September, 696 had " "been accepted as exact comparisons. The whole program linked on 9 September. The " "Windows i386 reconstruction was marked playable on 10 September, about twelve days " "after initialization." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:640 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "I found this more exciting than the first project's speed. A fresh target could " "benefit from work done on another game. The experience was already present in the " "tools and in the way the project was organized." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:646 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "For example, TH08 had taught us to pay attention to the assembled program early. If " "several recovered functions depend on the same state, their isolated comparisons leave" " an important question open. We need to see them working together. That lesson helped " "shape how we approached TH095's whole-program build." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:653 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "A lesson that stays in my head is useful while I am there. Once it becomes a check " "that another session can run, it can keep helping after I have moved on. The next " "agent can use the result without repeating the investigation that led to it." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:659 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The floating-literal bug belongs in that memory too. It explains why checking a " "reference also requires checking the data behind it. Keeping that correction with the " "code helps later projects avoid inheriting the old check's blind spot." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:665 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "{ph0}The method becomes part of the starting material for the next game.{ph1} We can " "spend more of the next project's effort on what is actually new about its target." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:673 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The same benefit is available to people joining later. They can inspect a decision and" " rerun its check before continuing the work. They do not have to reconstruct the " "entire project's history to find out why the source looks the way it does." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:681 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "TH04: the workflow survives a different architecture" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/blog/touhou-reconstruction/index.html:682 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "{ph0}TH04{ph1}, Lotus Land Story, took this work into the PC-98 DOS era. The target " "was now a 16-bit environment with four cooperating programs. Understanding its " "hardware behavior required different evidence from the Windows games. Existing " "{ph2}ReC98 work{ph3} gave us valuable knowledge and source material here too." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:691 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The DOS reconstruction is now working. In my manual testing, I played complete Normal " "routes through their endings and checked saves. The current work is a native 64-bit " "port. Establishing a working DOS version first gives that port a reference." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:697 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The architecture changed what we needed to investigate. It also changed the compiler " "and runtime against which we checked our work. But the agent could still follow a " "question through to a result and let that result guide the next experiment." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:703 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "Consider the transition from gameplay to an ending. We need to know what state carries" " across that boundary and which program is responsible for it. That is something we " "can investigate against the DOS product. Once the evidence and checks are available, " "an agent can work through the question much as it did on a Windows title." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:711 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "This is why TH04 matters to the argument. A substantial platform change did not force " "us to start over with a new way of working. The architecture defined the problem; the " "workflow still gave us a way to solve it." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:717 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "For the 64-bit port, we can now examine the new implementation against behavior " "already recovered on DOS. The knowledge from reconstruction gives the port something " "to build on." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/blog/touhou-reconstruction/index.html:722 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "Project state as of 10 October 2026: {ph0}DOS reconstruction and manual testing{ph1} ·" " {ph2}64-bit port{ph3}. The port remains in development." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:735 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "From exact code to readable code" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:736 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Once a reconstruction works, I want someone else to be able to understand it." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:740 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "To me, assembly and raw offsets can feel like old friends. I realise this is a " "slightly unusual definition of “readable.” Most people would prefer to follow the " "game's logic without keeping the executable's memory layout in their head." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:746 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "That is where {ph0}semantic reconstruction{ph1} comes in. A recovered field may still " "be known mainly by its offset. We follow how the game uses it until we can explain its" " role. Then we can give it a meaningful name and a type that fits the evidence. We " "keep the reasoning with the source so the next person can see where that " "interpretation came from." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:754 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "This becomes especially important for a port. An absolute address tells me where " "something lived in the old executable. It gives a 64-bit implementation little help in" " deciding which object should own that state. To move the behavior safely, we need to " "recover the relationship behind the old memory access." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:761 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "The order I now use is:" msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:763 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "{ph0}Recover an exact baseline.{ph1} Compile the reconstructed pieces with the " "historical compiler. Compare the relevant code and data with the original executable. " "Record unresolved differences so the next phase has a clear starting point." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:770 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "{ph0}Build and play it on the original platform.{ph1} Link those pieces into the real " "program using the original architecture and compiler. Exercise important gameplay " "paths. This is where we can find problems with shared state or initialization that an " "isolated function comparison missed." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:777 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "{ph0}Reconstruct the semantics against both references.{ph1} Take one coherent part of" " the game at a time and establish what its recovered source means. Improve its " "representation while preserving the exact comparisons and the playable historical " "build." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:786 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "{ph0}Make the modern port.{ph1} Move the established behavior into the new " "environment, such as a native 64-bit build. The reconstructed original-platform game " "remains a reference for comparing how the port behaves." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:793 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The playable build from the second stage becomes a {ph0}second oracle{ph1} during the " "third. The first oracle checks whether our changed source still reproduces the " "relevant original code and data. The second checks that the reconstructed program " "still builds and behaves correctly along the paths we exercise." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:801 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "They catch different mistakes. A type change can alter the generated instructions. An " "ownership change can leave two parts of the game using different copies of state. " "Keeping both checks available gives the agent a concrete failure to investigate before" " carrying a refactor further." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:808 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "A name needs evidence of its own. An exact comparison cannot tell us whether a field " "really means “invulnerability time.” We have to establish that from how the game " "writes and uses it. If the meaning remains uncertain, a neutral name is more helpful " "to the next reader than a confident guess." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:815 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "We learned this order through the projects. TH08 already had playable ports before " "some of its later historical-platform audits. That made certain defects harder to see." " The {ph0}Factory's current workflow{ph1} puts the original-platform build first, so " "semantic work can use it as a reference before porting begins." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:826 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "{ph0}Exact reconstruction gives us a reference. Semantic reconstruction makes the " "recovered knowledge usable.{ph1} A port can then build on both." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:835 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "What makes this an industrial shift" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:836 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "These projects changed where I spent my attention. Once agents could carry much of an " "investigation forward, improving their working environment became one of the most " "useful things I could do. A better tool could help with every later function that " "needed it." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:843 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "Autonomy matters here. The useful next step often becomes clear only after a failed " "experiment. An agent needs enough freedom to follow that result somewhere unexpected. " "If it has to wait for me to prescribe each step, much of the work remains tied to my " "attention." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:850 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "I expect the agent to make wrong hypotheses. What matters is whether we can test them " "and learn from the result. A failed check should help it understand the mistake well " "enough to try again. I still have to decide whether the accumulated evidence supports " "a project milestone." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:857 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "REA gives the agent access to analysis tools. A question about a function's caller can" " lead straight into inspecting that caller. The reconstruction project supplies the " "compiler and its own reference checks. The agent can use those to test the source it " "proposes and see where its explanation holds up." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:864 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The TH08 bug shows why those checks deserve engineering attention of their own. When " "the same comparison is used across hundreds of functions, a gap in it can spread much " "further than a mistake in one implementation. Testing the checker improves the " "feedback available to all that later work." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:871 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The industrial analogy has a useful historical example here. Boulton and Watt " "introduced a {ph0}steam-engine indicator in 1796{ph1} to help adjust engine valves. A " "recording version traced pressure through the piston stroke. It made the engine's " "internal behavior available for inspection. Our comparison tools serve a similar " "purpose: they let us examine what the machinery is doing while we improve it." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:884 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "{ph0}We are in the early stages of this industrial shift.{ph1} Much of the " "infrastructure is still immature. Agents can move faster than our checks were designed" " to support, so the process has to develop alongside them. When we find a defect in a " "shared tool, we have to repair it and revisit the results it affected. The next " "project can then inherit a stronger tool." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:894 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "There is also a practical limit to any one conversation. It will end before a large " "reconstruction is finished. The repository has to make it possible for another session" " to continue without losing the reason for the last decision." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:900 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The {ph0}Touhou Reconstruction Factory{ph1} grew out of that need. It gives projects a" " shared way to carry their checks and lessons forward. Work on one game can improve " "the starting conditions for another." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:910 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "That is what makes the industrial analogy meaningful to me. Experience starts becoming" " part of tools that others can use. Improving those tools changes how much the next " "person—or the next agent—can get done." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:918 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "The projects we can now consider" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:919 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The pace matters because it changes the decision to begin. A game could be fascinating" " to reverse engineer and still demand more of my own attention than I could " "realistically give it. Many projects would stay ideas." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:925 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "Now I can see a way to keep such a project moving through repeated investigations. " "Getting a working reconstruction makes a port more practical. Recovering readable " "semantics makes it easier for someone else to explore a mod. The effort put into " "understanding the game can keep paying off after the first version runs." msgstr "" #. {ph0}: #. {ph1}: #: website/public/blog/touhou-reconstruction/index.html:932 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "I now look at an unfamiliar program and ask: {ph0}what access, feedback and " "accumulated knowledge would let an agent work on this reliably?{ph1}" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:939 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "That question makes me consider projects I would previously have left alone. Each one " "can improve the way we approach the next. I want to keep exploring how far that can " "take us." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:947 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Project milestones and sources" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:948 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The dates describe recorded project checkpoints, checked against public GitHub history" " on 10 October 2026. Elapsed time is calendar time between commits. Source presence, " "exact comparisons, a build and a runtime result each name a different milestone." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #. {ph6}: #. {ph7}: #. {ph8}: #. {ph9}: #. {ph10}: #. {ph11}: #: website/public/blog/touhou-reconstruction/index.html:956 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "{ph0}TH08:{ph1} {ph2}13 August continuation{ph3}, {ph4}19 August source ledger{ph5}, " "{ph6}24 August Linux port{ph7}, {ph8}26 August Web edition{ph9}, and {ph10}30 August " "64-bit Linux release{ph11}." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #. {ph6}: #. {ph7}: #. {ph8}: #. {ph9}: #. {ph10}: #. {ph11}: #: website/public/blog/touhou-reconstruction/index.html:979 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "{ph0}TH095:{ph1} {ph2}29 August initial ledger{ph3}, {ph4}7 September source " "ledger{ph5}, {ph6}8 September comparisons{ph7}, {ph8}9 September linkage{ph9}, and " "{ph10}10 September playable-build record{ph11}." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/blog/touhou-reconstruction/index.html:1002 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "{ph0}TH04:{ph1} {ph2}10 October handoff{ph3} records the working DOS reconstruction, " "the maintainer's complete Normal-route testing and the current 64-bit phase." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #. {ph6}: #. {ph7}: #: website/public/blog/touhou-reconstruction/index.html:1011 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "{ph0}TH08 oracle correction:{ph1} {ph2}the reported auto-collection bug{ph3}, {ph4}the" " source and comparison fix{ph5}, and {ph6}the full floating-literal audit{ph7}." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/blog/touhou-reconstruction/index.html:1025 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "{ph0}Semantic reconstruction:{ph1} {ph2}TH08's readability playbook{ph3} and {ph4}the " "Factory's phase order and two validation paths{ph5}." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/blog/touhou-reconstruction/index.html:1037 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "{ph0}Industrial history:{ph1} {ph2}the Science Museum Group's steam-engine indicator " "record{ph3} describes the 1796 introduction and the pressure-recording mechanism." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/blog/touhou-reconstruction/index.html:1046 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "{ph0}Method:{ph1} the Factory's {ph2}agent autonomy{ph3} and {ph4}cross-game " "knowledge{ph5} documents retain the working principles and lessons." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/blog/touhou-reconstruction/index.html:1061 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}More articles{ph1} · {ph2}Explore a TH04 investigation{ph3}" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:6 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Reverse Engineering’s Industrial Revolution — REA" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:7 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "N0zoM1z0 reflects on manual reverse engineering, Touhou reconstruction with AI agents," " and how knowledge compounds across TH08, TH095 and PC-98 TH04." msgstr "" #: website/public/blog/touhou-reconstruction/index.html:355 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Experience carried between projects" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:369 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "On this page" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:384 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Touhou reconstruction essay" msgstr "" #: website/public/blog/touhou-reconstruction/index.html:1086 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Back to top" msgstr "" #: website/public/contributors/index.html:108 msgctxt "page:contributors/index.html" msgid "Skip to content" msgstr "" #. {ph0}: #. {ph1}: #: website/public/contributors/index.html:200 #, python-brace-format msgctxt "page:contributors/index.html" msgid "{ph0}Home{ph1} / Contributors" msgstr "" #: website/public/contributors/index.html:201 msgctxt "page:contributors/index.html" msgid "Built together." msgstr "" #: website/public/contributors/index.html:202 msgctxt "page:contributors/index.html" msgid "Thank you to everyone who helps make REA better." msgstr "" #: website/public/contributors/index.html:203 msgctxt "page:contributors/index.html" msgid "" "Code, documentation, tests, translations and ideas — there are many ways to " "contribute." msgstr "" #: website/public/contributors/index.html:208 msgctxt "page:contributors/index.html" msgid "How to contribute" msgstr "" #: website/public/contributors/index.html:213 msgctxt "page:contributors/index.html" msgid "Join the conversation →" msgstr "" #: website/public/contributors/index.html:223 msgctxt "page:contributors/index.html" msgid "Contributors" msgstr "" #: website/public/contributors/index.html:225 msgctxt "page:contributors/index.html" msgid "Find a contributor" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #: website/public/contributors/index.html:1112 #, python-brace-format msgctxt "page:contributors/index.html" msgid "From {ph0}GitHub’s contributor list{ph1} · Updated {ph2}." msgstr "" #: website/public/contributors/index.html:1117 msgctxt "page:contributors/index.html" msgid "No matching contributors. Try another username." msgstr "" #: website/public/contributors/index.html:6 msgctxt "page:contributors/index.html" msgid "Contributors · REA" msgstr "" #: website/public/contributors/index.html:7 msgctxt "page:contributors/index.html" msgid "Meet the people who contribute code, documentation, tests and ideas to REA." msgstr "" #: website/public/contributors/index.html:226 msgctxt "page:contributors/index.html" msgid "GitHub username" msgstr "" #: website/public/contributors/index.html:1137 msgctxt "page:contributors/index.html" msgid "Back to top" msgstr "" #: website/public/examples/dino-lab/index.html:108 msgctxt "page:examples/dino-lab/index.html" msgid "Skip to content" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/examples/dino-lab/index.html:200 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "{ph0}Home{ph1}{ph2}/{ph3}Dinosaur speed lab" msgstr "" #: website/public/examples/dino-lab/index.html:203 msgctxt "page:examples/dino-lab/index.html" msgid "Inspect → rebuild → change" msgstr "" #: website/public/examples/dino-lab/index.html:204 msgctxt "page:examples/dino-lab/index.html" msgid "Rebuild the dinosaur’s speed rule." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/examples/dino-lab/index.html:205 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "" "To recreate the game’s acceleration, first find the rule that controls its speed. " "{ph0}REA returned the running script;{ph1} we used its rule to build this mini-game " "with {ph2}adjustable speed.{ph3}" msgstr "" #: website/public/examples/dino-lab/index.html:214 #: website/public/examples/dino-lab/index.html:213 msgctxt "page:examples/dino-lab/index.html" msgid "On this page" msgstr "" #. {ph0}: #. {ph1}: #: website/public/examples/dino-lab/index.html:216 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "{ph0}Play and change the speed{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/examples/dino-lab/index.html:217 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "{ph0}Read the recovered rule{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/examples/dino-lab/index.html:218 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "{ph0}Check the reconstruction{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/examples/dino-lab/index.html:219 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "{ph0}Try the analysis{ph1}" msgstr "" #: website/public/examples/dino-lab/index.html:224 msgctxt "page:examples/dino-lab/index.html" msgid "Play and change the speed" msgstr "" #: website/public/examples/dino-lab/index.html:225 msgctxt "page:examples/dino-lab/index.html" msgid "" "Press Play, then jump over the cactus. Move the speed slider to try a slower or faster" " game; it switches to a fixed speed. Select the recovered rule to start at 6 and " "gradually accelerate again." msgstr "" #: website/public/examples/dino-lab/index.html:231 msgctxt "page:examples/dino-lab/index.html" msgid "Play the reconstruction" msgstr "" #: website/public/examples/dino-lab/index.html:263 msgctxt "page:examples/dino-lab/index.html" msgid "Play" msgstr "" #: website/public/examples/dino-lab/index.html:266 msgctxt "page:examples/dino-lab/index.html" msgid "Jump ↑" msgstr "" #: website/public/examples/dino-lab/index.html:267 msgctxt "page:examples/dino-lab/index.html" msgid "Restart" msgstr "" #: website/public/examples/dino-lab/index.html:270 msgctxt "page:examples/dino-lab/index.html" msgid "Speed" msgstr "" #: website/public/examples/dino-lab/index.html:280 msgctxt "page:examples/dino-lab/index.html" msgid "Use the recovered acceleration rule" msgstr "" #: website/public/examples/dino-lab/index.html:284 msgctxt "page:examples/dino-lab/index.html" msgid "Original rule: start at 6, then increase toward 13." msgstr "" #: website/public/examples/dino-lab/index.html:287 msgctxt "page:examples/dino-lab/index.html" msgid "Move the slider to set your own speed. Space or Jump clears a cactus." msgstr "" #: website/public/examples/dino-lab/index.html:292 msgctxt "page:examples/dino-lab/index.html" msgid "" "Enable JavaScript to play the reconstruction. The code and explanation above remain " "readable." msgstr "" #: website/public/examples/dino-lab/index.html:300 msgctxt "page:examples/dino-lab/index.html" msgid "Read the script REA returned" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: index.js #: website/public/examples/dino-lab/index.html:301 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "" "We inspected {ph0}wayou’s Chromium-derived browser edition{ph1} with REA. It returned " "the loaded {ph2}, including this branch in the game’s update function:" msgstr "" #: website/public/examples/dino-lab/index.html:311 msgctxt "page:examples/dino-lab/index.html" msgid "REA · selected script source" msgstr "" #. {ph0}: SPEED: 6 #. {ph1}: ACCELERATION: 0.001 #. {ph2}: MAX_SPEED: 13 #: website/public/examples/dino-lab/index.html:317 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "" "The settings are {ph0}, {ph1} and {ph2}. The game runs this branch on an update " "without a collision." msgstr "" #: website/public/examples/dino-lab/index.html:322 msgctxt "page:examples/dino-lab/index.html" msgid "Use the same rule in the new game" msgstr "" #. {ph0}: dino-speed.js #: website/public/examples/dino-lab/index.html:325 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "Reconstruction · {ph0}" msgstr "" #: website/public/examples/dino-lab/index.html:328 #: website/public/examples/dino-lab/index.html:427 msgctxt "page:examples/dino-lab/index.html" msgid "Copy" msgstr "" #: website/public/examples/dino-lab/index.html:341 msgctxt "page:examples/dino-lab/index.html" msgid "" "The mini-game uses this function for automatic acceleration. Moving the slider " "supplies a fixed speed instead. Drawing, jump physics and rectangle collision checks " "are new code for this teaching game; its simulation advances at 60 updates per second." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/examples/dino-lab/index.html:347 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "{ph0}Download the speed rule{ph1} · {ph2}Read the game code{ph3}" msgstr "" #: website/public/examples/dino-lab/index.html:355 msgctxt "page:examples/dino-lab/index.html" msgid "Check the reconstruction" msgstr "" #: website/public/examples/dino-lab/index.html:356 msgctxt "page:examples/dino-lab/index.html" msgid "" "We called the original game’s update function with obstacles and automatic scheduling " "disabled. Compare those recorded speeds with a replay of the recovered rule." msgstr "" #: website/public/examples/dino-lab/index.html:365 msgctxt "page:examples/dino-lab/index.html" msgid "Updates" msgstr "" #: website/public/examples/dino-lab/index.html:366 msgctxt "page:examples/dino-lab/index.html" msgid "Original game" msgstr "" #: website/public/examples/dino-lab/index.html:367 msgctxt "page:examples/dino-lab/index.html" msgid "Reconstructed rule" msgstr "" #: website/public/examples/dino-lab/index.html:394 msgctxt "page:examples/dino-lab/index.html" msgid "Run the speed check" msgstr "" #: website/public/examples/dino-lab/index.html:397 msgctxt "page:examples/dino-lab/index.html" msgid "" "Values rounded to three decimals. The branch checks before adding, so the final " "increment can take speed just above 13." msgstr "" #: website/public/examples/dino-lab/index.html:403 msgctxt "page:examples/dino-lab/index.html" msgid "Try the analysis yourself" msgstr "" #. {ph0}: #. {ph1}: #: website/public/examples/dino-lab/index.html:405 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "{ph0}Set up REA{ph1} with your coding agent." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: https://wayou.github.io/t-rex-runner/ #: website/public/examples/dino-lab/index.html:409 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "Follow the {ph0}browser connection steps{ph1}, using {ph2} as the page URL." msgstr "" #: website/public/examples/dino-lab/index.html:416 msgctxt "page:examples/dino-lab/index.html" msgid "" "Give your agent the page URL and local debugging endpoint, then copy this prompt." msgstr "" #. {ph0}: #: website/public/examples/dino-lab/index.html:423 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" msgstr "" #. {ph0}: #. {ph2}: #. {ph3}: #. {ph4}: #: website/public/examples/dino-lab/index.html:436 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "" "{ph0}›{ph1}{ph2}Use REA to inspect this dinosaur game. Why does it get faster? Show " "the speed rule, then build a small version with an adjustable speed.{ph3}{ph4}{ph5}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/examples/dino-lab/index.html:445 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "" "Ask a follow-up: {ph0}“Where is jump height calculated? Add a jump-height control to " "the new version.”{ph1}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/examples/dino-lab/index.html:452 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "" "Source: {ph0}inspected speed code{ph1}, Chromium Authors. {ph2}Copyright and BSD " "license{ph3}. REA 4.1.0 inspected the running HTTP edition in Chrome 150." msgstr "" #: website/public/examples/dino-lab/index.html:6 msgctxt "page:examples/dino-lab/index.html" msgid "Chrome Dinosaur Game: Rebuild Its Speed Rule — REA" msgstr "" #: website/public/examples/dino-lab/index.html:7 msgctxt "page:examples/dino-lab/index.html" msgid "" "Read the dinosaur game’s speed rule with REA, rebuild it, then change the speed and " "play." msgstr "" #: website/public/examples/dino-lab/index.html:222 msgctxt "page:examples/dino-lab/index.html" msgid "Dinosaur speed reconstruction" msgstr "" #: website/public/examples/dino-lab/index.html:253 msgctxt "page:examples/dino-lab/index.html" msgid "" "Dinosaur mini-game. Use the Jump button or press Space while the game is focused." msgstr "" #: website/public/examples/dino-lab/index.html:328 msgctxt "page:examples/dino-lab/index.html" msgid "Copy reconstructed speed rule" msgstr "" #: website/public/examples/dino-lab/index.html:427 msgctxt "page:examples/dino-lab/index.html" msgid "Copy dinosaur analysis prompt" msgstr "" #: website/public/examples/dino-lab/index.html:481 msgctxt "page:examples/dino-lab/index.html" msgid "Back to top" msgstr "" #: website/public/faq/index.html:107 msgctxt "page:faq/index.html" msgid "Skip to content" msgstr "" #. {ph0}: #. {ph1}: #: website/public/faq/index.html:199 #, python-brace-format msgctxt "page:faq/index.html" msgid "{ph0}Home{ph1} / FAQ" msgstr "" #: website/public/faq/index.html:200 msgctxt "page:faq/index.html" msgid "REA FAQ." msgstr "" #: website/public/faq/index.html:201 msgctxt "page:faq/index.html" msgid "Setup, updates, analysis and troubleshooting." msgstr "" #: website/public/faq/index.html:205 msgctxt "page:faq/index.html" msgid "Topics" msgstr "" #. {ph0}: #. {ph1}: #: website/public/faq/index.html:207 #, python-brace-format msgctxt "page:faq/index.html" msgid "{ph0}Setup and updates{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/faq/index.html:208 #, python-brace-format msgctxt "page:faq/index.html" msgid "{ph0}Analysis{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/faq/index.html:209 #, python-brace-format msgctxt "page:faq/index.html" msgid "{ph0}Troubleshooting{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/faq/index.html:210 #, python-brace-format msgctxt "page:faq/index.html" msgid "{ph0}Data and sharing{ph1}" msgstr "" #: website/public/faq/index.html:219 msgctxt "page:faq/index.html" msgid "Setup and updates" msgstr "" #: website/public/faq/index.html:222 msgctxt "page:faq/index.html" msgid "How do I install REA?" msgstr "" #. {ph0}: Node.js #: website/public/faq/index.html:223 #, python-brace-format msgctxt "page:faq/index.html" msgid "" "With {ph0} and npm available, run setup, choose your coding agent and review the " "proposed changes." msgstr "" #: website/public/faq/index.html:230 msgctxt "page:faq/index.html" msgid "Terminal · agent setup" msgstr "" #: website/public/faq/index.html:231 website/public/faq/index.html:272 #: website/public/faq/index.html:290 website/public/faq/index.html:374 #: website/public/faq/index.html:421 website/public/faq/index.html:461 #: website/public/faq/index.html:481 msgctxt "page:faq/index.html" msgid "Copy" msgstr "" #. {ph0}: #. {ph1}: #: website/public/faq/index.html:242 #, python-brace-format msgctxt "page:faq/index.html" msgid "" "Setup registers REA's MCP connection and installs the matching investigation skill. " "Restart your agent when it finishes, then give it a target path and a question. " "{ph0}Follow the setup guide{ph1} for prerequisites and your first analysis." msgstr "" #: website/public/faq/index.html:251 msgctxt "page:faq/index.html" msgid "Which coding agents can use REA?" msgstr "" #: website/public/faq/index.html:252 msgctxt "page:faq/index.html" msgid "" "Any agent that supports local MCP servers. Setup includes Claude Code, Claude Desktop," " Codex, Cursor, Gemini CLI, Windsurf, Devin, OpenCode, Antigravity, GitHub Copilot " "CLI, Command Code, Grok Build, OMP, and VS Code. Grok Bot's connector is added from " "its chat." msgstr "" #. {ph0}: #. {ph1}: #: website/public/faq/index.html:259 #, python-brace-format msgctxt "page:faq/index.html" msgid "{ph0}Connect your coding agent{ph1}." msgstr "" #: website/public/faq/index.html:264 msgctxt "page:faq/index.html" msgid "How do I update REA?" msgstr "" #: website/public/faq/index.html:265 msgctxt "page:faq/index.html" msgid "REA releases frequently, including bug fixes. If you installed the CLI with npm:" msgstr "" #: website/public/faq/index.html:271 msgctxt "page:faq/index.html" msgid "Terminal · installed CLI" msgstr "" #. {ph0}: npx #: website/public/faq/index.html:283 #, python-brace-format msgctxt "page:faq/index.html" msgid "" "Follow the setup refresh command printed by the update. If you set up your agent " "through {ph0}, run:" msgstr "" #: website/public/faq/index.html:289 msgctxt "page:faq/index.html" msgid "Terminal · refresh agent setup" msgstr "" #. {ph0}: npx -y rea-agents@latest #: website/public/faq/index.html:301 #, python-brace-format msgctxt "page:faq/index.html" msgid "" "Review the changes and restart your agent. Its REA connection pins a package version, " "so refreshing setup makes it use the new release. For one-off CLI commands, use {ph0} " "followed by the command." msgstr "" #: website/public/faq/index.html:309 msgctxt "page:faq/index.html" msgid "Is installing the skill from skills.sh enough?" msgstr "" #. {ph0}: #. {ph1}: #: website/public/faq/index.html:312 #, python-brace-format msgctxt "page:faq/index.html" msgid "" "The skill gives your agent investigation instructions. Run {ph0}REA setup{ph1} to " "connect the MCP server and install the matching skill, then restart your agent so it " "can call the tools." msgstr "" #: website/public/faq/index.html:323 msgctxt "page:faq/index.html" msgid "Analysis" msgstr "" #: website/public/faq/index.html:326 msgctxt "page:faq/index.html" msgid "What can I analyze with REA?" msgstr "" #: website/public/faq/index.html:327 msgctxt "page:faq/index.html" msgid "Start with the kind of software you have:" msgstr "" #. {ph0}: #. {ph1}: #: website/public/faq/index.html:329 #, python-brace-format msgctxt "page:faq/index.html" msgid "" "{ph0}Native executables and libraries{ph1}: functions, assembly, pseudocode and " "references." msgstr "" #. {ph0}: #. {ph1}: #: website/public/faq/index.html:334 #, python-brace-format msgctxt "page:faq/index.html" msgid "" "{ph0}JavaScript and Electron apps{ph1}: modules, imports, IPC and source locations." msgstr "" #. {ph0}: #. {ph1}: #: website/public/faq/index.html:339 #, python-brace-format msgctxt "page:faq/index.html" msgid "{ph0}Browser pages{ph1}: scripts, requests and runtime observations." msgstr "" #. {ph0}: #. {ph1}: #: website/public/faq/index.html:344 #, python-brace-format msgctxt "page:faq/index.html" msgid "" "REA also has workflows for managed assemblies, Android APKs, firmware and packaged " "resources. {ph0}See the case studies{ph1} for worked investigations." msgstr "" #: website/public/faq/index.html:352 msgctxt "page:faq/index.html" msgid "Do I need Hopper, Ghidra or IDA?" msgstr "" #: website/public/faq/index.html:353 msgctxt "page:faq/index.html" msgid "" "Deep native analysis uses one of them. Static JavaScript and .NET inspection work with" " the supplied files and do not need a native analysis engine." msgstr "" #. {ph0}: #. {ph1}: #: website/public/faq/index.html:358 #, python-brace-format msgctxt "page:faq/index.html" msgid "" "Connect your existing Ghidra or IDA installation, or let setup detect Hopper and " "propose an installation. Your host and target determine which provider can be used. " "{ph0}Set up native analysis{ph1}." msgstr "" #: website/public/faq/index.html:366 msgctxt "page:faq/index.html" msgid "Can I use REA without a coding agent?" msgstr "" #: website/public/faq/index.html:367 msgctxt "page:faq/index.html" msgid "" "Yes. The CLI uses the same analysis workflows. For a local JavaScript or Electron app:" msgstr "" #: website/public/faq/index.html:373 msgctxt "page:faq/index.html" msgid "Terminal · static application analysis" msgstr "" #. {ph0}: #. {ph1}: #: website/public/faq/index.html:386 #, python-brace-format msgctxt "page:faq/index.html" msgid "" "Replace the path with an extracted application folder or ASAR file. {ph0}Use the " "CLI{ph1} for installation options." msgstr "" #: website/public/faq/index.html:393 msgctxt "page:faq/index.html" msgid "What code does REA return?" msgstr "" #: website/public/faq/index.html:394 msgctxt "page:faq/index.html" msgid "" "Native analysis returns assembly and pseudocode, with calls, references and relevant " "constants. JavaScript analysis returns modules, their relationships and source " "locations." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/faq/index.html:399 #, python-brace-format msgctxt "page:faq/index.html" msgid "" "Your agent uses these findings to explain the behavior or write and test an " "implementation. The {ph0}DX-Ball calculation{ph1} and {ph2}CTF flag checker{ph3} show " "how that process works." msgstr "" #: website/public/faq/index.html:410 msgctxt "page:faq/index.html" msgid "What should I ask my agent?" msgstr "" #: website/public/faq/index.html:411 msgctxt "page:faq/index.html" msgid "" "Give it a local target and one behavior to investigate. For a JavaScript or Electron " "app:" msgstr "" #. {ph0}: #: website/public/faq/index.html:417 #, python-brace-format msgctxt "page:faq/index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" msgstr "" #. {ph0}: #. {ph2}: #. {ph3}: /absolute/path/to/app #. {ph4}: #. {ph5}: #: website/public/faq/index.html:430 #, python-brace-format msgctxt "page:faq/index.html" msgid "" "{ph0}›{ph1}{ph2}Use REA to analyze {ph3} and explain how it exports data. Show the " "relevant code and source locations.{ph4}{ph5}{ph6}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/faq/index.html:440 #, python-brace-format msgctxt "page:faq/index.html" msgid "" "Replace the path with your target. The {ph0}guides{ph1} provide prompts for native, " "Electron and browser examples." msgstr "" #: website/public/faq/index.html:450 msgctxt "page:faq/index.html" msgid "Troubleshooting" msgstr "" #: website/public/faq/index.html:453 msgctxt "page:faq/index.html" msgid "Why can't my agent see the REA tools?" msgstr "" #. {ph0}: doctor #: website/public/faq/index.html:454 #, python-brace-format msgctxt "page:faq/index.html" msgid "" "Restart or reconnect your agent after setup. Check its REA registration with {ph0}; " "for Codex:" msgstr "" #: website/public/faq/index.html:460 msgctxt "page:faq/index.html" msgid "Terminal · check one client" msgstr "" #. {ph0}: codex #. {ph1}: claude_code #. {ph2}: cursor #: website/public/faq/index.html:472 #, python-brace-format msgctxt "page:faq/index.html" msgid "" "Replace {ph0} with your client ID, such as {ph1} or {ph2}. If the report shows a " "missing or stale registration, run setup for that client:" msgstr "" #: website/public/faq/index.html:480 msgctxt "page:faq/index.html" msgid "Terminal · repair one client's setup" msgstr "" #. {ph0}: #. {ph1}: #: website/public/faq/index.html:492 #, python-brace-format msgctxt "page:faq/index.html" msgid "" "Review its plan and restart the client. If registration is healthy but tools remain " "absent, check the client's MCP connection error. {ph0}More setup diagnostics{ph1}." msgstr "" #: website/public/faq/index.html:500 msgctxt "page:faq/index.html" msgid "Do I need to start Hopper first?" msgstr "" #. {ph0}: #. {ph1}: #: website/public/faq/index.html:501 #, python-brace-format msgctxt "page:faq/index.html" msgid "" "REA starts Hopper when an operation needs it. On macOS, complete the first-run choice " "of demo mode or license activation before unattended analysis. {ph0}See native " "provider setup{ph1}." msgstr "" #: website/public/faq/index.html:510 msgctxt "page:faq/index.html" msgid "What should I do if I hit a bug?" msgstr "" #. {ph0}: #. {ph1}: #: website/public/faq/index.html:511 #, python-brace-format msgctxt "page:faq/index.html" msgid "" "{ph0}Update REA{ph1}, restart your agent and retry the same task. A recent release may" " already fix the problem." msgstr "" #. {ph0}: #. {ph1}: #: website/public/faq/index.html:515 #, python-brace-format msgctxt "page:faq/index.html" msgid "" "If it persists, {ph0}open an issue{ph1} with your REA version, operating system, " "target type, steps to reproduce and error output. Include the provider name when the " "problem involves native analysis." msgstr "" #: website/public/faq/index.html:529 msgctxt "page:faq/index.html" msgid "Data and sharing" msgstr "" #: website/public/faq/index.html:532 msgctxt "page:faq/index.html" msgid "Does REA upload my app?" msgstr "" #: website/public/faq/index.html:533 msgctxt "page:faq/index.html" msgid "" "REA analyzes targets on your machine. Your agent receives the results, and its model " "provider's data policy applies to those results." msgstr "" #: website/public/faq/index.html:540 msgctxt "page:faq/index.html" msgid "How can I share an example or contribute?" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/faq/index.html:541 #, python-brace-format msgctxt "page:faq/index.html" msgid "" "Have a useful REA example? We'd love to see it. Share the target, your question, the " "findings and how you checked them in an {ph0}issue{ph1} or {ph2}pull request{ph3}. " "Short code excerpts and figures help others follow the investigation." msgstr "" #. {ph0}: #. {ph1}: #: website/public/faq/index.html:553 #, python-brace-format msgctxt "page:faq/index.html" msgid "" "Bug reports, feature requests, documentation and code improvements are welcome too. " "You can also discuss an example in the {ph0}community{ph1}." msgstr "" #: website/public/faq/index.html:6 msgctxt "page:faq/index.html" msgid "REA FAQ: Setup, Updates and Troubleshooting" msgstr "" #: website/public/faq/index.html:7 msgctxt "page:faq/index.html" msgid "" "Answers to common REA questions: installation, updates, analysis tools, coding agents," " troubleshooting and sharing examples." msgstr "" #: website/public/faq/index.html:204 msgctxt "page:faq/index.html" msgid "On this page" msgstr "" #: website/public/faq/index.html:213 msgctxt "page:faq/index.html" msgid "Frequently asked questions about REA" msgstr "" #: website/public/faq/index.html:231 msgctxt "page:faq/index.html" msgid "Copy REA setup command" msgstr "" #: website/public/faq/index.html:272 msgctxt "page:faq/index.html" msgid "Copy REA update command" msgstr "" #: website/public/faq/index.html:290 msgctxt "page:faq/index.html" msgid "Copy agent setup refresh command" msgstr "" #: website/public/faq/index.html:374 msgctxt "page:faq/index.html" msgid "Copy REA CLI analysis command" msgstr "" #: website/public/faq/index.html:421 msgctxt "page:faq/index.html" msgid "Copy example analysis prompt" msgstr "" #: website/public/faq/index.html:461 msgctxt "page:faq/index.html" msgid "Copy client diagnosis command" msgstr "" #: website/public/faq/index.html:481 msgctxt "page:faq/index.html" msgid "Copy scoped setup command" msgstr "" #: website/public/faq/index.html:579 msgctxt "page:faq/index.html" msgid "Back to top" msgstr "" #: website/public/first-investigation/index.html:107 msgctxt "page:first-investigation/index.html" msgid "Skip to content" msgstr "" #. {ph0}: #. {ph1}: #: website/public/first-investigation/index.html:199 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "{ph0}Home{ph1} / Your first investigation" msgstr "" #. {ph0}:
#: website/public/first-investigation/index.html:202 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "Find out where{ph0}exported notes go." msgstr "" #: website/public/first-investigation/index.html:203 msgctxt "page:first-investigation/index.html" msgid "" "Use REA to inspect a small app, follow its Export notes button and check one detail " "yourself." msgstr "" #. {ph0}: Node.js #: website/public/first-investigation/index.html:207 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "A supplied example · {ph0} and npm · Your coding agent" msgstr "" #: website/public/first-investigation/index.html:214 msgctxt "page:first-investigation/index.html" msgid "In this exercise" msgstr "" #. {ph0}: #. {ph1}: #: website/public/first-investigation/index.html:216 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "{ph0}1. Set up{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/first-investigation/index.html:217 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "{ph0}2. Ask about export{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/first-investigation/index.html:218 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "{ph0}3. Follow the answer{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/first-investigation/index.html:219 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "{ph0}4. Check a prediction{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/first-investigation/index.html:220 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "{ph0}5. Ask another question{ph1}" msgstr "" #: website/public/first-investigation/index.html:225 msgctxt "page:first-investigation/index.html" msgid "1. Connect your agent to REA" msgstr "" #. {ph0}: Node.js #. {ph1}: #. {ph2}: #: website/public/first-investigation/index.html:226 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" "Use a coding agent such as Claude Code, Codex or Cursor. You’ll need {ph0} and npm; " "the {ph1}setup guide lists supported versions{ph2}." msgstr "" #. {ph0}: #: website/public/first-investigation/index.html:234 #: website/public/first-investigation/index.html:284 #: website/public/first-investigation/index.html:406 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" msgstr "" #: website/public/first-investigation/index.html:239 #: website/public/first-investigation/index.html:261 #: website/public/first-investigation/index.html:289 #: website/public/first-investigation/index.html:411 #: website/public/first-investigation/index.html:452 #: website/public/first-investigation/index.html:469 msgctxt "page:first-investigation/index.html" msgid "Copy" msgstr "" #. {ph0}: #. {ph2}: #. {ph3}: npx rea-agents@latest setup #. {ph4}: #. {ph5}: #: website/public/first-investigation/index.html:248 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" "{ph0}›{ph1}{ph2}Install REA and connect it to this coding agent using {ph3}. Show me " "the setup plan for approval, then verify the installation.{ph4}{ph5}{ph6}" msgstr "" #: website/public/first-investigation/index.html:258 msgctxt "page:first-investigation/index.html" msgid "Or run this command in your terminal:" msgstr "" #: website/public/first-investigation/index.html:270 msgctxt "page:first-investigation/index.html" msgid "" "Review the plan, approve the setup, then restart your agent. Already connected? " "Continue below." msgstr "" #: website/public/first-investigation/index.html:276 msgctxt "page:first-investigation/index.html" msgid "2. Ask where the CSV is written" msgstr "" #. {ph0}: #. {ph1}: #: website/public/first-investigation/index.html:277 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" "The example is a six-file Electron app with an {ph0}Export notes{ph1} button. Your " "agent can inspect its code without installing or launching Electron." msgstr "" #. {ph0}: #. {ph2}: #. {ph3}: https://rea.tools/examples/notes-example.zip #. {ph4}: notes.csv #. {ph5}: #. {ph6}: #: website/public/first-investigation/index.html:298 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" "{ph0}›{ph1}{ph2}Download {ph3} into a new example folder and unpack it. Use REA to " "find what happens when I click Export notes. Show where {ph4} is written, which fields" " it contains, and the relevant files and lines.{ph5}{ph6}{ph7}" msgstr "" #: website/public/first-investigation/index.html:312 msgctxt "page:first-investigation/index.html" msgid "" "Your agent downloads the files and gives the unpacked folder to REA for inspection." msgstr "" #. {ph0}: #. {ph1}: #: website/public/first-investigation/index.html:316 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "{ph0}Download example ZIP{ph1}" msgstr "" #. {ph0}: notes-example #: website/public/first-investigation/index.html:324 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" "If your agent can’t download files, unzip this archive yourself. Give it the path to " "the {ph0} folder and the same export question." msgstr "" #: website/public/first-investigation/index.html:331 msgctxt "page:first-investigation/index.html" msgid "3. Follow the answer back to the code" msgstr "" #: website/public/first-investigation/index.html:332 msgctxt "page:first-investigation/index.html" msgid "Look for a short explanation with file and line references:" msgstr "" #. {ph0}: notes:export #. {ph1}: notes.csv #. {ph2}: id #. {ph3}: title #: website/public/first-investigation/index.html:334 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" "The button sends a {ph0} message. The main process formats the notes as CSV and writes" " {ph1} in the user’s Downloads folder. The columns are {ph2} and {ph3}." msgstr "" #: website/public/first-investigation/index.html:342 msgctxt "page:first-investigation/index.html" msgid "From the button to the file writer" msgstr "" #. {ph0}: #. {ph1}: renderer.js #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #. {ph6}: notes.exportCsv() #. {ph7}: #: website/public/first-investigation/index.html:344 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "{ph0}Page · {ph1}{ph2}{ph3}Export notes{ph4}{ph5}Calls {ph6}.{ph7}" msgstr "" #. {ph0}: #. {ph1}: preload.js #. {ph2}: #. {ph3}: #. {ph4}: notes:export #. {ph5}: #. {ph6}: #. {ph7}: #: website/public/first-investigation/index.html:352 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" "{ph0}Bridge · {ph1}{ph2}{ph3}{ph4}{ph5}{ph6}Sends a named message to the main " "process.{ph7}" msgstr "" #. {ph0}: #. {ph1}: main.js #. {ph2}: #. {ph3}: #. {ph4}: notes.csv #. {ph5}: #. {ph6}: #. {ph7}: csv.js #. {ph8}: #: website/public/first-investigation/index.html:360 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" "{ph0}Handler · {ph1}{ph2}{ph3}Write {ph4}{ph5}{ph6}Calls the formatter in {ph7} and " "writes the file.{ph8}" msgstr "" #: website/public/first-investigation/index.html:371 msgctxt "page:first-investigation/index.html" msgid "" "REA’s static analysis pairs the message with its handler. The destination is read from" " code." msgstr "" #. {ph0}: main.js #: website/public/first-investigation/index.html:378 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "{ph0} · lines 8–12" msgstr "" #: website/public/first-investigation/index.html:379 msgctxt "page:first-investigation/index.html" msgid "Source" msgstr "" #: website/public/first-investigation/index.html:387 msgctxt "page:first-investigation/index.html" msgid "" "The file path, formatter and write call are together in this handler. Ask your agent " "to show these lines if its answer leaves them out." msgstr "" #. {ph0}: #. {ph1}: #: website/public/first-investigation/index.html:392 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "{ph0}See the full code trace and recorded REA result{ph1}." msgstr "" #: website/public/first-investigation/index.html:399 msgctxt "page:first-investigation/index.html" msgid "4. Check a prediction" msgstr "" #: website/public/first-investigation/index.html:400 msgctxt "page:first-investigation/index.html" msgid "" "A comma separates CSV columns. What happens when a note title itself contains a comma " "or quotation marks?" msgstr "" #. {ph0}: #. {ph2}: #. {ph3}: Hello, "REA" #. {ph4}: toCsv #. {ph5}: Node.js #. {ph6}: #. {ph7}: #: website/public/first-investigation/index.html:420 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" "{ph0}›{ph1}{ph2}Predict the CSV for a note with id 1 and title {ph3}. Then run the " "example’s {ph4} formatter with {ph5} to check it. Show the prediction and actual " "output.{ph6}{ph7}{ph8}" msgstr "" #: website/public/first-investigation/index.html:433 msgctxt "page:first-investigation/index.html" msgid "Expected formatter output" msgstr "" #. {ph0}: Node.js #: website/public/first-investigation/index.html:438 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" "The title stays in one quoted field; each quotation mark is doubled. This checks the " "formatter directly with {ph0}." msgstr "" #: website/public/first-investigation/index.html:444 msgctxt "page:first-investigation/index.html" msgid "Run the check yourself" msgstr "" #. {ph0}: notes-example #: website/public/first-investigation/index.html:445 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "Open a terminal in the unpacked {ph0} folder:" msgstr "" #: website/public/first-investigation/index.html:486 msgctxt "page:first-investigation/index.html" msgid "5. Ask another question" msgstr "" #: website/public/first-investigation/index.html:487 msgctxt "page:first-investigation/index.html" msgid "Try a follow-up in the same conversation:" msgstr "" #: website/public/first-investigation/index.html:489 msgctxt "page:first-investigation/index.html" msgid "What happens if the file can’t be written? Follow the error back to the page." msgstr "" #: website/public/first-investigation/index.html:494 msgctxt "page:first-investigation/index.html" msgid "" "Or give your agent an app of your own and ask about one button, file or behavior." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/first-investigation/index.html:499 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" "{ph0}How Notion copies text and HTML{ph1}{ph2}Follow a clipboard feature in a packaged" " Electron app.{ph3}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/first-investigation/index.html:505 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" "{ph0}How DX-Ball calculates sound panning{ph1}{ph2}Read the original instructions and " "the reconstruction’s checks.{ph3}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/first-investigation/index.html:513 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" "{ph0}Troubleshoot setup or analysis{ph1}{ph2}Update REA and check the connection if " "you get stuck.{ph3}" msgstr "" #: website/public/first-investigation/index.html:6 msgctxt "page:first-investigation/index.html" msgid "Your First Reverse Engineering Investigation — REA" msgstr "" #: website/public/first-investigation/index.html:7 msgctxt "page:first-investigation/index.html" msgid "" "Try REA on a small Notes app. Set up your agent, ask where exported notes go, and " "check the CSV formatter with a sample title." msgstr "" #: website/public/first-investigation/index.html:213 msgctxt "page:first-investigation/index.html" msgid "On this page" msgstr "" #: website/public/first-investigation/index.html:223 msgctxt "page:first-investigation/index.html" msgid "Your first REA investigation" msgstr "" #: website/public/first-investigation/index.html:239 msgctxt "page:first-investigation/index.html" msgid "Copy REA installation prompt" msgstr "" #: website/public/first-investigation/index.html:261 msgctxt "page:first-investigation/index.html" msgid "Copy setup command" msgstr "" #: website/public/first-investigation/index.html:289 msgctxt "page:first-investigation/index.html" msgid "Copy Notes investigation prompt" msgstr "" #: website/public/first-investigation/index.html:411 msgctxt "page:first-investigation/index.html" msgid "Copy CSV check prompt" msgstr "" #: website/public/first-investigation/index.html:452 #: website/public/first-investigation/index.html:469 msgctxt "page:first-investigation/index.html" msgid "Copy formatter check command" msgstr "" #: website/public/first-investigation/index.html:540 msgctxt "page:first-investigation/index.html" msgid "Back to top" msgstr "" #: website/public/get-started/index.html:107 msgctxt "page:get-started/index.html" msgid "Skip to content" msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:199 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Home{ph1} / Get started" msgstr "" #: website/public/get-started/index.html:200 msgctxt "page:get-started/index.html" msgid "Set up REA." msgstr "" #: website/public/get-started/index.html:201 msgctxt "page:get-started/index.html" msgid "" "Set up your computer and coding agent, connect REA, then investigate a small app." msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:205 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "New to this? Follow the four steps below. Already have an agent? Go straight to " "{ph0}Connect REA{ph1}." msgstr "" #: website/public/get-started/index.html:212 website/public/get-started/index.html:211 msgctxt "page:get-started/index.html" msgid "On this page" msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:214 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}1. Prepare your computer{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:215 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}2. Choose an agent{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:216 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}3. Connect REA{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:217 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}4. Try an investigation{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:218 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Other targets and providers{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:219 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Use the CLI{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:220 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Getting help{ph1}" msgstr "" #: website/public/get-started/index.html:225 msgctxt "page:get-started/index.html" msgid "1. Prepare your computer" msgstr "" #: website/public/get-started/index.html:226 msgctxt "page:get-started/index.html" msgid "" "Use the computer where your target files are stored. A local coding agent can read " "those files and run tools for you." msgstr "" #: website/public/get-started/index.html:231 msgctxt "page:get-started/index.html" msgid "How do I open a terminal?" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/get-started/index.html:233 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "{ph0}Windows:{ph1} open the Start menu, type {ph2}PowerShell{ph3} and press Enter." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: ⌘ #. {ph3}: Space #. {ph4}: #. {ph5}: #: website/public/get-started/index.html:237 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}macOS:{ph1} press {ph2} {ph3}, type {ph4}Terminal{ph5} and press Enter." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: Ctrl #. {ph3}: Alt #. {ph4}: T #: website/public/get-started/index.html:241 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Linux:{ph1} press {ph2} {ph3} {ph4} on most desktops." msgstr "" #. {ph0}: Ctrl #. {ph1}: V #. {ph2}: ⌘ #. {ph3}: V #. {ph4}: Ctrl #. {ph5}: Shift #. {ph6}: V #: website/public/get-started/index.html:246 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "Paste a command with {ph0} {ph1} (macOS: {ph2} {ph3}; Linux terminals: {ph4} {ph5} " "{ph6}), then press Enter." msgstr "" #: website/public/get-started/index.html:251 msgctxt "page:get-started/index.html" msgid "" "Commands go in the terminal. Prompts labeled “Your coding agent” go in the agent's " "chat." msgstr "" #. {ph0}: Node.js #. {ph1}: Node.js #: website/public/get-started/index.html:256 #, python-brace-format msgctxt "page:get-started/index.html" msgid "You'll need {ph0} 22 (22.19+), 24 (24.11+) or 26+. npm comes with {ph1}." msgstr "" #. {ph0}: Node.js #: website/public/get-started/index.html:262 #, python-brace-format msgctxt "page:get-started/index.html" msgid "Don't have {ph0}, or not sure?" msgstr "" #: website/public/get-started/index.html:265 msgctxt "page:get-started/index.html" msgid "Open a terminal and check:" msgstr "" #: website/public/get-started/index.html:268 msgctxt "page:get-started/index.html" msgid "Terminal" msgstr "" #: website/public/get-started/index.html:269 website/public/get-started/index.html:292 #: website/public/get-started/index.html:322 website/public/get-started/index.html:347 #: website/public/get-started/index.html:370 website/public/get-started/index.html:385 #: website/public/get-started/index.html:419 website/public/get-started/index.html:450 #: website/public/get-started/index.html:464 website/public/get-started/index.html:482 #: website/public/get-started/index.html:534 website/public/get-started/index.html:548 #: website/public/get-started/index.html:580 website/public/get-started/index.html:609 #: website/public/get-started/index.html:744 website/public/get-started/index.html:774 #: website/public/get-started/index.html:799 website/public/get-started/index.html:814 #: website/public/get-started/index.html:862 website/public/get-started/index.html:895 #: website/public/get-started/index.html:1047 website/public/get-started/index.html:1109 #: website/public/get-started/index.html:1132 website/public/get-started/index.html:1156 #: website/public/get-started/index.html:1204 website/public/get-started/index.html:1279 #: website/public/get-started/index.html:1305 website/public/get-started/index.html:1322 #: website/public/get-started/index.html:1565 website/public/get-started/index.html:1624 #: website/public/get-started/index.html:1643 website/public/get-started/index.html:1665 #: website/public/get-started/index.html:1708 website/public/get-started/index.html:1738 #: website/public/get-started/index.html:1759 msgctxt "page:get-started/index.html" msgid "Copy" msgstr "" #. {ph0}: node -v #. {ph1}: Node.js #: website/public/get-started/index.html:281 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "If {ph0} prints v22.19+, v24.11+ or v26+, you're ready. If it prints an older version " "or \"not recognized\" / \"command not found\", install {ph1} 24 LTS:" msgstr "" #. {ph0}: node -v #: website/public/get-started/index.html:303 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "Type Y if asked to accept the terms. Close PowerShell, open it again, then run {ph0}." msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:307 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Download the Node.js installer{ph1} if winget is unavailable." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: npx #. {ph3}: npx.cmd #. {ph4}: npm.cmd #: website/public/get-started/index.html:313 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "If PowerShell later says {ph0}\"running scripts is disabled on this system\"{ph1} when" " you run {ph2}, use {ph3} instead. For npm, use {ph4}:" msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:336 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "For a first installation, download the {ph0}Node.js 24 LTS macOS installer " "(.pkg){ph1}, open it and follow the installer. Then reopen Terminal." msgstr "" #: website/public/get-started/index.html:343 msgctxt "page:get-started/index.html" msgid "Already use Homebrew?" msgstr "" #. {ph0}: sudo apt install curl unzip #: website/public/get-started/index.html:362 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "Install curl and unzip first if they are missing. On Debian or Ubuntu, run {ph0}; on " "other distributions, use your package manager." msgstr "" #: website/public/get-started/index.html:381 msgctxt "page:get-started/index.html" msgid "Close the terminal, open it again, then:" msgstr "" #. {ph0}: nodejs #. {ph1}: node -v #: website/public/get-started/index.html:398 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "Your distribution's own {ph0} package is often older than 22.19, so check {ph1} if you" " use it instead." msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:404 #, python-brace-format msgctxt "page:get-started/index.html" msgid "Prefer a regular installer? Download the LTS version from {ph0}nodejs.org{ph1}." msgstr "" #: website/public/get-started/index.html:411 msgctxt "page:get-started/index.html" msgid "Make a working folder for your agent" msgstr "" #: website/public/get-started/index.html:412 msgctxt "page:get-started/index.html" msgid "In your terminal, make a folder for the exercise, then move into it:" msgstr "" #: website/public/get-started/index.html:431 msgctxt "page:get-started/index.html" msgid "" "Keep this terminal open for the next step. If you already have a working folder, open " "it instead." msgstr "" #: website/public/get-started/index.html:438 msgctxt "page:get-started/index.html" msgid "2. Choose a coding agent" msgstr "" #: website/public/get-started/index.html:439 msgctxt "page:get-started/index.html" msgid "" "Your agent is the AI you talk to. REA supplies the inspection tools it uses. Pick one " "client below; open its instructions if you haven't used it before." msgstr "" #: website/public/get-started/index.html:445 msgctxt "page:get-started/index.html" msgid "Codex · use your ChatGPT account" msgstr "" #: website/public/get-started/index.html:446 msgctxt "page:get-started/index.html" msgid "Install Codex using the command for your operating system:" msgstr "" #: website/public/get-started/index.html:475 msgctxt "page:get-started/index.html" msgid "" "After installation, reopen your terminal and return to the working folder. Then start " "Codex:" msgstr "" #: website/public/get-started/index.html:493 msgctxt "page:get-started/index.html" msgid "" "Choose “Sign in with ChatGPT”, complete the browser sign-in, then return to the " "terminal. When the message box appears, continue to step 3." msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:498 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Codex installation and sign-in{ph1}" msgstr "" #: website/public/get-started/index.html:505 msgctxt "page:get-started/index.html" msgid "Cursor, Windsurf or VS Code · use an editor" msgstr "" #: website/public/get-started/index.html:507 msgctxt "page:get-started/index.html" msgid "Install the editor for your operating system and sign in." msgstr "" #: website/public/get-started/index.html:510 msgctxt "page:get-started/index.html" msgid "Open the rea-work folder you made in step 1." msgstr "" #: website/public/get-started/index.html:511 msgctxt "page:get-started/index.html" msgid "" "Open its AI chat and choose Agent mode. In Windsurf or Devin Desktop, open the agent " "chat; in VS Code, set up GitHub Copilot first." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/get-started/index.html:517 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "{ph0}Cursor setup{ph1} · {ph2}Windsurf / Devin Desktop setup{ph3} · {ph4}VS Code and " "Copilot setup{ph5}" msgstr "" #: website/public/get-started/index.html:529 msgctxt "page:get-started/index.html" msgid "Claude Code · use your Claude account" msgstr "" #: website/public/get-started/index.html:530 msgctxt "page:get-started/index.html" msgid "Install using the command for your operating system:" msgstr "" #. {ph0}: claude #: website/public/get-started/index.html:559 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "Reopen your terminal, return to your working folder and run {ph0}. Follow the sign-in " "prompts. Access uses an eligible Claude subscription or a configured API account." msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:564 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Claude Code installation and account options{ph1}" msgstr "" #: website/public/get-started/index.html:571 msgctxt "page:get-started/index.html" msgid "Claude Desktop · use a desktop chat" msgstr "" #: website/public/get-started/index.html:572 msgctxt "page:get-started/index.html" msgid "" "Install Claude Desktop on Windows or macOS and sign in. Quit it completely, then run " "this command in a terminal you opened outside Claude:" msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:591 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "Review and approve the plan, reopen Claude, then {ph0}check the connection in step " "3{ph1}." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/get-started/index.html:595 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Download Claude Desktop{ph1} · {ph2}Claude Desktop connection details{ph3}" msgstr "" #: website/public/get-started/index.html:605 msgctxt "page:get-started/index.html" msgid "OpenCode · choose an AI model" msgstr "" #. {ph0}: opencode #. {ph1}: /connect #: website/public/get-started/index.html:620 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "Run {ph0} in your working folder. Use {ph1} in its chat to connect your model account," " then select a model." msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:625 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}OpenCode installation and model setup{ph1}" msgstr "" #: website/public/get-started/index.html:632 msgctxt "page:get-started/index.html" msgid "All supported clients and setup IDs" msgstr "" #. {ph0}: --client #: website/public/get-started/index.html:633 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "The npm 6.4.0 release supports the clients below. Use the ID with {ph0} when choosing " "a client explicitly." msgstr "" #: website/public/get-started/index.html:641 msgctxt "page:get-started/index.html" msgid "Client" msgstr "" #: website/public/get-started/index.html:642 msgctxt "page:get-started/index.html" msgid "Setup ID" msgstr "" #. {ph0}: qoder #. {ph1}: droid #. {ph2}: trae #. {ph3}: zcode #. {ph4}: dsh #: website/public/get-started/index.html:717 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "Qoder ({ph0}), Factory Droid ({ph1}), Trae ({ph2}), ZCode ({ph3}) and DeepSeek Harness" " ({ph4}) are available on repository main; use a source build or a release containing " "those integrations." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/get-started/index.html:724 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "{ph0}Client configuration and troubleshooting{ph1} · {ph2}Release availability{ph3}" msgstr "" #: website/public/get-started/index.html:736 msgctxt "page:get-started/index.html" msgid "Grok Bot · connect on its hosted computer" msgstr "" #. {ph0}: rea #: website/public/get-started/index.html:737 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "In Grok Bot's chat, ask it to add a custom MCP server named {ph0} using this command " "on the Bot's computer:" msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:755 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Grok Bot connector instructions{ph1}" msgstr "" #: website/public/get-started/index.html:765 msgctxt "page:get-started/index.html" msgid "3. Connect REA" msgstr "" #: website/public/get-started/index.html:766 msgctxt "page:get-started/index.html" msgid "Copy this into your coding agent:" msgstr "" #. {ph0}: #: website/public/get-started/index.html:769 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" msgstr "" #. {ph0}: #. {ph2}: #. {ph3}: npx rea-agents@latest setup #. {ph4}: #. {ph5}: #: website/public/get-started/index.html:783 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "{ph0}›{ph1}{ph2}Install REA and connect it to this coding agent using {ph3}. Show me " "the setup plan for approval, then verify the installation.{ph4}{ph5}{ph6}" msgstr "" #: website/public/get-started/index.html:795 msgctxt "page:get-started/index.html" msgid "Or run setup yourself" msgstr "" #: website/public/get-started/index.html:810 msgctxt "page:get-started/index.html" msgid "For one specific client, add its setup ID:" msgstr "" #. {ph0}: y #: website/public/get-started/index.html:825 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "If npm asks to download the package, type {ph0} and press Enter. In REA's client list," " use the arrow keys to move, Space to select your client and Enter to continue." msgstr "" #: website/public/get-started/index.html:831 msgctxt "page:get-started/index.html" msgid "" "Choose your client and review the setup plan. REA adds its MCP connection and the " "matching investigation skill, keeping a backup of existing configuration. It asks " "before applying the changes." msgstr "" #: website/public/get-started/index.html:836 msgctxt "page:get-started/index.html" msgid "" "MCP is the connection that lets your agent call REA. The skill gives it a workflow for" " investigating software." msgstr "" #: website/public/get-started/index.html:840 msgctxt "page:get-started/index.html" msgid "" "For the first exercise, you can skip the optional Hopper installation. Restart your " "client when setup finishes." msgstr "" #: website/public/get-started/index.html:845 msgctxt "page:get-started/index.html" msgid "How do I restart my client?" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: ⌘ #. {ph3}: Q #: website/public/get-started/index.html:846 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "{ph0}Desktop apps{ph1} (Claude Desktop, Cursor, Windsurf, VS Code): quit the app " "completely, then open it again. Closing the window isn't enough. On macOS press {ph2} " "{ph3}; on Windows, also quit from the tray icon if there is one." msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:853 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "{ph0}Terminal agents{ph1} (Claude Code, Codex, Gemini CLI): exit the session and start" " it again." msgstr "" #. {ph0}: codex #. {ph1}: "healthy": true #: website/public/get-started/index.html:873 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "Replace {ph0} with your client's setup ID. A successful check reports {ph1}. Then ask " "your agent:" msgstr "" #: website/public/get-started/index.html:879 msgctxt "page:get-started/index.html" msgid "Check that REA is connected and show me which REA tools you can use." msgstr "" #: website/public/get-started/index.html:886 msgctxt "page:get-started/index.html" msgid "4. Try your first investigation" msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:887 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "The example is a six-file Electron app with an {ph0}Export notes{ph1} button. Your " "agent can inspect its code without installing or launching Electron." msgstr "" #: website/public/get-started/index.html:894 msgctxt "page:get-started/index.html" msgid "Your coding agent" msgstr "" #. {ph0}: #. {ph2}: #. {ph3}: https://rea.tools/examples/notes-example.zip #. {ph4}: notes.csv #. {ph5}: #. {ph6}: #: website/public/get-started/index.html:904 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "{ph0}›{ph1}{ph2}Download {ph3} into a new example folder and unpack it. Use REA to " "find what happens when I click Export notes. Show where {ph4} is written, which fields" " it contains, and the relevant files and lines.{ph5}{ph6}{ph7}" msgstr "" #: website/public/get-started/index.html:918 msgctxt "page:get-started/index.html" msgid "Look for a short explanation with file and line references:" msgstr "" #. {ph0}: notes:export #. {ph1}: notes.csv #. {ph2}: id #. {ph3}: title #: website/public/get-started/index.html:920 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "The button sends a {ph0} message. The main process formats the notes as CSV and writes" " {ph1} in the user’s Downloads folder. The columns are {ph2} and {ph3}." msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:927 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Check a prediction in the guided exercise →{ph1}" msgstr "" #: website/public/get-started/index.html:933 msgctxt "page:get-started/index.html" msgid "Download the example yourself, or use your own app" msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:936 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Download example ZIP{ph1}" msgstr "" #. {ph0}: notes-example #: website/public/get-started/index.html:944 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "If your agent can’t download files, unzip this archive yourself. Give it the path to " "the {ph0} folder and the same export question." msgstr "" #. {ph0}: /absolute/path/to/app #: website/public/get-started/index.html:950 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "Use REA to inspect the app at {ph0}. Find how it exports data and show the relevant " "files and lines." msgstr "" #: website/public/get-started/index.html:957 msgctxt "page:get-started/index.html" msgid "How do I get a folder's full path?" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/get-started/index.html:959 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "{ph0}Windows:{ph1} in File Explorer, right-click the folder and choose {ph2}Copy as " "path{ph3}. On Windows 10, hold Shift while right-clicking." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/get-started/index.html:964 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "{ph0}macOS:{ph1} in Finder, right-click the folder, hold Option and choose {ph2}Copy " "\"…\" as Pathname{ph3}." msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:968 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "{ph0}Any system:{ph1} drag the folder into a terminal window and its path appears." msgstr "" #: website/public/get-started/index.html:973 website/public/get-started/index.html:1731 msgctxt "page:get-started/index.html" msgid "In a terminal, put quotes around a path that contains spaces." msgstr "" #: website/public/get-started/index.html:980 msgctxt "page:get-started/index.html" msgid "Analyze another kind of software" msgstr "" #: website/public/get-started/index.html:981 msgctxt "page:get-started/index.html" msgid "" "Choose the section for your target. A provider is the local analysis tool REA uses for" " that kind of software." msgstr "" #: website/public/get-started/index.html:986 msgctxt "page:get-started/index.html" msgid "Native executables and libraries · Hopper, Ghidra or IDA" msgstr "" #: website/public/get-started/index.html:989 msgctxt "page:get-started/index.html" msgid "" "Install one analysis tool on the computer running REA. The host is your operating " "system; the target is the program you want to inspect." msgstr "" #: website/public/get-started/index.html:998 msgctxt "page:get-started/index.html" msgid "Provider" msgstr "" #: website/public/get-started/index.html:1007 msgctxt "page:get-started/index.html" msgid "Unavailable" msgstr "" #: website/public/get-started/index.html:1009 msgctxt "page:get-started/index.html" msgid "Supported distributions" msgstr "" #: website/public/get-started/index.html:1013 msgctxt "page:get-started/index.html" msgid "x64 · experimental" msgstr "" #: website/public/get-started/index.html:1019 msgctxt "page:get-started/index.html" msgid "Verified profiles" msgstr "" #: website/public/get-started/index.html:1020 msgctxt "page:get-started/index.html" msgid "Verified headless profile" msgstr "" #: website/public/get-started/index.html:1021 msgctxt "page:get-started/index.html" msgid "See provider guide" msgstr "" #: website/public/get-started/index.html:1027 msgctxt "page:get-started/index.html" msgid "Hopper · let setup install or connect it" msgstr "" #: website/public/get-started/index.html:1028 msgctxt "page:get-started/index.html" msgid "" "Connect Hopper on macOS or Linux. Run the setup command above; it detects an existing " "installation or offers an installation plan for your approval." msgstr "" #: website/public/get-started/index.html:1033 msgctxt "page:get-started/index.html" msgid "" "Choose Hopper in setup and review its separate installation plan. On macOS, choose " "demo mode or activate your license when Hopper first opens. On Linux, setup prepares " "the supported demo and its private display." msgstr "" #: website/public/get-started/index.html:1039 msgctxt "page:get-started/index.html" msgid "" "Linux hosts: Ubuntu 24.04+, Fedora 41+, Nobara 44+, Arch Linux, CachyOS or Omarchy. " "Hopper is commercial software; its demo has vendor-defined limits." msgstr "" #: website/public/get-started/index.html:1058 msgctxt "page:get-started/index.html" msgid "" "If macOS asks for Automation permission, allow the app that starts REA in System " "Settings → Privacy & Security → Automation, then retry." msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:1063 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Hopper setup and troubleshooting{ph1}" msgstr "" #: website/public/get-started/index.html:1071 msgctxt "page:get-started/index.html" msgid "Ghidra · install the free analysis tool and Java" msgstr "" #: website/public/get-started/index.html:1075 msgctxt "page:get-started/index.html" msgid "" "Install a 64-bit JDK 21 or newer, including the Java compiler. Choose the package " "matching your computer's architecture." msgstr "" #. {ph0}: ghidra_…_PUBLIC_….zip #: website/public/get-started/index.html:1080 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "Download Ghidra 12.1.4 from the release's Assets list and extract the {ph0} archive. " "Choose the release archive, not “Source code”." msgstr "" #. {ph0}: ghidraRun #. {ph1}: ghidraRun.bat #. {ph2}: GHIDRA_INSTALL_DIR #: website/public/get-started/index.html:1085 #, python-brace-format msgctxt "page:get-started/index.html" msgid "Find the extracted folder containing {ph0} or {ph1}. Use that folder for {ph2}." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/get-started/index.html:1091 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Download a JDK{ph1} · {ph2}Download Ghidra 12.1.4{ph3}" msgstr "" #. {ph0}: java.home #. {ph1}: JAVA_HOME #: website/public/get-started/index.html:1101 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "Check Java. The first command prints {ph0}; use that folder for {ph1}. The second " "confirms the compiler is installed:" msgstr "" #: website/public/get-started/index.html:1122 msgctxt "page:get-started/index.html" msgid "Connect Ghidra on Windows" msgstr "" #: website/public/get-started/index.html:1123 msgctxt "page:get-started/index.html" msgid "" "Windows x64 has experimental, read-only support for native x86 and x64 PE applications" " and DLLs on fixed local NTFS drives. Use an existing Ghidra 12.1.x installation and a" " 64-bit JDK 21 or newer:" msgstr "" #: website/public/get-started/index.html:1146 msgctxt "page:get-started/index.html" msgid "Replace the two paths with your installations, then review setup's plan." msgstr "" #: website/public/get-started/index.html:1152 msgctxt "page:get-started/index.html" msgid "Connect your Ghidra installation" msgstr "" #: website/public/get-started/index.html:1168 msgctxt "page:get-started/index.html" msgid "" "Replace both paths with your existing installations. For a fresh macOS or Linux arm64 " "installation, build the native decompiler for your computer before continuing." msgstr "" #: website/public/get-started/index.html:1174 msgctxt "page:get-started/index.html" msgid "Build Ghidra's native decompiler" msgstr "" #: website/public/get-started/index.html:1175 msgctxt "page:get-started/index.html" msgid "" "On macOS, the build needs Xcode Command Line Tools, make and bison. Use the guide for " "your computer:" msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:1180 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}macOS · Intel{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:1186 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}macOS · Apple Silicon{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:1192 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Linux arm64 · native build instructions{ph1}" msgstr "" #: website/public/get-started/index.html:1200 msgctxt "page:get-started/index.html" msgid "Then check Ghidra and save its paths for your client:" msgstr "" #: website/public/get-started/index.html:1217 msgctxt "page:get-started/index.html" msgid "" "Keep these commands in the same terminal session. Rerun setup after setting the paths," " approve the updated client configuration, then restart your agent." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/get-started/index.html:1222 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "{ph0}Ghidra setup and architecture requirements{ph1} · {ph2}Windows Ghidra guide{ph3}" msgstr "" #: website/public/get-started/index.html:1235 msgctxt "page:get-started/index.html" msgid "IDA · connect an existing installation" msgstr "" #: website/public/get-started/index.html:1236 msgctxt "page:get-started/index.html" msgid "" "Use the IDA provider guide to prepare an upstream MCP registration. Choose an attached" " GUI with the original binary open, or a headless supervisor that opens a private " "database." msgstr "" #: website/public/get-started/index.html:1241 msgctxt "page:get-started/index.html" msgid "" "Verified profiles include the Windows legacy GUI and headless supervisor, plus a macOS" " arm64 headless supervisor with IDA Professional 9.1. The optional native GUI bridge " "has its own version and platform requirements." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: 6.4.0 #: website/public/get-started/index.html:1247 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "The macOS headless profile and native GUI bridge require a {ph0}REA source build{ph1} " "or a release containing those changes. npm {ph2} does not include them." msgstr "" #. {ph0}: node scripts/rea.mjs doctor --provider ida --json #. {ph1}: node scripts/rea.mjs setup #. {ph2}: npx #: website/public/get-started/index.html:1256 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "From the built checkout, run {ph0} and {ph1} instead of the {ph2} commands below." msgstr "" #: website/public/get-started/index.html:1263 msgctxt "page:get-started/index.html" msgid "Prepare the IDA registration file" msgstr "" #. {ph0}: ida-mcp.json #. {ph1}: .txt #: website/public/get-started/index.html:1264 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "Install and configure the upstream server using the IDA guide below. Then save its " "working registration as {ph0} in a text editor. On Windows, choose “All files” when " "saving in Notepad so it doesn't add {ph1}." msgstr "" #. {ph0}: idb_open #. {ph1}: idb_list #. {ph2}: idb_close #: website/public/get-started/index.html:1271 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "For a headless supervisor providing {ph0}, {ph1} and {ph2}, the file can look like " "this:" msgstr "" #. {ph0}: command #. {ph1}: args #. {ph2}: env #: website/public/get-started/index.html:1294 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "For an attached legacy 1.4.0 GUI server, copy its working {ph0}, {ph1} and optional " "{ph2} into the file. Open the original binary in IDA and start its upstream plugin " "before asking REA to inspect it." msgstr "" #: website/public/get-started/index.html:1336 msgctxt "page:get-started/index.html" msgid "" "Use the JSON registration file you prepared with the provider guide, then rerun setup " "and restart your agent." msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:1340 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}IDA profiles, registration examples and verified platforms{ph1}" msgstr "" #: website/public/get-started/index.html:1348 msgctxt "page:get-started/index.html" msgid "" "Once connected, give your agent the original executable's full path and name your " "provider:" msgstr "" #. {ph0}: /absolute/path/to/program #: website/public/get-started/index.html:1353 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "Use REA with my configured provider to inspect {ph0}. List its functions and strings, " "then explain the part that handles user input with references to the code." msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:1360 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Follow a native analysis example{ph1}" msgstr "" #: website/public/get-started/index.html:1365 msgctxt "page:get-started/index.html" msgid "Websites, Android, .NET, firmware and other targets" msgstr "" #: website/public/get-started/index.html:1368 msgctxt "page:get-started/index.html" msgid "" "Open the guide for the target you have. Each guide gives the additional tools, " "supported hosts and first command." msgstr "" #: website/public/get-started/index.html:1376 msgctxt "page:get-started/index.html" msgid "Target" msgstr "" #: website/public/get-started/index.html:1377 msgctxt "page:get-started/index.html" msgid "Tools to prepare" msgstr "" #: website/public/get-started/index.html:1378 msgctxt "page:get-started/index.html" msgid "Guide" msgstr "" #: website/public/get-started/index.html:1383 msgctxt "page:get-started/index.html" msgid "JavaScript / Electron" msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:1385 website/public/get-started/index.html:1390 #: website/public/get-started/index.html:1395 website/public/get-started/index.html:1405 #: website/public/get-started/index.html:1415 website/public/get-started/index.html:1425 #: website/public/get-started/index.html:1435 website/public/get-started/index.html:1445 #: website/public/get-started/index.html:1455 website/public/get-started/index.html:1465 #: website/public/get-started/index.html:1475 website/public/get-started/index.html:1485 #: website/public/get-started/index.html:1495 website/public/get-started/index.html:1505 #: website/public/get-started/index.html:1515 website/public/get-started/index.html:1525 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Open guide{ph1}" msgstr "" #: website/public/get-started/index.html:1388 msgctxt "page:get-started/index.html" msgid "Website" msgstr "" #: website/public/get-started/index.html:1393 msgctxt "page:get-started/index.html" msgid ".NET / Flutter / packages" msgstr "" #: website/public/get-started/index.html:1403 msgctxt "page:get-started/index.html" msgid "Android APK" msgstr "" #: website/public/get-started/index.html:1413 msgctxt "page:get-started/index.html" msgid "Android device" msgstr "" #: website/public/get-started/index.html:1423 msgctxt "page:get-started/index.html" msgid "Android resources" msgstr "" #: website/public/get-started/index.html:1433 msgctxt "page:get-started/index.html" msgid "JEB project" msgstr "" #: website/public/get-started/index.html:1443 msgctxt "page:get-started/index.html" msgid "Firmware" msgstr "" #: website/public/get-started/index.html:1453 msgctxt "page:get-started/index.html" msgid "WASM" msgstr "" #: website/public/get-started/index.html:1463 msgctxt "page:get-started/index.html" msgid "SQLite database" msgstr "" #: website/public/get-started/index.html:1473 msgctxt "page:get-started/index.html" msgid "EVM bytecode" msgstr "" #: website/public/get-started/index.html:1483 msgctxt "page:get-started/index.html" msgid "ELF / Linux crash" msgstr "" #: website/public/get-started/index.html:1493 msgctxt "page:get-started/index.html" msgid "HAR / SAZ / mitmproxy" msgstr "" #: website/public/get-started/index.html:1503 msgctxt "page:get-started/index.html" msgid "PCAP / PCAPNG" msgstr "" #: website/public/get-started/index.html:1513 msgctxt "page:get-started/index.html" msgid "Logic signals" msgstr "" #: website/public/get-started/index.html:1523 msgctxt "page:get-started/index.html" msgid "Process behavior" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #. {ph6}: #. {ph7}: #: website/public/get-started/index.html:1535 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "{ph0}Flutter guide{ph1} · {ph2}Packages and resources{ph3} · {ph4}EVM bytecode{ph5} · " "{ph6}All investigation guides{ph7}" msgstr "" #: website/public/get-started/index.html:1555 msgctxt "page:get-started/index.html" msgid "Use REA from a terminal" msgstr "" #: website/public/get-started/index.html:1557 msgctxt "page:get-started/index.html" msgid "CLI commands, global installation and curl" msgstr "" #: website/public/get-started/index.html:1558 msgctxt "page:get-started/index.html" msgid "" "Analyze a JavaScript or Electron application folder or ASAR archive without running " "the app:" msgstr "" #: website/public/get-started/index.html:1564 msgctxt "page:get-started/index.html" msgid "Static application analysis" msgstr "" #. {ph0}: .asar #. {ph1}: "D:/apps/example" #: website/public/get-started/index.html:1576 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "Replace the path with your extracted app directory or {ph0} file. On Windows, a path " "such as {ph1} works here." msgstr "" #: website/public/get-started/index.html:1582 msgctxt "page:get-started/index.html" msgid "Where do I find an app's .asar file?" msgstr "" #. {ph0}: resources #: website/public/get-started/index.html:1583 #, python-brace-format msgctxt "page:get-started/index.html" msgid "Electron apps usually keep it in a {ph0} folder:" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: C:\Users\<you>\AppData\Local\Programs\<App>\resources\app.asar #: website/public/get-started/index.html:1588 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Windows:{ph1} {ph2}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: /Applications/<App>.app/Contents/Resources/app.asar #. {ph3}: #. {ph4}: #: website/public/get-started/index.html:1594 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "{ph0}macOS:{ph1} {ph2} (right-click the app and choose {ph3}Show Package " "Contents{ph4})" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: /opt/<App>/resources/app.asar #: website/public/get-started/index.html:1602 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Linux:{ph1} often {ph2}" msgstr "" #. {ph0}: app.asar #: website/public/get-started/index.html:1607 #, python-brace-format msgctxt "page:get-started/index.html" msgid "Some apps install elsewhere. Search the app's folder for {ph0}." msgstr "" #: website/public/get-started/index.html:1612 msgctxt "page:get-started/index.html" msgid "" "The result identifies the app, shows connections between modules and gives their " "source locations. Connections REA cannot resolve are marked in the result." msgstr "" #. {ph0}: rea #: website/public/get-started/index.html:1617 #, python-brace-format msgctxt "page:get-started/index.html" msgid "If you'd like a permanent {ph0} command in your shell:" msgstr "" #: website/public/get-started/index.html:1623 msgctxt "page:get-started/index.html" msgid "Install the CLI" msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:1635 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Continue with the JavaScript application guide{ph1}" msgstr "" #. {ph0}: main #: website/public/get-started/index.html:1654 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "Replace {ph0} with a function name or address from the target's function list. Ghidra " "must be configured first." msgstr "" #: website/public/get-started/index.html:1658 msgctxt "page:get-started/index.html" msgid "On macOS or Linux, you can also use the curl installer after preparing Node.js:" msgstr "" #. {ph0}: rea setup #: website/public/get-started/index.html:1676 #, python-brace-format msgctxt "page:get-started/index.html" msgid "Follow the setup prompts to connect your agent. If they don't appear, run {ph0}." msgstr "" #. {ph0}: rea #. {ph1}: "$HOME/.local/bin/rea" setup #: website/public/get-started/index.html:1680 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "If your shell can't find {ph0}, use the executable path printed by the installer. On " "Linux, the default setup command is {ph1}." msgstr "" #: website/public/get-started/index.html:1689 msgctxt "page:get-started/index.html" msgid "Getting help" msgstr "" #: website/public/get-started/index.html:1691 msgctxt "page:get-started/index.html" msgid "If your agent doesn't see REA" msgstr "" #. {ph0}: doctor #: website/public/get-started/index.html:1692 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "Restart or reconnect the client after setup. Check its REA connection with {ph0}; for " "Codex:" msgstr "" #: website/public/get-started/index.html:1696 msgctxt "page:get-started/index.html" msgid "" "Use the client check in step 3 with your setup ID. In editor clients, enable REA in " "MCP settings and allow its tools in the agent chat." msgstr "" #: website/public/get-started/index.html:1703 msgctxt "page:get-started/index.html" msgid "If a provider needs attention" msgstr "" #: website/public/get-started/index.html:1704 msgctxt "page:get-started/index.html" msgid "Check the provider you're using. For Ghidra:" msgstr "" #: website/public/get-started/index.html:1707 msgctxt "page:get-started/index.html" msgid "Check one provider" msgstr "" #: website/public/get-started/index.html:1719 msgctxt "page:get-started/index.html" msgid "The report gives the failed check and a suggested next step." msgstr "" #: website/public/get-started/index.html:1724 msgctxt "page:get-started/index.html" msgid "Windows, WSL and paths with spaces" msgstr "" #: website/public/get-started/index.html:1725 msgctxt "page:get-started/index.html" msgid "" "Use Windows PowerShell for Windows clients and analysis tools. If your agent runs " "inside WSL, install Node.js and REA inside that Linux environment and use Linux paths " "there. Headless providers run on the same host as REA." msgstr "" #: website/public/get-started/index.html:1734 msgctxt "page:get-started/index.html" msgid "Windows setup command:" msgstr "" #: website/public/get-started/index.html:1751 msgctxt "page:get-started/index.html" msgid "Update or remove REA" msgstr "" #: website/public/get-started/index.html:1752 msgctxt "page:get-started/index.html" msgid "" "To refresh your agent connection, run the latest setup command again, review its plan " "and restart your client." msgstr "" #. {ph0}: rea update #. {ph1}: npx rea-agents@latest uninstall #: website/public/get-started/index.html:1770 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "If you installed the global CLI, update it with {ph0}. Use {ph1} to remove REA's " "client configuration and skill." msgstr "" #. {ph0}: #. {ph1}: #: website/public/get-started/index.html:1776 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Update and uninstall details{ph1}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/get-started/index.html:1784 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}REA FAQ{ph1}{ph2}Quick answers on updates, agents and analysis.{ph3}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/get-started/index.html:1788 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "{ph0}Choose an investigation guide{ph1}{ph2}Worked examples for a binary, an Electron " "app and a browser.{ph3}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/get-started/index.html:1795 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "{ph0}GitHub issues{ph1}{ph2}Report a problem with the command and diagnostics.{ph3}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/get-started/index.html:1799 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}REA community{ph1}{ph2}Questions, investigations and work in progress.{ph3}" msgstr "" #: website/public/get-started/index.html:6 msgctxt "page:get-started/index.html" msgid "Install REA and Set Up Your Coding Agent" msgstr "" #: website/public/get-started/index.html:7 msgctxt "page:get-started/index.html" msgid "" "Connect REA to your coding agent or inspect a local JavaScript or Electron app from " "the terminal. Setup, first questions and native provider guides." msgstr "" #: website/public/get-started/index.html:223 msgctxt "page:get-started/index.html" msgid "REA getting started guide" msgstr "" #: website/public/get-started/index.html:269 msgctxt "page:get-started/index.html" msgid "Copy Node.js version check" msgstr "" #: website/public/get-started/index.html:292 msgctxt "page:get-started/index.html" msgid "Copy Node.js installation command for Windows" msgstr "" #: website/public/get-started/index.html:322 msgctxt "page:get-started/index.html" msgid "Copy Windows REA setup command" msgstr "" #: website/public/get-started/index.html:347 msgctxt "page:get-started/index.html" msgid "Copy Homebrew Node.js installation command" msgstr "" #: website/public/get-started/index.html:370 msgctxt "page:get-started/index.html" msgid "Copy fnm installation command for Linux" msgstr "" #: website/public/get-started/index.html:385 msgctxt "page:get-started/index.html" msgid "Copy Node.js 24 commands for Linux" msgstr "" #: website/public/get-started/index.html:419 website/public/get-started/index.html:450 #: website/public/get-started/index.html:464 website/public/get-started/index.html:482 #: website/public/get-started/index.html:534 website/public/get-started/index.html:548 #: website/public/get-started/index.html:580 website/public/get-started/index.html:609 #: website/public/get-started/index.html:744 website/public/get-started/index.html:799 #: website/public/get-started/index.html:814 website/public/get-started/index.html:862 #: website/public/get-started/index.html:1047 website/public/get-started/index.html:1109 #: website/public/get-started/index.html:1132 website/public/get-started/index.html:1156 #: website/public/get-started/index.html:1204 website/public/get-started/index.html:1279 #: website/public/get-started/index.html:1305 website/public/get-started/index.html:1322 #: website/public/get-started/index.html:1643 website/public/get-started/index.html:1665 #: website/public/get-started/index.html:1738 website/public/get-started/index.html:1759 msgctxt "page:get-started/index.html" msgid "Copy command" msgstr "" #: website/public/get-started/index.html:774 msgctxt "page:get-started/index.html" msgid "Copy REA installation prompt" msgstr "" #: website/public/get-started/index.html:895 msgctxt "page:get-started/index.html" msgid "Copy Notes investigation prompt" msgstr "" #: website/public/get-started/index.html:1565 msgctxt "page:get-started/index.html" msgid "Copy JavaScript analysis command" msgstr "" #: website/public/get-started/index.html:1624 msgctxt "page:get-started/index.html" msgid "Copy CLI installation command" msgstr "" #: website/public/get-started/index.html:1708 msgctxt "page:get-started/index.html" msgid "Copy provider diagnosis command" msgstr "" #: website/public/get-started/index.html:1823 msgctxt "page:get-started/index.html" msgid "Back to top" msgstr "" #: website/public/guides/browser/index.html:107 msgctxt "page:guides/browser/index.html" msgid "Skip to content" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/guides/browser/index.html:199 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "{ph0}Home{ph1} / {ph2}Guides{ph3} / Browser observation" msgstr "" #. {ph0}:
#: website/public/guides/browser/index.html:203 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "See what happens{ph0}when you click." msgstr "" #: website/public/guides/browser/index.html:204 msgctxt "page:guides/browser/index.html" msgid "" "Use a small browser app to connect an action, its network request and the JavaScript " "that builds a download." msgstr "" #: website/public/guides/browser/index.html:211 msgctxt "page:guides/browser/index.html" msgid "In this guide" msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/browser/index.html:213 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "{ph0}The example{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/browser/index.html:214 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "{ph0}Open the browser{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/browser/index.html:215 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "{ph0}Ask your agent{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/browser/index.html:216 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "{ph0}Capture from CLI{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/browser/index.html:217 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "{ph0}Read the request and script{ph1}" msgstr "" #: website/public/guides/browser/index.html:222 msgctxt "page:guides/browser/index.html" msgid "What happens when you click Export?" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: notes.json #: website/public/guides/browser/index.html:223 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" "The {ph0}Notes browser example{ph1} has an {ph2}Export notes{ph3} button. Clicking it " "loads {ph4}, formats the two notes as CSV, and starts a download." msgstr "" #: website/public/guides/browser/index.html:231 msgctxt "page:guides/browser/index.html" msgid "From the click to the CSV download" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/guides/browser/index.html:233 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" "{ph0}01 · You{ph1}{ph2}Click Export notes{ph3}{ph4}Perform the action in your browser " "while the capture is running.{ph5}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/guides/browser/index.html:241 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" "{ph0}02 · REA{ph1}{ph2}Record the request{ph3}{ph4}Capture the request URL, response " "status and JSON structure from the selected page.{ph5}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: fetch("./notes.json") #. {ph6}: export.js #. {ph7}: #: website/public/guides/browser/index.html:249 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" "{ph0}03 · Your agent{ph1}{ph2}Read the export code{ph3}{ph4}Connect the observed " "request to {ph5} in {ph6}.{ph7}" msgstr "" #: website/public/guides/browser/index.html:262 msgctxt "page:guides/browser/index.html" msgid "Start the capture before clicking Export notes." msgstr "" #: website/public/guides/browser/index.html:268 msgctxt "page:guides/browser/index.html" msgid "Open Chrome with remote debugging" msgstr "" #: website/public/guides/browser/index.html:269 msgctxt "page:guides/browser/index.html" msgid "" "Open the hosted Notes example with a separate browser profile and a local debugging " "port. On Linux:" msgstr "" #: website/public/guides/browser/index.html:275 msgctxt "page:guides/browser/index.html" msgid "Start the example browser" msgstr "" #: website/public/guides/browser/index.html:276 #: website/public/guides/browser/index.html:308 #: website/public/guides/browser/index.html:342 #: website/public/guides/browser/index.html:361 #: website/public/guides/browser/index.html:426 msgctxt "page:guides/browser/index.html" msgid "Copy" msgstr "" #: website/public/guides/browser/index.html:290 msgctxt "page:guides/browser/index.html" msgid "" "Use your installed browser's executable path on macOS or Windows. You can replace the " "page URL with another page you want to inspect." msgstr "" #: website/public/guides/browser/index.html:295 msgctxt "page:guides/browser/index.html" msgid "" "REA connects to this existing browser. You keep control of the page, perform the " "action, and close the browser when finished." msgstr "" #: website/public/guides/browser/index.html:301 msgctxt "page:guides/browser/index.html" msgid "Ask your agent to watch one action" msgstr "" #. {ph0}: #: website/public/guides/browser/index.html:304 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" msgstr "" #. {ph0}: #. {ph2}: #. {ph3}: #. {ph4}: #: website/public/guides/browser/index.html:317 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" "{ph0}›{ph1}{ph2}Use REA to inspect this page while I click Export notes. What request " "does it make, and how is the CSV built?{ph3}{ph4}{ph5}" msgstr "" #. {ph0}: http://127.0.0.1:9222 #: website/public/guides/browser/index.html:325 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" "Example prompt. Give your agent the debugging endpoint, {ph0}, and the page URL. Let " "it start the capture before you click." msgstr "" #: website/public/guides/browser/index.html:330 msgctxt "page:guides/browser/index.html" msgid "" "Your agent discovers the page target, starts an observation window, and reads the " "resulting evidence. It can then inspect the script behind the export." msgstr "" #: website/public/guides/browser/index.html:337 msgctxt "page:guides/browser/index.html" msgid "Or capture from the terminal" msgstr "" #: website/public/guides/browser/index.html:338 msgctxt "page:guides/browser/index.html" msgid "Find the page's target ID:" msgstr "" #: website/public/guides/browser/index.html:341 msgctxt "page:guides/browser/index.html" msgid "Find the page" msgstr "" #. {ph0}: TARGET_ID #: website/public/guides/browser/index.html:354 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" "Choose the target with the Notes example URL. Replace {ph0} below with its ID, then " "run:" msgstr "" #: website/public/guides/browser/index.html:360 msgctxt "page:guides/browser/index.html" msgid "Capture the next ten seconds" msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/browser/index.html:376 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" "Let the command connect for a few seconds, then click {ph0}Export notes{ph1} in that " "browser. The result arrives after the observation window ends." msgstr "" #: website/public/guides/browser/index.html:381 msgctxt "page:guides/browser/index.html" msgid "" "The captured result includes the selected page, network activity during that window, " "and the shape of the JSON response. Earlier requests are outside this capture." msgstr "" #: website/public/guides/browser/index.html:388 msgctxt "page:guides/browser/index.html" msgid "Read the request and export script" msgstr "" #: website/public/guides/browser/index.html:391 msgctxt "page:guides/browser/index.html" msgid "Recorded with REA 4.1.0 on the local Notes example" msgstr "" #: website/public/guides/browser/index.html:396 msgctxt "page:guides/browser/index.html" msgid "Captured fact" msgstr "" #: website/public/guides/browser/index.html:397 msgctxt "page:guides/browser/index.html" msgid "Value" msgstr "" #: website/public/guides/browser/index.html:402 msgctxt "page:guides/browser/index.html" msgid "Request" msgstr "" #: website/public/guides/browser/index.html:406 msgctxt "page:guides/browser/index.html" msgid "Response" msgstr "" #: website/public/guides/browser/index.html:410 msgctxt "page:guides/browser/index.html" msgid "Request initiator" msgstr "" #. {ph0}: export.js #: website/public/guides/browser/index.html:411 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "{ph0} · script" msgstr "" #: website/public/guides/browser/index.html:414 msgctxt "page:guides/browser/index.html" msgid "Response structure" msgstr "" #. {ph0}: notes[] #. {ph1}: id #. {ph2}: title #: website/public/guides/browser/index.html:415 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "{ph0} with {ph1} and {ph2} fields" msgstr "" #: website/public/guides/browser/index.html:425 msgctxt "page:guides/browser/index.html" msgid "Read the loaded scripts" msgstr "" #. {ph0}: export.js #: website/public/guides/browser/index.html:439 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" "The request identifies the data source, and REA records {ph0} as its initiator. Read " "the captured script source to see how the data is used:" msgstr "" #. {ph0}: export.js #: website/public/guides/browser/index.html:446 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "{ph0} · example source excerpt" msgstr "" #. {ph0}: notes.json #: website/public/guides/browser/index.html:459 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" "The download is constructed in the page using the JSON response. The CSV formatting " "step comes from the script; the network capture establishes that this click requested " "{ph0}." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: export.js #. {ph4}: #. {ph5}: #. {ph6}: notes.json #. {ph7}: #: website/public/guides/browser/index.html:464 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "{ph0}Open the example{ph1} · {ph2}Download {ph3}{ph4} · {ph5}Download {ph6}{ph7}" msgstr "" #. {ph0}: notes.json #: website/public/guides/browser/index.html:475 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" "Find the script that requests {ph0}. How does it escape titles containing commas or " "quotation marks?" msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/browser/index.html:480 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" "For an installed JavaScript or Electron app, continue with the {ph0}application " "workflow{ph1} to follow files and process boundaries." msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/browser/index.html:485 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" "For HTTP request and response bodies, use {ph0}Fiddler Everywhere: SAZ captures, MCP " "and public skills{ph1}. Export SAZ or HAR 1.2 for offline REA capture Evidence, or " "connect Everywhere's MCP server to inspect captured traffic with your agent." msgstr "" #: website/public/guides/browser/index.html:6 msgctxt "page:guides/browser/index.html" msgid "Browser and Network Analysis — REA" msgstr "" #: website/public/guides/browser/index.html:7 msgctxt "page:guides/browser/index.html" msgid "" "Observe a Notes export with REA: select a browser page, capture a click, inspect the " "request and follow the export script." msgstr "" #: website/public/guides/browser/index.html:210 msgctxt "page:guides/browser/index.html" msgid "On this page" msgstr "" #: website/public/guides/browser/index.html:220 msgctxt "page:guides/browser/index.html" msgid "Browser observation" msgstr "" #: website/public/guides/browser/index.html:276 msgctxt "page:guides/browser/index.html" msgid "Copy start the example browser" msgstr "" #: website/public/guides/browser/index.html:308 msgctxt "page:guides/browser/index.html" msgid "Copy example prompt" msgstr "" #: website/public/guides/browser/index.html:342 msgctxt "page:guides/browser/index.html" msgid "Copy find the page" msgstr "" #: website/public/guides/browser/index.html:361 msgctxt "page:guides/browser/index.html" msgid "Copy capture the next ten seconds" msgstr "" #: website/public/guides/browser/index.html:426 msgctxt "page:guides/browser/index.html" msgid "Copy read the loaded scripts" msgstr "" #: website/public/guides/browser/index.html:513 msgctxt "page:guides/browser/index.html" msgid "Back to top" msgstr "" #: website/public/guides/index.html:107 msgctxt "page:guides/index.html" msgid "Skip to content" msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/index.html:199 #, python-brace-format msgctxt "page:guides/index.html" msgid "{ph0}Home{ph1} / Guides" msgstr "" #: website/public/guides/index.html:200 msgctxt "page:guides/index.html" msgid "REA guides." msgstr "" #: website/public/guides/index.html:201 msgctxt "page:guides/index.html" msgid "" "Analyze a native function, an Electron export or a browser request. Each guide " "includes a prompt, code and results." msgstr "" #: website/public/guides/index.html:208 msgctxt "page:guides/index.html" msgid "First investigation" msgstr "" #: website/public/guides/index.html:210 msgctxt "page:guides/index.html" msgid "Set up REA" msgstr "" #: website/public/guides/index.html:211 msgctxt "page:guides/index.html" msgid "Connect your coding agent or use REA from the terminal." msgstr "" #: website/public/guides/index.html:212 msgctxt "page:guides/index.html" msgid "Get started with REA" msgstr "" #: website/public/guides/index.html:216 msgctxt "page:guides/index.html" msgid "Native binaries" msgstr "" #: website/public/guides/index.html:218 msgctxt "page:guides/index.html" msgid "Recover a sound-pan calculation" msgstr "" #: website/public/guides/index.html:219 msgctxt "page:guides/index.html" msgid "" "Start with a Windows game executable. Inspect instructions, follow a caller, read " "numeric constants and check the recovered C." msgstr "" #: website/public/guides/index.html:224 msgctxt "page:guides/index.html" msgid "Instructions" msgstr "" #: website/public/guides/index.html:225 msgctxt "page:guides/index.html" msgid "Caller" msgstr "" #: website/public/guides/index.html:226 msgctxt "page:guides/index.html" msgid "Constants" msgstr "" #: website/public/guides/index.html:227 msgctxt "page:guides/index.html" msgid "C function" msgstr "" #: website/public/guides/index.html:229 msgctxt "page:guides/index.html" msgid "Native analysis guide" msgstr "" #: website/public/guides/index.html:233 msgctxt "page:guides/index.html" msgid "JavaScript & Electron" msgstr "" #: website/public/guides/index.html:235 msgctxt "page:guides/index.html" msgid "Follow a CSV export" msgstr "" #: website/public/guides/index.html:236 msgctxt "page:guides/index.html" msgid "" "A small Notes app spreads one feature across the renderer, preload and main process. " "Use REA to connect the API, IPC channel and file writer." msgstr "" #: website/public/guides/index.html:242 msgctxt "page:guides/index.html" msgid "Button" msgstr "" #: website/public/guides/index.html:243 msgctxt "page:guides/index.html" msgid "Preload API" msgstr "" #: website/public/guides/index.html:244 msgctxt "page:guides/index.html" msgid "IPC" msgstr "" #: website/public/guides/index.html:244 msgctxt "page:guides/index.html" msgid "CSV file" msgstr "" #: website/public/guides/index.html:246 msgctxt "page:guides/index.html" msgid "JavaScript & Electron guide" msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/index.html:249 #, python-brace-format msgctxt "page:guides/index.html" msgid "For a larger packaged app, follow {ph0}Notion's clipboard bridge{ph1}." msgstr "" #: website/public/guides/index.html:256 msgctxt "page:guides/index.html" msgid "Browser behavior" msgstr "" #: website/public/guides/index.html:258 msgctxt "page:guides/index.html" msgid "Observe a click" msgstr "" #: website/public/guides/index.html:259 msgctxt "page:guides/index.html" msgid "" "Open a working Notes example, capture an export request and find the code that turns " "its response into a download." msgstr "" #: website/public/guides/index.html:264 msgctxt "page:guides/index.html" msgid "Your click" msgstr "" #: website/public/guides/index.html:265 msgctxt "page:guides/index.html" msgid "Captured request" msgstr "" #: website/public/guides/index.html:266 msgctxt "page:guides/index.html" msgid "Export script" msgstr "" #: website/public/guides/index.html:268 msgctxt "page:guides/index.html" msgid "Browser observation guide" msgstr "" #: website/public/guides/index.html:6 msgctxt "page:guides/index.html" msgid "Reverse Engineering Guides — REA" msgstr "" #: website/public/guides/index.html:7 msgctxt "page:guides/index.html" msgid "" "Learn REA through short worked examples: a native calculation, an Electron CSV export " "and a browser request." msgstr "" #: website/public/guides/index.html:288 msgctxt "page:guides/index.html" msgid "Back to top" msgstr "" #: website/public/guides/javascript/index.html:107 msgctxt "page:guides/javascript/index.html" msgid "Skip to content" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/guides/javascript/index.html:199 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "{ph0}Home{ph1} / {ph2}Guides{ph3} / JavaScript & Electron" msgstr "" #. {ph0}:
#: website/public/guides/javascript/index.html:203 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "Trace an Electron{ph0}CSV export." msgstr "" #: website/public/guides/javascript/index.html:204 msgctxt "page:guides/javascript/index.html" msgid "" "Follow a button click from the page API, through Electron IPC, to the CSV file writer." msgstr "" #: website/public/guides/javascript/index.html:211 msgctxt "page:guides/javascript/index.html" msgid "In this guide" msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/javascript/index.html:213 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "{ph0}The example{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/javascript/index.html:214 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "{ph0}Ask your agent{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/javascript/index.html:215 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "{ph0}Trace the export code{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/javascript/index.html:216 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "{ph0}Try the example{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/javascript/index.html:217 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "{ph0}Inspect the CSV writer{ph1}" msgstr "" #: website/public/guides/javascript/index.html:222 msgctxt "page:guides/javascript/index.html" msgid "Where does “Export notes” go?" msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/javascript/index.html:223 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" "This guide uses a small Electron app. Clicking {ph0}Export notes{ph1} calls an API in " "the page, crosses into the main process, and writes a CSV. The behavior is spread " "across several files." msgstr "" #: website/public/guides/javascript/index.html:230 msgctxt "page:guides/javascript/index.html" msgid "The CSV export across Electron processes" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: notes.exportCsv() #. {ph4}: #. {ph5}: #. {ph6}: renderer.js #. {ph7}: preload.js #. {ph8}: #: website/public/guides/javascript/index.html:234 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" "{ph0}Renderer → preload{ph1}{ph2}{ph3}{ph4}{ph5}{ph6} calls the API exposed by " "{ph7}.{ph8}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: notes:export #. {ph4}: #. {ph5}: #. {ph6}: #: website/public/guides/javascript/index.html:242 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" "{ph0}Between processes{ph1}{ph2}{ph3}{ph4}{ph5}The preload invokes an IPC channel: a " "named message to the main process.{ph6}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: main.js #. {ph6}: #: website/public/guides/javascript/index.html:250 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" "{ph0}Main process{ph1}{ph2}An export handler{ph3}{ph4}{ph5} handles that channel and " "calls the CSV writer.{ph6}" msgstr "" #. {ph0}: csv.js #. {ph1}: main.js #. {ph2}: downloads/notes.csv #: website/public/guides/javascript/index.html:259 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "{ph0} formats the notes → {ph1} writes {ph2}." msgstr "" #: website/public/guides/javascript/index.html:263 msgctxt "page:guides/javascript/index.html" msgid "" "REA matches the literal IPC call to its handler and identifies the exposed API. The " "path is inferred from code; a runtime capture can check what executes." msgstr "" #: website/public/guides/javascript/index.html:271 msgctxt "page:guides/javascript/index.html" msgid "Ask about the CSV export" msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/javascript/index.html:272 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "{ph0}Connect your agent to REA{ph1} and give it the app directory or ASAR file:" msgstr "" #. {ph0}: #: website/public/guides/javascript/index.html:278 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" msgstr "" #: website/public/guides/javascript/index.html:282 #: website/public/guides/javascript/index.html:431 msgctxt "page:guides/javascript/index.html" msgid "Copy" msgstr "" #. {ph0}: #. {ph2}: #. {ph3}: #. {ph4}: #: website/public/guides/javascript/index.html:291 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" "{ph0}›{ph1}{ph2}Use REA to find what happens when I export notes in this app. Where is" " the CSV created?{ph3}{ph4}{ph5}" msgstr "" #. {ph0}: app.asar #: website/public/guides/javascript/index.html:299 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "Example prompt. Include the absolute path to the application folder or {ph0}." msgstr "" #: website/public/guides/javascript/index.html:303 msgctxt "page:guides/javascript/index.html" msgid "" "REA reads the application files and builds a map of entrypoints, modules and process " "boundaries. Your agent uses that map to narrow the investigation to the export " "feature." msgstr "" #: website/public/guides/javascript/index.html:310 msgctxt "page:guides/javascript/index.html" msgid "Trace the export code" msgstr "" #: website/public/guides/javascript/index.html:311 msgctxt "page:guides/javascript/index.html" msgid "The page calls a small API" msgstr "" #. {ph0}: renderer.js #: website/public/guides/javascript/index.html:314 #: website/public/guides/javascript/index.html:330 #: website/public/guides/javascript/index.html:345 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "{ph0} · example source" msgstr "" #: website/public/guides/javascript/index.html:324 msgctxt "page:guides/javascript/index.html" msgid "" "The page knows the method name. The implementation lives in the preload, which exposes" " it to the renderer." msgstr "" #. {ph0}: notes.exportCsv #. {ph1}: notes:export #: website/public/guides/javascript/index.html:338 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" "REA records {ph0} and the literal channel {ph1}. It pairs that invocation with the " "single matching handler in the main process." msgstr "" #. {ph0}: csv.js #. {ph1}: notes.csv #: website/public/guides/javascript/index.html:355 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" "Reading the handler answers the original question: {ph0} formats the notes, and the " "main process writes {ph1} into the user's Downloads folder." msgstr "" #: website/public/guides/javascript/index.html:362 msgctxt "page:guides/javascript/index.html" msgid "REA result · summary.ipc excerpt" msgstr "" #: website/public/guides/javascript/index.html:372 msgctxt "page:guides/javascript/index.html" msgid "" "Recorded by REA 4.1.0 on the downloadable example below. Source locations accompany " "the API, channel and handler findings." msgstr "" #: website/public/guides/javascript/index.html:378 msgctxt "page:guides/javascript/index.html" msgid "Analyze the example yourself" msgstr "" #. {ph0}: notes-example #. {ph1}: Node.js #: website/public/guides/javascript/index.html:379 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" "Download the example and unzip it. The archive contains the complete {ph0} folder. " "Analyze it with {ph1} and npm; Electron is not needed for this example." msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/javascript/index.html:385 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "{ph0}Download example ZIP{ph1}" msgstr "" #: website/public/guides/javascript/index.html:394 msgctxt "page:guides/javascript/index.html" msgid "Browse the six source files" msgstr "" #: website/public/guides/javascript/index.html:430 msgctxt "page:guides/javascript/index.html" msgid "Static application analysis" msgstr "" #. {ph0}: normalized_result.summary.ipc #. {ph1}: normalized_result.graph #: website/public/guides/javascript/index.html:443 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" "Replace the path with the folder you unzipped. You should find one IPC channel and one" " matching handler in {ph0}. Source locations are in {ph1}." msgstr "" #: website/public/guides/javascript/index.html:449 msgctxt "page:guides/javascript/index.html" msgid "" "For your own app, use the same command with its directory or ASAR path. An agent can " "follow a literal string, API name or IPC channel with REA's feature tracing tools." msgstr "" #: website/public/guides/javascript/index.html:456 msgctxt "page:guides/javascript/index.html" msgid "Inspect the CSV writer" msgstr "" #. {ph0}: notes:export #: website/public/guides/javascript/index.html:458 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" "Follow {ph0} to its handler. Which inputs reach the CSV writer, and what happens if " "writing the file fails?" msgstr "" #: website/public/guides/javascript/index.html:464 msgctxt "page:guides/javascript/index.html" msgid "" "Use the source locations to inspect those details. Computed channel names and " "ambiguous handlers can remain unresolved; runtime observations give you another way to" " investigate them." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/guides/javascript/index.html:470 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" "{ph0}Follow Notion's clipboard bridge{ph1} {ph2}Apply the same approach to a packaged " "Electron app.{ph3}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/guides/javascript/index.html:476 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" "{ph0}Observe a browser export{ph1}{ph2}Capture a real click and see which request it " "makes.{ph3}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/guides/javascript/index.html:482 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" "{ph0}Follow a native function{ph1}{ph2}Continue into a binary when a feature depends " "on native code.{ph3}" msgstr "" #: website/public/guides/javascript/index.html:6 msgctxt "page:guides/javascript/index.html" msgid "JavaScript and Electron Analysis — REA" msgstr "" #: website/public/guides/javascript/index.html:7 msgctxt "page:guides/javascript/index.html" msgid "" "Trace a Notes CSV export through a renderer API, preload and IPC handler with REA. " "Includes downloadable example files and a verified analysis result." msgstr "" #: website/public/guides/javascript/index.html:210 msgctxt "page:guides/javascript/index.html" msgid "On this page" msgstr "" #: website/public/guides/javascript/index.html:220 msgctxt "page:guides/javascript/index.html" msgid "JavaScript & Electron" msgstr "" #: website/public/guides/javascript/index.html:282 msgctxt "page:guides/javascript/index.html" msgid "Copy example prompt" msgstr "" #: website/public/guides/javascript/index.html:431 msgctxt "page:guides/javascript/index.html" msgid "Copy static application analysis" msgstr "" #: website/public/guides/javascript/index.html:509 msgctxt "page:guides/javascript/index.html" msgid "Back to top" msgstr "" #: website/public/guides/native/index.html:107 msgctxt "page:guides/native/index.html" msgid "Skip to content" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/guides/native/index.html:199 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "{ph0}Home{ph1} / {ph2}Guides{ph3} / Native analysis" msgstr "" #. {ph0}:
#: website/public/guides/native/index.html:202 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "Recover DX-Ball's{ph0}sound-pan calculation." msgstr "" #: website/public/guides/native/index.html:203 msgctxt "page:guides/native/index.html" msgid "" "Inspect the original instructions, identify the input and constants, then check the " "recovered C." msgstr "" #: website/public/guides/native/index.html:210 msgctxt "page:guides/native/index.html" msgid "In this guide" msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/native/index.html:212 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "{ph0}The example{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/native/index.html:213 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "{ph0}Ask your agent{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/native/index.html:214 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "{ph0}Read the REA results{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/native/index.html:215 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "{ph0}Recover and check{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/native/index.html:216 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "{ph0}Use your own binary{ph1}" msgstr "" #: website/public/guides/native/index.html:221 msgctxt "page:guides/native/index.html" msgid "Calculate left/right sound panning" msgstr "" #: website/public/guides/native/index.html:222 msgctxt "page:guides/native/index.html" msgid "" "In DX-Ball, a brick hit supplies a horizontal screen position. The sound code turns it" " into a left/right panning value." msgstr "" #. {ph0}: 0x00406400 #. {ph1}: __ftol() #: website/public/guides/native/index.html:226 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" "The starting function, {ph0}, has a short decompiler result: a call to {ph1}. REA also" " returns its instructions and callers, which give the agent a way to investigate the " "missing arithmetic." msgstr "" #: website/public/guides/native/index.html:233 msgctxt "page:guides/native/index.html" msgid "New to these terms?" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: MOV #. {ph3}: ADD #: website/public/guides/native/index.html:235 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" "{ph0}Instructions:{ph1} the steps the processor runs, shown in readable form such as " "{ph2} or {ph3}." msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/native/index.html:240 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" "{ph0}Decompiler result / pseudocode:{ph1} an analysis tool's attempt to turn " "instructions back into C-like code. It can miss parts, as in this example." msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/native/index.html:245 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" "{ph0}Caller:{ph1} a function that calls this one. It shows which values are passed in." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: 0x00406400 #: website/public/guides/native/index.html:249 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" "{ph0}Address:{ph1} a location in the program, written in hexadecimal, such as {ph2}." msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/native/index.html:253 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" "{ph0}Constants:{ph1} fixed numbers stored in the program, read as raw bytes and " "decoded." msgstr "" #: website/public/guides/native/index.html:260 msgctxt "page:guides/native/index.html" msgid "Three pieces of evidence, one calculation" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/guides/native/index.html:264 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" "{ph0}01 · Instructions{ph1}{ph2}An integer input{ph3}{ph4}A stack read supplies the " "value used by the floating-point instructions.{ph5}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: 20 + 30 × tile_x #. {ph6}: #: website/public/guides/native/index.html:272 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" "{ph0}02 · Caller{ph1}{ph2}A screen coordinate{ph3}{ph4}The brick-hit caller passes " "{ph5}.{ph6}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: 1.5625 #. {ph6}: 500.0 #. {ph7}: #: website/public/guides/native/index.html:280 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" "{ph0}03 · Data bytes{ph1}{ph2}The numeric constants{ph3}{ph4}Referenced bytes decode " "to {ph5}, {ph6} and a scale value.{ph7}" msgstr "" #: website/public/guides/native/index.html:292 msgctxt "page:guides/native/index.html" msgid "" "REA supplies the instructions, call relationship and bytes. The agent interprets them " "together." msgstr "" #: website/public/guides/native/index.html:299 msgctxt "page:guides/native/index.html" msgid "Ask about the behavior" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/guides/native/index.html:300 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" "After {ph0}connecting REA to your agent{ph1} and {ph2}setting up a native analysis " "tool{ph3}, provide the local executable and a question:" msgstr "" #: website/public/guides/native/index.html:311 msgctxt "page:guides/native/index.html" msgid "Which analysis tool should I use?" msgstr "" #: website/public/guides/native/index.html:312 msgctxt "page:guides/native/index.html" msgid "REA needs one of these to read native programs:" msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/native/index.html:314 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" "{ph0}Hopper{ph1} (macOS or Linux): REA's setup detects it or offers to install it. On " "macOS, open Hopper once and choose demo mode or activate a license before your first " "analysis." msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/native/index.html:320 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" "{ph0}Ghidra{ph1} (macOS or Linux; experimental on Windows): free, but needs an " "existing Ghidra 12.1.x installation and a 64-bit JDK 21 or newer." msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/native/index.html:325 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "{ph0}IDA{ph1} (Windows): for an existing IDA setup with an MCP registration." msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/native/index.html:330 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "See {ph0}Set up native analysis{ph1} for the steps." msgstr "" #. {ph0}: #: website/public/guides/native/index.html:338 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" msgstr "" #: website/public/guides/native/index.html:342 #: website/public/guides/native/index.html:473 msgctxt "page:guides/native/index.html" msgid "Copy" msgstr "" #. {ph0}: #. {ph2}: #. {ph3}: #. {ph4}: #: website/public/guides/native/index.html:351 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" "{ph0}›{ph1}{ph2}Use REA to find how DX-Ball calculates sound panning. Explain the " "calculation and show the code.{ph3}{ph4}{ph5}" msgstr "" #: website/public/guides/native/index.html:359 msgctxt "page:guides/native/index.html" msgid "" "Example prompt. Give your agent the path to your local DX-Ball 1.07 executable. REA " "doesn't include DX-Ball, so use your own copy, or ask the same kind of question about " "another small Windows program you have." msgstr "" #: website/public/guides/native/index.html:366 msgctxt "page:guides/native/index.html" msgid "How do I get a file's full path?" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/guides/native/index.html:368 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" "{ph0}Windows:{ph1} in File Explorer, right-click the file and choose {ph2}Copy as " "path{ph3}. On Windows 10, hold Shift while right-clicking." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/guides/native/index.html:373 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" "{ph0}macOS:{ph1} in Finder, right-click the file, hold Option and choose {ph2}Copy " "\"…\" as Pathname{ph3}." msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/native/index.html:377 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "{ph0}Any system:{ph1} drag the file into a terminal window and its path appears." msgstr "" #: website/public/guides/native/index.html:385 msgctxt "page:guides/native/index.html" msgid "Read the REA results" msgstr "" #: website/public/guides/native/index.html:386 msgctxt "page:guides/native/index.html" msgid "Read the input" msgstr "" #: website/public/guides/native/index.html:389 msgctxt "page:guides/native/index.html" msgid "REA instruction excerpt · 0x406409" msgstr "" #: website/public/guides/native/index.html:395 msgctxt "page:guides/native/index.html" msgid "" "The instructions load an integer argument and convert it for floating-point " "arithmetic. This is the input absent from the first pseudocode view." msgstr "" #: website/public/guides/native/index.html:400 msgctxt "page:guides/native/index.html" msgid "Follow the caller" msgstr "" #: website/public/guides/native/index.html:403 msgctxt "page:guides/native/index.html" msgid "REA caller excerpt · 0x411f5b" msgstr "" #. {ph0}: 0x14 #: website/public/guides/native/index.html:409 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" "REA identifies the brick-hit caller. Its earlier instructions multiply the tile " "coordinate by 30; adding {ph0} (20) gives the brick's screen position." msgstr "" #: website/public/guides/native/index.html:414 msgctxt "page:guides/native/index.html" msgid "Read the referenced constants" msgstr "" #: website/public/guides/native/index.html:417 msgctxt "page:guides/native/index.html" msgid "REA byte results · interpreted as little-endian doubles" msgstr "" #: website/public/guides/native/index.html:425 msgctxt "page:guides/native/index.html" msgid "" "The arithmetic references these addresses. Reading the bytes supplies the actual " "values; the instruction order tells the agent how they are used." msgstr "" #: website/public/guides/native/index.html:432 msgctxt "page:guides/native/index.html" msgid "Write and check the recovered function" msgstr "" #: website/public/guides/native/index.html:434 msgctxt "page:guides/native/index.html" msgid "Recovered C · excerpt" msgstr "" #: website/public/guides/native/index.html:441 msgctxt "page:guides/native/index.html" msgid "" "With a scale of 1.0, screen positions 0, 320 and 640 map to −500, 0 and 500 before " "integer conversion. The calculation puts the center of the screen at the center of the" " stereo field." msgstr "" #: website/public/guides/native/index.html:446 msgctxt "page:guides/native/index.html" msgid "" "The agent used REA's findings to write the C. Separate checks compared 3,205 inputs " "against the original x86 function and reproduced all 63 compiled bytes of the complete" " function." msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/native/index.html:451 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "{ph0}See the full investigation and assembly-to-C comparison{ph1}" msgstr "" #: website/public/guides/native/index.html:458 msgctxt "page:guides/native/index.html" msgid "Try it with your own binary" msgstr "" #. {ph0}: #. {ph1}: #: website/public/guides/native/index.html:459 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" "{ph0}Connect a native analysis provider{ph1}, then give your agent a local executable " "or library and a feature to investigate. Useful starting questions include “How is " "this file parsed?” or “Which function handles this menu action?”" msgstr "" #: website/public/guides/native/index.html:466 msgctxt "page:guides/native/index.html" msgid "" "If you already know a function name or address, you can query it from the terminal. " "For a configured Ghidra installation:" msgstr "" #: website/public/guides/native/index.html:472 msgctxt "page:guides/native/index.html" msgid "Function analysis" msgstr "" #. {ph0}: main #: website/public/guides/native/index.html:485 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" "Replace the target path and {ph0} with your own function name or address. Each CLI " "invocation imports and analyzes the binary, then closes its session. Your agent's MCP " "queries reuse the imported binary while that session is open." msgstr "" #: website/public/guides/native/index.html:491 msgctxt "page:guides/native/index.html" msgid "" "Read the pseudocode alongside instructions and references. When a result leaves a call" " or value unresolved, use that location as the next question." msgstr "" #: website/public/guides/native/index.html:6 msgctxt "page:guides/native/index.html" msgid "Native Binary Analysis — REA" msgstr "" #: website/public/guides/native/index.html:7 msgctxt "page:guides/native/index.html" msgid "" "Recover a native calculation with REA: inspect instructions, follow a caller, read " "constants and check reconstructed C." msgstr "" #: website/public/guides/native/index.html:209 msgctxt "page:guides/native/index.html" msgid "On this page" msgstr "" #: website/public/guides/native/index.html:219 msgctxt "page:guides/native/index.html" msgid "Native analysis" msgstr "" #: website/public/guides/native/index.html:342 msgctxt "page:guides/native/index.html" msgid "Copy example prompt" msgstr "" #: website/public/guides/native/index.html:473 msgctxt "page:guides/native/index.html" msgid "Copy function analysis" msgstr "" #: website/public/guides/native/index.html:515 msgctxt "page:guides/native/index.html" msgid "Back to top" msgstr "" #: website/public/index.html:109 msgctxt "page:index.html" msgid "Skip to content" msgstr "" #: website/public/index.html:201 website/public/index.html:211 #: website/public/index.html:209 msgctxt "page:index.html" msgid "On this page" msgstr "" #: website/public/index.html:202 website/public/index.html:250 msgctxt "page:index.html" msgid "Set up REA" msgstr "" #. {ph0}: #. {ph1}: #: website/public/index.html:213 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Set up REA{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/index.html:214 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}How it works{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/index.html:215 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Dinosaur game{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/index.html:216 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Calculator{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/index.html:217 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Showcases{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/index.html:218 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Try REA{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/index.html:219 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Go deeper{ph1}" msgstr "" #: website/public/index.html:228 msgctxt "page:index.html" msgid "Reverse engineering, with your coding agent" msgstr "" #. {ph0}:
#: website/public/index.html:229 #, python-brace-format msgctxt "page:index.html" msgid "Find out how{ph0}software works." msgstr "" #: website/public/index.html:230 msgctxt "page:index.html" msgid "" "Ask your coding agent about an app, a game or a website. REA gives it the tools to " "inspect the code behind the answer." msgstr "" #: website/public/index.html:235 msgctxt "page:index.html" msgid "Get started" msgstr "" #: website/public/index.html:236 msgctxt "page:index.html" msgid "See an example ↓" msgstr "" #. {ph0}: #. {ph1}: #: website/public/index.html:239 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Showcases →{ph1} — investigations and interactive demos." msgstr "" #. {ph0}: #. {ph1}: #: website/public/index.html:243 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Blog →{ph1} — methods and reconstruction notes." msgstr "" #: website/public/index.html:251 msgctxt "page:index.html" msgid "Copy this into your coding agent:" msgstr "" #. {ph0}: #: website/public/index.html:254 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" msgstr "" #: website/public/index.html:259 website/public/index.html:283 #: website/public/index.html:519 website/public/index.html:600 #: website/public/index.html:824 website/public/index.html:1136 #: website/public/index.html:1164 msgctxt "page:index.html" msgid "Copy" msgstr "" #. {ph0}: #. {ph2}: #. {ph3}: npx rea-agents@latest setup #. {ph4}: #. {ph5}: #: website/public/index.html:268 #, python-brace-format msgctxt "page:index.html" msgid "" "{ph0}›{ph1}{ph2}Install REA and connect it to this coding agent using {ph3}. Show me " "the setup plan for approval, then verify the installation.{ph4}{ph5}{ph6}" msgstr "" #: website/public/index.html:280 msgctxt "page:index.html" msgid "Or run this in your terminal:" msgstr "" #: website/public/index.html:292 msgctxt "page:index.html" msgid "Approve the setup plan, then restart your agent." msgstr "" #: website/public/index.html:296 msgctxt "page:index.html" msgid "Setup for your platform:" msgstr "" #. {ph0}: #. {ph1}: curl #. {ph2}: #: website/public/index.html:307 #, python-brace-format msgctxt "page:index.html" msgid "Other install options: {ph0}{ph1} →{ph2}" msgstr "" #. {ph0}: Node.js #. {ph1}: #. {ph2}: #: website/public/index.html:313 #, python-brace-format msgctxt "page:index.html" msgid "" "First time, or missing {ph0} or a coding agent? {ph1}Follow the step-by-step setup " "guide →{ph2}" msgstr "" #: website/public/index.html:326 msgctxt "page:index.html" msgid "How it works" msgstr "" #: website/public/index.html:328 msgctxt "page:index.html" msgid "" "Reverse engineering means learning how software works by inspecting the program " "itself. With REA, your agent can follow the code, explain a feature and help you " "rebuild it." msgstr "" #: website/public/index.html:335 msgctxt "page:index.html" msgid "Ask about one feature" msgstr "" #: website/public/index.html:336 msgctxt "page:index.html" msgid "Give your agent a program or page and a question." msgstr "" #: website/public/index.html:339 msgctxt "page:index.html" msgid "Inspect the program" msgstr "" #: website/public/index.html:340 msgctxt "page:index.html" msgid "REA returns code, references and runtime observations." msgstr "" #: website/public/index.html:343 msgctxt "page:index.html" msgid "Explain it, then try a change" msgstr "" #: website/public/index.html:344 msgctxt "page:index.html" msgid "Your agent uses the findings to explain or rebuild the feature." msgstr "" #: website/public/index.html:350 msgctxt "page:index.html" msgid "See the full Calculator investigation" msgstr "" #. {ph0}: 200 + 10% #: website/public/index.html:351 #, python-brace-format msgctxt "page:index.html" msgid "Why does Calculator give 220 for {ph0}?" msgstr "" #: website/public/index.html:360 msgctxt "page:index.html" msgid "Follow the instructions step by step" msgstr "" #. {ph0}: #. {ph1}: #: website/public/index.html:368 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}01{ph1} Decode branches" msgstr "" #. {ph0}: #. {ph1}: #: website/public/index.html:376 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}02{ph1} Trace calls" msgstr "" #. {ph0}: #. {ph1}: #: website/public/index.html:384 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}03{ph1} Recover the rule" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #: website/public/index.html:395 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Original x64 · selected instructions{ph1} {ph2}{ph3}" msgstr "" #: website/public/index.html:437 msgctxt "page:index.html" msgid "01 · Which branch?" msgstr "" #. {ph0}: #. {ph1}: #: website/public/index.html:438 #, python-brace-format msgctxt "page:index.html" msgid "“{ph0}0x5b? 0x5c?{ph1} Two jumps to the same place. Which operators are these?”" msgstr "" #: website/public/index.html:442 msgctxt "page:index.html" msgid "Look up the command IDs, then label the branch." msgstr "" #: website/public/index.html:448 msgctxt "page:index.html" msgid "Divide ÷" msgstr "" #: website/public/index.html:452 msgctxt "page:index.html" msgid "Multiply ×" msgstr "" #: website/public/index.html:457 msgctxt "page:index.html" msgid "02 · What do the calls do?" msgstr "" #. {ph0}: #. {ph1}: #: website/public/index.html:458 #, python-brace-format msgctxt "page:index.html" msgid "" "“100 is clear. The calls are just addresses. {ph0}Which one divides? Which value goes " "in?{ph1}”" msgstr "" #: website/public/index.html:464 msgctxt "page:index.html" msgid "Inspect the helpers and trace the stored values." msgstr "" #: website/public/index.html:474 msgctxt "page:index.html" msgid "Divide" msgstr "" #: website/public/index.html:479 msgctxt "page:index.html" msgid "03 · What is the rule?" msgstr "" #. {ph0}: #. {ph1}: #: website/public/index.html:480 #, python-brace-format msgctxt "page:index.html" msgid "" "“This path multiplies by the other input. So {ph0}10% means 10% of 200{ph1} after +.”" msgstr "" #: website/public/index.html:484 msgctxt "page:index.html" msgid "Name the operands and check both operator paths." msgstr "" #: website/public/index.html:500 website/public/index.html:427 msgctxt "page:index.html" msgid "Illustrative expert reasoning" msgstr "" #. {ph0}: #. {ph1}: #: website/public/index.html:503 #, python-brace-format msgctxt "page:index.html" msgid "" "{ph0}You decode the instructions, follow the calls and reconstruct the " "calculation.{ph1}" msgstr "" #: website/public/index.html:511 msgctxt "page:index.html" msgid "Ask your agent the same question" msgstr "" #. {ph0}: #: website/public/index.html:514 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Example prompt · Calculator" msgstr "" #. {ph0}: #. {ph2}: #. {ph3}: 200 + 10% #. {ph4}: #. {ph5}: #: website/public/index.html:528 #, python-brace-format msgctxt "page:index.html" msgid "" "{ph0}›{ph1}{ph2}Use REA to inspect Windows Calculator. Why does {ph3} give " "220?{ph4}{ph5}{ph6}" msgstr "" #: website/public/index.html:536 msgctxt "page:index.html" msgid "Example answer · based on the findings" msgstr "" #. {ph0}: #. {ph1}: #: website/public/index.html:539 #, python-brace-format msgctxt "page:index.html" msgid "After +, the % button takes {ph0}a percentage of the first number.{ph1}" msgstr "" #: website/public/index.html:552 msgctxt "page:index.html" msgid "REA supplies" msgstr "" #: website/public/index.html:553 msgctxt "page:index.html" msgid "The handler’s instructions, decompiled code and calls." msgstr "" #: website/public/index.html:558 msgctxt "page:index.html" msgid "Your agent explains" msgstr "" #: website/public/index.html:559 msgctxt "page:index.html" msgid "Which branch applies, what it calculates and how to rebuild it." msgstr "" #. {ph0}: #. {ph1}: #: website/public/index.html:566 #, python-brace-format msgctxt "page:index.html" msgid "" "Selected assembly from the installed Calculator DLL. The thoughts and reply illustrate" " the findings. {ph0}Continue with the Calculator example ↓{ph1}" msgstr "" #: website/public/index.html:578 msgctxt "page:index.html" msgid "" "Let’s try two examples: change a game’s speed, then rebuild Calculator’s % button." msgstr "" #: website/public/index.html:583 msgctxt "page:index.html" msgid "Example 01 · Chrome’s dinosaur game" msgstr "" #: website/public/index.html:584 msgctxt "page:index.html" msgid "Why does the dinosaur get faster?" msgstr "" #: website/public/index.html:586 msgctxt "page:index.html" msgid "" "The game gets faster as you run. To rebuild it with a speed control, we first need to " "find out how the speed changes." msgstr "" #: website/public/index.html:592 msgctxt "page:index.html" msgid "1. Ask about the speed" msgstr "" #. {ph0}: #: website/public/index.html:595 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Example question · Dinosaur game" msgstr "" #. {ph0}: #. {ph2}: #. {ph3}: #. {ph4}: #: website/public/index.html:609 #, python-brace-format msgctxt "page:index.html" msgid "" "{ph0}›{ph1}{ph2}Use REA to inspect this dinosaur game. Why does it get faster? Show " "the speed rule, then build a small version with an adjustable speed.{ph3}{ph4}{ph5}" msgstr "" #: website/public/index.html:618 msgctxt "page:index.html" msgid "2. Find the speed rule" msgstr "" #: website/public/index.html:619 msgctxt "page:index.html" msgid "" "REA lets the agent read the game’s running code. The speed starts at 6 and increases a" " little each update while it is below 13." msgstr "" #: website/public/index.html:626 msgctxt "page:index.html" msgid "3. Play the result" msgstr "" #: website/public/index.html:627 msgctxt "page:index.html" msgid "" "We rebuilt that rule in the mini-game below and added a speed slider. Press Play, then" " choose your own speed." msgstr "" #: website/public/index.html:663 msgctxt "page:index.html" msgid "Play" msgstr "" #: website/public/index.html:666 msgctxt "page:index.html" msgid "Jump ↑" msgstr "" #: website/public/index.html:667 msgctxt "page:index.html" msgid "Restart" msgstr "" #: website/public/index.html:670 msgctxt "page:index.html" msgid "Speed" msgstr "" #: website/public/index.html:680 msgctxt "page:index.html" msgid "Use the recovered acceleration rule" msgstr "" #: website/public/index.html:684 msgctxt "page:index.html" msgid "Original rule: start at 6, then increase toward 13." msgstr "" #: website/public/index.html:687 msgctxt "page:index.html" msgid "Move the slider to set your own speed. Space or Jump clears a cactus." msgstr "" #: website/public/index.html:692 msgctxt "page:index.html" msgid "" "Enable JavaScript to play. You can still read the rule and open the source code below." msgstr "" #: website/public/index.html:698 msgctxt "page:index.html" msgid "Open the speed lab →" msgstr "" #: website/public/index.html:704 msgctxt "page:index.html" msgid "See the script, checks and how to try the analysis" msgstr "" #. {ph0}: #. {ph1}: #: website/public/index.html:707 #, python-brace-format msgctxt "page:index.html" msgid "Inspected target: {ph0}wayou’s Chromium-derived browser edition{ph1}." msgstr "" #. {ph0}: index.js #: website/public/index.html:715 #, python-brace-format msgctxt "page:index.html" msgid "REA · loaded {ph0} · selected lines" msgstr "" #: website/public/index.html:724 msgctxt "page:index.html" msgid "Start at 6. Add 0.001 each update without a collision, while speed is below 13." msgstr "" #: website/public/index.html:729 msgctxt "page:index.html" msgid "What each part does" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/index.html:731 #, python-brace-format msgctxt "page:index.html" msgid "" "{ph0}01 · REA{ph1}{ph2}Read the running game’s script{ph3}{ph4}Return its actual code " "and settings to the agent.{ph5}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/index.html:738 #, python-brace-format msgctxt "page:index.html" msgid "" "{ph0}02 · Your agent{ph1}{ph2}Rebuild the rule, add a control{ph3}{ph4}Use the " "recovered acceleration in a small game with a speed slider.{ph5}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/index.html:746 #, python-brace-format msgctxt "page:index.html" msgid "" "{ph0}03 · You{ph1}{ph2}Change the speed and play{ph3}{ph4}Try the original " "acceleration, then choose your own pace.{ph5}" msgstr "" #. {ph0}: index.js #: website/public/index.html:756 #, python-brace-format msgctxt "page:index.html" msgid "" "REA inspected the HTTP browser edition through a local debugging connection and " "returned the loaded {ph0}, including its source and digest." msgstr "" #: website/public/index.html:763 msgctxt "page:index.html" msgid "Selected settings from the inspected script" msgstr "" #: website/public/index.html:769 msgctxt "page:index.html" msgid "" "We called the original game’s update function in a controlled browser check, with " "obstacles and automatic scheduling disabled. After 4,000 updates, speed was 10.0; " "after 10,000, it was 13.0, rounded to one decimal." msgstr "" #. {ph0}: #. {ph1}: #: website/public/index.html:775 #, python-brace-format msgctxt "page:index.html" msgid "" "The new mini-game keeps that speed rule. Its drawing, jumping and collision code are a" " small teaching implementation. {ph0}Open the lab{ph1} to see the new code and run the" " same speed check." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/index.html:781 #, python-brace-format msgctxt "page:index.html" msgid "" "To inspect the target yourself, follow the {ph0}browser connection steps{ph1} using " "{ph2}the dinosaur page{ph3}. Give your agent that page URL and your local debugging " "endpoint, then copy the prompt above." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/index.html:790 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Inspected speed code{ph1} · {ph2}Chromium Authors · BSD license{ph3}" msgstr "" #: website/public/index.html:807 msgctxt "page:index.html" msgid "Example 02 · Windows Calculator" msgstr "" #: website/public/index.html:808 msgctxt "page:index.html" msgid "Rebuild Calculator’s % button." msgstr "" #: website/public/index.html:810 msgctxt "page:index.html" msgid "" "The % button does different things after + and ×. Let’s find both rules and try them " "in a small calculator." msgstr "" #: website/public/index.html:816 msgctxt "page:index.html" msgid "1. Ask about the % button" msgstr "" #. {ph0}: #: website/public/index.html:819 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Example question · Calculator" msgstr "" #. {ph0}: #. {ph2}: #. {ph3}: #. {ph4}: #: website/public/index.html:833 #, python-brace-format msgctxt "page:index.html" msgid "" "{ph0}›{ph1}{ph2}Use REA to inspect Windows Calculator’s % button. Recover the rules " "after + and ×, then build a small calculator that uses both.{ph3}{ph4}{ph5}" msgstr "" #: website/public/index.html:842 msgctxt "page:index.html" msgid "2. Find both rules" msgstr "" #: website/public/index.html:843 msgctxt "page:index.html" msgid "" "REA helps the agent read the code behind the % button. It applies two different rules:" msgstr "" #: website/public/index.html:849 msgctxt "page:index.html" msgid "With +" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: 10% of 200 = 20 → 200 + 20 = 220 #: website/public/index.html:850 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Take 10% of the first number.{ph1}{ph2}" msgstr "" #: website/public/index.html:856 msgctxt "page:index.html" msgid "With ×" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: 200 × 0.1 = 20 #: website/public/index.html:857 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Turn 10% into 0.1.{ph1}{ph2}" msgstr "" #: website/public/index.html:864 msgctxt "page:index.html" msgid "3. Try the % button" msgstr "" #: website/public/index.html:865 msgctxt "page:index.html" msgid "We recreated both rules below. Choose + or ×, press %, then press =." msgstr "" #: website/public/index.html:913 msgctxt "page:index.html" msgid "Reset" msgstr "" #: website/public/index.html:921 msgctxt "page:index.html" msgid "10% of 200 = 20. Then 200 + 20 = 220." msgstr "" #: website/public/index.html:924 msgctxt "page:index.html" msgid "Interactive illustration of the inspected percentage rule." msgstr "" #: website/public/index.html:931 msgctxt "page:index.html" msgid "See the real code and how the answer was checked" msgstr "" #. {ph0}: previous = 200 #. {ph1}: current = 10 #: website/public/index.html:932 #, python-brace-format msgctxt "page:index.html" msgid "For this example, {ph0} and {ph1}." msgstr "" #: website/public/index.html:938 msgctxt "page:index.html" msgid "Readable summary of the % handler" msgstr "" #: website/public/index.html:947 msgctxt "page:index.html" msgid "From the installed app to a working % button" msgstr "" #. {ph0}: #. {ph1}: calc.exe #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #. {ph6}: ms-calculator: #. {ph7}: #: website/public/index.html:951 #, python-brace-format msgctxt "page:index.html" msgid "" "{ph0}01 · REA reads {ph1}{ph2}{ph3}It launches the Calculator app{ph4}{ph5}The code " "opens {ph6}. The agent then selects the installed app’s library.{ph7}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: 100 #. {ph6}: #: website/public/index.html:960 #, python-brace-format msgctxt "page:index.html" msgid "" "{ph0}02 · REA reads the library{ph1}{ph2}Return the % handler’s code{ph3}{ph4}The " "function checks the operator and uses the constant {ph5}.{ph6}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/index.html:968 #, python-brace-format msgctxt "page:index.html" msgid "" "{ph0}03 · Your agent interprets it{ph1}{ph2}Explain and reproduce the " "rules{ph3}{ph4}Crosscheck the branch with Microsoft’s source, then try + and × " "above.{ph5}" msgstr "" #: website/public/index.html:982 msgctxt "page:index.html" msgid "REA · selected original instructions" msgstr "" #: website/public/index.html:993 msgctxt "page:index.html" msgid "Operator IDs · Microsoft’s source" msgstr "" #: website/public/index.html:1003 msgctxt "page:index.html" msgid "" "Inspected with REA 4.1.0: Windows Calculator 11.2508.4.0, x64. The readable summary " "uses names from Microsoft’s public source to explain the recovered branch." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/index.html:1008 #, python-brace-format msgctxt "page:index.html" msgid "" "{ph0}Percentage implementation{ph1} · {ph2}Microsoft’s test cases{ph3} · {ph4}Native " "setup guide{ph5}" msgstr "" #: website/public/index.html:1028 msgctxt "page:index.html" msgid "REA case studies." msgstr "" #: website/public/index.html:1029 msgctxt "page:index.html" msgid "Explore a feature in a released app or game, with code and checked results." msgstr "" #: website/public/index.html:1034 msgctxt "page:index.html" msgid "Showcases →" msgstr "" #: website/public/index.html:1038 msgctxt "page:index.html" msgid "Android · APK analysis" msgstr "" #: website/public/index.html:1039 msgctxt "page:index.html" msgid "How an authenticator generates a login code" msgstr "" #: website/public/index.html:1040 msgctxt "page:index.html" msgid "" "Trace Aegis's six-digit login code through its released APK, then move a demo clock to" " see why it changes every 30 seconds." msgstr "" #: website/public/index.html:1044 msgctxt "page:index.html" msgid "Read the Android case study" msgstr "" #: website/public/index.html:1049 msgctxt "page:index.html" msgid "Electron · Feature tracing" msgstr "" #: website/public/index.html:1050 msgctxt "page:index.html" msgid "How Notion copies text and HTML" msgstr "" #: website/public/index.html:1051 msgctxt "page:index.html" msgid "" "Follow Notion's packaged JavaScript to the system clipboard and see how a copy " "preserves rich block data." msgstr "" #: website/public/index.html:1055 msgctxt "page:index.html" msgid "Read the Notion case study" msgstr "" #: website/public/index.html:1060 msgctxt "page:index.html" msgid "Native · Reconstruction" msgstr "" #: website/public/index.html:1061 msgctxt "page:index.html" msgid "DX-Ball's sound-pan calculation" msgstr "" #: website/public/index.html:1062 msgctxt "page:index.html" msgid "Recover how a ball's position becomes left/right sound in a 1996 Windows game." msgstr "" #: website/public/index.html:1066 msgctxt "page:index.html" msgid "Read the DX-Ball case study" msgstr "" #: website/public/index.html:1077 msgctxt "page:index.html" msgid "Your first investigation" msgstr "" #: website/public/index.html:1078 msgctxt "page:index.html" msgid "Try REA on a small app." msgstr "" #: website/public/index.html:1079 msgctxt "page:index.html" msgid "Download our Notes example, trace its CSV export, and check one changed input." msgstr "" #: website/public/index.html:1084 msgctxt "page:index.html" msgid "Try the guided example" msgstr "" #: website/public/index.html:1093 msgctxt "page:index.html" msgid "Choose your target." msgstr "" #: website/public/index.html:1094 msgctxt "page:index.html" msgid "These guides cover setup and a first investigation for each kind of software." msgstr "" #: website/public/index.html:1101 msgctxt "page:index.html" msgid "Native binaries" msgstr "" #: website/public/index.html:1102 msgctxt "page:index.html" msgid "" "Inspect functions, strings, references and call relationships in executables and " "libraries." msgstr "" #: website/public/index.html:1106 msgctxt "page:index.html" msgid "Native analysis guide" msgstr "" #: website/public/index.html:1109 msgctxt "page:index.html" msgid "JavaScript & Electron" msgstr "" #: website/public/index.html:1110 msgctxt "page:index.html" msgid "" "Map modules, routes, IPC and native dependencies from an application folder or ASAR " "archive." msgstr "" #: website/public/index.html:1114 msgctxt "page:index.html" msgid "Application workflows" msgstr "" #: website/public/index.html:1117 msgctxt "page:index.html" msgid "Browser & runtime activity" msgstr "" #: website/public/index.html:1118 msgctxt "page:index.html" msgid "" "Capture selected browser or process activity, then compare the results across runs." msgstr "" #: website/public/index.html:1122 msgctxt "page:index.html" msgid "Browser observation guide" msgstr "" #: website/public/index.html:1126 msgctxt "page:index.html" msgid "Try a larger project" msgstr "" #. {ph0}: #: website/public/index.html:1131 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Example prompt · Website" msgstr "" #. {ph0}: #. {ph2}: #. {ph3}: https://rea.tools/ #. {ph4}: #. {ph5}: #: website/public/index.html:1145 #, python-brace-format msgctxt "page:index.html" msgid "" "{ph0}›{ph1}{ph2}Use REA to inspect {ph3}. Clone this website for me.{ph4}{ph5}{ph6}" msgstr "" #: website/public/index.html:1154 msgctxt "page:index.html" msgid "Yes, this one." msgstr "" #. {ph0}: #: website/public/index.html:1159 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Example prompt · Game reconstruction" msgstr "" #. {ph0}: #. {ph2}: #. {ph3}: #. {ph4}: #: website/public/index.html:1173 #, python-brace-format msgctxt "page:index.html" msgid "" "{ph0}›{ph1}{ph2}Use REA to reconstruct this game from its executable. Recover the " "gameplay logic in C and test it against the original.{ph3}{ph4}{ph5}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/index.html:1182 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}See the DX-Ball case study →{ph1}" msgstr "" #: website/public/index.html:1193 msgctxt "page:index.html" msgid "Any questions?" msgstr "" #. {ph0}: #. {ph1}: #: website/public/index.html:1195 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Read the FAQ{ph1} — setup and common questions." msgstr "" #. {ph0}: #. {ph1}: #: website/public/index.html:1198 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Join Discord{ph1} — get help and discuss your investigations." msgstr "" #. {ph0}: #. {ph1}: #: website/public/index.html:1202 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}GitHub issues{ph1} — report a bug or request a feature." msgstr "" #: website/public/index.html:6 msgctxt "page:index.html" msgid "REA — Reverse Engineering for Your Coding Agent" msgstr "" #: website/public/index.html:7 msgctxt "page:index.html" msgid "" "Reverse engineer apps, binaries and browser behavior with your coding agent. Follow " "clear guides and try interactive examples with REA." msgstr "" #: website/public/index.html:259 msgctxt "page:index.html" msgid "Copy REA installation prompt" msgstr "" #: website/public/index.html:283 msgctxt "page:index.html" msgid "Copy setup command" msgstr "" #: website/public/index.html:295 msgctxt "page:index.html" msgid "Setup options" msgstr "" #: website/public/index.html:363 msgctxt "page:index.html" msgid "Follow the manual Calculator analysis" msgstr "" #: website/public/index.html:519 msgctxt "page:index.html" msgid "Copy Calculator percentage question" msgstr "" #: website/public/index.html:600 msgctxt "page:index.html" msgid "Copy dinosaur analysis prompt" msgstr "" #: website/public/index.html:653 msgctxt "page:index.html" msgid "" "Dinosaur mini-game. Use the Jump button or press Space while the game is focused." msgstr "" #: website/public/index.html:824 msgctxt "page:index.html" msgid "Copy Calculator analysis prompt" msgstr "" #: website/public/index.html:870 msgctxt "page:index.html" msgid "Choose the calculation" msgstr "" #: website/public/index.html:1136 msgctxt "page:index.html" msgid "Copy website project prompt" msgstr "" #: website/public/index.html:1164 msgctxt "page:index.html" msgid "Copy game reconstruction prompt" msgstr "" #: website/public/index.html:1228 msgctxt "page:index.html" msgid "Back to top" msgstr "" #: website/public/showcase/aegis/index.html:108 msgctxt "page:showcase/aegis/index.html" msgid "Skip to content" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/showcase/aegis/index.html:200 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}Home{ph1} / {ph2}Showcases{ph3} / Android" msgstr "" #: website/public/showcase/aegis/index.html:203 msgctxt "page:showcase/aegis/index.html" msgid "Case study · Aegis Authenticator" msgstr "" #. {ph0}:
#: website/public/showcase/aegis/index.html:204 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "How does an authenticator{ph0}generate a login code?" msgstr "" #: website/public/showcase/aegis/index.html:205 msgctxt "page:showcase/aegis/index.html" msgid "" "A six-digit code changes every 30 seconds. Use REA to find the calculation in an " "Android APK, then rebuild it with a clock you can control." msgstr "" #: website/public/showcase/aegis/index.html:210 msgctxt "page:showcase/aegis/index.html" msgid "Aegis 3.4.3 · Android · Official release APK · 6.9 MB" msgstr "" #: website/public/showcase/aegis/index.html:213 msgctxt "page:showcase/aegis/index.html" msgid "View Aegis on GitHub" msgstr "" #: website/public/showcase/aegis/index.html:219 msgctxt "page:showcase/aegis/index.html" msgid "From an APK to a code you can reproduce" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/showcase/aegis/index.html:221 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "{ph0}01 · Locate the feature{ph1}{ph2}3,077 classes → generating methods{ph3}{ph4}REA " "searches the package and traces the code used by the display and copy actions.{ph5}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/showcase/aegis/index.html:230 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "{ph0}02 · Read the calculation{ph1}{ph2}Time + account key → six digits{ph3}{ph4}REA " "returns the methods and defaults. The agent explains how they fit together.{ph5}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/showcase/aegis/index.html:238 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "{ph0}03 · Rebuild and check{ph1}{ph2}Change the clock. Watch the code.{ph3}{ph4}A new " "browser demo reproduces the rule and checks it against public reference cases.{ph5}" msgstr "" #: website/public/showcase/aegis/index.html:251 msgctxt "page:showcase/aegis/index.html" msgid "In this case study" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/aegis/index.html:253 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}Ask your agent{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/aegis/index.html:254 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}Try the code generator{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/aegis/index.html:255 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}Find the code with REA{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/aegis/index.html:256 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}Read the calculation{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/aegis/index.html:257 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}Check the reconstruction{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/aegis/index.html:258 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}Inspect the APK yourself{ph1}" msgstr "" #: website/public/showcase/aegis/index.html:263 msgctxt "page:showcase/aegis/index.html" msgid "Ask your agent" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/aegis/index.html:264 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "The app shows a changing login code. We want to find {ph0}what makes it change{ph1} " "and reproduce that behavior." msgstr "" #. {ph0}: #: website/public/showcase/aegis/index.html:270 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" msgstr "" #: website/public/showcase/aegis/index.html:274 #: website/public/showcase/aegis/index.html:737 msgctxt "page:showcase/aegis/index.html" msgid "Copy" msgstr "" #. {ph0}: #. {ph2}: #. {ph3}: aegis-v3.4.3.apk #. {ph4}: #. {ph5}: #: website/public/showcase/aegis/index.html:283 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "{ph0}›{ph1}{ph2}Use REA to inspect {ph3}. Find how it generates the six-digit login " "code, explain why it changes every 30 seconds, and rebuild a small demo where I can " "change the time.{ph4}{ph5}{ph6}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/aegis/index.html:294 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "An example prompt for the downloaded APK, with REA's Android analysis configured. " "{ph0}Get the APK and analysis setup ↓{ph1}" msgstr "" #: website/public/showcase/aegis/index.html:302 msgctxt "page:showcase/aegis/index.html" msgid "Try the code generator" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/aegis/index.html:303 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "The app groups time into {ph0}30-second blocks.{ph1} It combines the block number with" " the account key to generate a code. The same key and block produce the same code." msgstr "" #: website/public/showcase/aegis/index.html:310 msgctxt "page:showcase/aegis/index.html" msgid "Move the clock across 60 seconds" msgstr "" #: website/public/showcase/aegis/index.html:313 msgctxt "page:showcase/aegis/index.html" msgid "Time" msgstr "" #: website/public/showcase/aegis/index.html:315 msgctxt "page:showcase/aegis/index.html" msgid "seconds" msgstr "" #: website/public/showcase/aegis/index.html:316 msgctxt "page:showcase/aegis/index.html" msgid "Our adjustable example clock" msgstr "" #: website/public/showcase/aegis/index.html:319 msgctxt "page:showcase/aegis/index.html" msgid "30-second block" msgstr "" #: website/public/showcase/aegis/index.html:321 #: website/public/showcase/aegis/index.html:648 msgctxt "page:showcase/aegis/index.html" msgid "Block" msgstr "" #. {ph0}: floor(59 / 30) #. {ph1}:
#. {ph2}: #. {ph3}: #: website/public/showcase/aegis/index.html:322 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}{ph1}{ph2}30–59 seconds{ph3}" msgstr "" #: website/public/showcase/aegis/index.html:330 msgctxt "page:showcase/aegis/index.html" msgid "Generated code" msgstr "" #: website/public/showcase/aegis/index.html:338 msgctxt "page:showcase/aegis/index.html" msgid "Account key + block → six digits" msgstr "" #: website/public/showcase/aegis/index.html:344 msgctxt "page:showcase/aegis/index.html" msgid "Example time, in seconds" msgstr "" #: website/public/showcase/aegis/index.html:359 #: website/public/showcase/aegis/index.html:659 msgctxt "page:showcase/aegis/index.html" msgid "59 seconds" msgstr "" #: website/public/showcase/aegis/index.html:366 #: website/public/showcase/aegis/index.html:664 msgctxt "page:showcase/aegis/index.html" msgid "60 seconds" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/showcase/aegis/index.html:375 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "At 59 seconds: {ph0}287082.{ph1} At 60 seconds: {ph2}359152.{ph3} Moving within one " "block leaves the code unchanged." msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/aegis/index.html:382 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "The key is fixed, public {ph0}RFC 6238 test data{ph1}. The demo implements the " "calculation recovered from the APK." msgstr "" #: website/public/showcase/aegis/index.html:389 msgctxt "page:showcase/aegis/index.html" msgid "" "The diagram shows the result at 59 seconds. Enable JavaScript to change the clock." msgstr "" #: website/public/showcase/aegis/index.html:398 msgctxt "page:showcase/aegis/index.html" msgid "Find the code with REA" msgstr "" #: website/public/showcase/aegis/index.html:401 msgctxt "page:showcase/aegis/index.html" msgid "Narrow the APK to three classes" msgstr "" #: website/public/showcase/aegis/index.html:404 #: website/public/showcase/aegis/index.html:436 msgctxt "page:showcase/aegis/index.html" msgid "Agent → REA" msgstr "" #: website/public/showcase/aegis/index.html:414 msgctxt "page:showcase/aegis/index.html" msgid "REA → agent · selected results" msgstr "" #. {ph0}: TotpInfo #: website/public/showcase/aegis/index.html:426 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "{ph0} is the calculation candidate; the other two concern the progress bar and " "imported accounts. TOTP means a time-based one-time password." msgstr "" #: website/public/showcase/aegis/index.html:433 msgctxt "page:showcase/aegis/index.html" msgid "Connect the generator to the app's display" msgstr "" #: website/public/showcase/aegis/index.html:450 msgctxt "page:showcase/aegis/index.html" msgid "REA → agent · methods and callers" msgstr "" #. {ph0}: EntryHolder.getOtp #. {ph1}: TotpInfo.getOtp(timestamp) #: website/public/showcase/aegis/index.html:461 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "REA identifies the timestamp overload and finds the base method's callers. Inspecting " "{ph0} then shows the display calling {ph1}." msgstr "" #. {ph0}: com.beemdevelopment.aegis #: website/public/showcase/aegis/index.html:469 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "Requests show a shortened input path. Result class names omit the common {ph0} prefix." msgstr "" #: website/public/showcase/aegis/index.html:476 msgctxt "page:showcase/aegis/index.html" msgid "Read the calculation" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/aegis/index.html:477 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "REA returns {ph0}the clock conversion, default settings and generating methods.{ph1} " "The constructors set a 30-second interval and six digits; the timestamp method turns " "seconds into a block number." msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/aegis/index.html:492 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}01{ph1} Time block" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/aegis/index.html:500 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}02{ph1} Key + block" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/aegis/index.html:508 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}03{ph1} Six digits" msgstr "" #: website/public/showcase/aegis/index.html:520 msgctxt "page:showcase/aegis/index.html" msgid "REA · selected decompiled Java" msgstr "" #: website/public/showcase/aegis/index.html:550 msgctxt "page:showcase/aegis/index.html" msgid "Readable summary · agent's interpretation" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/aegis/index.html:567 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "{ph0}Time chooses the block.{ph1} Seconds 30 through 59 all give block 1. At 60 " "seconds, the block becomes 2." msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/aegis/index.html:573 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "{ph0}The key matters too.{ph1} The generator combines the account key with the block. " "An account with a different key can show a different code at the same time." msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/aegis/index.html:580 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "{ph0}Keep six digits.{ph1} The remainder after division by 1,000,000 is padded with " "zeroes when needed, so a code can begin with 0." msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/aegis/index.html:587 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "Excerpts from several inspected methods, with line wrapping for display. The right " "panel is an explanatory summary. {ph0}Aegis code is GPL-3.0.{ph1}" msgstr "" #: website/public/showcase/aegis/index.html:596 msgctxt "page:showcase/aegis/index.html" msgid "Inside the generator" msgstr "" #. {ph0}: generateOTP #. {ph1}: kotlin.ExceptionsKt #. {ph2}: TotpInfo #. {ph3}: HOTP #: website/public/showcase/aegis/index.html:597 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "The released APK puts {ph0} in {ph1}. REA follows the call from {ph2} and returns this" " body; the original source calls the helper {ph3}." msgstr "" #: website/public/showcase/aegis/index.html:605 msgctxt "page:showcase/aegis/index.html" msgid "REA · generateOTP, complete body" msgstr "" #: website/public/showcase/aegis/index.html:619 msgctxt "page:showcase/aegis/index.html" msgid "" "The last hash byte selects a position. Four bytes at that position provide a positive " "31-bit number; formatting reduces it to the requested number of digits. The " "constructor's last argument selects the code-formatting branch introduced by " "compilation." msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/aegis/index.html:626 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}Compare with the matching release source{ph1}." msgstr "" #: website/public/showcase/aegis/index.html:636 msgctxt "page:showcase/aegis/index.html" msgid "Check the reconstruction" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/aegis/index.html:637 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "We assembled the selected REA-returned Java methods in a small test program. Their " "output matched an independent reconstruction on {ph0}133 test cases{ph1}, including " "time-block boundaries and codes beginning with zero." msgstr "" #: website/public/showcase/aegis/index.html:647 msgctxt "page:showcase/aegis/index.html" msgid "Example time" msgstr "" #: website/public/showcase/aegis/index.html:649 msgctxt "page:showcase/aegis/index.html" msgid "Six-digit code" msgstr "" #: website/public/showcase/aegis/index.html:654 msgctxt "page:showcase/aegis/index.html" msgid "30 seconds" msgstr "" #: website/public/showcase/aegis/index.html:669 msgctxt "page:showcase/aegis/index.html" msgid "1,111,111,109 seconds" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/aegis/index.html:676 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "The generator also matches the six published SHA-1 reference cases in {ph0}RFC " "6238{ph1}. Check the browser implementation against them:" msgstr "" #: website/public/showcase/aegis/index.html:684 msgctxt "page:showcase/aegis/index.html" msgid "Run reference checks" msgstr "" #: website/public/showcase/aegis/index.html:691 msgctxt "page:showcase/aegis/index.html" msgid "Read the demo's calculation" msgstr "" #: website/public/showcase/aegis/index.html:695 msgctxt "page:showcase/aegis/index.html" msgid "" "The reference cases use eight digits. The check also verifies their six-digit results." msgstr "" #: website/public/showcase/aegis/index.html:704 msgctxt "page:showcase/aegis/index.html" msgid "" "Verification runs extracted Java methods and the new demo. The Android APK was " "inspected statically." msgstr "" #: website/public/showcase/aegis/index.html:711 msgctxt "page:showcase/aegis/index.html" msgid "Inspect the APK yourself" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/aegis/index.html:712 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "{ph0}Set up REA{ph1} on macOS or Linux, then download these two files into the same " "folder. On Windows, use a Linux environment such as WSL." msgstr "" #. {ph0}: JAVA_HOME #. {ph1}: PATH #: website/public/showcase/aegis/index.html:717 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "Android analysis needs a full JDK 17 or later. Select it with {ph0} or {ph1}. This " "case used JDK 21." msgstr "" #: website/public/showcase/aegis/index.html:723 msgctxt "page:showcase/aegis/index.html" msgid "Download Aegis APK" msgstr "" #: website/public/showcase/aegis/index.html:727 msgctxt "page:showcase/aegis/index.html" msgid "Download Android analysis provider" msgstr "" #: website/public/showcase/aegis/index.html:733 msgctxt "page:showcase/aegis/index.html" msgid "Point REA at the provider file and inspect the APK:" msgstr "" #: website/public/showcase/aegis/index.html:736 msgctxt "page:showcase/aegis/index.html" msgid "macOS / Linux" msgstr "" #. {ph0}: REA_JADX_MCP_JAR #: website/public/showcase/aegis/index.html:750 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "Your agent can continue through REA's CLI using the prompt above. For MCP, add {ph0} " "to the REA server's environment and reconnect it." msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/aegis/index.html:755 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "A next question: {ph0}what happens when an account uses eight digits or a different " "time interval?{ph1}" msgstr "" #: website/public/showcase/aegis/index.html:765 msgctxt "page:showcase/aegis/index.html" msgid "Sources" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/showcase/aegis/index.html:767 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "{ph0}Official Aegis 3.4.3 release{ph1} · {ph2}Matching source commit{ph3} · " "{ph4}GPL-3.0 license{ph5}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/showcase/aegis/index.html:783 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}RFC 6238 reference cases{ph1} · {ph2}Demo test data{ph3}" msgstr "" #: website/public/showcase/aegis/index.html:790 msgctxt "page:showcase/aegis/index.html" msgid "" "Inspected with REA 6.1.0 on 9 October 2026. Decompiled excerpts are credited to Aegis;" " the diagram, readable summary and browser reconstruction are new teaching material." msgstr "" #: website/public/showcase/aegis/index.html:6 msgctxt "page:showcase/aegis/index.html" msgid "Aegis APK Reverse Engineering: Login Codes — REA" msgstr "" #: website/public/showcase/aegis/index.html:7 msgctxt "page:showcase/aegis/index.html" msgid "" "Inspect the Aegis Android APK with REA, recover its six-digit login-code calculation " "and try a reconstruction with an adjustable clock." msgstr "" #: website/public/showcase/aegis/index.html:250 msgctxt "page:showcase/aegis/index.html" msgid "On this page" msgstr "" #: website/public/showcase/aegis/index.html:261 msgctxt "page:showcase/aegis/index.html" msgid "Aegis APK case study" msgstr "" #: website/public/showcase/aegis/index.html:274 msgctxt "page:showcase/aegis/index.html" msgid "Copy Aegis example prompt" msgstr "" #: website/public/showcase/aegis/index.html:487 msgctxt "page:showcase/aegis/index.html" msgid "Follow the login-code calculation" msgstr "" #: website/public/showcase/aegis/index.html:737 msgctxt "page:showcase/aegis/index.html" msgid "Copy APK inspection command" msgstr "" #: website/public/showcase/aegis/index.html:814 msgctxt "page:showcase/aegis/index.html" msgid "Back to top" msgstr "" #: website/public/showcase/ctf/index.html:107 msgctxt "page:showcase/ctf/index.html" msgid "Skip to content" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/showcase/ctf/index.html:199 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}Home{ph1} / {ph2}Showcases{ph3} / CTF" msgstr "" #: website/public/showcase/ctf/index.html:202 msgctxt "page:showcase/ctf/index.html" msgid "Case study · DownUnderCTF 2023" msgstr "" #. {ph0}:
#: website/public/showcase/ctf/index.html:203 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "Find the flag in{ph0}a CTF binary." msgstr "" #. {ph0}: Correct! #: website/public/showcase/ctf/index.html:204 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" "Use REA to inspect a small flag checker, turn its rules into equations and find an " "input that makes the original program print {ph0}." msgstr "" #: website/public/showcase/ctf/index.html:209 msgctxt "page:showcase/ctf/index.html" msgid "masked squares flag checker · Easy · Linux x86-64" msgstr "" #: website/public/showcase/ctf/index.html:212 msgctxt "page:showcase/ctf/index.html" msgid "View the original challenge" msgstr "" #: website/public/showcase/ctf/index.html:220 msgctxt "page:showcase/ctf/index.html" msgid "From a binary to a checked answer" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/showcase/ctf/index.html:222 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" "{ph0}01 · Find the check{ph1}{ph2}Strings → checking functions{ph3}{ph4}REA finds the " "prompt, its references and the code that accepts or rejects an input.{ph5}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/showcase/ctf/index.html:230 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" "{ph0}02 · Extract the rules{ph1}{ph2}36 characters · 26 sums{ph3}{ph4}REA returns the " "instructions and data behind each check. The agent turns them into equations.{ph5}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/showcase/ctf/index.html:238 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" "{ph0}03 · Solve and run{ph1}{ph2}Recovered flag → Correct!{ph3}{ph4}A Python script " "solves the equations. REA captures the original program accepting the result.{ph5}" msgstr "" #: website/public/showcase/ctf/index.html:247 msgctxt "page:showcase/ctf/index.html" msgid "The challenge is by joseph, published in DownUnderCTF's official repository." msgstr "" #: website/public/showcase/ctf/index.html:255 msgctxt "page:showcase/ctf/index.html" msgid "In this case study" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/ctf/index.html:257 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}Find the checking code{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/ctf/index.html:258 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}Read one mask{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/ctf/index.html:259 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}Assembly to readable code{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/ctf/index.html:260 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}Solve the equations{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/ctf/index.html:261 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}Check the answer{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/ctf/index.html:262 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}Try it yourself{ph1}" msgstr "" #: website/public/showcase/ctf/index.html:267 msgctxt "page:showcase/ctf/index.html" msgid "Find the checking code" msgstr "" #. {ph0}: Correct! #. {ph1}: Incorrect! #: website/public/showcase/ctf/index.html:268 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" "The handout is a 15 KB executable. It asks for a flag, then prints {ph0} or {ph1}. " "Start with a simple request to your agent." msgstr "" #. {ph0}: #: website/public/showcase/ctf/index.html:275 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" msgstr "" #: website/public/showcase/ctf/index.html:280 website/public/showcase/ctf/index.html:499 #: website/public/showcase/ctf/index.html:523 website/public/showcase/ctf/index.html:593 #: website/public/showcase/ctf/index.html:740 msgctxt "page:showcase/ctf/index.html" msgid "Copy" msgstr "" #. {ph0}: #. {ph2}: #. {ph3}: #. {ph4}: #: website/public/showcase/ctf/index.html:289 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" "{ph0}›{ph1}{ph2}Use REA to analyze ms_flag_checker and find the flag. Explain how the " "checks work, then verify the answer with the original program.{ph3}{ph4}{ph5}" msgstr "" #: website/public/showcase/ctf/index.html:298 msgctxt "page:showcase/ctf/index.html" msgid "" "An example prompt, with the downloaded challenge available locally and a native " "analysis provider connected." msgstr "" #: website/public/showcase/ctf/index.html:304 msgctxt "page:showcase/ctf/index.html" msgid "Follow the input prompt to its function" msgstr "" #: website/public/showcase/ctf/index.html:307 website/public/showcase/ctf/index.html:343 msgctxt "page:showcase/ctf/index.html" msgid "Agent → REA" msgstr "" #: website/public/showcase/ctf/index.html:323 msgctxt "page:showcase/ctf/index.html" msgid "REA → agent · selected results" msgstr "" #: website/public/showcase/ctf/index.html:333 msgctxt "page:showcase/ctf/index.html" msgid "" "The reference gives the agent a place to investigate, even though the executable's " "original function names have been removed." msgstr "" #: website/public/showcase/ctf/index.html:340 msgctxt "page:showcase/ctf/index.html" msgid "Read the checker and its two helpers" msgstr "" #: website/public/showcase/ctf/index.html:355 msgctxt "page:showcase/ctf/index.html" msgid "REA → agent · selected instructions" msgstr "" #. {ph0}: 0x18 #. {ph1}: 0x270 #: website/public/showcase/ctf/index.html:368 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" "The first loop copies 36 character codes. The checking loop decodes a mask, sums the " "selected codes and compares the result with a stored number. Its {ph0}-byte steps " "across {ph1} bytes give 26 masks." msgstr "" #: website/public/showcase/ctf/index.html:376 msgctxt "page:showcase/ctf/index.html" msgid "" "These are selected results from a fresh REA analysis. The local target path is " "shortened for display; addresses refer to REA's imported image." msgstr "" #: website/public/showcase/ctf/index.html:384 msgctxt "page:showcase/ctf/index.html" msgid "One check reveals one character" msgstr "" #: website/public/showcase/ctf/index.html:385 msgctxt "page:showcase/ctf/index.html" msgid "" "The checker arranges the input in a 6×6 grid. A mask chooses which cells contribute to" " a sum. Its compact encoding uses negative numbers to skip cells and positive numbers " "to select them." msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/ctf/index.html:405 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "The seventh check selects just one position. {ph0}Open figure{ph1}." msgstr "" #: website/public/showcase/ctf/index.html:412 msgctxt "page:showcase/ctf/index.html" msgid "Read the mask and its target from the binary" msgstr "" #: website/public/showcase/ctf/index.html:418 msgctxt "page:showcase/ctf/index.html" msgid "Agent → REA · read_bytes" msgstr "" #: website/public/showcase/ctf/index.html:425 msgctxt "page:showcase/ctf/index.html" msgid "REA → agent · seventh entries" msgstr "" #. {ph0}: MOVSX #. {ph1}: eb #. {ph2}: code[21] = 55 #. {ph3}: 7 #: website/public/showcase/ctf/index.html:434 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" "The instruction {ph0} reads mask bytes as signed values. This is why {ph1} means −21. " "The target is a little-endian integer. Together, these bytes tell the agent that " "{ph2}, so that character is {ph3}." msgstr "" #: website/public/showcase/ctf/index.html:443 msgctxt "page:showcase/ctf/index.html" msgid "From instructions to a readable check" msgstr "" #: website/public/showcase/ctf/index.html:444 msgctxt "page:showcase/ctf/index.html" msgid "" "Select a step to connect the summing helper and its caller to the same rule in C." msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/ctf/index.html:454 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}01{ph1} Start" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/ctf/index.html:462 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}02{ph1} Select" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/ctf/index.html:470 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}03{ph1} Add" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/ctf/index.html:478 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}04{ph1} Advance" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/ctf/index.html:486 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}05{ph1} Compare" msgstr "" #: website/public/showcase/ctf/index.html:498 msgctxt "page:showcase/ctf/index.html" msgid "REA · selected original instructions" msgstr "" #: website/public/showcase/ctf/index.html:522 msgctxt "page:showcase/ctf/index.html" msgid "Readable C · one-check summary" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: ECX #: website/public/showcase/ctf/index.html:551 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}01 · Start at zero.{ph1} {ph2} holds the running sum." msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/ctf/index.html:555 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" "{ph0}02 · Check the mask cell.{ph1} A zero value skips the character; a nonzero value " "includes it." msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/ctf/index.html:559 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" "{ph0}03 · Add a character code.{ph1} The input's integer at the same offset is added " "to the sum." msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/ctf/index.html:563 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" "{ph0}04 · Move to the next cell.{ph1} The original loop advances four bytes per " "integer and visits six rows of six cells." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: EAX #. {ph3}: Incorrect! #: website/public/showcase/ctf/index.html:568 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" "{ph0}05 · Compare with the stored target.{ph1} The caller receives the sum in {ph2}. A" " mismatch jumps to {ph3}." msgstr "" #: website/public/showcase/ctf/index.html:575 msgctxt "page:showcase/ctf/index.html" msgid "" "The instructions come from the summing helper and its caller. The C is an explanatory " "summary with descriptive names and a flattened 36-cell loop." msgstr "" #: website/public/showcase/ctf/index.html:583 msgctxt "page:showcase/ctf/index.html" msgid "Solve the 26 equations" msgstr "" #: website/public/showcase/ctf/index.html:584 msgctxt "page:showcase/ctf/index.html" msgid "" "Most masks select several cells. For example, the first check adds 16 character codes " "and requires a total of 1441. The overlapping selections give equations that a small " "Python script can solve together." msgstr "" #: website/public/showcase/ctf/index.html:592 msgctxt "page:showcase/ctf/index.html" msgid "Python · solver excerpt" msgstr "" #. {ph0}: DUCTF{…} #: website/public/showcase/ctf/index.html:620 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" "Z3 is a solver that finds values satisfying these equations. This excerpt uses the " "extracted checks and assumes a {ph0} flag with letters, digits, underscores and " "braces. The complete download includes all 26 masks and targets." msgstr "" #: website/public/showcase/ctf/index.html:626 msgctxt "page:showcase/ctf/index.html" msgid "Download the complete solver" msgstr "" #: website/public/showcase/ctf/index.html:632 msgctxt "page:showcase/ctf/index.html" msgid "Check the answer with the original program" msgstr "" #. {ph0}: z #. {ph1}: y #: website/public/showcase/ctf/index.html:633 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" "REA's process capture records the original executable accepting the solved flag. " "Changing one selected character from {ph0} to {ph1} makes the first sum 1440 instead " "of 1441, and the program rejects it." msgstr "" #: website/public/showcase/ctf/index.html:643 msgctxt "page:showcase/ctf/index.html" msgid "Input" msgstr "" #: website/public/showcase/ctf/index.html:644 msgctxt "page:showcase/ctf/index.html" msgid "Observed output" msgstr "" #: website/public/showcase/ctf/index.html:645 msgctxt "page:showcase/ctf/index.html" msgid "Exit code" msgstr "" #: website/public/showcase/ctf/index.html:650 msgctxt "page:showcase/ctf/index.html" msgid "Solver's flag" msgstr "" #: website/public/showcase/ctf/index.html:655 msgctxt "page:showcase/ctf/index.html" msgid "One character changed" msgstr "" #: website/public/showcase/ctf/index.html:663 msgctxt "page:showcase/ctf/index.html" msgid "Show the recovered flag and captured output" msgstr "" #: website/public/showcase/ctf/index.html:666 msgctxt "page:showcase/ctf/index.html" msgid "REA · original program output" msgstr "" #: website/public/showcase/ctf/index.html:667 msgctxt "page:showcase/ctf/index.html" msgid "Copy flag" msgstr "" #: website/public/showcase/ctf/index.html:679 msgctxt "page:showcase/ctf/index.html" msgid "" "The recovered value also matches the flag in the organizers' published challenge " "metadata, checked after solving the binary." msgstr "" #: website/public/showcase/ctf/index.html:685 msgctxt "page:showcase/ctf/index.html" msgid "Source, target identity and analysis details" msgstr "" #: website/public/showcase/ctf/index.html:686 msgctxt "page:showcase/ctf/index.html" msgid "" "Fresh analysis and two process captures on 8 October 2026, using REA 4.1.0 with Ghidra" " 12.1.4 on Linux x64. The binary is a stripped x86-64 ELF, 15,248 bytes." msgstr "" #: website/public/showcase/ctf/index.html:693 msgctxt "page:showcase/ctf/index.html" msgid "Original executable · SHA-256" msgstr "" #: website/public/showcase/ctf/index.html:697 msgctxt "page:showcase/ctf/index.html" msgid "" "The string references, functions and constants were inspected before reading the " "organizers' source or solution. The Python solver and the diagram were built from " "those REA results." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/showcase/ctf/index.html:702 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" "{ph0}Compare with the organizers' source{ph1} · {ph2}Challenge metadata and flag{ph3} " "· {ph4}REA evidence notes{ph5}" msgstr "" #: website/public/showcase/ctf/index.html:722 msgctxt "page:showcase/ctf/index.html" msgid "Try it yourself" msgstr "" #: website/public/showcase/ctf/index.html:723 msgctxt "page:showcase/ctf/index.html" msgid "" "Download the original challenge and the solver into one folder. Use the prompt above " "to investigate with your agent, or run the included script." msgstr "" #: website/public/showcase/ctf/index.html:729 msgctxt "page:showcase/ctf/index.html" msgid "Download the original challenge" msgstr "" #: website/public/showcase/ctf/index.html:733 msgctxt "page:showcase/ctf/index.html" msgid "Download solver" msgstr "" #: website/public/showcase/ctf/index.html:739 msgctxt "page:showcase/ctf/index.html" msgid "Terminal · solve and run" msgstr "" #. {ph0}: z3-solver #: website/public/showcase/ctf/index.html:756 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" "The script prints a candidate flag; paste it at the program's prompt. Solving needs " "Python and {ph0}. Running the original executable needs Linux x86-64." msgstr "" #: website/public/showcase/ctf/index.html:761 msgctxt "page:showcase/ctf/index.html" msgid "Set up REA with your coding agent" msgstr "" #: website/public/showcase/ctf/index.html:6 msgctxt "page:showcase/ctf/index.html" msgid "CTF Reverse Engineering: DownUnderCTF Flag Checker — REA" msgstr "" #: website/public/showcase/ctf/index.html:7 msgctxt "page:showcase/ctf/index.html" msgid "" "Use REA to solve DownUnderCTF's masked squares flag checker. Find the checking " "functions, extract the masks and compare a recovered flag with the original program." msgstr "" #: website/public/showcase/ctf/index.html:254 msgctxt "page:showcase/ctf/index.html" msgid "On this page" msgstr "" #: website/public/showcase/ctf/index.html:265 msgctxt "page:showcase/ctf/index.html" msgid "CTF flag-checker case study" msgstr "" #: website/public/showcase/ctf/index.html:280 msgctxt "page:showcase/ctf/index.html" msgid "Copy CTF example prompt" msgstr "" #: website/public/showcase/ctf/index.html:391 msgctxt "page:showcase/ctf/index.html" msgid "CTF mask equation; scroll horizontally on smaller screens" msgstr "" #: website/public/showcase/ctf/index.html:397 msgctxt "page:showcase/ctf/index.html" msgid "" "The seventh mask skips 21 cells, selects position 21, then skips 14. Only that cell " "contributes to the sum. Its required character code is 55, which means the character " "is 7." msgstr "" #: website/public/showcase/ctf/index.html:449 msgctxt "page:showcase/ctf/index.html" msgid "Follow the CTF check" msgstr "" #: website/public/showcase/ctf/index.html:499 msgctxt "page:showcase/ctf/index.html" msgid "Copy CTF assembly" msgstr "" #: website/public/showcase/ctf/index.html:523 msgctxt "page:showcase/ctf/index.html" msgid "Copy readable CTF check" msgstr "" #: website/public/showcase/ctf/index.html:593 msgctxt "page:showcase/ctf/index.html" msgid "Copy CTF solver excerpt" msgstr "" #: website/public/showcase/ctf/index.html:667 msgctxt "page:showcase/ctf/index.html" msgid "Copy recovered flag" msgstr "" #: website/public/showcase/ctf/index.html:740 msgctxt "page:showcase/ctf/index.html" msgid "Copy CTF solver commands" msgstr "" #: website/public/showcase/ctf/index.html:783 msgctxt "page:showcase/ctf/index.html" msgid "Back to top" msgstr "" #: website/public/showcase/dx-ball/index.html:107 msgctxt "page:showcase/dx-ball/index.html" msgid "Skip to content" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/showcase/dx-ball/index.html:199 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}Home{ph1} / {ph2}Showcases{ph3} / DX-Ball" msgstr "" #: website/public/showcase/dx-ball/index.html:202 msgctxt "page:showcase/dx-ball/index.html" msgid "Case study · DX-Ball 1.07" msgstr "" #. {ph0}:
#: website/public/showcase/dx-ball/index.html:203 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "Rebuilding DX-Ball{ph0}from its executable." msgstr "" #: website/public/showcase/dx-ball/index.html:204 msgctxt "page:showcase/dx-ball/index.html" msgid "" "The goal is a maintainable C version of the 1996 Windows game. REA helps the agent " "inspect the original, one function at a time." msgstr "" #: website/public/showcase/dx-ball/index.html:208 msgctxt "page:showcase/dx-ball/index.html" msgid "Windows i386 · C · REA" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/dx-ball/index.html:225 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" "One function, from executable to checked C. REA supplies the instructions, callers and" " data reads; the reconstruction project implements and tests the result. {ph0}Open " "figure{ph1}" msgstr "" #: website/public/showcase/dx-ball/index.html:236 msgctxt "page:showcase/dx-ball/index.html" msgid "In this case study" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/dx-ball/index.html:238 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}The project{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/dx-ball/index.html:239 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}Sound pan{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/dx-ball/index.html:240 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}Checking the result{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/dx-ball/index.html:241 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}Continue the work{ph1}" msgstr "" #: website/public/showcase/dx-ball/index.html:249 msgctxt "page:showcase/dx-ball/index.html" msgid "maintained C functions" msgstr "" #: website/public/showcase/dx-ball/index.html:253 msgctxt "page:showcase/dx-ball/index.html" msgid "comparisons with original code" msgstr "" #: website/public/showcase/dx-ball/index.html:257 msgctxt "page:showcase/dx-ball/index.html" msgid "functions with matching compiled bytes" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/showcase/dx-ball/index.html:260 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" "Project checkpoint: 7 October 2026. {ph0}Progress ledger{ph1} · {ph2}Test " "coverage{ph3}" msgstr "" #: website/public/showcase/dx-ball/index.html:272 msgctxt "page:showcase/dx-ball/index.html" msgid "The project so far" msgstr "" #: website/public/showcase/dx-ball/index.html:273 msgctxt "page:showcase/dx-ball/index.html" msgid "" "The recovered code covers board and resource handling, brick hits, animations, " "particles and bonus production. Current builds provide inspection utilities and an " "analysis library. Work on the playable game continues with ball and paddle physics, " "power-up handling and Windows integration." msgstr "" #: website/public/showcase/dx-ball/index.html:283 msgctxt "page:showcase/dx-ball/index.html" msgid "Finding the sound-pan calculation" msgstr "" #: website/public/showcase/dx-ball/index.html:284 msgctxt "page:showcase/dx-ball/index.html" msgid "" "When a brick is hit, its horizontal position is passed to the sound code. The " "investigation needed to recover how that screen coordinate becomes a left/right " "panning value." msgstr "" #. {ph0}: #: website/public/showcase/dx-ball/index.html:291 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" msgstr "" #: website/public/showcase/dx-ball/index.html:295 #: website/public/showcase/dx-ball/index.html:486 #: website/public/showcase/dx-ball/index.html:507 #: website/public/showcase/dx-ball/index.html:578 #: website/public/showcase/dx-ball/index.html:732 msgctxt "page:showcase/dx-ball/index.html" msgid "Copy" msgstr "" #. {ph0}: #. {ph2}: #. {ph3}: #. {ph4}: #: website/public/showcase/dx-ball/index.html:304 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" "{ph0}›{ph1}{ph2}Use REA to find how DX-Ball calculates sound panning. Explain the " "calculation and show the code.{ph3}{ph4}{ph5}" msgstr "" #: website/public/showcase/dx-ball/index.html:312 msgctxt "page:showcase/dx-ball/index.html" msgid "" "An example prompt for your coding agent, with the local executable available. The " "investigation below shows the REA queries and evidence behind the answer." msgstr "" #: website/public/showcase/dx-ball/index.html:317 msgctxt "page:showcase/dx-ball/index.html" msgid "" "The agent used REA to inspect the function, follow its brick-hit caller and read the " "constants from the executable. Those results supplied the input and arithmetic needed " "to write the C function below." msgstr "" #. {ph0}: 0x406400 #. {ph1}: FUN_00406400(void) #. {ph2}: __ftol() #: website/public/showcase/dx-ball/index.html:323 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" "The first function result for {ph0} included pseudocode declaring {ph1} and calling " "{ph2}. Its instruction view showed a stack input and floating-point operations. That " "discrepancy gave the agent a concrete reason to keep investigating." msgstr "" #: website/public/showcase/dx-ball/index.html:331 msgctxt "page:showcase/dx-ball/index.html" msgid "The first decompiler view" msgstr "" #: website/public/showcase/dx-ball/index.html:334 msgctxt "page:showcase/dx-ball/index.html" msgid "REA result · pseudocode excerpt" msgstr "" #: website/public/showcase/dx-ball/index.html:344 msgctxt "page:showcase/dx-ball/index.html" msgid "" "The output shows a conversion call. Reading the instructions below reveals the input " "and the calculation feeding that call." msgstr "" #: website/public/showcase/dx-ball/index.html:350 msgctxt "page:showcase/dx-ball/index.html" msgid "Three questions answered through REA" msgstr "" #: website/public/showcase/dx-ball/index.html:353 msgctxt "page:showcase/dx-ball/index.html" msgid "Recover the missing input" msgstr "" #. {ph0}: analyze_function #: website/public/showcase/dx-ball/index.html:357 #: website/public/showcase/dx-ball/index.html:381 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "Agent → REA · {ph0}" msgstr "" #: website/public/showcase/dx-ball/index.html:363 msgctxt "page:showcase/dx-ball/index.html" msgid "REA → agent · instruction excerpt" msgstr "" #. {ph0}: [EBP+8] #: website/public/showcase/dx-ball/index.html:370 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" "The function result includes instructions alongside pseudocode and callers. Here, " "{ph0} exposes the integer input missing from the decompiler view." msgstr "" #: website/public/showcase/dx-ball/index.html:377 msgctxt "page:showcase/dx-ball/index.html" msgid "Follow the caller to understand the input" msgstr "" #: website/public/showcase/dx-ball/index.html:387 msgctxt "page:showcase/dx-ball/index.html" msgid "REA → agent · caller excerpt" msgstr "" #. {ph0}: tile_x #. {ph1}: 20 + 30 × tile_x #: website/public/showcase/dx-ball/index.html:394 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" "REA identified this caller in the first result. Its preceding instructions scale {ph0}" " by 30; adding 20 gives the brick's screen coordinate, {ph1}." msgstr "" #: website/public/showcase/dx-ball/index.html:401 msgctxt "page:showcase/dx-ball/index.html" msgid "Read the values behind the memory addresses" msgstr "" #. {ph0}: read_bytes #: website/public/showcase/dx-ball/index.html:405 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "Agent → REA · two {ph0} requests" msgstr "" #: website/public/showcase/dx-ball/index.html:415 msgctxt "page:showcase/dx-ball/index.html" msgid "REA byte results · decoded as doubles" msgstr "" #: website/public/showcase/dx-ball/index.html:422 msgctxt "page:showcase/dx-ball/index.html" msgid "" "The returned bytes establish the two arithmetic constants and initial pan scale. The " "agent now has the values needed for the C expression." msgstr "" #: website/public/showcase/dx-ball/index.html:430 msgctxt "page:showcase/dx-ball/index.html" msgid "From REA's findings to C" msgstr "" #: website/public/showcase/dx-ball/index.html:431 msgctxt "page:showcase/dx-ball/index.html" msgid "" "Follow the five steps below. Each selection highlights the original instructions and " "the C lines they informed." msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/dx-ball/index.html:441 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}01{ph1} Input" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/dx-ball/index.html:449 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}02{ph1} Multiply" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/dx-ball/index.html:457 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}03{ph1} Subtract" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/dx-ball/index.html:465 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}04{ph1} Scale" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/dx-ball/index.html:473 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}05{ph1} Return" msgstr "" #: website/public/showcase/dx-ball/index.html:485 msgctxt "page:showcase/dx-ball/index.html" msgid "Original x86 · excerpt" msgstr "" #: website/public/showcase/dx-ball/index.html:506 msgctxt "page:showcase/dx-ball/index.html" msgid "Reconstructed C" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: [EBP+8] #. {ph3}: FILD #. {ph4}: x #: website/public/showcase/dx-ball/index.html:533 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" "{ph0}01 · Read the input.{ph1} The instruction view in REA's function result reads " "{ph2} and uses {ph3} to load the integer. Following its caller through REA establishes" " the screen-coordinate meaning of the C parameter {ph4}." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: FMUL #. {ph3}: 0x420068 #. {ph4}: read_bytes #. {ph5}: 1.5625 #: website/public/showcase/dx-ball/index.html:540 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" "{ph0}02 · Multiply by 1.5625.{ph1} {ph2} reads the double at {ph3}. The bytes returned" " by REA's {ph4} decode to {ph5}; the C uses the same constant." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: FSUB #. {ph3}: 0x420070 #. {ph4}: 500.0 #. {ph5}: 320 #: website/public/showcase/dx-ball/index.html:546 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" "{ph0}03 · Subtract 500.0.{ph1} {ph2} reads the double at {ph3}. REA's byte result " "decodes to {ph4}, shifting the calculation's center to screen coordinate {ph5}." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: FMUL #. {ph3}: 0x4210a0 #. {ph4}: dxball_pan_scale #. {ph5}: 1.0 #: website/public/showcase/dx-ball/index.html:552 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" "{ph0}04 · Apply the stored scale.{ph1} The second {ph2} reads {ph3}. That global is " "named {ph4} in the maintained source. REA's second byte read establishes its initial " "value of {ph5}." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: 0x406430 #. {ph3}: __ftol #. {ph4}: DxBallInt #: website/public/showcase/dx-ball/index.html:559 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" "{ph0}05 · Return an integer.{ph1} The call at {ph2} reaches {ph3}, identified in REA's" " callee results. The C casts the result to {ph4}; original-x86 comparisons check the " "returned value." msgstr "" #: website/public/showcase/dx-ball/index.html:568 msgctxt "page:showcase/dx-ball/index.html" msgid "" "The assembly excerpt selects the input, arithmetic and return instructions. The full " "listing below also includes the intervening stores and function setup and cleanup." msgstr "" #: website/public/showcase/dx-ball/index.html:574 msgctxt "page:showcase/dx-ball/index.html" msgid "Full assembly and supporting evidence" msgstr "" #: website/public/showcase/dx-ball/index.html:577 msgctxt "page:showcase/dx-ball/index.html" msgid "REA result · 0x406400–0x40643e" msgstr "" #: website/public/showcase/dx-ball/index.html:611 msgctxt "page:showcase/dx-ball/index.html" msgid "What the caller supplies" msgstr "" #. {ph0}: 0x411f40 #: website/public/showcase/dx-ball/index.html:612 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" "The brick-hit function at {ph0} scales its tile coordinate by 30, adds 20, then pushes" " it before the call:" msgstr "" #: website/public/showcase/dx-ball/index.html:626 msgctxt "page:showcase/dx-ball/index.html" msgid "What the data reads establish" msgstr "" #: website/public/showcase/dx-ball/index.html:629 msgctxt "page:showcase/dx-ball/index.html" msgid "REA byte reads, decoded as little-endian doubles" msgstr "" #: website/public/showcase/dx-ball/index.html:634 msgctxt "page:showcase/dx-ball/index.html" msgid "Address" msgstr "" #: website/public/showcase/dx-ball/index.html:635 msgctxt "page:showcase/dx-ball/index.html" msgid "Value" msgstr "" #: website/public/showcase/dx-ball/index.html:636 msgctxt "page:showcase/dx-ball/index.html" msgid "Used for" msgstr "" #: website/public/showcase/dx-ball/index.html:643 msgctxt "page:showcase/dx-ball/index.html" msgid "First multiplication" msgstr "" #: website/public/showcase/dx-ball/index.html:648 msgctxt "page:showcase/dx-ball/index.html" msgid "Subtraction" msgstr "" #. {ph0}: 1.0 #: website/public/showcase/dx-ball/index.html:652 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0} initially" msgstr "" #: website/public/showcase/dx-ball/index.html:653 msgctxt "page:showcase/dx-ball/index.html" msgid "Stored pan scale" msgstr "" #: website/public/showcase/dx-ball/index.html:658 msgctxt "page:showcase/dx-ball/index.html" msgid "" "Recorded with REA 4.1.0 for the hash-pinned DX-Ball 1.07 target. The linked " "investigation notes retain the Evidence IDs." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/showcase/dx-ball/index.html:663 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" "{ph0}Maintained source{ph1} · {ph2}Investigation notes and evidence references{ph3}" msgstr "" #: website/public/showcase/dx-ball/index.html:677 msgctxt "page:showcase/dx-ball/index.html" msgid "Checking the recovered function" msgstr "" #: website/public/showcase/dx-ball/index.html:678 msgctxt "page:showcase/dx-ball/index.html" msgid "" "The recovered function passes two checks: its return values match the original, and " "its compiled bytes match the executable." msgstr "" #: website/public/showcase/dx-ball/index.html:684 msgctxt "page:showcase/dx-ball/index.html" msgid "3,205 behavior cases" msgstr "" #: website/public/showcase/dx-ball/index.html:685 msgctxt "page:showcase/dx-ball/index.html" msgid "" "The tests execute the original x86 function and compare its return value with the " "maintained C. They cover every integer position from 0 to 640 at five pan scales: 0, " "0.5, 1, 20 and −1." msgstr "" #: website/public/showcase/dx-ball/index.html:693 msgctxt "page:showcase/dx-ball/index.html" msgid "63 matching bytes" msgstr "" #: website/public/showcase/dx-ball/index.html:694 msgctxt "page:showcase/dx-ball/index.html" msgid "" "The C function is compiled with the pinned VC4.0 toolchain. Compiler replay matches " "the complete function after applying the reviewed relocations and checking the " "referenced constants." msgstr "" #: website/public/showcase/dx-ball/index.html:702 msgctxt "page:showcase/dx-ball/index.html" msgid "" "At a scale of 1, the recovered calculation returns −500 at the left edge, 0 at the " "center and 500 at the right edge. The next part of the audio work is integrating that " "value with the game's sound backend." msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/dx-ball/index.html:708 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}Read the compiler replay details{ph1}" msgstr "" #: website/public/showcase/dx-ball/index.html:717 msgctxt "page:showcase/dx-ball/index.html" msgid "Continue the investigation" msgstr "" #: website/public/showcase/dx-ball/index.html:718 msgctxt "page:showcase/dx-ball/index.html" msgid "" "The same approach is being used for particle updates, explosion queues and bonus " "generation: inspect the relevant functions, recover their state and dependencies, then" " compare the implementation with the original." msgstr "" #: website/public/showcase/dx-ball/index.html:724 msgctxt "page:showcase/dx-ball/index.html" msgid "" "To inspect the sound-pan function yourself, follow the DX-Ball project's setup " "instructions and supply its matching original target. Then run:" msgstr "" #: website/public/showcase/dx-ball/index.html:731 msgctxt "page:showcase/dx-ball/index.html" msgid "In the DX-Ball checkout" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/showcase/dx-ball/index.html:745 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}DX-Ball repository{ph1}{ph2}Current source, progress and local setup.{ph3}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/showcase/dx-ball/index.html:750 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" "{ph0}REA analysis workflow{ph1}{ph2}Follow the calculation, then use the same approach" " with your own binary.{ph3}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/showcase/dx-ball/index.html:757 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" "{ph0}Particles and bonus production{ph1}{ph2}A larger investigation into state, queues" " and pixel writes.{ph3}" msgstr "" #: website/public/showcase/dx-ball/index.html:768 msgctxt "page:showcase/dx-ball/index.html" msgid "Start with your own target" msgstr "" #: website/public/showcase/dx-ball/index.html:6 msgctxt "page:showcase/dx-ball/index.html" msgid "DX-Ball Reverse Engineering: Sound Panning — REA" msgstr "" #: website/public/showcase/dx-ball/index.html:7 msgctxt "page:showcase/dx-ball/index.html" msgid "" "Follow a DX-Ball reconstruction from binary analysis through REA to maintained C, " "original-x86 tests and matching compiled function bytes." msgstr "" #: website/public/showcase/dx-ball/index.html:211 msgctxt "page:showcase/dx-ball/index.html" msgid "DX-Ball sound-pan investigation; scroll horizontally on smaller screens" msgstr "" #: website/public/showcase/dx-ball/index.html:217 msgctxt "page:showcase/dx-ball/index.html" msgid "" "DXBALL.EXE function 0x00406400 is inspected with REA. A brick-hit caller supplies 20 " "plus 30 times tile_x. Instructions load x, multiply by 1.5625, subtract 500.0, apply " "pan_scale and return an integer. The maintained C is checked independently against the" " original x86 in 3,205 cases and by VC4.0 compiler replay matching 63 bytes." msgstr "" #: website/public/showcase/dx-ball/index.html:235 msgctxt "page:showcase/dx-ball/index.html" msgid "On this page" msgstr "" #: website/public/showcase/dx-ball/index.html:244 msgctxt "page:showcase/dx-ball/index.html" msgid "DX-Ball reconstruction case study" msgstr "" #: website/public/showcase/dx-ball/index.html:295 msgctxt "page:showcase/dx-ball/index.html" msgid "Copy example prompt" msgstr "" #: website/public/showcase/dx-ball/index.html:436 msgctxt "page:showcase/dx-ball/index.html" msgid "Follow the sound-pan calculation" msgstr "" #: website/public/showcase/dx-ball/index.html:486 msgctxt "page:showcase/dx-ball/index.html" msgid "Copy original assembly excerpt" msgstr "" #: website/public/showcase/dx-ball/index.html:507 msgctxt "page:showcase/dx-ball/index.html" msgid "Copy sound-pan function" msgstr "" #: website/public/showcase/dx-ball/index.html:578 msgctxt "page:showcase/dx-ball/index.html" msgid "Copy complete sound-pan assembly" msgstr "" #: website/public/showcase/dx-ball/index.html:732 msgctxt "page:showcase/dx-ball/index.html" msgid "Copy DX-Ball analysis command" msgstr "" #: website/public/showcase/dx-ball/index.html:791 msgctxt "page:showcase/dx-ball/index.html" msgid "Back to top" msgstr "" #: website/public/showcase/index.html:107 msgctxt "page:showcase/index.html" msgid "Skip to content" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/index.html:199 #, python-brace-format msgctxt "page:showcase/index.html" msgid "{ph0}Home{ph1} / Showcases" msgstr "" #: website/public/showcase/index.html:200 msgctxt "page:showcase/index.html" msgid "REA case studies." msgstr "" #: website/public/showcase/index.html:201 msgctxt "page:showcase/index.html" msgid "" "Android, games, Electron and a CTF challenge, with code, figures and checked results." msgstr "" #: website/public/showcase/index.html:208 msgctxt "page:showcase/index.html" msgid "Android · APK analysis" msgstr "" #: website/public/showcase/index.html:210 msgctxt "page:showcase/index.html" msgid "How an authenticator generates a login code" msgstr "" #: website/public/showcase/index.html:211 msgctxt "page:showcase/index.html" msgid "" "Find Aegis's six-digit code calculation in its released APK. Trace the generating " "methods with REA, then move a demo clock to see why the code changes every 30 seconds." msgstr "" #: website/public/showcase/index.html:217 msgctxt "page:showcase/index.html" msgid "APK" msgstr "" #: website/public/showcase/index.html:218 msgctxt "page:showcase/index.html" msgid "Generating code" msgstr "" #: website/public/showcase/index.html:219 msgctxt "page:showcase/index.html" msgid "Recovered rule" msgstr "" #: website/public/showcase/index.html:220 msgctxt "page:showcase/index.html" msgid "Adjustable clock" msgstr "" #: website/public/showcase/index.html:222 msgctxt "page:showcase/index.html" msgid "Read the Android case study" msgstr "" #: website/public/showcase/index.html:226 msgctxt "page:showcase/index.html" msgid "CTF · Native analysis" msgstr "" #: website/public/showcase/index.html:228 msgctxt "page:showcase/index.html" msgid "Solve a CTF flag checker" msgstr "" #: website/public/showcase/index.html:229 msgctxt "page:showcase/index.html" msgid "" "Inspect an easy DownUnderCTF challenge with REA. Find its checking functions, turn " "masks and sums into equations, then verify the solved flag with the original program." msgstr "" #: website/public/showcase/index.html:235 msgctxt "page:showcase/index.html" msgid "Binary" msgstr "" #: website/public/showcase/index.html:236 msgctxt "page:showcase/index.html" msgid "Checking code" msgstr "" #: website/public/showcase/index.html:237 msgctxt "page:showcase/index.html" msgid "Equations" msgstr "" #: website/public/showcase/index.html:238 msgctxt "page:showcase/index.html" msgid "Correct!" msgstr "" #: website/public/showcase/index.html:240 msgctxt "page:showcase/index.html" msgid "Read the CTF case study" msgstr "" #: website/public/showcase/index.html:244 msgctxt "page:showcase/index.html" msgid "Native · Reconstruction" msgstr "" #: website/public/showcase/index.html:246 msgctxt "page:showcase/index.html" msgid "DX-Ball's sound-pan calculation" msgstr "" #: website/public/showcase/index.html:247 msgctxt "page:showcase/index.html" msgid "" "Recover a sound-pan calculation from a 1996 Windows game. REA's instructions, caller " "references and numeric constants lead to a small C function, checked against the " "original behavior and all 63 compiled bytes." msgstr "" #: website/public/showcase/index.html:254 msgctxt "page:showcase/index.html" msgid "Executable" msgstr "" #: website/public/showcase/index.html:255 msgctxt "page:showcase/index.html" msgid "REA findings" msgstr "" #: website/public/showcase/index.html:256 msgctxt "page:showcase/index.html" msgid "Recovered C" msgstr "" #: website/public/showcase/index.html:257 msgctxt "page:showcase/index.html" msgid "Validation" msgstr "" #: website/public/showcase/index.html:259 msgctxt "page:showcase/index.html" msgid "Read the DX-Ball case study" msgstr "" #: website/public/showcase/index.html:263 msgctxt "page:showcase/index.html" msgid "Electron · Feature tracing" msgstr "" #: website/public/showcase/index.html:265 msgctxt "page:showcase/index.html" msgid "How Notion copies text and HTML" msgstr "" #: website/public/showcase/index.html:266 msgctxt "page:showcase/index.html" msgid "" "Trace a page-facing API through Notion's packaged JavaScript. Follow its IPC wrappers " "to the system clipboard, then see how a small HTML marker keeps rich block data " "connected to a copy." msgstr "" #: website/public/showcase/index.html:272 msgctxt "page:showcase/index.html" msgid "Packaged app" msgstr "" #: website/public/showcase/index.html:273 msgctxt "page:showcase/index.html" msgid "Exposed API" msgstr "" #: website/public/showcase/index.html:274 msgctxt "page:showcase/index.html" msgid "IPC wrappers" msgstr "" #: website/public/showcase/index.html:275 msgctxt "page:showcase/index.html" msgid "Clipboard" msgstr "" #: website/public/showcase/index.html:277 msgctxt "page:showcase/index.html" msgid "Read the Notion case study" msgstr "" #: website/public/showcase/index.html:281 msgctxt "page:showcase/index.html" msgid "PC-98 DOS · Reconstruction" msgstr "" #: website/public/showcase/index.html:283 msgctxt "page:showcase/index.html" msgid "How TH04 aims a ring of bullets" msgstr "" #: website/public/showcase/index.html:284 msgctxt "page:showcase/index.html" msgid "" "Inspect the original 16-bit angle helper with REA. Match its multiply, divide and " "coordinate operations to readable C++, then see how they produce a ring aimed at the " "player." msgstr "" #: website/public/showcase/index.html:290 msgctxt "page:showcase/index.html" msgid "Original DOS code" msgstr "" #: website/public/showcase/index.html:291 msgctxt "page:showcase/index.html" msgid "REA instructions" msgstr "" #: website/public/showcase/index.html:292 msgctxt "page:showcase/index.html" msgid "Angle calculation" msgstr "" #: website/public/showcase/index.html:293 msgctxt "page:showcase/index.html" msgid "Bullet ring" msgstr "" #: website/public/showcase/index.html:295 msgctxt "page:showcase/index.html" msgid "Read the TH04 case study" msgstr "" #: website/public/showcase/index.html:300 msgctxt "page:showcase/index.html" msgid "Step-by-step guides" msgstr "" #: website/public/showcase/index.html:301 msgctxt "page:showcase/index.html" msgid "" "The guides walk through a native calculation, an Electron export and a browser " "request. Each starts with a prompt and a concrete target." msgstr "" #: website/public/showcase/index.html:305 msgctxt "page:showcase/index.html" msgid "Read the guides" msgstr "" #: website/public/showcase/index.html:6 msgctxt "page:showcase/index.html" msgid "Reverse Engineering Case Studies — REA" msgstr "" #: website/public/showcase/index.html:7 msgctxt "page:showcase/index.html" msgid "" "Follow REA investigations through code, figures and demos: an Android authenticator, " "DX-Ball, Notion, TH04 and a DownUnderCTF flag checker." msgstr "" #: website/public/showcase/index.html:323 msgctxt "page:showcase/index.html" msgid "Back to top" msgstr "" #: website/public/showcase/notion/index.html:107 msgctxt "page:showcase/notion/index.html" msgid "Skip to content" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/showcase/notion/index.html:199 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "{ph0}Home{ph1} / {ph2}Showcases{ph3} / Notion" msgstr "" #: website/public/showcase/notion/index.html:202 msgctxt "page:showcase/notion/index.html" msgid "Case study · Electron" msgstr "" #. {ph0}:
#: website/public/showcase/notion/index.html:203 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "How Notion copies{ph0}text and HTML." msgstr "" #: website/public/showcase/notion/index.html:204 msgctxt "page:showcase/notion/index.html" msgid "" "Trace a clipboard call from Notion's page API, through the preload and main process, " "to Electron's clipboard writer." msgstr "" #: website/public/showcase/notion/index.html:208 msgctxt "page:showcase/notion/index.html" msgid "Notion Desktop 7.6.1 · JavaScript · REA" msgstr "" #: website/public/showcase/notion/index.html:212 msgctxt "page:showcase/notion/index.html" msgid "The bridge inside Notion's desktop package" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: clipboard.write(data) #. {ph4}: #. {ph5}: #. {ph6}: #: website/public/showcase/notion/index.html:214 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" "{ph0}01 · Page-facing API{ph1} {ph2}{ph3}{ph4} {ph5}The preload exposes a callable " "method.{ph6}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: ipcRenderer.invoke #. {ph4}: #. {ph5}: #. {ph6}: #: website/public/showcase/notion/index.html:221 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" "{ph0}02 · Preload wrapper{ph1} {ph2}{ph3}{ph4} {ph5}The wrapper sends the channel and " "arguments.{ph6}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: ipcMain.handle #. {ph4}: #. {ph5}: #. {ph6}: #: website/public/showcase/notion/index.html:228 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" "{ph0}03 · Main-process handler{ph1} {ph2}{ph3}{ph4} {ph5}The receiver checks which " "page sent it.{ph6}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: clipboard.write(data) #. {ph4}: #. {ph5}: #. {ph6}: #: website/public/showcase/notion/index.html:235 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" "{ph0}04 · System clipboard{ph1} {ph2}{ph3}{ph4} {ph5}Electron writes the supplied text" " and HTML.{ph6}" msgstr "" #. {ph0}: notion:clipboard:write #: website/public/showcase/notion/index.html:243 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "One channel joins the two sides: {ph0}" msgstr "" #: website/public/showcase/notion/index.html:247 msgctxt "page:showcase/notion/index.html" msgid "" "The packaged code uses the same channel in the preload and main process. Resolving the" " wrappers reveals the Electron calls behind those names." msgstr "" #: website/public/showcase/notion/index.html:256 msgctxt "page:showcase/notion/index.html" msgid "In this case study" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/notion/index.html:258 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "{ph0}Follow the clipboard bridge{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/notion/index.html:259 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "{ph0}Keeping a block's structure{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/notion/index.html:260 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "{ph0}More examples and sources{ph1}" msgstr "" #: website/public/showcase/notion/index.html:265 msgctxt "page:showcase/notion/index.html" msgid "Where does the copy operation go?" msgstr "" #. {ph0}: clipboard.write #: website/public/showcase/notion/index.html:266 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" "The page sees a method called {ph0}. Its implementation in the preload is a wrapper. " "The useful question is what that wrapper sends, and which code receives it." msgstr "" #. {ph0}: #: website/public/showcase/notion/index.html:273 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" msgstr "" #: website/public/showcase/notion/index.html:277 #: website/public/showcase/notion/index.html:350 #: website/public/showcase/notion/index.html:379 #: website/public/showcase/notion/index.html:410 #: website/public/showcase/notion/index.html:438 msgctxt "page:showcase/notion/index.html" msgid "Copy" msgstr "" #. {ph0}: #. {ph2}: #. {ph3}: #. {ph4}: #: website/public/showcase/notion/index.html:286 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" "{ph0}›{ph1}{ph2}Use REA to trace how Notion copies text and HTML to the system " "clipboard. Show the code at each step.{ph3}{ph4}{ph5}" msgstr "" #: website/public/showcase/notion/index.html:294 msgctxt "page:showcase/notion/index.html" msgid "" "An example prompt with Notion's local application package available to your coding " "agent." msgstr "" #: website/public/showcase/notion/index.html:299 msgctxt "page:showcase/notion/index.html" msgid "REA finds where to start reading" msgstr "" #: website/public/showcase/notion/index.html:300 msgctxt "page:showcase/notion/index.html" msgid "" "Analyzing the tab preload with REA locates the API exposed to the page and the call " "that sends an IPC request. Both findings come with source ranges in the minified " "bundle:" msgstr "" #: website/public/showcase/notion/index.html:306 msgctxt "page:showcase/notion/index.html" msgid "REA findings → two places to open" msgstr "" #: website/public/showcase/notion/index.html:309 msgctxt "page:showcase/notion/index.html" msgid "Exposed page API" msgstr "" #: website/public/showcase/notion/index.html:315 msgctxt "page:showcase/notion/index.html" msgid "Renderer IPC call" msgstr "" #. {ph0}: analyze_javascript_application #: website/public/showcase/notion/index.html:321 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" "Selected fields from a fresh {ph0} result on Notion's tab preload, recorded with REA " "4.1.0. Positions use the original bundle's line and zero-based column." msgstr "" #. {ph0}: invokerInMain #. {ph1}: notion:clipboard:write #: website/public/showcase/notion/index.html:328 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" "The agent opens those locations, finds the clipboard member in the assembled API, and " "reads {ph0}. Its call site supplies {ph1}. That name gives the agent something precise" " to look for in the main bundle. The four excerpts below show the route it connects." msgstr "" #: website/public/showcase/notion/index.html:337 msgctxt "page:showcase/notion/index.html" msgid "Four short pieces of code" msgstr "" #: website/public/showcase/notion/index.html:338 msgctxt "page:showcase/notion/index.html" msgid "" "Simplified from the packaged JavaScript, with readable variable names. Unrelated " "members are omitted." msgstr "" #: website/public/showcase/notion/index.html:344 msgctxt "page:showcase/notion/index.html" msgid "Start at the API exposed to the page" msgstr "" #. {ph0}: preload.js #: website/public/showcase/notion/index.html:347 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "tab_browser_view/{ph0} · API member" msgstr "" #. {ph0}: invokerInMain #: website/public/showcase/notion/index.html:366 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" "This member supplies the channel name. The implementation of {ph0} tells us how the " "request leaves the page's process." msgstr "" #: website/public/showcase/notion/index.html:373 msgctxt "page:showcase/notion/index.html" msgid "Resolve the preload's wrapper" msgstr "" #. {ph0}: preload.js #: website/public/showcase/notion/index.html:376 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "tab_browser_view/{ph0} · IPC helper" msgstr "" #. {ph0}: notion:clipboard:write #: website/public/showcase/notion/index.html:396 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" "The returned function forwards the arguments through Electron's request-and-response " "IPC. We can now look for {ph0} on the main-process side." msgstr "" #: website/public/showcase/notion/index.html:404 msgctxt "page:showcase/notion/index.html" msgid "Check how the receiver is registered" msgstr "" #. {ph0}: index.js #: website/public/showcase/notion/index.html:407 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "main/{ph0} · handler helper" msgstr "" #. {ph0}: addListener #. {ph1}: ipcMain.handle #: website/public/showcase/notion/index.html:425 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" "The main process uses another wrapper. Its {ph0} method registers an {ph1} receiver " "for that channel." msgstr "" #: website/public/showcase/notion/index.html:432 msgctxt "page:showcase/notion/index.html" msgid "Find the write and its sender check" msgstr "" #. {ph0}: index.js #: website/public/showcase/notion/index.html:435 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "main/{ph0} · clipboard receiver" msgstr "" #: website/public/showcase/notion/index.html:455 msgctxt "page:showcase/notion/index.html" msgid "" "This is the destination. After checking the sender, the handler passes the supplied " "data to Electron's clipboard API. The channel and the two resolved wrappers connect " "the exposed method to this call." msgstr "" #: website/public/showcase/notion/index.html:466 msgctxt "page:showcase/notion/index.html" msgid "How does a copied block keep its structure?" msgstr "" #. {ph0}: electronApi.clipboard.write #: website/public/showcase/notion/index.html:467 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" "Notion's web editor sends text and HTML through {ph0}. It keeps the block data locally" " and puts an ID in the copied HTML to connect them." msgstr "" #: website/public/showcase/notion/index.html:473 msgctxt "page:showcase/notion/index.html" msgid "HTML links to saved block data" msgstr "" #: website/public/showcase/notion/index.html:477 msgctxt "page:showcase/notion/index.html" msgid "Sent to the system clipboard" msgstr "" #: website/public/showcase/notion/index.html:485 msgctxt "page:showcase/notion/index.html" msgid "Saved locally by Notion" msgstr "" #: website/public/showcase/notion/index.html:497 msgctxt "page:showcase/notion/index.html" msgid "Read the HTML ID" msgstr "" #: website/public/showcase/notion/index.html:498 msgctxt "page:showcase/notion/index.html" msgid "Find the same local ID" msgstr "" #: website/public/showcase/notion/index.html:499 msgctxt "page:showcase/notion/index.html" msgid "Restore Notion block data" msgstr "" #: website/public/showcase/notion/index.html:501 msgctxt "page:showcase/notion/index.html" msgid "" "Illustrative text and ID. The recorded module test restores the block data when IDs " "match; a stale entry returns only text and HTML." msgstr "" #: website/public/showcase/notion/index.html:507 msgctxt "page:showcase/notion/index.html" msgid "" "On paste, Notion looks for the HTML ID and checks it against the saved copy. Matching " "IDs restore the block data." msgstr "" #: website/public/showcase/notion/index.html:511 msgctxt "page:showcase/notion/index.html" msgid "Clipboard format recorded from web assets cached on July 13, 2026." msgstr "" #: website/public/showcase/notion/index.html:517 msgctxt "page:showcase/notion/index.html" msgid "More examples and sources" msgstr "" #: website/public/showcase/notion/index.html:519 msgctxt "page:showcase/notion/index.html" msgid "Another example: Markdown tables" msgstr "" #: website/public/showcase/notion/index.html:520 msgctxt "page:showcase/notion/index.html" msgid "" "Notion parses Markdown into block data. This example shows how a table becomes header " "and data rows." msgstr "" #: website/public/showcase/notion/index.html:525 msgctxt "page:showcase/notion/index.html" msgid "A table through Notion's Markdown parser" msgstr "" #: website/public/showcase/notion/index.html:530 msgctxt "page:showcase/notion/index.html" msgid "Markdown input" msgstr "" #: website/public/showcase/notion/index.html:537 msgctxt "page:showcase/notion/index.html" msgid "Structured parser output · excerpt" msgstr "" #: website/public/showcase/notion/index.html:546 msgctxt "page:showcase/notion/index.html" msgid "" "Recorded output from an extracted Markdown parser. The table becomes rows and cells." msgstr "" #: website/public/showcase/notion/index.html:553 msgctxt "page:showcase/notion/index.html" msgid "Another path: the offline SQLite connection" msgstr "" #. {ph0}: getSqliteMeta #: website/public/showcase/notion/index.html:554 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" "Notion's renderer requests {ph0} through IPC. The main process creates a message " "channel and gives one port to the renderer and the other to a SQLite utility process. " "Subsequent statement batches and results travel over that port." msgstr "" #: website/public/showcase/notion/index.html:560 msgctxt "page:showcase/notion/index.html" msgid "" "Following this handoff explains where the database work runs, and why tracing only the" " initial IPC request misses the later conversation." msgstr "" #: website/public/showcase/notion/index.html:567 msgctxt "page:showcase/notion/index.html" msgid "Sources and how to read the excerpts" msgstr "" #. {ph0}: app.asar #. {ph1}: main/index.js #. {ph2}: isNotionWebContents #: website/public/showcase/notion/index.html:568 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" "The clipboard bridge comes from Notion Desktop 7.6.1's {ph0}: the tab preload and " "{ph1}. The excerpts expand minified variable names and omit unrelated code; the " "sender-check helper is shown with its underlying {ph2} call." msgstr "" #. {ph0}: 747001 #. {ph1}: 58169 #. {ph2}: 736810 #. {ph3}: 422457 #: website/public/showcase/notion/index.html:576 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" "The virtual clipboard and Markdown examples come from web assets cached on July 13, " "2026, including modules {ph0}, {ph1}, {ph2} and {ph3}. Those assets have their own " "version. Saved probes executed extracted modules and small harnesses; their outputs " "describe those probes rather than a captured desktop UI session." msgstr "" #: website/public/showcase/notion/index.html:584 msgctxt "page:showcase/notion/index.html" msgid "" "The REA result shown here is a focused analysis of the saved tab preload, recorded " "with the published REA 4.1.0 package. It locates the API and invoke operation. The " "clipboard member and matching receiver are connected by reading their wrapper " "implementations in the package." msgstr "" #. {ph0}: 422457 #: website/public/showcase/notion/index.html:591 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" "The Markdown example uses parser module {ph0}. Saved module tests show that both page " "and chat filters preserve this table. The paste/import, structured Markdown and " "AI/chat parsers have separate entry points and intermediate formats." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/showcase/notion/index.html:599 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" "{ph0}JavaScript application guide{ph1}{ph2}Follow a small Electron application's " "export feature.{ph3}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/showcase/notion/index.html:606 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" "{ph0}DX-Ball reconstruction{ph1}{ph2}Follow native instructions to a checked C " "function.{ph3}" msgstr "" #: website/public/showcase/notion/index.html:614 msgctxt "page:showcase/notion/index.html" msgid "Analyze your own app" msgstr "" #: website/public/showcase/notion/index.html:6 msgctxt "page:showcase/notion/index.html" msgid "Notion Electron Reverse Engineering: Clipboard — REA" msgstr "" #: website/public/showcase/notion/index.html:7 msgctxt "page:showcase/notion/index.html" msgid "" "Follow Notion's clipboard API through Electron's preload, IPC wrappers and main " "process, with short code excerpts and a look at its rich clipboard format." msgstr "" #: website/public/showcase/notion/index.html:255 msgctxt "page:showcase/notion/index.html" msgid "On this page" msgstr "" #: website/public/showcase/notion/index.html:263 msgctxt "page:showcase/notion/index.html" msgid "Notion Electron case study" msgstr "" #: website/public/showcase/notion/index.html:277 msgctxt "page:showcase/notion/index.html" msgid "Copy Notion analysis prompt" msgstr "" #: website/public/showcase/notion/index.html:350 msgctxt "page:showcase/notion/index.html" msgid "Copy Notion preload excerpt" msgstr "" #: website/public/showcase/notion/index.html:379 msgctxt "page:showcase/notion/index.html" msgid "Copy Notion invoke wrapper excerpt" msgstr "" #: website/public/showcase/notion/index.html:410 msgctxt "page:showcase/notion/index.html" msgid "Copy Notion handler wrapper excerpt" msgstr "" #: website/public/showcase/notion/index.html:438 msgctxt "page:showcase/notion/index.html" msgid "Copy Notion clipboard receiver excerpt" msgstr "" #: website/public/showcase/notion/index.html:493 msgctxt "page:showcase/notion/index.html" msgid "Restoring rich clipboard data on paste" msgstr "" #: website/public/showcase/notion/index.html:637 msgctxt "page:showcase/notion/index.html" msgid "Back to top" msgstr "" #: website/public/showcase/th04/index.html:107 msgctxt "page:showcase/th04/index.html" msgid "Skip to content" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/showcase/th04/index.html:199 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}Home{ph1} / {ph2}Showcases{ph3} / TH04" msgstr "" #: website/public/showcase/th04/index.html:202 msgctxt "page:showcase/th04/index.html" msgid "Case study · Touhou 4: Lotus Land Story" msgstr "" #. {ph0}:
#: website/public/showcase/th04/index.html:203 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "Reconstructing TH04's{ph0}bullet patterns." msgstr "" #: website/public/showcase/th04/index.html:204 msgctxt "page:showcase/th04/index.html" msgid "" "A ring of bullets starts with a short angle calculation. Use REA to inspect the " "original DOS function, then follow its instructions into readable C++." msgstr "" #: website/public/showcase/th04/index.html:209 msgctxt "page:showcase/th04/index.html" msgid "PC-98 · 16-bit DOS · C++ and assembly" msgstr "" #: website/public/showcase/th04/index.html:210 msgctxt "page:showcase/th04/index.html" msgid "View the TH04 reconstruction" msgstr "" #: website/public/showcase/th04/index.html:216 msgctxt "page:showcase/th04/index.html" msgid "From original instructions to checked source" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/showcase/th04/index.html:218 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" "{ph0}01 · Original game{ph1}{ph2}MAIN.EXE{ph3}{ph4}The PC-98 executable and its " "bullet-angle helper.{ph5}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/showcase/th04/index.html:225 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" "{ph0}02 · Inspect with REA{ph1}{ph2}Instructions + references{ph3}{ph4}Verify the " "loaded DOS code and read the angle calculation from the executable.{ph5}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/showcase/th04/index.html:233 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" "{ph0}03 · Read the C++{ph1}{ph2}Space → aim → rotate{ph3}{ph4}Connect each operation " "to the maintained reconstruction.{ph5}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/showcase/th04/index.html:240 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" "{ph0}04 · Check the source{ph1}{ph2}2,139 matching bytes{ph3}{ph4}Recorded compiler " "checks cover the bullet-generation code that contains this helper.{ph5}" msgstr "" #: website/public/showcase/th04/index.html:249 msgctxt "page:showcase/th04/index.html" msgid "" "REA returns the original code and its analysis evidence. The TH04 project supplies the" " maintained source and compiler checks." msgstr "" #: website/public/showcase/th04/index.html:257 msgctxt "page:showcase/th04/index.html" msgid "In this case study" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/th04/index.html:259 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}The bullet ring{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/th04/index.html:260 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}What REA returns{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/th04/index.html:261 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}Assembly to C++{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/th04/index.html:262 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}Checking the source{ph1}" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/th04/index.html:263 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}The full project{ph1}" msgstr "" #: website/public/showcase/th04/index.html:268 msgctxt "page:showcase/th04/index.html" msgid "How a ring aims at the player" msgstr "" #: website/public/showcase/th04/index.html:269 msgctxt "page:showcase/th04/index.html" msgid "" "Elly's attack requests an aimed ring with an initial count of 16. One helper " "calculates the direction of each bullet. The same ring can face a fixed direction or " "turn toward the player." msgstr "" #. {ph0}: #: website/public/showcase/th04/index.html:276 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" msgstr "" #: website/public/showcase/th04/index.html:281 #: website/public/showcase/th04/index.html:337 #: website/public/showcase/th04/index.html:514 #: website/public/showcase/th04/index.html:548 msgctxt "page:showcase/th04/index.html" msgid "Copy" msgstr "" #. {ph0}: #. {ph2}: #. {ph3}: #. {ph4}: #: website/public/showcase/th04/index.html:290 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" "{ph0}›{ph1}{ph2}Use REA to find how TH04 creates a ring of bullets and aims it at the " "player. Explain the calculation and show the code.{ph3}{ph4}{ph5}" msgstr "" #: website/public/showcase/th04/index.html:299 msgctxt "page:showcase/th04/index.html" msgid "" "An example prompt, with the original executable and reconstruction checkout available " "locally." msgstr "" #. {ph0}: 0, 16, 32, …, 240 #: website/public/showcase/th04/index.html:303 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" "TH04 stores a full clockwise turn in 256 angle units. For 16 bullets, each index adds " "16 units: {ph0}. Adding the player's direction rotates those positions together." msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/th04/index.html:323 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" "An illustration of the recovered angle math for count 16, player direction 40 and " "template rotation 0. {ph0}Open figure{ph1}" msgstr "" #: website/public/showcase/th04/index.html:331 msgctxt "page:showcase/th04/index.html" msgid "The firing template in the recovered source" msgstr "" #: website/public/showcase/th04/index.html:336 msgctxt "page:showcase/th04/index.html" msgid "Elly's ring attack · source excerpt" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/th04/index.html:351 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" "These lines select the pattern before difficulty and performance tuning. {ph0}Read the" " attack's source{ph1}." msgstr "" #: website/public/showcase/th04/index.html:362 msgctxt "page:showcase/th04/index.html" msgid "What REA returns" msgstr "" #. {ph0}: bullet_velocity_and_angle_set() #: website/public/showcase/th04/index.html:363 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" "We inspect {ph0}, the function that sets each bullet's velocity and angle. REA returns" " its instructions, pseudocode and references. Three parts of that result explain the " "pattern." msgstr "" #: website/public/showcase/th04/index.html:371 msgctxt "page:showcase/th04/index.html" msgid "Check the DOS image before reading its code" msgstr "" #: website/public/showcase/th04/index.html:374 msgctxt "page:showcase/th04/index.html" msgid "Agent → REA" msgstr "" #: website/public/showcase/th04/index.html:383 msgctxt "page:showcase/th04/index.html" msgid "REA → agent · selected fields" msgstr "" #: website/public/showcase/th04/index.html:392 msgctxt "page:showcase/th04/index.html" msgid "" "The check ties the loaded code and relocation records to the supplied executable. The " "path above is shortened for display." msgstr "" #: website/public/showcase/th04/index.html:398 msgctxt "page:showcase/th04/index.html" msgid "Read the ring's multiply and divide" msgstr "" #. {ph0}: analyze_function #: website/public/showcase/th04/index.html:402 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "Agent → REA · {ph0}" msgstr "" #: website/public/showcase/th04/index.html:408 msgctxt "page:showcase/th04/index.html" msgid "REA → agent · instruction excerpt" msgstr "" #. {ph0}: SI #. {ph1}: DS:53AF #. {ph2}: bullet_template.count #: website/public/showcase/th04/index.html:416 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" "{ph0} holds the bullet index. The shift multiplies it by 256, then the division uses " "the count read from {ph1}. The maintained source names that field {ph2}. The complete " "sequence appears below." msgstr "" #: website/public/showcase/th04/index.html:425 msgctxt "page:showcase/th04/index.html" msgid "Find where the pattern turns toward the player" msgstr "" #: website/public/showcase/th04/index.html:429 msgctxt "page:showcase/th04/index.html" msgid "Same function result · aim excerpt" msgstr "" #: website/public/showcase/th04/index.html:438 msgctxt "page:showcase/th04/index.html" msgid "Corresponding maintained C++" msgstr "" #: website/public/showcase/th04/index.html:446 msgctxt "page:showcase/th04/index.html" msgid "" "The instruction operands expose two coordinate differences and a direction helper. Its" " return value is added to the relative ring angle. Source names make those addresses " "readable; REA lets the agent check the original operations behind them." msgstr "" #: website/public/showcase/th04/index.html:457 msgctxt "page:showcase/th04/index.html" msgid "From assembly to readable C++" msgstr "" #: website/public/showcase/th04/index.html:458 msgctxt "page:showcase/th04/index.html" msgid "" "Select a step to match the original instructions with the angle calculation. This " "summary follows the aimed-ring path; the full source also handles spreads, stacks and " "random patterns." msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/th04/index.html:469 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}01{ph1} Index" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/th04/index.html:477 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}02{ph1} Space" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/th04/index.html:485 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}03{ph1} Aim" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/th04/index.html:493 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}04{ph1} Rotate" msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/th04/index.html:501 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}05{ph1} Store" msgstr "" #: website/public/showcase/th04/index.html:513 msgctxt "page:showcase/th04/index.html" msgid "REA · original 16-bit instructions" msgstr "" #: website/public/showcase/th04/index.html:547 msgctxt "page:showcase/th04/index.html" msgid "Readable C++ · aimed-ring summary" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: SI #: website/public/showcase/th04/index.html:576 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" "{ph0}01 · Read the bullet index.{ph1} The stack argument is loaded into {ph2}. In a " "16-bullet ring, this member index runs from 0 through 15." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: SHL AX,8 #. {ph3}: IDIV #: website/public/showcase/th04/index.html:581 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" "{ph0}02 · Space the directions around a full turn.{ph1} {ph2} multiplies by 256. The " "count is zero-extended into a word, then {ph3} divides the product by that count. For " "count 16, each index advances 16 angle units." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: AX #: website/public/showcase/th04/index.html:588 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" "{ph0}03 · Add the player direction.{ph1} The two subtractions form player-minus-origin" " coordinates. The direction helper returns an angle in {ph2}; adding it turns the " "whole ring toward the player." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: ADD AL,[0x53ad] #: website/public/showcase/th04/index.html:594 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" "{ph0}04 · Add the pattern's rotation.{ph1} {ph2} adds the template angle. Elly's " "initial template sets it to zero; other patterns can use the same helper with a " "rotation." msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: AL #: website/public/showcase/th04/index.html:600 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" "{ph0}05 · Keep the final angle in one byte.{ph1} The store writes {ph2} to the spawn-" "angle field. Values wrap after 255, just as the unsigned-byte cast does. The " "surrounding source also converts this angle and speed into velocity." msgstr "" #: website/public/showcase/th04/index.html:609 msgctxt "page:showcase/th04/index.html" msgid "" "The assembly selects the aimed-ring branch, aim calculation and final store. The C++ " "above is a readable summary. Compiler checks below apply to the maintained source in " "the linked project." msgstr "" #: website/public/showcase/th04/index.html:615 msgctxt "page:showcase/th04/index.html" msgid "Read the maintained ring and aim source" msgstr "" #: website/public/showcase/th04/index.html:618 msgctxt "page:showcase/th04/index.html" msgid "Ring macro · TH04 branch, excerpt" msgstr "" #: website/public/showcase/th04/index.html:628 msgctxt "page:showcase/th04/index.html" msgid "Angle and velocity · source excerpt" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #. {ph4}: #. {ph5}: #: website/public/showcase/th04/index.html:644 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" "{ph0}Ring macro{ph1} · {ph2}Aim and velocity source{ph3} · {ph4}Angle " "representation{ph5}" msgstr "" #: website/public/showcase/th04/index.html:664 msgctxt "page:showcase/th04/index.html" msgid "Checking the maintained source" msgstr "" #: website/public/showcase/th04/index.html:665 msgctxt "page:showcase/th04/index.html" msgid "" "The TH04 project's recorded checks compile the bullet-generation code, including this " "helper, with its pinned Turbo C++ 4.0J toolchain." msgstr "" #: website/public/showcase/th04/index.html:672 msgctxt "page:showcase/th04/index.html" msgid "2,139 matching bytes" msgstr "" #: website/public/showcase/th04/index.html:673 msgctxt "page:showcase/th04/index.html" msgid "" "The compiled bullet-generation code matches a 2,139-byte section of the original " "executable." msgstr "" #: website/public/showcase/th04/index.html:679 msgctxt "page:showcase/th04/index.html" msgid "Two clean builds" msgstr "" #: website/public/showcase/th04/index.html:680 msgctxt "page:showcase/th04/index.html" msgid "" "Two separate builds produce the same matching bytes. The recorded input hashes match " "the maintained source shown here." msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/th04/index.html:686 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "Recorded on 3 October 2026. {ph0}Read the compiler checks{ph1}." msgstr "" #: website/public/showcase/th04/index.html:694 msgctxt "page:showcase/th04/index.html" msgid "Target identity and analysis scope" msgstr "" #: website/public/showcase/th04/index.html:699 msgctxt "page:showcase/th04/index.html" msgid "Original target" msgstr "" #. {ph0}: MAIN.EXE #: website/public/showcase/th04/index.html:700 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}, 156,258 bytes, DOS MZ" msgstr "" #: website/public/showcase/th04/index.html:703 msgctxt "page:showcase/th04/index.html" msgid "Helper entry" msgstr "" #. {ph0}: 0x2cfc8 #: website/public/showcase/th04/index.html:704 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0} in REA's loaded image" msgstr "" #: website/public/showcase/th04/index.html:707 msgctxt "page:showcase/th04/index.html" msgid "Original file offset" msgstr "" #. {ph0}: 0x1e7c8 #. {ph1}: address_to_file_offset #: website/public/showcase/th04/index.html:708 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}, returned by {ph1}" msgstr "" #: website/public/showcase/th04/index.html:714 msgctxt "page:showcase/th04/index.html" msgid "Recorded code inspection" msgstr "" #: website/public/showcase/th04/index.html:715 msgctxt "page:showcase/th04/index.html" msgid "REA 4.1.0 · 7 October 2026" msgstr "" #: website/public/showcase/th04/index.html:720 msgctxt "page:showcase/th04/index.html" msgid "" "Compiler checks cover the complete bullet-add code section, including this helper. " "They also compare its MAP contribution and overlapping relocation." msgstr "" #. {ph0}: 0x1000 #: website/public/showcase/th04/index.html:725 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" "REA verified the static DOS load image at load segment {ph0}. Its addresses describe " "that analysis image. The function result reports 503 body bytes in two ranges across a" " 517-byte span; the selected instructions above lie in those reported ranges." msgstr "" #. {ph0}: 0d72e980 #: website/public/showcase/th04/index.html:732 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" "The source names and compiler checks come from TH04 checkpoint {ph0}. Earlier " "reconstruction observations used the project's own analysis scripts; this page adds a " "fresh REA inspection of the same original target. The supplied game's identity is " "pinned by its repository manifest, with independent pristine-dump provenance still " "open." msgstr "" #: website/public/showcase/th04/index.html:740 msgctxt "page:showcase/th04/index.html" msgid "" "The figure illustrates the angle calculation. Full-game controls, timing and PC-98 " "hardware behavior have separate runtime checks in the reconstruction project." msgstr "" #: website/public/showcase/th04/index.html:749 msgctxt "page:showcase/th04/index.html" msgid "The full TH04 reconstruction" msgstr "" #: website/public/showcase/th04/index.html:750 msgctxt "page:showcase/th04/index.html" msgid "" "The project builds the game's four DOS products from maintained C++ and assembly. " "Beyond bullet generation, the source covers stages, bosses, rendering, input, menus, " "endings and score handling." msgstr "" #. {ph0}: #. {ph1}: #: website/public/showcase/th04/index.html:756 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}Explore the TH04 repository{ph1}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/showcase/th04/index.html:762 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" "{ph0}Bullet-generation source{ph1}{ph2}The complete helper, other pattern types and " "template tuning.{ph3}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/showcase/th04/index.html:771 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" "{ph0}DOS build and run guide{ph1}{ph2}Build the source and test it in the project's " "PC-98 emulator workflow.{ph3}" msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: #. {ph3}: #: website/public/showcase/th04/index.html:780 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" "{ph0}Current project state{ph1}{ph2}DOS verification and the separate native x64 " "port.{ph3}" msgstr "" #: website/public/showcase/th04/index.html:6 msgctxt "page:showcase/th04/index.html" msgid "TH04 Reverse Engineering: DOS Bullet Patterns — REA" msgstr "" #: website/public/showcase/th04/index.html:7 msgctxt "page:showcase/th04/index.html" msgid "" "Inspect TH04's original 16-bit DOS code with REA. Follow the assembly and recovered " "C++ to see how a ring of bullets is spaced and aimed at the player." msgstr "" #: website/public/showcase/th04/index.html:256 msgctxt "page:showcase/th04/index.html" msgid "On this page" msgstr "" #: website/public/showcase/th04/index.html:266 msgctxt "page:showcase/th04/index.html" msgid "TH04 bullet-pattern case study" msgstr "" #: website/public/showcase/th04/index.html:281 msgctxt "page:showcase/th04/index.html" msgid "Copy TH04 example prompt" msgstr "" #: website/public/showcase/th04/index.html:309 msgctxt "page:showcase/th04/index.html" msgid "TH04 fixed and aimed bullet rings; scroll horizontally on smaller screens" msgstr "" #: website/public/showcase/th04/index.html:315 msgctxt "page:showcase/th04/index.html" msgid "" "Two diagrams of a 16-bullet ring. The fixed ring starts at angle zero. Adding a player" " direction of 40 rotates every direction by the same amount; the highlighted first " "bullet points toward the player. Both keep a spacing of 16 angle units, or 22.5 " "degrees." msgstr "" #: website/public/showcase/th04/index.html:337 msgctxt "page:showcase/th04/index.html" msgid "Copy TH04 firing template" msgstr "" #: website/public/showcase/th04/index.html:464 msgctxt "page:showcase/th04/index.html" msgid "Follow the TH04 aimed-ring calculation" msgstr "" #: website/public/showcase/th04/index.html:514 msgctxt "page:showcase/th04/index.html" msgid "Copy TH04 assembly excerpt" msgstr "" #: website/public/showcase/th04/index.html:548 msgctxt "page:showcase/th04/index.html" msgid "Copy readable aimed-ring calculation" msgstr "" #: website/public/showcase/th04/index.html:806 msgctxt "page:showcase/th04/index.html" msgid "Back to top" msgstr "" #: scripts/website_i18n.py msgctxt "runtime" msgid "Translation is being updated. Read this page in English for now." msgstr "" #: website/public/assets/aegis-demo.js:22 #, python-brace-format msgctxt "runtime" msgid "{start}–{end} seconds" msgstr "" #: website/public/assets/aegis-demo.js:29 #, python-brace-format msgctxt "runtime" msgid "{seconds} seconds, time block {block}" msgstr "" #: website/public/assets/aegis-demo.js:35 msgctxt "runtime" msgid "" "Interactive calculation is unavailable in this browser. The example shows the code at " "59 seconds." msgstr "" #: website/public/assets/aegis-demo.js:62 msgctxt "runtime" msgid "Checking…" msgstr "" #: website/public/assets/aegis-demo.js:76 #, python-brace-format msgctxt "runtime" msgid "{passed} / {total} checks passed (six reference cases, at six and eight digits)." msgstr "" #: website/public/assets/aegis-demo.js:81 msgctxt "runtime" msgid "Could not run the reference checks. Try again." msgstr "" #: website/public/assets/contributors.js:21 #, python-brace-format msgctxt "runtime" msgid "Contributors: {count}" msgstr "" #: website/public/assets/dino-demo.js:77 #, python-brace-format msgctxt "runtime" msgid "Distance {distance}" msgstr "" #: website/public/assets/dino-demo.js:87 msgctxt "runtime" msgid "Hit a cactus. Try another speed." msgstr "" #: website/public/assets/dino-demo.js:87 msgctxt "runtime" msgid "Space or Jump ↑" msgstr "" #: website/public/assets/dino-demo.js:97 msgctxt "runtime" msgid "Play again" msgstr "" #: website/public/assets/dino-demo.js:97 website/public/assets/dino-demo.js:111 msgctxt "runtime" msgid "Play" msgstr "" #: website/public/assets/dino-demo.js:112 msgctxt "runtime" msgid "Press Play, then jump over the cactus." msgstr "" #: website/public/assets/dino-demo.js:147 msgctxt "runtime" msgid "Hit a cactus. Press Play again, or change the speed and restart." msgstr "" #: website/public/assets/dino-demo.js:171 msgctxt "runtime" msgid "Pause" msgstr "" #: website/public/assets/dino-demo.js:172 msgctxt "runtime" msgid "Running. Space or Jump clears a cactus." msgstr "" #: website/public/assets/dino-demo.js:183 website/public/assets/dino-demo.js:219 #: website/public/assets/dino-demo.js:224 msgctxt "runtime" msgid "Paused. Press Play to continue." msgstr "" #: website/public/assets/dino-demo.js:203 #, python-brace-format msgctxt "runtime" msgid "Fixed speed: {speed}. Space or Jump clears a cactus." msgstr "" #: website/public/assets/dino-demo.js:206 #, python-brace-format msgctxt "runtime" msgid "Fixed speed: {speed}. Press Play to try it." msgstr "" #: website/public/assets/dino-demo.js:215 msgctxt "runtime" msgid "Recovered rule: start at 6, then increase toward 13." msgstr "" #: website/public/assets/dino-demo.js:216 #, python-brace-format msgctxt "runtime" msgid "Fixed speed: {speed}." msgstr "" #: website/public/assets/dino-demo.js:249 msgctxt "runtime" msgid "" "Replayed the recovered rule. All four values match the controlled original-game check " "when rounded to three decimals." msgstr "" #: website/public/assets/dino-demo.js:252 msgctxt "runtime" msgid "" "The replay differs from the recorded original-game values. Compare the speed rule and " "settings above." msgstr "" #: website/public/assets/home.js:29 msgctxt "runtime" msgid "Press % to see what happens to 10." msgstr "" #: website/public/assets/home.js:32 msgctxt "runtime" msgid "10% of 200 is 20. Press = to add it." msgstr "" #: website/public/assets/home.js:33 msgctxt "runtime" msgid "For multiplication, 10 becomes 0.1. Press = to multiply." msgstr "" #: website/public/assets/main.js:21 msgctxt "runtime" msgid "Copied" msgstr "" #: website/public/assets/main.js:23 msgctxt "runtime" msgid "Code copied to clipboard." msgstr "" #: website/public/assets/main.js:32 msgctxt "runtime" msgid "Selected" msgstr "" #: website/public/assets/main.js:34 msgctxt "runtime" msgid "Code selected. Use your keyboard to copy it." msgstr "" #: website/public/assets/main.js:158 #, python-brace-format msgctxt "runtime" msgid "REA on GitHub ({count})" msgstr "" #: website/public/assets/theme.js:52 msgctxt "runtime" msgid "Switch to light mode" msgstr "" #: website/public/assets/theme.js:53 msgctxt "runtime" msgid "Switch to dark mode" msgstr "" #: website/public/assets/figures/analyst-thinking.svg:2 msgctxt "figure:analyst-thinking.svg" msgid "An analyst thinking at a computer" msgstr "" #: website/public/assets/figures/ctf-mask-equation.svg:2 #: website/public/assets/figures/ctf-mask-equation.svg:24 msgctxt "figure:ctf-mask-equation.svg" msgid "One check reveals one character" msgstr "" #: website/public/assets/figures/ctf-mask-equation.svg:3 msgctxt "figure:ctf-mask-equation.svg" msgid "" "The seventh mask selects only position 21 in the six by six input grid. Its character " "code must equal 55, so the character is 7. The other masks select different positions " "and give further equations." msgstr "" #: website/public/assets/figures/ctf-mask-equation.svg:25 msgctxt "figure:ctf-mask-equation.svg" msgid "The seventh check. Cell labels are input positions, starting at 0." msgstr "" #: website/public/assets/figures/ctf-mask-equation.svg:27 msgctxt "figure:ctf-mask-equation.svg" msgid "Encoded mask: −21, +1, −14, 0" msgstr "" #: website/public/assets/figures/ctf-mask-equation.svg:28 msgctxt "figure:ctf-mask-equation.svg" msgid "Skip 21 cells. Select 1. Skip 14. Stop at 0." msgstr "" #: website/public/assets/figures/ctf-mask-equation.svg:32 msgctxt "figure:ctf-mask-equation.svg" msgid "Only one cell contributes to this sum" msgstr "" #: website/public/assets/figures/ctf-mask-equation.svg:35 msgctxt "figure:ctf-mask-equation.svg" msgid "Position 21 in the flag must contain 7." msgstr "" #: website/public/assets/figures/ctf-mask-equation.svg:37 msgctxt "figure:ctf-mask-equation.svg" msgid "Selected: one cell" msgstr "" #: website/public/assets/figures/ctf-mask-equation.svg:38 msgctxt "figure:ctf-mask-equation.svg" msgid "26 masks give 26 equations." msgstr "" #: website/public/assets/figures/ctf-mask-equation.svg:39 msgctxt "figure:ctf-mask-equation.svg" msgid "Solve them together to find the flag." msgstr "" #: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:2 #: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:20 msgctxt "figure:dx-ball-sound-pan-investigation.svg" msgid "DX-Ball sound-pan investigation" msgstr "" #: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:3 msgctxt "figure:dx-ball-sound-pan-investigation.svg" msgid "" "REA provides the instruction, caller and byte-read evidence for one DX-Ball function. " "A stack input is multiplied by 1.5625, offset by 500, scaled, and converted to an " "integer. Maintained C is checked in 3,205 original-x86 cases and a separate 63-byte " "compiler replay." msgstr "" #: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:39 msgctxt "figure:dx-ball-sound-pan-investigation.svg" msgid "Stack" msgstr "" #: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:40 msgctxt "figure:dx-ball-sound-pan-investigation.svg" msgid "input x" msgstr "" #: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:44 msgctxt "figure:dx-ball-sound-pan-investigation.svg" msgid "Integer" msgstr "" #: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:45 msgctxt "figure:dx-ball-sound-pan-investigation.svg" msgid "return" msgstr "" #: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:46 msgctxt "figure:dx-ball-sound-pan-investigation.svg" msgid "Reconstructed function" msgstr "" #: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:47 msgctxt "figure:dx-ball-sound-pan-investigation.svg" msgid "Maintained C" msgstr "" #: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:48 msgctxt "figure:dx-ball-sound-pan-investigation.svg" msgid "Brick-hit caller" msgstr "" #: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:49 msgctxt "figure:dx-ball-sound-pan-investigation.svg" msgid "20 + 30 × tile_x" msgstr "" #: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:50 msgctxt "figure:dx-ball-sound-pan-investigation.svg" msgid "Original code" msgstr "" #: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:51 #: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:54 msgctxt "figure:dx-ball-sound-pan-investigation.svg" msgid "comparison" msgstr "" #: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:52 msgctxt "figure:dx-ball-sound-pan-investigation.svg" msgid "3,205 cases" msgstr "" #: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:53 msgctxt "figure:dx-ball-sound-pan-investigation.svg" msgid "VC4.0 build" msgstr "" #: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:55 msgctxt "figure:dx-ball-sound-pan-investigation.svg" msgid "63 matching bytes" msgstr "" #: website/public/assets/figures/rea-investigation-flow.svg:2 #: website/public/assets/figures/rea-investigation-flow.svg:22 msgctxt "figure:rea-investigation-flow.svg" msgid "REA investigation flow" msgstr "" #: website/public/assets/figures/rea-investigation-flow.svg:3 msgctxt "figure:rea-investigation-flow.svg" msgid "" "Ask a question about a local target. REA inspects and traces through local analysis " "adapters, returns evidence, and supports follow-up questions as your agent explains, " "implements and tests." msgstr "" #: website/public/assets/figures/rea-investigation-flow.svg:31 msgctxt "figure:rea-investigation-flow.svg" msgid "1. Ask" msgstr "" #: website/public/assets/figures/rea-investigation-flow.svg:32 msgctxt "figure:rea-investigation-flow.svg" msgid "Your agent + local target" msgstr "" #: website/public/assets/figures/rea-investigation-flow.svg:33 msgctxt "figure:rea-investigation-flow.svg" msgid "App / binary / browser" msgstr "" #: website/public/assets/figures/rea-investigation-flow.svg:34 msgctxt "figure:rea-investigation-flow.svg" msgid "2. Inspect & trace" msgstr "" #: website/public/assets/figures/rea-investigation-flow.svg:36 msgctxt "figure:rea-investigation-flow.svg" msgid "CLI / MCP" msgstr "" #: website/public/assets/figures/rea-investigation-flow.svg:37 msgctxt "figure:rea-investigation-flow.svg" msgid "3. Read the evidence" msgstr "" #: website/public/assets/figures/rea-investigation-flow.svg:38 msgctxt "figure:rea-investigation-flow.svg" msgid "Code / references /" msgstr "" #: website/public/assets/figures/rea-investigation-flow.svg:39 msgctxt "figure:rea-investigation-flow.svg" msgid "unknowns" msgstr "" #: website/public/assets/figures/rea-investigation-flow.svg:40 msgctxt "figure:rea-investigation-flow.svg" msgid "4. Use what you learn" msgstr "" #: website/public/assets/figures/rea-investigation-flow.svg:41 msgctxt "figure:rea-investigation-flow.svg" msgid "Your agent" msgstr "" #: website/public/assets/figures/rea-investigation-flow.svg:42 msgctxt "figure:rea-investigation-flow.svg" msgid "Explain / implement / test" msgstr "" #: website/public/assets/figures/rea-investigation-flow.svg:43 msgctxt "figure:rea-investigation-flow.svg" msgid "Analysis tools" msgstr "" #: website/public/assets/figures/rea-investigation-flow.svg:44 msgctxt "figure:rea-investigation-flow.svg" msgid "Local analysis adapters" msgstr "" #: website/public/assets/figures/rea-investigation-flow.svg:45 msgctxt "figure:rea-investigation-flow.svg" msgid "Follow-up question" msgstr "" #: website/public/assets/figures/th04-bullet-ring.svg:2 msgctxt "figure:th04-bullet-ring.svg" msgid "TH04: spacing and aiming a ring of bullets" msgstr "" #: website/public/assets/figures/th04-bullet-ring.svg:3 msgctxt "figure:th04-bullet-ring.svg" msgid "" "A full clockwise turn has 256 angle units. Sixteen bullets start at angles zero, " "sixteen, thirty-two, through 240. Adding an example player direction of forty turns " "all sixteen directions together; the first bullet points at the player. Template " "rotation is zero." msgstr "" #: website/public/assets/figures/th04-bullet-ring.svg:24 msgctxt "figure:th04-bullet-ring.svg" msgid "Fixed ring" msgstr "" #: website/public/assets/figures/th04-bullet-ring.svg:25 msgctxt "figure:th04-bullet-ring.svg" msgid "First bullet: angle 0" msgstr "" #: website/public/assets/figures/th04-bullet-ring.svg:26 msgctxt "figure:th04-bullet-ring.svg" msgid "Aimed ring" msgstr "" #: website/public/assets/figures/th04-bullet-ring.svg:27 msgctxt "figure:th04-bullet-ring.svg" msgid "First bullet: player direction" msgstr "" #: website/public/assets/figures/th04-bullet-ring.svg:64 #: website/public/assets/figures/th04-bullet-ring.svg:102 msgctxt "figure:th04-bullet-ring.svg" msgid "Origin" msgstr "" #: website/public/assets/figures/th04-bullet-ring.svg:105 msgctxt "figure:th04-bullet-ring.svg" msgid "Player" msgstr "" #: website/public/assets/figures/th04-bullet-ring.svg:110 msgctxt "figure:th04-bullet-ring.svg" msgid "Same spacing: 256 ÷ 16 = 16 angle units = 22.5°" msgstr ""