provenance:design:longitudinal
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| provenance:design:longitudinal [2026/09/17 07:23] – Markup rendering sweep: wrap escapes, CLI flag typography, and heading quotes. Authored by Claude. karel.kubicek.claude | provenance:design:longitudinal [2026/09/22 04:33] (current) – Figures-vs-script finding accepted: the 18.5 heading still named a three-generations-stale count (43); renamed to carry no count. No inbound anchor links across 188 pages. Authored by Claude karel.kubicek.claude | ||
|---|---|---|---|
| Line 1595: | Line 1595: | ||
| Every disagreement is printed paper by paper in the unedited output in §18.12. | Every disagreement is printed paper by paper in the unedited output in §18.12. | ||
| - | ==== 18.5 The quote check, and the 43 that did not locate | + | ==== 18.5 The quote check, and what " |
| Every non-empty '' | Every non-empty '' | ||
| Line 1604: | Line 1604: | ||
| * what '' | * what '' | ||
| - | The two-column repair still splices a quarter of pages, and a sentence crossing a column boundary comes back with the neighbouring column injected into the middle of it. **A coder who de-splices that correctly writes a quote that is a substring of nothing.** Failing it would call a correct reading a hallucination. So the check now searches '' | + | The two-column repair still splices a quarter of pages, and a sentence crossing a column boundary comes back with the neighbouring column injected into the middle of it. **A coder who de-splices that correctly writes a quote that is a substring of nothing.** Failing it would call a correct reading a hallucination. So the check now searches '' |
| ^ Mode ^ Codings ^ Share of 536 ^ | ^ Mode ^ Codings ^ Share of 536 ^ | ||
| Line 1611: | Line 1611: | ||
| | Loose (de-hyphenated, | | Loose (de-hyphenated, | ||
| | De-spliced (6-word shingles, ≥80%) | 3 | 0.6% | | | De-spliced (6-word shingles, ≥80%) | 3 | 0.6% | | ||
| - | | **Located by no mode** | **42** | **7.8%** | | + | | Rescued from the '' |
| + | | **Located by no mode, in any of the five texts** | **7** | **1.3%** | | ||
| - | //The counts above are after the one correction described below. Before | + | //The counts above are after the one correction described below **and** after the '' |
| - | **All 43 were then read by hand** — three sub-agents, each given the paper' | + | **All 43 were then read by hand** — three sub-agents, each given the paper' |
| ^ Verdict ^ Codings ^ | ^ Verdict ^ Codings ^ | ||
| Line 1628: | Line 1629: | ||
| * **What moved on the content page:** the vantage row over the 124 went from 25/44/10 to **26/45/9** (words / estimate / moved), and the all-pins fixed-versus-not agreement from 80.8% to 81.7%. The all-four figure, the 124, and the 6-of-23 survivor count did not move. | * **What moved on the content page:** the vantage row over the 124 went from 25/44/10 to **26/45/9** (words / estimate / moved), and the all-pins fixed-versus-not agreement from 80.8% to 81.7%. The all-four figure, the 124, and the 6-of-23 survivor count did not move. | ||
| - | The verdict files are '' | + | The verdict files are '' |
| ==== 18.6 What changed on the content page ==== | ==== 18.6 What changed on the content page ==== | ||
| Line 1687: | Line 1688: | ||
| - **Wrong hand-written count.** The prose said //" | - **Wrong hand-written count.** The prose said //" | ||
| - **The structural guard in '' | - **The structural guard in '' | ||
| - | - Mutation-tested and **confirmed sound**: the partial-population refusal in '' | + | - Mutation-tested and **confirmed sound**: the partial-population refusal in '' |
| - Hand-computed Cohen' | - Hand-computed Cohen' | ||
| - Checked the figures **outside** the edited window against '' | - Checked the figures **outside** the edited window against '' | ||
| Line 2413: | Line 2414: | ||
| // de-splicing mode and it is reported separately and listed in full, | // de-splicing mode and it is reported separately and listed in full, | ||
| // because it is the weakest evidence and has to be read by a human. | // because it is the weakest evidence and has to be read by a human. | ||
| - | // Anything failing all four is printed in full. | + | // A quote that fails all four against every stored rendering is then tried |
| + | // against a FIFTH text: a pypdf rendering of the same paper.pdf, produced on | ||
| + | // demand by `scripts/ | ||
| + | // pypdf splice different sentences, so a coder who read the PDF correctly can | ||
| + | // produce a quote that is absent from every stored rendering and verbatim in | ||
| + | // the PDF. The same four modes are tried there and a pass is reported as | ||
| + | // | ||
| + | // quote is in the paper; the stored text is what is wrong. | ||
| + | // This is the fallback `scripts/ | ||
| + | // already use; it was added here on 2026-09-22, and before that this checker' | ||
| + | // NOT FOUND bucket was not comparable with theirs. | ||
| + | // Anything failing all four modes against all five texts is printed in full. | ||
| import fs from ' | import fs from ' | ||
| import path from ' | import path from ' | ||
| + | import { pdfText } from ' | ||
| const argv = process.argv.slice(2); | const argv = process.argv.slice(2); | ||
| Line 2433: | Line 2446: | ||
| .replace(/[ ]/g, ' ') | .replace(/[ ]/g, ' ') | ||
| .toLowerCase(); | .toLowerCase(); | ||
| + | |||
| + | // Fraction of the quote' | ||
| + | // loose-folded haystack; null when the quote is too short to shingle. | ||
| + | const shingleFrac = (q, hayLoose) => { | ||
| + | const w = loose(q).split(' | ||
| + | if (w.length < SHINGLE_N) return null; | ||
| + | const sh = []; | ||
| + | for (let i = 0; i + SHINGLE_N <= w.length; i++) sh.push(w.slice(i, | ||
| + | return sh.filter((x) => hayLoose.includes(x)).length / sh.length; | ||
| + | }; | ||
| const pop = fs.readFileSync(POP, | const pop = fs.readFileSync(POP, | ||
| Line 2439: | Line 2462: | ||
| const fails = []; | const fails = []; | ||
| const splicedList = []; | const splicedList = []; | ||
| + | const rescuedList = []; | ||
| let missing = 0; | let missing = 0; | ||
| Line 2468: | Line 2492: | ||
| if (hayL.includes(loose(q))) { modes.loose++; | if (hayL.includes(loose(q))) { modes.loose++; | ||
| // de-splicing mode | // de-splicing mode | ||
| - | const w = loose(q).split(' ').filter(Boolean); | + | const frac = shingleFrac(q, hayL); |
| - | if (w.length >= SHINGLE_N) { | + | if (frac !== null && frac >= SHINGLE_MIN) { |
| - | const sh = []; | + | modes.spliced++; |
| - | | + | splicedList.push({ key: p.key, pin, value: v.value, quote: q, frac }); |
| - | | + | continue; |
| - | if (hit / sh.length | + | } |
| - | modes.spliced++; | + | // Fifth text: pypdf. Only consulted for a quote that is in none of the |
| - | | + | // stored renderings, so it costs nothing on a clean run. |
| + | const pdf = pdfText(p.key); | ||
| + | if (pdf !== null) { | ||
| + | const pdfC = collapse(pdf); | ||
| + | | ||
| + | | ||
| + | if (pdf.includes(q)) mode = 'exact'; | ||
| + | | ||
| + | else if (pdfL.includes(loose(q))) mode = ' | ||
| + | | ||
| + | const pdfFrac = shingleFrac(q, | ||
| + | | ||
| + | } | ||
| + | if (mode !== null) { | ||
| + | | ||
| continue; | continue; | ||
| } | } | ||
| - | fails.push({ key: p.key, pin, value: v.value, quote: q, frac: hit / sh.length }); | ||
| - | } else { | ||
| - | fails.push({ key: p.key, pin, value: v.value, quote: q, frac: null }); | ||
| } | } | ||
| + | fails.push({ key: p.key, pin, value: v.value, quote: q, frac, pdf: pdf !== null }); | ||
| } | } | ||
| } | } | ||
| Line 2490: | Line 2526: | ||
| console.log(`coded dir: ${CODED}`); | console.log(`coded dir: ${CODED}`); | ||
| console.log(`renderings searched per paper: paper.cols.txt, | console.log(`renderings searched per paper: paper.cols.txt, | ||
| + | console.log(`fallback for a quote found in none of those: a pypdf rendering of paper.pdf (scripts/ | ||
| console.log(`de-splicing mode: ${SHINGLE_N}-word shingles, pass at >= ${(100 * SHINGLE_MIN).toFixed(0)}% found`); | console.log(`de-splicing mode: ${SHINGLE_N}-word shingles, pass at >= ${(100 * SHINGLE_MIN).toFixed(0)}% found`); | ||
| console.log(`\npapers with no coding file (skipped): ${missing}`); | console.log(`\npapers with no coding file (skipped): ${missing}`); | ||
| Line 2499: | Line 2536: | ||
| console.log(` | console.log(` | ||
| console.log(` | console.log(` | ||
| + | console.log(` | ||
| console.log(` | console.log(` | ||
| + | console.log(` | ||
| // A quote-less coding that is not `not-stated` is a coding with no evidence. | // A quote-less coding that is not `not-stated` is a coding with no evidence. | ||
| Line 2517: | Line 2556: | ||
| for (const f of splicedList.sort((a, | for (const f of splicedList.sort((a, | ||
| console.log(` | console.log(` | ||
| + | } | ||
| + | |||
| + | console.log(`\nRESCUED — in none of the stored renderings, located in the pypdf rendering of paper.pdf (${rescuedList.length}).`); | ||
| + | console.log(`These are defects in the stored text, not in the hand coding:`); | ||
| + | for (const f of rescuedList) { | ||
| + | console.log(` | ||
| } | } | ||
| Line 3243: | Line 3288: | ||
| coded dir: out_pins/ | coded dir: out_pins/ | ||
| renderings searched per paper: paper.cols.txt, | renderings searched per paper: paper.cols.txt, | ||
| + | fallback for a quote found in none of those: a pypdf rendering of paper.pdf (scripts/ | ||
| de-splicing mode: 6-word shingles, pass at >= 80% found | de-splicing mode: 6-word shingles, pass at >= 80% found | ||
| Line 3253: | Line 3299: | ||
| loose match: | loose match: | ||
| spliced match (de-spliced): | spliced match (de-spliced): | ||
| - | NOT FOUND: | + | |
| + | | ||
| + | | ||
| codings with no quote and a value other than not-stated: 0 | codings with no quote and a value other than not-stated: 0 | ||
| Line 3265: | Line 3313: | ||
| we sampled 100 domains from each parking service and setup an additional crawler which crawled them daily for a week. | we sampled 100 domains from each parking service and setup an additional crawler which crawled them daily for a week. | ||
| - | QUOTES NOT LOCATED, printed | + | RESCUED — in none of the stored renderings, located |
| - | | + | These are defects in the stored text, not in the hand coding: |
| + | | ||
| We implemented FourthParty as an extension to Mozilla Firefox. | We implemented FourthParty as an extension to Mozilla Firefox. | ||
| - | 2012/ | + | |
| - | We re-crawled the profile page of each user in the above dataset in February 2011 | + | |
| - | 2015/ | + | |
| To assess any geographical differences, | To assess any geographical differences, | ||
| - | | + | |
| We managed to emulate typical browser behavior in all but one case (BlueSky). | We managed to emulate typical browser behavior in all but one case (BlueSky). | ||
| - | 2016/ | + | |
| - | In order to measure the stability of these amplifiers we probed them periodically for 13 weeks to understand how many were still located at the same IP and misconfiged. | + | |
| - | 2017/ | + | |
| The number of Onion addresses in this experiment was 16,683, and the addresses were crawled twice a day at 12-hour intervals. | The number of Onion addresses in this experiment was 16,683, and the addresses were crawled twice a day at 12-hour intervals. | ||
| - | | + | |
| we can only continuously monitor 1,000 samples. Besides, we re-visit these samples every 3 days | we can only continuously monitor 1,000 samples. Besides, we re-visit these samples every 3 days | ||
| - | | + | |
| to visit the Alexa top 50k web domains | to visit the Alexa top 50k web domains | ||
| - | | + | |
| We have crawled two datasets at different moments, June 2018 and September 2018, which are three months apart. The two app datasets have more than 2/3 overlapped apps. | We have crawled two datasets at different moments, June 2018 and September 2018, which are three months apart. The two app datasets have more than 2/3 overlapped apps. | ||
| - | | + | |
| We installed the widely used OpenWPM framework and configured it to use four vanilla Mozilla Firefox browsers in parallel | We installed the widely used OpenWPM framework and configured it to use four vanilla Mozilla Firefox browsers in parallel | ||
| - | | + | |
| the physical machine on which the VM was deployed is located in the EU, meaning that the visited websites must comply with GDPR | the physical machine on which the VM was deployed is located in the EU, meaning that the visited websites must comply with GDPR | ||
| - | | + | |
| we did not install any extension on the browser that would stop the websites from storing or reading cookies | we did not install any extension on the browser that would stop the websites from storing or reading cookies | ||
| - | | + | |
| There are no overlaps for the above datasets, and the apps are from a wide range of functionalities, | There are no overlaps for the above datasets, and the apps are from a wide range of functionalities, | ||
| - | | + | |
| we conduct the measurements from three different locations (Europe (DE), North America (US), and Asia (JP)) to account for possible geographical differences | we conduct the measurements from three different locations (Europe (DE), North America (US), and Asia (JP)) to account for possible geographical differences | ||
| - | | + | |
| We used the same method to create the browser profile for our experiment crawls that we utilized in the pre-study. | We used the same method to create the browser profile for our experiment crawls that we utilized in the pre-study. | ||
| - | | + | |
| Tranco list of top sites [18] (snapshot 77PX) | Tranco list of top sites [18] (snapshot 77PX) | ||
| - | | + | |
| We crawl using two variants of Puppeteer [4] controlling Chromium 80: a lower-realism naive variant and a higher-realism stealth variant. | We crawl using two variants of Puppeteer [4] controlling Chromium 80: a lower-realism naive variant and a higher-realism stealth variant. | ||
| - | 2021/ | + | |
| - | the browser is launched with a clean user profile (i.e., no cookies or cached content) | + | |
| - | 2021/ | + | |
| we rely on a fully-featured, | we rely on a fully-featured, | ||
| - | | + | |
| ODIN uses university IP addresses (one per profile) and a /24 subnet from a research-friendly, | ODIN uses university IP addresses (one per profile) and a /24 subnet from a research-friendly, | ||
| - | | + | |
| We now evaluate Muzeel across browsers: Chrome, Edge, Firefox, and Brave. | We now evaluate Muzeel across browsers: Chrome, Edge, Firefox, and Brave. | ||
| - | | + | |
| Our initial sample set was the 5000 domains with the most requests to the third party, as indicated by the Referer field in the CDN's third party logs. | Our initial sample set was the 5000 domains with the most requests to the third party, as indicated by the Referer field in the CDN's third party logs. | ||
| - | | + | |
| Results shown are for Firefox (v91) for later comparison, since only Firefox has client-side support for ORIGIN Frame. | Results shown are for Firefox (v91) for later comparison, since only Firefox has client-side support for ORIGIN Frame. | ||
| - | | + | |
| Client caches are intentionally deleted between measurements in all of our active measurements to prevent bias from caching effects | Client caches are intentionally deleted between measurements in all of our active measurements to prevent bias from caching effects | ||
| - | 2022/ | + | |
| - | we crawled Google Play again in all fifteen languages for one day in February 2022 with the queries we obtained and used in our 2020 crawling. | + | |
| - | | + | |
| - | Each persona was associated with a unique browser running on an isolated virtual machine with a unique IP address. | + | |
| - | 2022/ | + | |
| We scraped Hansa 17 times between late 2015 and mid-2017, collecting a total of 332,795 pages amounting to 39.5 GB of data. | We scraped Hansa 17 times between late 2015 and mid-2017, collecting a total of 332,795 pages amounting to 39.5 GB of data. | ||
| - | | + | |
| We perform our analysis on websites which have been crawled in all snapshots (i.e., their intersection) and contain at least one Publisher ID. There are over 191,000 such websites. | We perform our analysis on websites which have been crawled in all snapshots (i.e., their intersection) and contain at least one Publisher ID. There are over 191,000 such websites. | ||
| - | | + | |
| We successfully conducted the four parallel crawls for 99.31% of the 20K websites. | We successfully conducted the four parallel crawls for 99.31% of the 20K websites. | ||
| - | | + | |
| We run all crawls in the US to minimize the impact of the EU GDPR and do not interact with cookie banners. | We run all crawls in the US to minimize the impact of the EU GDPR and do not interact with cookie banners. | ||
| - | 2023/ | + | |
| - | We conduct four parallel crawls: two with third-party cookies enabled (3P-Allowed) and two with third-party cookies blocked (3P-Blocked). | + | |
| - | 2023/ | + | |
| we redid the crawling on the same 10K domains in September 2022 (11-month gap) and applied our system to this data set by following the same procedure. | we redid the crawling on the same 10K domains in September 2022 (11-month gap) and applied our system to this data set by following the same procedure. | ||
| - | | + | |
| clients repeatedly accessed onion services and the top 150 accessed websites according to the Tranco ranking [68], in parallel. | clients repeatedly accessed onion services and the top 150 accessed websites according to the Tranco ranking [68], in parallel. | ||
| - | | + | |
| Clients also run on an isolated Docker container that executes a 0.4.7.10 Tor process and issues requests to Tor via the Python libraries selenium [58] and tbselenium [3] | Clients also run on an isolated Docker container that executes a 0.4.7.10 Tor process and issues requests to Tor via the Python libraries selenium [58] and tbselenium [3] | ||
| - | | + | |
| we used the PeeringDB snapshot from July 24, 2024, and CAIDA' | we used the PeeringDB snapshot from July 24, 2024, and CAIDA' | ||
| - | 2025/ | + | |
| - | We restrict the list to sites that appear in all of the top 100k lists over this period to avoid having our results affected by list churn | + | |
| - | 2025/ | + | |
| Since OpenWPM only supports Firefox and, unlike Chrome, Firefox does not expose the partitioned_key field in its cookie storage, we modified BannerClick to operate in Chrome' | Since OpenWPM only supports Firefox and, unlike Chrome, Firefox does not expose the partitioned_key field in its cookie storage, we modified BannerClick to operate in Chrome' | ||
| - | | + | |
| We use OpenWPM [24] to conduct a combination of stateful and stateless crawls aiming to observe the interplay of the setter and the sender website | We use OpenWPM [24] to conduct a combination of stateful and stateless crawls aiming to observe the interplay of the setter and the sender website | ||
| - | | + | |
| we joined the top one million websites from Tranco [49] with SimilarWeb, a web traffic estimator | we joined the top one million websites from Tranco [49] with SimilarWeb, a web traffic estimator | ||
| - | | + | |
| Each website was opened in a Chrome instance with two installed custom Chrome extensions. | Each website was opened in a Chrome instance with two installed custom Chrome extensions. | ||
| - | | + | |
| All website visits took place on Linux virtual machines in Google Cloud' | All website visits took place on Linux virtual machines in Google Cloud' | ||
| - | | + | |
| between December 2023 and December 2024, 667 new apps were added, 212 apps were removed, and 49 apps were renamed | between December 2023 and December 2024, 667 new apps were added, 212 apps were removed, and 49 apps were renamed | ||
| + | |||
| + | QUOTES NOT LOCATED, printed in full (7): | ||
| + | | ||
| + | We re-crawled the profile page of each user in the above dataset in February 2011 | ||
| + | | ||
| + | In order to measure the stability of these amplifiers we probed them periodically for 13 weeks to understand how many were still located at the same IP and misconfiged. | ||
| + | | ||
| + | the browser is launched with a clean user profile (i.e., no cookies or cached content) | ||
| + | | ||
| + | we crawled Google Play again in all fifteen languages for one day in February 2022 with the queries we obtained and used in our 2020 crawling. | ||
| + | | ||
| + | Each persona was associated with a unique browser running on an isolated virtual machine with a unique IP address. | ||
| + | | ||
| + | We conduct four parallel crawls: two with third-party cookies enabled (3P-Allowed) and two with third-party cookies blocked (3P-Blocked). | ||
| + | | ||
| + | We restrict the list to sites that appear in all of the top 100k lists over this period to avoid having our results affected by list churn | ||
| </ | </ | ||
| Line 3491: | Line 3542: | ||
| Mechanical rendering repair only: a fresh live raw/XHTML export of 188 pages was checked with '' | Mechanical rendering repair only: a fresh live raw/XHTML export of 188 pages was checked with '' | ||
| + | |||
| + | ===== Quote-check refresh, 2026-09-22 ===== | ||
| + | |||
| + | **What was wrong.** '' | ||
| + | stored renderings and the excerpt packet — and had **no '' | ||
| + | 2026-09-04 '' | ||
| + | 73.1% of quotes unlocatable in '' | ||
| + | '' | ||
| + | patched that day to report a **RESCUED** verdict. This checker was never patched, so | ||
| + | §18.5' | ||
| + | site was using. It has now been patched the same way and re-run. | ||
| + | |||
| + | < | ||
| + | $ node scripts/ | ||
| + | exact match: | ||
| + | whitespace-collapsed match: | ||
| + | loose match: | ||
| + | spliced match (de-spliced): | ||
| + | RESCUED from the PDF: 35 6.5% | ||
| + | NOT FOUND: | ||
| + | | ||
| + | </ | ||
| + | |||
| + | ^ Figure ^ Was ^ Is ^ Why ^ | ||
| + | | pin codings | 1,000 | 1,000 | population unchanged — no coding was touched | | ||
| + | | checked (non-empty quote) | 536 | 536 | unchanged | | ||
| + | | exact | 489 | 489 | unchanged | | ||
| + | | whitespace-collapsed | 0 | 0 | unchanged | | ||
| + | | loose | 2 | 2 | unchanged | | ||
| + | | de-spliced (6-word shingles, ≥80%) | 3 | 3 | unchanged | | ||
| + | | rescued from the PDF | — | **35** | new verdict; all 35 were inside the old 42 | | ||
| + | | located by no mode | **42** (7.8%) | **7** (1.3%) | 42 = 35 + 7 exactly; nothing else moved | | ||
| + | |||
| + | **The hand-audited fabrication rate is unchanged at 0.2%, and this run is evidence | ||
| + | for it rather than a replacement of it.** The 42 had already been read by three | ||
| + | sub-agents, who called 42 of the 43 faithful de-splices of real sentences and found | ||
| + | **one** real defect — a quote from the wrong part of {[singanamalla2022_respect]} — | ||
| + | and **zero** fabrications. The fallback now locates **35 of those same 42** in a | ||
| + | second rendering, by a script that has never seen the hand verdicts. It contradicts | ||
| + | none of them. The 7 that remain are all inside the hand-audited set and all carry the | ||
| + | verdict //faithful de-splice// | ||
| + | and 9.1% before it, it is an upper bound produced by an instrument, and the rate is | ||
| + | still the hand-read **0.2% (1 of 536)**. | ||
| + | |||
| + | **The mutation test was re-run and its pin moved.** The guard recorded in §18.11 was | ||
| + | //"an injected fabricated quote raises NOT FOUND from 42 to 43"//, which pinned the | ||
| + | literal 42. Injecting a fabricated sentence into one coding of | ||
| + | '' | ||
| + | script raises NOT FOUND **from 7 to 8**, drops '' | ||
| + | the fabricated sentence in full in the unlocated list. The pin in §18.11 has been | ||
| + | updated to 7 → 8 and the old value recorded beside it, because a guard that still | ||
| + | asserts a superseded number is a guard that will pass for the wrong reason. | ||
| + | |||
| + | **The fallback was verified to be doing work, not failing silently.** '' | ||
| + | swallows a subprocess failure and returns '' | ||
| + | and look like a clean result. The run therefore prints the number of papers for which | ||
| + | no '' | ||
| + | hand against '' | ||
| + | (//"to visit the Alexa top 50k web domains"//, | ||
| + | verbatim in the PDF) and '' | ||
| + | (//" | ||
| + | this script would now be a measured zero. | ||
| + | |||
| + | **Scope of this edit.** §18.5' | ||
| + | §18.11 mutation-test pin, and the two '' | ||
| + | its published output — both regenerated from the committed files rather than edited. | ||
| + | '' | ||
| + | **not** re-run: no coding, no population and no agreement figure is touched by this | ||
| + | change, and the quote check feeds none of them. Nothing on | ||
| + | [[: | ||
| + | No '' | ||
| + | |||
| + | ^ Item ^ Value ^ | ||
| + | | Date | 2026-09-22, unsupervised | | ||
| + | | Command | '' | ||
| + | | Artifacts | '' | ||
| + | | Script change | '' | ||
| + | | Source fragment | '' | ||
| + | | Reviewers | one '' | ||
| + | | Reviewer finding accepted | The pass caught that this section' | ||
| + | | Pages saved | this page only | | ||
provenance/design/longitudinal.1789629797.txt.gz · Last modified: by karel.kubicek.claude
