diff --git a/.golden/paginatedParagraphLayout/loremIpsum20em.golden b/.golden/paginatedParagraphLayout/loremIpsum20em.golden
--- a/.golden/paginatedParagraphLayout/loremIpsum20em.golden
+++ b/.golden/paginatedParagraphLayout/loremIpsum20em.golden
@@ -8,6 +8,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -58,6 +59,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -114,6 +116,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19791, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19791, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -169,6 +172,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17562, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17562, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -217,6 +221,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 18769, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 18769, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -272,6 +277,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 19226, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 19226, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -323,6 +329,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 17973, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 17973, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -375,6 +382,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 18971, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 18971, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -437,6 +445,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 17239, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 17239, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -485,6 +494,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 19199, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 19199, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -538,6 +548,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 12076, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 12076, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
diff --git a/.golden/paginatedParagraphLayout/spannedArabicFiller20em.golden b/.golden/paginatedParagraphLayout/spannedArabicFiller20em.golden
--- a/.golden/paginatedParagraphLayout/spannedArabicFiller20em.golden
+++ b/.golden/paginatedParagraphLayout/spannedArabicFiller20em.golden
@@ -8,6 +8,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 12652, y_origin = 0, x_size = 7198, y_size = -1500}
             , fragmentRect = Rect {x_origin = 12652, y_origin = 0, x_size = 7198, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -40,6 +41,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 7060, y_origin = 0, x_size = 5592, y_size = -1500}
             , fragmentRect = Rect {x_origin = 7060, y_origin = 0, x_size = 5592, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -65,6 +67,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 7060, y_size = -1500}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 7060, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -98,6 +101,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 14850, y_origin = -1500, x_size = 4045, y_size = -1500}
             , fragmentRect = Rect {x_origin = 14850, y_origin = -1500, x_size = 4045, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -122,6 +126,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 9168, y_origin = -1500, x_size = 5682, y_size = -1500}
             , fragmentRect = Rect {x_origin = 9168, y_origin = -1500, x_size = 5682, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -152,6 +157,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 3213, y_origin = -1500, x_size = 5955, y_size = -1500}
             , fragmentRect = Rect {x_origin = 3213, y_origin = -1500, x_size = 5955, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -182,6 +188,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 3213, y_size = -1500}
             , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 3213, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -242,6 +249,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 14300, y_origin = 0, x_size = 4862, y_size = -1500}
             , fragmentRect = Rect {x_origin = 14300, y_origin = 0, x_size = 4862, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -269,6 +277,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 10225, y_origin = 0, x_size = 4075, y_size = -1500}
             , fragmentRect = Rect {x_origin = 10225, y_origin = 0, x_size = 4075, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -292,6 +301,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 3898, y_origin = 0, x_size = 6327, y_size = -1500}
             , fragmentRect = Rect {x_origin = 3898, y_origin = 0, x_size = 6327, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -322,6 +332,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3898, y_size = -1500}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3898, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -341,6 +352,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 12238, y_origin = -1500, x_size = 2357, y_size = -1500}
             , fragmentRect = Rect {x_origin = 12238, y_origin = -1500, x_size = 2357, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -361,6 +373,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 5880, y_origin = -1500, x_size = 6358, y_size = -1500}
             , fragmentRect = Rect {x_origin = 5880, y_origin = -1500, x_size = 6358, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -392,6 +405,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 5880, y_size = -1500}
             , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 5880, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
diff --git a/.golden/paginatedRichParagraphLayout/loremIpsum20em.golden b/.golden/paginatedRichParagraphLayout/loremIpsum20em.golden
--- a/.golden/paginatedRichParagraphLayout/loremIpsum20em.golden
+++ b/.golden/paginatedRichParagraphLayout/loremIpsum20em.golden
@@ -6,6 +6,7 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -55,6 +56,7 @@
             , fragmentLine = 2
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -109,6 +111,7 @@
             , fragmentLine = 3
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19791, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19791, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -163,6 +166,7 @@
             , fragmentLine = 4
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17562, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17562, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -210,6 +214,7 @@
             , fragmentLine = 5
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 18769, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 18769, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -264,6 +269,7 @@
             , fragmentLine = 6
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 19226, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 19226, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -314,6 +320,7 @@
             , fragmentLine = 7
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 17973, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 17973, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -365,6 +372,7 @@
             , fragmentLine = 8
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 18971, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 18971, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -425,6 +433,7 @@
             , fragmentLine = 9
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 17239, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 17239, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -472,6 +481,7 @@
             , fragmentLine = 10
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 19199, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 19199, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -524,6 +534,7 @@
             , fragmentLine = 11
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 12076, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 12076, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
diff --git a/.golden/paragraphLayout/arabicFiller20em.golden b/.golden/paragraphLayout/arabicFiller20em.golden
--- a/.golden/paragraphLayout/arabicFiller20em.golden
+++ b/.golden/paragraphLayout/arabicFiller20em.golden
@@ -8,6 +8,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19850, y_size = -1500}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19850, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -67,6 +68,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 18895, y_size = -1500}
             , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 18895, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -129,6 +131,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 19162, y_size = -1500}
             , fragmentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 19162, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -186,6 +189,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 14595, y_size = -1500}
             , fragmentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 14595, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
diff --git a/.golden/paragraphLayout/arabicHelloParagraphUltraNarrow.golden b/.golden/paragraphLayout/arabicHelloParagraphUltraNarrow.golden
new file mode 100644
--- /dev/null
+++ b/.golden/paragraphLayout/arabicHelloParagraphUltraNarrow.golden
@@ -0,0 +1,183 @@
+ParagraphLayout
+    { paragraphRect = Rect {x_origin = -727, y_origin = 0, x_size = 827, y_size = -19500}
+    , spanLayouts = [
+        SpanLayout
+        [ Fragment
+            { fragmentUserData = ()
+            , fragmentLine = 1
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
+                ]
+            , fragmentContentRect = Rect {x_origin = -124, y_origin = 0, x_size = 224, y_size = -1500}
+            , fragmentRect = Rect {x_origin = -124, y_origin = 0, x_size = 224, y_size = -1500}
+            , fragmentPen = (0, -1085)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 302, cluster = 5, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 224, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = ()
+            , fragmentLine = 2
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
+                ]
+            , fragmentContentRect = Rect {x_origin = -169, y_origin = -1500, x_size = 269, y_size = -1500}
+            , fragmentRect = Rect {x_origin = -169, y_origin = -1500, x_size = 269, y_size = -1500}
+            , fragmentPen = (0, -1085)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 477, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 269, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = ()
+            , fragmentLine = 3
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
+                ]
+            , fragmentContentRect = Rect {x_origin = -727, y_origin = -3000, x_size = 827, y_size = -1500}
+            , fragmentRect = Rect {x_origin = -727, y_origin = -3000, x_size = 827, y_size = -1500}
+            , fragmentPen = (0, -1085)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 1665, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 303, y_offset = -40})
+                , (GlyphInfo {codepoint = 359, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 827, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = ()
+            , fragmentLine = 4
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
+                ]
+            , fragmentContentRect = Rect {x_origin = -214, y_origin = -4500, x_size = 314, y_size = -1500}
+            , fragmentRect = Rect {x_origin = -214, y_origin = -4500, x_size = 314, y_size = -1500}
+            , fragmentPen = (0, -1085)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 1588, cluster = 15, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 26, y_offset = 451})
+                , (GlyphInfo {codepoint = 381, cluster = 15, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 314, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = ()
+            , fragmentLine = 5
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
+                ]
+            , fragmentContentRect = Rect {x_origin = -170, y_origin = -6000, x_size = 270, y_size = -1500}
+            , fragmentRect = Rect {x_origin = -170, y_origin = -6000, x_size = 270, y_size = -1500}
+            , fragmentPen = (0, -1085)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 293, cluster = 19, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 270, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = ()
+            , fragmentLine = 6
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
+                ]
+            , fragmentContentRect = Rect {x_origin = -455, y_origin = -7500, x_size = 555, y_size = -1500}
+            , fragmentRect = Rect {x_origin = -455, y_origin = -7500, x_size = 555, y_size = -1500}
+            , fragmentPen = (0, -1085)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 1641, cluster = 21, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 185, y_offset = 120})
+                , (GlyphInfo {codepoint = 906, cluster = 21, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 555, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = ()
+            , fragmentLine = 7
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
+                ]
+            , fragmentContentRect = Rect {x_origin = -379, y_origin = -9000, x_size = 479, y_size = -1500}
+            , fragmentRect = Rect {x_origin = -379, y_origin = -9000, x_size = 479, y_size = -1500}
+            , fragmentPen = (0, -1085)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 1588, cluster = 26, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 99, y_offset = 170})
+                , (GlyphInfo {codepoint = 770, cluster = 26, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 479, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = ()
+            , fragmentLine = 8
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
+                ]
+            , fragmentContentRect = Rect {x_origin = -214, y_origin = -10500, x_size = 314, y_size = -1500}
+            , fragmentRect = Rect {x_origin = -214, y_origin = -10500, x_size = 314, y_size = -1500}
+            , fragmentPen = (0, -1085)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 1588, cluster = 30, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 26, y_offset = 451})
+                , (GlyphInfo {codepoint = 381, cluster = 30, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 314, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = ()
+            , fragmentLine = 9
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
+                ]
+            , fragmentContentRect = Rect {x_origin = -210, y_origin = -12000, x_size = 310, y_size = -1500}
+            , fragmentRect = Rect {x_origin = -210, y_origin = -12000, x_size = 310, y_size = -1500}
+            , fragmentPen = (0, -1085)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 1563, cluster = 34, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 42, y_offset = 40})
+                , (GlyphInfo {codepoint = 336, cluster = 34, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 310, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = ()
+            , fragmentLine = 10
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
+                ]
+            , fragmentContentRect = Rect {x_origin = -352, y_origin = -13500, x_size = 452, y_size = -1500}
+            , fragmentRect = Rect {x_origin = -352, y_origin = -13500, x_size = 452, y_size = -1500}
+            , fragmentPen = (0, -1085)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 1641, cluster = 38, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 4, y_offset = 379})
+                , (GlyphInfo {codepoint = 840, cluster = 38, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = ()
+            , fragmentLine = 11
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
+                ]
+            , fragmentContentRect = Rect {x_origin = -424, y_origin = -15000, x_size = 524, y_size = -1500}
+            , fragmentRect = Rect {x_origin = -424, y_origin = -15000, x_size = 524, y_size = -1500}
+            , fragmentPen = (0, -1085)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 1588, cluster = 42, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 131, y_offset = 80})
+                , (GlyphInfo {codepoint = 916, cluster = 42, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 524, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = ()
+            , fragmentLine = 12
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
+                ]
+            , fragmentContentRect = Rect {x_origin = -170, y_origin = -16500, x_size = 270, y_size = -1500}
+            , fragmentRect = Rect {x_origin = -170, y_origin = -16500, x_size = 270, y_size = -1500}
+            , fragmentPen = (0, -1085)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 293, cluster = 46, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 270, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = ()
+            , fragmentLine = 13
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
+                ]
+            , fragmentContentRect = Rect {x_origin = -184, y_origin = -18000, x_size = 284, y_size = -1500}
+            , fragmentRect = Rect {x_origin = -184, y_origin = -18000, x_size = 284, y_size = -1500}
+            , fragmentPen = (0, -1085)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 108, cluster = 48, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 284, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        ]
+    ]}
diff --git a/.golden/paragraphLayout/czechHello.golden b/.golden/paragraphLayout/czechHello.golden
--- a/.golden/paragraphLayout/czechHello.golden
+++ b/.golden/paragraphLayout/czechHello.golden
@@ -8,6 +8,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 5274, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 5274, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
diff --git a/.golden/paragraphLayout/czechHelloParagraphNarrow.golden b/.golden/paragraphLayout/czechHelloParagraphNarrow.golden
--- a/.golden/paragraphLayout/czechHelloParagraphNarrow.golden
+++ b/.golden/paragraphLayout/czechHelloParagraphNarrow.golden
@@ -8,6 +8,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1234, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1234, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -21,6 +22,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1089, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1089, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -35,6 +37,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 948, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 948, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -48,6 +51,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 961, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 961, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -61,6 +65,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 835, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 835, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
diff --git a/.golden/paragraphLayout/czechHelloParagraphUltraNarrow.golden b/.golden/paragraphLayout/czechHelloParagraphUltraNarrow.golden
--- a/.golden/paragraphLayout/czechHelloParagraphUltraNarrow.golden
+++ b/.golden/paragraphLayout/czechHelloParagraphUltraNarrow.golden
@@ -8,6 +8,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 663, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 663, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -20,6 +21,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 571, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 571, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -32,6 +34,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 590, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 590, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -44,6 +47,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 253, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 253, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -56,6 +60,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 246, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 246, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -68,6 +73,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 446, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 446, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -80,6 +86,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 502, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 502, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -92,6 +99,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 559, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 559, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -104,6 +112,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 402, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 402, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -116,6 +125,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 559, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 559, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -128,6 +138,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 276, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 276, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
diff --git a/.golden/paragraphLayout/devanagari.golden b/.golden/paragraphLayout/devanagari.golden
--- a/.golden/paragraphLayout/devanagari.golden
+++ b/.golden/paragraphLayout/devanagari.golden
@@ -8,6 +8,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 8640, y_size = -1630}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 8640, y_size = -1630}
             , fragmentPen = (0, -1171)
             , fragmentGlyphs =
diff --git a/.golden/paragraphLayout/devanagariAccent.golden b/.golden/paragraphLayout/devanagariAccent.golden
--- a/.golden/paragraphLayout/devanagariAccent.golden
+++ b/.golden/paragraphLayout/devanagariAccent.golden
@@ -8,6 +8,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 645, y_size = -1630}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 645, y_size = -1630}
             , fragmentPen = (0, -1171)
             , fragmentGlyphs =
diff --git a/.golden/paragraphLayout/devanagariPrefixedAccent.golden b/.golden/paragraphLayout/devanagariPrefixedAccent.golden
--- a/.golden/paragraphLayout/devanagariPrefixedAccent.golden
+++ b/.golden/paragraphLayout/devanagariPrefixedAccent.golden
@@ -8,6 +8,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 0, y_size = -1630}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 0, y_size = -1630}
             , fragmentPen = (0, -1171)
             , fragmentGlyphs =
diff --git a/.golden/paragraphLayout/hardBreaksLTR.golden b/.golden/paragraphLayout/hardBreaksLTR.golden
--- a/.golden/paragraphLayout/hardBreaksLTR.golden
+++ b/.golden/paragraphLayout/hardBreaksLTR.golden
@@ -8,6 +8,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1563, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1563, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -25,6 +26,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 3357, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 3357, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -49,6 +51,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1563, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1563, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -66,6 +69,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 4305, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 4305, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -82,6 +86,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 861, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 861, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -94,6 +99,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 1563, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 1563, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -111,6 +117,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 0, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 0, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -122,6 +129,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 3675, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 3675, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -138,6 +146,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 1722, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 1722, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
diff --git a/.golden/paragraphLayout/hardBreaksRTL.golden b/.golden/paragraphLayout/hardBreaksRTL.golden
--- a/.golden/paragraphLayout/hardBreaksRTL.golden
+++ b/.golden/paragraphLayout/hardBreaksRTL.golden
@@ -8,6 +8,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2808, y_size = -1500}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2808, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -25,6 +26,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 5852, y_size = -1500}
             , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 5852, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -49,6 +51,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 2808, y_size = -1500}
             , fragmentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 2808, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -66,6 +69,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 4884, y_size = -1500}
             , fragmentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 4884, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -83,6 +87,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -6000, x_size = 1211, y_size = -1500}
             , fragmentRect = Rect {x_origin = 0, y_origin = -6000, x_size = 1211, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -95,6 +100,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -7500, x_size = 2808, y_size = -1500}
             , fragmentRect = Rect {x_origin = 0, y_origin = -7500, x_size = 2808, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -112,6 +118,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -9000, x_size = 0, y_size = -1500}
             , fragmentRect = Rect {x_origin = 0, y_origin = -9000, x_size = 0, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -123,6 +130,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -10500, x_size = 4156, y_size = -1500}
             , fragmentRect = Rect {x_origin = 0, y_origin = -10500, x_size = 4156, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -139,6 +147,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -12000, x_size = 1960, y_size = -1500}
             , fragmentRect = Rect {x_origin = 0, y_origin = -12000, x_size = 1960, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
diff --git a/.golden/paragraphLayout/ligature.golden b/.golden/paragraphLayout/ligature.golden
--- a/.golden/paragraphLayout/ligature.golden
+++ b/.golden/paragraphLayout/ligature.golden
@@ -8,6 +8,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 4672, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 4672, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
diff --git a/.golden/paragraphLayout/ligatureParagraphBreak1.golden b/.golden/paragraphLayout/ligatureParagraphBreak1.golden
--- a/.golden/paragraphLayout/ligatureParagraphBreak1.golden
+++ b/.golden/paragraphLayout/ligatureParagraphBreak1.golden
@@ -8,6 +8,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2162, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2162, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -23,6 +24,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 2104, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 2104, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -39,6 +41,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 402, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 402, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
diff --git a/.golden/paragraphLayout/ligatureParagraphBreak2.golden b/.golden/paragraphLayout/ligatureParagraphBreak2.golden
--- a/.golden/paragraphLayout/ligatureParagraphBreak2.golden
+++ b/.golden/paragraphLayout/ligatureParagraphBreak2.golden
@@ -8,6 +8,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1772, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1772, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -23,6 +24,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1361, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1361, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -37,6 +39,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1535, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1535, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
diff --git a/.golden/paragraphLayout/lineHeightLarger.golden b/.golden/paragraphLayout/lineHeightLarger.golden
--- a/.golden/paragraphLayout/lineHeightLarger.golden
+++ b/.golden/paragraphLayout/lineHeightLarger.golden
@@ -8,6 +8,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -240, x_size = 522, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 522, y_size = -1600}
             , fragmentPen = (0, -1172)
             , fragmentGlyphs =
diff --git a/.golden/paragraphLayout/lineHeightNormal.golden b/.golden/paragraphLayout/lineHeightNormal.golden
--- a/.golden/paragraphLayout/lineHeightNormal.golden
+++ b/.golden/paragraphLayout/lineHeightNormal.golden
@@ -8,6 +8,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 522, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 522, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
diff --git a/.golden/paragraphLayout/lineHeightSmaller.golden b/.golden/paragraphLayout/lineHeightSmaller.golden
--- a/.golden/paragraphLayout/lineHeightSmaller.golden
+++ b/.golden/paragraphLayout/lineHeightSmaller.golden
@@ -8,6 +8,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 261, x_size = 522, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 522, y_size = -599}
             , fragmentPen = (0, -671)
             , fragmentGlyphs =
diff --git a/.golden/paragraphLayout/loremIpsum100em.golden b/.golden/paragraphLayout/loremIpsum100em.golden
--- a/.golden/paragraphLayout/loremIpsum100em.golden
+++ b/.golden/paragraphLayout/loremIpsum100em.golden
@@ -8,6 +8,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 95412, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 95412, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -231,6 +232,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 98954, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 98954, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -463,6 +465,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 4041, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 4041, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
diff --git a/.golden/paragraphLayout/loremIpsum20em.golden b/.golden/paragraphLayout/loremIpsum20em.golden
--- a/.golden/paragraphLayout/loremIpsum20em.golden
+++ b/.golden/paragraphLayout/loremIpsum20em.golden
@@ -8,6 +8,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -58,6 +59,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -107,6 +109,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 19791, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 19791, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -162,6 +165,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 17562, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 17562, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -210,6 +214,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 18769, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 18769, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -265,6 +270,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 19226, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 19226, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -316,6 +322,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 17973, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 17973, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -368,6 +375,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 18971, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 18971, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -423,6 +431,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 17239, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 17239, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -471,6 +480,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 19199, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 19199, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -524,6 +534,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 12076, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 12076, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
diff --git a/.golden/paragraphLayout/manySpaces.golden b/.golden/paragraphLayout/manySpaces.golden
--- a/.golden/paragraphLayout/manySpaces.golden
+++ b/.golden/paragraphLayout/manySpaces.golden
@@ -8,6 +8,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3132, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3132, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -25,6 +26,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 3132, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 3132, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -42,6 +44,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 3132, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 3132, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -59,6 +62,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 3132, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 3132, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
diff --git a/.golden/paragraphLayout/mixedLanguageLTR.golden b/.golden/paragraphLayout/mixedLanguageLTR.golden
--- a/.golden/paragraphLayout/mixedLanguageLTR.golden
+++ b/.golden/paragraphLayout/mixedLanguageLTR.golden
@@ -8,6 +8,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 4837, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 4837, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -33,6 +34,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 4837, y_origin = 0, x_size = 1276, y_size = -1121}
             , fragmentRect = Rect {x_origin = 4837, y_origin = 0, x_size = 1276, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
diff --git a/.golden/paragraphLayout/mixedScriptWords.golden b/.golden/paragraphLayout/mixedScriptWords.golden
--- a/.golden/paragraphLayout/mixedScriptWords.golden
+++ b/.golden/paragraphLayout/mixedScriptWords.golden
@@ -8,6 +8,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 777, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 777, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -22,6 +23,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 777, y_origin = 0, x_size = 2335, y_size = -1121}
             , fragmentRect = Rect {x_origin = 777, y_origin = 0, x_size = 2335, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -36,6 +38,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 3112, y_origin = 0, x_size = 777, y_size = -1121}
             , fragmentRect = Rect {x_origin = 3112, y_origin = 0, x_size = 777, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -50,6 +53,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 777, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 777, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -64,6 +68,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 777, y_origin = -1121, x_size = 2335, y_size = -1121}
             , fragmentRect = Rect {x_origin = 777, y_origin = -1121, x_size = 2335, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -78,6 +83,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 3112, y_origin = -1121, x_size = 777, y_size = -1121}
             , fragmentRect = Rect {x_origin = 3112, y_origin = -1121, x_size = 777, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -92,6 +98,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 2335, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 2335, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -106,6 +113,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 2335, y_origin = -2242, x_size = 777, y_size = -1121}
             , fragmentRect = Rect {x_origin = 2335, y_origin = -2242, x_size = 777, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -120,6 +128,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 3112, y_origin = -2242, x_size = 2335, y_size = -1121}
             , fragmentRect = Rect {x_origin = 3112, y_origin = -2242, x_size = 2335, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -134,6 +143,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 2335, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 2335, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -148,6 +158,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 2335, y_origin = -3363, x_size = 777, y_size = -1121}
             , fragmentRect = Rect {x_origin = 2335, y_origin = -3363, x_size = 777, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -162,6 +173,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 3112, y_origin = -3363, x_size = 2335, y_size = -1121}
             , fragmentRect = Rect {x_origin = 3112, y_origin = -3363, x_size = 2335, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -176,6 +188,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 253, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 253, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -188,6 +201,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 253, y_origin = -4484, x_size = 763, y_size = -1121}
             , fragmentRect = Rect {x_origin = 253, y_origin = -4484, x_size = 763, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -200,6 +214,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 1016, y_origin = -4484, x_size = 737, y_size = -1121}
             , fragmentRect = Rect {x_origin = 1016, y_origin = -4484, x_size = 737, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -214,6 +229,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 1753, y_origin = -4484, x_size = 763, y_size = -1121}
             , fragmentRect = Rect {x_origin = 1753, y_origin = -4484, x_size = 763, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -226,6 +242,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 2516, y_origin = -4484, x_size = 484, y_size = -1121}
             , fragmentRect = Rect {x_origin = 2516, y_origin = -4484, x_size = 484, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -239,6 +256,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 3000, y_origin = -4484, x_size = 763, y_size = -1121}
             , fragmentRect = Rect {x_origin = 3000, y_origin = -4484, x_size = 763, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -251,6 +269,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 3763, y_origin = -4484, x_size = 253, y_size = -1121}
             , fragmentRect = Rect {x_origin = 3763, y_origin = -4484, x_size = 253, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -263,6 +282,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 4016, y_origin = -4484, x_size = 763, y_size = -1121}
             , fragmentRect = Rect {x_origin = 4016, y_origin = -4484, x_size = 763, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -275,6 +295,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 763, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 763, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -287,6 +308,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 763, y_origin = -5605, x_size = 253, y_size = -1121}
             , fragmentRect = Rect {x_origin = 763, y_origin = -5605, x_size = 253, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -299,6 +321,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 1016, y_origin = -5605, x_size = 763, y_size = -1121}
             , fragmentRect = Rect {x_origin = 1016, y_origin = -5605, x_size = 763, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
diff --git a/.golden/paragraphLayout/spannedArabicFiller20em.golden b/.golden/paragraphLayout/spannedArabicFiller20em.golden
--- a/.golden/paragraphLayout/spannedArabicFiller20em.golden
+++ b/.golden/paragraphLayout/spannedArabicFiller20em.golden
@@ -8,6 +8,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 12652, y_origin = 0, x_size = 7198, y_size = -1500}
             , fragmentRect = Rect {x_origin = 12652, y_origin = 0, x_size = 7198, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -40,6 +41,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 7060, y_origin = 0, x_size = 5592, y_size = -1500}
             , fragmentRect = Rect {x_origin = 7060, y_origin = 0, x_size = 5592, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -65,6 +67,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 7060, y_size = -1500}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 7060, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -98,6 +101,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 14850, y_origin = -1500, x_size = 4045, y_size = -1500}
             , fragmentRect = Rect {x_origin = 14850, y_origin = -1500, x_size = 4045, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -122,6 +126,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 9168, y_origin = -1500, x_size = 5682, y_size = -1500}
             , fragmentRect = Rect {x_origin = 9168, y_origin = -1500, x_size = 5682, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -152,6 +157,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 3213, y_origin = -1500, x_size = 5955, y_size = -1500}
             , fragmentRect = Rect {x_origin = 3213, y_origin = -1500, x_size = 5955, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -182,6 +188,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 3213, y_size = -1500}
             , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 3213, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -202,6 +209,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 14300, y_origin = -3000, x_size = 4862, y_size = -1500}
             , fragmentRect = Rect {x_origin = 14300, y_origin = -3000, x_size = 4862, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -229,6 +237,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 10225, y_origin = -3000, x_size = 4075, y_size = -1500}
             , fragmentRect = Rect {x_origin = 10225, y_origin = -3000, x_size = 4075, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -252,6 +261,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 3898, y_origin = -3000, x_size = 6327, y_size = -1500}
             , fragmentRect = Rect {x_origin = 3898, y_origin = -3000, x_size = 6327, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -282,6 +292,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 3898, y_size = -1500}
             , fragmentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 3898, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -301,6 +312,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 12238, y_origin = -4500, x_size = 2357, y_size = -1500}
             , fragmentRect = Rect {x_origin = 12238, y_origin = -4500, x_size = 2357, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -321,6 +333,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 5880, y_origin = -4500, x_size = 6358, y_size = -1500}
             , fragmentRect = Rect {x_origin = 5880, y_origin = -4500, x_size = 6358, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -352,6 +365,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 5880, y_size = -1500}
             , fragmentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 5880, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
