| author | |
| committer | |
| log | 423f7adf1aef0ed15f708ddac37865616105bbf3 |
| tree | 51e4b508bb26d162b7aac93e6d4fe2cec679a6a5 |
| parent | cdc3adbfaf940444332bd90ddcdf2c8e6b133040 |
| signature | Signed by SSH key SHA256:52mNGHRsVFBDED9IAX5pe+LRWUefqTbxEReunq21QvU |
Add typed position, width and saved collapse edits with a typed user-width reader flag. Preserve identities, content, unknown properties and history, and reject protected or ambiguous ancestry before publication.
Cold OneNote captures verify five layout/default edits and replacement of an existing native wrapping reservation. Tests cover 768 stateful changes, publication interruptions, 12-client mixed layout/paragraph fuzzing, and core/offline regressions.
Assisted-by: gpt-6-astra65 files changed, 1046 insertions(+), 6 deletions(-)
corpus/outline-edit/README.md+23-1| ... | @@ -17,7 +17,7 @@ movement retains them. Native XML can reorder outlines by their positions while | ... | @@ -17,7 +17,7 @@ movement retains them. Native XML can reorder outlines by their positions while |
| 17 | the file's page child order remains unchanged. Explicit width sets its native | 17 | the file's page child order remains unchanged. Explicit width sets its native |
| 18 | user-size flag; automatic width clears that flag. OneNote regenerates height | 18 | user-size flag; automatic width clears that flag. OneNote regenerates height |
| 19 | from content instead of retaining the requested height. These observations | 19 | from content instead of retaining the requested height. These observations |
| 20 | constrain future typed operations; this corpus is not itself a writer feature. | 20 | constrain typed operations independently of the native COM replacement behavior. |
| 21 | 21 | ||
| 22 | Persisted collapse values survive a cold open. Native keyboard collapse/expand | 22 | Persisted collapse values survive a cold open. Native keyboard collapse/expand |
| 23 | can instead change only the client's cached view, so warm COM XML alone does | 23 | can instead change only the client's cached view, so warm COM XML alone does |
| ... | @@ -38,3 +38,25 @@ Cold-open `OUTPUT/notebook` into another new output directory with the runner, | ... | @@ -38,3 +38,25 @@ Cold-open `OUTPUT/notebook` into another new output directory with the runner, |
| 38 | The controller selects the target again after activating the native window and | 38 | The controller selects the target again after activating the native window and |
| 39 | transfers XML as UTF-8 data. Captured authoring scripts retain their exact source; | 39 | transfers XML as UTF-8 data. Captured authoring scripts retain their exact source; |
| 40 | identical immutable artifacts link to one canonical corpus copy. | 40 | identical immutable artifacts link to one canonical corpus copy. |
| 41 | |||
| 42 | `layout/candidate` applies `PreparedEdit::outline` to the five geometry and saved | ||
| 43 | collapse cases in `before`. `layout/cold` captures that Rust output through a fresh | ||
| 44 | OneNote cache. Every active identity, child/content/structure reference, child level, | ||
| 45 | and collapse default survives; text, fields, tags and explicit formatting compare | ||
| 46 | against native XML. Fixed width renders at 144 points. The automatic 360-point hint | ||
| 47 | renders narrower for this content. Stored height remains a hint; native XML reports | ||
| 48 | the content-derived height. All fourteen associated tags and 9,577 explicit format | ||
| 49 | comparisons pass for both candidate and native-saved images. | ||
| 50 | |||
| 51 | Regenerate the layout candidate with the ignored `export_native_outline_candidates` | ||
| 52 | test in `crates/onestore/tests/outline.rs`, setting `ONESTORE_OUTLINE_OUTPUT` to a | ||
| 53 | new absolute directory. Cold-open that directory with `tools/native_runner.py`, | ||
| 54 | `--expected-pages 15 --collect-notebook`. The captured clone is removed by the runner. | ||
| 55 | |||
| 56 | `reserved-width` starts from native `after`, whose moved outline has a reserved | ||
| 57 | wrapping width. Rust replaces it with an explicit 144-point width and clears the | ||
| 58 | obsolete reservation. Native renders at 144 points after a cold reopen, retaining | ||
| 59 | all 304 active graph objects, ten tags and 8,457 explicit formatting comparisons. | ||
| 60 | To regenerate, run `resizing_a_native_reserved_width_preserves_content` with | ||
| 61 | `ONESTORE_RESERVED_WIDTH_OUTPUT` set to a new absolute directory, then cold-open | ||
| 62 | it with the same runner arguments. |
corpus/outline-edit/layout/candidate/synthetic.one created| Binary files /dev/null and b/corpus/outline-edit/layout/candidate/synthetic.one differ | |||
corpus/outline-edit/layout/cold/commands.jsonl created+3| ... | @@ -0,0 +1,3 @@ | ||
| 1 | {"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} | ||
| 2 | {"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-05C8C84C -ExpectedPages 15", "exit": 0, "stdout": "Read 1 sections and 15 pages.\r\n", "stderr": "", "error": null} | ||
| 3 | {"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} | ||
corpus/outline-edit/layout/cold/machine.json created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | {"name": "m6-05c8c84c", "hostname": "ONE-M6-05C8C84C"} | ||
corpus/outline-edit/layout/cold/notebook/Open Notebook.onetoc2 created| Binary files /dev/null and b/corpus/outline-edit/layout/cold/notebook/Open Notebook.onetoc2 differ | |||
corpus/outline-edit/layout/cold/notebook/synthetic.one created| Binary files /dev/null and b/corpus/outline-edit/layout/cold/notebook/synthetic.one differ | |||
corpus/outline-edit/layout/cold/read/environment.json created+7| ... | @@ -0,0 +1,7 @@ | ||
| 1 | { | ||
| 2 | "powershell": "5.1.14409.1005", | ||
| 3 | "schema": "xs2010", | ||
| 4 | "hostname": "ONE-M6-05C8C84C", | ||
| 5 | "cold": true, | ||
| 6 | "onenote": "14.0.4763.1000" | ||
| 7 | } | ||
corpus/outline-edit/layout/cold/read/hierarchy.xml created+2| ... | @@ -0,0 +1,2 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Notebook xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" name="notebook" nickname="notebook" ID="{A7C93947-7394-4CED-8961-41E9483F6D07}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T18:34:23.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{E9979BE4-9687-009F-259A-13084D2BA1EA}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T18:34:23.000Z" color="#8AA8E4"><one:Page ID="{C5DE6862-1F4C-438E-A2FD-BB99B113BDF5}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T18:34:22.000Z" pageLevel="1"/><one:Page ID="{16E025AE-EED6-47A3-B861-0490A01B1621}{1}{B0}" name="Move leaf down" dateTime="2026-09-08T18:00:47.000Z" lastModifiedTime="2026-09-08T18:34:22.000Z" pageLevel="1"/><one:Page ID="{3A46815C-49E1-4D80-8143-5DEC061CEECE}{1}{B0}" name="Move subtree down" dateTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T18:34:22.000Z" pageLevel="1"/><one:Page ID="{D4FE5FCA-69CE-48E8-B657-81DAE02DE3C3}{1}{B0}" name="Move subtree up" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:34:22.000Z" pageLevel="1"/><one:Page ID="{C4D23575-963D-43A3-A9FB-CF80E47642E1}{1}{B0}" name="Indent subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:34:22.000Z" pageLevel="1"/><one:Page ID="{22425EAA-31B8-404C-B0D3-B8461EBE8502}{1}{B0}" name="Outdent subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:34:22.000Z" pageLevel="1"/><one:Page ID="{5E4EE385-53C9-4FD2-9F44-AD5B68DB417F}{1}{B0}" name="Collapse subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:34:22.000Z" pageLevel="1"/><one:Page ID="{24CD6272-877F-4B1B-8C4C-81CFA308D467}{1}{B0}" name="Expand subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:34:22.000Z" pageLevel="1"/><one:Page ID="{97F9B6C3-15B4-4417-8B6E-75412910B716}{1}{B0}" name="Delete leaf" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:34:22.000Z" pageLevel="1"/><one:Page ID="{2A7C8E19-831D-4669-9F75-175E01C065D9}{1}{B0}" name="Delete subtree" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:34:22.000Z" pageLevel="1"/><one:Page ID="{050D6D34-272A-45D8-96D0-9C728B5F6ECB}{1}{B0}" name="Delete only paragraph" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:34:22.000Z" pageLevel="1"/><one:Page ID="{212E53D5-D6F4-430A-97D0-11D7367BCA6E}{1}{B0}" name="Delete outline" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:34:23.000Z" pageLevel="1"/><one:Page ID="{B7E629D6-389C-4391-9673-EF31B41D1D57}{1}{B0}" name="Move outline" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:34:23.000Z" pageLevel="1"/><one:Page ID="{6C8452B7-22A2-4021-9D2A-069A058EAF65}{1}{B0}" name="Resize outline" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:34:23.000Z" pageLevel="1"/><one:Page ID="{52455FF9-7074-4D15-81A4-98516F776DDA}{1}{B0}" name="Automatic outline size" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:34:23.000Z" pageLevel="1"/></one:Section></one:Notebook> | ||
corpus/outline-edit/layout/cold/read/page-000.xml created+4| ... | @@ -0,0 +1,4 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{050D6D34-272A-45D8-96D0-9C728B5F6ECB}{1}{B0}" name="Delete only paragraph" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:34:22.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{69AE8BA2-3FD9-48D9-8EA8-7F0E74026B15}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Delete only paragraph]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{69AE8BA2-3FD9-48D9-8EA8-7F0E74026B15}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="129.6621246337891" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{69AE8BA2-3FD9-48D9-8EA8-7F0E74026B15}{40}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | ||
| 4 | href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{69AE8BA2-3FD9-48D9-8EA8-7F0E74026B15}{49}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{69AE8BA2-3FD9-48D9-8EA8-7F0E74026B15}{50}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/layout/cold/read/page-001.xml created+4| ... | @@ -0,0 +1,4 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{16E025AE-EED6-47A3-B861-0490A01B1621}{1}{B0}" name="Move leaf down" dateTime="2026-09-08T18:00:47.000Z" lastModifiedTime="2026-09-08T18:34:22.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T18:00:49.000Z" objectID="{A2FA96A0-2183-4DE3-B7AF-5102F3E94D77}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Move leaf down]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{A2FA96A0-2183-4DE3-B7AF-5102F3E94D77}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="129.6621246337891" height="40.28315734863281"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T18:00:49.000Z" objectID="{A2FA96A0-2183-4DE3-B7AF-5102F3E94D77}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:48.000Z" lastModifiedTime="2026-09-08T18:00:49.000Z" objectID="{A2FA96A0-2183-4DE3-B7AF-5102F3E94D77}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | ||
| 4 | href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T18:00:49.000Z" objectID="{A2FA96A0-2183-4DE3-B7AF-5102F3E94D77}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{A2FA96A0-2183-4DE3-B7AF-5102F3E94D77}{59}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T18:00:49.000Z" objectID="{A2FA96A0-2183-4DE3-B7AF-5102F3E94D77}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/layout/cold/read/page-002.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{212E53D5-D6F4-430A-97D0-11D7367BCA6E}{1}{B0}" name="Delete outline" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:34:23.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{D9BF3B1D-AA6C-4DE8-BAC4-1135A9C631D5}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Delete outline]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{D9BF3B1D-AA6C-4DE8-BAC4-1135A9C631D5}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="142.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{D9BF3B1D-AA6C-4DE8-BAC4-1135A9C631D5}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{D9BF3B1D-AA6C-4DE8-BAC4-1135A9C631D5}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | ||
| 4 | href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{D9BF3B1D-AA6C-4DE8-BAC4-1135A9C631D5}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span | ||
| 5 | style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{D9BF3B1D-AA6C-4DE8-BAC4-1135A9C631D5}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{D9BF3B1D-AA6C-4DE8-BAC4-1135A9C631D5}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{D9BF3B1D-AA6C-4DE8-BAC4-1135A9C631D5}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{D9BF3B1D-AA6C-4DE8-BAC4-1135A9C631D5}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/layout/cold/read/page-003.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{22425EAA-31B8-404C-B0D3-B8461EBE8502}{1}{B0}" name="Outdent subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:34:22.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{BB4BDC9D-B83B-4E80-A264-DC7E8C67A6AB}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Outdent subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{BB4BDC9D-B83B-4E80-A264-DC7E8C67A6AB}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="169.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{BB4BDC9D-B83B-4E80-A264-DC7E8C67A6AB}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{BB4BDC9D-B83B-4E80-A264-DC7E8C67A6AB}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | ||
| 4 | href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{BB4BDC9D-B83B-4E80-A264-DC7E8C67A6AB}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span | ||
| 5 | style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{BB4BDC9D-B83B-4E80-A264-DC7E8C67A6AB}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{BB4BDC9D-B83B-4E80-A264-DC7E8C67A6AB}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{BB4BDC9D-B83B-4E80-A264-DC7E8C67A6AB}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{BB4BDC9D-B83B-4E80-A264-DC7E8C67A6AB}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/layout/cold/read/page-004.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{24CD6272-877F-4B1B-8C4C-81CFA308D467}{1}{B0}" name="Expand subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:34:22.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{10DB81A8-1361-4BDF-908B-2C014E3F1ACB}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Expand subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:32:55.000Z" objectID="{10DB81A8-1361-4BDF-908B-2C014E3F1ACB}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="142.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{10DB81A8-1361-4BDF-908B-2C014E3F1ACB}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:32:55.000Z" objectID="{10DB81A8-1361-4BDF-908B-2C014E3F1ACB}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | ||
| 4 | href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{10DB81A8-1361-4BDF-908B-2C014E3F1ACB}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span | ||
| 5 | style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{10DB81A8-1361-4BDF-908B-2C014E3F1ACB}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{10DB81A8-1361-4BDF-908B-2C014E3F1ACB}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{10DB81A8-1361-4BDF-908B-2C014E3F1ACB}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{10DB81A8-1361-4BDF-908B-2C014E3F1ACB}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/layout/cold/read/page-005.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{2A7C8E19-831D-4669-9F75-175E01C065D9}{1}{B0}" name="Delete subtree" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:34:22.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{D25E2B33-9141-41DA-9F3E-6F78B251000D}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Delete subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{D25E2B33-9141-41DA-9F3E-6F78B251000D}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="142.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{D25E2B33-9141-41DA-9F3E-6F78B251000D}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{D25E2B33-9141-41DA-9F3E-6F78B251000D}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | ||
| 4 | href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{D25E2B33-9141-41DA-9F3E-6F78B251000D}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span | ||
| 5 | style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{D25E2B33-9141-41DA-9F3E-6F78B251000D}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{D25E2B33-9141-41DA-9F3E-6F78B251000D}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{D25E2B33-9141-41DA-9F3E-6F78B251000D}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{D25E2B33-9141-41DA-9F3E-6F78B251000D}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/layout/cold/read/page-006.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{3A46815C-49E1-4D80-8143-5DEC061CEECE}{1}{B0}" name="Move subtree down" dateTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T18:34:22.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{465C52D4-EE9A-4BF6-81C2-052DCE414D61}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Move subtree down]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{465C52D4-EE9A-4BF6-81C2-052DCE414D61}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="142.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T18:00:49.000Z" objectID="{465C52D4-EE9A-4BF6-81C2-052DCE414D61}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{465C52D4-EE9A-4BF6-81C2-052DCE414D61}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | ||
| 4 | href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{465C52D4-EE9A-4BF6-81C2-052DCE414D61}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span | ||
| 5 | style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{465C52D4-EE9A-4BF6-81C2-052DCE414D61}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{465C52D4-EE9A-4BF6-81C2-052DCE414D61}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{465C52D4-EE9A-4BF6-81C2-052DCE414D61}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{465C52D4-EE9A-4BF6-81C2-052DCE414D61}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/layout/cold/read/page-007.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{52455FF9-7074-4D15-81A4-98516F776DDA}{1}{B0}" name="Automatic outline size" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:34:23.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{6FF0088D-CA23-494E-B101-1169106A4000}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Automatic outline size]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:32:55.000Z" objectID="{6FF0088D-CA23-494E-B101-1169106A4000}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="142.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{6FF0088D-CA23-494E-B101-1169106A4000}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{6FF0088D-CA23-494E-B101-1169106A4000}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | ||
| 4 | href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{6FF0088D-CA23-494E-B101-1169106A4000}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span | ||
| 5 | style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{6FF0088D-CA23-494E-B101-1169106A4000}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{6FF0088D-CA23-494E-B101-1169106A4000}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{6FF0088D-CA23-494E-B101-1169106A4000}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{6FF0088D-CA23-494E-B101-1169106A4000}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/layout/cold/read/page-008.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{5E4EE385-53C9-4FD2-9F44-AD5B68DB417F}{1}{B0}" name="Collapse subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:34:22.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{D2B39E47-79A5-4435-9F23-3A5FF111C318}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Collapse subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:32:55.000Z" objectID="{D2B39E47-79A5-4435-9F23-3A5FF111C318}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="129.6621246337891" height="40.28315734863281"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{D2B39E47-79A5-4435-9F23-3A5FF111C318}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:32:55.000Z" collapsed="1" objectID="{D2B39E47-79A5-4435-9F23-3A5FF111C318}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | ||
| 4 | href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{D2B39E47-79A5-4435-9F23-3A5FF111C318}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span | ||
| 5 | style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{D2B39E47-79A5-4435-9F23-3A5FF111C318}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{D2B39E47-79A5-4435-9F23-3A5FF111C318}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{D2B39E47-79A5-4435-9F23-3A5FF111C318}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{D2B39E47-79A5-4435-9F23-3A5FF111C318}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/layout/cold/read/page-009.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{6C8452B7-22A2-4021-9D2A-069A058EAF65}{1}{B0}" name="Resize outline" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:34:23.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{A545326F-8206-4AD3-AE58-155575F20227}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Resize outline]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:32:55.000Z" objectID="{A545326F-8206-4AD3-AE58-155575F20227}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="144.0" height="67.13858032226562" isSetByUser="true"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{A545326F-8206-4AD3-AE58-155575F20227}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{A545326F-8206-4AD3-AE58-155575F20227}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | ||
| 4 | href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{A545326F-8206-4AD3-AE58-155575F20227}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span | ||
| 5 | style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{A545326F-8206-4AD3-AE58-155575F20227}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{A545326F-8206-4AD3-AE58-155575F20227}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{A545326F-8206-4AD3-AE58-155575F20227}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{A545326F-8206-4AD3-AE58-155575F20227}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/layout/cold/read/page-010.xml created+4| ... | @@ -0,0 +1,4 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{97F9B6C3-15B4-4417-8B6E-75412910B716}{1}{B0}" name="Delete leaf" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:34:22.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{7D51397A-9C65-4371-BF6B-88208CE6028D}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Delete leaf]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{7D51397A-9C65-4371-BF6B-88208CE6028D}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="129.6621246337891" height="40.28315734863281"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{7D51397A-9C65-4371-BF6B-88208CE6028D}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{7D51397A-9C65-4371-BF6B-88208CE6028D}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | ||
| 4 | href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{7D51397A-9C65-4371-BF6B-88208CE6028D}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{7D51397A-9C65-4371-BF6B-88208CE6028D}{59}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{7D51397A-9C65-4371-BF6B-88208CE6028D}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/layout/cold/read/page-011.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{B7E629D6-389C-4391-9673-EF31B41D1D57}{1}{B0}" name="Move outline" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:34:23.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{E7EDC00D-ADAF-4D31-98FC-382A9AE59D1C}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Move outline]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{E7EDC00D-ADAF-4D31-98FC-382A9AE59D1C}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{E7EDC00D-ADAF-4D31-98FC-382A9AE59D1C}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:32:55.000Z" objectID="{E7EDC00D-ADAF-4D31-98FC-382A9AE59D1C}{39}{B0}"><one:Position x="180.0" y="216.0" z="0"/><one:Size width="142.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{E7EDC00D-ADAF-4D31-98FC-382A9AE59D1C}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{E7EDC00D-ADAF-4D31-98FC-382A9AE59D1C}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | ||
| 4 | href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{E7EDC00D-ADAF-4D31-98FC-382A9AE59D1C}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span | ||
| 5 | style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{E7EDC00D-ADAF-4D31-98FC-382A9AE59D1C}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{E7EDC00D-ADAF-4D31-98FC-382A9AE59D1C}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/layout/cold/read/page-012.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{C4D23575-963D-43A3-A9FB-CF80E47642E1}{1}{B0}" name="Indent subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:34:22.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{FB4F6598-5956-47FF-B433-1504B95FB6D0}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Indent subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{FB4F6598-5956-47FF-B433-1504B95FB6D0}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="142.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{FB4F6598-5956-47FF-B433-1504B95FB6D0}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{FB4F6598-5956-47FF-B433-1504B95FB6D0}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | ||
| 4 | href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{FB4F6598-5956-47FF-B433-1504B95FB6D0}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span | ||
| 5 | style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{FB4F6598-5956-47FF-B433-1504B95FB6D0}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{FB4F6598-5956-47FF-B433-1504B95FB6D0}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{FB4F6598-5956-47FF-B433-1504B95FB6D0}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{FB4F6598-5956-47FF-B433-1504B95FB6D0}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/layout/cold/read/page-013.xml created+20| ... | @@ -0,0 +1,20 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{C5DE6862-1F4C-438E-A2FD-BB99B113BDF5}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T18:34:22.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{A212C0DE-5439-4038-AD0F-37424E8F5894}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="0"/><one:Size width="127.5136947631836" height="42.90299224853515"/><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{A5776829-A744-0B32-1D5B-F44885E42A62}{1}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold; | ||
| 3 | text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span | ||
| 4 | style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family: | ||
| 5 | Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri; | ||
| 6 | font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through; | ||
| 7 | font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family: | ||
| 8 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family: | ||
| 9 | Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size: | ||
| 10 | 11.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238; | ||
| 11 | background:yellow;mso-highlight:yellow'>color</span><span style='font-family: | ||
| 12 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family: | ||
| 13 | Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size: | ||
| 14 | 11.0pt'><br> | ||
| 15 | End</span>]]></one:T></one:OE><one:OE author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{A212C0DE-5439-4038-AD0F-37424E8F5894}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span | ||
| 16 | style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span | ||
| 17 | style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span | ||
| 18 | style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span | ||
| 19 | style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed' | ||
| 20 | lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/layout/cold/read/page-014.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{D4FE5FCA-69CE-48E8-B657-81DAE02DE3C3}{1}{B0}" name="Move subtree up" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:34:22.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{9E81500C-A190-4A0E-822A-20D3F428D449}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Move subtree up]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{9E81500C-A190-4A0E-822A-20D3F428D449}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="142.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{9E81500C-A190-4A0E-822A-20D3F428D449}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{9E81500C-A190-4A0E-822A-20D3F428D449}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | ||
| 4 | href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{9E81500C-A190-4A0E-822A-20D3F428D449}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span | ||
| 5 | style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{9E81500C-A190-4A0E-822A-20D3F428D449}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{9E81500C-A190-4A0E-822A-20D3F428D449}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{9E81500C-A190-4A0E-822A-20D3F428D449}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{9E81500C-A190-4A0E-822A-20D3F428D449}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/layout/cold/read/payloads.json created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | ../../../../paragraph-edit/before/read/payloads.json | ||
| \ No newline at end of file | |||
corpus/outline-edit/layout/cold/run.json created+18| ... | @@ -0,0 +1,18 @@ | ||
| 1 | { | ||
| 2 | "notebook": "/Users/clo/dev/one/evidence/m10/outline-rust-candidate-01", | ||
| 3 | "expected_pages": 15, | ||
| 4 | "author": null, | ||
| 5 | "author_timeout_seconds": 600, | ||
| 6 | "inspect": false, | ||
| 7 | "collect_notebook": true, | ||
| 8 | "base": { | ||
| 9 | "file": "win7-office-base.qcow2", | ||
| 10 | "format": "qcow2", | ||
| 11 | "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", | ||
| 12 | "virtual_size": 68719476736 | ||
| 13 | }, | ||
| 14 | "scripts": { | ||
| 15 | "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", | ||
| 16 | "read.ps1": "04013bfcccee40a17e2a225f9b9e96f40a3a8daad9e350609654f8eda3ccbb41" | ||
| 17 | } | ||
| 18 | } | ||
corpus/outline-edit/layout/cold/scripts/cold.ps1 created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | ../../../../paragraph-edit/reconciliation/keyboard/scripts/cold.ps1 | ||
| \ No newline at end of file | |||
corpus/outline-edit/layout/cold/scripts/read.ps1 created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | ../../../../paragraph-edit/reconciliation/keyboard/scripts/read.ps1 | ||
| \ No newline at end of file | |||
corpus/outline-edit/layout/cold/source.json created+8| ... | @@ -0,0 +1,8 @@ | ||
| 1 | [ | ||
| 2 | { | ||
| 3 | "path": "synthetic.one", | ||
| 4 | "bytes": 104504, | ||
| 5 | "sha256": "3b000949d72c206f57bcdbf4ebc4aa90a738a0bf7c86f1bf4c226655b5202d59", | ||
| 6 | "mtime_ns": 1788892375964323634 | ||
| 7 | } | ||
| 8 | ] | ||
corpus/outline-edit/layout/cold/teardown.json created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | {"absent": true} | ||
corpus/outline-edit/reserved-width/candidate/synthetic.one created| Binary files /dev/null and b/corpus/outline-edit/reserved-width/candidate/synthetic.one differ | |||
corpus/outline-edit/reserved-width/cold/commands.jsonl created+3| ... | @@ -0,0 +1,3 @@ | ||
| 1 | {"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} | ||
| 2 | {"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-6B4076E4 -ExpectedPages 15", "exit": 0, "stdout": "Read 1 sections and 15 pages.\r\n", "stderr": "", "error": null} | ||
| 3 | {"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} | ||
corpus/outline-edit/reserved-width/cold/machine.json created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | {"name": "m6-6b4076e4", "hostname": "ONE-M6-6B4076E4"} | ||
corpus/outline-edit/reserved-width/cold/notebook/Open Notebook.onetoc2 created| Binary files /dev/null and b/corpus/outline-edit/reserved-width/cold/notebook/Open Notebook.onetoc2 differ | |||
corpus/outline-edit/reserved-width/cold/notebook/synthetic.one created| Binary files /dev/null and b/corpus/outline-edit/reserved-width/cold/notebook/synthetic.one differ | |||
corpus/outline-edit/reserved-width/cold/read/environment.json created+7| ... | @@ -0,0 +1,7 @@ | ||
| 1 | { | ||
| 2 | "powershell": "5.1.14409.1005", | ||
| 3 | "schema": "xs2010", | ||
| 4 | "hostname": "ONE-M6-6B4076E4", | ||
| 5 | "cold": true, | ||
| 6 | "onenote": "14.0.4763.1000" | ||
| 7 | } | ||
corpus/outline-edit/reserved-width/cold/read/hierarchy.xml created+2| ... | @@ -0,0 +1,2 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Notebook xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" name="notebook" nickname="notebook" ID="{FC2D0D14-5246-4133-8B45-65CF72A6C1C9}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T18:41:01.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{46677835-0E6D-0454-05EA-582F13F26121}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T18:41:01.000Z" color="#8AA8E4"><one:Page ID="{6A2E8BB3-87A6-4745-828D-F0BEEFCA7D3E}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T18:41:00.000Z" pageLevel="1"/><one:Page ID="{B910C67F-763C-4368-9811-4FB7FEC2D6EA}{1}{B0}" name="Move leaf down" dateTime="2026-09-08T18:00:47.000Z" lastModifiedTime="2026-09-08T18:02:45.000Z" pageLevel="1"/><one:Page ID="{95B6628D-D10B-494B-A133-16CB58C52E05}{1}{B0}" name="Move subtree down" dateTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T18:02:47.000Z" pageLevel="1"/><one:Page ID="{7B0EBC1B-F124-4C23-9627-CAFDBEF42308}{1}{B0}" name="Move subtree up" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:49.000Z" pageLevel="1"/><one:Page ID="{6B22D6A4-0ED7-4768-898B-84A7BAAF822A}{1}{B0}" name="Indent subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:50.000Z" pageLevel="1"/><one:Page ID="{8DB2BD7B-A952-4487-90A3-F361406745C9}{1}{B0}" name="Outdent subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:52.000Z" pageLevel="1"/><one:Page ID="{F1BE0054-CB23-4B19-BF34-E67C360281B4}{1}{B0}" name="Collapse subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:41:00.000Z" pageLevel="1"/><one:Page ID="{8B3D81A3-1F95-4FD0-AC3C-CAE8FDD114AC}{1}{B0}" name="Expand subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:41:00.000Z" pageLevel="1"/><one:Page ID="{38095512-8D5E-40DC-AB1E-3E6677C977DD}{1}{B0}" name="Delete leaf" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:03:01.000Z" pageLevel="1"/><one:Page ID="{858C6DC8-1BF7-42A2-BF05-5C795F19A512}{1}{B0}" name="Delete subtree" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:03:03.000Z" pageLevel="1"/><one:Page ID="{AAFD8EE5-BFC0-4113-B6A0-D755D586AE00}{1}{B0}" name="Delete only paragraph" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:03:05.000Z" pageLevel="1"/><one:Page ID="{8EDEB004-4E1E-47C1-B7A0-5AF068A20AA5}{1}{B0}" name="Delete outline" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:41:01.000Z" pageLevel="1"/><one:Page ID="{1816CA07-A076-475A-B603-A416EAC4DD9C}{1}{B0}" name="Move outline" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:41:01.000Z" pageLevel="1"/><one:Page ID="{C374B166-BA48-44EA-BD5A-4DBD5B576FAE}{1}{B0}" name="Resize outline" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:41:01.000Z" pageLevel="1"/><one:Page ID="{FDB5BC28-E89E-49DE-A1D4-D37631AEAD11}{1}{B0}" name="Automatic outline size" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:41:01.000Z" pageLevel="1"/></one:Section></one:Notebook> | ||
corpus/outline-edit/reserved-width/cold/read/page-000.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{1816CA07-A076-475A-B603-A416EAC4DD9C}{1}{B0}" name="Move outline" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:41:01.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{481D23DC-3545-49FA-B88C-730DC43C5DD7}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Move outline]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{481D23DC-3545-49FA-B88C-730DC43C5DD7}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{481D23DC-3545-49FA-B88C-730DC43C5DD7}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:39:33.000Z" objectID="{481D23DC-3545-49FA-B88C-730DC43C5DD7}{39}{B0}"><one:Position x="180.0" y="216.0" z="0"/><one:Size width="144.0" height="67.13858032226562" isSetByUser="true"/><one:OEChildren><one:OE creationTime="2026-09-08T18:03:10.000Z" lastModifiedTime="2026-09-08T18:03:10.000Z" objectID="{481D23DC-3545-49FA-B88C-730DC43C5DD7}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:03:10.000Z" objectID="{481D23DC-3545-49FA-B88C-730DC43C5DD7}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | ||
| 4 | href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:03:10.000Z" lastModifiedTime="2026-09-08T18:03:10.000Z" objectID="{481D23DC-3545-49FA-B88C-730DC43C5DD7}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span | ||
| 5 | style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:03:10.000Z" lastModifiedTime="2026-09-08T18:03:10.000Z" objectID="{481D23DC-3545-49FA-B88C-730DC43C5DD7}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:03:10.000Z" lastModifiedTime="2026-09-08T18:03:10.000Z" objectID="{481D23DC-3545-49FA-B88C-730DC43C5DD7}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/reserved-width/cold/read/page-001.xml created+2| ... | @@ -0,0 +1,2 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{38095512-8D5E-40DC-AB1E-3E6677C977DD}{1}{B0}" name="Delete leaf" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:03:01.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:03:00.000Z" objectID="{D2A1DAAB-048F-47BA-9F1B-C307D23FC246}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Delete leaf]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:03:01.000Z" objectID="{D2A1DAAB-048F-47BA-9F1B-C307D23FC246}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="103.8432159423828" height="26.85543441772461"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:03:00.000Z" objectID="{D2A1DAAB-048F-47BA-9F1B-C307D23FC246}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:03:00.000Z" objectID="{D2A1DAAB-048F-47BA-9F1B-C307D23FC246}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:03:00.000Z" objectID="{D2A1DAAB-048F-47BA-9F1B-C307D23FC246}{59}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:03:00.000Z" objectID="{D2A1DAAB-048F-47BA-9F1B-C307D23FC246}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/reserved-width/cold/read/page-002.xml created+20| ... | @@ -0,0 +1,20 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{6A2E8BB3-87A6-4745-828D-F0BEEFCA7D3E}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T18:41:00.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{0DE2230F-CCD3-44F3-8D7F-7C651056985F}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="0"/><one:Size width="127.5136947631836" height="42.90299224853515"/><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{0A878BF8-3FAE-0FF9-3D2B-BF6FDB3DEAA9}{1}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold; | ||
| 3 | text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span | ||
| 4 | style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family: | ||
| 5 | Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri; | ||
| 6 | font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through; | ||
| 7 | font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family: | ||
| 8 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family: | ||
| 9 | Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size: | ||
| 10 | 11.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238; | ||
| 11 | background:yellow;mso-highlight:yellow'>color</span><span style='font-family: | ||
| 12 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family: | ||
| 13 | Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size: | ||
| 14 | 11.0pt'><br> | ||
| 15 | End</span>]]></one:T></one:OE><one:OE author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{0DE2230F-CCD3-44F3-8D7F-7C651056985F}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span | ||
| 16 | style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span | ||
| 17 | style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span | ||
| 18 | style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span | ||
| 19 | style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed' | ||
| 20 | lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/reserved-width/cold/read/page-003.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{6B22D6A4-0ED7-4768-898B-84A7BAAF822A}{1}{B0}" name="Indent subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:50.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{54BF8649-C1BC-4334-9443-5E23E786761B}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Indent subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:02:50.000Z" objectID="{54BF8649-C1BC-4334-9443-5E23E786761B}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="169.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:50.000Z" objectID="{54BF8649-C1BC-4334-9443-5E23E786761B}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:50.000Z" objectID="{54BF8649-C1BC-4334-9443-5E23E786761B}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | ||
| 4 | href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:50.000Z" objectID="{54BF8649-C1BC-4334-9443-5E23E786761B}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span | ||
| 5 | style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:50.000Z" objectID="{54BF8649-C1BC-4334-9443-5E23E786761B}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:50.000Z" objectID="{54BF8649-C1BC-4334-9443-5E23E786761B}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:02:50.000Z" objectID="{54BF8649-C1BC-4334-9443-5E23E786761B}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:50.000Z" objectID="{54BF8649-C1BC-4334-9443-5E23E786761B}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/reserved-width/cold/read/page-004.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{7B0EBC1B-F124-4C23-9627-CAFDBEF42308}{1}{B0}" name="Move subtree up" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:49.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{3171B3DD-397A-4EC5-A25A-6BF4AAF11482}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Move subtree up]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:02:49.000Z" objectID="{3171B3DD-397A-4EC5-A25A-6BF4AAF11482}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="142.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:48.000Z" objectID="{3171B3DD-397A-4EC5-A25A-6BF4AAF11482}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | ||
| 4 | href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:48.000Z" objectID="{3171B3DD-397A-4EC5-A25A-6BF4AAF11482}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span | ||
| 5 | style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:48.000Z" objectID="{3171B3DD-397A-4EC5-A25A-6BF4AAF11482}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:48.000Z" objectID="{3171B3DD-397A-4EC5-A25A-6BF4AAF11482}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:48.000Z" objectID="{3171B3DD-397A-4EC5-A25A-6BF4AAF11482}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:02:48.000Z" objectID="{3171B3DD-397A-4EC5-A25A-6BF4AAF11482}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:48.000Z" objectID="{3171B3DD-397A-4EC5-A25A-6BF4AAF11482}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/reserved-width/cold/read/page-005.xml created+2| ... | @@ -0,0 +1,2 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{858C6DC8-1BF7-42A2-BF05-5C795F19A512}{1}{B0}" name="Delete subtree" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:03:03.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{7DAEC8E2-09AB-4511-BF4E-245FEC88C0C6}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Delete subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:03:03.000Z" objectID="{7DAEC8E2-09AB-4511-BF4E-245FEC88C0C6}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="103.8432159423828" height="26.85543441772461"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:03:02.000Z" objectID="{7DAEC8E2-09AB-4511-BF4E-245FEC88C0C6}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:03:02.000Z" objectID="{7DAEC8E2-09AB-4511-BF4E-245FEC88C0C6}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:03:02.000Z" objectID="{7DAEC8E2-09AB-4511-BF4E-245FEC88C0C6}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:03:02.000Z" objectID="{7DAEC8E2-09AB-4511-BF4E-245FEC88C0C6}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/reserved-width/cold/read/page-006.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{8B3D81A3-1F95-4FD0-AC3C-CAE8FDD114AC}{1}{B0}" name="Expand subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:41:00.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{BF2B6279-8B8B-4F14-B0FB-672610E6DA00}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Expand subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:02:59.000Z" objectID="{BF2B6279-8B8B-4F14-B0FB-672610E6DA00}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="129.6621246337891" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T18:02:59.000Z" lastModifiedTime="2026-09-08T18:02:59.000Z" objectID="{BF2B6279-8B8B-4F14-B0FB-672610E6DA00}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:59.000Z" objectID="{BF2B6279-8B8B-4F14-B0FB-672610E6DA00}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | ||
| 4 | href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:02:59.000Z" lastModifiedTime="2026-09-08T18:02:59.000Z" objectID="{BF2B6279-8B8B-4F14-B0FB-672610E6DA00}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span | ||
| 5 | style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:02:59.000Z" lastModifiedTime="2026-09-08T18:02:59.000Z" objectID="{BF2B6279-8B8B-4F14-B0FB-672610E6DA00}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:02:59.000Z" lastModifiedTime="2026-09-08T18:02:59.000Z" objectID="{BF2B6279-8B8B-4F14-B0FB-672610E6DA00}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{BF2B6279-8B8B-4F14-B0FB-672610E6DA00}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{BF2B6279-8B8B-4F14-B0FB-672610E6DA00}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/reserved-width/cold/read/page-007.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{8DB2BD7B-A952-4487-90A3-F361406745C9}{1}{B0}" name="Outdent subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:52.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{14BB3F4C-20D1-4A4B-8214-9759D2BE6660}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Outdent subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:02:52.000Z" objectID="{14BB3F4C-20D1-4A4B-8214-9759D2BE6660}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="142.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:52.000Z" objectID="{14BB3F4C-20D1-4A4B-8214-9759D2BE6660}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:52.000Z" objectID="{14BB3F4C-20D1-4A4B-8214-9759D2BE6660}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | ||
| 4 | href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:52.000Z" objectID="{14BB3F4C-20D1-4A4B-8214-9759D2BE6660}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span | ||
| 5 | style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:52.000Z" objectID="{14BB3F4C-20D1-4A4B-8214-9759D2BE6660}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:52.000Z" objectID="{14BB3F4C-20D1-4A4B-8214-9759D2BE6660}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:02:52.000Z" objectID="{14BB3F4C-20D1-4A4B-8214-9759D2BE6660}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:52.000Z" objectID="{14BB3F4C-20D1-4A4B-8214-9759D2BE6660}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/reserved-width/cold/read/page-008.xml created+2| ... | @@ -0,0 +1,2 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{8EDEB004-4E1E-47C1-B7A0-5AF068A20AA5}{1}{B0}" name="Delete outline" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:41:01.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{764FD8CC-3286-4923-9AB4-5A12F71FF11E}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Delete outline]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{764FD8CC-3286-4923-9AB4-5A12F71FF11E}{70}{B0}"><one:Position x="480.0" y="108.0" z="0"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{764FD8CC-3286-4923-9AB4-5A12F71FF11E}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/reserved-width/cold/read/page-009.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{95B6628D-D10B-494B-A133-16CB58C52E05}{1}{B0}" name="Move subtree down" dateTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T18:02:47.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{E9ACB105-7670-4F3D-A1B2-4E0A90988DAA}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Move subtree down]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:02:47.000Z" objectID="{E9ACB105-7670-4F3D-A1B2-4E0A90988DAA}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="142.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T18:02:46.000Z" objectID="{E9ACB105-7670-4F3D-A1B2-4E0A90988DAA}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:46.000Z" objectID="{E9ACB105-7670-4F3D-A1B2-4E0A90988DAA}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T18:02:46.000Z" objectID="{E9ACB105-7670-4F3D-A1B2-4E0A90988DAA}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | ||
| 4 | href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:46.000Z" objectID="{E9ACB105-7670-4F3D-A1B2-4E0A90988DAA}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span | ||
| 5 | style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:46.000Z" objectID="{E9ACB105-7670-4F3D-A1B2-4E0A90988DAA}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:02:46.000Z" objectID="{E9ACB105-7670-4F3D-A1B2-4E0A90988DAA}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:46.000Z" objectID="{E9ACB105-7670-4F3D-A1B2-4E0A90988DAA}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/reserved-width/cold/read/page-010.xml created+2| ... | @@ -0,0 +1,2 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{AAFD8EE5-BFC0-4113-B6A0-D755D586AE00}{1}{B0}" name="Delete only paragraph" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:03:05.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:03:04.000Z" objectID="{C65E6873-A733-4C12-AED8-34292ADBABDE}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Delete only paragraph]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:03:04.000Z" objectID="{C65E6873-A733-4C12-AED8-34292ADBABDE}{49}{B0}"><one:Position x="480.0" y="108.0" z="0"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:03:04.000Z" objectID="{C65E6873-A733-4C12-AED8-34292ADBABDE}{50}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/reserved-width/cold/read/page-011.xml created+4| ... | @@ -0,0 +1,4 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{B910C67F-763C-4368-9811-4FB7FEC2D6EA}{1}{B0}" name="Move leaf down" dateTime="2026-09-08T18:00:47.000Z" lastModifiedTime="2026-09-08T18:02:45.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T18:00:49.000Z" objectID="{0D0A7571-B969-4928-97DF-1A25AD308DBC}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Move leaf down]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:02:45.000Z" objectID="{0D0A7571-B969-4928-97DF-1A25AD308DBC}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="129.6621246337891" height="40.28315734863281"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T18:00:49.000Z" objectID="{0D0A7571-B969-4928-97DF-1A25AD308DBC}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T18:00:49.000Z" objectID="{0D0A7571-B969-4928-97DF-1A25AD308DBC}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:48.000Z" lastModifiedTime="2026-09-08T18:00:49.000Z" objectID="{0D0A7571-B969-4928-97DF-1A25AD308DBC}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | ||
| 4 | href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{0D0A7571-B969-4928-97DF-1A25AD308DBC}{59}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T18:00:49.000Z" objectID="{0D0A7571-B969-4928-97DF-1A25AD308DBC}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/reserved-width/cold/read/page-012.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{C374B166-BA48-44EA-BD5A-4DBD5B576FAE}{1}{B0}" name="Resize outline" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:41:01.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{0AB5D1BE-1AEC-4E18-8E28-5E722B2BC2EC}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Resize outline]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:03:12.000Z" objectID="{0AB5D1BE-1AEC-4E18-8E28-5E722B2BC2EC}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="144.0" height="67.13858032226562" isSetByUser="true"/><one:OEChildren><one:OE creationTime="2026-09-08T18:03:12.000Z" lastModifiedTime="2026-09-08T18:03:12.000Z" objectID="{0AB5D1BE-1AEC-4E18-8E28-5E722B2BC2EC}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:03:12.000Z" objectID="{0AB5D1BE-1AEC-4E18-8E28-5E722B2BC2EC}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | ||
| 4 | href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:03:12.000Z" lastModifiedTime="2026-09-08T18:03:12.000Z" objectID="{0AB5D1BE-1AEC-4E18-8E28-5E722B2BC2EC}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span | ||
| 5 | style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:03:12.000Z" lastModifiedTime="2026-09-08T18:03:12.000Z" objectID="{0AB5D1BE-1AEC-4E18-8E28-5E722B2BC2EC}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:03:12.000Z" lastModifiedTime="2026-09-08T18:03:12.000Z" objectID="{0AB5D1BE-1AEC-4E18-8E28-5E722B2BC2EC}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{0AB5D1BE-1AEC-4E18-8E28-5E722B2BC2EC}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{0AB5D1BE-1AEC-4E18-8E28-5E722B2BC2EC}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/reserved-width/cold/read/page-013.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{F1BE0054-CB23-4B19-BF34-E67C360281B4}{1}{B0}" name="Collapse subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:41:00.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{7D437D96-E14F-40FE-BF53-7178AFC803D3}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Collapse subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:02:56.000Z" objectID="{7D437D96-E14F-40FE-BF53-7178AFC803D3}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="129.6621246337891" height="40.28315734863281"/><one:OEChildren><one:OE creationTime="2026-09-08T18:02:56.000Z" lastModifiedTime="2026-09-08T18:02:56.000Z" objectID="{7D437D96-E14F-40FE-BF53-7178AFC803D3}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:56.000Z" collapsed="1" objectID="{7D437D96-E14F-40FE-BF53-7178AFC803D3}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | ||
| 4 | href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:02:56.000Z" lastModifiedTime="2026-09-08T18:02:56.000Z" objectID="{7D437D96-E14F-40FE-BF53-7178AFC803D3}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span | ||
| 5 | style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:02:56.000Z" lastModifiedTime="2026-09-08T18:02:56.000Z" objectID="{7D437D96-E14F-40FE-BF53-7178AFC803D3}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:02:56.000Z" lastModifiedTime="2026-09-08T18:02:56.000Z" objectID="{7D437D96-E14F-40FE-BF53-7178AFC803D3}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{7D437D96-E14F-40FE-BF53-7178AFC803D3}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{7D437D96-E14F-40FE-BF53-7178AFC803D3}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/reserved-width/cold/read/page-014.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{FDB5BC28-E89E-49DE-A1D4-D37631AEAD11}{1}{B0}" name="Automatic outline size" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:41:01.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{C000EB5C-52C9-4D85-9171-5A4E4EB380CB}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Automatic outline size]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:03:15.000Z" objectID="{C000EB5C-52C9-4D85-9171-5A4E4EB380CB}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="142.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T18:03:15.000Z" lastModifiedTime="2026-09-08T18:03:15.000Z" objectID="{C000EB5C-52C9-4D85-9171-5A4E4EB380CB}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:03:15.000Z" objectID="{C000EB5C-52C9-4D85-9171-5A4E4EB380CB}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | ||
| 4 | href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:03:15.000Z" lastModifiedTime="2026-09-08T18:03:15.000Z" objectID="{C000EB5C-52C9-4D85-9171-5A4E4EB380CB}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span | ||
| 5 | style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:03:15.000Z" lastModifiedTime="2026-09-08T18:03:15.000Z" objectID="{C000EB5C-52C9-4D85-9171-5A4E4EB380CB}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:03:15.000Z" lastModifiedTime="2026-09-08T18:03:15.000Z" objectID="{C000EB5C-52C9-4D85-9171-5A4E4EB380CB}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{C000EB5C-52C9-4D85-9171-5A4E4EB380CB}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{C000EB5C-52C9-4D85-9171-5A4E4EB380CB}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/outline-edit/reserved-width/cold/read/payloads.json created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | ../../../../paragraph-edit/before/read/payloads.json | ||
| \ No newline at end of file | |||
corpus/outline-edit/reserved-width/cold/run.json created+18| ... | @@ -0,0 +1,18 @@ | ||
| 1 | { | ||
| 2 | "notebook": "/Users/clo/dev/one/evidence/m10/outline-reserved-candidate-01", | ||
| 3 | "expected_pages": 15, | ||
| 4 | "author": null, | ||
| 5 | "author_timeout_seconds": 600, | ||
| 6 | "inspect": false, | ||
| 7 | "collect_notebook": true, | ||
| 8 | "base": { | ||
| 9 | "file": "win7-office-base.qcow2", | ||
| 10 | "format": "qcow2", | ||
| 11 | "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", | ||
| 12 | "virtual_size": 68719476736 | ||
| 13 | }, | ||
| 14 | "scripts": { | ||
| 15 | "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", | ||
| 16 | "read.ps1": "04013bfcccee40a17e2a225f9b9e96f40a3a8daad9e350609654f8eda3ccbb41" | ||
| 17 | } | ||
| 18 | } | ||
corpus/outline-edit/reserved-width/cold/scripts/cold.ps1 created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | ../../../../paragraph-edit/reconciliation/keyboard/scripts/cold.ps1 | ||
| \ No newline at end of file | |||
corpus/outline-edit/reserved-width/cold/scripts/read.ps1 created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | ../../../../paragraph-edit/reconciliation/keyboard/scripts/read.ps1 | ||
| \ No newline at end of file | |||
corpus/outline-edit/reserved-width/cold/source.json created+8| ... | @@ -0,0 +1,8 @@ | ||
| 1 | [ | ||
| 2 | { | ||
| 3 | "path": "synthetic.one", | ||
| 4 | "bytes": 134960, | ||
| 5 | "sha256": "824e9b8a1a521750417197047497f2f1c3dc4cbcb19269fb573da42a26174689", | ||
| 6 | "mtime_ns": 1788892773150136296 | ||
| 7 | } | ||
| 8 | ] | ||
corpus/outline-edit/reserved-width/cold/teardown.json created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | {"absent": true} | ||
crates/onestore/README.md+6| ... | @@ -52,6 +52,7 @@ harness also accepts `--client-profile release`. | ... | @@ -52,6 +52,7 @@ harness also accepts `--client-profile release`. |
| 52 | | `ParagraphSplit`, `PreparedEdit::split` | Split ordinary text at a UTF-16 scalar boundary, retaining the original left identities and moving children to the right | | 52 | | `ParagraphSplit`, `PreparedEdit::split` | Split ordinary text at a UTF-16 scalar boundary, retaining the original left identities and moving children to the right | |
| 53 | | `ParagraphJoin`, `PreparedEdit::join` | Join adjacent ordinary text while preserving inherited character styles and native text-identity rules | | 53 | | `ParagraphJoin`, `PreparedEdit::join` | Join adjacent ordinary text while preserving inherited character styles and native text-identity rules | |
| 54 | | `TextAttribute`, `PreparedEdit::format` | Change character formatting over a UTF-16 range while sharing immutable styles; preserve unselected runs | | 54 | | `TextAttribute`, `PreparedEdit::format` | Change character formatting over a UTF-16 range while sharing immutable styles; preserve unselected runs | |
| 55 | | `OutlineEdit`, `PreparedEdit::outline` | Change ordinary outline position/width or a paragraph's saved expansion default, preserving identities and content | | ||
| 55 | | `PreparedEdit::commit`, `PreparedEdit::commit_file` | Publish the exact prepared image under caller-held exclusion or the conservative filesystem adapter | | 56 | | `PreparedEdit::commit`, `PreparedEdit::commit_file` | Publish the exact prepared image under caller-held exclusion or the conservative filesystem adapter | |
| 56 | | `read_file` | Read a snapshot under whole-file exclusion | | 57 | | `read_file` | Read a snapshot under whole-file exclusion | |
| 57 | | `read_snapshot` | Read a validated snapshot through fresh positioned I/O while the caller excludes maintenance | | 58 | | `read_snapshot` | Read a validated snapshot through fresh positioned I/O while the caller excludes maintenance | |
| ... | @@ -79,6 +80,11 @@ accepts one `0..0` span for subsequent typing. Retain the `Insertion` value for | ... | @@ -79,6 +80,11 @@ accepts one `0..0` span for subsequent typing. Retain the `Insertion` value for |
| 79 | value creates different object identities. Duplicate insertion identities require | 80 | value creates different object identities. Duplicate insertion identities require |
| 80 | reconciliation. Formatting accepts explicit attributes, preserves inherited values, | 81 | reconciliation. Formatting accepts explicit attributes, preserves inherited values, |
| 81 | and gives retired immutable styles zero current references while retaining history. | 82 | and gives retired immutable styles zero current references while retaining history. |
| 83 | Outline layout edits use points. Width is at least 36 points; an explicit user width | ||
| 84 | and an automatic maximum-width hint remain distinct. Native layout generates the | ||
| 85 | rendered height. Saved paragraph collapse defaults can be overridden by the native | ||
| 86 | client's cached view. [Native layout captures](../../corpus/outline-edit/README.md) | ||
| 87 | verify these edits through a fresh OneNote cache, including fields and nested content. | ||
| 82 | Paragraph splits preserve character formatting, retain tags on the left, and clone | 88 | Paragraph splits preserve character formatting, retain tags on the left, and clone |
| 83 | mutable list objects without restarting numbering. The new right paragraph/text | 89 | mutable list objects without restarting numbering. The new right paragraph/text |
| 84 | identities belong to the retained `ParagraphSplit` intent. Its publication includes | 90 | identities belong to the retained `ParagraphSplit` intent. Its publication includes |
crates/onestore/src/commit.rs+13| ... | @@ -183,6 +183,19 @@ pub struct PreparedEdit<'a> { | ... | @@ -183,6 +183,19 @@ pub struct PreparedEdit<'a> { |
| 183 | } | 183 | } |
| 184 | 184 | ||
| 185 | impl<'a> PreparedEdit<'a> { | 185 | impl<'a> PreparedEdit<'a> { |
| 186 | /// Changes outline geometry or a paragraph's saved expansion state, preserving content. | ||
| 187 | pub fn outline( | ||
| 188 | source: &'a [u8], | ||
| 189 | space: ExGuid, | ||
| 190 | object: ExGuid, | ||
| 191 | edit: crate::OutlineEdit, | ||
| 192 | ) -> Result<Self, crate::Error> { | ||
| 193 | Ok(Self { | ||
| 194 | source, | ||
| 195 | written: edit.apply(source, space, object)?, | ||
| 196 | }) | ||
| 197 | } | ||
| 198 | |||
| 186 | /// Joins adjacent ordinary paragraphs with native left-tag and text-identity semantics. | 199 | /// Joins adjacent ordinary paragraphs with native left-tag and text-identity semantics. |
| 187 | pub fn join( | 200 | pub fn join( |
| 188 | source: &'a [u8], | 201 | source: &'a [u8], |
crates/onestore/src/document.rs+3| ... | @@ -66,6 +66,8 @@ pub struct Layout { | ... | @@ -66,6 +66,8 @@ pub struct Layout { |
| 66 | pub x: Option<f32>, | 66 | pub x: Option<f32>, |
| 67 | pub y: Option<f32>, | 67 | pub y: Option<f32>, |
| 68 | pub max_width: Option<f32>, | 68 | pub max_width: Option<f32>, |
| 69 | /// An explicit user width when true; false or absent leaves an automatic layout hint. | ||
| 70 | pub width_set_by_user: Option<bool>, | ||
| 69 | pub max_height: Option<f32>, | 71 | pub max_height: Option<f32>, |
| 70 | } | 72 | } |
| 71 | 73 | ||
| ... | @@ -822,6 +824,7 @@ impl<'a> Element<'a> { | ... | @@ -822,6 +824,7 @@ impl<'a> Element<'a> { |
| 822 | x: f.float(0x14001c14, 36.0)?, | 824 | x: f.float(0x14001c14, 36.0)?, |
| 823 | y: f.float(0x14001c15, 36.0)?, | 825 | y: f.float(0x14001c15, 36.0)?, |
| 824 | max_width: f.float(0x14001c1b, 36.0)?, | 826 | max_width: f.float(0x14001c1b, 36.0)?, |
| 827 | width_set_by_user: f.boolean(0x08001cbd)?, | ||
| 825 | max_height: f.float(0x14001c1c, 36.0)?, | 828 | max_height: f.float(0x14001c1c, 36.0)?, |
| 826 | }; | 829 | }; |
| 827 | let format = Format { | 830 | let format = Format { |
crates/onestore/src/lib.rs+2| ... | @@ -11,6 +11,7 @@ mod flush; | ... | @@ -11,6 +11,7 @@ mod flush; |
| 11 | mod formatting; | 11 | mod formatting; |
| 12 | mod insertion; | 12 | mod insertion; |
| 13 | mod objects; | 13 | mod objects; |
| 14 | mod outline; | ||
| 14 | mod paragraph; | 15 | mod paragraph; |
| 15 | mod properties; | 16 | mod properties; |
| 16 | #[cfg(feature = "protected")] | 17 | #[cfg(feature = "protected")] |
| ... | @@ -32,6 +33,7 @@ pub use files::FileDataReference; | ... | @@ -32,6 +33,7 @@ pub use files::FileDataReference; |
| 32 | pub use formatting::TextAttribute; | 33 | pub use formatting::TextAttribute; |
| 33 | pub use insertion::Insertion; | 34 | pub use insertion::Insertion; |
| 34 | pub use objects::{Object, ObjectData, ObjectReferences, ResolvedRevision}; | 35 | pub use objects::{Object, ObjectData, ObjectReferences, ResolvedRevision}; |
| 36 | pub use outline::OutlineEdit; | ||
| 35 | pub use paragraph::{ParagraphJoin, ParagraphSplit}; | 37 | pub use paragraph::{ParagraphJoin, ParagraphSplit}; |
| 36 | pub use properties::{IdStream, Property, PropertySets, Value}; | 38 | pub use properties::{IdStream, Property, PropertySets, Value}; |
| 37 | pub use revisions::{ExGuid, ObjectSpace, Revision, RevisionIndex}; | 39 | pub use revisions::{ExGuid, ObjectSpace, Revision, RevisionIndex}; |
crates/onestore/src/outline.rs created+197| ... | @@ -0,0 +1,197 @@ | ||
| 1 | use crate::{ | ||
| 2 | Error, ExGuid, RevisionIndex, Store, | ||
| 3 | create::current_timestamps, | ||
| 4 | document::{Document, Kind}, | ||
| 5 | edit::editable_parents, | ||
| 6 | write::{PropertyObject, write_revision}, | ||
| 7 | }; | ||
| 8 | use serde::{Deserialize, Serialize}; | ||
| 9 | use std::collections::{BTreeMap, BTreeSet}; | ||
| 10 | |||
| 11 | /// A layout or saved expansion change that preserves content and object identities. | ||
| 12 | #[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] | ||
| 13 | #[serde(deny_unknown_fields)] | ||
| 14 | pub enum OutlineEdit { | ||
| 15 | /// Moves an ordinary page outline to coordinates measured in points. | ||
| 16 | Position { x: f32, y: f32 }, | ||
| 17 | /// Changes an ordinary outline's maximum width in points, at least 36. | ||
| 18 | /// `user_set` distinguishes an explicit width from an automatic layout hint. | ||
| 19 | /// Height remains content-derived; any previous reserved wrapping width is cleared. | ||
| 20 | Width { points: f32, user_set: bool }, | ||
| 21 | /// Sets a paragraph's saved expansion default; native cache-local UI state can override it. | ||
| 22 | Collapsed(bool), | ||
| 23 | } | ||
| 24 | |||
| 25 | impl OutlineEdit { | ||
| 26 | pub(crate) fn apply( | ||
| 27 | self, | ||
| 28 | source: &[u8], | ||
| 29 | space: ExGuid, | ||
| 30 | object: ExGuid, | ||
| 31 | ) -> Result<Vec<u8>, Error> { | ||
| 32 | let invalid = |message| Error { offset: 0, message }; | ||
| 33 | let values = match self { | ||
| 34 | Self::Position { x, y } => { | ||
| 35 | if !x.is_finite() || !y.is_finite() { | ||
| 36 | return Err(invalid("Outline coordinates must be finite")); | ||
| 37 | } | ||
| 38 | vec![ | ||
| 39 | (0x14001c14, (x / 36.0).to_le_bytes().to_vec()), | ||
| 40 | (0x14001c15, (y / 36.0).to_le_bytes().to_vec()), | ||
| 41 | ] | ||
| 42 | } | ||
| 43 | Self::Width { points, user_set } => { | ||
| 44 | if !points.is_finite() || points < 36.0 { | ||
| 45 | return Err(invalid( | ||
| 46 | "Outline width must be finite and at least 36 points", | ||
| 47 | )); | ||
| 48 | } | ||
| 49 | vec![ | ||
| 50 | (0x14001c1b, (points / 36.0).to_le_bytes().to_vec()), | ||
| 51 | (0x08001cbd | (u32::from(user_set) << 31), Vec::new()), | ||
| 52 | ] | ||
| 53 | } | ||
| 54 | Self::Collapsed(value) => vec![(0x0c001c11, vec![u8::from(value)])], | ||
| 55 | }; | ||
| 56 | let store = Store::parse(source)?; | ||
| 57 | let index = RevisionIndex::parse(&store)?; | ||
| 58 | index.validate_current()?; | ||
| 59 | let document = Document::parse(&index)?; | ||
| 60 | let pages: Vec<_> = document | ||
| 61 | .pages()? | ||
| 62 | .into_iter() | ||
| 63 | .filter_map(|(sid, page)| (sid == space).then_some(page)) | ||
| 64 | .collect(); | ||
| 65 | let [page] = pages.as_slice() else { | ||
| 66 | return Err(invalid("Outline editing requires a single active page")); | ||
| 67 | }; | ||
| 68 | let semantic = &document.spaces[&space]; | ||
| 69 | let view = &semantic.revisions[&semantic.contexts[&ExGuid::default()]]; | ||
| 70 | let parents = editable_parents(view, &pages, object)?; | ||
| 71 | let node = &view.nodes[&object]; | ||
| 72 | match self { | ||
| 73 | Self::Collapsed(_) => { | ||
| 74 | if !matches!(node.kind, Kind::Paragraph { .. }) { | ||
| 75 | return Err(invalid("Select a paragraph for its saved expansion state")); | ||
| 76 | } | ||
| 77 | } | ||
| 78 | _ => { | ||
| 79 | if !matches!(node.kind, Kind::Outline { .. }) | ||
| 80 | || parents.get(&object).map(Vec::as_slice) != Some(pages.as_slice()) | ||
| 81 | || !view.nodes[page].children.contains(&object) | ||
| 82 | { | ||
| 83 | return Err(invalid("Select an ordinary outline directly on the page")); | ||
| 84 | } | ||
| 85 | } | ||
| 86 | } | ||
| 87 | let mut ancestors = BTreeSet::new(); | ||
| 88 | let mut pending = vec![object]; | ||
| 89 | while let Some(id) = pending.pop() { | ||
| 90 | if !ancestors.insert(id) { | ||
| 91 | return Err(invalid("Outline ancestry contains a cycle")); | ||
| 92 | } | ||
| 93 | if id != *page && parents.get(&id).is_none_or(|parents| parents.len() != 1) { | ||
| 94 | return Err(invalid("Outline content must have one active parent")); | ||
| 95 | } | ||
| 96 | if matches!(view.nodes[&id].kind, Kind::Title) | ||
| 97 | || view.nodes[&id].extra[0] | ||
| 98 | .iter() | ||
| 99 | .any(|field| matches!(field.id, 0x88001cb4 | 0x88001cf9 | 0x88001cb2)) | ||
| 100 | { | ||
| 101 | return Err(invalid( | ||
| 102 | "Title or protected outline content cannot be changed here", | ||
| 103 | )); | ||
| 104 | } | ||
| 105 | pending.extend(parents.get(&id).into_iter().flatten().copied()); | ||
| 106 | } | ||
| 107 | let modified = current_timestamps()?.0.to_le_bytes(); | ||
| 108 | write_revision(source, space, |raw| { | ||
| 109 | let mut target = PropertyObject::from_object(&raw.objects[&object])?; | ||
| 110 | target.set( | ||
| 111 | &values | ||
| 112 | .iter() | ||
| 113 | .map(|(id, data)| (*id, data.as_slice())) | ||
| 114 | .collect::<Vec<_>>(), | ||
| 115 | )?; | ||
| 116 | if matches!(self, Self::Width { .. }) { | ||
| 117 | target.remove(&[0x14001cdb])?; | ||
| 118 | } | ||
| 119 | if raw.objects[&object].data == crate::ObjectData::Properties(&target.bytes) { | ||
| 120 | return Ok(BTreeMap::new()); | ||
| 121 | } | ||
| 122 | target.set(&[(0x14001d7a, &modified)])?; | ||
| 123 | let mut changed = BTreeMap::from([(object, target)]); | ||
| 124 | for id in ancestors { | ||
| 125 | if id != object { | ||
| 126 | let mut ancestor = PropertyObject::from_object(&raw.objects[&id])?; | ||
| 127 | ancestor.set(&[(0x14001d7a, &modified)])?; | ||
| 128 | changed.insert(id, ancestor); | ||
| 129 | } | ||
| 130 | } | ||
| 131 | Ok(changed) | ||
| 132 | }) | ||
| 133 | } | ||
| 134 | } | ||
| 135 | |||
| 136 | #[cfg(test)] | ||
| 137 | mod tests { | ||
| 138 | use super::*; | ||
| 139 | |||
| 140 | #[test] | ||
| 141 | fn protection_on_the_target_or_ancestor_prevents_layout_edits() { | ||
| 142 | let source = crate::create_section("layout.one", "Text", "Author").unwrap(); | ||
| 143 | let store = Store::parse(&source).unwrap(); | ||
| 144 | let index = RevisionIndex::parse(&store).unwrap(); | ||
| 145 | let document = Document::parse(&index).unwrap(); | ||
| 146 | let (sid, page) = document.pages().unwrap()[0]; | ||
| 147 | let space = &document.spaces[&sid]; | ||
| 148 | let view = &space.revisions[&space.contexts[&ExGuid::default()]]; | ||
| 149 | let outline = *view.nodes[&page] | ||
| 150 | .children | ||
| 151 | .iter() | ||
| 152 | .find(|id| matches!(view.nodes[id].kind, Kind::Outline { .. })) | ||
| 153 | .unwrap(); | ||
| 154 | let paragraph = view.nodes[&outline].children[0]; | ||
| 155 | for target in [outline, page] { | ||
| 156 | for property in [0x08001cde, 0x08001cb4, 0x08001cf9, 0x08001cb2] { | ||
| 157 | for enabled in [false, true] { | ||
| 158 | let bytes = write_revision(&source, sid, |raw| { | ||
| 159 | let mut object = PropertyObject::from_object(&raw.objects[&target])?; | ||
| 160 | object.set(&[(property | (u32::from(enabled) << 31), &[])])?; | ||
| 161 | Ok(BTreeMap::from([(target, object)])) | ||
| 162 | }) | ||
| 163 | .unwrap(); | ||
| 164 | for (object, edit) in [ | ||
| 165 | (outline, OutlineEdit::Position { x: 72.0, y: 72.0 }), | ||
| 166 | ( | ||
| 167 | outline, | ||
| 168 | OutlineEdit::Width { | ||
| 169 | points: 144.0, | ||
| 170 | user_set: true, | ||
| 171 | }, | ||
| 172 | ), | ||
| 173 | (paragraph, OutlineEdit::Collapsed(true)), | ||
| 174 | ] { | ||
| 175 | assert_eq!( | ||
| 176 | edit.apply(&bytes, sid, object).is_err(), | ||
| 177 | enabled, | ||
| 178 | "{target} {property:x} {edit:?}" | ||
| 179 | ); | ||
| 180 | } | ||
| 181 | } | ||
| 182 | } | ||
| 183 | } | ||
| 184 | let duplicated = write_revision(&source, sid, |raw| { | ||
| 185 | let mut object = PropertyObject::from_object(&raw.objects[&outline])?; | ||
| 186 | let reference = object.reference(paragraph)?; | ||
| 187 | object.set(&[(0x24001c20, &reference.repeat(2))])?; | ||
| 188 | Ok(BTreeMap::from([(outline, object)])) | ||
| 189 | }) | ||
| 190 | .unwrap(); | ||
| 191 | assert!( | ||
| 192 | OutlineEdit::Collapsed(true) | ||
| 193 | .apply(&duplicated, sid, paragraph) | ||
| 194 | .is_err() | ||
| 195 | ); | ||
| 196 | } | ||
| 197 | } | ||
crates/onestore/tests/outline.rs created+428| ... | @@ -0,0 +1,428 @@ | ||
| 1 | use onestore::{ | ||
| 2 | ExGuid, OutlineEdit as Edit, PreparedEdit, RevisionIndex, Store, | ||
| 3 | document::{Document, Kind}, | ||
| 4 | }; | ||
| 5 | use std::collections::BTreeSet; | ||
| 6 | |||
| 7 | #[path = "support/current.rs"] | ||
| 8 | mod current; | ||
| 9 | #[path = "support/disk.rs"] | ||
| 10 | mod disk; | ||
| 11 | |||
| 12 | const SOURCE: &[u8] = include_bytes!("../../../corpus/outline-edit/before/notebook/synthetic.one"); | ||
| 13 | |||
| 14 | fn cases(document: &Document<'_>) -> Vec<(String, ExGuid, ExGuid, Edit)> { | ||
| 15 | let mut cases = Vec::new(); | ||
| 16 | for (sid, page) in document.pages().unwrap() { | ||
| 17 | let space = &document.spaces[&sid]; | ||
| 18 | let view = &space.revisions[&space.contexts[&ExGuid::default()]]; | ||
| 19 | let Kind::Metadata { | ||
| 20 | title: Some(name), .. | ||
| 21 | } = &view.nodes[&view.roots[&2]].kind | ||
| 22 | else { | ||
| 23 | panic!() | ||
| 24 | }; | ||
| 25 | let edit = match name.as_str() { | ||
| 26 | "Move outline" => Edit::Position { x: 180.0, y: 216.0 }, | ||
| 27 | "Resize outline" => Edit::Width { | ||
| 28 | points: 144.0, | ||
| 29 | user_set: true, | ||
| 30 | }, | ||
| 31 | "Automatic outline size" => Edit::Width { | ||
| 32 | points: 360.0, | ||
| 33 | user_set: false, | ||
| 34 | }, | ||
| 35 | "Collapse subtree" => Edit::Collapsed(true), | ||
| 36 | "Expand subtree" => Edit::Collapsed(false), | ||
| 37 | _ => continue, | ||
| 38 | }; | ||
| 39 | let mut object = *view.nodes[&page] | ||
| 40 | .children | ||
| 41 | .iter() | ||
| 42 | .find(|id| matches!(view.nodes[id].kind, Kind::Outline { .. })) | ||
| 43 | .unwrap(); | ||
| 44 | if matches!(edit, Edit::Collapsed(_)) { | ||
| 45 | object = *view.nodes[&object].children.iter().find(|id| { | ||
| 46 | view.nodes[id].content.first().is_some_and(|text| matches!( | ||
| 47 | &view.nodes[text].kind, Kind::RichText { text, .. } if text.starts_with("Target ") | ||
| 48 | )) | ||
| 49 | }).unwrap(); | ||
| 50 | } | ||
| 51 | cases.push((name.clone(), sid, object, edit)); | ||
| 52 | } | ||
| 53 | assert_eq!(cases.len(), 5); | ||
| 54 | cases | ||
| 55 | } | ||
| 56 | |||
| 57 | #[test] | ||
| 58 | fn geometry_and_expansion_preserve_unrelated_properties_objects_and_history() { | ||
| 59 | let store = Store::parse(SOURCE).unwrap(); | ||
| 60 | let index = RevisionIndex::parse(&store).unwrap(); | ||
| 61 | let document = Document::parse(&index).unwrap(); | ||
| 62 | for (name, sid, object, edit) in cases(&document) { | ||
| 63 | let restored = serde_json::from_value(serde_json::to_value(edit).unwrap()).unwrap(); | ||
| 64 | assert_eq!(edit, restored); | ||
| 65 | let prepared = PreparedEdit::outline(SOURCE, sid, object, restored).unwrap(); | ||
| 66 | let after_store = Store::parse(prepared.as_bytes()).unwrap(); | ||
| 67 | assert!(after_store.checksum_mismatches.is_empty()); | ||
| 68 | let after_index = RevisionIndex::parse(&after_store).unwrap(); | ||
| 69 | after_index.validate_current().unwrap(); | ||
| 70 | let after_document = Document::parse(&after_index).unwrap(); | ||
| 71 | let space = &document.spaces[&sid]; | ||
| 72 | let before = &space.revisions[&space.contexts[&ExGuid::default()]]; | ||
| 73 | let space = &after_document.spaces[&sid]; | ||
| 74 | let after = &space.revisions[&space.contexts[&ExGuid::default()]]; | ||
| 75 | let mut changed = BTreeSet::from([before.roots[&2]]); | ||
| 76 | let mut pending = vec![object]; | ||
| 77 | while let Some(id) = pending.pop() { | ||
| 78 | if !changed.insert(id) { | ||
| 79 | continue; | ||
| 80 | } | ||
| 81 | pending.extend(before.nodes.iter().filter_map(|(parent, node)| { | ||
| 82 | node.children | ||
| 83 | .iter() | ||
| 84 | .chain(&node.content) | ||
| 85 | .chain(&node.structure) | ||
| 86 | .any(|child| *child == id) | ||
| 87 | .then_some(*parent) | ||
| 88 | })); | ||
| 89 | } | ||
| 90 | assert_eq!( | ||
| 91 | before.nodes.keys().collect::<Vec<_>>(), | ||
| 92 | after.nodes.keys().collect::<Vec<_>>() | ||
| 93 | ); | ||
| 94 | for (id, node) in &before.nodes { | ||
| 95 | let mut expected = serde_json::to_value(node).unwrap(); | ||
| 96 | let actual = serde_json::to_value(&after.nodes[id]).unwrap(); | ||
| 97 | if changed.contains(id) { | ||
| 98 | expected["modified"] = actual["modified"].clone(); | ||
| 99 | } | ||
| 100 | if *id == object { | ||
| 101 | match edit { | ||
| 102 | Edit::Position { x, y } => { | ||
| 103 | expected["layout"]["x"] = x.into(); | ||
| 104 | expected["layout"]["y"] = y.into(); | ||
| 105 | } | ||
| 106 | Edit::Width { points, user_set } => { | ||
| 107 | expected["layout"]["max_width"] = points.into(); | ||
| 108 | expected["layout"]["width_set_by_user"] = user_set.into(); | ||
| 109 | let fields = expected["extra"][0].as_array_mut().unwrap(); | ||
| 110 | fields.retain(|field| field["id"].as_u64() != Some(0x14001cdb)); | ||
| 111 | } | ||
| 112 | Edit::Collapsed(value) => { | ||
| 113 | expected["kind"]["collapse_state"] = u8::from(value).into() | ||
| 114 | } | ||
| 115 | } | ||
| 116 | } | ||
| 117 | let mut actual = actual; | ||
| 118 | // Property order is not semantic; every property and nested value still compares exactly. | ||
| 119 | expected["extra"][0] | ||
| 120 | .as_array_mut() | ||
| 121 | .unwrap() | ||
| 122 | .sort_by_key(|field| field["id"].as_u64().unwrap()); | ||
| 123 | actual["extra"][0] | ||
| 124 | .as_array_mut() | ||
| 125 | .unwrap() | ||
| 126 | .sort_by_key(|field| field["id"].as_u64().unwrap()); | ||
| 127 | assert_eq!(actual, expected, "{name}: {id}"); | ||
| 128 | } | ||
| 129 | for (space_id, old_space) in &index.spaces { | ||
| 130 | for revision in old_space.revisions.keys() { | ||
| 131 | let old = index.resolve(*space_id, *revision).unwrap(); | ||
| 132 | let retained = after_index.resolve(*space_id, *revision).unwrap(); | ||
| 133 | assert_eq!(old.roots, retained.roots); | ||
| 134 | for (id, value) in old.objects { | ||
| 135 | assert_eq!(value.data, retained.objects[&id].data); | ||
| 136 | } | ||
| 137 | } | ||
| 138 | if *space_id != sid { | ||
| 139 | assert_eq!(old_space.labels, after_index.spaces[space_id].labels); | ||
| 140 | } | ||
| 141 | } | ||
| 142 | let again = PreparedEdit::outline(prepared.as_bytes(), sid, object, edit).unwrap(); | ||
| 143 | assert_eq!(again.as_bytes(), prepared.as_bytes()); | ||
| 144 | } | ||
| 145 | } | ||
| 146 | |||
| 147 | #[test] | ||
| 148 | fn invalid_geometry_and_non_outline_targets_are_rejected() { | ||
| 149 | let store = Store::parse(SOURCE).unwrap(); | ||
| 150 | let index = RevisionIndex::parse(&store).unwrap(); | ||
| 151 | let document = Document::parse(&index).unwrap(); | ||
| 152 | for (_, sid, object, _) in cases(&document) { | ||
| 153 | for value in [f32::NAN, f32::INFINITY, f32::NEG_INFINITY] { | ||
| 154 | for edit in [ | ||
| 155 | Edit::Position { x: value, y: 0.0 }, | ||
| 156 | Edit::Position { x: 0.0, y: value }, | ||
| 157 | Edit::Width { | ||
| 158 | points: value, | ||
| 159 | user_set: true, | ||
| 160 | }, | ||
| 161 | ] { | ||
| 162 | assert!(PreparedEdit::outline(SOURCE, sid, object, edit).is_err()); | ||
| 163 | } | ||
| 164 | } | ||
| 165 | for points in [-1.0, 0.0, 35.999] { | ||
| 166 | assert!( | ||
| 167 | PreparedEdit::outline( | ||
| 168 | SOURCE, | ||
| 169 | sid, | ||
| 170 | object, | ||
| 171 | Edit::Width { | ||
| 172 | points, | ||
| 173 | user_set: false | ||
| 174 | } | ||
| 175 | ) | ||
| 176 | .is_err() | ||
| 177 | ); | ||
| 178 | } | ||
| 179 | let space = &document.spaces[&sid]; | ||
| 180 | let view = &space.revisions[&space.contexts[&ExGuid::default()]]; | ||
| 181 | for (id, node) in &view.nodes { | ||
| 182 | if !matches!(node.kind, Kind::Outline { .. }) { | ||
| 183 | assert!( | ||
| 184 | PreparedEdit::outline(SOURCE, sid, *id, Edit::Position { x: 72.0, y: 72.0 }) | ||
| 185 | .is_err() | ||
| 186 | ); | ||
| 187 | } | ||
| 188 | if matches!(node.kind, Kind::Title) { | ||
| 189 | let mut descendants = node.children.clone(); | ||
| 190 | while let Some(child) = descendants.pop() { | ||
| 191 | descendants.extend(&view.nodes[&child].children); | ||
| 192 | for edit in [ | ||
| 193 | Edit::Position { x: 72.0, y: 72.0 }, | ||
| 194 | Edit::Width { | ||
| 195 | points: 144.0, | ||
| 196 | user_set: true, | ||
| 197 | }, | ||
| 198 | Edit::Collapsed(true), | ||
| 199 | ] { | ||
| 200 | assert!(PreparedEdit::outline(SOURCE, sid, child, edit).is_err()); | ||
| 201 | } | ||
| 202 | } | ||
| 203 | } | ||
| 204 | if !matches!(node.kind, Kind::Paragraph { .. }) { | ||
| 205 | assert!(PreparedEdit::outline(SOURCE, sid, *id, Edit::Collapsed(true)).is_err()); | ||
| 206 | } | ||
| 207 | } | ||
| 208 | assert!( | ||
| 209 | PreparedEdit::outline(SOURCE, ExGuid::default(), object, Edit::Collapsed(true)) | ||
| 210 | .is_err() | ||
| 211 | ); | ||
| 212 | assert!( | ||
| 213 | PreparedEdit::outline(SOURCE, sid, ExGuid::default(), Edit::Collapsed(true)).is_err() | ||
| 214 | ); | ||
| 215 | } | ||
| 216 | } | ||
| 217 | |||
| 218 | #[test] | ||
| 219 | fn resizing_a_native_reserved_width_preserves_content() { | ||
| 220 | let source = include_bytes!("../../../corpus/outline-edit/after/notebook/synthetic.one"); | ||
| 221 | let store = Store::parse(source).unwrap(); | ||
| 222 | let index = RevisionIndex::parse(&store).unwrap(); | ||
| 223 | let document = Document::parse(&index).unwrap(); | ||
| 224 | let (_, sid, object, _) = cases(&document) | ||
| 225 | .into_iter() | ||
| 226 | .find(|(name, ..)| name == "Move outline") | ||
| 227 | .unwrap(); | ||
| 228 | let space = &document.spaces[&sid]; | ||
| 229 | let before = &space.revisions[&space.contexts[&ExGuid::default()]]; | ||
| 230 | assert!( | ||
| 231 | before.nodes[&object].extra[0] | ||
| 232 | .iter() | ||
| 233 | .any(|p| p.id == 0x14001cdb) | ||
| 234 | ); | ||
| 235 | let edit = PreparedEdit::outline( | ||
| 236 | source, | ||
| 237 | sid, | ||
| 238 | object, | ||
| 239 | Edit::Width { | ||
| 240 | points: 144.0, | ||
| 241 | user_set: true, | ||
| 242 | }, | ||
| 243 | ) | ||
| 244 | .unwrap(); | ||
| 245 | let after_store = Store::parse(edit.as_bytes()).unwrap(); | ||
| 246 | let after_index = RevisionIndex::parse(&after_store).unwrap(); | ||
| 247 | let after_document = Document::parse(&after_index).unwrap(); | ||
| 248 | let space = &after_document.spaces[&sid]; | ||
| 249 | let after = &space.revisions[&space.contexts[&ExGuid::default()]]; | ||
| 250 | assert!( | ||
| 251 | !after.nodes[&object].extra[0] | ||
| 252 | .iter() | ||
| 253 | .any(|p| p.id == 0x14001cdb) | ||
| 254 | ); | ||
| 255 | assert_eq!(after.nodes[&object].layout.max_width, Some(144.0)); | ||
| 256 | for (id, node) in &before.nodes { | ||
| 257 | assert_eq!(node.children, after.nodes[id].children); | ||
| 258 | assert_eq!(node.content, after.nodes[id].content); | ||
| 259 | if matches!(node.kind, Kind::RichText { .. }) { | ||
| 260 | assert_eq!( | ||
| 261 | serde_json::to_value(node).unwrap(), | ||
| 262 | serde_json::to_value(&after.nodes[id]).unwrap() | ||
| 263 | ); | ||
| 264 | } | ||
| 265 | } | ||
| 266 | if let Some(output) = std::env::var_os("ONESTORE_RESERVED_WIDTH_OUTPUT") { | ||
| 267 | let output = std::path::PathBuf::from(output); | ||
| 268 | assert!(output.is_absolute()); | ||
| 269 | std::fs::create_dir(&output).unwrap(); | ||
| 270 | std::fs::write(output.join("synthetic.one"), edit.as_bytes()).unwrap(); | ||
| 271 | } | ||
| 272 | } | ||
| 273 | |||
| 274 | #[test] | ||
| 275 | fn outline_publication_interruptions_reopen_as_complete_old_or_new_layout() { | ||
| 276 | let source = onestore::create_section("layout.one", "Before 🦀 after", "Author").unwrap(); | ||
| 277 | let store = Store::parse(&source).unwrap(); | ||
| 278 | let index = RevisionIndex::parse(&store).unwrap(); | ||
| 279 | let document = Document::parse(&index).unwrap(); | ||
| 280 | let (sid, page) = document.pages().unwrap()[0]; | ||
| 281 | let space = &document.spaces[&sid]; | ||
| 282 | let view = &space.revisions[&space.contexts[&ExGuid::default()]]; | ||
| 283 | let outline = *view.nodes[&page] | ||
| 284 | .children | ||
| 285 | .iter() | ||
| 286 | .find(|id| matches!(view.nodes[id].kind, Kind::Outline { .. })) | ||
| 287 | .unwrap(); | ||
| 288 | let paragraph = view.nodes[&outline].children[0]; | ||
| 289 | for (object, operation) in [ | ||
| 290 | (outline, Edit::Position { x: 216.0, y: 72.0 }), | ||
| 291 | ( | ||
| 292 | outline, | ||
| 293 | Edit::Width { | ||
| 294 | points: 144.0, | ||
| 295 | user_set: true, | ||
| 296 | }, | ||
| 297 | ), | ||
| 298 | (paragraph, Edit::Collapsed(true)), | ||
| 299 | ] { | ||
| 300 | let edit = PreparedEdit::outline(&source, sid, object, operation).unwrap(); | ||
| 301 | let before = current::current(&source); | ||
| 302 | let after = current::current(edit.as_bytes()); | ||
| 303 | for write_limit in [17, 4096] { | ||
| 304 | let disk = |fail_at| disk::Disk { | ||
| 305 | visible: source.clone(), | ||
| 306 | durable: source.clone(), | ||
| 307 | operation: 0, | ||
| 308 | fail_at, | ||
| 309 | write_limit, | ||
| 310 | random: 1927, | ||
| 311 | }; | ||
| 312 | let mut success = disk(None); | ||
| 313 | edit.commit(&mut success).unwrap(); | ||
| 314 | assert_eq!(success.durable, edit.as_bytes()); | ||
| 315 | for at in 1..=success.operation { | ||
| 316 | let mut interrupted = disk(Some(at)); | ||
| 317 | let failure = edit.commit(&mut interrupted).unwrap_err(); | ||
| 318 | let actual = current::current(&interrupted.durable); | ||
| 319 | assert!( | ||
| 320 | actual == before || actual == after, | ||
| 321 | "{operation:?} operation {at}" | ||
| 322 | ); | ||
| 323 | if failure.state == onestore::CommitState::NotCommitted { | ||
| 324 | assert_eq!(actual, before); | ||
| 325 | } | ||
| 326 | } | ||
| 327 | } | ||
| 328 | } | ||
| 329 | } | ||
| 330 | |||
| 331 | #[test] | ||
| 332 | fn repeated_geometry_changes_and_expansion_match_an_independent_model() { | ||
| 333 | let original = onestore::create_section("layout.one", "Before 🦀 é\rafter", "Author").unwrap(); | ||
| 334 | let store = Store::parse(&original).unwrap(); | ||
| 335 | let index = RevisionIndex::parse(&store).unwrap(); | ||
| 336 | let document = Document::parse(&index).unwrap(); | ||
| 337 | let (sid, page) = document.pages().unwrap()[0]; | ||
| 338 | let space = &document.spaces[&sid]; | ||
| 339 | let view = &space.revisions[&space.contexts[&ExGuid::default()]]; | ||
| 340 | let outline = *view.nodes[&page] | ||
| 341 | .children | ||
| 342 | .iter() | ||
| 343 | .find(|id| matches!(view.nodes[id].kind, Kind::Outline { .. })) | ||
| 344 | .unwrap(); | ||
| 345 | let paragraph = view.nodes[&outline].children[0]; | ||
| 346 | let text = view.nodes[&paragraph].content[0]; | ||
| 347 | for seed in 1..=16_u64 { | ||
| 348 | let mut rng = seed; | ||
| 349 | let mut source = original.clone(); | ||
| 350 | let mut layout = serde_json::to_value(&view.nodes[&outline].layout).unwrap(); | ||
| 351 | let mut collapsed = None; | ||
| 352 | for step in 0..48 { | ||
| 353 | rng ^= rng << 13; | ||
| 354 | rng ^= rng >> 7; | ||
| 355 | rng ^= rng << 17; | ||
| 356 | let (object, edit) = match step % 3 { | ||
| 357 | 0 => { | ||
| 358 | let x = ((rng % 400) as f32 - 100.0) * 18.0; | ||
| 359 | let y = ((rng % 217) as f32 - 60.0) * 18.0; | ||
| 360 | layout["x"] = x.into(); | ||
| 361 | layout["y"] = y.into(); | ||
| 362 | (outline, Edit::Position { x, y }) | ||
| 363 | } | ||
| 364 | 1 => { | ||
| 365 | let points = (2 + rng % 86) as f32 * 18.0; | ||
| 366 | layout["max_width"] = points.into(); | ||
| 367 | layout["width_set_by_user"] = (rng & 1 != 0).into(); | ||
| 368 | ( | ||
| 369 | outline, | ||
| 370 | Edit::Width { | ||
| 371 | points, | ||
| 372 | user_set: rng & 1 != 0, | ||
| 373 | }, | ||
| 374 | ) | ||
| 375 | } | ||
| 376 | _ => { | ||
| 377 | collapsed = Some(u8::from(rng & 1 != 0)); | ||
| 378 | (paragraph, Edit::Collapsed(rng & 1 != 0)) | ||
| 379 | } | ||
| 380 | }; | ||
| 381 | source = PreparedEdit::outline(&source, sid, object, edit) | ||
| 382 | .unwrap() | ||
| 383 | .as_bytes() | ||
| 384 | .to_vec(); | ||
| 385 | let store = Store::parse(&source).unwrap(); | ||
| 386 | let index = RevisionIndex::parse(&store).unwrap(); | ||
| 387 | index.validate_current().unwrap(); | ||
| 388 | let document = Document::parse(&index).unwrap(); | ||
| 389 | let space = &document.spaces[&sid]; | ||
| 390 | let current = &space.revisions[&space.contexts[&ExGuid::default()]]; | ||
| 391 | assert_eq!( | ||
| 392 | serde_json::to_value(&current.nodes[&outline].layout).unwrap(), | ||
| 393 | layout | ||
| 394 | ); | ||
| 395 | let Kind::Paragraph { collapse_state, .. } = &current.nodes[&paragraph].kind else { | ||
| 396 | panic!() | ||
| 397 | }; | ||
| 398 | assert_eq!(*collapse_state, collapsed); | ||
| 399 | assert_eq!( | ||
| 400 | current.nodes[&outline].children, | ||
| 401 | view.nodes[&outline].children | ||
| 402 | ); | ||
| 403 | assert_eq!( | ||
| 404 | serde_json::to_value(&current.nodes[&text]).unwrap(), | ||
| 405 | serde_json::to_value(&view.nodes[&text]).unwrap() | ||
| 406 | ); | ||
| 407 | } | ||
| 408 | } | ||
| 409 | } | ||
| 410 | |||
| 411 | #[test] | ||
| 412 | #[ignore = "exports public-API outline candidates for cold native validation"] | ||
| 413 | fn export_native_outline_candidates() { | ||
| 414 | let output = std::path::PathBuf::from(std::env::var_os("ONESTORE_OUTLINE_OUTPUT").unwrap()); | ||
| 415 | assert!(output.is_absolute()); | ||
| 416 | std::fs::create_dir(&output).unwrap(); | ||
| 417 | let store = Store::parse(SOURCE).unwrap(); | ||
| 418 | let index = RevisionIndex::parse(&store).unwrap(); | ||
| 419 | let document = Document::parse(&index).unwrap(); | ||
| 420 | let mut bytes = SOURCE.to_vec(); | ||
| 421 | for (_, sid, object, edit) in cases(&document) { | ||
| 422 | bytes = PreparedEdit::outline(&bytes, sid, object, edit) | ||
| 423 | .unwrap() | ||
| 424 | .as_bytes() | ||
| 425 | .to_vec(); | ||
| 426 | } | ||
| 427 | std::fs::write(output.join("synthetic.one"), bytes).unwrap(); | ||
| 428 | } | ||
fuzz/fuzz_targets/paragraph.rs+54-3| ... | @@ -1,8 +1,8 @@ | ... | @@ -1,8 +1,8 @@ |
| 1 | #![no_main] | 1 | #![no_main] |
| 2 | use libfuzzer_sys::fuzz_target; | 2 | use libfuzzer_sys::fuzz_target; |
| 3 | use onestore::{ | 3 | use onestore::{ |
| 4 | CommitState, ExGuid, Insertion, ParagraphJoin, ParagraphSplit, PreparedEdit, RevisionIndex, | 4 | CommitState, ExGuid, Insertion, OutlineEdit, ParagraphJoin, ParagraphSplit, PreparedEdit, |
| 5 | Store, TextAttribute as A, | 5 | RevisionIndex, Store, TextAttribute as A, |
| 6 | document::{Document, Kind}, | 6 | document::{Document, Kind}, |
| 7 | }; | 7 | }; |
| 8 | use std::sync::LazyLock; | 8 | use std::sync::LazyLock; |
| ... | @@ -38,6 +38,11 @@ static SOURCE: LazyLock<(Vec<u8>, ExGuid, ExGuid)> = LazyLock::new(|| { | ... | @@ -38,6 +38,11 @@ static SOURCE: LazyLock<(Vec<u8>, ExGuid, ExGuid)> = LazyLock::new(|| { |
| 38 | 38 | ||
| 39 | fuzz_target!(|input: &[u8]| { | 39 | fuzz_target!(|input: &[u8]| { |
| 40 | let (source, sid, outline) = &*SOURCE; | 40 | let (source, sid, outline) = &*SOURCE; |
| 41 | if let Ok(operation) = serde_json::from_slice::<OutlineEdit>(input) | ||
| 42 | && let Ok(edit) = PreparedEdit::outline(source, *sid, *outline, operation) | ||
| 43 | { | ||
| 44 | current::current(edit.as_bytes()); | ||
| 45 | } | ||
| 41 | if let Ok(intent) = serde_json::from_slice::<ParagraphSplit>(input) | 46 | if let Ok(intent) = serde_json::from_slice::<ParagraphSplit>(input) |
| 42 | && let Ok(edit) = PreparedEdit::split(source, *sid, &intent) | 47 | && let Ok(edit) = PreparedEdit::split(source, *sid, &intent) |
| 43 | { | 48 | { |
| ... | @@ -94,7 +99,41 @@ fuzz_target!(|input: &[u8]| { | ... | @@ -94,7 +99,41 @@ fuzz_target!(|input: &[u8]| { |
| 94 | .collect(); | 99 | .collect(); |
| 95 | let mut expected_text = Vec::new(); | 100 | let mut expected_text = Vec::new(); |
| 96 | let mut expected_graph = Vec::new(); | 101 | let mut expected_graph = Vec::new(); |
| 97 | let edit = if step[1] & 8 != 0 && !pairs.is_empty() { | 102 | let mut expected_layout = None; |
| 103 | let mut expected_collapse = None; | ||
| 104 | let edit = if step[1] & 16 != 0 { | ||
| 105 | let mut layout = serde_json::to_value(&view.nodes[outline].layout).unwrap(); | ||
| 106 | let (object, operation) = match (step[1] >> 5) % 3 { | ||
| 107 | 0 => { | ||
| 108 | let x = (f32::from(step[2]) - 64.0) * 18.0; | ||
| 109 | let y = f32::from(step[3]) * 18.0; | ||
| 110 | layout["x"] = x.into(); | ||
| 111 | layout["y"] = y.into(); | ||
| 112 | (*outline, OutlineEdit::Position { x, y }) | ||
| 113 | } | ||
| 114 | 1 => { | ||
| 115 | let points = (2.0 + f32::from(step[2])) * 18.0; | ||
| 116 | let user_set = step[3] & 1 != 0; | ||
| 117 | layout["max_width"] = points.into(); | ||
| 118 | layout["width_set_by_user"] = user_set.into(); | ||
| 119 | (*outline, OutlineEdit::Width { points, user_set }) | ||
| 120 | } | ||
| 121 | _ => { | ||
| 122 | let paragraph = paragraphs[usize::from(step[2]) % paragraphs.len()]; | ||
| 123 | let collapsed = step[3] & 1 != 0; | ||
| 124 | expected_collapse = Some((paragraph, collapsed)); | ||
| 125 | (paragraph, OutlineEdit::Collapsed(collapsed)) | ||
| 126 | } | ||
| 127 | }; | ||
| 128 | expected_layout = Some(layout); | ||
| 129 | for (id, node) in &view.nodes { | ||
| 130 | expected_graph.push((*id, node.children.clone(), node.content.clone())); | ||
| 131 | if matches!(node.kind, Kind::RichText { .. }) { | ||
| 132 | expected_text.push((*id, characters(view, *id))); | ||
| 133 | } | ||
| 134 | } | ||
| 135 | PreparedEdit::outline(source, *sid, object, operation).unwrap() | ||
| 136 | } else if step[1] & 8 != 0 && !pairs.is_empty() { | ||
| 98 | let (parent, left, right) = pairs[usize::from(step[2]) % pairs.len()]; | 137 | let (parent, left, right) = pairs[usize::from(step[2]) % pairs.len()]; |
| 99 | let a = view.nodes[&left].content[0]; | 138 | let a = view.nodes[&left].content[0]; |
| 100 | let b = view.nodes[&right].content[0]; | 139 | let b = view.nodes[&right].content[0]; |
| ... | @@ -148,6 +187,18 @@ fuzz_target!(|input: &[u8]| { | ... | @@ -148,6 +187,18 @@ fuzz_target!(|input: &[u8]| { |
| 148 | let after_document = Document::parse(&after_index).unwrap(); | 187 | let after_document = Document::parse(&after_index).unwrap(); |
| 149 | let space = &after_document.spaces[sid]; | 188 | let space = &after_document.spaces[sid]; |
| 150 | let after_view = &space.revisions[&space.contexts[&ExGuid::default()]]; | 189 | let after_view = &space.revisions[&space.contexts[&ExGuid::default()]]; |
| 190 | if let Some(expected) = expected_layout { | ||
| 191 | assert_eq!( | ||
| 192 | serde_json::to_value(&after_view.nodes[outline].layout).unwrap(), | ||
| 193 | expected | ||
| 194 | ); | ||
| 195 | } | ||
| 196 | if let Some((id, expected)) = expected_collapse { | ||
| 197 | let Kind::Paragraph { collapse_state, .. } = after_view.nodes[&id].kind else { | ||
| 198 | panic!() | ||
| 199 | }; | ||
| 200 | assert_eq!(collapse_state, Some(u8::from(expected))); | ||
| 201 | } | ||
| 151 | for (id, expected) in expected_text { | 202 | for (id, expected) in expected_text { |
| 152 | assert_eq!(characters(after_view, id), expected); | 203 | assert_eq!(characters(after_view, id), expected); |
| 153 | } | 204 | } |
tools/test_outline_edit.py+70-2| ... | @@ -17,6 +17,75 @@ compare = runpy.run_path(str(ROOT / 'tools/verify-document.py'))['compare'] | ... | @@ -17,6 +17,75 @@ compare = runpy.run_path(str(ROOT / 'tools/verify-document.py'))['compare'] |
| 17 | 17 | ||
| 18 | 18 | ||
| 19 | class OutlineEditTest(unittest.TestCase): | 19 | class OutlineEditTest(unittest.TestCase): |
| 20 | def cold_layout(self, fixture): | ||
| 21 | models = {} | ||
| 22 | with TemporaryDirectory() as temporary: | ||
| 23 | for phase, notebook in [('candidate', fixture / 'candidate'), ('cold', fixture / 'cold/notebook')]: | ||
| 24 | folder = Path(temporary) / phase | ||
| 25 | shutil.copytree(fixture / 'cold/read', folder / 'read') | ||
| 26 | compare(notebook, folder / 'read') | ||
| 27 | subprocess.run([EXPORTER, notebook / 'synthetic.one', folder / 'model'], check=True) | ||
| 28 | model = json.loads((folder / 'model/document.json').read_text()) | ||
| 29 | models[phase] = {r['nodes'][r['roots']['2']]['kind']['title']: (r, page) | ||
| 30 | for _, _, r, page in ordered_pages(model)} | ||
| 31 | captures = {page.get('name'): page for path in (fixture / 'cold/read').glob('page-*.xml') | ||
| 32 | for page in [ET.parse(path).getroot()]} | ||
| 33 | self.assertEqual(len(models['candidate']), 15) | ||
| 34 | self.assertEqual(models['candidate'].keys(), models['cold'].keys()) | ||
| 35 | for name, (old, page) in models['candidate'].items(): | ||
| 36 | new, saved_page = models['cold'][name] | ||
| 37 | self.assertEqual(page, saved_page) | ||
| 38 | for oid, node in walk(old, page): | ||
| 39 | actual = new['nodes'][oid] | ||
| 40 | for key in ('children', 'content', 'structure', 'child_level'): | ||
| 41 | self.assertEqual(actual[key], node[key], (name, oid, key)) | ||
| 42 | self.assertEqual(actual['kind'].get('collapse_state'), node['kind'].get('collapse_state')) | ||
| 43 | if node['kind']['type'] == 'RichText': | ||
| 44 | self.assertEqual(actual['kind'], node['kind']) | ||
| 45 | return models, captures | ||
| 46 | |||
| 47 | def test_rust_layout_and_saved_expansion_survive_cold_native_reopen(self): | ||
| 48 | models, captures = self.cold_layout(FIXTURE / 'layout') | ||
| 49 | cases = json.loads((FIXTURE / 'cases.json').read_text(encoding='utf-8-sig')) | ||
| 50 | selected = [case for case in cases if any(key in case for key in ('position', 'size', 'collapse'))] | ||
| 51 | self.assertEqual(len(selected), 5) | ||
| 52 | for case in selected: | ||
| 53 | name = case['name'] | ||
| 54 | old, page = models['candidate'][name] | ||
| 55 | saved, _ = models['cold'][name] | ||
| 56 | oid = next(oid for oid in old['nodes'][page]['children'] if old['nodes'][oid]['kind']['type'] == 'Outline') | ||
| 57 | node = saved['nodes'][oid] | ||
| 58 | z = old['nodes'][page]['children'].index(oid) | ||
| 59 | native = next(outline for outline in captures[name].findall('one:Outline', ns) | ||
| 60 | if int(outline.find('one:Position', ns).get('z')) == z) | ||
| 61 | for key, value in case.get('position', {}).items(): | ||
| 62 | self.assertEqual(node['layout'][key], value) | ||
| 63 | if 'size' in case: | ||
| 64 | size = native.find('one:Size', ns) | ||
| 65 | self.assertEqual(node['layout']['max_width'], case['size']['width']) | ||
| 66 | self.assertEqual(size.get('isSetByUser') in ('true', '1'), case['size']['isSetByUser']) | ||
| 67 | if case['size']['isSetByUser']: | ||
| 68 | self.assertAlmostEqual(float(size.get('width')), case['size']['width'], places=3) | ||
| 69 | if 'collapse' in case: | ||
| 70 | target, = [p for p in native.findall('.//one:OE', ns) if p.find('one:T', ns) is not None | ||
| 71 | and ''.join(Text(p.find('one:T', ns).text or '').parts).startswith('Target ')] | ||
| 72 | self.assertEqual(target.get('collapsed') in ('true', '1'), case['collapse']) | ||
| 73 | |||
| 74 | def test_rust_width_replaces_native_reserved_wrap_width(self): | ||
| 75 | models, captures = self.cold_layout(FIXTURE / 'reserved-width') | ||
| 76 | saved, page = models['cold']['Move outline'] | ||
| 77 | oid = next(oid for oid in saved['nodes'][page]['children'] if saved['nodes'][oid]['kind']['type'] == 'Outline') | ||
| 78 | node = saved['nodes'][oid] | ||
| 79 | self.assertEqual(node['layout']['max_width'], 144) | ||
| 80 | self.assertTrue(node['layout']['width_set_by_user']) | ||
| 81 | self.assertFalse(any(field['id'] == 0x14001cdb for field in node['extra'][0])) | ||
| 82 | z = saved['nodes'][page]['children'].index(oid) | ||
| 83 | native = next(outline for outline in captures['Move outline'].findall('one:Outline', ns) | ||
| 84 | if int(outline.find('one:Position', ns).get('z')) == z) | ||
| 85 | size = native.find('one:Size', ns) | ||
| 86 | self.assertEqual(size.get('isSetByUser'), 'true') | ||
| 87 | self.assertAlmostEqual(float(size.get('width')), 144, places=3) | ||
| 88 | |||
| 20 | def preserved_node(self, old, new): | 89 | def preserved_node(self, old, new): |
| 21 | expected = dict(old) | 90 | expected = dict(old) |
| 22 | if old['modified'] != new['modified']: | 91 | if old['modified'] != new['modified']: |
| ... | @@ -101,8 +170,7 @@ class OutlineEditTest(unittest.TestCase): | ... | @@ -101,8 +170,7 @@ class OutlineEditTest(unittest.TestCase): |
| 101 | self.assertEqual(geometry[key], value) | 170 | self.assertEqual(geometry[key], value) |
| 102 | if 'size' in case: | 171 | if 'size' in case: |
| 103 | self.assertEqual(geometry['max_width'], case['size']['width']) | 172 | self.assertEqual(geometry['max_width'], case['size']['width']) |
| 104 | fields = {field['id'] for field in new['nodes'][outline]['extra'][0]} | 173 | self.assertEqual(geometry['width_set_by_user'], case['size']['isSetByUser']) |
| 105 | self.assertEqual(0x88001cbd in fields, case['size']['isSetByUser']) | ||
| 106 | if 'collapse' in case: | 174 | if 'collapse' in case: |
| 107 | self.assertEqual(bool(new['nodes'][target]['kind']['collapse_state']), case['collapse']) | 175 | self.assertEqual(bool(new['nodes'][target]['kind']['collapse_state']), case['collapse']) |
| 108 | node, = [node for node in captures[phase][name].findall('one:Outline//one:OE', ns) | 176 | node, = [node for node in captures[phase][name].findall('one:Outline//one:OE', ns) |