diff --git a/.golden/paragraphLayout/spannedLoremIpsum20em.golden b/.golden/paragraphLayout/spannedLoremIpsum20em.golden
--- a/.golden/paragraphLayout/spannedLoremIpsum20em.golden
+++ b/.golden/paragraphLayout/spannedLoremIpsum20em.golden
@@ -8,6 +8,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 8747, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 8747, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -40,6 +41,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 8747, y_origin = 0, x_size = 9563, y_size = -1121}
             , fragmentRect = Rect {x_origin = 8747, y_origin = 0, x_size = 9563, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -71,10 +73,23 @@
         SpanLayout
         [ Fragment
             { fragmentUserData = ()
+            , fragmentLine = 1
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
+                ]
+            , fragmentContentRect = Rect {x_origin = 18310, y_origin = 0, x_size = 0, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 18310, y_origin = 0, x_size = 0, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                []
+            }
+        , Fragment
+            { fragmentUserData = ()
             , fragmentLine = 2
             , fragmentAncestorBoxes =
-                [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 8553, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 8553, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -110,6 +125,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 8553, y_origin = -1121, x_size = 8890, y_size = -1121}
             , fragmentRect = Rect {x_origin = 8553, y_origin = -1121, x_size = 8890, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -137,10 +153,23 @@
         SpanLayout
         [ Fragment
             { fragmentUserData = ()
+            , fragmentLine = 2
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
+                ]
+            , fragmentContentRect = Rect {x_origin = 17443, y_origin = -1121, x_size = 0, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 17443, y_origin = -1121, x_size = 0, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                []
+            }
+        , Fragment
+            { fragmentUserData = ()
             , fragmentLine = 3
             , fragmentAncestorBoxes =
-                [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 9114, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 9114, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -176,6 +205,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 9114, y_origin = -2242, x_size = 7467, y_size = -1121}
             , fragmentRect = Rect {x_origin = 9114, y_origin = -2242, x_size = 7467, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -205,6 +235,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 16581, y_origin = -2242, x_size = 3210, y_size = -1121}
             , fragmentRect = Rect {x_origin = 16581, y_origin = -2242, x_size = 3210, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -224,6 +255,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 3799, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 3799, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -246,6 +278,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 3799, y_origin = -3363, x_size = 7878, y_size = -1121}
             , fragmentRect = Rect {x_origin = 3799, y_origin = -3363, x_size = 7878, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -276,6 +309,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 11677, y_origin = -3363, x_size = 5885, y_size = -1121}
             , fragmentRect = Rect {x_origin = 11677, y_origin = -3363, x_size = 5885, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -300,6 +334,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 5686, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 5686, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -327,6 +362,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 5686, y_origin = -4484, x_size = 8592, y_size = -1121}
             , fragmentRect = Rect {x_origin = 5686, y_origin = -4484, x_size = 8592, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -361,6 +397,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 14278, y_origin = -4484, x_size = 4491, y_size = -1121}
             , fragmentRect = Rect {x_origin = 14278, y_origin = -4484, x_size = 4491, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -383,6 +420,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 1301, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 1301, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -400,6 +438,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 1301, y_origin = -5605, x_size = 11041, y_size = -1121}
             , fragmentRect = Rect {x_origin = 1301, y_origin = -5605, x_size = 11041, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -435,6 +474,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 12342, y_origin = -5605, x_size = 6884, y_size = -1121}
             , fragmentRect = Rect {x_origin = 12342, y_origin = -5605, x_size = 6884, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -465,6 +505,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 10089, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 10089, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -501,6 +542,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 10089, y_origin = -6726, x_size = 7884, y_size = -1121}
             , fragmentRect = Rect {x_origin = 10089, y_origin = -6726, x_size = 7884, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -534,6 +576,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 8158, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 8158, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -566,6 +609,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 8158, y_origin = -7847, x_size = 6988, y_size = -1121}
             , fragmentRect = Rect {x_origin = 8158, y_origin = -7847, x_size = 6988, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -597,6 +641,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 15146, y_origin = -7847, x_size = 3825, y_size = -1121}
             , fragmentRect = Rect {x_origin = 15146, y_origin = -7847, x_size = 3825, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -617,6 +662,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 4594, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 4594, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -640,6 +686,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 4594, y_origin = -8968, x_size = 10907, y_size = -1121}
             , fragmentRect = Rect {x_origin = 4594, y_origin = -8968, x_size = 10907, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -679,6 +726,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 15501, y_origin = -8968, x_size = 1738, y_size = -1121}
             , fragmentRect = Rect {x_origin = 15501, y_origin = -8968, x_size = 1738, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -693,6 +741,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 6426, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 6426, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -721,6 +770,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 6426, y_origin = -10089, x_size = 5590, y_size = -1121}
             , fragmentRect = Rect {x_origin = 6426, y_origin = -10089, x_size = 5590, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -749,6 +799,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 12016, y_origin = -10089, x_size = 7183, y_size = -1121}
             , fragmentRect = Rect {x_origin = 12016, y_origin = -10089, x_size = 7183, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -774,6 +825,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 2652, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 2652, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -794,6 +846,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 2652, y_origin = -11210, x_size = 5383, y_size = -1121}
             , fragmentRect = Rect {x_origin = 2652, y_origin = -11210, x_size = 5383, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -821,6 +874,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 8035, y_origin = -11210, x_size = 4041, y_size = -1121}
             , fragmentRect = Rect {x_origin = 8035, y_origin = -11210, x_size = 4041, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
diff --git a/.golden/richParagraphLayout/emptyBoxMiddle.golden b/.golden/richParagraphLayout/emptyBoxMiddle.golden
new file mode 100644
--- /dev/null
+++ b/.golden/richParagraphLayout/emptyBoxMiddle.golden
@@ -0,0 +1,49 @@
+ParagraphLayout
+    { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 5193, y_size = -1121}
+    , paragraphFragments =
+        [ Fragment
+            { fragmentUserData = "text1"
+            , fragmentLine = 1
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3139, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3139, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 72, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 83, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 92, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 497, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "emptyText"
+            , fragmentLine = 1
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 50, boxRightEdge = SpacedEdge 100, boxStartEdge = SpacedEdge 50, boxEndEdge = SpacedEdge 100}
+                ]
+            , fragmentContentRect = Rect {x_origin = 3189, y_origin = 0, x_size = 0, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 3189, y_origin = 0, x_size = 0, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                []
+            }
+        , Fragment
+            { fragmentUserData = "text2"
+            , fragmentLine = 1
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 3289, y_origin = 0, x_size = 1904, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 3289, y_origin = 0, x_size = 1904, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 3, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 69, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 14, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 573, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 91, cluster = 15, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 511, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        ]
+    }
diff --git a/.golden/richParagraphLayout/hardBoxBreakLTR.golden b/.golden/richParagraphLayout/hardBoxBreakLTR.golden
--- a/.golden/richParagraphLayout/hardBoxBreakLTR.golden
+++ b/.golden/richParagraphLayout/hardBoxBreakLTR.golden
@@ -6,6 +6,7 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3333, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3333, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -24,6 +25,7 @@
                 [ AncestorBox {boxUserData = "box2", boxLeftEdge = SpacedEdge 150, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 150, boxEndEdge = NoEdge}
                 , AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 50, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 50, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 3533, y_origin = 0, x_size = 2222, y_size = -1121}
             , fragmentRect = Rect {x_origin = 3533, y_origin = 0, x_size = 2222, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -40,6 +42,7 @@
                 [ AncestorBox {boxUserData = "box2", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 200, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 200}
                 , AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 100, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 100}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 2222, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 2222, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -54,6 +57,7 @@
             , fragmentLine = 2
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 2522, y_origin = -1121, x_size = 3333, y_size = -1121}
             , fragmentRect = Rect {x_origin = 2522, y_origin = -1121, x_size = 3333, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
diff --git a/.golden/richParagraphLayout/hardBoxBreakRTL.golden b/.golden/richParagraphLayout/hardBoxBreakRTL.golden
--- a/.golden/richParagraphLayout/hardBoxBreakRTL.golden
+++ b/.golden/richParagraphLayout/hardBoxBreakRTL.golden
@@ -1,5 +1,5 @@
 ParagraphLayout
-    { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 3455, y_size = -3000}
+    { paragraphRect = Rect {x_origin = 999996545, y_origin = 0, x_size = 3455, y_size = -3000}
     , paragraphFragments =
         [ Fragment
             { fragmentUserData = "text2"
@@ -8,7 +8,8 @@
                 [ AncestorBox {boxUserData = "box2", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 200, boxStartEdge = SpacedEdge 200, boxEndEdge = NoEdge}
                 , AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 100, boxStartEdge = SpacedEdge 100, boxEndEdge = NoEdge}
                 ]
-            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1632, y_size = -1500}
+            , fragmentContentRect = Rect {x_origin = 999996545, y_origin = 0, x_size = 1632, y_size = -1500}
+            , fragmentRect = Rect {x_origin = 999996545, y_origin = 0, x_size = 1632, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
                 [ (GlyphInfo {codepoint = 512, cluster = 24, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 839, y_advance = 0, x_offset = 0, y_offset = 0})
@@ -22,7 +23,8 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
-            , fragmentRect = Rect {x_origin = 1932, y_origin = 0, x_size = 1523, y_size = -1500}
+            , fragmentContentRect = Rect {x_origin = 999998477, y_origin = 0, x_size = 1523, y_size = -1500}
+            , fragmentRect = Rect {x_origin = 999998477, y_origin = 0, x_size = 1523, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
                 [ (GlyphInfo {codepoint = 389, cluster = 16, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
@@ -38,7 +40,8 @@
             , fragmentLine = 2
             , fragmentAncestorBoxes =
                 []
-            , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 2155, y_size = -1500}
+            , fragmentContentRect = Rect {x_origin = 999996645, y_origin = -1500, x_size = 2155, y_size = -1500}
+            , fragmentRect = Rect {x_origin = 999996645, y_origin = -1500, x_size = 2155, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
                 [ (GlyphInfo {codepoint = 512, cluster = 45, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 839, y_advance = 0, x_offset = 0, y_offset = 0})
@@ -56,7 +59,8 @@
                 [ AncestorBox {boxUserData = "box2", boxLeftEdge = SpacedEdge 150, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 150}
                 , AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 50, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 50}
                 ]
-            , fragmentRect = Rect {x_origin = 2355, y_origin = -1500, x_size = 1000, y_size = -1500}
+            , fragmentContentRect = Rect {x_origin = 999999000, y_origin = -1500, x_size = 1000, y_size = -1500}
+            , fragmentRect = Rect {x_origin = 999999000, y_origin = -1500, x_size = 1000, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
                 [ (GlyphInfo {codepoint = 389, cluster = 33, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
diff --git a/.golden/richParagraphLayout/loremIpsum20em.golden b/.golden/richParagraphLayout/loremIpsum20em.golden
--- a/.golden/richParagraphLayout/loremIpsum20em.golden
+++ b/.golden/richParagraphLayout/loremIpsum20em.golden
@@ -6,6 +6,7 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -55,6 +56,7 @@
             , fragmentLine = 2
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -103,6 +105,7 @@
             , fragmentLine = 3
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 19791, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 19791, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -157,6 +160,7 @@
             , fragmentLine = 4
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 17562, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 17562, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -204,6 +208,7 @@
             , fragmentLine = 5
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 18769, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 18769, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -258,6 +263,7 @@
             , fragmentLine = 6
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 19226, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 19226, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -308,6 +314,7 @@
             , fragmentLine = 7
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 17973, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 17973, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -359,6 +366,7 @@
             , fragmentLine = 8
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 18971, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 18971, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -413,6 +421,7 @@
             , fragmentLine = 9
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 17239, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 17239, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -460,6 +469,7 @@
             , fragmentLine = 10
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 19199, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 19199, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -512,6 +522,7 @@
             , fragmentLine = 11
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 12076, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 12076, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
diff --git a/.golden/richParagraphLayout/loremIpsum20emCentre.golden b/.golden/richParagraphLayout/loremIpsum20emCentre.golden
new file mode 100644
--- /dev/null
+++ b/.golden/richParagraphLayout/loremIpsum20emCentre.golden
@@ -0,0 +1,559 @@
+ParagraphLayout
+    { paragraphRect = Rect {x_origin = 104, y_origin = 0, x_size = 19791, y_size = -12331}
+    , paragraphFragments =
+        [ Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 1
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 845, y_origin = 0, x_size = 18310, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 845, y_origin = 0, x_size = 18310, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 47, cluster = 4, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 507, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 5, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 83, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 14, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 15, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 16, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 17, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 18, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 19, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 20, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 21, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 22, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 23, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 24, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 25, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 26, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 27, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 28, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 29, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 413, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 15, cluster = 30, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 31, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 32, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 33, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 34, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 35, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 36, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 37, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 38, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 39, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 40, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 41, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 42, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 2
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 1278, y_origin = -1121, x_size = 17443, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 1278, y_origin = -1121, x_size = 17443, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 68, cluster = 44, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 45, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 46, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 83, cluster = 47, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 48, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 49, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 50, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 51, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 52, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 74, cluster = 53, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 54, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 55, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 56, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 57, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 58, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 413, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 15, cluster = 59, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 60, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 61, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 62, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 63, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 64, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 65, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 66, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 67, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 68, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 69, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 70, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 71, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 72, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 73, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 74, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 75, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 76, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 77, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 78, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 83, cluster = 79, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 80, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 81, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 3
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 104, y_origin = -2242, x_size = 19791, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 104, y_origin = -2242, x_size = 19791, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 76, cluster = 83, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 84, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 85, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 86, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 87, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 88, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 89, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 90, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 91, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 92, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 93, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 94, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 95, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 96, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 97, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 98, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 69, cluster = 99, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 100, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 101, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 102, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 103, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 104, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 105, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 106, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 107, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 108, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 109, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 110, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 111, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 112, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 113, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 114, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 115, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 74, cluster = 116, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 117, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 118, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 119, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 120, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 121, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 122, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 84, cluster = 123, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 124, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 125, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 17, cluster = 126, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 4
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 1219, y_origin = -3363, x_size = 17562, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 1219, y_origin = -3363, x_size = 17562, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 56, cluster = 128, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 688, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 129, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 130, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 131, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 132, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 133, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 134, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 135, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 136, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 137, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 138, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 139, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 140, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 141, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 142, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 143, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 144, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 89, cluster = 145, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 488, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 146, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 147, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 148, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 149, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 150, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 15, cluster = 151, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 152, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 84, cluster = 153, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 154, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 155, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 156, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 157, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 158, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 159, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 160, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 161, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 162, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 163, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 164, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 5
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 615, y_origin = -4484, x_size = 18769, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 615, y_origin = -4484, x_size = 18769, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 72, cluster = 166, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 91, cluster = 167, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 490, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 168, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 169, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 170, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 171, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 172, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 173, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 174, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 175, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 176, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 177, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 178, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 179, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 180, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 181, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 182, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 183, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 184, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 185, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 186, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 187, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 188, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 69, cluster = 189, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 190, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 191, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 192, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 193, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 194, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 195, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 196, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 197, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 198, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 199, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 200, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 201, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 202, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 203, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 204, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 205, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 84, cluster = 206, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 207, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 208, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 83, cluster = 209, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 6
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 387, y_origin = -5605, x_size = 19226, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 387, y_origin = -5605, x_size = 19226, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 72, cluster = 211, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 91, cluster = 212, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 511, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 213, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 214, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 215, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 216, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 217, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 218, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 219, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 220, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 221, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 222, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 223, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 224, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 225, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 226, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 227, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 228, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 229, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 84, cluster = 230, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 231, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 232, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 233, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 413, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 17, cluster = 234, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 235, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 39, cluster = 236, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 713, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 237, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 238, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 239, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 240, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 241, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 242, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 243, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 244, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 245, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 246, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 247, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 248, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 249, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 250, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 7
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 1013, y_origin = -6726, x_size = 17973, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 1013, y_origin = -6726, x_size = 17973, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 71, cluster = 252, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 253, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 254, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 255, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 256, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 257, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 258, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 259, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 260, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 261, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 262, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 83, cluster = 263, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 264, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 265, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 75, cluster = 266, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 571, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 267, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 268, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 269, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 270, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 271, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 272, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 273, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 274, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 275, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 276, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 277, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 89, cluster = 278, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 488, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 279, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 280, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 281, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 83, cluster = 282, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 283, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 284, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 285, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 286, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 287, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 89, cluster = 288, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 488, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 289, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 290, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 291, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 292, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 8
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 514, y_origin = -7847, x_size = 18971, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 514, y_origin = -7847, x_size = 18971, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 72, cluster = 294, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 295, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 296, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 297, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 298, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 299, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 300, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 301, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 302, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 303, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 304, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 305, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 306, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 307, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 308, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 309, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 310, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 311, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 312, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 313, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 314, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 315, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 73, cluster = 316, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 317, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 74, cluster = 318, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 319, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 320, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 321, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 322, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 323, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 324, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 325, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 326, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 327, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 328, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 83, cluster = 329, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 330, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 331, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 332, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 333, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 334, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 335, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 336, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 331, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 17, cluster = 337, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 9
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 1380, y_origin = -8968, x_size = 17239, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 1380, y_origin = -8968, x_size = 17239, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 40, cluster = 339, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 580, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 91, cluster = 340, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 490, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 341, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 342, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 83, cluster = 343, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 344, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 345, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 346, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 347, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 348, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 349, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 350, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 351, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 352, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 353, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 354, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 355, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 356, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 357, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 358, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 359, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 360, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 361, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 362, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 363, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 364, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 83, cluster = 365, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 366, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 367, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 368, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 369, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 370, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 371, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 372, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 373, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 374, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 375, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 10
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 400, y_origin = -10089, x_size = 19199, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 400, y_origin = -10089, x_size = 19199, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 83, cluster = 377, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 378, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 379, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 380, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 381, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 382, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 383, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 384, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 413, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 15, cluster = 385, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 386, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 387, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 388, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 389, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 390, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 391, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 392, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 393, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 394, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 395, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 396, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 397, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 83, cluster = 398, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 399, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 400, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 84, cluster = 401, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 402, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 403, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 404, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 405, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 431, cluster = 406, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 1033, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 409, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 410, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 411, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 412, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 413, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 414, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 415, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 416, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 417, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 418, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 419, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 420, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 11
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 3962, y_origin = -11210, x_size = 12076, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 3962, y_origin = -11210, x_size = 12076, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 80, cluster = 422, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 423, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 424, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 425, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 426, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 427, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 428, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 429, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 430, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 431, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 432, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 433, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 434, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 435, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 436, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 437, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 438, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 439, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 440, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 441, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 442, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 69, cluster = 443, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 444, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 445, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 446, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 447, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 17, cluster = 448, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        ]
+    }
diff --git a/.golden/richParagraphLayout/loremIpsum20emRight.golden b/.golden/richParagraphLayout/loremIpsum20emRight.golden
new file mode 100644
--- /dev/null
+++ b/.golden/richParagraphLayout/loremIpsum20emRight.golden
@@ -0,0 +1,559 @@
+ParagraphLayout
+    { paragraphRect = Rect {x_origin = 209, y_origin = 0, x_size = 19791, y_size = -12331}
+    , paragraphFragments =
+        [ Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 1
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 1690, y_origin = 0, x_size = 18310, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 1690, y_origin = 0, x_size = 18310, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 47, cluster = 4, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 507, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 5, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 83, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 14, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 15, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 16, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 17, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 18, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 19, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 20, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 21, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 22, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 23, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 24, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 25, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 26, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 27, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 28, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 29, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 413, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 15, cluster = 30, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 31, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 32, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 33, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 34, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 35, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 36, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 37, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 38, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 39, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 40, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 41, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 42, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 2
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 2557, y_origin = -1121, x_size = 17443, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 2557, y_origin = -1121, x_size = 17443, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 68, cluster = 44, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 45, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 46, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 83, cluster = 47, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 48, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 49, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 50, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 51, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 52, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 74, cluster = 53, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 54, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 55, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 56, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 57, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 58, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 413, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 15, cluster = 59, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 60, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 61, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 62, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 63, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 64, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 65, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 66, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 67, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 68, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 69, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 70, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 71, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 72, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 73, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 74, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 75, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 76, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 77, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 78, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 83, cluster = 79, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 80, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 81, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 3
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 209, y_origin = -2242, x_size = 19791, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 209, y_origin = -2242, x_size = 19791, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 76, cluster = 83, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 84, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 85, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 86, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 87, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 88, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 89, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 90, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 91, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 92, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 93, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 94, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 95, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 96, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 97, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 98, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 69, cluster = 99, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 100, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 101, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 102, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 103, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 104, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 105, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 106, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 107, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 108, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 109, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 110, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 111, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 112, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 113, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 114, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 115, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 74, cluster = 116, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 117, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 118, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 119, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 120, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 121, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 122, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 84, cluster = 123, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 124, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 125, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 17, cluster = 126, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 4
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 2438, y_origin = -3363, x_size = 17562, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 2438, y_origin = -3363, x_size = 17562, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 56, cluster = 128, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 688, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 129, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 130, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 131, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 132, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 133, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 134, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 135, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 136, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 137, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 138, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 139, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 140, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 141, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 142, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 143, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 144, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 89, cluster = 145, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 488, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 146, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 147, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 148, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 149, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 150, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 15, cluster = 151, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 152, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 84, cluster = 153, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 154, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 155, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 156, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 157, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 158, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 159, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 160, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 161, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 162, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 163, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 164, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 5
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 1231, y_origin = -4484, x_size = 18769, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 1231, y_origin = -4484, x_size = 18769, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 72, cluster = 166, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 91, cluster = 167, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 490, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 168, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 169, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 170, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 171, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 172, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 173, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 174, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 175, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 176, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 177, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 178, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 179, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 180, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 181, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 182, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 183, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 184, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 185, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 186, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 187, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 188, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 69, cluster = 189, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 190, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 191, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 192, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 193, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 194, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 195, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 196, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 197, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 198, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 199, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 200, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 201, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 202, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 203, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 204, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 205, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 84, cluster = 206, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 207, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 208, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 83, cluster = 209, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 6
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 774, y_origin = -5605, x_size = 19226, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 774, y_origin = -5605, x_size = 19226, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 72, cluster = 211, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 91, cluster = 212, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 511, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 213, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 214, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 215, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 216, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 217, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 218, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 219, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 220, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 221, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 222, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 223, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 224, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 225, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 226, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 227, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 228, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 229, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 84, cluster = 230, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 231, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 232, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 233, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 413, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 17, cluster = 234, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 235, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 39, cluster = 236, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 713, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 237, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 238, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 239, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 240, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 241, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 242, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 243, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 244, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 245, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 246, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 247, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 248, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 249, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 250, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 7
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 2027, y_origin = -6726, x_size = 17973, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 2027, y_origin = -6726, x_size = 17973, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 71, cluster = 252, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 253, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 254, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 255, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 256, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 257, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 258, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 259, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 260, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 261, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 262, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 83, cluster = 263, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 264, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 265, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 75, cluster = 266, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 571, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 267, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 268, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 269, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 270, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 271, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 272, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 273, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 274, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 275, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 276, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 277, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 89, cluster = 278, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 488, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 279, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 280, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 281, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 83, cluster = 282, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 283, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 284, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 285, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 286, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 287, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 89, cluster = 288, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 488, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 289, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 290, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 291, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 292, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 8
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 1029, y_origin = -7847, x_size = 18971, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 1029, y_origin = -7847, x_size = 18971, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 72, cluster = 294, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 295, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 296, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 297, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 298, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 299, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 300, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 301, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 302, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 303, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 304, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 305, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 306, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 307, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 308, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 309, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 310, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 311, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 312, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 313, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 314, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 315, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 73, cluster = 316, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 317, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 74, cluster = 318, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 319, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 320, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 321, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 322, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 323, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 324, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 325, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 326, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 327, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 328, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 83, cluster = 329, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 330, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 331, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 332, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 333, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 334, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 335, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 336, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 331, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 17, cluster = 337, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 9
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 2761, y_origin = -8968, x_size = 17239, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 2761, y_origin = -8968, x_size = 17239, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 40, cluster = 339, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 580, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 91, cluster = 340, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 490, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 341, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 342, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 83, cluster = 343, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 344, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 345, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 346, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 347, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 348, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 349, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 350, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 351, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 352, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 353, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 354, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 355, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 356, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 357, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 358, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 359, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 360, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 361, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 362, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 363, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 364, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 83, cluster = 365, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 366, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 367, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 368, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 369, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 370, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 371, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 372, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 373, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 374, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 375, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 10
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 801, y_origin = -10089, x_size = 19199, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 801, y_origin = -10089, x_size = 19199, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 83, cluster = 377, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 378, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 379, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 380, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 381, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 382, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 383, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 384, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 413, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 15, cluster = 385, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 386, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 387, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 388, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 389, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 390, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 391, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 392, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 393, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 394, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 395, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 396, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 397, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 83, cluster = 398, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 399, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 400, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 84, cluster = 401, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 402, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 403, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 404, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 405, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 431, cluster = 406, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 1033, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 409, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 410, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 411, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 412, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 413, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 414, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 415, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 416, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 417, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 418, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 419, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 420, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 11
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 7924, y_origin = -11210, x_size = 12076, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 7924, y_origin = -11210, x_size = 12076, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 80, cluster = 422, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 423, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 424, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 425, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 426, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 427, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 428, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 429, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 81, cluster = 430, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 431, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 432, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 433, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 434, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 435, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 436, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 437, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 86, cluster = 438, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 87, cluster = 439, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 440, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 441, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 442, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 69, cluster = 443, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 444, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 445, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 446, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 447, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 17, cluster = 448, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        ]
+    }
diff --git a/.golden/richParagraphLayout/mixedDirectionComplexLTR.golden b/.golden/richParagraphLayout/mixedDirectionComplexLTR.golden
--- a/.golden/richParagraphLayout/mixedDirectionComplexLTR.golden
+++ b/.golden/richParagraphLayout/mixedDirectionComplexLTR.golden
@@ -6,6 +6,7 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 6732, y_size = -1500}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 6732, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -35,6 +36,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 6732, y_origin = 0, x_size = 1580, y_size = -1500}
             , fragmentRect = Rect {x_origin = 6732, y_origin = 0, x_size = 1580, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -51,6 +53,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 8312, y_origin = 0, x_size = 3166, y_size = -1500}
             , fragmentRect = Rect {x_origin = 8312, y_origin = 0, x_size = 3166, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -71,6 +74,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 11478, y_origin = 0, x_size = 6578, y_size = -1500}
             , fragmentRect = Rect {x_origin = 11478, y_origin = 0, x_size = 6578, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -100,6 +104,7 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 18056, y_origin = 0, x_size = 1580, y_size = -1500}
             , fragmentRect = Rect {x_origin = 18056, y_origin = 0, x_size = 1580, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -115,6 +120,7 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 19636, y_origin = 0, x_size = 3577, y_size = -1500}
             , fragmentRect = Rect {x_origin = 19636, y_origin = 0, x_size = 3577, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -134,6 +140,7 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 23213, y_origin = 0, x_size = 1344, y_size = -1500}
             , fragmentRect = Rect {x_origin = 23213, y_origin = 0, x_size = 1344, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
diff --git a/.golden/richParagraphLayout/mixedDirectionComplexRTL.golden b/.golden/richParagraphLayout/mixedDirectionComplexRTL.golden
--- a/.golden/richParagraphLayout/mixedDirectionComplexRTL.golden
+++ b/.golden/richParagraphLayout/mixedDirectionComplexRTL.golden
@@ -1,12 +1,13 @@
 ParagraphLayout
-    { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 24557, y_size = -1500}
+    { paragraphRect = Rect {x_origin = 999975443, y_origin = 0, x_size = 24557, y_size = -1500}
     , paragraphFragments =
         [ Fragment
             { fragmentUserData = "text3"
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
-            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 6501, y_size = -1500}
+            , fragmentContentRect = Rect {x_origin = 999975443, y_origin = 0, x_size = 6501, y_size = -1500}
+            , fragmentRect = Rect {x_origin = 999975443, y_origin = 0, x_size = 6501, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
                 [ (GlyphInfo {codepoint = 147, cluster = 83, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 600, y_advance = 0, x_offset = 0, y_offset = 0})
@@ -35,7 +36,8 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
-            , fragmentRect = Rect {x_origin = 6501, y_origin = 0, x_size = 1580, y_size = -1500}
+            , fragmentContentRect = Rect {x_origin = 999981944, y_origin = 0, x_size = 1580, y_size = -1500}
+            , fragmentRect = Rect {x_origin = 999981944, y_origin = 0, x_size = 1580, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
                 [ (GlyphInfo {codepoint = 3, cluster = 61, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 236, y_advance = 0, x_offset = 0, y_offset = 0})
@@ -51,7 +53,8 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
-            , fragmentRect = Rect {x_origin = 8081, y_origin = 0, x_size = 3418, y_size = -1500}
+            , fragmentContentRect = Rect {x_origin = 999983524, y_origin = 0, x_size = 3418, y_size = -1500}
+            , fragmentRect = Rect {x_origin = 999983524, y_origin = 0, x_size = 3418, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
                 [ (GlyphInfo {codepoint = 26, cluster = 48, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 351, y_advance = 0, x_offset = 0, y_offset = 0})
@@ -71,7 +74,8 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
-            , fragmentRect = Rect {x_origin = 11499, y_origin = 0, x_size = 6326, y_size = -1500}
+            , fragmentContentRect = Rect {x_origin = 999986942, y_origin = 0, x_size = 6326, y_size = -1500}
+            , fragmentRect = Rect {x_origin = 999986942, y_origin = 0, x_size = 6326, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
                 [ (GlyphInfo {codepoint = 3, cluster = 47, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 236, y_advance = 0, x_offset = 0, y_offset = 0})
@@ -100,7 +104,8 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
-            , fragmentRect = Rect {x_origin = 17825, y_origin = 0, x_size = 1580, y_size = -1500}
+            , fragmentContentRect = Rect {x_origin = 999993268, y_origin = 0, x_size = 1580, y_size = -1500}
+            , fragmentRect = Rect {x_origin = 999993268, y_origin = 0, x_size = 1580, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
                 [ (GlyphInfo {codepoint = 3, cluster = 24, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 236, y_advance = 0, x_offset = 0, y_offset = 0})
@@ -115,7 +120,8 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
-            , fragmentRect = Rect {x_origin = 19405, y_origin = 0, x_size = 3808, y_size = -1500}
+            , fragmentContentRect = Rect {x_origin = 999994848, y_origin = 0, x_size = 3808, y_size = -1500}
+            , fragmentRect = Rect {x_origin = 999994848, y_origin = 0, x_size = 3808, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
                 [ (GlyphInfo {codepoint = 4, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 534, y_advance = 0, x_offset = 0, y_offset = 0})
@@ -134,7 +140,8 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
-            , fragmentRect = Rect {x_origin = 23213, y_origin = 0, x_size = 1344, y_size = -1500}
+            , fragmentContentRect = Rect {x_origin = 999998656, y_origin = 0, x_size = 1344, y_size = -1500}
+            , fragmentRect = Rect {x_origin = 999998656, y_origin = 0, x_size = 1344, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
                 [ (GlyphInfo {codepoint = 3, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 236, y_advance = 0, x_offset = 0, y_offset = 0})
diff --git a/.golden/richParagraphLayout/mixedDirectionSimpleLTR.golden b/.golden/richParagraphLayout/mixedDirectionSimpleLTR.golden
--- a/.golden/richParagraphLayout/mixedDirectionSimpleLTR.golden
+++ b/.golden/richParagraphLayout/mixedDirectionSimpleLTR.golden
@@ -6,6 +6,7 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3397, y_size = -1500}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3397, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -23,6 +24,7 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 3397, y_origin = 0, x_size = 1578, y_size = -1500}
             , fragmentRect = Rect {x_origin = 3397, y_origin = 0, x_size = 1578, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
@@ -35,6 +37,7 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 4975, y_origin = 0, x_size = 2979, y_size = -1500}
             , fragmentRect = Rect {x_origin = 4975, y_origin = 0, x_size = 2979, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
diff --git a/.golden/richParagraphLayout/mixedDirectionSimpleRTL.golden b/.golden/richParagraphLayout/mixedDirectionSimpleRTL.golden
--- a/.golden/richParagraphLayout/mixedDirectionSimpleRTL.golden
+++ b/.golden/richParagraphLayout/mixedDirectionSimpleRTL.golden
@@ -1,12 +1,13 @@
 ParagraphLayout
-    { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 7954, y_size = -1500}
+    { paragraphRect = Rect {x_origin = 999992046, y_origin = 0, x_size = 7954, y_size = -1500}
     , paragraphFragments =
         [ Fragment
             { fragmentUserData = "text"
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
-            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2979, y_size = -1500}
+            , fragmentContentRect = Rect {x_origin = 999992046, y_origin = 0, x_size = 2979, y_size = -1500}
+            , fragmentRect = Rect {x_origin = 999992046, y_origin = 0, x_size = 2979, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
                 [ (GlyphInfo {codepoint = 17, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 517, y_advance = 0, x_offset = 0, y_offset = 0})
@@ -22,7 +23,8 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
-            , fragmentRect = Rect {x_origin = 2979, y_origin = 0, x_size = 1578, y_size = -1500}
+            , fragmentContentRect = Rect {x_origin = 999995025, y_origin = 0, x_size = 1578, y_size = -1500}
+            , fragmentRect = Rect {x_origin = 999995025, y_origin = 0, x_size = 1578, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
                 [ (GlyphInfo {codepoint = 1143, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 1095, y_advance = 0, x_offset = 0, y_offset = 0})
@@ -34,7 +36,8 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
-            , fragmentRect = Rect {x_origin = 4557, y_origin = 0, x_size = 3397, y_size = -1500}
+            , fragmentContentRect = Rect {x_origin = 999996603, y_origin = 0, x_size = 3397, y_size = -1500}
+            , fragmentRect = Rect {x_origin = 999996603, y_origin = 0, x_size = 3397, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
                 [ (GlyphInfo {codepoint = 6, cluster = 0, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 580, y_advance = 0, x_offset = 0, y_offset = 0})
diff --git a/.golden/richParagraphLayout/mixedLineHeight.golden b/.golden/richParagraphLayout/mixedLineHeight.golden
new file mode 100644
--- /dev/null
+++ b/.golden/richParagraphLayout/mixedLineHeight.golden
@@ -0,0 +1,306 @@
+ParagraphLayout
+    { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 16708, y_size = -9400}
+    , paragraphFragments =
+        [ Fragment
+            { fragmentUserData = "mediumText"
+            , fragmentLine = 1
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -90, x_size = 3928, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3928, y_size = -1300}
+            , fragmentPen = (0, -1022)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 80, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "smallText"
+            , fragmentLine = 1
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = "smallBox", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
+                ]
+            , fragmentContentRect = Rect {x_origin = 3928, y_origin = 160, x_size = 2606, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 3928, y_origin = 0, x_size = 2606, y_size = -800}
+            , fragmentPen = (0, -772)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 86, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 14, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 15, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 16, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 17, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 18, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "mediumText"
+            , fragmentLine = 1
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 6534, y_origin = -90, x_size = 3928, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 6534, y_origin = 0, x_size = 3928, y_size = -1300}
+            , fragmentPen = (0, -1022)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 80, cluster = 19, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 20, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 21, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 22, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 23, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 24, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 25, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "largeText"
+            , fragmentLine = 1
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = "largeBox", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
+                ]
+            , fragmentContentRect = Rect {x_origin = 10462, y_origin = -290, x_size = 2549, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 10462, y_origin = 0, x_size = 2549, y_size = -1700}
+            , fragmentPen = (0, -1222)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 79, cluster = 26, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 27, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 28, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 74, cluster = 29, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 30, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 31, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "mediumText"
+            , fragmentLine = 1
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 13011, y_origin = -90, x_size = 3697, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 13011, y_origin = 0, x_size = 3697, y_size = -1300}
+            , fragmentPen = (0, -1022)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 80, cluster = 32, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 33, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 34, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 35, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 36, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 37, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "lineBreak"
+            , fragmentLine = 1
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 16708, y_origin = -90, x_size = 0, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 16708, y_origin = 0, x_size = 0, y_size = -1300}
+            , fragmentPen = (0, -1022)
+            , fragmentGlyphs =
+                []
+            }
+        , Fragment
+            { fragmentUserData = "smallText"
+            , fragmentLine = 2
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = "smallBox", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
+                ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1540, x_size = 2606, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 0, y_origin = -1700, x_size = 2606, y_size = -800}
+            , fragmentPen = (0, -772)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 86, cluster = 40, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 41, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 42, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 43, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 44, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 45, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "mediumText"
+            , fragmentLine = 2
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 2606, y_origin = -1790, x_size = 3928, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 2606, y_origin = -1700, x_size = 3928, y_size = -1300}
+            , fragmentPen = (0, -1022)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 80, cluster = 46, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 47, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 48, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 49, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 50, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 51, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 52, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "largeText"
+            , fragmentLine = 2
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = "largeBox", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
+                ]
+            , fragmentContentRect = Rect {x_origin = 6534, y_origin = -1990, x_size = 2318, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 6534, y_origin = -1700, x_size = 2318, y_size = -1700}
+            , fragmentPen = (0, -1222)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 79, cluster = 53, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 54, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 55, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 74, cluster = 56, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 57, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "lineBreak"
+            , fragmentLine = 2
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 8852, y_origin = -1790, x_size = 0, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 8852, y_origin = -1700, x_size = 0, y_size = -1300}
+            , fragmentPen = (0, -1022)
+            , fragmentGlyphs =
+                []
+            }
+        , Fragment
+            { fragmentUserData = "mediumText"
+            , fragmentLine = 3
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3490, x_size = 3928, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 0, y_origin = -3400, x_size = 3928, y_size = -1300}
+            , fragmentPen = (0, -1022)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 80, cluster = 60, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 61, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 62, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 63, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 64, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 65, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 66, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "smallText"
+            , fragmentLine = 3
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = "smallBox", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
+                ]
+            , fragmentContentRect = Rect {x_origin = 3928, y_origin = -3240, x_size = 2375, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 3928, y_origin = -3400, x_size = 2375, y_size = -800}
+            , fragmentPen = (0, -772)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 86, cluster = 67, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 68, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 69, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 70, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 71, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "lineBreak"
+            , fragmentLine = 3
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 6303, y_origin = -3490, x_size = 0, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 6303, y_origin = -3400, x_size = 0, y_size = -1300}
+            , fragmentPen = (0, -1022)
+            , fragmentGlyphs =
+                []
+            }
+        , Fragment
+            { fragmentUserData = "largeText"
+            , fragmentLine = 4
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = "largeBox", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
+                ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4990, x_size = 2549, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 0, y_origin = -4700, x_size = 2549, y_size = -1700}
+            , fragmentPen = (0, -1222)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 79, cluster = 74, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 75, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 76, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 74, cluster = 77, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 78, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 3, cluster = 79, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "mediumText"
+            , fragmentLine = 4
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 2549, y_origin = -4790, x_size = 3697, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 2549, y_origin = -4700, x_size = 3697, y_size = -1300}
+            , fragmentPen = (0, -1022)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 80, cluster = 80, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 81, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 71, cluster = 82, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 76, cluster = 83, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 88, cluster = 84, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 85, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "lineBreak"
+            , fragmentLine = 4
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 6246, y_origin = -4790, x_size = 0, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 6246, y_origin = -4700, x_size = 0, y_size = -1300}
+            , fragmentPen = (0, -1022)
+            , fragmentGlyphs =
+                []
+            }
+        , Fragment
+            { fragmentUserData = "smallText"
+            , fragmentLine = 5
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = "smallBox", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
+                ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -6240, x_size = 2375, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 0, y_origin = -6400, x_size = 2375, y_size = -800}
+            , fragmentPen = (0, -772)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 86, cluster = 88, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 80, cluster = 89, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 90, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 91, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 79, cluster = 92, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "lineBreak"
+            , fragmentLine = 5
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 2375, y_origin = -6490, x_size = 0, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 2375, y_origin = -6400, x_size = 0, y_size = -1300}
+            , fragmentPen = (0, -1022)
+            , fragmentGlyphs =
+                []
+            }
+        , Fragment
+            { fragmentUserData = "largeText"
+            , fragmentLine = 6
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = "largeBox", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
+                ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -7990, x_size = 2318, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 0, y_origin = -7700, x_size = 2318, y_size = -1700}
+            , fragmentPen = (0, -1222)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 79, cluster = 95, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 96, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 85, cluster = 97, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 74, cluster = 98, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 99, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        ]
+    }
diff --git a/.golden/richParagraphLayout/mixedScript.golden b/.golden/richParagraphLayout/mixedScript.golden
--- a/.golden/richParagraphLayout/mixedScript.golden
+++ b/.golden/richParagraphLayout/mixedScript.golden
@@ -6,6 +6,7 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 777, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 777, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -19,6 +20,7 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 777, y_origin = 0, x_size = 2335, y_size = -1121}
             , fragmentRect = Rect {x_origin = 777, y_origin = 0, x_size = 2335, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -33,6 +35,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 50, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 50, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 3162, y_origin = 0, x_size = 777, y_size = -1121}
             , fragmentRect = Rect {x_origin = 3162, y_origin = 0, x_size = 777, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -47,6 +50,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 100, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 100}
                 ]
+            , fragmentContentRect = Rect {x_origin = 3939, y_origin = 0, x_size = 2335, y_size = -1121}
             , fragmentRect = Rect {x_origin = 3939, y_origin = 0, x_size = 2335, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -60,6 +64,7 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 6374, y_origin = 0, x_size = 2335, y_size = -1121}
             , fragmentRect = Rect {x_origin = 6374, y_origin = 0, x_size = 2335, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -74,6 +79,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = "box2", boxLeftEdge = SpacedEdge 150, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 150, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 8859, y_origin = 0, x_size = 2335, y_size = -1121}
             , fragmentRect = Rect {x_origin = 8859, y_origin = 0, x_size = 2335, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -88,6 +94,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = "box2", boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 11194, y_origin = 0, x_size = 777, y_size = -1121}
             , fragmentRect = Rect {x_origin = 11194, y_origin = 0, x_size = 777, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -102,6 +109,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = "box2", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 200, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 200}
                 ]
+            , fragmentContentRect = Rect {x_origin = 11971, y_origin = 0, x_size = 2335, y_size = -1121}
             , fragmentRect = Rect {x_origin = 11971, y_origin = 0, x_size = 2335, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -115,6 +123,7 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 14506, y_origin = 0, x_size = 777, y_size = -1121}
             , fragmentRect = Rect {x_origin = 14506, y_origin = 0, x_size = 777, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
diff --git a/.golden/richParagraphLayout/mixedScriptWrap.golden b/.golden/richParagraphLayout/mixedScriptWrap.golden
--- a/.golden/richParagraphLayout/mixedScriptWrap.golden
+++ b/.golden/richParagraphLayout/mixedScriptWrap.golden
@@ -6,6 +6,7 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 777, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 777, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -19,6 +20,7 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 777, y_origin = 0, x_size = 2335, y_size = -1121}
             , fragmentRect = Rect {x_origin = 777, y_origin = 0, x_size = 2335, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -33,6 +35,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 50, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 50, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 3162, y_origin = 0, x_size = 777, y_size = -1121}
             , fragmentRect = Rect {x_origin = 3162, y_origin = 0, x_size = 777, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -47,6 +50,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 3939, y_origin = 0, x_size = 763, y_size = -1121}
             , fragmentRect = Rect {x_origin = 3939, y_origin = 0, x_size = 763, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -59,6 +63,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 100, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 100}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1549, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1549, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -71,6 +76,7 @@
             , fragmentLine = 2
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 1649, y_origin = -1121, x_size = 2335, y_size = -1121}
             , fragmentRect = Rect {x_origin = 1649, y_origin = -1121, x_size = 2335, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -85,6 +91,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = "box2", boxLeftEdge = SpacedEdge 150, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 150, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 4134, y_origin = -1121, x_size = 763, y_size = -1121}
             , fragmentRect = Rect {x_origin = 4134, y_origin = -1121, x_size = 763, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -97,6 +104,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = "box2", boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1549, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1549, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -110,6 +118,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = "box2", boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 1549, y_origin = -2242, x_size = 777, y_size = -1121}
             , fragmentRect = Rect {x_origin = 1549, y_origin = -2242, x_size = 777, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -124,6 +133,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = "box2", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 200, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 200}
                 ]
+            , fragmentContentRect = Rect {x_origin = 2326, y_origin = -2242, x_size = 2335, y_size = -1121}
             , fragmentRect = Rect {x_origin = 2326, y_origin = -2242, x_size = 2335, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -137,6 +147,7 @@
             , fragmentLine = 4
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 777, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 777, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
diff --git a/.golden/richParagraphLayout/mixedSizes.golden b/.golden/richParagraphLayout/mixedSizes.golden
--- a/.golden/richParagraphLayout/mixedSizes.golden
+++ b/.golden/richParagraphLayout/mixedSizes.golden
@@ -6,6 +6,7 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1651, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1651, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -21,6 +22,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = "smallBox1", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 1651, y_origin = 0, x_size = 1956, y_size = -841}
             , fragmentRect = Rect {x_origin = 1651, y_origin = 0, x_size = 1956, y_size = -841}
             , fragmentPen = (0, -699)
             , fragmentGlyphs =
@@ -37,6 +39,7 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 3607, y_origin = 0, x_size = 1651, y_size = -1121}
             , fragmentRect = Rect {x_origin = 3607, y_origin = 0, x_size = 1651, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -52,6 +55,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = "smallBox2", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 5258, y_origin = 0, x_size = 1956, y_size = -841}
             , fragmentRect = Rect {x_origin = 5258, y_origin = 0, x_size = 1956, y_size = -841}
             , fragmentPen = (0, -699)
             , fragmentGlyphs =
@@ -68,6 +72,7 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 7214, y_origin = 0, x_size = 1420, y_size = -1121}
             , fragmentRect = Rect {x_origin = 7214, y_origin = 0, x_size = 1420, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
diff --git a/.golden/richParagraphLayout/nestedBoxes.golden b/.golden/richParagraphLayout/nestedBoxes.golden
--- a/.golden/richParagraphLayout/nestedBoxes.golden
+++ b/.golden/richParagraphLayout/nestedBoxes.golden
@@ -6,6 +6,7 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 8569, y_size = -1121}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 8569, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -37,6 +38,7 @@
                 [ AncestorBox {boxUserData = "box3", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}
                 , AncestorBox {boxUserData = "box2", boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}
                 ]
+            , fragmentContentRect = Rect {x_origin = 8569, y_origin = 0, x_size = 3350, y_size = -1121}
             , fragmentRect = Rect {x_origin = 8569, y_origin = 0, x_size = 3350, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
@@ -55,6 +57,7 @@
             , fragmentAncestorBoxes =
                 [ AncestorBox {boxUserData = "box2", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}
                 ]
+            , fragmentContentRect = Rect {x_origin = 11919, y_origin = 0, x_size = 2657, y_size = -1121}
             , fragmentRect = Rect {x_origin = 11919, y_origin = 0, x_size = 2657, y_size = -1121}
             , fragmentPen = (0, -932)
             , fragmentGlyphs =
diff --git a/.golden/richParagraphLayout/neutralDirectionLTR.golden b/.golden/richParagraphLayout/neutralDirectionLTR.golden
--- a/.golden/richParagraphLayout/neutralDirectionLTR.golden
+++ b/.golden/richParagraphLayout/neutralDirectionLTR.golden
@@ -6,6 +6,7 @@
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2003, y_size = -1500}
             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2003, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
diff --git a/.golden/richParagraphLayout/neutralDirectionRTL.golden b/.golden/richParagraphLayout/neutralDirectionRTL.golden
--- a/.golden/richParagraphLayout/neutralDirectionRTL.golden
+++ b/.golden/richParagraphLayout/neutralDirectionRTL.golden
@@ -1,12 +1,13 @@
 ParagraphLayout
-    { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 2003, y_size = -1500}
+    { paragraphRect = Rect {x_origin = 999997997, y_origin = 0, x_size = 2003, y_size = -1500}
     , paragraphFragments =
         [ Fragment
             { fragmentUserData = "text"
             , fragmentLine = 1
             , fragmentAncestorBoxes =
                 []
-            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2003, y_size = -1500}
+            , fragmentContentRect = Rect {x_origin = 999997997, y_origin = 0, x_size = 2003, y_size = -1500}
+            , fragmentRect = Rect {x_origin = 999997997, y_origin = 0, x_size = 2003, y_size = -1500}
             , fragmentPen = (0, -1085)
             , fragmentGlyphs =
                 [ (GlyphInfo {codepoint = 147, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 600, y_advance = 0, x_offset = 0, y_offset = 0})
diff --git a/.golden/richParagraphLayout/newline1Paragraph.golden b/.golden/richParagraphLayout/newline1Paragraph.golden
new file mode 100644
--- /dev/null
+++ b/.golden/richParagraphLayout/newline1Paragraph.golden
@@ -0,0 +1,16 @@
+ParagraphLayout
+    { paragraphRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}
+    , paragraphFragments =
+        [ Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 1
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}
+            , fragmentRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}
+            , fragmentPen = (0, -1085)
+            , fragmentGlyphs =
+                []
+            }
+        ]
+    }
diff --git a/.golden/richParagraphLayout/newline1TextParagraph.golden b/.golden/richParagraphLayout/newline1TextParagraph.golden
new file mode 100644
--- /dev/null
+++ b/.golden/richParagraphLayout/newline1TextParagraph.golden
@@ -0,0 +1,28 @@
+ParagraphLayout
+    { paragraphRect = Rect {x_origin = 999999649, y_origin = 0, x_size = 351, y_size = -3000}
+    , paragraphFragments =
+        [ Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 1
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}
+            , fragmentRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}
+            , fragmentPen = (0, -1085)
+            , fragmentGlyphs =
+                []
+            }
+        , Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 2
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 999999649, y_origin = -1500, x_size = 351, y_size = -1500}
+            , fragmentRect = Rect {x_origin = 999999649, y_origin = -1500, x_size = 351, y_size = -1500}
+            , fragmentPen = (0, -1085)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 26, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 351, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        ]
+    }
diff --git a/.golden/richParagraphLayout/newline2Paragraph.golden b/.golden/richParagraphLayout/newline2Paragraph.golden
new file mode 100644
--- /dev/null
+++ b/.golden/richParagraphLayout/newline2Paragraph.golden
@@ -0,0 +1,27 @@
+ParagraphLayout
+    { paragraphRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -3000}
+    , paragraphFragments =
+        [ Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 1
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}
+            , fragmentRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}
+            , fragmentPen = (0, -1085)
+            , fragmentGlyphs =
+                []
+            }
+        , Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 2
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 1000000000, y_origin = -1500, x_size = 0, y_size = -1500}
+            , fragmentRect = Rect {x_origin = 1000000000, y_origin = -1500, x_size = 0, y_size = -1500}
+            , fragmentPen = (0, -1085)
+            , fragmentGlyphs =
+                []
+            }
+        ]
+    }
diff --git a/.golden/richParagraphLayout/newline2TextParagraph.golden b/.golden/richParagraphLayout/newline2TextParagraph.golden
new file mode 100644
--- /dev/null
+++ b/.golden/richParagraphLayout/newline2TextParagraph.golden
@@ -0,0 +1,39 @@
+ParagraphLayout
+    { paragraphRect = Rect {x_origin = 999999649, y_origin = 0, x_size = 351, y_size = -4500}
+    , paragraphFragments =
+        [ Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 1
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}
+            , fragmentRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}
+            , fragmentPen = (0, -1085)
+            , fragmentGlyphs =
+                []
+            }
+        , Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 2
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 1000000000, y_origin = -1500, x_size = 0, y_size = -1500}
+            , fragmentRect = Rect {x_origin = 1000000000, y_origin = -1500, x_size = 0, y_size = -1500}
+            , fragmentPen = (0, -1085)
+            , fragmentGlyphs =
+                []
+            }
+        , Fragment
+            { fragmentUserData = "text"
+            , fragmentLine = 3
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 999999649, y_origin = -3000, x_size = 351, y_size = -1500}
+            , fragmentRect = Rect {x_origin = 999999649, y_origin = -3000, x_size = 351, y_size = -1500}
+            , fragmentPen = (0, -1085)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 26, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 351, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        ]
+    }
diff --git a/.golden/richParagraphLayout/spaceBoxCollapsed.golden b/.golden/richParagraphLayout/spaceBoxCollapsed.golden
new file mode 100644
--- /dev/null
+++ b/.golden/richParagraphLayout/spaceBoxCollapsed.golden
@@ -0,0 +1,101 @@
+ParagraphLayout
+    { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 590, y_size = -8968}
+    , paragraphFragments =
+        [ Fragment
+            { fragmentUserData = "text1"
+            , fragmentLine = 1
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 446, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 446, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 86, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text1"
+            , fragmentLine = 2
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 589, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 589, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 83, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text1"
+            , fragmentLine = 3
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 522, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 522, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 68, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text1"
+            , fragmentLine = 4
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 465, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 465, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 70, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text1"
+            , fragmentLine = 5
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 559, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 559, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 72, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text3"
+            , fragmentLine = 6
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 589, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 589, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 69, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text3"
+            , fragmentLine = 7
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 590, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 590, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 82, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text3"
+            , fragmentLine = 8
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 511, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 511, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 91, cluster = 14, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 511, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        ]
+    }
diff --git a/.golden/richParagraphLayout/spaceBoxMiddle.golden b/.golden/richParagraphLayout/spaceBoxMiddle.golden
new file mode 100644
--- /dev/null
+++ b/.golden/richParagraphLayout/spaceBoxMiddle.golden
@@ -0,0 +1,48 @@
+ParagraphLayout
+    { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 4635, y_size = -1121}
+    , paragraphFragments =
+        [ Fragment
+            { fragmentUserData = "text1"
+            , fragmentLine = 1
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2581, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2581, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 86, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 83, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 68, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 70, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 72, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text2"
+            , fragmentLine = 1
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 50, boxRightEdge = SpacedEdge 100, boxStartEdge = SpacedEdge 50, boxEndEdge = SpacedEdge 100}
+                ]
+            , fragmentContentRect = Rect {x_origin = 2631, y_origin = 0, x_size = 231, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 2631, y_origin = 0, x_size = 231, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 3, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text3"
+            , fragmentLine = 1
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 2962, y_origin = 0, x_size = 1673, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 2962, y_origin = 0, x_size = 1673, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 69, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 82, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 573, y_advance = 0, x_offset = 0, y_offset = 0})
+                , (GlyphInfo {codepoint = 91, cluster = 14, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 511, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        ]
+    }
diff --git a/.golden/richParagraphLayout/spaceBoxPreserved.golden b/.golden/richParagraphLayout/spaceBoxPreserved.golden
new file mode 100644
--- /dev/null
+++ b/.golden/richParagraphLayout/spaceBoxPreserved.golden
@@ -0,0 +1,113 @@
+ParagraphLayout
+    { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 590, y_size = -10089}
+    , paragraphFragments =
+        [ Fragment
+            { fragmentUserData = "text1"
+            , fragmentLine = 1
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 446, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 446, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 86, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text1"
+            , fragmentLine = 2
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 589, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 589, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 83, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text1"
+            , fragmentLine = 3
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 522, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 522, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 68, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text1"
+            , fragmentLine = 4
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 465, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 465, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 70, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text1"
+            , fragmentLine = 5
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 559, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 559, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 72, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text2"
+            , fragmentLine = 6
+            , fragmentAncestorBoxes =
+                [ AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 50, boxRightEdge = SpacedEdge 100, boxStartEdge = SpacedEdge 50, boxEndEdge = SpacedEdge 100}
+                ]
+            , fragmentContentRect = Rect {x_origin = 50, y_origin = -5605, x_size = 0, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 50, y_origin = -5605, x_size = 0, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                []
+            }
+        , Fragment
+            { fragmentUserData = "text3"
+            , fragmentLine = 7
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 589, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 589, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 69, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text3"
+            , fragmentLine = 8
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 590, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 590, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 82, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        , Fragment
+            { fragmentUserData = "text3"
+            , fragmentLine = 9
+            , fragmentAncestorBoxes =
+                []
+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 511, y_size = -1121}
+            , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 511, y_size = -1121}
+            , fragmentPen = (0, -932)
+            , fragmentGlyphs =
+                [ (GlyphInfo {codepoint = 91, cluster = 14, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 511, y_advance = 0, x_offset = 0, y_offset = 0})
+                ]
+            }
+        ]
+    }
diff --git a/.golden/shapedRuns/intraWordBreak.fontInfo b/.golden/shapedRuns/intraWordBreak.fontInfo
new file mode 100644
--- /dev/null
+++ b/.golden/shapedRuns/intraWordBreak.fontInfo
@@ -0,0 +1,1 @@
+assets/fonts/plex/IBMPlexSansArabic-Regular.ttf 0 32,32 32,32
diff --git a/.golden/shapedRuns/intraWordBreak.golden b/.golden/shapedRuns/intraWordBreak.golden
new file mode 100644
--- /dev/null
+++ b/.golden/shapedRuns/intraWordBreak.golden
@@ -0,0 +1,19 @@
+[ (3, -35, 
+    [ (GlyphInfo {codepoint = 373, cluster = 15, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 24, y_advance = 0, x_offset = 0, y_offset = 0})
+    , (GlyphInfo {codepoint = 971, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 14, y_advance = 0, x_offset = 0, y_offset = 0})
+    , (GlyphInfo {codepoint = 407, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
+    , (GlyphInfo {codepoint = 89, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 18, y_advance = 0, x_offset = 0, y_offset = 0})
+    , (GlyphInfo {codepoint = 1363, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 31, y_advance = 0, x_offset = 0, y_offset = 0})
+    , (GlyphInfo {codepoint = 373, cluster = 4, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 24, y_advance = 0, x_offset = 0, y_offset = 0})
+    , (GlyphInfo {codepoint = 971, cluster = 2, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 14, y_advance = 0, x_offset = 0, y_offset = 0})
+    , (GlyphInfo {codepoint = 407, cluster = 0, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
+    ])
+, (18, -83, 
+    [ (GlyphInfo {codepoint = 1363, cluster = 28, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 31, y_advance = 0, x_offset = 0, y_offset = 0})
+    , (GlyphInfo {codepoint = 373, cluster = 26, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 24, y_advance = 0, x_offset = 0, y_offset = 0})
+    , (GlyphInfo {codepoint = 971, cluster = 24, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 14, y_advance = 0, x_offset = 0, y_offset = 0})
+    , (GlyphInfo {codepoint = 407, cluster = 22, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
+    , (GlyphInfo {codepoint = 89, cluster = 21, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 18, y_advance = 0, x_offset = 0, y_offset = 0})
+    , (GlyphInfo {codepoint = 1363, cluster = 17, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 31, y_advance = 0, x_offset = 0, y_offset = 0})
+    ])
+]
diff --git a/.golden/shapedRuns/mixedDirectionComplexRTL.golden b/.golden/shapedRuns/mixedDirectionComplexRTL.golden
--- a/.golden/shapedRuns/mixedDirectionComplexRTL.golden
+++ b/.golden/shapedRuns/mixedDirectionComplexRTL.golden
@@ -1,31 +1,17 @@
-[ (0, -35, 
-    [ (GlyphInfo {codepoint = 147, cluster = 83, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})
-    , (GlyphInfo {codepoint = 3, cluster = 82, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
-    , (GlyphInfo {codepoint = 90, cluster = 81, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0})
-    , (GlyphInfo {codepoint = 3, cluster = 80, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
-    , (GlyphInfo {codepoint = 517, cluster = 78, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 27, y_advance = 0, x_offset = 0, y_offset = 0})
-    , (GlyphInfo {codepoint = 955, cluster = 76, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 15, y_advance = 0, x_offset = 0, y_offset = 0})
-    , (GlyphInfo {codepoint = 3, cluster = 75, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
-    , (GlyphInfo {codepoint = 147, cluster = 74, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})
-    , (GlyphInfo {codepoint = 3, cluster = 73, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
-    , (GlyphInfo {codepoint = 90, cluster = 72, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0})
-    , (GlyphInfo {codepoint = 3, cluster = 71, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
-    , (GlyphInfo {codepoint = 971, cluster = 69, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 14, y_advance = 0, x_offset = 0, y_offset = 0})
-    , (GlyphInfo {codepoint = 394, cluster = 67, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
-    , (GlyphInfo {codepoint = 3, cluster = 66, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
-    , (GlyphInfo {codepoint = 147, cluster = 65, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})
+[ (7, -35, 
+    [ (GlyphInfo {codepoint = 147, cluster = 65, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})
     , (GlyphInfo {codepoint = 3, cluster = 64, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
     , (GlyphInfo {codepoint = 90, cluster = 63, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0})
     , (GlyphInfo {codepoint = 3, cluster = 62, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
     ])
-, (212, -35, 
+, (51, -35, 
     [ (GlyphInfo {codepoint = 3, cluster = 61, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
     , (GlyphInfo {codepoint = 147, cluster = 60, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})
     , (GlyphInfo {codepoint = 3, cluster = 59, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
     , (GlyphInfo {codepoint = 90, cluster = 58, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0})
     , (GlyphInfo {codepoint = 3, cluster = 57, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
     ])
-, (264, -35, 
+, (103, -35, 
     [ (GlyphInfo {codepoint = 26, cluster = 48, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 11, y_advance = 0, x_offset = 0, y_offset = 0})
     , (GlyphInfo {codepoint = 27, cluster = 49, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 18, y_advance = 0, x_offset = 0, y_offset = 0})
     , (GlyphInfo {codepoint = 3, cluster = 50, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
@@ -36,7 +22,7 @@
     , (GlyphInfo {codepoint = 27, cluster = 55, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 18, y_advance = 0, x_offset = 0, y_offset = 0})
     , (GlyphInfo {codepoint = 26, cluster = 56, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 11, y_advance = 0, x_offset = 0, y_offset = 0})
     ])
-, (374, -35, 
+, (213, -35, 
     [ (GlyphInfo {codepoint = 3, cluster = 47, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
     , (GlyphInfo {codepoint = 147, cluster = 46, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})
     , (GlyphInfo {codepoint = 3, cluster = 45, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
@@ -57,14 +43,14 @@
     , (GlyphInfo {codepoint = 90, cluster = 26, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0})
     , (GlyphInfo {codepoint = 3, cluster = 25, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
     ])
-, (581, -35, 
+, (420, -35, 
     [ (GlyphInfo {codepoint = 3, cluster = 24, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
     , (GlyphInfo {codepoint = 147, cluster = 23, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})
     , (GlyphInfo {codepoint = 3, cluster = 22, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
     , (GlyphInfo {codepoint = 90, cluster = 21, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0})
     , (GlyphInfo {codepoint = 3, cluster = 20, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
     ])
-, (633, -35, 
+, (472, -35, 
     [ (GlyphInfo {codepoint = 4, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 17, y_advance = 0, x_offset = 0, y_offset = 0})
     , (GlyphInfo {codepoint = 6, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})
     , (GlyphInfo {codepoint = 3, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
@@ -75,10 +61,25 @@
     , (GlyphInfo {codepoint = 6, cluster = 18, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})
     , (GlyphInfo {codepoint = 4, cluster = 19, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 17, y_advance = 0, x_offset = 0, y_offset = 0})
     ])
-, (757, -35, 
+, (596, -35, 
     [ (GlyphInfo {codepoint = 3, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
     , (GlyphInfo {codepoint = 147, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})
     , (GlyphInfo {codepoint = 3, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
     , (GlyphInfo {codepoint = 90, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0})
+    ])
+, (480, -83, 
+    [ (GlyphInfo {codepoint = 147, cluster = 83, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})
+    , (GlyphInfo {codepoint = 3, cluster = 82, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
+    , (GlyphInfo {codepoint = 90, cluster = 81, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0})
+    , (GlyphInfo {codepoint = 3, cluster = 80, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
+    , (GlyphInfo {codepoint = 517, cluster = 78, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 27, y_advance = 0, x_offset = 0, y_offset = 0})
+    , (GlyphInfo {codepoint = 955, cluster = 76, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 15, y_advance = 0, x_offset = 0, y_offset = 0})
+    , (GlyphInfo {codepoint = 3, cluster = 75, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
+    , (GlyphInfo {codepoint = 147, cluster = 74, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})
+    , (GlyphInfo {codepoint = 3, cluster = 73, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
+    , (GlyphInfo {codepoint = 90, cluster = 72, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0})
+    , (GlyphInfo {codepoint = 3, cluster = 71, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
+    , (GlyphInfo {codepoint = 971, cluster = 69, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 14, y_advance = 0, x_offset = 0, y_offset = 0})
+    , (GlyphInfo {codepoint = 394, cluster = 67, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})
     ])
 ]
diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,38 @@
 # Revision history for Balkón
 
+## 1.2.0.0 -- 2023-06-28
+
+* Added options for horizontal paragraph alignment:
+  start, end, left, right, centre.
+
+    * For backwards compatibility, left alignment remains the default.
+      Consider updating your code to use start alignment instead.
+
+* Added option to prevent making boxes invisible when they contain no glyphs
+  and no forced (hard) line breaks.
+
+* Added `fragmentContentRect` to provide a popular (though unstandardised)
+  way of determining the content area of inline elements.
+
+* Added function `paragraphSafeWidth` to help calculating max-content width
+  for CSS.
+
+* Trimmed white space at the beginning and end of lines may now generate
+  fragments with zero glyphs, to more closely match CSS behaviour.
+  These fragments may affect line height and/or the start edge of boxes.
+
+* Text will now overflow the end edge of the paragraph according to the
+  text direction of the root box, instead of always overflowing the right edge.
+
+* Fixed a bug where only the height of the shortest fragment on a line
+  would be considered when positioning the following line.
+
+* Removed `paragraphLineHeight` from the rich text interface
+  after it was included by mistake.
+  Rich text needs to use `textLineHeight` instead.
+
+* Exposed functions for calculating rectangle unions.
+
 ## 1.1.0.0 -- 2023-05-31
 
 * Updated support for bidirectional text:
diff --git a/balkon.cabal b/balkon.cabal
--- a/balkon.cabal
+++ b/balkon.cabal
@@ -14,7 +14,7 @@
 -- PVP summary:     +-+------- breaking API changes
 --                  | | +----- non-breaking API additions
 --                  | | | +--- code changes with no API change
-version:            1.1.0.0
+version:            1.2.0.0
 
 stability:          experimental
 
@@ -114,7 +114,9 @@
         Data.Text.ParagraphLayout.Internal.LineHeight,
         Data.Text.ParagraphLayout.Internal.LinePagination,
         Data.Text.ParagraphLayout.Internal.Paginable,
+        Data.Text.ParagraphLayout.Internal.ParagraphAlignment,
         Data.Text.ParagraphLayout.Internal.ParagraphConstruction,
+        Data.Text.ParagraphLayout.Internal.ParagraphLine,
         Data.Text.ParagraphLayout.Internal.ParagraphOptions,
         Data.Text.ParagraphLayout.Internal.Plain,
         Data.Text.ParagraphLayout.Internal.Plain.Paragraph,
@@ -136,12 +138,13 @@
     -- Modules used purely internally and not in any tests.
     other-modules:
         Data.Text.ParagraphLayout.Internal.Layout,
+        Data.Text.ParagraphLayout.Internal.LineNumbers,
         Data.Text.ParagraphLayout.Internal.ParagraphExtents,
-        Data.Text.ParagraphLayout.Internal.ParagraphLine,
         Data.Text.ParagraphLayout.Internal.ProtoFragment,
         Data.Text.ParagraphLayout.Internal.ProtoLine,
         Data.Text.ParagraphLayout.Internal.ProtoRun,
-        Data.Text.ParagraphLayout.Internal.Script
+        Data.Text.ParagraphLayout.Internal.Script,
+        Data.Text.ParagraphLayout.Internal.SplitList
 
     build-depends:
         base >=4.12 && < 4.16,
diff --git a/lib/Data/Text/ParagraphLayout/Rect.hs b/lib/Data/Text/ParagraphLayout/Rect.hs
--- a/lib/Data/Text/ParagraphLayout/Rect.hs
+++ b/lib/Data/Text/ParagraphLayout/Rect.hs
@@ -10,6 +10,10 @@
     , y_max
     , y_min
     , y_terminus
+    , union
+    , unionMany
+    , unionMany1
+    , Bias (LL, LH, HL, HH)
     )
 where
 
diff --git a/lib/Data/Text/ParagraphLayout/Rich.hs b/lib/Data/Text/ParagraphLayout/Rich.hs
--- a/lib/Data/Text/ParagraphLayout/Rich.hs
+++ b/lib/Data/Text/ParagraphLayout/Rich.hs
@@ -5,6 +5,14 @@
     -- * Input paragraph
     ( Paragraph (Paragraph)
     , constructParagraph
+    , ParagraphAlignment
+        ( AlignStart
+        , AlignEnd
+        , AlignLeft
+        , AlignRight
+        , AlignCentreH
+        )
+    , BoxCollapse (AllowBoxCollapse, AvoidBoxCollapse)
     , BoxSpacing (BoxSpacingLeftRight)
     , LineHeight (Absolute, Normal)
     , ParagraphOptions
@@ -12,7 +20,7 @@
     -- ** Paragraph options
     -- | These are record selectors that can be used for reading
     -- as well as updating specific option fields.
-    , paragraphLineHeight
+    , paragraphAlignment
     , paragraphMaxWidth
     -- NOTE: `paragraphFont` is only used by the legacy plain text interface,
     --       and is therefore not exported here.
@@ -20,6 +28,8 @@
     , RootNode (RootBox)
     , InnerNode (InlineBox, TextSequence)
     , Box (Box)
+    , EmptyText
+    , strut
     , BoxOptions
     , defaultBoxOptions
     , TextOptions
@@ -28,6 +38,8 @@
     -- | These are record selectors that can be used for reading
     -- as well as updating specific option fields.
     , boxSpacing
+    , boxCollapse
+    , activateBoxSpacing
     -- ** Text options
     -- | These are record selectors that can be used for reading
     -- as well as updating specific option fields.
@@ -42,11 +54,13 @@
     -- * Output layout
     , layoutRich
     , ParagraphLayout (ParagraphLayout, paragraphRect, paragraphFragments)
+    , paragraphSafeWidth
     , Fragment
         ( Fragment
         , fragmentUserData
         , fragmentLine
         , fragmentAncestorBoxes
+        , fragmentContentRect
         , fragmentRect
         , fragmentPen
         , fragmentGlyphs
@@ -68,6 +82,7 @@
 import Data.Text.ParagraphLayout.Internal.BoxOptions
 import Data.Text.ParagraphLayout.Internal.Fragment
 import Data.Text.ParagraphLayout.Internal.LineHeight
+import Data.Text.ParagraphLayout.Internal.ParagraphAlignment
 import Data.Text.ParagraphLayout.Internal.ParagraphOptions
 import Data.Text.ParagraphLayout.Internal.Rich
 import Data.Text.ParagraphLayout.Internal.Rich.Paragraph
diff --git a/src/Data/Text/ParagraphLayout/Internal/BiDiLevels.hs b/src/Data/Text/ParagraphLayout/Internal/BiDiLevels.hs
--- a/src/Data/Text/ParagraphLayout/Internal/BiDiLevels.hs
+++ b/src/Data/Text/ParagraphLayout/Internal/BiDiLevels.hs
@@ -2,6 +2,8 @@
     ( Level
     , TextLevels (TextLevels)
     , WithLevel
+    , baseLevel
+    , directionLevel
     , dropLevels
     , firstStrongDirection
     , headLevel
@@ -27,22 +29,28 @@
 class WithLevel a where
     level :: a -> Level
 
--- | BiDi levels for each character from a given input text.
+-- | BiDi levels for each character from a given input text,
+-- plus the base level (for safe handling of empty text runs).
 --
 -- This wrapper is meant to ease the transition to a different internal
 -- representation, if required when integrating with the ICU.
-newtype TextLevels = TextLevels [Level]
+data TextLevels = TextLevels [Level] Level
     deriving (Eq, Show)
 
 headLevel :: TextLevels -> Level
-headLevel (TextLevels xs) = head xs
+headLevel (TextLevels xs base) = case xs of
+    [] -> base
+    (x : _) -> x
 
 tailLevels :: TextLevels -> TextLevels
-tailLevels (TextLevels xs) = TextLevels (tail xs)
+tailLevels (TextLevels xs base) = TextLevels (tail xs) base
 
 dropLevels :: Int -> TextLevels -> TextLevels
-dropLevels n (TextLevels xs) = TextLevels (drop n xs)
+dropLevels n (TextLevels xs base) = TextLevels (drop n xs) base
 
+baseLevel :: TextLevels -> Level
+baseLevel (TextLevels _ base) = base
+
 -- | Determine the BiDi level of each character in the input text
 -- using a simplified algorithm with the following main limitations:
 --
@@ -56,25 +64,26 @@
 --
 -- TODO: Use Haskell bindings to the ICU BiDi implementation once available.
 textLevels :: Direction -> Text -> TextLevels
-textLevels baseDir txt = TextLevels $ textLevels' baseLevel baseLevel 0 txt
+textLevels baseDir txt =
+    TextLevels (textLevels' base base 0 txt) base
     where
-        baseLevel = directionLevel 0 baseDir
+        base = directionLevel 0 baseDir
 
 -- | Determine the BiDi level of each character in the input text
 -- using a simplified algorithm.
 textLevels' :: Level -> Level -> Int -> Text -> [Level]
-textLevels' baseLevel previousLevel neutrals txt = case uncons txt of
-    Just (char, rest) -> case charLevel baseLevel char of
+textLevels' base previousLevel neutrals txt = case uncons txt of
+    Just (char, rest) -> case charLevel base char of
         Just currentLevel ->
-            replicate neutrals (mergeLevel baseLevel previousLevel currentLevel)
+            replicate neutrals (mergeLevel base previousLevel currentLevel)
             ++
             currentLevel
             :
-            textLevels' baseLevel currentLevel 0 rest
+            textLevels' base currentLevel 0 rest
         Nothing ->
-            textLevels' baseLevel previousLevel (neutrals + 1) rest
+            textLevels' base previousLevel (neutrals + 1) rest
     Nothing ->
-        replicate neutrals baseLevel
+        replicate neutrals base
 
 -- | Determine the level of a neutral character based on its surrounding levels.
 mergeLevel :: Level -> Level -> Level -> Level
@@ -94,12 +103,12 @@
 -- | Determine the BiDi level of one character
 -- using a simplified algorithm.
 charLevel :: Level -> Char -> Maybe Level
-charLevel baseLevel c = case simpleType c of
-    StrongLTR -> Just $ directionLevel baseLevel DirLTR
-    StrongRTL -> Just $ directionLevel baseLevel DirRTL
-    Number -> Just $ directionLevel (baseLevel + 1) DirLTR
+charLevel base c = case simpleType c of
+    StrongLTR -> Just $ directionLevel base DirLTR
+    StrongRTL -> Just $ directionLevel base DirRTL
+    Number -> Just $ directionLevel (base + 1) DirLTR
     Neutral -> Nothing
-    Reset -> Just baseLevel
+    Reset -> Just base
 
 -- | Reduce the character's BiDi class into a simpler category
 -- for the purposes of the simplified algorithm.
diff --git a/src/Data/Text/ParagraphLayout/Internal/BoxOptions.hs b/src/Data/Text/ParagraphLayout/Internal/BoxOptions.hs
--- a/src/Data/Text/ParagraphLayout/Internal/BoxOptions.hs
+++ b/src/Data/Text/ParagraphLayout/Internal/BoxOptions.hs
@@ -1,6 +1,8 @@
 module Data.Text.ParagraphLayout.Internal.BoxOptions
-    ( BoxOptions (..)
+    ( BoxCollapse (..)
+    , BoxOptions (..)
     , BoxSpacing (..)
+    , activateBoxSpacing
     , defaultBoxOptions
     )
 where
@@ -20,7 +22,16 @@
     --
     -- This can be used to reserve space for a left margin, border,
     -- and/or padding.
+    --
+    -- In order to get CSS-compliant behaviour, consider using
+    -- `activateBoxSpacing` instead.
 
+    , boxCollapse :: BoxCollapse
+    -- ^ Determines how this box affects the height of a line that would
+    -- otherwise be empty.
+
+    -- TODO: textVerticalAlign
+
     }
     deriving (Eq)
 
@@ -45,8 +56,56 @@
 
     deriving (Eq, Show, Read)
 
+-- | Determines how an inline box affects the height of a line that would
+-- otherwise be empty.
+--
+-- Note that for this setting to have any effect, the box must be the ancestor
+-- of at least one (possibly empty) text sequence, so that it can generate
+-- a `Data.Text.ParagraphLayout.Rich.Fragment`.
+--
+-- For CSS-compliant behaviour:
+--
+-- - Ensure that empty boxes contain empty text sequences as mentioned above.
+--   This can be achieved using the `Data.Text.ParagraphLayout.Rich.strut`
+--   function.
+--
+-- - Set `AllowBoxCollapse` for boxes with zero margins, padding,
+--   and borders.
+--
+-- - Set `AvoidBoxCollapse` for boxes with non-zero margins, padding,
+--   or borders.
+--
+-- Note that `BoxSpacing` may contain zero values even when calculated from
+-- non-zero CSS values, because of rounding to integer values and/or because
+-- of adding together positive and negative values that cancel out. You should
+-- therefore compare the individual computed values for margins, padding, and
+-- borders with zero, and set `boxCollapse` to `AllowBoxCollapse` if and only
+-- if all these values are equal to zero.
+data BoxCollapse
+
+    = AllowBoxCollapse
+    -- ^ The box should disappear when possible to make empty lines invisible.
+
+    | AvoidBoxCollapse
+    -- ^ The box should be preserved when possible, making lines visible
+    -- even when they would otherwise be empty.
+
+    deriving (Eq, Read, Show)
+
 -- | `BoxOptions` with default values.
 defaultBoxOptions :: BoxOptions
 defaultBoxOptions = BoxOptions
     { boxSpacing = BoxSpacingLeftRight 0 0
+    , boxCollapse = AllowBoxCollapse
+    }
+
+-- | Shorthand for updating `boxSpacing` and setting `boxCollapse`
+-- to `AvoidBoxCollapse`.
+--
+-- Can be used to activate CSS-compliant rendering of empty boxes whose
+-- spacing is calculated from non-zero values.
+activateBoxSpacing :: BoxSpacing -> BoxOptions -> BoxOptions
+activateBoxSpacing spacing boxOptions = boxOptions
+    { boxSpacing = spacing
+    , boxCollapse = AvoidBoxCollapse
     }
diff --git a/src/Data/Text/ParagraphLayout/Internal/Break.hs b/src/Data/Text/ParagraphLayout/Internal/Break.hs
--- a/src/Data/Text/ParagraphLayout/Internal/Break.hs
+++ b/src/Data/Text/ParagraphLayout/Internal/Break.hs
@@ -8,6 +8,7 @@
 module Data.Text.ParagraphLayout.Internal.Break
     ( LineBreak (..)
     , locale
+    , breaksAsc
     , breaksDesc
     , subOffsetsDesc
     )
@@ -19,7 +20,9 @@
     ( Break
     , Breaker
     , LocaleName (Locale)
+    , breaks
     , breaksRight
+    , brkBreak
     , brkPrefix
     , brkStatus
     )
@@ -49,6 +52,16 @@
         -- This filter is here just to stop syntactically incorrect input.
         clean = takeWhile (`elem` ['A' .. 'Z'] ++ ['a' .. 'z'] ++ "_-")
 
+-- | List of all breaks in the given text, with offsets in ascending order,
+-- including the status of the break if applicable.
+--
+-- Excludes the start of the text (with offset 0).
+--
+-- Includes the end of the text (with offset equal to the text length)
+-- as the last list item.
+breaksAsc :: Breaker a -> Text -> [(Int, a)]
+breaksAsc breaker input = map brkEndOffsetStatus $ breaks breaker input
+
 -- | List of all breaks in the given text, with offsets in descending order,
 -- including the status of the break if applicable.
 --
@@ -61,11 +74,20 @@
 brkStartOffsetStatus :: Break a -> (Int, a)
 brkStartOffsetStatus brk = (brkStartOffset brk, brkStatus brk)
 
+brkEndOffsetStatus :: Break a -> (Int, a)
+brkEndOffsetStatus brk = (brkEndOffset brk, brkStatus brk)
+
 -- | The ICU library returns "breaks" as slices of text with two boundaries.
 -- This gives the smaller of the two distances from the start of the text
 -- to the boundaries of the break.
 brkStartOffset :: Break a -> Int
 brkStartOffset brk = lengthWord8 (brkPrefix brk)
+
+-- | The ICU library returns "breaks" as slices of text with two boundaries.
+-- This gives the larger of the two distances from the start of the text
+-- to the boundaries of the break.
+brkEndOffset :: Break a -> Int
+brkEndOffset brk = lengthWord8 (brkPrefix brk) + lengthWord8 (brkBreak brk)
 
 -- | Given a list of offsets into a text in descending order, produce a list of
 -- corresponding offsets into a slice of the text starting at a given offset.
diff --git a/src/Data/Text/ParagraphLayout/Internal/Fragment.hs b/src/Data/Text/ParagraphLayout/Internal/Fragment.hs
--- a/src/Data/Text/ParagraphLayout/Internal/Fragment.hs
+++ b/src/Data/Text/ParagraphLayout/Internal/Fragment.hs
@@ -3,6 +3,7 @@
     , ShapedRun
     , fragmentSpacedRect
     , shapedRun
+    , shiftFragment
     )
 where
 
@@ -36,6 +37,15 @@
     -- (starting from the nearest ancestor and continuing upwards through the
     -- tree, up to but excluding the root) and the spacing required by them.
 
+    , fragmentContentRect :: Rect Int32
+    -- ^ Physical position of the fragment within the paragraph, calculated
+    -- using all glyph advances in this fragment and the used font's ascent
+    -- and descent metrics.
+    --
+    -- This is commonly used as the /content area/ of inline elements in
+    -- web browsers, although this behaviour is not specified in CSS 2
+    -- nor in CSS Inline Layout Module Level 3.
+
     , fragmentRect :: Rect Int32
     -- ^ Physical position of the fragment within the paragraph, calculated
     -- using all glyph advances in this fragment and the calculated line height.
@@ -52,7 +62,10 @@
     --
     -- The origin coordinates are relative to the paragraph.
     --
-    -- This is the CSS equivalent of /content box/, before adding box spacing.
+    -- The vertical extent of this rectangle is the equivalent of
+    -- /layout bounds/ defined by CSS.
+    --
+    -- Box spacing is not included.
 
     , fragmentPen :: (Int32, Int32)
     -- ^ Coordinates of the initial pen position, from which the first glyph
@@ -95,4 +108,15 @@
         y = y_origin r + py
         g = fragmentGlyphs f
         (px, py) = fragmentPen f
+        r = fragmentRect f
+
+-- | Add @dx@ and @dy@ to the fragment's `x_origin` and `y_origin`,
+-- respectively.
+shiftFragment :: Int32 -> Int32 -> Fragment d -> Fragment d
+shiftFragment dx dy f = f'
+    where
+        f' = f { fragmentContentRect = cr', fragmentRect = r' }
+        cr' = cr { x_origin = x_origin r + dx, y_origin = y_origin r + dy }
+        cr = fragmentContentRect f
+        r' = r { x_origin = x_origin r + dx, y_origin = y_origin r + dy }
         r = fragmentRect f
diff --git a/src/Data/Text/ParagraphLayout/Internal/Layout.hs b/src/Data/Text/ParagraphLayout/Internal/Layout.hs
--- a/src/Data/Text/ParagraphLayout/Internal/Layout.hs
+++ b/src/Data/Text/ParagraphLayout/Internal/Layout.hs
@@ -10,12 +10,12 @@
 import Data.List (mapAccumL)
 import Data.List.NonEmpty (NonEmpty ((:|)), nonEmpty, (<|))
 import qualified Data.List.NonEmpty as NonEmpty
-import Data.Maybe (catMaybes, fromMaybe)
+import Data.Maybe (fromMaybe)
 import Data.Text.Foreign (lengthWord8)
 import Data.Text.Glyphize
     ( Buffer (..)
     , ContentType (ContentTypeUnicode)
-    , Direction (DirLTR, DirRTL)
+    , Direction (DirLTR, DirRTL, DirTTB, DirBTT)
     , FontExtents (..)
     , GlyphInfo
     , GlyphPos
@@ -32,6 +32,7 @@
 import Data.Text.ParagraphLayout.Internal.Break
 import Data.Text.ParagraphLayout.Internal.Fragment
 import Data.Text.ParagraphLayout.Internal.LineHeight
+import Data.Text.ParagraphLayout.Internal.ParagraphAlignment
 import Data.Text.ParagraphLayout.Internal.ParagraphExtents
 import qualified Data.Text.ParagraphLayout.Internal.ProtoFragment as PF
 import qualified Data.Text.ParagraphLayout.Internal.ProtoLine as PL
@@ -39,6 +40,7 @@
 import qualified Data.Text.ParagraphLayout.Internal.ResolvedBox as RB
 import qualified Data.Text.ParagraphLayout.Internal.ResolvedSpan as RS
 import Data.Text.ParagraphLayout.Internal.Run
+import Data.Text.ParagraphLayout.Internal.SplitList
 import Data.Text.ParagraphLayout.Internal.TextContainer
 import Data.Text.ParagraphLayout.Internal.TextOptions
 import Data.Text.ParagraphLayout.Internal.WithSpan
@@ -54,32 +56,34 @@
 -- necessary to fit within the requested line width.
 --
 -- The output is a flat list of fragments positioned in both dimensions.
-layoutAndAlignLines :: Int32 -> NonEmpty (WithSpan d Run) ->
-    [FragmentWithSpan d]
-layoutAndAlignLines maxWidth runs = frags
+layoutAndAlignLines
+    :: Direction
+    -> ParagraphAlignment
+    -> Int32
+    -> NonEmpty (WithSpan d Run)
+    -> [FragmentWithSpan d]
+layoutAndAlignLines dir align maxWidth runs = frags
     where
-        frags = concatMap NonEmpty.toList fragsInLines
-        (_, fragsInLines) = mapAccumL positionLineH originY numberedLines
+        frags = concatMap toList fragsInLines
+        (_, fragsInLines) = mapAccumL positionLine originY numberedLines
+        positionLine = positionLineH dir align maxWidth
         numberedLines = zip [1 ..] canonicalLines
-        canonicalLines = fmap reorderProtoFragments logicalLines
-        logicalLines = nonEmptyItems $ layoutLines maxWidth [] runs
+        canonicalLines = fmap reorderProtoFragments visibleLines
+        visibleLines = filter PL.visible logicalLines
+        logicalLines = toList $ layoutLines maxWidth [] runs
         originY = paragraphOriginY
 
 reorderProtoFragments :: PL.ProtoLine NonEmpty d -> PL.ProtoLine NonEmpty d
 reorderProtoFragments pl@(PL.ProtoLine { PL.protoFragments = pfs }) =
     pl { PL.protoFragments = reorder pfs }
 
-nonEmptyItems :: Foldable t =>
-    t (PL.ProtoLine [] d) -> [PL.ProtoLine NonEmpty d]
-nonEmptyItems = catMaybes . map PL.nonEmpty . toList
-
 -- | Create a multi-line layout from the given runs, splitting them as
 -- necessary to fit within the requested line width.
 --
 -- The output is a two-dimensional list of fragments positioned along the
 -- horizontal axis.
 layoutLines :: Int32 -> [RB.ResolvedBox d] -> NonEmpty (WithSpan d Run) ->
-    NonEmpty (PL.ProtoLine [] d)
+    NonEmpty (PL.ProtoLine NonEmpty d)
 layoutLines maxWidth openBoxes runs = case nonEmpty rest of
         -- Everything fits. We are done.
         Nothing -> fitting :| []
@@ -87,12 +91,9 @@
         Just runs' -> fitting <| layoutLines maxWidth openBoxes' runs'
     where
         (fitting, rest) = layoutAndWrapRunsH maxWidth openBoxes runs
-        -- Update the list of open boxes using the logically last run on this
-        -- line, if there is one.
-        openBoxes' =
-            openBoxes `fromMaybe` lastSpanBoxes (PL.protoFragments fitting)
-
--- TODO: Allow a run across multiple spans (e.g. if they only differ by colour).
+        -- Update the list of open boxes using the logically last run
+        -- on this line.
+        openBoxes' = lastSpanBoxes $ PL.protoFragments fitting
 
 -- | Position all the given horizontal fragments on the same line,
 -- using @originY@ as its top edge, and return the bottom edge for continuation.
@@ -101,16 +102,58 @@
 -- @vertical-align: top@ in CSS.
 --
 -- TODO: For rich text, allow other types of vertical alignment.
-positionLineH :: Int32 -> (Int, PL.ProtoLine NonEmpty d) ->
-    (Int32, NonEmpty (FragmentWithSpan d))
-positionLineH originY (num, pl) = (nextY, frags)
+positionLineH
+    :: Direction
+    -> ParagraphAlignment
+    -> Int32
+    -> Int32
+    -> (Int, PL.ProtoLine NonEmpty d)
+    -> (Int32, NonEmpty (FragmentWithSpan d))
+positionLineH dir align maxWidth originY (num, pl) = (nextY, frags)
     where
-        nextY = maximum $ fmap y_min rects
+        nextY = minimum $ fmap y_min rects
         rects = fmap (\ (WithSpan _ r) -> fragmentRect r) frags
         (_, frags) = mapAccumL (positionFragmentH num originY) originX wpfs
         wpfs = PL.applyBoxes pl
-        originX = paragraphOriginX
+        originX = paragraphOriginX + if lineWidth > maxWidth
+            then overflowingLineOffset dir (lineWidth - maxWidth)
+            else fittingLineOffset align dir (maxWidth - lineWidth)
+        lineWidth = PL.width pl
 
+-- | Inline offset of the first fragment on a line that overflows.
+overflowingLineOffset :: Direction -> Int32 -> Int32
+overflowingLineOffset DirLTR _ = 0
+overflowingLineOffset DirTTB _ = 0
+overflowingLineOffset DirRTL excess = -excess
+-- TODO: Check if the sign needs to be flipped for vertical text.
+overflowingLineOffset DirBTT excess = -excess
+
+-- | Inline offset of the first fragment on a line with extra blank space.
+fittingLineOffset :: ParagraphAlignment -> Direction -> Int32 -> Int32
+fittingLineOffset AlignLeft _ = leftAlignOffset
+fittingLineOffset AlignRight _ = rightAlignOffset
+fittingLineOffset AlignCentreH _ = centreAlignOffset
+fittingLineOffset AlignStart DirLTR = leftAlignOffset
+fittingLineOffset AlignEnd DirLTR = rightAlignOffset
+fittingLineOffset AlignStart DirRTL = rightAlignOffset
+fittingLineOffset AlignEnd DirRTL = leftAlignOffset
+-- For completeness, treat vertical directions as horizontal directions
+-- rotated 90° clockwise, thus left becomes top and right becomes bottom.
+-- TODO: Verify this when vertical text is implemented.
+fittingLineOffset AlignStart DirTTB = leftAlignOffset
+fittingLineOffset AlignEnd DirTTB = rightAlignOffset
+fittingLineOffset AlignStart DirBTT = rightAlignOffset
+fittingLineOffset AlignEnd DirBTT = leftAlignOffset
+
+leftAlignOffset :: Int32 -> Int32
+leftAlignOffset _ = 0
+
+rightAlignOffset :: Int32 -> Int32
+rightAlignOffset slack = slack
+
+centreAlignOffset :: Int32 -> Int32
+centreAlignOffset slack = slack `div` 2
+
 -- | Position the given horizontal fragment on a line,
 -- using @originY@ as its top edge and @originX@ as its left edge,
 -- returning the X coordinate of its right edge for continuation.
@@ -124,9 +167,19 @@
         contentWidth = PF.advance pf
         leftSpacing = totalLeftSpacing bs
         rightSpacing = totalRightSpacing bs
-        frag = Fragment userData line bs rect (penX, penY) (PF.glyphs pf)
+        frag = Fragment
+            { fragmentUserData = userData
+            , fragmentLine = line
+            , fragmentAncestorBoxes = bs
+            , fragmentContentRect = contentRect
+            , fragmentRect = rect
+            , fragmentPen = (penX, penY)
+            , fragmentGlyphs = (PF.glyphs pf)
+            }
         userData = RS.spanUserData rs
         bs = ancestorBoxes lbs rbs rs
+        contentRect = Rect contentX contentY contentWidth (-normalLineHeight)
+        contentY = originY + penY + ascent
         rect = Rect contentX originY contentWidth (-lineHeight)
         penX = 0
         penY = descent + leading `div` 2 - lineHeight
@@ -183,7 +236,7 @@
     :: Int32
     -> [RB.ResolvedBox d]
     -> NonEmpty (WithSpan d Run)
-    -> (PL.ProtoLine [] d, [WithSpan d Run])
+    -> (PL.ProtoLine NonEmpty d, [WithSpan d Run])
 layoutAndWrapRunsH maxWidth prevOpenBoxes runs = NonEmpty.head $ validProtoLines
     where
         validProtoLines = dropWhile1 tooLong layouts
@@ -202,9 +255,9 @@
 -- to determine `PL.nextOpenBoxes`.
 protoLine
     :: [RB.ResolvedBox d]
-    -> [ProtoFragmentWithSpan d]
+    -> NonEmpty (ProtoFragmentWithSpan d)
     -> [WithSpan d Run]
-    -> PL.ProtoLine [] d
+    -> PL.ProtoLine NonEmpty d
 protoLine prev pfs rest = PL.ProtoLine pfs prev next
     where
         next = [] `fromMaybe` firstSpanBoxes rest
@@ -214,10 +267,9 @@
     [] -> Nothing
     (WithSpan rs _) : _ -> Just $ RS.spanBoxes rs
 
-lastSpanBoxes :: [WithSpan d a] -> Maybe [RB.ResolvedBox d]
-lastSpanBoxes xs = case reverse xs of
-    [] -> Nothing
-    (WithSpan rs _) : _ -> Just $ RS.spanBoxes rs
+lastSpanBoxes :: NonEmpty (WithSpan d a) -> [RB.ResolvedBox d]
+lastSpanBoxes xs = case NonEmpty.last xs of
+    WithSpan rs _ -> RS.spanBoxes rs
 
 -- | Treat a list of runs as a contiguous sequence, and split them into two
 -- lists so that the first list contains as many non-whitespace characters as
@@ -228,25 +280,39 @@
 -- output list will contain a run of zero characters. This can be used to
 -- correctly size an empty line.
 --
+-- If there is a hard line break in the input, the run containing it will have
+-- its `runHardBreak` set to `True`.
+--
 -- If there is no hard line break in the input, the first output list will
 -- contain the whole input, and the second output list will be empty.
-hardSplit :: NonEmpty (WithSpan d Run) -> ([WithSpan d Run], [WithSpan d Run])
-hardSplit runs = allowFstEmpty $ trimFst $ NonEmpty.last $ splits
+hardSplit :: NonEmpty (WithSpan d Run) ->
+    (NonEmpty (WithSpan d Run), [WithSpan d Run])
+hardSplit runs = case reverse hSplits of
+    [] -> noSplit
+    (splitRuns : _) -> forcedSplit splitRuns
     where
-        trimFst (runs1, runs2) = (trim runs1, runs2)
+        noSplit = (trim runs, [])
+        forcedSplit (runs1, runs2) = (markHard $ trim runs1, runs2)
+        markHard = mapLast markHard'
+        markHard' (WithSpan rs x) = WithSpan rs x { runHardBreak = True }
         trim
-            = trimTextsStartPreserve isStartSpace
-            . trimTextsEndPreserve isEndSpace
-            . trimTextsEndPreserve isNewline
+            = dropWhileStartCascade isStartSpace
+            . dropWhileEndCascade isEndSpace
+            . dropWhileEndCascade isNewline
         -- TODO: Consider optimising.
         --       We do not need to look for any line breaks further than the
         --       shortest hard break.
-        splits = noSplit :| map allowSndEmpty hSplits
-        noSplit = (runs, [])
-        hSplits = -- from longest to shortest
+        hSplits = nonEmptyFsts $
+            -- from longest to shortest
             splitTextsBy (map fst . filter isHard . runLineBreaks) runs
         isHard (_, status) = status == BreakStatus.Hard
 
+-- | Apply a function to the last element of the non-empty list.
+mapLast :: (a -> a) -> NonEmpty a -> NonEmpty a
+mapLast f xs = case NonEmpty.uncons xs of
+    (x, Nothing) -> f x :| []
+    (x, Just rest) -> NonEmpty.cons x $ mapLast f rest
+
 -- | Treat a list of runs as a contiguous sequence,
 -- and find all possible ways to split them into two non-empty lists,
 -- using soft line break opportunities (typically after words) and then
@@ -260,23 +326,21 @@
 -- closer to the start of the list are preferred for line breaking, but without
 -- considering overflows.
 softSplits :: NonEmpty (WithSpan d Run) ->
-    [([WithSpan d Run], [WithSpan d Run])]
+    [(NonEmpty (WithSpan d Run), [WithSpan d Run])]
 softSplits runs = map (allowSndEmpty . trimFst) splits
     where
         trimFst (runs1, runs2) = (trim runs1, runs2)
-        trim = trimTextsStart isStartSpace . trimTextsEnd isEndSpace
+        trim
+            = dropWhileStartCascade isStartSpace
+            . dropWhileEndCascade isEndSpace
         splits = lSplits ++ cSplits
-        lSplits = splitTextsBy (map fst . runLineBreaks) runs
+        lSplits = nonEmptyPairs $
+            splitTextsBy (map fst . runLineBreaks) runs
         -- TODO: Consider optimising.
         --       We do not need to look for character breaks further than the
         --       shortest line break.
-        cSplits = splitTextsBy (map fst . runCharacterBreaks) runs
-
-allowFstEmpty :: (NonEmpty a, b) -> ([a], b)
-allowFstEmpty (a, b) = (NonEmpty.toList a, b)
-
-allowSndEmpty :: (a, NonEmpty b) -> (a, [b])
-allowSndEmpty (a, b) = (a, NonEmpty.toList b)
+        cSplits = nonEmptyPairs $
+            splitTextsBy (map fst . runCharacterBreaks) runs
 
 -- | The suffix remaining after removing the longest prefix of the list for
 -- which the predicate holds, except always including at least the last element
@@ -290,17 +354,18 @@
 
 -- | Calculate layout for multiple horizontal runs on the same line, without
 -- any breaking.
-layoutRunsH :: [WithSpan d Run] -> [ProtoFragmentWithSpan d]
-layoutRunsH runs = map layoutRunH runs
+layoutRunsH :: Functor f => f (WithSpan d Run) -> f (ProtoFragmentWithSpan d)
+layoutRunsH runs = fmap layoutRunH runs
 
 -- | Calculate layout for the given horizontal run and attach extra information.
 layoutRunH :: WithSpan d Run -> ProtoFragmentWithSpan d
 layoutRunH (WithSpan rs run) = WithSpan rs pf
     where
-        pf = PF.protoFragmentH dir lvl glyphs
+        pf = PF.protoFragmentH dir lvl glyphs hard
         glyphs = shapeRun (WithSpan rs run)
         dir = runDirection run
         lvl = runLevel run
+        hard = runHardBreak run
 
 -- | Calculate layout for the given run independently of its position.
 shapeRun :: WithSpan d Run -> [(GlyphInfo, GlyphPos)]
@@ -341,7 +406,7 @@
 runBreaksFromSpan run spanBreaks =
     dropWhile (not . valid) $ subOffsetsDesc (runOffsetInSpan run) spanBreaks
     where
-        valid (off, _) = off < runLength
+        valid (off, _) = off <= runLength
         runLength = lengthWord8 $ getText run
 
 -- | Predicate for characters that can be potentially removed from the
diff --git a/src/Data/Text/ParagraphLayout/Internal/LineNumbers.hs b/src/Data/Text/ParagraphLayout/Internal/LineNumbers.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Text/ParagraphLayout/Internal/LineNumbers.hs
@@ -0,0 +1,23 @@
+module Data.Text.ParagraphLayout.Internal.LineNumbers
+    ( LineNumbers
+    , lineNumbers
+    , lineNumbersWithDuplication
+    )
+where
+
+import qualified Data.List.NonEmpty as NonEmpty
+
+-- | Data types that contain numbered lines.
+class LineNumbers ml where
+
+    -- | A list of all line numbers in ascending order,
+    -- with possible duplicates.
+    lineNumbersWithDuplication :: ml -> [Int]
+
+-- | A list of all unique line numbers, in ascending order.
+lineNumbers :: (LineNumbers ml) => ml -> [Int]
+lineNumbers ml = dedupe $ lineNumbersWithDuplication ml
+
+-- | Remove duplicates from a sorted list.
+dedupe :: Eq a => [a] -> [a]
+dedupe xs = map NonEmpty.head $ NonEmpty.group xs
diff --git a/src/Data/Text/ParagraphLayout/Internal/Paginable.hs b/src/Data/Text/ParagraphLayout/Internal/Paginable.hs
--- a/src/Data/Text/ParagraphLayout/Internal/Paginable.hs
+++ b/src/Data/Text/ParagraphLayout/Internal/Paginable.hs
@@ -8,6 +8,7 @@
 
 import Data.Int (Int32)
 
+import Data.Text.ParagraphLayout.Internal.LineNumbers
 import Data.Text.ParagraphLayout.Internal.LinePagination
 import Data.Text.ParagraphLayout.Internal.ParagraphLine
 import qualified Data.Text.ParagraphLayout.Internal.Plain.ParagraphLayout
@@ -86,7 +87,7 @@
 instance Paginable (Rich.ParagraphLayout d) where
     paginate = paginateLayout
 
-paginateLayout :: (Line a, GenericLayout a) =>
+paginateLayout :: (Line a, LineNumbers a, GenericLayout a) =>
    PageOptions -> a -> (PageContinuity, a, Maybe a)
 paginateLayout opts pl =
     case paginate opts (cutLines pl) of
diff --git a/src/Data/Text/ParagraphLayout/Internal/ParagraphAlignment.hs b/src/Data/Text/ParagraphLayout/Internal/ParagraphAlignment.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Text/ParagraphLayout/Internal/ParagraphAlignment.hs
@@ -0,0 +1,40 @@
+module Data.Text.ParagraphLayout.Internal.ParagraphAlignment
+    ( ParagraphAlignment (..)
+    )
+where
+
+-- | Determines how the contents of the paragraph should be aligned
+-- horizontally, that is, how should fragments be stacked inside each line
+-- when there is space available.
+--
+-- This has no effect on lines with overflowing content.
+data ParagraphAlignment
+
+    = AlignStart
+    -- ^ Behave like `AlignLeft` when the base direction of the paragraph
+    -- is LTR, and like `AlignRight` when the base direction is RTL.
+
+    | AlignEnd
+    -- ^ Behave like `AlignLeft` when the base direction of the paragraph
+    -- is RTL, and like `AlignRight` when the base direction is LTR.
+
+    | AlignLeft
+    -- ^ Stack fragments to the left edge of each line,
+    -- leaving free space on the right side.
+    --
+    -- The leftmost fragment on each non-overflowing line will have its
+    -- `Data.Text.ParagraphLayout.Rect.x_min` equal to @0@.
+
+    | AlignRight
+    -- ^ Stack fragments to the right edge of each line,
+    -- leaving free space on the left side.
+    --
+    -- The rightmost fragment on each non-overflowing line will have its
+    -- `Data.Text.ParagraphLayout.Rect.x_max` equal to
+    -- `Data.Text.ParagraphLayout.Rich.paragraphMaxWidth`.
+
+    | AlignCentreH
+    -- ^ Stack fragments to the horizontal centre of each line,
+    -- leaving free space split evenly between each side.
+
+    deriving (Eq, Read, Show)
diff --git a/src/Data/Text/ParagraphLayout/Internal/ParagraphExtents.hs b/src/Data/Text/ParagraphLayout/Internal/ParagraphExtents.hs
--- a/src/Data/Text/ParagraphLayout/Internal/ParagraphExtents.hs
+++ b/src/Data/Text/ParagraphLayout/Internal/ParagraphExtents.hs
@@ -6,14 +6,20 @@
     )
 where
 
+import Data.Maybe (fromMaybe)
+
 import Data.Text.ParagraphLayout.Internal.Rect
 
+-- | X coordinate used as the left edge of every paragraph.
 paragraphOriginX :: (Num a) => a
 paragraphOriginX = 0
 
+-- | Y coordinate used as the top edge of every paragraph.
 paragraphOriginY :: (Num a) => a
 paragraphOriginY = 0
 
+-- | A `Rect` located at the top left corner of a paragraph,
+-- with zero size in each dimension.
 emptyRect :: (Num a) => Rect a
 emptyRect = Rect
     { x_origin = paragraphOriginX
@@ -22,5 +28,7 @@
     , y_size = 0
     }
 
-containRects :: (Ord a, Num a) => [Rect a] -> Rect a
-containRects = foldr union emptyRect
+-- | Smallest rectangle containing the given rectangles,
+-- or `emptyRect` if none are given.
+containRects :: (Num a, Ord a) => [Rect a] -> Rect a
+containRects rects = fromMaybe emptyRect $ unionMany LH rects
diff --git a/src/Data/Text/ParagraphLayout/Internal/ParagraphLine.hs b/src/Data/Text/ParagraphLayout/Internal/ParagraphLine.hs
--- a/src/Data/Text/ParagraphLayout/Internal/ParagraphLine.hs
+++ b/src/Data/Text/ParagraphLayout/Internal/ParagraphLine.hs
@@ -3,13 +3,14 @@
     ( GenericLayout
     , cutLines
     , mergeLines
+    , forceLeftAlign
     )
 where
 
 import Data.Int (Int32)
-import qualified Data.List.NonEmpty as NonEmpty
 
 import Data.Text.ParagraphLayout.Internal.Fragment
+import Data.Text.ParagraphLayout.Internal.LineNumbers
 import qualified Data.Text.ParagraphLayout.Internal.Plain.ParagraphLayout as P
 import qualified Data.Text.ParagraphLayout.Internal.Rich.ParagraphLayout as R
 import Data.Text.ParagraphLayout.Internal.Rect
@@ -22,17 +23,20 @@
     -- | Rectangle surrounding the layout, to be used for appending.
     rect :: pl -> Rect Int32
 
-    -- | Actual distance between the paragraph origin and the nearest fragment.
+    -- | Actual distance between the paragraph origin and the nearest fragment
+    -- on the Y axis.
     topDistance :: pl -> Int32
 
-    -- | A list of all unique line numbers that have laid out content.
-    lineNumbers :: pl -> [Int]
+    -- | Actual distance between the paragraph origin and the nearest fragment
+    -- on the X axis.
+    leftDistance :: pl -> Int32
 
     -- | Keep only fragments with the given line number.
     limitFragments :: Int -> pl -> pl
 
-    -- | Add @dy@ to each fragment's `y_origin`.
-    shiftFragments :: Int32 -> pl -> pl
+    -- | Add @dx@ and @dy@ to each fragment's `x_origin` and `y_origin`,
+    -- respectively.
+    shiftFragments :: Int32 -> Int32 -> pl -> pl
 
     -- | Combine fragments from two layouts into one,
     -- without any adjustment of coordinates.
@@ -42,22 +46,22 @@
     empty = P.emptyParagraphLayout
     rect = P.paragraphRect
     topDistance pl = topFragmentOrigin $ P.paragraphFragments pl
-    lineNumbers pl = uniqueFragmentLines $ P.paragraphFragments pl
+    leftDistance pl = leftmostFragmentOrigin $ P.paragraphFragments pl
     limitFragments n = P.filterFragments (fragmentIsOnLine n)
-    shiftFragments dy = P.mapFragments (shiftFragment dy)
+    shiftFragments dx dy = P.mapFragments (shiftFragment dx dy)
     appendFragments = P.appendFragments
 
 instance GenericLayout (R.ParagraphLayout d) where
     empty = R.emptyParagraphLayout
     rect = R.paragraphRect
     topDistance pl = topFragmentOrigin $ R.paragraphFragments pl
-    lineNumbers pl = uniqueFragmentLines $ R.paragraphFragments pl
+    leftDistance pl = leftmostFragmentOrigin $ R.paragraphFragments pl
     limitFragments n = R.filterFragments (fragmentIsOnLine n)
-    shiftFragments dy = R.mapFragments (shiftFragment dy)
+    shiftFragments dx dy = R.mapFragments (shiftFragment dx dy)
     appendFragments = R.appendFragments
 
 -- | Split the given paragraph layout into single-line layouts.
-cutLines :: GenericLayout pl => pl -> [pl]
+cutLines :: (GenericLayout pl, LineNumbers pl) => pl -> [pl]
 cutLines pl = map (\ n -> cutLine n pl) (lineNumbers pl)
 
 -- | Reduce the given paragraph layout to fragments with the given line number.
@@ -66,17 +70,17 @@
 
 -- | Add a constant to each fragment's `y_origin` so that their maximum is zero.
 trimTop :: GenericLayout pl => pl -> pl
-trimTop pl = shiftFragments (-topDistance pl) pl
+trimTop pl = shiftFragments 0 (-topDistance pl) pl
 
+-- | Add a constant to each fragment's `x_origin` so that their minimum is zero.
+trimLeft :: GenericLayout pl => pl -> pl
+trimLeft pl = shiftFragments (-leftDistance pl) 0 pl
+
 topFragmentOrigin :: [Fragment d] -> Int32
 topFragmentOrigin frags = maximum $ map (y_origin . fragmentRect) frags
 
-uniqueFragmentLines :: [Fragment d] -> [Int]
-uniqueFragmentLines frags = dedupe $ map fragmentLine frags
-
--- | Remove duplicates from a sorted list.
-dedupe :: Eq a => [a] -> [a]
-dedupe xs = map NonEmpty.head $ NonEmpty.group xs
+leftmostFragmentOrigin :: [Fragment d] -> Int32
+leftmostFragmentOrigin frags = minimum $ map (x_origin . fragmentRect) frags
 
 -- | Put the given paragraph layouts together as a vertically contiguous
 -- sequence.
@@ -87,15 +91,14 @@
 mergeLine pl nextLine = pl'
     where
         -- Quadratic time complexity. TODO: Consider optimising.
-        pl' = appendFragments pl $ shiftFragments y nextLine
+        pl' = appendFragments pl $ shiftFragments 0 y nextLine
         y = y_terminus $ rect pl
 
-shiftFragment :: Int32 -> Fragment d -> Fragment d
-shiftFragment dy f = f'
-    where
-        f' = f { fragmentRect = r' }
-        r' = r { y_origin = y_origin r + dy }
-        r = fragmentRect f
-
 fragmentIsOnLine :: Int -> Fragment d -> Bool
 fragmentIsOnLine n frag = n == fragmentLine frag
+
+-- | Rearrange fragments on each line so that they are stacked from the left.
+--
+-- Intended for comparing paragraph layouts of different maximum widths.
+forceLeftAlign :: (GenericLayout pl, LineNumbers pl) => pl -> pl
+forceLeftAlign pl = mergeLines $ map trimLeft $ cutLines pl
diff --git a/src/Data/Text/ParagraphLayout/Internal/ParagraphOptions.hs b/src/Data/Text/ParagraphLayout/Internal/ParagraphOptions.hs
--- a/src/Data/Text/ParagraphLayout/Internal/ParagraphOptions.hs
+++ b/src/Data/Text/ParagraphLayout/Internal/ParagraphOptions.hs
@@ -8,12 +8,17 @@
 import Data.Text.Glyphize (Font, emptyFont)
 
 import Data.Text.ParagraphLayout.Internal.LineHeight
+import Data.Text.ParagraphLayout.Internal.ParagraphAlignment
 
 -- | Defines options relevant to the entire paragraph.
 --
 -- This record type is likely to be extended in the future.
 -- Use `defaultParagraphOptions` and update it with specific record selectors
 -- instead of constructing `ParagraphOptions` directly.
+--
+-- In order to get CSS defaults, use:
+--
+-- > defaultParagraphOptions { paragraphAlignment = AlignStart }
 data ParagraphOptions = ParagraphOptions
 
     { paragraphFont :: Font
@@ -24,6 +29,9 @@
     , paragraphLineHeight :: LineHeight
     -- ^ Preferred line height of the resulting fragments.
 
+    , paragraphAlignment :: ParagraphAlignment
+    -- ^ Alignment of non-overflowing lines within the paragraph.
+
     , paragraphMaxWidth :: Int32
     -- ^ Line width at which line breaking should occur.
     -- Lines will be broken at language-appropriate boundaries.
@@ -34,10 +42,14 @@
     }
     deriving (Eq)
 
--- | `ParagraphOptions` with default values.
+-- | `ParagraphOptions` with backwards-compatible values.
+--
+-- Note that this sets `paragraphAlignment` to `AlignLeft`,
+-- whereas the CSS default should be `AlignStart`.
 defaultParagraphOptions :: ParagraphOptions
 defaultParagraphOptions = ParagraphOptions
     { paragraphFont = emptyFont
     , paragraphLineHeight = Normal
+    , paragraphAlignment = AlignLeft
     , paragraphMaxWidth = maxBound
     }
diff --git a/src/Data/Text/ParagraphLayout/Internal/Plain/ParagraphLayout.hs b/src/Data/Text/ParagraphLayout/Internal/Plain/ParagraphLayout.hs
--- a/src/Data/Text/ParagraphLayout/Internal/Plain/ParagraphLayout.hs
+++ b/src/Data/Text/ParagraphLayout/Internal/Plain/ParagraphLayout.hs
@@ -13,6 +13,7 @@
 import Data.Int (Int32)
 
 import Data.Text.ParagraphLayout.Internal.Fragment
+import Data.Text.ParagraphLayout.Internal.LineNumbers
 import Data.Text.ParagraphLayout.Internal.LinePagination
 import Data.Text.ParagraphLayout.Internal.ParagraphExtents
 import Data.Text.ParagraphLayout.Internal.Rect
@@ -26,6 +27,9 @@
     }
     deriving (Eq, Read, Show)
 
+instance LineNumbers (ParagraphLayout d) where
+    lineNumbersWithDuplication pl = map fragmentLine $ paragraphFragments pl
+
 instance Line (ParagraphLayout d) where
     lineHeight pl = height $ paragraphRect pl
 
@@ -77,6 +81,8 @@
 paragraphFragments :: ParagraphLayout d -> [Fragment d]
 paragraphFragments pl = concat $ map spanFragments $ spanLayouts pl
 
--- | Return all shaped runs in the paragraph.
+-- | Return all non-empty shaped runs in the paragraph.
 shapedRuns :: ParagraphLayout d -> [ShapedRun]
-shapedRuns pl = map shapedRun $ paragraphFragments pl
+shapedRuns pl = map shapedRun $ filter hasGlyphs $ paragraphFragments pl
+    where
+        hasGlyphs = not . null . fragmentGlyphs
diff --git a/src/Data/Text/ParagraphLayout/Internal/ProtoFragment.hs b/src/Data/Text/ParagraphLayout/Internal/ProtoFragment.hs
--- a/src/Data/Text/ParagraphLayout/Internal/ProtoFragment.hs
+++ b/src/Data/Text/ParagraphLayout/Internal/ProtoFragment.hs
@@ -1,5 +1,5 @@
 module Data.Text.ParagraphLayout.Internal.ProtoFragment
-    ( ProtoFragment (direction, advance, glyphs)
+    ( ProtoFragment (direction, advance, glyphs, hardBreak)
     , protoFragmentH
     )
 where
@@ -20,13 +20,15 @@
     -- ^ Total advance of glyphs in this fragment,
     -- depending on the text direction.
     , glyphs :: [(GlyphInfo, GlyphPos)]
+    , hardBreak :: Bool
+    -- ^ Marks fragment that ends with a forced line break.
     }
 
 -- | Construct a `ProtoFragment`, automatically calculating the total advance
 -- for a horizontal text direction.
-protoFragmentH :: Direction -> BiDi.Level -> [(GlyphInfo, GlyphPos)] ->
+protoFragmentH :: Direction -> BiDi.Level -> [(GlyphInfo, GlyphPos)] -> Bool ->
     ProtoFragment
-protoFragmentH dir lvl gs = ProtoFragment dir lvl adv gs
+protoFragmentH dir lvl gs hard = ProtoFragment dir lvl adv gs hard
     where
         adv = sum $ map (x_advance . snd) gs
 
diff --git a/src/Data/Text/ParagraphLayout/Internal/ProtoLine.hs b/src/Data/Text/ParagraphLayout/Internal/ProtoLine.hs
--- a/src/Data/Text/ParagraphLayout/Internal/ProtoLine.hs
+++ b/src/Data/Text/ParagraphLayout/Internal/ProtoLine.hs
@@ -1,6 +1,7 @@
 module Data.Text.ParagraphLayout.Internal.ProtoLine
     ( ProtoLine (..)
     , nonEmpty
+    , visible
     , width
     , applyBoxes
     )
@@ -10,8 +11,10 @@
 import Data.List.NonEmpty (NonEmpty ((:|)))
 
 import qualified Data.Text.ParagraphLayout.Internal.ApplyBoxes as Algo
+import Data.Text.ParagraphLayout.Internal.BoxOptions
 import Data.Text.ParagraphLayout.Internal.ProtoFragment
 import Data.Text.ParagraphLayout.Internal.ResolvedBox
+import Data.Text.ParagraphLayout.Internal.ResolvedSpan
 import Data.Text.ParagraphLayout.Internal.WithSpan
 
 -- | Contents of a line that have not been visually ordered or positioned yet.
@@ -37,6 +40,22 @@
 nonEmpty (ProtoLine [] _ _) = Nothing
 nonEmpty pl@(ProtoLine { protoFragments = (f : fs) }) =
     Just pl { protoFragments = f :| fs }
+
+-- | `True` if this line should generate a visible line box,
+-- or `False` if this line should generate an /invisible line box/
+-- as defined by <https://www.w3.org/TR/css-inline-3/#invisible-line-boxes>.
+visible :: Foldable f => ProtoLine f d -> Bool
+visible pl = any visibleProtoFragment $ protoFragments pl
+
+visibleProtoFragment :: WithSpan d ProtoFragment -> Bool
+visibleProtoFragment (WithSpan rs pf) =
+    hasGlyphs || hasHardBreak || hasNonCollapsibleBoxes
+    where
+        hasGlyphs = not $ null $ glyphs pf
+        hasHardBreak = hardBreak pf
+        hasNonCollapsibleBoxes =
+            any (== AvoidBoxCollapse) $ map (boxCollapse . boxOptions) boxes
+        boxes = spanBoxes rs
 
 -- | Total width of the line (content and spacing).
 width :: (Foldable f, Functor f) => ProtoLine f d -> Int32
diff --git a/src/Data/Text/ParagraphLayout/Internal/Rect.hs b/src/Data/Text/ParagraphLayout/Internal/Rect.hs
--- a/src/Data/Text/ParagraphLayout/Internal/Rect.hs
+++ b/src/Data/Text/ParagraphLayout/Internal/Rect.hs
@@ -1,9 +1,12 @@
 -- | Representation of an axis-aligned rectangle on a 2D plane, with one of its
 -- corners being a designated origin point.
 module Data.Text.ParagraphLayout.Internal.Rect
-    ( Rect (Rect, x_origin, y_origin, x_size, y_size)
+    ( Bias (LL, LH, HL, HH)
+    , Rect (Rect, x_origin, y_origin, x_size, y_size)
     , height
     , union
+    , unionMany
+    , unionMany1
     , width
     , x_max
     , x_min
@@ -14,6 +17,8 @@
     )
 where
 
+import Data.List.NonEmpty (NonEmpty, nonEmpty)
+
 -- | An axis-aligned rectangle on a 2D plane.
 data Rect a = Rect
     { x_origin :: a
@@ -59,17 +64,62 @@
 y_max :: (Num a, Ord a) => Rect a -> a
 y_max r = y_origin r `max` y_terminus r
 
--- | Calculate the smallest rectangle that completely contains the given two
--- rectangles.
+-- | Determines which corner of a calculated rectangle should be its origin.
+data Bias
+    = LL
+    -- ^ Set the origin as the corner with low X and low Y coordinates.
+    | LH
+    -- ^ Set the origin as the corner with low X and high Y coordinates.
+    | HL
+    -- ^ Set the origin as the corner with high X and low Y coordinates.
+    | HH
+    -- ^ Set the origin as the corner with high X and high Y coordinates.
+
+-- | The smallest rectangle completely containing the given two rectangles.
 --
--- The origin of the resulting rectangle will be the corner with the lowest
--- X coordinate and the highest Y coordinate, regardless of the origin of the
--- input rectangles.
-union :: (Num a, Ord a) => Rect a -> Rect a -> Rect a
-union a b = Rect x_low y_high dx (-dy) where
-    x_low = x_min a `min` x_min b
-    y_low = y_min a `min` y_min b
-    x_high = x_max a `max` x_max b
-    y_high = y_max a `max` y_max b
-    dx = x_high - x_low
-    dy = y_high - y_low
+-- The origin of the output rectangle will be set according to `Bias`,
+-- regardless of which corners of the input rectangles are designated
+-- as their origins.
+--
+-- Note that this operation has no identity element. A rectangle whose
+-- `x_size` and/or `y_size` are zero is not considered null or neutral,
+-- but effectively acts as a point, which will be contained in the union.
+--
+-- You can use `Nothing` as an identity element if you lift this operation
+-- over the `Maybe` applicative functor:
+--
+-- @
+-- `Control.Applicative.liftA2` (`union` bias)
+-- @
+union :: (Num a, Ord a) => Bias -> Rect a -> Rect a -> Rect a
+union bias a b =
+    case bias of
+        LL -> Rect lx ly dx dy
+        LH -> Rect lx hy dx (-dy)
+        HL -> Rect hx ly (-dx) dy
+        HH -> Rect hx hy (-dx) (-dy)
+    where
+        lx = x_min a `min` x_min b
+        ly = y_min a `min` y_min b
+        hx = x_max a `max` x_max b
+        hy = y_max a `max` y_max b
+        dx = hx - lx
+        dy = hy - ly
+
+-- | `Just` the `union` of all given rectangles, or `Nothing` if none are given.
+unionMany :: (Num a, Ord a) => Bias -> [Rect a] -> Maybe (Rect a)
+unionMany bias rects = unionMany1 bias <$> nonEmpty rects
+
+-- | The `union` of all given rectangles, where at least one must be given.
+--
+-- Note that adding a default value to the input list to make it non-empty
+-- will probably not do what you want, since the `union` operation has no
+-- identity element.
+--
+-- If you need a default output value for empty inputs, consider using:
+--
+-- @
+-- `Data.Maybe.fromMaybe` yourDefaultValue $ `unionMany` bias rects
+-- @
+unionMany1 :: (Num a, Ord a) => Bias -> NonEmpty (Rect a) -> Rect a
+unionMany1 bias rects = foldr1 (union bias) rects
diff --git a/src/Data/Text/ParagraphLayout/Internal/Rich.hs b/src/Data/Text/ParagraphLayout/Internal/Rich.hs
--- a/src/Data/Text/ParagraphLayout/Internal/Rich.hs
+++ b/src/Data/Text/ParagraphLayout/Internal/Rich.hs
@@ -23,14 +23,22 @@
 
 -- | Lay out a rich text paragraph.
 layoutRich :: Paragraph d -> ParagraphLayout d
-layoutRich p@(Paragraph _ _ _ opts) = paragraphLayout $ map unwrap frags
+layoutRich p = paragraphLayout $ map unwrap frags
     where
+        Paragraph _ _ root opts = p
+        RootBox (Box _ rootTextOpts) = root
         unwrap (WithSpan rs frag) =
             frag { fragmentUserData = RS.spanUserData rs }
         frags = case nonEmpty wrappedRuns of
-            Just xs -> layoutAndAlignLines maxWidth xs
+            Just xs -> layoutAndAlignLines dir align maxWidth xs
             Nothing -> []
         wrappedRuns = spansToRunsWrapped spans
+        -- TODO: To support @unicode-bidi: plaintext@ as in CSS, allow ignoring
+        --       the text direction of the root box, and instead use the BiDi
+        --       rules P2 and P3 to determine the base directionality, which
+        --       may differ between lines.
+        dir = textDirection rootTextOpts
+        align = paragraphAlignment opts
         maxWidth = paragraphMaxWidth opts
         spans = resolveSpans p
 
@@ -63,8 +71,8 @@
     let lang = textLanguage textOpts
     -- TODO: Allow BiDi embedding/isolation for inner nodes.
     let pLevels = textLevels (textDirection rootTextOpts) pText
-    let lBreaks = paragraphBreaks breakLine pText lang
-    let cBreaks = paragraphBreaks breakCharacter pText lang
+    let lBreaks = paragraphBreaksDesc breakLine pText lang
+    let cBreaks = paragraphBreaksDesc breakCharacter pText lang
     -- TODO: Optimise. This has time complexity O(n*s), where n is number of
     --       characters and s is number of resolved spans.
     --       Maybe include byte offsets in the TextLevels data structure?
@@ -82,6 +90,12 @@
         , RS.spanCharacterBreaks = subOffsetsDesc (sStart - pStart) cBreaks
         }
 
-paragraphBreaks :: (LocaleName -> Breaker a) -> Text -> String -> [(Int, a)]
-paragraphBreaks breakFunc txt lang =
-    breaksDesc (breakFunc (locale lang LBAuto)) txt
+paragraphBreaksDesc :: (LocaleName -> Breaker a) -> Text -> String -> [(Int, a)]
+paragraphBreaksDesc breakFunc txt lang =
+    -- Workaround: We are interested in the type of the end-of-text break
+    --             (if it is hard, that line needs to be always visible),
+    --             but `breaksDesc` does not provide it.
+    --
+    -- TODO: Consider optimising by creating a custom reimplementation
+    --       of `Data.Text.ICU.breaksRight`.
+    reverse $ breaksAsc (breakFunc (locale lang LBAuto)) txt
diff --git a/src/Data/Text/ParagraphLayout/Internal/Rich/ParagraphLayout.hs b/src/Data/Text/ParagraphLayout/Internal/Rich/ParagraphLayout.hs
--- a/src/Data/Text/ParagraphLayout/Internal/Rich/ParagraphLayout.hs
+++ b/src/Data/Text/ParagraphLayout/Internal/Rich/ParagraphLayout.hs
@@ -7,6 +7,7 @@
     , paragraphLayout
     , paragraphOriginX
     , paragraphOriginY
+    , paragraphSafeWidth
     , shapedRuns
     )
 where
@@ -14,6 +15,7 @@
 import Data.Int (Int32)
 
 import Data.Text.ParagraphLayout.Internal.Fragment
+import Data.Text.ParagraphLayout.Internal.LineNumbers
 import Data.Text.ParagraphLayout.Internal.LinePagination
 import Data.Text.ParagraphLayout.Internal.ParagraphExtents
 import Data.Text.ParagraphLayout.Internal.Rect
@@ -29,6 +31,9 @@
     }
     deriving (Eq, Read, Show)
 
+instance LineNumbers (ParagraphLayout d) where
+    lineNumbersWithDuplication pl = map fragmentLine $ paragraphFragments pl
+
 instance Line (ParagraphLayout d) where
     lineHeight pl = height $ paragraphRect pl
 
@@ -68,3 +73,25 @@
 -- | Return all shaped runs in the paragraph.
 shapedRuns :: ParagraphLayout d -> [ShapedRun]
 shapedRuns pl = map shapedRun $ paragraphFragments pl
+
+-- | Width of the widest line, including spacing.
+--
+-- This is the smallest `Data.Text.ParagraphLayout.Rich.paragraphMaxWidth`
+-- that will not introduce new line breaks.
+--
+-- When `Data.Text.ParagraphLayout.Rich.paragraphMaxWidth` is set to `maxBound`,
+-- `paragraphSafeWidth` can be used to determine the @max-content@ width of the
+-- paragraph for CSS.
+paragraphSafeWidth :: ParagraphLayout d -> Int32
+paragraphSafeWidth pl = maximum $ map (lineWidth pl) $ lineNumbers pl
+
+lineWidth :: ParagraphLayout d -> Int -> Int32
+lineWidth pl line = sum $ map fragmentWidth $ lineFragments pl line
+
+fragmentWidth :: Fragment d -> Int32
+fragmentWidth f = width $ fragmentSpacedRect f
+
+lineFragments :: ParagraphLayout d -> Int -> [Fragment d]
+lineFragments pl line = filter byLine $ paragraphFragments pl
+    where
+        byLine frag = line == fragmentLine frag
diff --git a/src/Data/Text/ParagraphLayout/Internal/Run.hs b/src/Data/Text/ParagraphLayout/Internal/Run.hs
--- a/src/Data/Text/ParagraphLayout/Internal/Run.hs
+++ b/src/Data/Text/ParagraphLayout/Internal/Run.hs
@@ -25,6 +25,10 @@
     , runLevel :: Level
     , runDirection :: Direction
     , runScript :: Maybe ScriptCode
+    , runHardBreak :: Bool
+    -- ^ Marks run that ends with a forced line break.
+    -- Those should prevent creation of invisible line boxes
+    -- according to <https://www.w3.org/TR/css-inline-3/#invisible-line-boxes>.
     }
     deriving (Eq, Show)
 
@@ -74,8 +78,23 @@
 data Merged a = Incompatible | Merged a
 
 spanToRuns :: ResolvedSpan d -> [Run]
-spanToRuns s = snd $ mapAccumL run 0 $ protoRuns zipper levels
+spanToRuns s
+    | Text.null (spanText s) = [emptyRun]
+    | otherwise = spanToRuns' s
     where
+        emptyRun = Run
+            { runOffsetInSpan = 0
+            , runText = Text.empty
+            , runLevel = defaultLevel
+            , runDirection = levelDirectionH defaultLevel
+            , runScript = Nothing
+            , runHardBreak = False
+            }
+        defaultLevel = baseLevel $ spanBiDiLevels s
+
+spanToRuns' :: ResolvedSpan d -> [Run]
+spanToRuns' s = snd $ mapAccumL run 0 $ protoRuns zipper levels
+    where
         wholeText = spanText s
         zipper = start wholeText
         levels = spanBiDiLevels s
@@ -87,6 +106,7 @@
                 , runLevel = PR.level pr
                 , runDirection = levelDirectionH $ PR.level pr
                 , runScript = Just $ PR.script pr
+                , runHardBreak = False
                 }
             )
 
diff --git a/src/Data/Text/ParagraphLayout/Internal/SplitList.hs b/src/Data/Text/ParagraphLayout/Internal/SplitList.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Text/ParagraphLayout/Internal/SplitList.hs
@@ -0,0 +1,58 @@
+-- | Utility functions to work with pairs of lists, which may be non-empty.
+module Data.Text.ParagraphLayout.Internal.SplitList
+    ( allowFstEmpty
+    , allowSndEmpty
+    , nonEmptyPairs
+    , nonEmptyFsts
+    , nonEmptySnds
+    )
+where
+
+import Data.List.NonEmpty (NonEmpty, nonEmpty, toList)
+import Data.Maybe (catMaybes)
+
+-- | Generalise the first component of a pair from a non-empty list
+-- to a regular list.
+allowFstEmpty :: (NonEmpty a, b) -> ([a], b)
+allowFstEmpty (a, b) = (toList a, b)
+
+-- | Generalise the second component of a pair from a non-empty list
+-- to a regular list.
+allowSndEmpty :: (a, NonEmpty b) -> (a, [b])
+allowSndEmpty (a, b) = (a, toList b)
+
+-- | Turn pairs of normal lists into pairs of `NonEmpty` lists,
+-- removing pairs in which either list is empty.
+nonEmptyPairs :: [([a], [b])] -> [(NonEmpty a, NonEmpty b)]
+nonEmptyPairs = catMaybes . map nonEmptyPair
+
+-- | Turn a pair of normal lists into `Just` a pair of `NonEmpty` lists,
+-- or `Nothing` if either list is empty.
+nonEmptyPair :: ([a], [b]) -> Maybe (NonEmpty a, NonEmpty b)
+nonEmptyPair (xs, ys) = case (nonEmpty xs, nonEmpty ys) of
+    (Just xs1, Just ys1) -> Just (xs1, ys1)
+    (_, _) -> Nothing
+
+-- | Turn pairs of normal lists into pairs where the first list is `NonEmpty`,
+-- removing pairs in which the first list is empty.
+nonEmptyFsts :: [([a], [b])] -> [(NonEmpty a, [b])]
+nonEmptyFsts = catMaybes . map nonEmptyFst
+
+-- | Turn a pair of normal lists into `Just` a pair where the first list is
+-- `NonEmpty`, or `Nothing` if the first list is empty.
+nonEmptyFst :: ([a], [b]) -> Maybe (NonEmpty a, [b])
+nonEmptyFst (xs, ys) = case nonEmpty xs of
+    Just xs1 -> Just (xs1, ys)
+    Nothing -> Nothing
+
+-- | Turn pairs of normal lists into pairs where the second list is `NonEmpty`,
+-- removing pairs in which the second list is empty.
+nonEmptySnds :: [([a], [b])] -> [([a], NonEmpty b)]
+nonEmptySnds = catMaybes . map nonEmptySnd
+
+-- | Turn a pair of normal lists into `Just` a pair where the second list is
+-- `NonEmpty`, or `Nothing` if the second list is empty.
+nonEmptySnd :: ([a], [b]) -> Maybe ([a], NonEmpty b)
+nonEmptySnd (xs, ys) = case nonEmpty ys of
+    Just ys1 -> Just (xs, ys1)
+    Nothing -> Nothing
diff --git a/src/Data/Text/ParagraphLayout/Internal/TextContainer.hs b/src/Data/Text/ParagraphLayout/Internal/TextContainer.hs
--- a/src/Data/Text/ParagraphLayout/Internal/TextContainer.hs
+++ b/src/Data/Text/ParagraphLayout/Internal/TextContainer.hs
@@ -2,21 +2,18 @@
     ( SeparableTextContainer
     , TextContainer
     , dropWhileEnd
+    , dropWhileEndCascade
     , dropWhileStart
+    , dropWhileStartCascade
     , getText
     , splitTextAt8
     , splitTextsBy
-    , trimTextsEnd
-    , trimTextsEndPreserve
-    , trimTextsStart
-    , trimTextsStartPreserve
     )
 where
 
 import Data.Foldable (toList)
-import Data.List.NonEmpty (NonEmpty ((:|)), nonEmpty)
-import qualified Data.List.NonEmpty as NonEmpty
-import Data.Maybe (catMaybes)
+import Data.List (mapAccumL, mapAccumR)
+import Data.List.NonEmpty (NonEmpty ((:|)))
 import Data.Text (Text)
 import qualified Data.Text as Text
 import Data.Text.Foreign (dropWord8, takeWord8)
@@ -57,16 +54,16 @@
     dropWhileEnd = Text.dropWhileEnd
 
 -- | Treat a list of text containers as a contiguous sequence,
--- and find all possible ways to split them into two non-empty lists,
+-- and find all possible ways to split them into two lists,
 -- using the given function to find valid split offsets in `Data.Word.Word8`
 -- units from the beginning of each container.
 --
 -- The results in the form (prefix, suffix) will be ordered from the longest
 -- prefix to shortest.
 splitTextsBy :: (SeparableTextContainer a, Foldable f) =>
-    (a -> [Int]) -> f a -> [(NonEmpty a, NonEmpty a)]
+    (a -> [Int]) -> f a -> [([a], [a])]
 splitTextsBy breakFunc tcs =
-    nonEmptyPairs $ splitTextsBy' breakFunc [] $ reverse $ toList tcs
+    splitTextsBy' breakFunc [] $ reverse $ toList tcs
 
 splitTextsBy' :: SeparableTextContainer a =>
     (a -> [Int]) -> [a] -> [a] -> [([a], [a])]
@@ -80,18 +77,6 @@
         tcSplits = map (\ i -> splitTextAt8 i tc) tcBreakOffsets
         tcBreakOffsets = breakFunc tc
 
--- | Turn pairs of normal lists into pairs of `NonEmpty` lists,
--- removing pairs in which either list is empty.
-nonEmptyPairs :: [([a], [b])] -> [(NonEmpty a, NonEmpty b)]
-nonEmptyPairs = catMaybes . map nonEmptyPair
-
--- | Turn a pair of normal lists into `Just` a pair of `NonEmpty` lists,
--- or `Nothing` if either list is empty.
-nonEmptyPair :: ([a], [b]) -> Maybe (NonEmpty a, NonEmpty b)
-nonEmptyPair (xs, ys) = case (nonEmpty xs, nonEmpty ys) of
-    (Just xs1, Just ys1) -> Just (xs1, ys1)
-    (_, _) -> Nothing
-
 -- | If the first container in the list is empty, remove it.
 collapse :: SeparableTextContainer a => NonEmpty a -> [a]
 collapse (tc :| tcs)
@@ -101,61 +86,42 @@
 -- | Treat a list of text containers as a contiguous sequence,
 -- and remove a prefix of characters that match the given predicate.
 --
--- Empty text containers are removed from the output, so the result may
--- potentially be an empty list.
-trimTextsStart :: (SeparableTextContainer a, Foldable f) =>
-    (Char -> Bool) -> f a -> [a]
-trimTextsStart p tcs = trimTextsStart' p $ toList tcs
-
--- | Treat a list of text containers as a contiguous sequence,
--- and remove a prefix of characters that match the given predicate.
---
--- Empty text containers are removed from the output except the first one,
--- which is instead truncated to zero length.
-trimTextsStartPreserve :: SeparableTextContainer a =>
-    (Char -> Bool) -> NonEmpty a -> NonEmpty a
-trimTextsStartPreserve p tcs =
-    case nonEmpty $ trimTextsStart p $ NonEmpty.toList tcs of
-        Nothing -> truncateText (NonEmpty.head tcs) :| []
-        Just out -> out
+-- All text containers are preserved but their contents may end up having
+-- zero length.
+dropWhileStartCascade :: (SeparableTextContainer a, Traversable t) =>
+    (Char -> Bool) -> t a -> t a
+dropWhileStartCascade p tcs = trimTextsStartCascade (dropWhileStart p) tcs
 
 -- | Treat a list of text containers as a contiguous sequence,
 -- and remove a suffix of characters that match the given predicate.
 --
--- Empty text containers are removed from the output, so the result may
--- potentially be an empty list.
-trimTextsEnd :: (SeparableTextContainer a, Foldable f) =>
-    (Char -> Bool) -> f a -> [a]
-trimTextsEnd p tcs = trimTextsEnd' p $ reverse $ toList tcs
+-- All text containers are preserved but their contents may end up having
+-- zero length.
+dropWhileEndCascade :: (SeparableTextContainer a, Traversable t) =>
+    (Char -> Bool) -> t a -> t a
+dropWhileEndCascade p tcs = trimTextsEndCascade (dropWhileEnd p) tcs
 
--- | Treat a list of text containers as a contiguous sequence,
--- and remove a suffix of characters that match the given predicate.
---
--- Empty text containers are removed from the output except the first one,
--- which is instead truncated to zero length.
-trimTextsEndPreserve :: SeparableTextContainer a =>
-    (Char -> Bool) -> NonEmpty a -> NonEmpty a
-trimTextsEndPreserve p tcs =
-    case nonEmpty $ trimTextsEnd p $ NonEmpty.toList tcs of
-        Nothing -> truncateText (NonEmpty.head tcs) :| []
-        Just out -> out
+-- | Traverse the given structure from start to end, applying the given
+-- text trimming function to each text container until a non-empty container
+-- is produced.
+trimTextsStartCascade :: (SeparableTextContainer a, Traversable t) =>
+    (a -> a) -> t a -> t a
+trimTextsStartCascade trimFunc tcs =
+    snd $ mapAccumL (cascadingTrim trimFunc) True tcs
 
-trimTextsStart' :: SeparableTextContainer a => (Char -> Bool) -> [a] -> [a]
-trimTextsStart' _ [] = []
-trimTextsStart' p (tc : tcs)
-    | Text.null (getText trimmed) = trimTextsStart' p tcs
-    | otherwise = trimmed : tcs
-    where
-        trimmed = dropWhileStart p tc
+-- | Traverse the given structure from end to start, applying the given
+-- text trimming function to each text container until a non-empty container
+-- is produced.
+trimTextsEndCascade :: (SeparableTextContainer a, Traversable t) =>
+    (a -> a) -> t a -> t a
+trimTextsEndCascade trimFunc tcs =
+    snd $ mapAccumR (cascadingTrim trimFunc) True tcs
 
-trimTextsEnd' :: SeparableTextContainer a => (Char -> Bool) -> [a] -> [a]
-trimTextsEnd' _ [] = []
-trimTextsEnd' p (tc : tcs)
-    | Text.null (getText trimmed) = trimTextsEnd' p tcs
-    | otherwise = reverse $ trimmed : tcs
+-- | Wraps a text trimming function in a controlled cascade.
+-- When the trim produces an empty text, the cascade continues.
+cascadingTrim :: SeparableTextContainer a => (a -> a) -> Bool -> a -> (Bool, a)
+cascadingTrim _ False tc = (False, tc)
+cascadingTrim trimFunc True tc = (continue, trimmed)
     where
-        trimmed = dropWhileEnd p tc
-
--- | Discard all text from the container by creating a prefix of length 0.
-truncateText :: SeparableTextContainer a => a -> a
-truncateText tc = fst $ splitTextAt8 0 tc
+        trimmed = trimFunc tc
+        continue = Text.null $ getText trimmed
diff --git a/src/Data/Text/ParagraphLayout/Internal/TextOptions.hs b/src/Data/Text/ParagraphLayout/Internal/TextOptions.hs
--- a/src/Data/Text/ParagraphLayout/Internal/TextOptions.hs
+++ b/src/Data/Text/ParagraphLayout/Internal/TextOptions.hs
@@ -40,7 +40,6 @@
     -- When applied to the root box in a paragraph, this is also used to
     -- determine the base direction of the paragraph.
 
-    -- TODO: textVerticalAlign
     -- TODO: textLetterSpacing
     -- TODO: textWordSpacing
     -- TODO: textFontFeatures
diff --git a/src/Data/Text/ParagraphLayout/Internal/Tree.hs b/src/Data/Text/ParagraphLayout/Internal/Tree.hs
--- a/src/Data/Text/ParagraphLayout/Internal/Tree.hs
+++ b/src/Data/Text/ParagraphLayout/Internal/Tree.hs
@@ -19,12 +19,15 @@
     , InnerNode (..)
     , Box (..)
     , Leaf (..)
+    , EmptyText
     , flatten
     , glue
+    , strut
     )
 where
 
 import Data.Text (Text)
+import qualified Data.Text as Text
 import Data.Text.Foreign (lengthWord8)
 import qualified Data.Text.Lazy as Lazy (toStrict)
 import qualified Data.Text.Internal.Lazy as Lazy (Text, chunk, empty)
@@ -68,6 +71,13 @@
 
     [InnerNode t d]
     -- ^ Text nodes and other boxes contained by this box.
+    --
+    -- Please note that boxes which are not the ancestors of any leaf nodes
+    -- will have no effect on the output.
+    --
+    -- To ensure that all boxes are represented in the output, as would be
+    -- expected for DOM elements in HTML, an empty text sequence must be added
+    -- to otherwise empty boxes. This can be done by using the `strut` function.
 
     TextOptions
     -- ^ Style options to apply to text sequences directly contained
@@ -91,6 +101,30 @@
     (BoxPath d)
     -- ^ Inline boxes found on the path from this text sequence to the root
     -- of the original tree.
+
+-- | Data types that can represent an empty text sequence in a `Tree`.
+class EmptyText t where
+    empty :: t
+
+instance EmptyText Int where
+    empty = 0
+
+instance EmptyText Text where
+    empty = Text.empty
+
+-- | Insert an empty text sequence with the given user data into each empty box.
+strut :: EmptyText t => d -> RootNode t d -> RootNode t d
+strut d (RootBox (Box ns textOpts)) = RootBox $ Box (strutNodes d ns) textOpts
+
+strutNodes :: EmptyText t => d -> [InnerNode t d] -> [InnerNode t d]
+strutNodes d ns = map (strutNode d) ns
+
+strutNode :: EmptyText t => d -> InnerNode t d -> InnerNode t d
+strutNode _ x@(TextSequence _ _) = x
+strutNode d (InlineBox boxData (Box [] textOpts) boxOpts) =
+    InlineBox boxData (Box [TextSequence d empty] textOpts) boxOpts
+strutNode d (InlineBox boxData (Box ns textOpts) boxOpts) =
+    InlineBox boxData (Box (strutNodes d ns) textOpts) boxOpts
 
 -- | Convert the tree to a flat list of its leaf nodes (text sequences).
 flatten :: RootNode t d -> [Leaf t d]
diff --git a/test/Data/Text/ParagraphLayout/Internal/ApplyBoxesSpec.hs b/test/Data/Text/ParagraphLayout/Internal/ApplyBoxesSpec.hs
--- a/test/Data/Text/ParagraphLayout/Internal/ApplyBoxesSpec.hs
+++ b/test/Data/Text/ParagraphLayout/Internal/ApplyBoxesSpec.hs
@@ -24,7 +24,7 @@
     , spanText = empty
     , spanTextOptions = defaultTextOptions dir
     , spanBoxes = bs
-    , spanBiDiLevels = TextLevels []
+    , spanBiDiLevels = TextLevels [] (directionLevel 0 dir)
     , spanLineBreaks = []
     , spanCharacterBreaks = []
     }
diff --git a/test/Data/Text/ParagraphLayout/Internal/BiDiLevelsSpec.hs b/test/Data/Text/ParagraphLayout/Internal/BiDiLevelsSpec.hs
--- a/test/Data/Text/ParagraphLayout/Internal/BiDiLevelsSpec.hs
+++ b/test/Data/Text/ParagraphLayout/Internal/BiDiLevelsSpec.hs
@@ -11,11 +11,12 @@
 -- | Test that `textLevels` produces the levels of the lengths given in
 -- "Data.Text.ParagraphLayout.TextData" and values given here.
 shouldHaveLevels :: (Direction, a, Text, [Int]) -> [Level] -> SpecWith ()
-shouldHaveLevels (dir, _, text, lens) levels = it description $
-    result `shouldBe` TextLevels (runLengthDecode rls)
+shouldHaveLevels (dir, _, text, runLens) runLevels = it description $
+    actualLevels `shouldBe` runLengthDecode rls
     where
+        TextLevels actualLevels _ = result
         result = textLevels dir text
-        rls = zip lens levels
+        rls = zip runLens runLevels
         description = case rls of
             [] -> "should be empty"
             [(_, lvl)] -> "should all have level " ++ show lvl
diff --git a/test/Data/Text/ParagraphLayout/Internal/RunSpec.hs b/test/Data/Text/ParagraphLayout/Internal/RunSpec.hs
--- a/test/Data/Text/ParagraphLayout/Internal/RunSpec.hs
+++ b/test/Data/Text/ParagraphLayout/Internal/RunSpec.hs
@@ -1,6 +1,6 @@
 module Data.Text.ParagraphLayout.Internal.RunSpec (spec) where
 
-import Data.Text (Text, pack)
+import Data.Text (Text, empty, pack)
 import Data.Text.Glyphize (Direction (..), emptyFont)
 
 import Test.Hspec
@@ -35,13 +35,13 @@
     }
 
 allLTR :: TextLevels
-allLTR = TextLevels $ repeat 0
+allLTR = TextLevels (repeat 0) 0
 
 allRTL :: TextLevels
-allRTL = TextLevels $ repeat 1
+allRTL = TextLevels (repeat 1) 1
 
 levelsRLE :: [(Int, Level)] -> TextLevels
-levelsRLE rls = TextLevels $ runLengthDecode rls
+levelsRLE rls = TextLevels (runLengthDecode rls) undefined
 
 spec :: Spec
 spec = do
@@ -49,7 +49,16 @@
         it "handles span with no text" $ do
             let inputSpan = sampleSpan englishEmpty allLTR
             let runs = spanToRuns inputSpan
-            runs `shouldBe` []
+            runs `shouldBe`
+                [ Run
+                    { runOffsetInSpan = 0
+                    , runText = empty
+                    , runLevel = 0
+                    , runDirection = DirLTR
+                    , runScript = Nothing
+                    , runHardBreak = False
+                    }
+                ]
         it "handles Czech hello" $ do
             let inputSpan = sampleSpan czechHello allLTR
             let runs = spanToRuns inputSpan
@@ -60,6 +69,7 @@
                     , runLevel = 0
                     , runDirection = DirLTR
                     , runScript = Just "Latn"
+                    , runHardBreak = False
                     }
                 ]
         it "handles Arabic hello" $ do
@@ -72,6 +82,7 @@
                     , runLevel = 1
                     , runDirection = DirRTL
                     , runScript = Just "Arab"
+                    , runHardBreak = False
                     }
                 ]
         it "handles Serbian with mixed script" $ do
@@ -85,6 +96,7 @@
                     , runLevel = 0
                     , runDirection = DirLTR
                     , runScript = Just "Latn"
+                    , runHardBreak = False
                     }
                 , Run
                     { runOffsetInSpan = 12
@@ -92,6 +104,7 @@
                     , runLevel = 0
                     , runDirection = DirLTR
                     , runScript = Just "Cyrl"
+                    , runHardBreak = False
                     }
                 ]
         it "handles mixed direction with base LTR" $ do
@@ -105,6 +118,7 @@
                     , runLevel = 0
                     , runDirection = DirLTR
                     , runScript = Just "Latn"
+                    , runHardBreak = False
                     }
                 , Run
                     { runOffsetInSpan = 7
@@ -112,6 +126,7 @@
                     , runLevel = 1
                     , runDirection = DirRTL
                     , runScript = Just "Arab"
+                    , runHardBreak = False
                     }
                 , Run
                     { runOffsetInSpan = 13
@@ -119,6 +134,7 @@
                     , runLevel = 0
                     , runDirection = DirLTR
                     , runScript = Just "Latn"
+                    , runHardBreak = False
                     }
                 ]
         it "handles mixed direction with base RTL" $ do
@@ -132,6 +148,7 @@
                     , runLevel = 2
                     , runDirection = DirLTR
                     , runScript = Just "Latn"
+                    , runHardBreak = False
                     }
                 , Run
                     { runOffsetInSpan = 7
@@ -139,6 +156,7 @@
                     , runLevel = 1
                     , runDirection = DirRTL
                     , runScript = Just "Arab"
+                    , runHardBreak = False
                     }
                 , Run
                     { runOffsetInSpan = 13
@@ -146,6 +164,7 @@
                     , runLevel = 2
                     , runDirection = DirLTR
                     , runScript = Just "Latn"
+                    , runHardBreak = False
                     }
                 ]
         it "handles Arabic text with English inside" $ do
@@ -159,6 +178,7 @@
                     , runLevel = 1
                     , runDirection = DirRTL
                     , runScript = Just "Arab"
+                    , runHardBreak = False
                     }
                 , Run
                     { runOffsetInSpan = 5
@@ -166,6 +186,7 @@
                     , runLevel = 2
                     , runDirection = DirLTR
                     , runScript = Just "Latn"
+                    , runHardBreak = False
                     }
                 , Run
                     { runOffsetInSpan = 14
@@ -173,6 +194,7 @@
                     , runLevel = 1
                     , runDirection = DirRTL
                     , runScript = Just "Arab"
+                    , runHardBreak = False
                     }
                 , Run
                     { runOffsetInSpan = 79
@@ -180,6 +202,7 @@
                     , runLevel = 2
                     , runDirection = DirLTR
                     , runScript = Just "Latn"
+                    , runHardBreak = False
                     }
                 , Run
                     { runOffsetInSpan = 82
@@ -187,6 +210,7 @@
                     , runLevel = 1
                     , runDirection = DirRTL
                     , runScript = Just "Zyyy"
+                    , runHardBreak = False
                     }
                 ]
         it "handles English text with Arabic inside" $ do
@@ -200,6 +224,7 @@
                     , runLevel = 0
                     , runDirection = DirLTR
                     , runScript = Just "Latn"
+                    , runHardBreak = False
                     }
                 , Run
                     { runOffsetInSpan = 13
@@ -207,6 +232,7 @@
                     , runLevel = 1
                     , runDirection = DirRTL
                     , runScript = Just "Arab"
+                    , runHardBreak = False
                     }
                 , Run
                     { runOffsetInSpan = 47
@@ -214,6 +240,7 @@
                     , runLevel = 0
                     , runDirection = DirLTR
                     , runScript = Just "Latn"
+                    , runHardBreak = False
                     }
                 ]
         -- Unrealistic example where text changes direction
@@ -229,6 +256,7 @@
                     , runLevel = 1
                     , runDirection = DirRTL
                     , runScript = Just "Latn"
+                    , runHardBreak = False
                     }
                 -- direction change
                 , Run
@@ -237,6 +265,7 @@
                     , runLevel = 2
                     , runDirection = DirLTR
                     , runScript = Just "Latn"
+                    , runHardBreak = False
                     }
                 -- direction change
                 , Run
@@ -245,6 +274,7 @@
                     , runLevel = 1
                     , runDirection = DirRTL
                     , runScript = Just "Latn"
+                    , runHardBreak = False
                     }
                 -- script change
                 , Run
@@ -253,6 +283,7 @@
                     , runLevel = 1
                     , runDirection = DirRTL
                     , runScript = Just "Cyrl"
+                    , runHardBreak = False
                     }
                 -- direction change
                 , Run
@@ -261,6 +292,7 @@
                     , runLevel = 2
                     , runDirection = DirLTR
                     , runScript = Just "Cyrl"
+                    , runHardBreak = False
                     }
                 -- direction change
                 , Run
@@ -269,5 +301,6 @@
                     , runLevel = 1
                     , runDirection = DirRTL
                     , runScript = Just "Cyrl"
+                    , runHardBreak = False
                     }
                 ]
diff --git a/test/Data/Text/ParagraphLayout/Internal/TextContainerSpec.hs b/test/Data/Text/ParagraphLayout/Internal/TextContainerSpec.hs
--- a/test/Data/Text/ParagraphLayout/Internal/TextContainerSpec.hs
+++ b/test/Data/Text/ParagraphLayout/Internal/TextContainerSpec.hs
@@ -1,15 +1,11 @@
 module Data.Text.ParagraphLayout.Internal.TextContainerSpec (spec) where
 
-import qualified Data.List.NonEmpty
 import Data.Text (Text, empty, pack)
 import Data.Text.Foreign (lengthWord8)
 
 import Test.Hspec
 import Data.Text.ParagraphLayout.Internal.TextContainer
 
-ne :: [a] -> Data.List.NonEmpty.NonEmpty a
-ne = Data.List.NonEmpty.fromList
-
 data ExampleContainer = Contain { cText :: Text, cOffset :: Int }
     deriving (Show, Eq)
 
@@ -43,7 +39,8 @@
     [
     -- Out of bounds. Should not generate any splits.
     999, 50,
-    -- End of last text. Should not generate a split.
+    -- End of last text.
+    -- Should only generate a split for end-biased breaks.
     43,
     -- Word and syllable bounds in the second text,
     -- similar to hyphenation rules. Each should generate a corresponding split.
@@ -54,79 +51,189 @@
     -- Word and syllable bounds in the first text.
     -- Each should generate a corresponding split.
     18, 16, 14, 12,
-    -- Start of first text. Should not generate a split.
+    -- Start of first text.
+    -- Should only generate a split for start-biased breaks.
     10,
     -- Out of bounds. Should not generate any splits.
     5, 0, -1
     ]
 
-exampleBreakPoints :: ExampleContainer -> [Int]
-exampleBreakPoints c =
+-- | Bound `exampleBreaks` to the given text container and adjust offsets,
+-- including start of text but excluding end of text.
+--
+-- Container boundaries should therefore only generate one split,
+-- and all splits should have a non-empty prefix.
+startBiasedBreakPoints :: ExampleContainer -> [Int]
+startBiasedBreakPoints c =
     dropWhile (>= l) $ takeWhile (>= 0) $ map (subtract d) $ exampleBreaks
     where
         l = lengthWord8 $ cText c
         d = cOffset c
 
+-- | Bound `exampleBreaks` to the given text container and adjust offsets,
+-- excluding start of text but including end of text.
+--
+-- Container boundaries should therefore only generate one split,
+-- and all splits should have a non-empty prefix.
+endBiasedBreakPoints :: ExampleContainer -> [Int]
+endBiasedBreakPoints c =
+    dropWhile (> l) $ takeWhile (> 0) $ map (subtract d) $ exampleBreaks
+    where
+        l = lengthWord8 $ cText c
+        d = cOffset c
+
 isSpace :: Char -> Bool
 isSpace = (== ' ')
 
 spec :: Spec
 spec = do
+
     describe "splitTextsBy" $ do
-        it "splits example text containers" $ do
-            splitTextsBy exampleBreakPoints exampleContainers `shouldBe`
-                [ ( ne [ contain "Vikipedija " 10, contain "(Википеди" 21 ]
-                  , ne [ contain "ја)" 38 ]
+
+        it "splits example text containers (start bias)" $ do
+            splitTextsBy startBiasedBreakPoints exampleContainers `shouldBe`
+                [ ( [ contain "Vikipedija " 10, contain "(Википеди" 21 ]
+                  , [ contain "ја)" 38 ]
                   )
-                , ( ne [ contain "Vikipedija " 10, contain "(Википе" 21 ]
-                  , ne [ contain "дија)" 34 ]
+                , ( [ contain "Vikipedija " 10, contain "(Википе" 21 ]
+                  , [ contain "дија)" 34 ]
                   )
-                , ( ne [ contain "Vikipedija " 10, contain "(Вики" 21 ]
-                  , ne [ contain "педија)" 30 ]
+                , ( [ contain "Vikipedija " 10, contain "(Вики" 21 ]
+                  , [ contain "педија)" 30 ]
                   )
-                , ( ne [ contain "Vikipedija " 10, contain "(Ви" 21 ]
-                  , ne [ contain "кипедија)" 26 ]
+                , ( [ contain "Vikipedija " 10, contain "(Ви" 21 ]
+                  , [ contain "кипедија)" 26 ]
                   )
-                , ( ne [ contain "Vikipedija " 10 ]
-                  , ne [ contain "(Википедија)" 21 ]
+                , ( [ contain "Vikipedija " 10 ]
+                  , [ contain "(Википедија)" 21 ]
                   )
-                , ( ne [ contain "Vikipedi" 10 ]
-                  , ne [ contain "ja " 18, contain "(Википедија)" 21 ]
+                , ( [ contain "Vikipedi" 10 ]
+                  , [ contain "ja " 18, contain "(Википедија)" 21 ]
                   )
-                , ( ne [ contain "Vikipe" 10 ]
-                  , ne [ contain "dija " 16, contain "(Википедија)" 21 ]
+                , ( [ contain "Vikipe" 10 ]
+                  , [ contain "dija " 16, contain "(Википедија)" 21 ]
                   )
-                , ( ne [ contain "Viki" 10 ]
-                  , ne [ contain "pedija " 14, contain "(Википедија)" 21 ]
+                , ( [ contain "Viki" 10 ]
+                  , [ contain "pedija " 14, contain "(Википедија)" 21 ]
                   )
-                , ( ne [ contain "Vi" 10 ]
-                  , ne [ contain "kipedija " 12, contain "(Википедија)" 21 ]
+                , ( [ contain "Vi" 10 ]
+                  , [ contain "kipedija " 12, contain "(Википедија)" 21 ]
                   )
+                , ( []
+                  , [ contain "Vikipedija " 10, contain "(Википедија)" 21 ]
+                  )
                 ]
-    describe "trimTextsEnd" $ do
+
+        it "splits example text containers (end bias)" $ do
+            splitTextsBy endBiasedBreakPoints exampleContainers `shouldBe`
+                [ ( [ contain "Vikipedija " 10, contain "(Википедија)" 21 ]
+                  , []
+                  )
+                , ( [ contain "Vikipedija " 10, contain "(Википеди" 21 ]
+                  , [ contain "ја)" 38 ]
+                  )
+                , ( [ contain "Vikipedija " 10, contain "(Википе" 21 ]
+                  , [ contain "дија)" 34 ]
+                  )
+                , ( [ contain "Vikipedija " 10, contain "(Вики" 21 ]
+                  , [ contain "педија)" 30 ]
+                  )
+                , ( [ contain "Vikipedija " 10, contain "(Ви" 21 ]
+                  , [ contain "кипедија)" 26 ]
+                  )
+                , ( [ contain "Vikipedija " 10 ]
+                  , [ contain "(Википедија)" 21 ]
+                  )
+                , ( [ contain "Vikipedi" 10 ]
+                  , [ contain "ja " 18, contain "(Википедија)" 21 ]
+                  )
+                , ( [ contain "Vikipe" 10 ]
+                  , [ contain "dija " 16, contain "(Википедија)" 21 ]
+                  )
+                , ( [ contain "Viki" 10 ]
+                  , [ contain "pedija " 14, contain "(Википедија)" 21 ]
+                  )
+                , ( [ contain "Vi" 10 ]
+                  , [ contain "kipedija " 12, contain "(Википедија)" 21 ]
+                  )
+                ]
+
+    describe "dropWhileStartCascade" $ do
+
         describe "isSpace" $ do
+
             it "does nothing on an empty list" $ do
                 let inputTexts = [] :: [Text]
-                trimTextsEnd isSpace inputTexts `shouldBe` inputTexts
-            it "does nothing when last run does not end with space" $ do
+                dropWhileStartCascade isSpace inputTexts `shouldBe` inputTexts
+
+            it "does nothing on list of empty texts" $ do
+                let inputTexts = [empty, empty, empty]
+                dropWhileStartCascade isSpace inputTexts `shouldBe` inputTexts
+
+            it "does nothing when first run does not start with space" $ do
                 let inputTexts = [pack "some ", pack "text"]
-                trimTextsEnd isSpace inputTexts `shouldBe` inputTexts
-            it "trims empty texts down to an empty list" $ do
+                dropWhileStartCascade isSpace inputTexts `shouldBe` inputTexts
+
+            it "does nothing when first non-empty run does not start with space" $ do
+                let inputTexts = [empty, empty, pack "some ", pack "text"]
+                dropWhileStartCascade isSpace inputTexts `shouldBe` inputTexts
+
+            it "trims spaces from first text" $ do
+                let inputTexts = [pack "      some ", pack "text"]
+                dropWhileStartCascade isSpace inputTexts `shouldBe`
+                    [pack "some ", pack "text"]
+
+            it "trims texts containing only spaces to empty" $ do
+                let inputTexts = [pack "    ", pack "some ", pack "text"]
+                dropWhileStartCascade isSpace inputTexts `shouldBe`
+                    [empty, pack "some ", pack "text"]
+
+            it "trims first text that contains non-spaces" $ do
+                let inputTexts = [pack "    ", pack "    some ", pack "text  "]
+                dropWhileStartCascade isSpace inputTexts `shouldBe`
+                    [empty, pack "some ", pack "text  "]
+
+            it "trims space-only input down to empty texts" $ do
+                let inputTexts = [pack " ", pack "  ", pack "   "]
+                dropWhileStartCascade isSpace inputTexts `shouldBe`
+                    [empty, empty, empty]
+
+    describe "dropWhileEndCascade" $ do
+
+        describe "isSpace" $ do
+
+            it "does nothing on an empty list" $ do
+                let inputTexts = [] :: [Text]
+                dropWhileEndCascade isSpace inputTexts `shouldBe` inputTexts
+
+            it "does nothing on list of empty texts" $ do
                 let inputTexts = [empty, empty, empty]
-                trimTextsEnd isSpace inputTexts `shouldBe` []
-            it "trims empty texts from a list" $ do
+                dropWhileEndCascade isSpace inputTexts `shouldBe` inputTexts
+
+            it "does nothing when last run does not end with space" $ do
+                let inputTexts = [pack "some ", pack "text"]
+                dropWhileEndCascade isSpace inputTexts `shouldBe` inputTexts
+
+            it "does nothing when last non-empty run does not end with space" $ do
                 let inputTexts = [pack "some ", pack "text", empty, empty]
-                trimTextsEnd isSpace inputTexts `shouldBe`
-                    [pack "some ", pack "text"]
+                dropWhileEndCascade isSpace inputTexts `shouldBe` inputTexts
+
             it "trims spaces from last text" $ do
                 let inputTexts = [pack "some ", pack "text      "]
-                trimTextsEnd isSpace inputTexts `shouldBe`
+                dropWhileEndCascade isSpace inputTexts `shouldBe`
                     [pack "some ", pack "text"]
-            it "trims texts containing only spaces" $ do
+
+            it "trims texts containing only spaces to empty" $ do
                 let inputTexts = [pack "some ", pack "text", pack "    "]
-                trimTextsEnd isSpace inputTexts `shouldBe`
-                    [pack "some ", pack "text"]
+                dropWhileEndCascade isSpace inputTexts `shouldBe`
+                    [pack "some ", pack "text", empty]
+
             it "trims last text that contains non-spaces" $ do
                 let inputTexts = [pack "some ", pack "text  ", pack "    "]
-                trimTextsEnd isSpace inputTexts `shouldBe`
-                    [pack "some ", pack "text"]
+                dropWhileEndCascade isSpace inputTexts `shouldBe`
+                    [pack "some ", pack "text", empty]
+
+            it "trims space-only input down to empty texts" $ do
+                let inputTexts = [pack " ", pack "  ", pack "   "]
+                dropWhileEndCascade isSpace inputTexts `shouldBe`
+                    [empty, empty, empty]
diff --git a/test/Data/Text/ParagraphLayout/Internal/TreeSpec.hs b/test/Data/Text/ParagraphLayout/Internal/TreeSpec.hs
--- a/test/Data/Text/ParagraphLayout/Internal/TreeSpec.hs
+++ b/test/Data/Text/ParagraphLayout/Internal/TreeSpec.hs
@@ -83,6 +83,48 @@
     ]
     t
 
+sparseTree :: RootNode Int String
+sparseTree = RootBox $ Box
+    [ TextSequence "a" 1
+    , InlineBox
+        "empty box level 1 of 1"
+        (Box
+            []
+            t
+        )
+        defaultBoxOptions
+    , InlineBox
+        "empty box level 1 of 2"
+        (Box
+            [ InlineBox
+                "empty box level 2 of 2"
+                (Box
+                    []
+                    t
+                )
+                defaultBoxOptions
+            ]
+            t
+        )
+        defaultBoxOptions
+    , InlineBox
+        "non-empty box"
+        (Box
+            [ TextSequence "b" 1
+            , InlineBox
+                "empty box in non-empty box"
+                (Box
+                    []
+                    t
+                )
+                defaultBoxOptions
+            ]
+            t
+        )
+        defaultBoxOptions
+    ]
+    t
+
 leafData :: Leaf t d -> d
 leafData (TextLeaf d _ _ _) = d
 
@@ -102,57 +144,77 @@
 spec = do
 
     describe "flatten" $ do
-        let leaves = flatten complexTree
 
-        it "should have one leaf per text sequence" $
-            length leaves `shouldBe` 13
+        describe "complex tree" $ do
+            let leaves = flatten complexTree
 
-        it "leaves should have expected data" $ do
-            map leafData leaves `shouldBe`
-                map (: []) ['a' .. 'm']
+            it "should have one leaf per text sequence" $
+                length leaves `shouldBe` 13
 
-        it "leaves should have expected depths" $ do
-            map leafDepth leaves `shouldBe`
-                [0, 1, 1, 2, 2, 1, 2, 3, 2, 2, 2, 3, 1]
+            it "leaves should have expected data" $ do
+                map leafData leaves `shouldBe`
+                    map (: []) ['a' .. 'm']
 
-        it "leaves should have expected ancestor data" $ do
-            map leafPathData leaves `shouldBe`
-                [ []
-                , ["box1"]
-                , ["box1"]
-                , ["box2", "box1"]
-                , ["box2", "box1"]
-                , ["box1"]
-                , ["box3", "box1"]
-                , ["box4", "box3", "box1"]
-                , ["box3", "box1"]
-                , ["box6", "box5"]
-                , ["box6", "box5"]
-                , ["box8", "box7", "box5"]
-                , ["box5"]
-                ]
+            it "leaves should have expected depths" $ do
+                map leafDepth leaves `shouldBe`
+                    [0, 1, 1, 2, 2, 1, 2, 3, 2, 2, 2, 3, 1]
 
-        it "leaves should have expected ancestor indexes" $ do
-            map leafPathIndexes leaves `shouldBe`
-                [ []
-                , [0]
-                , [0]
-                , [1, 0]
-                , [1, 0]
-                , [0]
-                , [2, 0]
-                , [3, 2, 0]
-                , [2, 0]
-                , [5, 4]
-                , [5, 4]
-                , [7, 6, 4]
-                , [4]
-                ]
+            it "leaves should have expected ancestor data" $ do
+                map leafPathData leaves `shouldBe`
+                    [ []
+                    , ["box1"]
+                    , ["box1"]
+                    , ["box2", "box1"]
+                    , ["box2", "box1"]
+                    , ["box1"]
+                    , ["box3", "box1"]
+                    , ["box4", "box3", "box1"]
+                    , ["box3", "box1"]
+                    , ["box6", "box5"]
+                    , ["box6", "box5"]
+                    , ["box8", "box7", "box5"]
+                    , ["box5"]
+                    ]
 
-        it "leaves 'c' and 'f' should have the same parent" $
-            leafPath (leaves !! 2) !! 0 ==
-            leafPath (leaves !! 5) !! 0 `shouldBe` True
+            it "leaves should have expected ancestor indexes" $ do
+                map leafPathIndexes leaves `shouldBe`
+                    [ []
+                    , [0]
+                    , [0]
+                    , [1, 0]
+                    , [1, 0]
+                    , [0]
+                    , [2, 0]
+                    , [3, 2, 0]
+                    , [2, 0]
+                    , [5, 4]
+                    , [5, 4]
+                    , [7, 6, 4]
+                    , [4]
+                    ]
 
-        it "leaves 'e' and 'i' should have a different parent" $
-            leafPath (leaves !! 4) !! 0 ==
-            leafPath (leaves !! 8) !! 0 `shouldBe` False
+            it "leaves 'c' and 'f' should have the same parent" $
+                leafPath (leaves !! 2) !! 0 ==
+                leafPath (leaves !! 5) !! 0 `shouldBe` True
+
+            it "leaves 'e' and 'i' should have a different parent" $
+                leafPath (leaves !! 4) !! 0 ==
+                leafPath (leaves !! 8) !! 0 `shouldBe` False
+
+        describe "unstrutted sparse tree with empty boxes" $ do
+            let leaves = flatten sparseTree
+
+            it "should have one leaf per text sequence" $
+                length leaves `shouldBe` 2
+
+            it "leaves should have expected data" $ do
+                map leafData leaves `shouldBe` ["a", "b"]
+
+        describe "strutted sparse tree with empty boxes" $ do
+            let leaves = flatten $ strut "d" sparseTree
+
+            it "should have one leaf per text sequence" $
+                length leaves `shouldBe` 5
+
+            it "leaves should have expected data" $ do
+                map leafData leaves `shouldBe` ["a", "d", "d", "b", "d"]
diff --git a/test/Data/Text/ParagraphLayout/Plain/ParagraphData.hs b/test/Data/Text/ParagraphLayout/Plain/ParagraphData.hs
--- a/test/Data/Text/ParagraphLayout/Plain/ParagraphData.hs
+++ b/test/Data/Text/ParagraphLayout/Plain/ParagraphData.hs
@@ -1,6 +1,7 @@
 {-# OPTIONS_GHC -fno-warn-deprecations #-}
 module Data.Text.ParagraphLayout.Plain.ParagraphData
     ( arabicFillerParagraph
+    , arabicHelloParagraph
     , czechHelloParagraph
     , devanagariAccentParagraph
     , devanagariParagraph
@@ -29,6 +30,10 @@
     )
 import Data.Text.ParagraphLayout.ParagraphConstruction
 
+-- | Span with text in the Arabic language.
+ar :: String -> (SpanOptions, String)
+ar = (,) defaultSpanOptions { spanLanguage = "ar" }
+
 -- | Span with text in the Czech language.
 cs :: String -> (SpanOptions, String)
 cs = (,) defaultSpanOptions { spanLanguage = "cs" }
@@ -79,6 +84,11 @@
 
 spannedLoremIpsumParagraph :: ParagraphOptions -> Paragraph ()
 spannedLoremIpsumParagraph = "xxxx" |< zxx "Lorem ipsum dolor " >|< zxx "sit amet, consectetur" >|< zxx " adipiscing elit, sed " >|< zxx "do eiusmod tempor" >|< zxx " incididunt ut labore " >|< zxx "et dolore magna" >|< zxx " aliqua. Ut enim " >|< zxx "ad minim veniam," >|< zxx " quis nostrud exercitation " >|< zxx "ullamco laboris nisi" >|< zxx " ut aliquip ex " >|< zxx "ea commodo consequat." >|< zxx " Duis aute irure " >|< zxx "dolor in reprehenderit" >|< zxx " in voluptate velit " >|< zxx "esse cillum dolore" >|< zxx " eu fugiat nulla " >|< zxx "pariatur. Excepteur" >|< zxx " sint occaecat cupidatat " >|< zxx "non proident, sunt" >|< zxx " in culpa qui " >|< zxx "officia deserunt mollit" >|< zxx " anim id est " >|< zxx "laborum." >| "z"
+
+-- | Source:
+-- <https://en.wikipedia.org/w/index.php?title=As-salamu_alaykum&oldid=1158575357>
+arabicHelloParagraph :: ParagraphOptions -> Paragraph ()
+arabicHelloParagraph = "xxxxx" |< ar "ٱلسَّلَامُ عَلَيْكُمَا!" >| "zz"
 
 czechHelloParagraph :: ParagraphOptions -> Paragraph ()
 czechHelloParagraph = "xxxxx" |< cs "Ahoj, světe!" >| "zz"
diff --git a/test/Data/Text/ParagraphLayout/PlainSpec.hs b/test/Data/Text/ParagraphLayout/PlainSpec.hs
--- a/test/Data/Text/ParagraphLayout/PlainSpec.hs
+++ b/test/Data/Text/ParagraphLayout/PlainSpec.hs
@@ -36,6 +36,11 @@
                 let result = layoutPlain $ emptyParagraph opts
                 result `shouldBe` emptyLayout
 
+            it "wraps by characters when line is ultra narrow" $ do
+                let opts = opts_ { paragraphMaxWidth = 100 }
+                let result = layoutPlain $ arabicHelloParagraph opts
+                result `shouldBeGolden` "arabicHelloParagraphUltraNarrow"
+
             it "wraps filler text at 20em" $ do
                 let opts = opts_ { paragraphMaxWidth = 20000 }
                 let result = layoutPlain $ arabicFillerParagraph opts
diff --git a/test/Data/Text/ParagraphLayout/PrettyShow.hs b/test/Data/Text/ParagraphLayout/PrettyShow.hs
--- a/test/Data/Text/ParagraphLayout/PrettyShow.hs
+++ b/test/Data/Text/ParagraphLayout/PrettyShow.hs
@@ -109,7 +109,7 @@
         ]
 
 instance Show d => PrettyShow (Fragment d) where
-    prettyShow (Fragment d l bs r pen glyphs) = concat
+    prettyShow (Fragment d l bs cr r pen glyphs) = concat
         [ "Fragment"
         , newline
         , indent3
@@ -124,6 +124,10 @@
         , ", fragmentAncestorBoxes ="
         , newline
         , concat $ commaFirstList indent4 $ map show bs
+        , newline
+        , indent3
+        , ", fragmentContentRect = "
+        , show cr
         , newline
         , indent3
         , ", fragmentRect = "
diff --git a/test/Data/Text/ParagraphLayout/RectSpec.hs b/test/Data/Text/ParagraphLayout/RectSpec.hs
--- a/test/Data/Text/ParagraphLayout/RectSpec.hs
+++ b/test/Data/Text/ParagraphLayout/RectSpec.hs
@@ -1,6 +1,7 @@
 module Data.Text.ParagraphLayout.RectSpec (spec) where
 
 import Data.Int (Int32)
+import Data.List.NonEmpty (NonEmpty ((:|)))
 
 import Test.Hspec
 import Data.Text.ParagraphLayout.Internal.Rect
@@ -13,17 +14,121 @@
 
 spec :: Spec
 spec = do
+
     describe "union of two rects" $ do
-        let r = union positiveRect negativeRect
-        it "has origin at 50,-60" $
-            (x_origin r, y_origin r) `shouldBe` (50, -60)
-        it "has minimum coordinates at at 50,-90" $
-            (x_min r, y_min r) `shouldBe` (50, -90)
-        it "has terminus at 80,-90" $
-            (x_terminus r, y_terminus r) `shouldBe` (80, -90)
-        it "has maximum coordinates at 80,-60" $
-            (x_max r, y_max r) `shouldBe` (80, -60)
-        it "has size 30,-30" $
-            (x_size r, y_size r) `shouldBe` (30, -30)
-        it "has absolute size 30,30" $
-            (width r, height r) `shouldBe` (30, 30)
+
+        describe "low X, low Y" $
+            llSpec $ union LL positiveRect negativeRect
+
+        describe "low X, high Y" $
+            lhSpec $ union LH positiveRect negativeRect
+
+        describe "high X, low Y" $
+            hlSpec $ union HL positiveRect negativeRect
+
+        describe "high X, high Y" $
+            hhSpec $ union HH positiveRect negativeRect
+
+    describe "union of list" $ do
+
+        describe "when empty" $
+            it "should be Nothing" $ do
+                unionMany LL []
+                    `shouldBe` (Nothing :: Maybe (Rect Int32))
+
+        describe "with single item" $ do
+
+            describe "matching LL origin" $
+                it "should be identity" $
+                    unionMany LL [positiveRect]
+                        `shouldBe` Just positiveRect
+
+            describe "matching HH origin" $
+                it "should be identity" $
+                    unionMany HH [negativeRect]
+                        `shouldBe` Just negativeRect
+
+        describe "with single item repeated" $ do
+
+            describe "matching LL origin" $
+                it "should be equal to item" $
+                    unionMany LL (replicate 2 positiveRect)
+                        `shouldBe` Just positiveRect
+
+            describe "matching HH origin" $
+                it "should be equal to item" $
+                    unionMany HH (replicate 7 negativeRect)
+                        `shouldBe` Just negativeRect
+
+        describe "with two items" $
+            it "should behave the same as binary function" $
+                unionMany LL [positiveRect, negativeRect]
+                    `shouldBe` Just (union LL positiveRect negativeRect)
+
+    describe "union of non-empty list" $ do
+
+        describe "with single item" $ do
+
+            describe "matching LL origin" $
+                it "should be identity" $
+                    unionMany1 LL (positiveRect :| [])
+                        `shouldBe` positiveRect
+
+            describe "matching HH origin" $
+                it "should be identity" $
+                    unionMany1 HH (negativeRect :| [])
+                        `shouldBe` negativeRect
+
+        describe "with two items" $
+            it "should behave the same as binary function" $
+                unionMany1 LL (positiveRect :| [negativeRect])
+                    `shouldBe` union LL positiveRect negativeRect
+
+llSpec :: Rect Int32 -> SpecWith ()
+llSpec r = do
+    commonSpec r
+    it "has origin at 50,-90" $
+        (x_origin r, y_origin r) `shouldBe` (50, -90)
+    it "has terminus at 80,-60" $
+        (x_terminus r, y_terminus r) `shouldBe` (80, -60)
+    it "has size 30,30" $
+        (x_size r, y_size r) `shouldBe` (30, 30)
+
+lhSpec :: Rect Int32 -> SpecWith ()
+lhSpec r = do
+    commonSpec r
+    it "has origin at 50,-60" $
+        (x_origin r, y_origin r) `shouldBe` (50, -60)
+    it "has terminus at 80,-90" $
+        (x_terminus r, y_terminus r) `shouldBe` (80, -90)
+    it "has size 30,-30" $
+        (x_size r, y_size r) `shouldBe` (30, -30)
+
+hlSpec :: Rect Int32 -> SpecWith ()
+hlSpec r = do
+    commonSpec r
+    it "has origin at 80,-90" $
+        (x_origin r, y_origin r) `shouldBe` (80, -90)
+    it "has terminus at 50,-60" $
+        (x_terminus r, y_terminus r) `shouldBe` (50, -60)
+    it "has size -30,30" $
+        (x_size r, y_size r) `shouldBe` (-30, 30)
+
+hhSpec :: Rect Int32 -> SpecWith ()
+hhSpec r = do
+    commonSpec r
+    it "has origin at 80,-60" $
+        (x_origin r, y_origin r) `shouldBe` (80, -60)
+    it "has terminus at 50,-90" $
+        (x_terminus r, y_terminus r) `shouldBe` (50, -90)
+    it "has size -30,-30" $
+        (x_size r, y_size r) `shouldBe` (-30, -30)
+
+commonSpec :: Rect Int32 -> SpecWith ()
+commonSpec r = do
+    it "has minimum coordinates at at 50,-90" $
+        (x_min r, y_min r) `shouldBe` (50, -90)
+    it "has maximum coordinates at 80,-60" $
+        (x_max r, y_max r) `shouldBe` (80, -60)
+    it "has absolute size 30,30" $
+        (width r, height r) `shouldBe` (30, 30)
diff --git a/test/Data/Text/ParagraphLayout/Rich/ParagraphData.hs b/test/Data/Text/ParagraphLayout/Rich/ParagraphData.hs
--- a/test/Data/Text/ParagraphLayout/Rich/ParagraphData.hs
+++ b/test/Data/Text/ParagraphLayout/Rich/ParagraphData.hs
@@ -1,14 +1,22 @@
 module Data.Text.ParagraphLayout.Rich.ParagraphData
-    ( hardBoxBreakLTRParagraph
+    ( emptyBoxParagraph
+    , hardBoxBreakLTRParagraph
     , hardBoxBreakRTLParagraph
+    , intraWordBreakParagraph
     , loremIpsumParagraph
     , mixedDirectionComplexParagraph
     , mixedDirectionSimpleParagraph
+    , mixedLineHeightParagraph
     , mixedScriptParagraph
     , mixedSizesParagraph
     , nestedBoxesParagraph
     , neutralDirectionParagraph
+    , newline1Paragraph
+    , newline1TextParagraph
+    , newline2Paragraph
+    , newline2TextParagraph
     , softBreakParagraph
+    , spaceBoxParagraph
     )
 where
 
@@ -21,6 +29,7 @@
 import Data.Text.ParagraphLayout.Internal.Rich.Paragraph
 import Data.Text.ParagraphLayout.Internal.TextOptions
 import Data.Text.ParagraphLayout.Internal.Tree
+import Data.Text.ParagraphLayout.Rich
 import Data.Text.ParagraphLayout.TextData
 
 tLTR :: TextOptions
@@ -41,6 +50,22 @@
 text :: d -> String -> InnerNode Text d
 text label contents = TextSequence label (pack contents)
 
+emptyBoxParagraph :: Font -> ParagraphOptions -> Paragraph String
+emptyBoxParagraph font = constructParagraph
+    (pack "prefix")
+    (rootBox t
+        [ text "text1" "empty "
+        , box "box1" b t
+            [ text "emptyText" ""
+            ]
+        , text "text2" " box"
+        ]
+    )
+    (pack "suffix")
+    where
+        b = b_ { boxSpacing = BoxSpacingLeftRight 50 100 }
+        t = tLTR { textFont = font, textLanguage = "en" }
+
 hardBoxBreakLTRParagraph :: Font -> ParagraphOptions -> Paragraph String
 hardBoxBreakLTRParagraph font = constructParagraph
     (pack "prefix")
@@ -79,6 +104,19 @@
         b2 = b_ { boxSpacing = BoxSpacingLeftRight 150 200 }
         t = tRTL { textFont = font, textLanguage = "zxx" }
 
+-- | For testing that soft wrap preserves the form of Arabic characters.
+-- Source: <https://www.w3.org/TR/css-text-3/#word-break-shaping>
+intraWordBreakParagraph :: Font -> ParagraphOptions -> Paragraph String
+intraWordBreakParagraph font = constructParagraph
+    empty
+    (rootBox t
+        [ text "text" "نوشتن_نوشتن_نوشتن"
+        ]
+    )
+    empty
+    where
+        t = tRTL { textFont = font, textLanguage = "fa" }
+
 -- | Filler text using the Latin script.
 -- Source: <https://www.lipsum.com/>
 loremIpsumParagraph :: Font -> ParagraphOptions -> Paragraph String
@@ -133,6 +171,45 @@
         t = (defaultTextOptions dir) { textFont = font, textLanguage = lang }
         (_, lang, textContents, _) = mixedDirectionSimple dir
 
+mixedLineHeightParagraph :: (Int32, Int32, Int32) -> Font -> ParagraphOptions ->
+    Paragraph String
+mixedLineHeightParagraph (lhSmall, lhMedium, lhLarge) font = constructParagraph
+    (pack "prefix")
+    (rootBox tMedium
+        -- Line 1: all 3 heights, with medium height prevailing.
+        [ text "mediumText" "medium "
+        , box "smallBox" b_ tSmall [text "smallText" "small "]
+        , text "mediumText" "medium "
+        , box "largeBox" b_ tLarge [text "largeText" "large "]
+        , text "mediumText" "medium "
+        , text "lineBreak" "\n"
+        -- Line 2: all 3 line heights, with medium only in the middle.
+        , box "smallBox" b_ tSmall [text "smallText" "small "]
+        , text "mediumText" "medium "
+        , box "largeBox" b_ tLarge [text "largeText" "large "]
+        , text "lineBreak" "\n"
+        -- Line 3: asymmetric, medium changing into small.
+        , text "mediumText" "medium "
+        , box "smallBox" b_ tSmall [text "smallText" "small "]
+        , text "lineBreak" "\n"
+        -- Line 4: asymmetric, large changing into medium.
+        , box "largeBox" b_ tLarge [text "largeText" "large "]
+        , text "mediumText" "medium "
+        , text "lineBreak" "\n"
+        -- Line 5: small only.
+        , box "smallBox" b_ tSmall [text "smallText" "small "]
+        , text "lineBreak" "\n"
+        -- Line 6: large only.
+        , box "largeBox" b_ tLarge [text "largeText" "large "]
+        ]
+    )
+    (pack "suffix")
+    where
+        tLarge = t { textLineHeight = Absolute lhLarge }
+        tMedium = t { textLineHeight = Absolute lhMedium }
+        tSmall = t { textLineHeight = Absolute lhSmall }
+        t = tLTR { textFont = font, textLanguage = "en" }
+
 mixedScriptParagraph :: Font -> ParagraphOptions -> Paragraph String
 mixedScriptParagraph font = constructParagraph
     (pack "prefix")
@@ -206,6 +283,38 @@
     where
         t = (defaultTextOptions dir) { textFont = font, textLanguage = "zxx" }
 
+newline1Paragraph :: Font -> ParagraphOptions -> Paragraph String
+newline1Paragraph font = constructParagraph
+    (pack "prefix")
+    (rootBox t [ text "text" "\n" ])
+    (pack "suffix")
+    where
+        t = tRTL { textFont = font, textLanguage = "zxx" }
+
+newline1TextParagraph :: Font -> ParagraphOptions -> Paragraph String
+newline1TextParagraph font = constructParagraph
+    (pack "prefix")
+    (rootBox t [ text "text" "\nt" ])
+    (pack "suffix")
+    where
+        t = tRTL { textFont = font, textLanguage = "zxx" }
+
+newline2Paragraph :: Font -> ParagraphOptions -> Paragraph String
+newline2Paragraph font = constructParagraph
+    (pack "prefix")
+    (rootBox t [ text "text" "\n\n" ])
+    (pack "suffix")
+    where
+        t = tRTL { textFont = font, textLanguage = "zxx" }
+
+newline2TextParagraph :: Font -> ParagraphOptions -> Paragraph String
+newline2TextParagraph font = constructParagraph
+    (pack "prefix")
+    (rootBox t [ text "text" "\n\nt" ])
+    (pack "suffix")
+    where
+        t = tRTL { textFont = font, textLanguage = "zxx" }
+
 softBreakParagraph :: Int32 -> Font -> ParagraphOptions -> Paragraph String
 softBreakParagraph spacing font = constructParagraph
     (pack "prefix")
@@ -222,4 +331,23 @@
     (pack "suffix")
     where
         b = b_ { boxSpacing = BoxSpacingLeftRight spacing spacing }
+        t = tLTR { textFont = font, textLanguage = "en" }
+
+spaceBoxParagraph :: BoxCollapse -> Font -> ParagraphOptions -> Paragraph String
+spaceBoxParagraph collapse font = constructParagraph
+    (pack "prefix")
+    (rootBox t
+        [ text "text1" "space"
+        , box "box1" b t
+            [ text "text2" " "
+            ]
+        , text "text3" "box"
+        ]
+    )
+    (pack "suffix")
+    where
+        b = b_
+            { boxCollapse = collapse
+            , boxSpacing = BoxSpacingLeftRight 50 100
+            }
         t = tLTR { textFont = font, textLanguage = "en" }
diff --git a/test/Data/Text/ParagraphLayout/RichSpec.hs b/test/Data/Text/ParagraphLayout/RichSpec.hs
--- a/test/Data/Text/ParagraphLayout/RichSpec.hs
+++ b/test/Data/Text/ParagraphLayout/RichSpec.hs
@@ -1,13 +1,15 @@
 module Data.Text.ParagraphLayout.RichSpec (spec) where
 
 import Data.Int (Int32)
-import Data.Text.Glyphize (Direction (DirLTR, DirRTL))
+import Data.Word (Word32)
+import Data.Text.Glyphize (Direction (DirLTR, DirRTL), codepoint)
 
 import Test.Hspec
 import System.FilePath ((</>))
 import Data.Text.ParagraphLayout
 import Data.Text.ParagraphLayout.FontLoader
 import Data.Text.ParagraphLayout.Internal.Paginable (paginateAll)
+import Data.Text.ParagraphLayout.Internal.ParagraphLine (forceLeftAlign)
 import Data.Text.ParagraphLayout.Internal.Rich.ParagraphLayout (shapedRuns)
 import Data.Text.ParagraphLayout.PrettyShow
 import Data.Text.ParagraphLayout.PrettyShow.Golden
@@ -19,6 +21,28 @@
 fragmentRects p = map toItem $ paragraphFragments p
     where toItem (Fragment { fragmentUserData = d, fragmentRect = r }) = (d, r)
 
+glyphRuns :: ParagraphLayout d -> [[Word32]]
+glyphRuns = map (map (codepoint . fst) . fragmentGlyphs) . paragraphFragments
+
+-- | A sufficiently large number to prevent line breaking,
+-- while being round so that coordinates in test results are easy to read.
+largeWidth :: Int32
+largeWidth = 1000000000
+
+-- | Expect two paragraph layouts to contain the same fragments,
+-- except possibly shifted left or right.
+shouldBeWrappedLike :: (Show d, Eq d) =>
+    ParagraphLayout d -> ParagraphLayout d -> Expectation
+shouldBeWrappedLike a b =
+    forceLeftAlign a `shouldBe` forceLeftAlign b
+
+-- | Expect two paragraph layouts to not contain the same fragments,
+-- even if ignoring a possible shift to the left or to the right.
+shouldNotBeWrappedLike :: (Show d, Eq d) =>
+    ParagraphLayout d -> ParagraphLayout d -> Expectation
+shouldNotBeWrappedLike a b =
+    forceLeftAlign a `shouldNotBe` forceLeftAlign b
+
 spec :: Spec
 spec = do
 
@@ -31,38 +55,167 @@
             font <- runIO $ loadFont latinFont 0 testingOptions
             fontSmall <- runIO $ loadFont latinFont 0 testingOptionsSmall
 
-            it "wraps lorem ipsum at 20em" $ do
-                let opts = defaultParagraphOptions { paragraphMaxWidth = 20000 }
-                let input = loremIpsumParagraph font opts
+            let commonWrapWidth = 20000
+            let expectedSafeWidth = 19791
+
+            describe "lorem ipsum at 20em, left aligned" $ do
+                let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignLeft
+                        }
+                let input w = loremIpsumParagraph font $
+                        opts { paragraphMaxWidth = w }
+                let result20em = layoutRich $ input commonWrapWidth
+                let resultSafe = layoutRich $ input expectedSafeWidth
+                let resultUnsafe = layoutRich $ input (expectedSafeWidth - 1)
+
+                it "wraps correctly" $
+                    result20em `shouldBeGolden` "loremIpsum20em"
+
+                it "gives correct safe width" $
+                    paragraphSafeWidth result20em `shouldBe` expectedSafeWidth
+
+                it "wraps the same at safe width" $
+                    resultSafe `shouldBeWrappedLike` result20em
+
+                it "does not wrap the same at smaller width" $
+                    resultUnsafe `shouldNotBeWrappedLike` result20em
+
+            describe "lorem ipsum at 20em, right aligned" $ do
+                let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignRight
+                        }
+                let input w = loremIpsumParagraph font $
+                        opts { paragraphMaxWidth = w }
+                let result20em = layoutRich $ input commonWrapWidth
+                let resultSafe = layoutRich $ input expectedSafeWidth
+                let resultUnsafe = layoutRich $ input (expectedSafeWidth - 1)
+
+                it "wraps correctly" $
+                    result20em `shouldBeGolden` "loremIpsum20emRight"
+
+                it "gives correct safe width" $
+                    paragraphSafeWidth result20em `shouldBe` expectedSafeWidth
+
+                it "wraps the same at safe width" $
+                    resultSafe `shouldBeWrappedLike` result20em
+
+                it "does not wrap the same at smaller width" $
+                    resultUnsafe `shouldNotBeWrappedLike` result20em
+
+            describe "lorem ipsum at 20em, centred" $ do
+                let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignCentreH
+                        }
+                let input w = loremIpsumParagraph font $
+                        opts { paragraphMaxWidth = w }
+                let result20em = layoutRich $ input commonWrapWidth
+                let resultSafe = layoutRich $ input expectedSafeWidth
+                let resultUnsafe = layoutRich $ input (expectedSafeWidth - 1)
+                let resultUnsafe2 = layoutRich $ input (expectedSafeWidth - 2)
+
+                it "wraps correctly" $
+                    result20em `shouldBeGolden` "loremIpsum20emCentre"
+
+                it "gives correct safe width" $
+                    paragraphSafeWidth result20em `shouldBe` expectedSafeWidth
+
+                it "wraps the same at safe width" $
+                    resultSafe `shouldBeWrappedLike` result20em
+
+                it "does not wrap the same at smaller width" $
+                    resultUnsafe `shouldNotBeWrappedLike` result20em
+
+                -- Cover for false negatives when halving odd numbers.
+                it "does not wrap the same at 2 units smaller width" $
+                    resultUnsafe2 `shouldNotBeWrappedLike` result20em
+
+            it "handles mixed line height" $ do
+                let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignStart
+                        , paragraphMaxWidth = largeWidth
+                        }
+                let lineHeights = (800, 1300, 1700)
+                let input = mixedLineHeightParagraph lineHeights font opts
                 let result = layoutRich input
-                result `shouldBeGolden` "loremIpsum20em"
+                result `shouldBeGolden` "mixedLineHeight"
 
             it "handles mixed sizes" $ do
                 let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignStart
+                        , paragraphMaxWidth = largeWidth
+                        }
                 let input = mixedSizesParagraph (font, fontSmall) opts
                 let result = layoutRich input
                 result `shouldBeGolden` "mixedSizes"
 
             it "handles mixed script" $ do
                 let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignStart
+                        , paragraphMaxWidth = largeWidth
+                        }
                 let input = mixedScriptParagraph font opts
                 let result = layoutRich input
                 result `shouldBeGolden` "mixedScript"
 
             it "handles mixed script with line wraps" $ do
-                let opts = defaultParagraphOptions { paragraphMaxWidth = 5000 }
+                let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignStart
+                        , paragraphMaxWidth = 5000
+                        }
                 let input = mixedScriptParagraph font opts
                 let result = layoutRich input
                 result `shouldBeGolden` "mixedScriptWrap"
 
+            it "handles empty box in the middle of the line" $ do
+                let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignStart
+                        , paragraphMaxWidth = 5193
+                        }
+                let input = emptyBoxParagraph font opts
+                let result = layoutRich input
+                result `shouldBeGolden` "emptyBoxMiddle"
+
+            it "handles space box in the middle of the line" $ do
+                let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignStart
+                        , paragraphMaxWidth = 4635
+                        }
+                let input = spaceBoxParagraph AllowBoxCollapse font opts
+                let result = layoutRich input
+                result `shouldBeGolden` "spaceBoxMiddle"
+
+            it "can collapse space box when on its own line" $ do
+                let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignStart
+                        , paragraphMaxWidth = 100
+                        }
+                let input = spaceBoxParagraph AllowBoxCollapse font opts
+                let result = layoutRich input
+                result `shouldBeGolden` "spaceBoxCollapsed"
+
+            it "can preserve space box when on its own line" $ do
+                let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignStart
+                        , paragraphMaxWidth = 100
+                        }
+                let input = spaceBoxParagraph AvoidBoxCollapse font opts
+                let result = layoutRich input
+                result `shouldBeGolden` "spaceBoxPreserved"
+
             it "handles nested boxes" $ do
                 let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignStart
+                        , paragraphMaxWidth = largeWidth
+                        }
                 let input = nestedBoxesParagraph font opts
                 let result = layoutRich input
                 result `shouldBeGolden` "nestedBoxes"
 
             it "handles hard break in LTR boxes" $ do
                 let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignStart
+                        , paragraphMaxWidth = largeWidth
+                        }
                 let input = hardBoxBreakLTRParagraph font opts
                 let result = layoutRich input
                 result `shouldBeGolden` "hardBoxBreakLTR"
@@ -79,7 +232,10 @@
                         originX + (sum $ take (n - 1) wordAdvancesWithSpace)
                 let endX = originX + (sum wordAdvancesWithSpace)
                 -- A paragraph exactly wide enough to fit the whole text.
-                let opts = defaultParagraphOptions { paragraphMaxWidth = endX }
+                let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignStart
+                        , paragraphMaxWidth = endX
+                        }
                 -- Small spacing that should push one word onto the next line.
                 let s = 5
                 -- Large spacing that should push two words onto the next line.
@@ -116,48 +272,129 @@
         describe "with Arabic font" $ do
             font <- runIO $ loadFont arabicFont 0 testingOptions
 
+            it "makes space for one newline" $ do
+                let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignStart
+                        , paragraphMaxWidth = largeWidth
+                        }
+                let input = newline1Paragraph font opts
+                let result = layoutRich input
+                result `shouldBeGolden` "newline1Paragraph"
+
+            it "makes space for one newline plus text" $ do
+                let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignStart
+                        , paragraphMaxWidth = largeWidth
+                        }
+                let input = newline1TextParagraph font opts
+                let result = layoutRich input
+                result `shouldBeGolden` "newline1TextParagraph"
+
+            it "makes space for two newlines" $ do
+                let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignStart
+                        , paragraphMaxWidth = largeWidth
+                        }
+                let input = newline2Paragraph font opts
+                let result = layoutRich input
+                result `shouldBeGolden` "newline2Paragraph"
+
+            it "makes space for two newlines plus text" $ do
+                let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignStart
+                        , paragraphMaxWidth = largeWidth
+                        }
+                let input = newline2TextParagraph font opts
+                let result = layoutRich input
+                result `shouldBeGolden` "newline2TextParagraph"
+
             it "handles hard break in RTL boxes" $ do
                 let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignStart
+                        , paragraphMaxWidth = largeWidth
+                        }
                 let input = hardBoxBreakRTLParagraph font opts
                 let result = layoutRich input
                 result `shouldBeGolden` "hardBoxBreakRTL"
 
             it "handles neutral characters in RTL paragraph" $ do
                 let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignStart
+                        , paragraphMaxWidth = largeWidth
+                        }
                 let input = neutralDirectionParagraph DirRTL font opts
                 let result = layoutRich input
                 result `shouldBeGolden` "neutralDirectionRTL"
 
             it "handles neutral characters in LTR paragraph" $ do
                 let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignStart
+                        , paragraphMaxWidth = largeWidth
+                        }
                 let input = neutralDirectionParagraph DirLTR font opts
                 let result = layoutRich input
                 result `shouldBeGolden` "neutralDirectionLTR"
 
             it "handles simple mixed direction in RTL paragraph" $ do
                 let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignStart
+                        , paragraphMaxWidth = largeWidth
+                        }
                 let input = mixedDirectionSimpleParagraph DirRTL font opts
                 let result = layoutRich input
                 result `shouldBeGolden` "mixedDirectionSimpleRTL"
 
             it "handles simple mixed direction in LTR paragraph" $ do
                 let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignStart
+                        , paragraphMaxWidth = largeWidth
+                        }
                 let input = mixedDirectionSimpleParagraph DirLTR font opts
                 let result = layoutRich input
                 result `shouldBeGolden` "mixedDirectionSimpleLTR"
 
             it "handles complex mixed direction in RTL paragraph" $ do
                 let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignStart
+                        , paragraphMaxWidth = largeWidth
+                        }
                 let input = mixedDirectionComplexParagraph DirRTL font opts
                 let result = layoutRich input
                 result `shouldBeGolden` "mixedDirectionComplexRTL"
 
             it "handles complex mixed direction in LTR paragraph" $ do
                 let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignStart
+                        , paragraphMaxWidth = largeWidth
+                        }
                 let input = mixedDirectionComplexParagraph DirLTR font opts
                 let result = layoutRich input
                 result `shouldBeGolden` "mixedDirectionComplexLTR"
 
+            it "preserves joining forms across soft breaks" $ do
+                let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignStart
+                        , paragraphMaxWidth = 4500
+                        }
+                let input = intraWordBreakParagraph font opts
+                let glyphRunsVisual = glyphRuns $ layoutRich input
+                let glyphRunsLogical = map reverse glyphRunsVisual
+                -- Glyph indexes for the corresponding Arabic letters/ligatures:
+                let n_initial = 407
+                let v_final = 971
+                let sh_initial = 373
+                let tn_final = 1363
+                -- Glyph index for the underscore used to break repetitions:
+                let sp = 89
+                -- Unconventional code formatting here shows that there should
+                -- be three repetitions of the same glyph sequence, unaffected
+                -- by the line break inserted after an initial form and before
+                -- a final form.
+                glyphRunsLogical `shouldBe`
+                    [[n_initial, v_final, sh_initial, tn_final, sp,
+                    n_initial, v_final, sh_initial], [tn_final, sp,
+                    n_initial, v_final, sh_initial, tn_final]]
+
     describe "paginate" $ do
         let
             goldenDir = ".golden" </> "paginatedRichParagraphLayout"
@@ -167,7 +404,10 @@
             font <- runIO $ loadFont latinFont 0 testingOptions
 
             it "wraps lorem ipsum at 20em" $ do
-                let opts = defaultParagraphOptions { paragraphMaxWidth = 20000 }
+                let opts = defaultParagraphOptions
+                        { paragraphAlignment = AlignStart
+                        , paragraphMaxWidth = 20000
+                        }
                 let input = loremIpsumParagraph font opts
                 let pl = layoutRich input
                 let popts = PageOptions
@@ -195,13 +435,24 @@
             let fontPath = arabicFont
             font <- runIO $ loadFont fontPath 0 demoOptions
 
-            let
-                opts = defaultParagraphOptions
-                input = mixedDirectionComplexParagraph DirRTL font opts
-                result = layoutRich input
-                shapedRunsSpec = shapedRunsSpecWithFont fontPath font
+            let shapedRunsSpec = shapedRunsSpecWithFont fontPath font
 
             shapedRunsSpec
                 "handles complex mixed direction in RTL paragraph"
-                "mixedDirectionComplexRTL"
-                result
+                "mixedDirectionComplexRTL" $
+                layoutRich $
+                mixedDirectionComplexParagraph DirRTL font $
+                defaultParagraphOptions
+                    { paragraphAlignment = AlignStart
+                    , paragraphMaxWidth = 640
+                    }
+
+            shapedRunsSpec
+                "preserves joining forms across soft breaks"
+                "intraWordBreak" $
+                layoutRich $
+                intraWordBreakParagraph font $
+                defaultParagraphOptions
+                    { paragraphAlignment = AlignStart
+                    , paragraphMaxWidth = 144
+                    }
