From 639a8d0dc01171130c84903b512c200c659bc537 Mon Sep 17 00:00:00 2001 From: PgBiel <9021226+PgBiel@users.noreply.github.com> Date: Sat, 9 Mar 2024 12:48:48 -0300 Subject: [PATCH] Repeatable Table Footers [More Flexible Tables Pt.6a] (#3577) Co-authored-by: Laurenz --- crates/typst/src/layout/grid/layout.rs | 528 +++++++++++++++++++---- crates/typst/src/layout/grid/lines.rs | 40 +- crates/typst/src/layout/grid/mod.rs | 41 +- crates/typst/src/layout/grid/rowspans.rs | 190 +++++--- crates/typst/src/model/table.rs | 45 +- tests/ref/layout/grid-footers-1.png | Bin 0 -> 50791 bytes tests/ref/layout/grid-footers-2.png | Bin 0 -> 52405 bytes tests/ref/layout/grid-footers-3.png | Bin 0 -> 52783 bytes tests/ref/layout/grid-footers-4.png | Bin 0 -> 20513 bytes tests/ref/layout/grid-footers-5.png | Bin 0 -> 5769 bytes tests/typ/layout/grid-footers-1.typ | 192 +++++++++ tests/typ/layout/grid-footers-2.typ | 31 ++ tests/typ/layout/grid-footers-3.typ | 44 ++ tests/typ/layout/grid-footers-4.typ | 42 ++ tests/typ/layout/grid-footers-5.typ | 28 ++ tests/typ/layout/grid-headers-1.typ | 8 +- 16 files changed, 1007 insertions(+), 182 deletions(-) create mode 100644 tests/ref/layout/grid-footers-1.png create mode 100644 tests/ref/layout/grid-footers-2.png create mode 100644 tests/ref/layout/grid-footers-3.png create mode 100644 tests/ref/layout/grid-footers-4.png create mode 100644 tests/ref/layout/grid-footers-5.png create mode 100644 tests/typ/layout/grid-footers-1.typ create mode 100644 tests/typ/layout/grid-footers-2.typ create mode 100644 tests/typ/layout/grid-footers-3.typ create mode 100644 tests/typ/layout/grid-footers-4.typ create mode 100644 tests/typ/layout/grid-footers-5.typ diff --git a/crates/typst/src/layout/grid/layout.rs b/crates/typst/src/layout/grid/layout.rs index c18a50351..354e6814d 100644 --- a/crates/typst/src/layout/grid/layout.rs +++ b/crates/typst/src/layout/grid/layout.rs @@ -248,6 +248,40 @@ pub(super) struct Header { pub(super) end: usize, } +/// A repeatable grid footer. Stops at the last row. +pub(super) struct Footer { + /// The first row included in this footer. + pub(super) start: usize, +} + +/// A possibly repeatable grid object. +/// It still exists even when not repeatable, but must not have additional +/// considerations by grid layout, other than for consistency (such as making +/// a certain group of rows unbreakable). +pub(super) enum Repeatable { + Repeated(T), + NotRepeated(T), +} + +impl Repeatable { + /// Gets the value inside this repeatable, regardless of whether + /// it repeats. + pub(super) fn unwrap(&self) -> &T { + match self { + Self::Repeated(repeated) => repeated, + Self::NotRepeated(not_repeated) => not_repeated, + } + } + + /// Returns `Some` if the value is repeated, `None` otherwise. + pub(super) fn as_repeated(&self) -> Option<&T> { + match self { + Self::Repeated(repeated) => Some(repeated), + Self::NotRepeated(_) => None, + } + } +} + /// A grid item, possibly affected by automatic cell positioning. Can be either /// a line or a cell. pub enum ResolvableGridItem { @@ -284,6 +318,7 @@ pub enum ResolvableGridItem { /// Any grid child, which can be either a header or an item. pub enum ResolvableGridChild { Header { repeat: bool, span: Span, items: I }, + Footer { repeat: bool, span: Span, items: I }, Item(ResolvableGridItem), } @@ -340,7 +375,9 @@ pub struct CellGrid { /// Contains up to 'rows_without_gutter.len() + 1' vectors of lines. pub(super) hlines: Vec>, /// The repeatable header of this grid. - pub(super) header: Option
, + pub(super) header: Option>, + /// The repeatable footer of this grid. + pub(super) footer: Option>, /// Whether this grid has gutters. pub(super) has_gutter: bool, } @@ -353,7 +390,7 @@ impl CellGrid { cells: impl IntoIterator, ) -> Self { let entries = cells.into_iter().map(Entry::Cell).collect(); - Self::new_internal(tracks, gutter, vec![], vec![], None, entries) + Self::new_internal(tracks, gutter, vec![], vec![], None, None, entries) } /// Resolves and positions all cells in the grid before creating it. @@ -398,6 +435,11 @@ impl CellGrid { let mut header: Option
= None; let mut repeat_header = false; + // Stores where the footer is supposed to end, its span, and the + // actual footer structure. + let mut footer: Option<(usize, Span, Footer)> = None; + let mut repeat_footer = false; + // Resolve the breakability of a cell, based on whether or not it spans // an auto row. let resolve_breakable = |y, rowspan| { @@ -447,19 +489,20 @@ impl CellGrid { let mut resolved_cells: Vec> = Vec::with_capacity(child_count); for child in children { let mut is_header = false; - let mut header_start = usize::MAX; - let mut header_end = 0; - let mut header_span = Span::detached(); + let mut is_footer = false; + let mut child_start = usize::MAX; + let mut child_end = 0; + let mut child_span = Span::detached(); let mut min_auto_index = 0; - let (header_items, simple_item) = match child { + let (header_footer_items, simple_item) = match child { ResolvableGridChild::Header { repeat, span, items, .. } => { if header.is_some() { bail!(span, "cannot have more than one header"); } is_header = true; - header_span = span; + child_span = span; repeat_header = repeat; // If any cell in the header is automatically positioned, @@ -472,9 +515,30 @@ impl CellGrid { (Some(items), None) } + ResolvableGridChild::Footer { repeat, span, items, .. } => { + if footer.is_some() { + bail!(span, "cannot have more than one footer"); + } + + is_footer = true; + child_span = span; + repeat_footer = repeat; + + // If any cell in the footer is automatically positioned, + // have it skip to the next row. This is to avoid having a + // footer after a partially filled row just add cells to + // that row instead of starting a new one. + min_auto_index = auto_index.next_multiple_of(c); + + (Some(items), None) + } ResolvableGridChild::Item(item) => (None, Some(item)), }; - let items = header_items.into_iter().flatten().chain(simple_item.into_iter()); + + let items = header_footer_items + .into_iter() + .flatten() + .chain(simple_item.into_iter()); for item in items { let cell = match item { ResolvableGridItem::HLine { @@ -505,7 +569,7 @@ impl CellGrid { // minimum it should have for the current grid // child. Effectively, this means that a hline at // the start of a header will always appear above - // that header's first row. + // that header's first row. Similarly for footers. auto_index .max(min_auto_index) .checked_sub(1) @@ -560,7 +624,7 @@ impl CellGrid { // index. For example, this means that a vline at // the beginning of a header will be placed to its // left rather than after the previous - // automatically positioned cell. + // automatically positioned cell. Same for footers. auto_index .checked_sub(1) .filter(|last_auto_index| { @@ -706,25 +770,30 @@ impl CellGrid { } } - if is_header { - // Ensure each cell in a header is fully contained within - // the header. - header_start = header_start.min(y); - header_end = header_end.max(y + rowspan); + if is_header || is_footer { + // Ensure each cell in a header or footer is fully + // contained within it. + child_start = child_start.min(y); + child_end = child_end.max(y + rowspan); + } + } + + if (is_header || is_footer) && child_start == usize::MAX { + // Empty header/footer: consider the header/footer to be + // one row after the latest auto index. + child_start = auto_index.div_ceil(c); + child_end = child_start + 1; + + if resolved_cells.len() <= c * child_start { + // Ensure the automatically chosen row actually exists. + resolved_cells.resize_with(c * (child_start + 1), || None); } } if is_header { - if header_start == usize::MAX { - // Empty header: consider the header to be one row after - // the latest auto index. - header_start = auto_index.next_multiple_of(c) / c; - header_end = header_start + 1; - } - - if header_start != 0 { + if child_start != 0 { bail!( - header_span, + child_span, "header must start at the first row"; hint: "remove any rows before the header" ); @@ -735,9 +804,29 @@ impl CellGrid { // is gutter. But only once all cells have been analyzed // and the header has fully expanded in the fixup loop // below. - end: header_end, + end: child_end, }); + } + if is_footer { + // Only check if the footer is at the end later, once we know + // the final amount of rows. + footer = Some(( + child_end, + child_span, + Footer { + // Later on, we have to correct this number in case there + // is gutter, but only once all cells have been analyzed + // and the header's and footer's exact boundaries are + // known. That is because the gutter row immediately + // before the footer might not be included as part of + // the footer if it is contained within the header. + start: child_start, + }, + )); + } + + if is_header || is_footer { // Next automatically positioned cell goes under this header. // FIXME: Consider only doing this if the header has any fully // automatically positioned cells. Otherwise, @@ -751,7 +840,7 @@ impl CellGrid { // course. // None of the above are concerns for now, as headers must // start at the first row. - auto_index = auto_index.max(c * header_end); + auto_index = auto_index.max(c * child_end); } } @@ -760,27 +849,55 @@ impl CellGrid { // vector of 'Entry' from 'Option'. // 2. If any cells were added to the header's rows after the header's // creation, ensure the header expands enough to accommodate them - // across all of their spanned rows. + // across all of their spanned rows. Same for the footer. + // 3. If any cells before the footer try to span it, error. let resolved_cells = resolved_cells .into_iter() .enumerate() .map(|(i, cell)| { if let Some(cell) = cell { - if let Some((parent_cell, header)) = - cell.as_cell().zip(header.as_mut()) - { - let y = i / c; - if y < header.end { - // Ensure the header expands enough such that all - // cells inside it, even those added later, are - // fully contained within the header. - // FIXME: check if start < y < end when start can - // be != 0. - // FIXME: when start can be != 0, decide what - // happens when a cell after the header placed - // above it tries to span the header (either error - // or expand upwards). - header.end = header.end.max(y + parent_cell.rowspan.get()); + if let Some(parent_cell) = cell.as_cell() { + if let Some(header) = &mut header + { + let y = i / c; + if y < header.end { + // Ensure the header expands enough such that + // all cells inside it, even those added later, + // are fully contained within the header. + // FIXME: check if start < y < end when start can + // be != 0. + // FIXME: when start can be != 0, decide what + // happens when a cell after the header placed + // above it tries to span the header (either + // error or expand upwards). + header.end = header.end.max(y + parent_cell.rowspan.get()); + } + } + + if let Some((end, footer_span, footer)) = &mut footer { + let x = i % c; + let y = i / c; + let cell_end = y + parent_cell.rowspan.get(); + if y < footer.start && cell_end > footer.start { + // Don't allow a cell before the footer to span + // it. Surely, we could move the footer to + // start at where this cell starts, so this is + // more of a design choice, as it's unlikely + // for the user to intentionally include a cell + // before the footer spanning it but not + // being repeated with it. + bail!( + *footer_span, + "footer would conflict with a cell placed before it at column {x} row {y}"; + hint: "try reducing that cell's rowspan or moving the footer" + ); + } + if y >= footer.start && y < *end { + // Expand the footer to include all rows + // spanned by this cell, as it is inside the + // footer. + *end = (*end).max(cell_end); + } } } @@ -888,36 +1005,87 @@ impl CellGrid { vlines[x].push(line); } - // No point in storing the header if it shouldn't be repeated. - let header = header.filter(|_| repeat_header).map(|mut header| { - // Repeat the gutter below a header (hence why we don't - // subtract 1 from the gutter case). - // Don't do this if there are no rows under the header. - if has_gutter { - // - 'header.end' is always 'last y + 1'. The header stops - // before that row. - // - Therefore, '2 * header.end' will be 2 * (last y + 1), - // which is the adjusted index of the row before which the - // header stops, meaning it will still stop right before it - // even with gutter thanks to the multiplication below. - // - This means that it will span all rows up to - // '2 * (last y + 1) - 1 = 2 * last y + 1', which equates to - // the index of the gutter row right below the header, which is - // what we want (that gutter spacing should be repeated across - // pages to maintain uniformity). - header.end *= 2; + let header = header + .map(|mut header| { + // Repeat the gutter below a header (hence why we don't + // subtract 1 from the gutter case). + // Don't do this if there are no rows under the header. + if has_gutter { + // - 'header.end' is always 'last y + 1'. The header stops + // before that row. + // - Therefore, '2 * header.end' will be 2 * (last y + 1), + // which is the adjusted index of the row before which the + // header stops, meaning it will still stop right before it + // even with gutter thanks to the multiplication below. + // - This means that it will span all rows up to + // '2 * (last y + 1) - 1 = 2 * last y + 1', which equates + // to the index of the gutter row right below the header, + // which is what we want (that gutter spacing should be + // repeated across pages to maintain uniformity). + header.end *= 2; - // If the header occupies the entire grid, ensure we don't - // include an extra gutter row when it doesn't exist, since - // the last row of the header is at the very bottom, therefore - // '2 * last y + 1' is not a valid index. - let row_amount = (2 * row_amount).saturating_sub(1); - header.end = header.end.min(row_amount); - } - header - }); + // If the header occupies the entire grid, ensure we don't + // include an extra gutter row when it doesn't exist, since + // the last row of the header is at the very bottom, + // therefore '2 * last y + 1' is not a valid index. + let row_amount = (2 * row_amount).saturating_sub(1); + header.end = header.end.min(row_amount); + } + header + }) + .map(|header| { + if repeat_header { + Repeatable::Repeated(header) + } else { + Repeatable::NotRepeated(header) + } + }); - Ok(Self::new_internal(tracks, gutter, vlines, hlines, header, resolved_cells)) + let footer = footer + .map(|(footer_end, footer_span, mut footer)| { + if footer_end != row_amount { + bail!(footer_span, "footer must end at the last row"); + } + + let header_end = + header.as_ref().map(Repeatable::unwrap).map(|header| header.end); + + if has_gutter { + // Convert the footer's start index to post-gutter coordinates. + footer.start *= 2; + + // Include the gutter right before the footer, unless there is + // none, or the gutter is already included in the header (no + // rows between the header and the footer). + if header_end.map_or(true, |header_end| header_end != footer.start) { + footer.start = footer.start.saturating_sub(1); + } + } + + if header_end.is_some_and(|header_end| header_end > footer.start) { + bail!(footer_span, "header and footer must not have common rows"); + } + + Ok(footer) + }) + .transpose()? + .map(|footer| { + if repeat_footer { + Repeatable::Repeated(footer) + } else { + Repeatable::NotRepeated(footer) + } + }); + + Ok(Self::new_internal( + tracks, + gutter, + vlines, + hlines, + header, + footer, + resolved_cells, + )) } /// Generates the cell grid, given the tracks and resolved entries. @@ -926,7 +1094,8 @@ impl CellGrid { gutter: Axes<&[Sizing]>, vlines: Vec>, hlines: Vec>, - header: Option
, + header: Option>, + footer: Option>, entries: Vec, ) -> Self { let mut cols = vec![]; @@ -980,6 +1149,7 @@ impl CellGrid { vlines, hlines, header, + footer, has_gutter, } } @@ -1239,6 +1409,9 @@ pub struct GridLayouter<'a> { /// header rows themselves are unbreakable, and unbreakable rows do not /// need to read this field at all. pub(super) header_height: Abs, + /// The simulated footer height for this region. + /// The simulation occurs before any rows are laid out for a region. + pub(super) footer_height: Abs, /// The span of the grid element. pub(super) span: Span, } @@ -1303,6 +1476,7 @@ impl<'a> GridLayouter<'a> { finished: vec![], is_rtl: TextElem::dir_in(styles) == Dir::RTL, header_height: Abs::zero(), + footer_height: Abs::zero(), span, } } @@ -1311,17 +1485,37 @@ impl<'a> GridLayouter<'a> { pub fn layout(mut self, engine: &mut Engine) -> SourceResult { self.measure_columns(engine)?; + if let Some(Repeatable::Repeated(footer)) = &self.grid.footer { + // Ensure rows in the first region will be aware of the possible + // presence of the footer. + self.prepare_footer(footer, engine)?; + if matches!(self.grid.header, None | Some(Repeatable::NotRepeated(_))) { + // No repeatable header, so we won't subtract it later. + self.regions.size.y -= self.footer_height; + } + } + for y in 0..self.grid.rows.len() { - if let Some(header) = &self.grid.header { + if let Some(Repeatable::Repeated(header)) = &self.grid.header { if y < header.end { if y == 0 { self.layout_header(header, engine)?; + self.regions.size.y -= self.footer_height; } // Skip header rows during normal layout. continue; } } + if let Some(Repeatable::Repeated(footer)) = &self.grid.footer { + if y >= footer.start { + if y == footer.start { + self.layout_footer(footer, engine)?; + } + continue; + } + } + self.layout_row(y, engine)?; } @@ -1550,6 +1744,7 @@ impl<'a> GridLayouter<'a> { .grid .header .as_ref() + .and_then(Repeatable::as_repeated) .is_some_and(|header| prev_y + 1 == header.end) }) .map(|prev_y| get_hlines_at(prev_y + 1)) @@ -1573,7 +1768,7 @@ impl<'a> GridLayouter<'a> { // The header lines, if any, will correspond to the lines under // the previous row, so they function similarly to 'prev_lines'. let expected_header_line_position = expected_prev_line_position; - let header_hlines = if let Some((header, prev_y)) = + let header_hlines = if let Some((Repeatable::Repeated(header), prev_y)) = self.grid.header.as_ref().zip(prev_y) { if prev_y + 1 != y @@ -2053,7 +2248,13 @@ impl<'a> GridLayouter<'a> { let frame = self.layout_single_row(engine, first, y)?; self.push_row(frame, y, true); - if self.grid.header.as_ref().is_some_and(|header| y < header.end) { + if self + .grid + .header + .as_ref() + .and_then(Repeatable::as_repeated) + .is_some_and(|header| y < header.end) + { // Add to header height. self.header_height += first; } @@ -2071,10 +2272,16 @@ impl<'a> GridLayouter<'a> { .zip(&mut resolved[..len - 1]) .skip(self.lrows.iter().any(|row| matches!(row, Row::Fr(..))) as usize) { - // Subtract header height from the region height when it's not the - // first. - target - .set_max(region.y - if i > 0 { self.header_height } else { Abs::zero() }); + // Subtract header and footer heights from the region height when + // it's not the first. + target.set_max( + region.y + - if i > 0 { + self.header_height + self.footer_height + } else { + Abs::zero() + }, + ); } // Layout into multiple regions. @@ -2277,19 +2484,25 @@ impl<'a> GridLayouter<'a> { let resolved = v.resolve(self.styles).relative_to(self.regions.base().y); let frame = self.layout_single_row(engine, resolved, y)?; - if self.grid.header.as_ref().is_some_and(|header| y < header.end) { + if self + .grid + .header + .as_ref() + .and_then(Repeatable::as_repeated) + .is_some_and(|header| y < header.end) + { // Add to header height. self.header_height += resolved; } // Skip to fitting region, but only if we aren't part of an unbreakable // row group. We use 'in_last_with_offset' so our 'in_last' call - // properly considers that a header would be added on each region - // break. + // properly considers that a header and a footer would be added on each + // region break. let height = frame.height(); while self.unbreakable_rows_left == 0 && !self.regions.size.y.fits(height) - && !in_last_with_offset(self.regions, self.header_height) + && !in_last_with_offset(self.regions, self.header_height + self.footer_height) { self.finish_region(engine)?; @@ -2421,14 +2634,52 @@ impl<'a> GridLayouter<'a> { self.lrows.pop().unwrap(); } - if let Some(header) = &self.grid.header { + // If no rows other than the footer have been laid out so far, and + // there are rows beside the footer, then don't lay it out at all. + // This check doesn't apply, and is thus overridden, when there is a + // header. + let mut footer_would_be_orphan = self.lrows.is_empty() + && !in_last_with_offset( + self.regions, + self.header_height + self.footer_height, + ) + && self + .grid + .footer + .as_ref() + .and_then(Repeatable::as_repeated) + .is_some_and(|footer| footer.start != 0); + + if let Some(Repeatable::Repeated(header)) = &self.grid.header { if self.grid.rows.len() > header.end + && self + .grid + .footer + .as_ref() + .and_then(Repeatable::as_repeated) + .map_or(true, |footer| footer.start != header.end) && self.lrows.last().is_some_and(|row| row.index() < header.end) - && !in_last_with_offset(self.regions, self.header_height) + && !in_last_with_offset( + self.regions, + self.header_height + self.footer_height, + ) { - // Header would be alone in this region, but there are more - // rows beyond the header. Push an empty region. + // Header and footer would be alone in this region, but there are more + // rows beyond the header and the footer. Push an empty region. self.lrows.clear(); + footer_would_be_orphan = true; + } + } + + let mut laid_out_footer_start = None; + if let Some(Repeatable::Repeated(footer)) = &self.grid.footer { + // Don't layout the footer if it would be alone with the header in + // the page, and don't layout it twice. + if !footer_would_be_orphan + && self.lrows.iter().all(|row| row.index() < footer.start) + { + laid_out_footer_start = Some(footer.start); + self.layout_footer(footer, engine)?; } } @@ -2523,8 +2774,12 @@ impl<'a> GridLayouter<'a> { // laid out at the first frame of the row). // Any rowspans ending before this row are laid out even // on this row's first frame. - if rowspan.y + rowspan.rowspan < y + 1 - || rowspan.y + rowspan.rowspan == y + 1 && is_last + if laid_out_footer_start.map_or(true, |footer_start| { + // If this is a footer row, then only lay out this rowspan + // if the rowspan is contained within the footer. + y < footer_start || rowspan.y >= footer_start + }) && (rowspan.y + rowspan.rowspan < y + 1 + || rowspan.y + rowspan.rowspan == y + 1 && is_last) { // Rowspan ends at this or an earlier row, so we take // it from the rowspans vector and lay it out. @@ -2554,11 +2809,18 @@ impl<'a> GridLayouter<'a> { self.finish_region_internal(output, rrows); - if let Some(header) = &self.grid.header { + if let Some(Repeatable::Repeated(footer)) = &self.grid.footer { + self.prepare_footer(footer, engine)?; + } + + if let Some(Repeatable::Repeated(header)) = &self.grid.header { // Add a header to the new region. self.layout_header(header, engine)?; } + // Ensure rows don't try to overrun the footer. + self.regions.size.y -= self.footer_height; + Ok(()) } @@ -2579,18 +2841,30 @@ impl<'a> GridLayouter<'a> { engine: &mut Engine, ) -> SourceResult<()> { let header_rows = self.simulate_header(header, &self.regions, engine)?; + let mut skipped_region = false; while self.unbreakable_rows_left == 0 - && !self.regions.size.y.fits(header_rows.height) + && !self.regions.size.y.fits(header_rows.height + self.footer_height) && !self.regions.in_last() { // Advance regions without any output until we can place the - // header. + // header and the footer. self.finish_region_internal(Frame::soft(Axes::splat(Abs::zero())), vec![]); + skipped_region = true; } // Reset the header height for this region. + // It will be re-calculated when laying out each header row. self.header_height = Abs::zero(); + if let Some(Repeatable::Repeated(footer)) = &self.grid.footer { + if skipped_region { + // Simulate the footer again; the region's 'full' might have + // changed. + self.footer_height = + self.simulate_footer(footer, &self.regions, engine)?.height; + } + } + // Header is unbreakable. // Thus, no risk of 'finish_region' being recursively called from // within 'layout_row'. @@ -2618,6 +2892,78 @@ impl<'a> GridLayouter<'a> { Ok(header_row_group) } + + /// Updates `self.footer_height` by simulating the footer, and skips to fitting region. + pub(super) fn prepare_footer( + &mut self, + footer: &Footer, + engine: &mut Engine, + ) -> SourceResult<()> { + let footer_height = self.simulate_footer(footer, &self.regions, engine)?.height; + let mut skipped_region = false; + while self.unbreakable_rows_left == 0 + && !self.regions.size.y.fits(footer_height) + && !self.regions.in_last() + { + // Advance regions without any output until we can place the + // footer. + self.finish_region_internal(Frame::soft(Axes::splat(Abs::zero())), vec![]); + skipped_region = true; + } + + self.footer_height = if skipped_region { + // Simulate the footer again; the region's 'full' might have + // changed. + self.simulate_footer(footer, &self.regions, engine)?.height + } else { + footer_height + }; + + Ok(()) + } + + /// Lays out all rows in the footer. + /// They are unbreakable. + pub(super) fn layout_footer( + &mut self, + footer: &Footer, + engine: &mut Engine, + ) -> SourceResult<()> { + // Ensure footer rows have their own height available. + // Won't change much as we're creating an unbreakable row group + // anyway, so this is mostly for correctness. + self.regions.size.y += self.footer_height; + + let footer_len = self.grid.rows.len() - footer.start; + self.unbreakable_rows_left += footer_len; + for y in footer.start..self.grid.rows.len() { + self.layout_row(y, engine)?; + } + + Ok(()) + } + + // Simulate the footer's group of rows. + pub(super) fn simulate_footer( + &self, + footer: &Footer, + regions: &Regions<'_>, + engine: &mut Engine, + ) -> SourceResult { + // Note that we assume the invariant that any rowspan in a footer is + // fully contained within that footer. Therefore, there won't be any + // unbreakable rowspans exceeding the footer's rows, and we can safely + // assume that the amount of unbreakable rows following the first row + // in the footer will be precisely the rows in the footer. + let footer_row_group = self.simulate_unbreakable_row_group( + footer.start, + Some(self.grid.rows.len() - footer.start), + regions, + engine, + )?; + + Ok(footer_row_group) + } } /// Turn an iterator of extents into an iterator of offsets before, in between, diff --git a/crates/typst/src/layout/grid/lines.rs b/crates/typst/src/layout/grid/lines.rs index b659ba77d..1249c3e95 100644 --- a/crates/typst/src/layout/grid/lines.rs +++ b/crates/typst/src/layout/grid/lines.rs @@ -1,7 +1,7 @@ use std::num::NonZeroUsize; use std::sync::Arc; -use super::layout::{CellGrid, RowPiece}; +use super::layout::{CellGrid, Repeatable, RowPiece}; use crate::foundations::{AlternativeFold, Fold}; use crate::layout::Abs; use crate::visualize::Stroke; @@ -538,19 +538,33 @@ pub(super) fn hline_stroke_at_column( // Top border stroke and header stroke are generally prioritized, unless // they don't have explicit hline overrides and one or more user-provided // hlines would appear at the same position, which then are prioritized. - let top_stroke_comes_from_header = - grid.header - .as_ref() - .zip(local_top_y) - .is_some_and(|(header, local_top_y)| { - // Ensure the row above us is a repeated header. - // FIXME: Make this check more robust when headers at arbitrary - // positions are added. - local_top_y + 1 == header.end && y != header.end - }); + let top_stroke_comes_from_header = grid + .header + .as_ref() + .and_then(Repeatable::as_repeated) + .zip(local_top_y) + .is_some_and(|(header, local_top_y)| { + // Ensure the row above us is a repeated header. + // FIXME: Make this check more robust when headers at arbitrary + // positions are added. + local_top_y + 1 == header.end && y != header.end + }); + + // Prioritize the footer's top stroke as well where applicable. + let bottom_stroke_comes_from_footer = grid + .footer + .as_ref() + .and_then(Repeatable::as_repeated) + .is_some_and(|footer| { + // Ensure the row below us is a repeated footer. + // FIXME: Make this check more robust when footers at arbitrary + // positions are added. + local_top_y.unwrap_or(0) + 1 != footer.start && y == footer.start + }); let (prioritized_cell_stroke, deprioritized_cell_stroke) = if !use_bottom_border_stroke + && !bottom_stroke_comes_from_footer && (use_top_border_stroke || top_stroke_comes_from_header || top_cell_prioritized && !bottom_cell_prioritized) @@ -562,7 +576,7 @@ pub(super) fn hline_stroke_at_column( // When both cells' strokes have the same priority, we default to // prioritizing the bottom cell's top stroke. // Additionally, the bottom border cell's stroke always has - // priority. + // priority. Same for stroke above footers. (bottom_cell_stroke, top_cell_stroke) }; @@ -658,6 +672,7 @@ mod test { vec![], vec![], None, + None, entries, ) } @@ -1195,6 +1210,7 @@ mod test { vec![], vec![], None, + None, entries, ) } diff --git a/crates/typst/src/layout/grid/mod.rs b/crates/typst/src/layout/grid/mod.rs index 0f431bc65..b58b50549 100644 --- a/crates/typst/src/layout/grid/mod.rs +++ b/crates/typst/src/layout/grid/mod.rs @@ -23,7 +23,7 @@ use crate::layout::{ Abs, AlignElem, Alignment, Axes, Dir, Fragment, LayoutMultiple, Length, OuterHAlignment, OuterVAlignment, Regions, Rel, Sides, Sizing, }; -use crate::model::{TableCell, TableHLine, TableHeader, TableVLine}; +use crate::model::{TableCell, TableFooter, TableHLine, TableHeader, TableVLine}; use crate::syntax::Span; use crate::text::TextElem; use crate::util::NonZeroExt; @@ -299,6 +299,9 @@ impl GridElem { #[elem] type GridHeader; + + #[elem] + type GridFooter; } impl LayoutMultiple for Packed { @@ -322,11 +325,17 @@ impl LayoutMultiple for Packed { let gutter = Axes::new(column_gutter.0.as_slice(), row_gutter.0.as_slice()); // Use trace to link back to the grid when a specific cell errors let tracepoint = || Tracepoint::Call(Some(eco_format!("grid"))); + let resolve_item = |item: &GridItem| item.to_resolvable(styles); let children = self.children().iter().map(|child| match child { GridChild::Header(header) => ResolvableGridChild::Header { repeat: header.repeat(styles), span: header.span(), - items: header.children().iter().map(|child| child.to_resolvable(styles)), + items: header.children().iter().map(resolve_item), + }, + GridChild::Footer(footer) => ResolvableGridChild::Footer { + repeat: footer.repeat(styles), + span: footer.span(), + items: footer.children().iter().map(resolve_item), }, GridChild::Item(item) => { ResolvableGridChild::Item(item.to_resolvable(styles)) @@ -369,6 +378,7 @@ cast! { #[derive(Debug, PartialEq, Clone, Hash)] pub enum GridChild { Header(Packed), + Footer(Packed), Item(GridItem), } @@ -376,6 +386,7 @@ cast! { GridChild, self => match self { Self::Header(header) => header.into_value(), + Self::Footer(footer) => footer.into_value(), Self::Item(item) => item.into_value(), }, v: Content => { @@ -389,10 +400,14 @@ impl TryFrom for GridChild { if value.is::() { bail!("cannot use `table.header` as a grid header; use `grid.header` instead") } + if value.is::() { + bail!("cannot use `table.footer` as a grid footer; use `grid.footer` instead") + } value .into_packed::() .map(Self::Header) + .or_else(|value| value.into_packed::().map(Self::Footer)) .or_else(|value| GridItem::try_from(value).map(Self::Item)) } } @@ -459,10 +474,16 @@ impl TryFrom for GridItem { type Error = EcoString; fn try_from(value: Content) -> StrResult { if value.is::() { - bail!("cannot place a grid header within another header"); + bail!("cannot place a grid header within another header or footer"); } if value.is::() { - bail!("cannot place a table header within another header"); + bail!("cannot place a table header within another header or footer"); + } + if value.is::() { + bail!("cannot place a grid footer within another footer or header"); + } + if value.is::() { + bail!("cannot place a table footer within another footer or header"); } if value.is::() { bail!("cannot use `table.cell` as a grid cell; use `grid.cell` instead"); @@ -498,6 +519,18 @@ pub struct GridHeader { pub children: Vec, } +/// A repeatable grid footer. +#[elem(name = "footer", title = "Grid Footer")] +pub struct GridFooter { + /// Whether this footer should be repeated across pages. + #[default(true)] + pub repeat: bool, + + /// The cells and lines within the footer. + #[variadic] + pub children: Vec, +} + /// A horizontal line in the grid. /// /// Overrides any per-cell stroke, including stroke specified through the diff --git a/crates/typst/src/layout/grid/rowspans.rs b/crates/typst/src/layout/grid/rowspans.rs index d33b79434..764a2b702 100644 --- a/crates/typst/src/layout/grid/rowspans.rs +++ b/crates/typst/src/layout/grid/rowspans.rs @@ -6,7 +6,7 @@ use crate::layout::{ }; use crate::util::MaybeReverseIter; -use super::layout::{in_last_with_offset, points, Row, RowPiece}; +use super::layout::{in_last_with_offset, points, Repeatable, Row, RowPiece}; /// All information needed to layout a single rowspan. pub(super) struct Rowspan { @@ -132,7 +132,7 @@ impl<'a> GridLayouter<'a> { // The rowspan continuation starts after the header (thus, // at a position after the sum of the laid out header // rows). - if let Some(header) = &self.grid.header { + if let Some(Repeatable::Repeated(header)) = &self.grid.header { let header_rows = self .rrows .get(i) @@ -194,16 +194,36 @@ impl<'a> GridLayouter<'a> { engine: &mut Engine, ) -> SourceResult<()> { if self.unbreakable_rows_left == 0 { + // By default, the amount of unbreakable rows starting at the + // current row is dynamic and depends on the amount of upcoming + // unbreakable cells (with or without a rowspan setting). + let mut amount_unbreakable_rows = None; + if let Some(Repeatable::NotRepeated(header)) = &self.grid.header { + if current_row < header.end { + // Non-repeated header, so keep it unbreakable. + amount_unbreakable_rows = Some(header.end); + } + } + if let Some(Repeatable::NotRepeated(footer)) = &self.grid.footer { + if current_row >= footer.start { + // Non-repeated footer, so keep it unbreakable. + amount_unbreakable_rows = Some(self.grid.rows.len() - footer.start); + } + } + let row_group = self.simulate_unbreakable_row_group( current_row, - None, + amount_unbreakable_rows, &self.regions, engine, )?; // Skip to fitting region. while !self.regions.size.y.fits(row_group.height) - && !in_last_with_offset(self.regions, self.header_height) + && !in_last_with_offset( + self.regions, + self.header_height + self.footer_height, + ) { self.finish_region(engine)?; } @@ -305,27 +325,31 @@ impl<'a> GridLayouter<'a> { let rowspan = self.grid.effective_rowspan_of_cell(cell); // This variable is used to construct a custom backlog if the cell - // is a rowspan, or if headers are used. When measuring, we join - // the heights from previous regions to the current backlog to form - // a rowspan's expected backlog. We also subtract the header's - // height from all regions. + // is a rowspan, or if headers or footers are used. When measuring, we + // join the heights from previous regions to the current backlog to + // form a rowspan's expected backlog. We also subtract the header's + // and footer's heights from all regions. let mut custom_backlog: Vec = vec![]; - // This function is used to subtract the expected header height from - // each upcoming region size in the current backlog and last region. - let mut subtract_header_height_from_regions = || { + // This function is used to subtract the expected header and footer + // height from each upcoming region size in the current backlog and + // last region. + let mut subtract_header_footer_height_from_regions = || { // Only breakable auto rows need to update their backlogs based - // on the presence of a header, given that unbreakable auto - // rows don't depend on the backlog, as they only span one + // on the presence of a header or footer, given that unbreakable + // auto rows don't depend on the backlog, as they only span one // region. - if breakable && self.grid.header.is_some() { - // Subtract header height from all upcoming regions when - // measuring the cell, including the last repeated region. + if breakable + && (matches!(self.grid.header, Some(Repeatable::Repeated(_))) + || matches!(self.grid.footer, Some(Repeatable::Repeated(_)))) + { + // Subtract header and footer height from all upcoming regions + // when measuring the cell, including the last repeated region. // // This will update the 'custom_backlog' vector with the // updated heights of the upcoming regions. let mapped_regions = self.regions.map(&mut custom_backlog, |size| { - Size::new(size.x, size.y - self.header_height) + Size::new(size.x, size.y - self.header_height - self.footer_height) }); // Callees must use the custom backlog instead of the current @@ -365,13 +389,13 @@ impl<'a> GridLayouter<'a> { // However, if the auto row is unbreakable, measure with infinite // height instead to see how much content expands. // 2. Use the region's backlog and last region when measuring, - // however subtract the expected header height from each upcoming - // size, if there is a header. + // however subtract the expected header and footer heights from + // each upcoming size, if there is a header or footer. // 3. Use the same full region height. // 4. No height occupied by this cell in this region so far. // 5. Yes, this cell started in this region. height = if breakable { self.regions.size.y } else { Abs::inf() }; - (backlog, last) = subtract_header_height_from_regions(); + (backlog, last) = subtract_header_footer_height_from_regions(); full = if breakable { self.regions.full } else { Abs::inf() }; height_in_this_region = Abs::zero(); frames_in_previous_regions = 0; @@ -426,7 +450,7 @@ impl<'a> GridLayouter<'a> { .iter() .copied() .chain(std::iter::once(if breakable { - self.initial.y - self.header_height + self.initial.y - self.header_height - self.footer_height } else { // When measuring unbreakable auto rows, infinite // height is available for content to expand. @@ -442,7 +466,7 @@ impl<'a> GridLayouter<'a> { .regions .backlog .iter() - .map(|&size| size - self.header_height); + .map(|&size| size - self.header_height - self.footer_height); heights_up_to_current_region.chain(backlog).collect::>() } else { @@ -456,7 +480,10 @@ impl<'a> GridLayouter<'a> { height = *rowspan_height; backlog = None; full = rowspan_full; - last = self.regions.last.map(|size| size - self.header_height); + last = self + .regions + .last + .map(|size| size - self.header_height - self.footer_height); } else { // The rowspan started in the current region, as its vector // of heights in regions is currently empty. @@ -472,7 +499,7 @@ impl<'a> GridLayouter<'a> { } else { Abs::inf() }; - (backlog, last) = subtract_header_height_from_regions(); + (backlog, last) = subtract_header_footer_height_from_regions(); full = if breakable { self.regions.full } else { Abs::inf() }; frames_in_previous_regions = 0; } @@ -655,10 +682,10 @@ impl<'a> GridLayouter<'a> { // resolved vector, above. simulated_regions.next(); - // Subtract the initial header height, since that's the height we - // used when subtracting from the region backlog's heights while - // measuring cells. - simulated_regions.size.y -= self.header_height; + // Subtract the initial header and footer height, since that's the + // height we used when subtracting from the region backlog's + // heights while measuring cells. + simulated_regions.size.y -= self.header_height + self.footer_height; } if let Some(original_last_resolved_size) = last_resolved_size { @@ -788,8 +815,11 @@ impl<'a> GridLayouter<'a> { // which, when used and combined with upcoming spanned rows, covers all // of the requested rowspan height, we give up. for _attempt in 0..5 { - let rowspan_simulator = - RowspanSimulator::new(simulated_regions, self.header_height); + let rowspan_simulator = RowspanSimulator::new( + simulated_regions, + self.header_height, + self.footer_height, + ); let total_spanned_height = rowspan_simulator.simulate_rowspan_layout( y, @@ -871,7 +901,7 @@ impl<'a> GridLayouter<'a> { { extra_amount_to_grow -= simulated_regions.size.y.max(Abs::zero()); simulated_regions.next(); - simulated_regions.size.y -= self.header_height; + simulated_regions.size.y -= self.header_height + self.footer_height; } simulated_regions.size.y -= extra_amount_to_grow; } @@ -887,6 +917,8 @@ struct RowspanSimulator<'a> { regions: Regions<'a>, /// The height of the header in the currently simulated region. header_height: Abs, + /// The height of the footer in the currently simulated region. + footer_height: Abs, /// The total spanned height so far in the simulation. total_spanned_height: Abs, /// Height of the latest spanned gutter row in the simulation. @@ -896,11 +928,12 @@ struct RowspanSimulator<'a> { impl<'a> RowspanSimulator<'a> { /// Creates new rowspan simulation state with the given regions and initial - /// header height. Other fields should always start as zero. - fn new(regions: Regions<'a>, header_height: Abs) -> Self { + /// header and footer heights. Other fields should always start as zero. + fn new(regions: Regions<'a>, header_height: Abs, footer_height: Abs) -> Self { Self { regions, header_height, + footer_height, total_spanned_height: Abs::zero(), latest_spanned_gutter_height: Abs::zero(), } @@ -948,7 +981,10 @@ impl<'a> RowspanSimulator<'a> { engine, )?; while !self.regions.size.y.fits(row_group.height) - && !in_last_with_offset(self.regions, self.header_height) + && !in_last_with_offset( + self.regions, + self.header_height + self.footer_height, + ) { self.finish_region(layouter, engine)?; } @@ -970,7 +1006,10 @@ impl<'a> RowspanSimulator<'a> { let mut skipped_region = false; while unbreakable_rows_left == 0 && !self.regions.size.y.fits(height) - && !in_last_with_offset(self.regions, self.header_height) + && !in_last_with_offset( + self.regions, + self.header_height + self.footer_height, + ) { self.finish_region(layouter, engine)?; @@ -1002,50 +1041,69 @@ impl<'a> RowspanSimulator<'a> { Ok(self.total_spanned_height) } - fn simulate_header_layout( + fn simulate_header_footer_layout( &mut self, layouter: &GridLayouter<'_>, engine: &mut Engine, ) -> SourceResult<()> { - if let Some(header) = &layouter.grid.header { - // We can't just use the initial header height on each - // region, because header height might vary depending - // on region size if it contains rows with relative - // lengths. Therefore, we re-simulate headers on each - // new region. - // It's true that, when measuring cells, we reduce each - // height in the backlog to consider the initial header - // height; however, our simulation checks what happens - // AFTER the auto row, so we can just use the original - // backlog from `self.regions`. - let header_row_group = - layouter.simulate_header(header, &self.regions, engine)?; - let mut skipped_region = false; + // We can't just use the initial header/footer height on each region, + // because header/footer height might vary depending on region size if + // it contains rows with relative lengths. Therefore, we re-simulate + // headers and footers on each new region. + // It's true that, when measuring cells, we reduce each height in the + // backlog to consider the initial header and footer heights; however, + // our simulation checks what happens AFTER the auto row, so we can + // just use the original backlog from `self.regions`. + let header_height = + if let Some(Repeatable::Repeated(header)) = &layouter.grid.header { + layouter.simulate_header(header, &self.regions, engine)?.height + } else { + Abs::zero() + }; - // Skip until we reach a fitting region for this header. - while !self.regions.size.y.fits(header_row_group.height) - && !self.regions.in_last() - { - self.regions.next(); - skipped_region = true; - } + let footer_height = + if let Some(Repeatable::Repeated(footer)) = &layouter.grid.footer { + layouter.simulate_footer(footer, &self.regions, engine)?.height + } else { + Abs::zero() + }; + let mut skipped_region = false; + + // Skip until we reach a fitting region for both header and footer. + while !self.regions.size.y.fits(header_height + footer_height) + && !self.regions.in_last() + { + self.regions.next(); + skipped_region = true; + } + + if let Some(Repeatable::Repeated(header)) = &layouter.grid.header { self.header_height = if skipped_region { // Simulate headers again, at the new region, as // the full region height may change. layouter.simulate_header(header, &self.regions, engine)?.height } else { - header_row_group.height + header_height }; - - // Consume the header's height from the new region, - // but don't consider it spanned. The rowspan - // does not go over the header (as an invariant, - // any rowspans spanning a header row are fully - // contained within that header's rows). - self.regions.size.y -= self.header_height; } + if let Some(Repeatable::Repeated(footer)) = &layouter.grid.footer { + self.footer_height = if skipped_region { + // Simulate footers again, at the new region, as + // the full region height may change. + layouter.simulate_footer(footer, &self.regions, engine)?.height + } else { + footer_height + }; + } + + // Consume the header's and footer's heights from the new region, + // but don't consider them spanned. The rowspan does not go over the + // header or footer (as an invariant, any rowspans spanning any header + // or footer rows are fully contained within that header's or footer's rows). + self.regions.size.y -= self.header_height + self.footer_height; + Ok(()) } @@ -1060,7 +1118,7 @@ impl<'a> RowspanSimulator<'a> { self.latest_spanned_gutter_height = Abs::zero(); self.regions.next(); - self.simulate_header_layout(layouter, engine) + self.simulate_header_footer_layout(layouter, engine) } } diff --git a/crates/typst/src/model/table.rs b/crates/typst/src/model/table.rs index 250a527cf..c3bf3dbc4 100644 --- a/crates/typst/src/model/table.rs +++ b/crates/typst/src/model/table.rs @@ -10,8 +10,8 @@ use crate::foundations::{ }; use crate::layout::{ show_grid_cell, Abs, Alignment, Axes, Cell, CellGrid, Celled, Dir, Fragment, - GridCell, GridHLine, GridHeader, GridLayouter, GridVLine, LayoutMultiple, Length, - LinePosition, OuterHAlignment, OuterVAlignment, Regions, Rel, ResolvableCell, + GridCell, GridFooter, GridHLine, GridHeader, GridLayouter, GridVLine, LayoutMultiple, + Length, LinePosition, OuterHAlignment, OuterVAlignment, Regions, Rel, ResolvableCell, ResolvableGridChild, ResolvableGridItem, Sides, TrackSizings, }; use crate::model::Figurable; @@ -224,6 +224,9 @@ impl TableElem { #[elem] type TableHeader; + + #[elem] + type TableFooter; } impl LayoutMultiple for Packed { @@ -247,11 +250,17 @@ impl LayoutMultiple for Packed { let gutter = Axes::new(column_gutter.0.as_slice(), row_gutter.0.as_slice()); // Use trace to link back to the table when a specific cell errors let tracepoint = || Tracepoint::Call(Some(eco_format!("table"))); + let resolve_item = |item: &TableItem| item.to_resolvable(styles); let children = self.children().iter().map(|child| match child { TableChild::Header(header) => ResolvableGridChild::Header { repeat: header.repeat(styles), span: header.span(), - items: header.children().iter().map(|child| child.to_resolvable(styles)), + items: header.children().iter().map(resolve_item), + }, + TableChild::Footer(footer) => ResolvableGridChild::Footer { + repeat: footer.repeat(styles), + span: footer.span(), + items: footer.children().iter().map(resolve_item), }, TableChild::Item(item) => { ResolvableGridChild::Item(item.to_resolvable(styles)) @@ -319,6 +328,7 @@ impl Figurable for Packed {} #[derive(Debug, PartialEq, Clone, Hash)] pub enum TableChild { Header(Packed), + Footer(Packed), Item(TableItem), } @@ -326,6 +336,7 @@ cast! { TableChild, self => match self { Self::Header(header) => header.into_value(), + Self::Footer(footer) => footer.into_value(), Self::Item(item) => item.into_value(), }, v: Content => { @@ -342,10 +353,16 @@ impl TryFrom for TableChild { "cannot use `grid.header` as a table header; use `table.header` instead" ) } + if value.is::() { + bail!( + "cannot use `grid.footer` as a table footer; use `table.footer` instead" + ) + } value .into_packed::() .map(Self::Header) + .or_else(|value| value.into_packed::().map(Self::Footer)) .or_else(|value| TableItem::try_from(value).map(Self::Item)) } } @@ -413,10 +430,16 @@ impl TryFrom for TableItem { fn try_from(value: Content) -> StrResult { if value.is::() { - bail!("cannot place a grid header within another header"); + bail!("cannot place a grid header within another header or footer"); } if value.is::() { - bail!("cannot place a table header within another header"); + bail!("cannot place a table header within another header or footer"); + } + if value.is::() { + bail!("cannot place a grid footer within another footer or header"); + } + if value.is::() { + bail!("cannot place a table footer within another footer or header"); } if value.is::() { bail!("cannot use `grid.cell` as a table cell; use `table.cell` instead"); @@ -452,6 +475,18 @@ pub struct TableHeader { pub children: Vec, } +/// A repeatable table footer. +#[elem(name = "footer", title = "Table Footer")] +pub struct TableFooter { + /// Whether this footer should be repeated across pages. + #[default(true)] + pub repeat: bool, + + /// The cells and lines within the footer. + #[variadic] + pub children: Vec, +} + /// A horizontal line in the table. See the docs for /// [`grid.hline`]($grid.hline) for more information regarding how to use this /// element's fields. diff --git a/tests/ref/layout/grid-footers-1.png b/tests/ref/layout/grid-footers-1.png new file mode 100644 index 0000000000000000000000000000000000000000..331cf7ad5d61a13cffbc8cb0550825604d48fe69 GIT binary patch literal 50791 zcmagFWmFtN_wGv)++}e0!QCAO*TEqK_YmCOWpMWZ10=WxcL?ql+%0&3;1JHd=l$Qa z&b?pm?CxGQExUU4+V#|~u3yJ!sL5lXlAyxD!C@#WfHdLY-jTw=Au}VthwYKLVyK3L z8)8=kNojkpp8cx*Y;Oh^b=9$>i};Z!jIH{NQlAt(a>W!kwGRq3pE1>_l@F7JuMX|| zMzxGiLx5iu8Xeu!3oR>zO38}d%bJZ0b)7|iYJKt#-8uCUIuOmf`2efs|NJONd+UpV z!B98|6sQ4^eFs3$07!!WyM>bl1Aq|Nq4z-4Lg0V5!O;Jdw*j%JQ3JkRn`r(Lnd7CJ zoau@3UX>P+#*aJO&hh`=TI)ygqE4tdq3=Q zlf+-E3Fi|CWlvf+6qTg{$E+J;C`jUmp1CO!pI^IK$72U+aAO4Xr)+uK4XgL_)xP5) z!>>Df@#nr8EgT^o?Ck6uAKQr+TxNQ9bV+<2Ke%hb9;R2!QTu-7y?%6q5hdgEed{uo zWpK{E3HHGLkvcg!p+=ZDuJ|txUSD5B=Z`_?)6>&RrLG+tzwDcGb8|s7;Bswt4vw(C z?Sj}jTVB)%s0MIEWYPZi=}9$wUsJuMu$%~kMMq?6lZ9hxs!sP;st%|nd7Io z?@8h#<%;cE*0NQGY$a)Gp)nnnBcVQPHYwhc#D97*B)Ll-0P9n4?U;^}RJ zVYPK*Hbzw9nX;wV_xYHB$hd@hjE4E+BxCGoTAubG?rce6GE5Kx5oQ$7zR56T@%s5S zF5)-nwoH; z;uh3bNLJFZRT#yV&cr3`LzbNtT_BsFV*P?2=Xgw z(bN_%AQbMIhnQ1tMI^Q*H3!s0sed8c^nay&5yG;|ewEvnRTyPXSAwfBN{bqYXMW zH6{4LWH&J#{Reaqf~%qH;SLuHG~7^<^}*ZSV;qW70cWx(#c9TwbV}Hv9l5!=ZGI;J zRv1=Gw~2^|49Z#LP?5bGLS@5P;eZD?6Po>vr@g(sxjD@pj%b56vlYa?_2h#Ku1-S>W;PQ+EZfIhGk`lO>dxQ4 z3#Dx?*47M0OTF01(OqrO<(-|PIZGM(8LIZn?QJR}%l-Y~lyYe;S`q^bquZ^R|MB|340 z?j-T%>P{a$FrduF(^Ho*J}yqbSt=6L-s*9GSY|kT9Vlkot7e1q_r%l-_i8 zi7}B53=9CJG8=wB7Gj8DN}?q17qu3Vk8r74BN2tQmN1)YQ~y+$}^% zBLT=0I<@1Ai#iw7SA9|Jcrs(-jtO|>P+n6!S>lg)vM#I)!9FwsQIU}unVB*V<5T3t z-v~fvaE_@-%q7aH@HF~%=a}$*gxkhO!KehGBG~XEgy!estk>cX13R*_>-P#iPB=rO zf;>}sZ!brAA~xc$gy}wHDGoTdx64EwG~?U<{%zt+O9K@9Z&Sz}m_14(tMpZOf#BNt zV};v#jGIRzt22y_!Fcd*&ko%-6lmPVrMIYB4Tu_ot5clEKX!((?2N6O&|bVXf2>Vk zjsD2N!7;E?haI63-Ksh{>qH##8faq1Nz@x0s^u97n87XIyIRHu|C}90-%m%&O~Naq z^whp3o@~%(otyYs71M9!I1)s~?C;nQz=$tA+}jJ|($&hJwBBI>fxNO(#KiK|GVzio zu3uhM_FkfacSRd6fYvje^gwTI^i@lg4|S?`IJc_b>f7QzTt0BBVB^;#a@u*0Fn2dB zqNm5p(bm%9vz94+hM2(`sv?^~feHhrfq*;!(>*EeFZO$&QoN(xu5+=g5%PZOhOClR zAe9OL2XsuQTVPQRYxFpu)uIg)9iyOs>a6M2F>vscXcZ6WSj{7MJ@>0vkLz5c`i5qv z&i)ZV^TuwI=fHAdLjeH+>6Y1T_)zI_C=-#2-^r!J-+>*|CcJ-kBj6AX1t!!Vt~L{N zw9U~^z9+Z{)C~{XQUJe5Fo>Iif}(CXF&c_y$NGM0J#p+eeeEVE0SAsM5BQ%RD4lZf z5Jy|X+t=5e_g8d88Qrvi`~oZyp<@|J^c|kNrF~}{uly+uk56a*^frkx2&FCv0lch^ z9A&T2o@vQO%(87MwSav7duFl^h1s^*xHf`UJ7*}n5=CgY@(yj1AC!g!`FmD7_8Lfe zEg+UtdRyFmFqi&g(63$&UN&3BSyoV)SFFAc?^iv5dMUPKHNE7wi?(^j2v(;5MJW4M zUp&wihJ$43)#zGSL3>Cv2qO1Bjyf90+O(&urzcaRUHJVRE+=pH!{l#dB03QLWXzJh zR-N&Tf}qlzc2(0_G^+TDo~_hgON)TSjPnHZ=lADTBCnj}5f~!{+|<^NF_{f&pUUDb~5G4hjk^z6uY5j#Bmm>u_|J=a>YGQ$wYg_~OwTx;--T2$klWWPh)SSGFPQ{)WK z$AvDOq6<-Lb7YP$opy!h(X1TGEB4rq^VlMbk@Y{F#b{-enDPD;zJ88|N;QngEmb22 zcBSkp&0_8odBcgYn&HJq+_N6Kw*6?#G3f2guUx{P@1cmVr5@|fwQS;zN2P0j8mgW5 zNu#1J5|hRG2x_unSmnVBTJG?}X9@*E_D1`2rYfVULJ?6(h@Pm>NQjBDvd}|AkQ*Q| z>ZaBVM5u?c?b)n3$n7DG_LmP~9|o7#9^Ng^hiT6$@Qj@O9WM8)ym-^*vxYKNz|0;G zuqfuUEaq$4DRF+ayZz@eYM}VSmM3w|ub}5mpEdEjP|enI_EtUzgFRyWkaaA{B=6{3 zZQ1K*y$)rYOuZ>}zq8FY=cmO%o>~s4!>fbyUsoOH2mg47&7D3U{c1apA(2ltNHW~A zW-jybUYhm9`nnnP=G|6)zA!0Z(&Le86)-Kn>GxP}6`%_KzYQP1G_Fw4f=MXr7nNK! zWEHRo@JK<@IMxi3q2QB!g#z&vtwe~DnI8)IddKeHPVTglwO6zeG03W$%Xnkf%S(Yh zO37e@Mu*CsXPv-w$64IKV3tti9mGzuQ!s!I={3pivxzhrRsTvd6$XBhxbY{jg25Sb zIPNR9Q?6_Cs8Y2Uk`t9VIlq3BHU*Mx(mN+3iGrkXHa1Gcx1-*ATUbx`; zeoqGr;8^T-(lrlqPLkm(yg)c9DzU~4+=(5LyV|UI&%FDU}@Q|;9OoN3sSeeZ%Q@4GVYerj? zfP>^%iARmYA(sWMw3?Rhz*b1=+)w&c_z528Gu9uy1$zOIM1>%sNa#<^P3A5R*@$iS zWQd5z8BqkhfE?5&A>d`|guj~rbL39Qr}0Cgo?aSSV!VL02WEdBk8M>Bh^P$i5Fh{G zj$amoMTwoUc>M6>*ZR97k)4B#rEF`{=H$*8ek0xnLdH9eaS{f8sRodgQ%cfCFOgio zR=2GA z2LD@A#FnZY}NQt;53w1PlHW{2=IBA*~5bE0Z8$=QDF>`^>U(-FGwkd7WrF znIq@>ee1865z8~+05s*~u>ej7?|*(hP|NF~Uj95s(cx zwPtxiX^Xye?Q`-zlpe+QRNc}^eExf;N5zQ^TCAyDGL#Y6;q`psiPA2pE`9ChY40w6 zzNU$zLgw1q!!{g3f&6IC{OMH_7@nX>>9jwIR+ATFrHTD+Mc0yj3oInb&KNq=rlo&K z1qNor{-C21`Pz!g2^V7X!D}_2+_V8#JvMKWe%~nQ$k0O6pdBw$=VhGO_=E0-4X@ckONH`H|?UC1ZCP9Gxk3?y@#S*-AHbulVH%WdrYpqCv_ z`68DccNo2!HgpR%HA=ay09442P$H0H;Lr!1MjH}?L&Y9Ou}cngOB7a!lEawvM&Wci zLuj&+sa(t#G^)5?g{Eb)i!*k@4~GdJpr9R(+m@Nwk+G4_5x{kx0d3!;{hzNuY}Q)0 z=_8)eV9o+O1~!~Y7XE`jCVf9`%E%khTd3?O|eg-E1N$bjf25v$V8!w-FpTD;M!RzU; z|I)qbI*_>aJSmaywN^lQZ5XuSM(XMB1pefble^3RITolAN=SPX7 zp87~r4jSV!M1)WTXk%*I^49GvkYPgF4eJ=LkA~r;WoVUnOU0BY`^I{)pmo&7j^POk z?mu_1GUW{{;{N9IN%;b5_RI!-b_X-XQC~<7!F0}9w&Y+f9Qp)l2@ber9WrQ=(cYJl z!#PF4@~raYQ})aV^RdVfacUawI>bf!QU#;)u7raxb_gaewxG78aeU~HEUC!qaXm`` zpR252N#7h-8U~MKs37IcTxgzW3FIQpU)H`!&B>QIMn{kxM`DnYOsRO&(3VWAOh^N? z44;6An?ND+fHYJbnE3HMc1hjBx}mg$aW6tM%*bEzR|u%(xamo8eA36obB_Ff z$=`!D1yeG{c9F4F5pc-gYesi2Pd_{?|NcbDrw2N|9($)ix1W!#lU{Ar-Y?C-Wt4SX@K{5v31r8X z-NRzIwPfmFwXfp3zHv24zPHTEfvZam-$65F%yWJ(BUl6>w3DX(jlG2 z__rm%)bwrmHb1<*v&GXHED52}GS8!HriLnz(npblS*VnPw8hk8nhY*c@8i)g!3(2# zoyqsHZZD@vHmA&#Q#IT}q9QQ^K|38eRAbxNeI4!$6n{Un@1(|2*BxQ;_`?D?V`P5t zf^Lkvu#rYvhbSQBw*D}hCTL7kpWNR6opbe)jz@WO^jzb*w){eFv=SAg0?&M*oiJLt z8-uWoc~i9cpyD@?+W!c|$q0_sk(e?Ri{nXu)$4Zd-zSO3qrJ~JP5*|5DIRV^q6+-1 zsB7=Hp4OBdeavB!^9&nK)*t_!-Ft>f&cUp_c=J`hybzS`iXXe%a(39~-nj0y94p{( zkfVBX>7&!j4$|enar*o2A4yAV-G9zHYFhuJe^+QzL6&PB@+RGmx3xQeU=l-{$m3(@&=?$O_wm?Dk;HJ7rk=kNN#(mFbLNS*0%O3 zVS^S17`@>cODle7RX32!C54JsjpOSL;3nZ$7;3XMo4J96zJEdav|3RpUxPS(SHDP} zap^2VLSuiq*(KPjJID1Z0@dACQK@{-J9R4Jt{Kc<8UVa!Y{TT|^tJHTd z|NU>wpl_AImtDm79spG@X)#Ijd3dmMC{kXRczL5R)cUyCd)lw`u z2H$eN@W;XOqGp`Mq1K$R`E6`o!}p)I%wLP3SU;5AFyHBWgkVaOCn$IBC5Y(f`8Nf= zK1DtO)fq2LB}Jg$Xp~d|v&!*mM4aLasK}h?Xt}@i!twfvCZ~TsDyE!lk+uK2Y;oLR zrXa-x|JKgxXj*A^N*6DTBO?K?rruNNkx4ftgRJt@le#zJ{5@_CCuw%5u?Ly@zM!a# zYzvi@**(ZXNS~Can0Mq@Kse*0M9&jHSwURZnuW~nc4TDr;z~-X6xAQ@^EB+KKz(!9 zbW-ue5wb8zOO|aT_Ca88j&m0UOi-ZTk;Y>;i=aWZ6P5b!U)bO{g@RKNWau_%LGPGPlP6SY$EFksWId{mo)E`)djsp9mX8m14RllU9V38b zCgp}-M5MZM;intpGKbRzupnh6|1cFly)-W%42sjl(s3GDNz<~&_Q5hBv+wcdN=Wns zu&`)Cj2k`pp}r(P`2lR+RwklFr}W;`UX3E%%;n{3IMqkFz#TsVYcjOk4A}$Afckdf zC*aptF+X&xd6!K_upEA|#)NDx)!08Je_An0jx_4iz!$sgFws$RZtQD<@(ALdBAoP* zF>z3{G50%KyEOTCZLgZ#eisyi{wqwOi3E-b!1;iu&z<}=k3=HNb-~1cS3!p9ZO@U> z!skEcCzibalabB4Nb-q`gP0a+Fn!*)?8Q&Vqr3^zeY>Wir1)Xo7);k=2a8_;fuRU% zF4RtP@lm4dw%IexqehBB9$RcZ!p~N&(#$$~>gxxo>mS`fTr7B!^fO~dMpo%ERewTl z@4>0jG&esy`}#cyG>=r=r$8S-F%QHGQ>UlVC(**Lp!3&-sqgI1zklx_5kC9=EfVQ@ zoxoG4B!X$sM$gmGDaRJKu=A<3@zzscy0XdhST&lkr-|SBtxf)HN#Nw;eU}A(k9>rmx(fFy z#@V}W#BBJF50<+BE#^)Mzn00R?R^z1_Uq;`{Co8vA@}@G+^})@f>8d=Kw~DeRD#DF zCUUUb{*MVO;Y6@1LqZi6VOeAo5vb_g#~TzrrwUdnl!ij5-+`MqL=V!m6mVHr!;ymH zKCAjPzc=@M%(h4nLKLyPjc&-X?8r@36Gnjz3$d%=vBuwToN;@asga>>E$r6v^%6(V z39_Ff_B+d8bN{wMvu9N#ALAxrNVf7NDSzJYy^)*Y8q5KWYv$C!fv`xTt(6;{SFO0Jge{G5gpC`92!=2C>Kv?Sw?Ih zK`u(L545|jVq*IwlR|x>OH!HjTTAry6sR9`C(e0ceM4iq`=IUJcO}VohVVn6{;J{MAjMAcJ-mt zrGId-?bSO3KH3!QmY+VR&{JGT(^oI)xqNn{B0E4BN5Vm)?NYKlhfUaQTo((_pvYce zK%H>|iazRsO=xD{#J|ouGjWxIe+SXS=R{ASZ*qeEwz2r{y&El+lA8y0=icu#dQ?5pyt_)5}aXKn1fsRX>uc3^^V>naD|=A>UhVy_?K{L#C(;pFba zirMs(kOC480zW(2a+FMps(R(|hFuboAt|$4#Jf4bLSG{`{oV%sVlYD;I4f(P1!utE z^6ZF?KtnPCLCX%IM+-DNz2W~;PD%}JCyEdqe<8G?hKXs_nffGF<*1ZXN>kj7iDi~4 z-@DPM5Ch7psEC)LOMhxPp1b=tFK+J}Bue3suqhBd#_x!|ICp}{asI%w;1ULe8a0sf zNE3V?mI7q>k%7C)l?P7OKboYQ7B2vt9iD4cQ?YCJ)CxybaTae_LDUG{Wq9Vd7gglO zdG7Gbwi>G040%8fN{Mup-$OjqJcY6VzM!PrK{_!sWo9>Wu9z`vyYu4i2`3@)FCP!& zvuORo^gHOOSFq{jdxaJA8+v`_^m*1!A0m}h+CPY*)PG^QO?)Ji0x%RGjCuEbJAC0z zLn*<4E6z<%g>Zm!9l$jbR_&6+M%f2b zU;BoCsIR|rXrJb{e$MOOw$y}6pFHjbR!+caNkv^yjfqe0HJ6W7x3)A!=-Rz~W75j` z#RG@xLVdFF#3K&y7qYjy938>{-!a06+Jt^9L7S{X(4ac#j%Sa%y>Gs+_xnsDV=y+Hxvp@8;l5y*)H1Y>Z!PpE- zz=)qzs~AOWyt6g-lT|!1J6mJk#J`05bviH7^4sn`(x3cn@!%_L1%0Lbt4p33!(hp| z#C&rrTgLdLgNX^lrbpss*x4m*@|T@Bov_H6e4iwjJ}>*wL|AgTToX}-&r|=ezXP^l z-wth(SIXfam;x>|AF+MN#-rmy<5_hPN$UZWGWCEy?)0uC8lb*@%xZK*NqR~8EiGYW zNKz8bsP&SY{!a%_+!>+uY`?cRH90Ho|14i}z&!+5|JK{O{Qo&L)rRRg83&2`-~0LS zm~eEzcKKcYn}Rq`Tg+M6$Yv>V;s0$CVS{yb0id7l#y8iZXJiN11 zd@$+XCHlagT+cia5NmW+jhx$?jknr?UWK8La<)Q-GhXw=&CJbQTtoDkp&u_J_*JO+ zrJKrC4p+UO;Kqt3Ix$+_=Vlz`*C{B8o3Z#GS}`4BRgIGDh$I9c#H zZ6;51OUvNmGzNTK^ z%rg}8Z&DuKrB{(ZMX%!V!>v)Q35`elJ^5BJl#u9#IOUE|OW zO(Q1ZTXGdo0IL>bC>_?|AEtk_dd#zX0@m7c)fl195aV&J;M#ZgYN5E< zRg!6|jg1YfG#jz{sgv(Tti{~+V$MS_`VMO&ghxMqEJl1&kLSt@-wVSeh|4`r6NP?? zdn~xIsp;UDTg$ot8avp3NrF#n;72=WAZJ(13Gv&Iw_3<4!iR>L_8D*W#mDDlT!ru; z(x@UGh*JJZ7?nI~5pwyO<)J}KXs4BsC0F-2Ma({@J!o{vG@Zb)s4i+K*V4bkdOPq* zEK_q28vAGz6fe52$E zkYudHUxkiUj~`6zG1QSxn8d}T6ct03)*~xYYIc^t4efN7<{UUjh#CtSElv~t{z!y{ zu+YC?;@ZlfW1%f4YYAIn5pB8POJwzi-7?!kQ-i?bLF%}0bydH1RUG}fuj1a9Xc1qw z3XK>)8H_`m4qN}HkPQBBX;H%KKW;3wLI3sle+n?i|9cnc|1SJLr@|`ze_!-dhXfzz zZMi8Z({fiZcn`2hvw#i8n4OcDA%Ndmn3(~nVqoCQ0v2YH#J^&))BI)zwlX0*V$ukg z6&6#`>~c73fTd)S@Nb{}xsaK@Mv?*Yq1d_8TL`qSxL3fIm!z_? z@;|Vt?CXHDAZxnPHBh{G{#YI zRZvimW_ffXapJICv5TW4I~isy)7skF_wV0>7=Hcwb$E1SQBQQBv2aGHQ@IG^vMw$z zj2V}fmI8ZB{Iix$(`99gXOFR#78ldA{yh3~f6vV&g|VR~;Dv#Kuruo1$!@irN$Vy< zeCfZwV!4xdFE0))Ye-=sSwMnVhE&DMMa1_Z_p)6&(c4H+BH0uN@4+i*q!duXp zVUw3z-_jX@+<0c+j7sC$VY8){Uhl%vmr|g^fFu=m3@Gc=D6)Iu*j>TKZLeOp^6@qB z-c>;leC$qQ0uP%wY|X0y`oa8J> zOqBf_*n!Jdpu@&D?bv{pt(_z4CQly`qs_*g=-oWNxV9w)iWiveUU@gJz?*VPcN=s3 zSyG4lb;{?3iTEL0DavyEKg4F|Uy;XUSZJPmu6#rvaQ4Y4_3gr(x8()IP*f~32X1?d z%2|A~1mm7dHTxE`CatUF>h;e8du|}szrR_`7vqgL*cz40GZ#$T zlxx%A49?|im~vpj0gWsZ{-C{oee}Q;nemQ4Xx06vV2gUdCWg>}3>8a0H z6r0Mx+uK_VbacA^5TgHJgec_ne+bc+%2dL(-+n?X7B=4vtH@tp$UR_$XrS>bj1bjm zScxuBs_=aNccRQ+SmdfwX^U%2z)( z83qLfwVx>Cr!zC_Xbb!o5hX5$A)*F^iHV6Kg=O|l73{`^%M!8rR&bUVBoS`U6H`;y zLp9aa8%AIo8=JTgj{0FGM8jD#Sr=fXFcF;8e)UBO)E{N%cJF7THVhGkB&H-5^hh|O z9l`L#?(dku3gcRtHa|bVM>(0S|01GY#*h6OGbp_gxh$wg<8PHeii)U%&|AHtqM~3l zTQNcTiUT_v8v^U=94yES6-^WPA)(?Jn3&v!8bB%`xNbBwv?_a@!=WKW3?oB6Q^Mqt zm3T03c#|ezj4pSwB3~=FiHCcg_0gzvi|Smbx6dxu0it)yWQCKJRYbD&NYW=0llyUN!oiqQ zh2H6$aYCJ}R43cQ?2BWt8^5+i<=ZlLU^E z#4ju+n>ql5lkD8wdBwfGy^Jp!RAJClVbZ~3e-@b*IXOB1*dbGocl)+O+SWGcAL)YM zAAB*uWf{ZwlD*FPFd&~deUyBNhlfYwAKyLIcgVo2qi+OzOsM>Syj>n5tNu%fQj=O( zSOBFAz<(WPB8`y>!xgSICuT4$iCHLCKab% zR|BlinUL8H!?M~7Pb1tQW6+ef>*a@VHxEI~^^xIjY^u*1>^j?x>Y}xei&@#RO;{E-7f;RzF0k$HK$tyr$c@>#H^3>S{gb4(WQDr&VN91to1Y}U zGeNtqkhz*E(#PMQuE{chJ6q6lgA6PwTJK2@(9w@rNEi7e6G~EWtx+l za%DjH$gUOw_>5Q%XVlx7!Cai#={um`3F4guJ(}R?1Ojs9HKbtQ zfyB(}(-J^aM7PMmxs%^gs)!^`$d#88;l26TJ-})U+N!lnGGAZld;j5p%p|DEDyWZ* zQ<^NRf>RN|v_Fbv1dtfZ3Rir)2<9~GNNj2t_M>Z8Ie6Ew!4$x`M)maPSMhx(UtZ-? z`GC<<7Q5Jc^LS(kclI{KIm6c1+>Eixf=RlDP_c&P^cz7ZiY}$$5K);|Mjv{vt_!4?kTkfmeSsYG-i59Y$<6}sJ!jQnUk|S79<;eQ;L~B%6fF6=qj0}gX2;Jk=+WrG@JCS!JO4V7$ z-s2K;q+;&QzD2V3O-*(pZ*5{$)xnrlj#`!CHl6$kdTr25lI(;xuADOrGstry)OXve zW(s8FHT12@4;VBZyG!)=E~#liC~Q=%i#&ONp(+U3I%|=udeJRZRbh$*O89kbj4`>M zqqMD@dk)=Z<(gP=pJ*xWrC7`4q7NxJw7>7RMhO2S+4MPS>&X`b4D}?Io^}A=%Z0b! zWW`W-{@r}E~@+Z_pfc1&5E<7H0zeM0)Cb_5O$55EJ* zI^ZmR&9CInoQ&aWEa*6E5o&6Hv^8ao+^MDeBHS~Zazkb7L)qPF z)8^Pqn#!Vo%efr<3Iz#-)<6q~4DrCY5t=SVF?OlPNJ#7)smHvk7r6pyZa(1xsfvfN zp>@!d&;83=+i11|h#ray-U}|fy`Qe>@mswKY#BbA3o3Yfd^?EW^rmo{s5RTPm+*w_3=IR{GyJ8B+$*rm3KTmf+CYq@~ErlPDBt$g08)HDAB8 zY~SDFOvDA}V$;(yeTkBzLlf5^DZGA-uXwejv*It6$~BNi|7{rUs*@5omt*x2qg*}P zr2L};3gLEwM))5@m4sO;RC=Um>Z!$Ukc%Wv0yzrQOm-wuPag1%^#U1{{!Yert)!8y z``LaW{sA4a5uS?)HA4m;bR1MwW?E_LO%Hu47H7H(NozDMm;3Z`E^zkF2#E}N0YWp_ z_b9(s837EZr8kVdQyjHgh~MVQZe1n?qV1S+iOK~78x)i>u)Se z?&O*=xO9DExF26!np{Qi*`@GXENz*XHNJwPwNxn6D%zJqPMUu zX-6;5G1`{02UW+<|{AiTgxrB*HP z0eWY+4Jl*R>cgektVbXzZ0;IHlYY$Kz#q{GIn7 zq_ACg0jW}#p=`aM32Y|CDwbk{62hWx>%kIUO2D`(r@f+2Q9(QAYPPx4AWgDo4mUdA z$=)QYK@R>ppF{6h#%bp|Dl^!n@{yG;$(8eq#|?O41yLA>4-On|%K-8zBz!QCi1#(Q*UTegn^p+?XgMc)apDwGm)-HlC&+4}92Gi(6i^$4ENX@mUYz4q zl^;!8!pZhH+z*H|ws!^(hD7+o-Y6dMZfVg(ra|dv$>1}9uI!CjY*`V;hLf?fLH6-DJW6H>zQ)|gYZgyukuQgkS zqueO-zP>$NHo-(JvEbGBV9Uhsb8J2tM*#Qp>h~>Hn2ZT}UBo=!=@1_%OZ=;QyXb)F z7#o@R52X&*2aT5DOvbIio97@kw!cF+t=@rKPyO0X^|^cZPK*UXKE4&j`~jB>PV-p0 z#0M zh$bc`6pnw6YX(z>S=&6zCu^5YM>940fkxXER!_)O+0z|LE;8u%>@TWH0U&y)}upf!oWL!(7a_?3S4nDz|X8?Y@l zYPZr9fete0)^kuI*;eO~6DhCjaR zO_yvx9P@^j1!=t*+egUQ=u)iTf-wdz2apK_wD0rK0r8y1*PQ=?>S&ZU+&UQ>+u{~< z+mpQfC)D#JZ4pah&Ytf$YY*lA+AN4I;YUPTXT_<}*w0@O5tUgj#e@RENT2Cg7et)# zKb%=O;2T6?h~yzhIbekx66OM)hz|L?Tr3%D`cOtnxiAMwX2!Da%^HR~1f(+sX zMZcY*MJ_Qb6E3A=ifb{%m;?E0{8L+-NSvg&^038X%6KPaK#YY=)Q}vtAEbdab9AFU zbq@ghG!zR2G3SvddVZvBseJe^&bWEnoxiB7EvjVmXJ{nFVt|Oldd_UD2+M%hLT`j) zcl9tRG7%&F@S{Wo(D#hp2=Hltj2fv1-H4%!3M<=XB3seLeg53wFf+CoDTq1a1RJa* zd^9@g-l@zO2)IqMegT{7-b*i}s%a7WmLnaLfzmC)-OEM;cjcMt5%iRVBoU_R% zpV-M>MWIH$7T)@a0(f7Xa7!9ZR5fjKbEFt{;4Cbi1xHw&xk3ve@I zj_6-gf-m&;&du6x=N9(~8QLJ-=2S>vYgUUiJJ_`xjIztM3h_6M)HM^ySGC5Qq8c+c ziFt{LrPPtcSWQi|j}EOb8I!~J{VqwN@QIW5kqT9?UJJ$bE+Hp*3@rd45;tNUQD_%E znHSG%WvWVtqZEZ9AmEq4ukMI2}YQEzaF%LF44D+FKal-av1OYwXs-JQ_R~slVZ(sL^wOStemHR3nP+ z=YN;0@ZQGYO=Z#b%$bO)LrOP{1@vf-UtJfG+9Pmg2Amd^PWZZjuOD;#q3(buGW66a z`pN!~=SriYdQJU<P1)%3Jf*VI(+-fPv` zF=-kGPq$nowD4r*d`6jYm<4LR$KBgr2SRF@iP78%MnNjw##Dv)J1bwSdWU(UC?tV} znTbV~Y;EQ3DxdL9Qbf!5OYff$KLPTheFdfKqQ(B6SRdl*Fy)IwQ>I)}!S6Op0O?^oG=EI!KWXfdxq_UO^ zZq8~}DasGvdHx5svoXJ(?28=@b+z4opT!0nv*I|3=;Rx}P$aD518Dvg@9lq@zx`|C zx@k3W^Pc1_f!pZTh#vjcQhSjkrdu9!ibbpWBQeJv+0+AW4x;SYD zl{B&$@MQ6h9j=}J>_{NXX3lE zP1&xvhj$~8ZN~P9D+Bo9pGc^U%hjAbZ~KX_G|RFmV4MAHo;>U_@&rd9+?v2W1oQ_l z0M)&qP~JSGh@6a0XR-ikd}p=oIDX|pDH1NUP4v_YKKkPI;+yjJ59Ge&?cFmhQ&p?s z6y99D;x*ALLgEn-y5J7Sw|s!u6h*l%_BYSErExKfjQ`i~2?ZAX_(QG*BU?r)z{ z3CiczeJrz=;pGVPY+6odJOjO5F-^*h_Kc$PNweg4*1`Hz_+8(@+}SB}Q{FQ7`nMN3 zw;)HZJGw9io6F8tiMswPQ!2d^LEG(_qKDE+nKIhvdL+!jQNp-P!@t_VzcQHfic+e0 zKycwi8cVB>auT-n8)qL&0&ZEGUY_-(msS0lM5r|EkjQiQ^>1D$1|{$4{tu+iiQ?V# zlG?IM$IhA+4o<<=Jh;F6`)DkaI$dPp(Ag|rZao5K%#h0{z`>aN&+=adpu_!Jx^-3j zKjFCl0CfK^H15B!y#L39seMo?YAl zQVV|afr#IWzS4k>%ZmFAZ`ayK@l1aoA3(9AU$}jRPZE?h7_BogRW!XvPEHOu-OZ^1 z|3BalKXCWC5d%bA$RZE+_Y+m}H@*UHXW*Pm0nce@_74wrIY>jnyIXtie*kAa;DSA3 zdhz1Ljj#XB`&kDOu3{se^5)tf<>hbh>Wp{>b}lbK<(B}JV$c?kgI$ehayBSN4G>i*h7?t0#~769Po?*z~GJVqX%N&U4kcD zy(JEH1n*pZ@FxgwSHhS{QbAMy2nMzF_HVRVSCL1`bCIpN)TMS~ zLPH9#^jH(Hj45}=BBiOKk4NmQsaEB3K6^@McdwmnnMW(MTU7cp`~#q9uqJ4*P(?F7 zcsDZY0!lrmmZebh8dqYbVa4G?H9$AckEjvcDV+r`AlVHY~`o$4cPFSNc|5<)!iIjjvModRW<@b?&I` z#0DWd0)&m`ON8oFL!FY#5ibTOys!p-cq~*D+SqU`48sA{0LMRU!lwE`sF}v0k5w2pM@}>iy8BfqfkT< z+Eh`l$~=(;X%>Y@Fnz(4l@IMml!q}w8pmzgv&{hMAb*+7(%SWoE}s&hq>89sn0ty)Z1F22N*D*)pkAFisH-VH|Z9?a%;+X^T5}JG)3{ zLu=z=G{w@?q7;~jUvd?bU;;h7)=H8#feJX^9ip9V7+&eNU5 zZ0LTZjU0Gv&0I)(ad%L26dh)r7zQlByY+-MKfEIA%B4B1Yco(Ih}rXZ6m)yA=Vi5! zkO%=Fc0;iAm$W=5XDe-FWF$%;9NMkua;%gkUFj+2$(3ePtT2h=bz`jFOl-orvS*hT zXiyd=3d`1(C7-3vV`?{l3;6L{O>-o+`(XSJ!V zv+6m=I<%_U(l=m=%f-p%eq1sF$ceoGwnRktT8==zCe|m(@4ZGmig+7j0P|o&#RN|+ zuC{@YaP7{*)-W7ecnvTkgkK5`=r9vU03u6&iSG29mzHu03C5}O1cX%daJ?I|SfF&b zPG3>ct}H6elD4cklH%`B80uU|zS3U2F3@^R(`UgwBjqXTwPJjMEdG%%L9<6i_E{~e zm{{%H!4J9%`CRB%jil~1e&s}8Y2FusfBL@I9br4qozTCcpl$9Wth1hY%SBey@D&qD zn}gK9j!Z;=pc|hb&YDBwTHd=}0e^@gl8+8ZC9<_P!a8T$5W_=7xo)IvQSzSJ`_v_` zhJ8)1-O$Rb&z?b)SFmmF@eULQa}$64ETrAMO~e6&>*-Jc{V40q!}!V_E%@avohA2H zrxB`+XW|#+_LRUIns6?L@K*5eiWL1gPxRs#U?~5%qrgaHt!QDD9|cXppemq;8H7V? zv69MrD_W~m;*{$EWvLzfP`TPNJt>)|?!|?Y@5GRgNaZA&-&K=jQHtXKz92mCL&90= zSR|+*+~-DZ9l{`T+VYv1r@LRF_g?v-%F#<^o)INzGo0~s^EY#i?tHn-&~>D}7yku} z`5w97{<4-_Yt;4t;BbhGdI{=&d7z0_P?xgiEo4jZ!TpR*H@zpUndx*XFnAN9PFF%f znrp`qtz0P5R`;x%Ur;i1aT&aQRmM7&u&GUMwJJCg&wD^irO{B=WI zu|k-0Ycf^~h=s8osNys2B)fo9WxtWNRd3Q7q>C2J9u~y?;+cO^E_iuBq~pFA{YF+OH0$ch17Gh8phRO? zPQfUS=5_f1K#nB2vMm7Q_}YyGaSeALf%czTezH)~CLrm1g>FslF${x$a+jMElpte; z!NJc`e=n(F)s{#i>hL=wxMODRJD;;)mns|9%CU{e&5tIO70TiDj{! zpHV&t!H&{!kAZSb2c1}v1%VSf_FVG_I2ika@IV~6=<=1lVM+79WVMlo&Fl(}aqQoS zWRFhiHsss!1>y;0_}zbmY$Vyzu`@Zc@@vF_eqd#W7N**#k&+E~a-0Um1Cli4@nm-9 zxhOdl`QZ8D*Pn|^{cB*w2-h)-h@v2{KaL^{RZ?2|C&iOINJ{Y;QR&o2kcx_eloZz= z2n{sfj}yTWvpNUNbUVOMw=C0xX?m6lBSg|)la?&6Z+kRMXJAL{KxwojX0@eEO-*r& zJh6HLXrNp<6ZlDAh^es63Q>^MDe@Kjy4U^lSt3x|bxV>G!_=9LL%xkL9@%N6&6B}g zUVhQJpR8LtTBD~=>Z;ok#pYCPBd)BqLCJAE3Z)BTIkmd`NNK9li`A&a7E_QHvCPa9 z?ri}7#BR&Q*h~twKpH4hJhjVe(a`z85-N~@WGS}VMs>UdJbbATCM^X2V#Xy(PE8d< zLF#1IWRycyvOiW!jhO+Xv90C^D{5Et6Vo?Ki^MjL+Re8;?gb~w-*oyb9N^A|NG zk|nlJODA>efbeQh{$y}~aT1sgHyGw$dZrNiHrc^6NHa@}vtw_(H(QZ*1N@o!9DhrZ zfa*I#4?CwF?S)8f`B)ei?NuHFg1BIospY#38rn6}`DBEHl#ph^2+{o2odfq0+Ti#v>y|ZhIjy1UOW5YOW>)l3NlMc7@pWKSIf`#>cs(9| zz_fM!KU_AX{zaCUTSeyD`a|uM8uW#<794$JT`VZk%wjs0qVgFtIPFSap%mmE->?w2 z$quM0Tny=^v3VhyztCsVXz63$Rg6x(d&ciosW;=-&X?@t@rOcjxY1EhF1VR> zG@92KJa6c;K|)khw0^^aWxzqwd(2Rz;(*ZXv?67X=fsjB7z9b)HBe> zBx5jJA<@Gjn^NXXwJjiqLU6rV#gx0~O0CElLc{7ZnC~nxgExN;?>An4dT1`nir7sn zgck#8S02inEd0*?{tIuLiI;yx`E8@$Ls{m*@YW}7Xfo=clDU*FS$+)9!1u3T+E9KL z_6UuMm+de*q-Ds-FEr0B)=%-6(A{W;`KV&FPi|eFgoQ~IOy@?sdl!Q3_j)~7&f9cV zR4f$d7Kg3!;_%v5bW|8`emwu8tZ4qHP@qBBPMf1iA-cFw9rTVmMXQ8TVxOMe#meWy z-PIwT>DJlbua4E>qx))e57wpjBI$>RLz?lYxQbYFf(Fn^BT))laqQ;ZM0WVXkejc7 zJNOk1|LV{kMhZYu*8d}wJ)J*E-Hb1PakkL;K#*{`COYllcWQm0tkT9LU?F9o*g23i zUgb0m6)xCUZu^+`tZAM%!0TpzTt%Y%<0r?;*}0*I(D1$S%*IjoVN*Z9+e^g-sq%kY z?VpzWCy56lW=bgL8rm?MT)5o(0u4xYNIzM~lhTP?(FZUEtwnM6P0>j((FBt&>-pXW z2ok%PxH!55{ftJZ-)Od4f{35zfLW}bn?2($cfYC;wbeJP8zSv02!4C4Uvj-die|pd zINaz_SsDI{?<{N|)kEy*V>w)o=5(`tvbHBdF~oQ#mJ?mVw+Vy0SYi2rW;K&j0_%g3SJ{ z(xs!y$EITAE1e!xbFc?QsALktp#jq28@-ZJ@Ipa8YGq<&YUO#RyV||)mtJ7Iy%THo z>A(o8*|gl+_KtyTI21ARR2R-n@%82&iVg)SnJ7liE075+j$>_V*A!$OYX{=1(sMPv-O4`4cvUzn+PP`c;@{Eni#f+^+wbo zZ(VTIl|XFom2B}yoEdg7%P0j3CRsHv7Z=!0V-Flh-L*x-u5yXl*UN{OC3vNS9P|AA zcIR<$e(X&Ty8p8ULPaRPW^!)%|&@!eJooHMcVw6!ENTsnDS$t#>_<08(w|R zff4jKiAkTQ(7|q|C=Lb1=vtuEC3>@}Zd+anS^8!X%Me)`3NMD( zGvfZ*SUBm~^VN>8us-Q9GE9Oh0i`2M{YqLsKH2!{bh~(2cEq|vV`w3@T0^wn$#Q!# z>ngIc2$d!gqSj)TB3%|#g^#lo@7WRSMke@{6>l{jwDg{X|C?cjmr}RNG4t_zp{PaL z9uFU03-#yQ2u(Q-~3TXg1ctssBaaf}2BU@(kv zjWD^ak&Vet$WG8v*E{gL7dXA>PG*p5kXdY62%x##y3rgNW!k+stGIg<>)qS+3b;DG z=wEy&Q6L4>4l!_4Pq5}+ydlDQNrZ~?vUBLQeNvYu5mBog&Qg2Z)|(2=DO*wtSf{lm z6DETHk>T;U#k?26Sm(<2(MGTBwaaW~ro_^Kn9a~tX4G_VSK-BVs>o^xrO~H_-Z_KS z(4#9#1Pu#ODb0k_Eur1o-{==tLs2}Yp2G9#V$=6 zf3>c?MY{k7m8=qR-{8Nm=`scsQht=rOH0+)+B_6m4iD!Kbp)pOEAHMv!w*ZjB)>v5 zm?O@tIBub7roV5`d$0F<4?;Qr1o$<3zu%cS=~{6dJtLF)um#2YH|Y?vRQ_Zr2GZ^k ztS|3Rcr#UU>;53-R?~{VVq&eFJcOm3nY!LT8x~I@=p!Y;<r;9mnj(69OIZDJW786gITCV<=AYOHb6J;A zOe}?FQ>V2mn3-Hdjd#=vyLsqnkQa?&iT1`z25xp~x44Psl?ZDc? zfey%U+G^jaWnvj2Id};PGdaEKaD-;5z1ani_d6c%9-xykyVcLISjdt<^C`ncCTmBK zg(ho%8zPt`9(PHgmv*Lay6HK%q&jE5tXI8#41I6?a5xy-HZc}GQ(dvj|N6Le?d|?T zZFf_P?U1#SA8eU`>@ z8_33sHc|E6Li-Y=wPFp3zP*{~Csr<=9&2~3sT4=S-8mmJYr!)7?&^FZVcJ;AmYtrJ z)Z)Uyub6`hML#5IIIY#TiD9P;%C85=IZeb}B^_RG@D3?gtez1ansug^O6Z;JyPO4g z1ZD4^a=;MZTax~MB#0nJ+wyq@Qf8GP#{Br!Rw>jqo}~YgQk+CDy;6=6J_b8w-wHVlW3N?jvroloE;795O!BNhS_HMB--)9!RceahESCX=E)PJ z+dnhEqhJjMcr5AU5dO<$w(kq0xiYg7mT_S@^tiD+nIZ06oka-=32B*b?nEI@&y6yS z+_n*sZlf=a7V0}IgXme~UV;wZ8pDZNLyBW>Ai=qREqGUEJi3CZ6sK~Gh(nyx^61v>o+{ar| zoKvik?|*TBVs)+&kOx(KwLEK;+eWWX+YEwZdfUpz}LR`3K;xce_!zjeF#W0Q}jD51IR-!`%$0oW*k#^0TcFjkyE6LlC1FdCpEPqjMh!DulV|Qc=n{6^Bjpk%qclZ)))8 zE6`kFD(#aP0`>wk^W>|i&Y;{_2G(HOH8;XJO|NmZL0UeMad!*WX55u?<$z<)WZhZi zRZ~Ojl-X>uah58U?(=j@sKYk(Bi5&qyh&e-jNp*^fNeBHJx{INMj3N}BME-fp661x zpU;pt{Ra6omZ4a;q%}?aH(Gogiy5?t$Z^;sIr$Igjbuh-=(-@04%-XwDv6q*ADNbR zXV#N`vUn?I#goOB%4Rrth;QZaPDDbOtOy{6y+B%yKzw4=)&@a~=&|e5+?0oZw~VH% z1*y+Vc}w>?(oA|w3Ps%9wf4VHoq^{Xq%7?(d?-w|d5&>R{*DjL^jd+?G^Cz9KB%6b zq7idzrsQQJNIx#n0MA-r)>=%p2R%4PPl27WddeX4`7cU7sqkDj8j=-yd-O|e^bJhbc5v0IW?4@T1$js5{YmacpnAI9vDHr_L-bJ*Hn zJCs=IOozH|Jqk$*dGBvuo2JAxdG4oWFId4`=s%18ybx8vbD=G*eVo|zF}axtiOwZ^ zUbmO2n(3ELAnCR`bh%onza&|G3OC9ADQn|fE$pkB%#|kX=dHN-;L+@Nl3Nq~!&vZf zy7R8ddHE78iPW@eOW4QcDwhNCPcnF!Seyng{3q>=q_sq7{w(U-D;6hNgSu;oguAr5 zz*M-yO9wv@Rzy1ZYqw01Ayz3k2L%f^x|c`1e|^Me?DJb_1B16*>)&b$ChVs+u1^DF zGA)Z|^sXFRb97rU+>-eYA!xqNXRiHK6}UT5a*l!WG1MILOZ*fQgBd_WxoPVsy>QY> ztxU@g9O-IsLC`d>;qQTOBC+7{o}i@8Y4y6!;ufjiCYN<-Y5DiM4UJ}LxLaG@=EZ8RZKmcBydX zkoz+o7E@n5haQF+#Jf(+=B0M>(5rY)yGvJN$$YInoZ&-oan@2dij&Mn>ryW0{M~b1 zW!mmSjh%0|s^W?KR=FP9&W(?M4)@GJzpB$*hjog4lc!iS&f z^ImzJ+#59;BfKx?hjjQ5s`WNSCYC(|G~DboYzQKhud&TPSg|UM&8&~ACK~;G?N}%R zOq=MhuG=t);ZMl_dQa%N8@cC8nn3GSaQeZwPX)bVpIQFJB|GuW_w&&Xp>_#!I$9)(hi&`{P$ZUakdAFPz?< zzZk0f76sZ=L@BIS>Z!_VBd&j9-Hx{h)LrruYbk8s#8RB3)@{Plo0NhZ@Aa-)g_8IC zPB>|lJ38CT)d{g8K_cUo<=!zE@z59C9#~9Vq#Mx*nJl(T9tWAPP3dB>;OGkor9qQ_ zvPdKogWcvp+DQyJ`EJXiKbd=?Q*JSueQz=?&Jl+J`(U{>SXxB9A0t^dv5qCCZ(^e> znwqIKlys>P4~8Lp?AW7Qw8u2aRb!OzI=nTE2T+bmRJh~R_=M3OKsRdoNPjkx4ZA8< zXE97r6TjyLHd{Q19@?$|UHH$LWLfEVxzZ->jQJtIz}W;>-LgUZsZs{pzs}Y{SYy$* z@H<5txp)OyIZ}!wDF>CxY6P7=SLi#t>4$RB;F>oCbJ{2rqMgin5%A6tWKj7s#w{9v0JGe4S``k0q9 zeWH{kDXMBSJqD60)Ez9eQhiNO@an z`CHja)pN$TY1FeI^}Ex`_+BN(7uhb6i9@Hq(;@OHF8x0YK1- zqUpmr!IIu1M527ICVSEMTX3OHiSDeGz5TV-XEJVs#NHgQv(1YQ%X~+xSWeES-+zmT zAdb~KkP9>@eBOZ)uV%r)@9+LDDC+6%hHV)4^^7PyV>$my!s`jISzN+RTWNgAelO=m zfZwTa@ub8*pQSA3jUW%9^uzIWPH^IgR#uOU@jxScVbk{lmRb8ZPQJNO+o%o9MorT*}E z^WeclyU<{MU;gBK5LiGqSYCSlRjPdUte#GX=$|wxiAa1X(J6uz1F0TA6HB5j=1W8I z5UNXe6s6#gD>CSK$b2$e%U@J&IbD2c+)`Nzq3{Cx%bWp?_ZFP6F)XLdi=)0R?b~-R z?F4G!jD1@Y(*2f&Efb_-;Ex&R_-Us~7pI|w@}(r@&`AN^3)zXRInD+$oMrD%toIR3 zT2870BG)KCHGj_p{zgS)Oco5xoA?N5y?LNH`K(@0NM1idCi-(U#;Uz~OPS)8n#uuG zQl^tJKBJEC8?$*PNIucD{dX5qOPPZ4SxlSl{wu!?bCk<%=PYb3L*nuySP+S1zi2|t zYG=!inqFi4V3s%uN6I*UtuEY&;?#5YPyyQV-u)LI2oF7t0~MW_LY2O+udj<$2Ck07 zqr7dHO5?yZ204ylC^Lr?adtmDnoR2v2*61@JsUHjqxHYW0q3pTBV5l7VF4BDQ&gev zKWg)2{v{Ua)5fw!QVvCyOXTljT7690n;Mc$3|8Cs8AScyWb10NO#;Wl6jr5nWzjYQScFD7(Z{}yB}In z(O^{)79uu^5}SPS6m30o-z2~%ttSYRgSLhZ1b==gx2!7~1nve81H~SkHL|souj<$r zfoGrAj!GOdu4RT41yC+(yYgQ)wl3LD9&QQcg_bE9OHv+XEC>-hkup9R=b{`7D*Q#= zLf2i`C)N;teuLS>F5(PZBxuD1HExEa*I3RKFha+r9Gk6T%h`f12j_7ty+ z4Xbzzw)%SgWKlJRXCr~yXn6Bm^zl_lQy9S*HbdX4fU`J>bK71&AJqv7G(}WB47uY4 zBP&0a#o|DwM9o{9Ht%^(Nh|qZv?;Qn#k>mcjk`j6`HE?70&qDCtJ9bQma!1B$&Bj? zHnuC_1e2|~NIROvPcAEYqE0lHrZjKj`_PHB9+M#ckD2}@fEgkWGUWj|dwPVWRxnbFCzpe}jEqD_i1rsn3$cA%*i76)*hpNN>_~{=tN)i>|QK`C7FDDr7&a zYyd8Oqoy^ysTe^xhMzTM!Jtbd*K;i#QF#2_wl=;hDV0bKo{MC1pkp;GMW84phz=!`|L$NeH+~&hd=_fx@C@J(s z3|QIOrC@H(sV#k;_GW6w(Nz3oId&LVV_-U-$)nk)j_I}Z#tKO+ov-WNhsVjjJ=Y%GHJWx8q}J>A%##WT*yRlH5ApBs z@b%lgCSUqvk$ZT3xl?`jSb4a0&~UhLCT`T3Fk_N%`Hunn>zh(OVYZcysdRE_9ClzI zyu9ppu^`mYkre9pGV$yQwHm0X_V2Tn7}NVR{h>*~ge6>i>fejp-cbDDATeP;Q|-Q# zR$%JSNkI71V}9zG9oDPa;>r}@W8Qu{x>C^nRDV6rMj&_~nLPC()y6e|%A#8q8a%e;scBrg4djFO5=xEnhXux2_H{2F^G^SyyzynxE4}FjS6YGe0;h-oaj=mAw*q0=?@I3unklpeo(YwWh zp%6U%eXP8qj44_IQnUiV&WUq7R+J2jKl>)rJ285W#&KQ-R=|m`u49M=)XUh(W2lRy zy6fq_3oS-4O=0O zP=3UV;&QgiCZz&8HCr)uIsll-mQj_@*jVW%vt$!L*sgQkixy1z*YnKO#uqGV*JoiX zvYUPDrwExyLz3h~7|Ln`c4bD|&DoYAiUpUS>1C_MC^LdE;|p&B=@I{V1WC4b$4)X* z9nUGw_3mH?)QOy2Qud+UDs8njNXt^+z^2Vez)%!FxO3$-$Dg&1G^)nskkZsh`oLT= zvle8mP$nv@CsUiYMx<(Uh~wX15q5G$=}p_QdVW(dV95XZzE=Z+Tn8JndRNqTVew6m zfSHBai#(qw^gJs#D3LVEkATF4Qk>n?_!r4mX_9OrzeOB|x=oO$YJ;+wm83X{HJ0;g zV!6%@UMqt zi-4J^11c%rOhSu7npmV&0IyJ1 z9HCCIN(r+L4bj8}ZQ1?(^`6=Ck4*G3k*Pl7_nh={>@}yk9`G!7Q$TCUaee&e#+;w@6UQR7&WQq=!RbN%pc*$L`Av`^xb3>i4B5p?sU&q-<)5*4F=mp__+!{Y zHuWCv=Nr%$8E^ip0@rSwZ=U#0=^My=$i3Yhod-mVJUTNYA@1KQP zo(raEd56ChlD=_F9RG5|oP2B$s%_6|HwY=)D*-I4uSl?X*xGD>&K;eE2kw{x2+541 zN*untsk=SJk`RfO@;&Y)gBC^(u@nOKGI(;zz#+~_pPMXiS-ZlmhfpO4MhJG>)`q-{ zlasT9IujA?d_DnUVRMd4wax)d}Jozd0*_DqM&!svDQr|u(O*mR$fz9Cv|=4 zym_N0IoWYOd|zE`BEH;Vw*r*@5B)fI|A{P?~2buL%s`}KDUjf=;s@^YCclgHBncEjRxsj6DqVJqO} z>+4&m-1gVU+4;Ed`g?M6a#&c{JqPXmFzSDEAF)CC|4<o(1t^iIGz`=-!h=`N|X6h%YY~0$+%*zI_3R99CwIXO8#K7Kvh*x1;- zpC+O76H3t?&SRKT1THKpi~WY6b_;ZZsJ=oo#zG{+>}-jQ8q^r;BO+lQFI!(@K#8C< z+7Kc(Gz{Ym5D`ttQTJ7w1cm7z=d2yCr>re-`Bt~9n0Tgok#<=7N;c#{k`M?HrmCt6 z%*WRRt^-6H0m&<;&$wE$tCpmVRmry#N#CYu4om_ksmK$uz^JHz=A(Q5{NU>DnRp-2 za_#NU_)35LaA}nde9Mzk@cny($%jfk8ajZzbJ0u!1Xb(YjDW~_15!7@^+{**W)H_k zM^i?3nUr7M-l~Y28FG=ab^>9aN*#o#s;a7X+-}#_EX~aW{nh?C8@_~;R6Yk2FW&a3 zZDO!f)$B1I`ZIryq}%)ZL~=SB8eqoRyAM79cjV*jvM}VpzP;hCz14xR~oLJ zj-rwIb!fpDnte|&3kOjtsm6u|HDfmR_5AK`#kQS!Pk<1Vk(wGOqL>K#J3DL669hzN z?B2AJA63Lcgbma$90JcAtE-I9@ng?b2Mz@Q!W*ujc%KLa5WG1L3KUKKc>5e5V-=9a zc(bAhsC#3h2VehuPD`sv))tXbK4DkAbi@XztK^oJmjmRIRX#HaK(W0Jc%+Q!wXzrn zLK?}kyc&Clg+PV2pVyoa16>{Hb=!v6p+R}$T!4~A?)?0G52K`!kr5xk{q1c~r9qj3 zInZ&>@9(*$tpQz)>+9?L`;4M6xtwpp28M<>p>ncvsrYiw+6 zsB&DhSSSE-c$S$gGJ=K$Mtqr)d4>UH!p!ybdTVHiNd`Bwd2jiSrBK-?NdB)7qd}Mi z%sVRtmD#M;Ic|vYn;r$98K9BLujk1ch{~-Vi{x z_oFj4TU%R&wD!U^CNWQDjcmOJ8p-4VL7m*)(1v@Sf;Bv2fu;4UeDI8eh&H}|I zj%SSD+>`y(H`&-IrM=D_`PnvDyQ~;1JM|>*7Z-{F2gSSXvYt=X1F~hhuf8@oMv40{ z*|1d794+?k*z4R2CB#y5;Yra}0#pc|57o0U+=4?}A@kuGNC6>@eUB+=4;Yeo9f)WZDFTB4|; z6=uv1+$HKYg*&k|owz>FoE|=4;lF!<_~1$zs!a5p`)U8e+Y4Eib?@v3kae05nsv|x zgK&M0?2g}|M`9qZg(*WbJJwF#qyb!DaoTY!o|N1$7aU;taA7G&XH_yX!GxXo@&77o z2W#I~>P3B}r`qHoj(|wgzCD0Flr9||y_pE#!PBIqV&Ot>G#QRBB=CFjIw;7eQm>-V zRUk>F*Do;6s1ECO?Ctk)_NReT;;2`qN&R4RxIC;je;_0fWOIf>@8vx zJXp}Tc9P1hBAuO*-eSC=RPBLQd*B(zfE#Q24rU~{%SjfgZSoowi6aTS*$9U^E!;Ak zLOx+6qHfyCMX%Gp8;0nT8Nd`0{DFF#aGHURf_%S-YsM_KcOkyU$cpAm$g#MbQVJTv z9Md|l_#=S*3L>8Q9l33V&zxEW8(s4Ec%dl0DESwLKS8bZ53!ZWXBIp`f|7kbpI7=@ zd}CfE$F-Y*3}^belq8?&bPrlr)w%%$>MADwpPF5T{m-Jc2q8dI&4=_&Tg@!%v-IQv zV^WV>xE#a0ZfREbljYH&jusX|^z$?p`*^+zeW14T0X6JW`g7<9iz5s@%uBK$v#nsv znlmYfLxM+V!baz5mL#i4KJ~7&Dw`p|Q8aWy;C(z*Cbqp|6;2Hye*C;4>@y!(Wc$k< z<|6hyqk*!d$3I4aserbMd?KM&3SBlhcJG3!Nd1LR+NQ5uL99*`94buOB?18%8^N%@ zAh0}&tETr}vyw-h^G&_b){60$dN}64{I3xA%%iZJoqTqGrSn!KPPfC`TzQ2%{ar}`0>7jY&4$_|EkU-=Uk=68xyEs1b z9d;yM-1)^)3G*qj(N=N*N^i_bz69Z~!Zqg@;QQhsiYg8wp!{xPA*cO3cR92!Hi>R< zl6|YE0M5%q<<$$ZF$_|ocdh8yr0Btj8LM^`Cj)wp&o+G3TGye%;Phczd(K5o;nWs% z$|31TQN*druh_&dA_=K%O4!pOLvq>!)dSc#){>-NFMC& z9o=R_h|Z|k`^paOm!RfQCI|`;uTVegi4h=V2V&~(iDI*`zUf?>;F6R=9_UfS>=ir#4Oo!sE@^aoV?FQ6!8NjRl#xA^1 z2@4O6Pa7GDEozKu!_uXBEFKbMUNWho@`^2<`H`Hf`KEyui6M&iM@V4)JE~LoV10)#4T!@qRn-P)kUv`xvlB6(8 z-@boE7V9%c2#pxuCo&ta3PQOjy4{8Rrv3VLsJh>(t7)DAF)zkU$gVuO+o8y(8g~%x z7qai!VM2n>WbA1^tjFi*)Bb0iK2s8d1c;`K{<`vyp=09pjHGV)UsszvTj-tX}g@1m(0kPyD z9N&QgmeQ{MY*qp0RUDN(VdzJi;J9a4L8;Me3V~VBzhrzjiCEi5+{Lvr^Wdy*ZE6>)(>{|rlS@xJlWN+7kmy1xs4zmE8IdKk z(YJXWN)Y(4udMg$BH!zxE^R2xYd|rPy|wlYKV83a(OYr_t$Z&2zyYv8l#s?=zJV%h z0Uv^P(b381y~qn}I)~bTyQQ^V%QMgPHT-kWUkm%sA&GSt-gT=7q4|jw9q`}P*_z2c z=qnpKdI0y5^h=Z7ZzFBWMFYDcZC~!{3D_J4hY=f^%9W>5D`6)!G=4l6& z4r}v&#Ij_Bmwtf{V-2o&MS(S;M?07Z%cYsP`F2L#r>Ip0s|nwfpMtJ+Gd-m{20dOH zFnBk9QJS?WKKj?Ub{;bu#G=_QPupZIIATbLm=BPh>Hvi=Ef~=#O`mTo?Ru+y8()*Z zf*%g~ltuA4KJ~zhJv=4Z`%NE`nut5^Gw97DE1JyBN8{RX9S7a zdzWn2=)l{{#HyF|L`oQ|ggY$~!lcy!nkW96MTJvZI0tKE2J%dGJP!C@bENhi`cG#_ z7Dn2QHA&L?W|~qH z@3OE=Y@6TIp;wHBDdR-EqLapN-+Q!Y;;}zpG5Cu~O-9g2A1OE-G9YNnKLajXHgcd= zQ;1#5lKuV2i5R&aNk`HU97dI%bmfIvk7Uj><4W{vHyny7Nf#O^OxOwu$c>0Nk+iYh zQg3Cjib%#%_fP^KB}vSKWnJ(`RjIA! zf=aC+y*!)GzR6A)Ggr2ZRgReTHq$U=R9DOFFBsdQyd>=S*z*v(@hWDO|1?+zBqx`u ze^pUq^Xl+-z1J?D|PynkSN>1Mw(R#ZMo~mdDcy=cYrtW0>=48d0D; zdsDm5cJb>?_{j{G5}aMu-B|NF?;d_w_3FxuVH?NS=lJZ=K%F>Ts8G`Vf4i|_CwY5T z{~~e@uz@5sT(tL1!8~EaFwx3G{-wRwHbII_9-ZA;Xwl;v@=WF=dczET3fy2u?;nD# zVWw`ZVDNj>>R0Gd#0q4)w)ZJNJpDql;-_FI_4Ls>y%?$AWdQnEQ7E2qm*y}hA=(VQ zVfBsBpA_>+k@Tt0Oz+|<__KR`+8*IoZnoW-GR5M47(q*of$ooZ7S$TCRE>TZ1&nZ^e`(}Ax zH`UNzx$SgPcTnT~@-wjU;j6^2!AmI0CADN3aWBM4A{h0XKQV(QBhB^j3bX7tJ9let z=zLz^Nyq5b=()has5Y>lJL1TH6G68)e%$T&pU*H?s2SmZ#);Wqy-k@+15qfSd8wi) zcJyY!{z?Y<0`yi(r2&%CW9PJ;WMSOkXgNX(z7T#HB)e?gre4%U>%a)16SmzW>qMN6)?jkyZ~nznrf90f6;!A+ zh*zw0WZU6wB_71p;5INShn_xIZy%XBEygvfh*=Z4z(?LQ%8NGi8a*gdTf`xBcyfjW zf)!Dm&p;wS&)8W1eY&o#qZix}JVPIXbb&_{I<23hX(f6B&3S7a(_*GYdvoaiCxST^ z-yQo!n%3-#hflt|ZL*-AC>h~nSBMV7pP@B7moVX^_ygPs@(6`OXiEkj;kyFY#yM$W zwKZl%@7<1>ellXc?K0q)-4QBqv6mM$51GFJ5j_`GJd)oMLO=W-f>TJ+jCkyWB z<5kh5MvKBJ2#*+WYUGvzm$|_~oUM&}rwoezA+SP7JVqEhGG+lLFl$5q4o|5e(TfJ51~{Z~pzLPL@zvP||QTO!OTvfcLV z6d_SUcBN#DEh5R5k&HbF*^?wnvL{=~lCdQwJO6W3&-1+R_kHj89mk(JX1VYCx|eG? z_w#p7Gw^6fWTj*haVQq0TMX>G9{9w&&(C+CMh=tiu9&O{?4quVVL+O9o)ccA`x;UF zEIZv@MCkhHHL*is*kwggli7>o7tZh;CdJ=r|3th>zdEUYhHLPp^X_aO@?6XOjZf!| z8-yxy;+lq|2?4b4w8N>}ckfoD>7TxPx;9>!CGv>YkbKmrbjx+5V1_c#0r&ps@*CbfocO4jLmAOyQ>u`}cbi^ehnw9G7!4{TXw^P`SM#y_c zJJ0PO^?ABa;^OyxEXUZ&ez3g$@^*b#@s8I0Q@A@O$h{jeSK7O0cNOx8UA)<`Q(AOX zd*@*xET97~(ekmsj;jPHgX*!5uQEhCYoB^0_?@r!!y=l>tKNJ^W=_XQ#N>BPe`f!3 zPq-^F$ztMYnOsAA6Rmji%Nt7)*bJioLxwLgRmtq7kP>>Wp>I91`Sj0n8L#^6#@u$V z05e3t@S%*+SzES>6cN76t4{gBWR|Ly)=8~xmN$-GRFi~C?W+K~TiJ{pc9QXW`6V@e zRzl3U_kH3K^QP@Zk|x8d&zH;2az0-+ewAcfSH65nQ3u&ekhm7E7BeyyT4`)-eAm!c z%$eX0@O{WhfQmJpB`0WN;$rPNq0jgmLEKQ9 z(mUDl<-1YOXy3l=L(1PKCpFK1dj5*Gjb4?QlFq04#PBu%qp3!9}d$p>d?o06~Ip3Rl!mN!1#Y7oCm zqUiGn*}gZC*SFu;cIKr?|EriXyO9-@(_G46?o?_~_}hH{+lnv3{ofkk{88%Q$#InytTQwzoYYbnMXy{3TbJ#YuQ55m#(FOt2Nh_-K&$UX8^L{4glw( zf_cjHQ`OSp@-NBSnN&jT5w8VnH29cxSAD8Jx=SXU1kVA2x;=~;C&S~2na?b&JS6nH zq@(Fkm)}iYx8z4@m_)FaoYiN15iU+wj&F4k ziGS-%*RI4i9jB22epT&a(`K?%3?JZ)za3G5!^<h9n8nP70GNLuP9P{@Yqf=q2cS7ZsQ!okC&<})6pn?X+%ExJzTikw~CAC zP;BaKD#BX3W&U1`iwfg*)KU7neLHldgS~HSWDK<|Jna#Y62lX8QF!J!^fw`m485FA zIx9mV7TwxruKeztADk;|DHX1@{YU9S>OM#CsY_3JR(uy#=s`6d1o(|UoiyRcdWVxV zAEJ>^c6w@XQ#Bl~t_~==R+CSA>k3E1O>7}f`I!Ub$~vv6^vx%HI9zSuNi1tTtL7QW zjV*Vzq#R9{Miq9?CFwuey?v+tt0(@SKR=n;xhustP;Pj7w4Z($e&2MZI2tiwu+kbM!&Hys_1vA8I0H9Pi+xI8qYr+oavtM$Vt{! zJ<{QAm#iOg%d$Ww{%uyjPDsuXi=Di5$OV2Uun4OiI>8S1!@Q5p0Oo8X%K>w5O})U> zcp|9(wjvw7)JJnpqlPtu+cw|$NSSSm0H*JhY*g^rk!ykB?V~;t_YwPT$STOJrx2V9 zDj1F7q5J*i&u_d63QBr&c9Xv*-mB;YGkao4v0{yl!c`Vt5+BAQVeCm?RJ?gGPM!x5 zH_H?&9o0_V7$+y^Fd~9{O=TXXPpg@p(=frA|8ZUdeTVW#2 z?PV-e7@7{T!Y$itTt%bwA}O`V*KQC2-sAocwRD?HBt>2QYT+L+XU%+pD3tbgzPBv6 zzzvWru?KTF=B7L;&G(riCv%^Qe4TynvNXAU&Z(H>S;4|+mSvE8!e^+h@5hak4~=ph z^^49Ok*YQ>1V|T#izFtA4j%~%>lY^z)igeX&9MbDyNiupSAmReacYc5ibx zyyO%V%&)3CI&mbE9eMX??aXc*W5VK=qv0VOEj2a6i|r=5^5i`Y4Gg|5#R(fv_m!P< z>E0<=B`GF04b=&?Gxe|1I1sLf?BV7G;FLoJ-NH(D1$9bF94u9n7de#z%v&x=Cmt)j zZeMl}?f=j=H;R$0kFYy`a2z0D!{}3=WeXdZrw`4Kw^tXrosJbKQwBsA-v{*;MEX?s zPxj53_8EqpkEM3T&P<`$?|eAH%6_T4w&@d5c^3vjlRD<t?Kq{-k-sw5~1_0=w85^W%7i_EFFTv6Wl|MPNfW|%wz7FOi0%R z1#SCsWZ7wUsDAlm=h)hfHln(6s)Dzknc3U3+_SwLHSfR9etRi)jfaUqEx7xeqscZv zv>BXg%Q*9ZE?~SZgFWOV-19ZF=a+2^3=Gbm-M^3mCisO5+BbO%T*3s!vf}OE!=2^j$JZ*VD4RMKj~|4VGzbRA3+JIh zC?8A&Ml38>CIXHTdkc+W`n4Y*aOnOz4D)Y)uPjbu`npfuLi7H*4_;_Rhx`wXe_aCy zw@W#!Ny+TIgh-?MWH4NlfHuMIaGCWj9}HAu_vN8H*zeo=O*%Gjaq~OfCFJno!{Eg~ zAnp9!OTko2N2kVzOoF*$Rpk?mrsF}zT2f1UoZtH5BO}3wIQkQ!2#!J3wYPW{;rZuq zXj7BM*RlSZz(5FUsk^=VqLWh_3Fenko+%3}>(9m6a~OmsRF9vZ|In#Oj^m!rhK7a( z;+(RVPYO+XR+1-1YCk9>8nk2AW1Un>bMtUCW=AGELKCyXZ(mJt zH%K^g?)Avq_-4b1b;rvyL-k>6O#De-8=^`h9U&^<-0SeOPtVg57+K0M_(SDV=Crky zg;d!qDi{1$eonP#i^-Eub-YVBnoc0lr&6jeyB1_+DWeD~1|4atA?H7nC%Ubw{gzgj z<{F~72WtYMFwFWH1R^aCsfB-hY8UpUJ>lqu`Ji}lE8saiLQV_Q{mgNxsY)LT6_dpn zxE0O2{dTA3TU0zweSEPNr(*CV^ns*ZQ(xKD-8Eb%eE3+d%?unf7B_!>kV?LU%|C-l zp~~bCV>MykA>T>iT;KC6)n9!Dby7NRoH-N%t#w1&5Pn`>+qOsQx2+gLRE2U2Lr5eN zE=5mYKW{}ecO@JmrFdM~-6V{;6}%qKbf%YO$2*eYa$Vfn=|f-YLiQ(|q?{$P+Ohrd zlN8%?=kgM7L;S^SF89ecPn+XD^A7(0Ro=?#IbXhfkqFh7n z^!9E0-i!Csz^@I3IAmmut=iI4F1pvUtLmIN)80Hs+N(s}Q%yogYN>FKGISc_it+ROEUOHc{aZr zT*tR<-|tyraa4H4^g2Jch%Kg_b*b# zY7Ojcv^XDKN#CRrQ!DWFU?L79-z~S$zV>ZA>5E+QR9SWV%<|8Q2A!H2507p#)%#FP z&_UeFS|ldz4pDrshkWvQ2cjAhwKFUF^LwYVJDoE0yk$A=pi#_Z@hlxa<}3rD zZ1aNdCwmW~fX1NtNIDpQ|3ir;A|<_3r%`mF%X=`KQKz6@k_c-fv)gBDiEj%l$=V_A zMmZpKQ(cwi(6bVaf9q5%&mJKbzl%9og%H5xQDu3dD52Hi)|*q8gv0A?MOees(y_cu zZ8sv{T1(IbzXU0JG96^4-XPABgw%LGm8GNw=!|BHm@=K0O`M-w#N%93iW7yYW6 z?Nu#kLh3%8tv!d80~vaer={_{UV5uSs*aOrWv3ICpu4D6wd>6dMU8`uBCNaGdS(_h z1=`2mV@8(zy2jl*Vvb2CPPvtl$nuY>H8KdgXg+3I%3UgUI7{=4o)uwjf-+FwJuj7- z$zG65a4XYX{vcc1eDa_!`0RsKKrXj0DmL96s=|YCgG=~Dlz~u2(ySMKtvFXy-PwX} z{WF*Y5!8%3cC)-+);--}6&hqi^-3YnXvIn8FmotP5FoD=9Pqkt?L4F$)iBqX+A`+0r1Nt+m48-Z%jd;TMyYwa2ScxaUc}KH#hH@$ zJ3NcsXNH0th}crr4f-ruoVGlT+d)B@;~YU@3@T~u07xr8z;X=Sr*#KSdm^ zpp+5?Wm~?~7%j$p{R%*IxoFlxDEsq3JCpnI%exp}L?{mGb>S|oCP8$QPu2S5`U~B! zfISFUUSyvD@)wuLKmZ2q^Cnp1HAjsg@G-4?*uTTB` zp#JT(q^d zm)8QozZK!75a8ounq`2h-^SwM@6Q>EA?O3PTA_)vLgxe-3gWyJURhcB0tl#2+Q-AK z?r93hNK4;~kKcJynXSvI_~y-<85tSQ(m7~WBJp9TQ(kUvZeE^8MZeNOIaH`IOiE3S z+Ni6q$1Z*cpg*0Fxg`l$e0bYJJY83JH^fvm1gdA~rQugr1}8tAcyq;uZRhs^Tiuwa zLez)(x$O){oFdYa5@^=_XpuJ$PgCENRIkMA@f`|dRHuK+Ci*zuPfL+*re>^TeBOsN zOW)$w*L|5JKc=Wzli$8ky`f-9JbCbXJrD>dvpm*Mo)ub{XrJSVUX}qY*ujGC30)-1 z0EgDYbm)YF7G7_Aggs(teAa9A9xqAYJ^SeH zgN;>5lVGFYqbA3}P+8sMj6?I1w6K71#`ev#;%*~g0!FE&f4ThJG_M*3#IDRdzuzTL zLMTDgRynhshkzr>u#9+C@PNwcCo@qu#v4*sn<9SIUo5_^z()K&j+gLJK!Z1$*hv~& z0pcPAwdFb=w>z@EaQ5~yI{p0#8|`*|RK7u&f+`v%IalSS5Lp{MdIEF zhsI9H#%^bE|M|qSUl|TGO=DCS zz@d#oogkGvY^3`Xz;P~rU}UJ|^?fn<(%(7^!&}iG`AJvh?bq4wv=^kV-qMo>j4?%;END{KC!QPu-N{CEq(u zrOj|xSGUxCmkby@x6?CaRHi0jDZq*JfiEpF(M(tO&gj~_ht}hXFt%XiQWJ6K9xjNj zOJ*M#9(JftvM1)}zkl=Q&HMLVWfy#Oct4KYd5^T zy08nz=p^Xijq>{agYxm~JIVFqr%o~KKxFxO z_x%3#T-~24;ZB@tYqMv~OrGBC*>xoQ*nUHgW+dLP<^GAb}hSpq%GPd8QyTGb|RWO4l^4t&1=8Wryd?Kwc91D4&p|q#KB}K4)$a z93C5NsztG&Lv6M3lRHzl$_|F|+`i4ao*VP2Js} z&8qXiK8LbK>0I5SW`p|mvPQw9*uci$TQ+~h_D8sV#*_q27x!ANANA!?13Oa9$Wqi~ zFdLRP@x;BCM_|YP1{l1gQ&+flz*M`AKraO&zh3|LW1pD0tl#33a?Y%^AD|jM%g<-N zHr-c?enA{%^H`X+7@;CE>5aWlj$_Rzv4IIY*;_i3BzM)aCLjXN+q|Dlp6qD{=-f|k znvqkVig!`^v|Yahh7+`#I+!cR*)nERY`u@I<_zY9;WbEJ^WUNoWTqPQw6-=qmS$H& zW8<6~qo6y%NN3lg$&rSVt03AppY(!o&)wTPHH?(I)v%3S5T=Vy(hILd5TgRX0v@RH z&D2bg1WoA254Z4bnbO%HzR!VjspwyxlXDT&pko#`%@KR(>0=FKT>2!0k6)Ws@R=tT z1`NFl1(o4IY9MGekjD&4P9*Z;NOr)R%-NL3>#f2M0%`O&xXfUdo)Hk`HZDR`)1!Tl!(QdzC)g{(aKYkC8L! z0i*Bs@6Xuv>K%EjntvN{54WN_sl##dV__E|B&6YqO&w@O9tS1E@N;(%$PcWCq4M!r zn9j@EagiUC))a?;m!=AC!#D>0at?D{U2E1jsbdZw4mPhiE?!{u&<;jEhpUYT#k6$| zhragG*xpHhOJH8=*Uf1_M)=W`2D`=oK0sR!OEo_uaLrYuczapKk_}MWs za16BN_QzUZ#rR&JS02u$*>@g+vCeRKR2sMuP;Xk}Jx5uKrW%l!L;etJKlglrL!ya6 zZM=)Gd1Y2=r!~r7V3Ue%(zQ?3h>~3(Qi0kSdU(bJ(v54T#?>j5j72R%W6p)@j59(5 ztD=}LeVgQK2U>B(@rQ4(l@t`O(FUqL-DhhcEU(rnE3&n0@Zw5f&gl!{ul_;CfV6E= zwLf$Yez<9-J4+`@rpHX2*3|6qF*3ThEDGz?;A(ie57`N5I(w+cw-3sf%wn%Rcj^@K zurNBM2+f^Fi8@ENk=$I?LG|~Rd(4PXHbx>E?G7FKT{zMU7&d#h&gW-}m@k%lPGvI$ z9NXASj;D;~Yqc!e(KpeDSZo|Tt5z!+iq2YrC9ay#p0{HcD_dM_Y%Ewc3e3y&YM|tb zTqyFnLyi2cRh8*B>4k#(H(max^{-!dndlCu$;(}|{g4YQ))iKR{qUFTTd7decDH

uUUlpYFVD9czq?mJ^E<#arfHt5 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 IA&Ch7A4zH>ZU6uP literal 0 HcmV?d00001 diff --git a/tests/ref/layout/grid-footers-3.png b/tests/ref/layout/grid-footers-3.png new file mode 100644 index 0000000000000000000000000000000000000000..cc4948b80425f564f4814d058450ef04da9f0d37 GIT binary patch literal 52783 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 literal 0 HcmV?d00001 diff --git a/tests/ref/layout/grid-footers-5.png b/tests/ref/layout/grid-footers-5.png new file mode 100644 index 0000000000000000000000000000000000000000..b58ed2669ce24914088fd7ea38d82899f59fcc62 GIT binary patch literal 5769 zcmbVQXH-*bvknkoqm%>zF(8Bh7P``_Nr2F#_YO*Lf|P)C2oR)qMHHndq97n5(g|1& z2*FSdHPWjzK?LRMv3%!z_s3o9?lo(#d1ud__u0?PUTfw}G|7iAA=N}q0k@hsUO^}>xmPpE11Ax?ka_g98|LA?BEHpFn8Cmu zH<(Qi`h{fhtkU79S&<0eUgh0QtK@U9I4>vn$Z&E%@klTN5)G)qssE)KSb@7m#{~#s z{B0q<<`uOc{@bA{9YSIXT(#_g@_2`3jrseMy>Oybcg?+?Lg`wm#Y@M%z)eqfd55iC z_-iZII;$u^VRtVf7;GKWX6t?)=IHU7BzgLYxP9byT03xKAuaWioWd(l$<~v901@8$ z?`!uJn18YmWRSl2ps>wT@(&?X>2wKFawYAOe|UNg1eyDLlQeN|ZPs@F8^=Jk-mD>x zaP&_4(BZ*&b>}gXLp1JP%oK2g$XzJS+8euyqdYEC z@0>NZZcny(YeZr`GF&rx2f$GLZs3%=(4m>ES01Vs8D=NZZnPv>6ffqxQ7Q)02hb+3 zFW(XEG3sI5mMfse`+8fO2Bt`l>SY<}@Q1ZF=zICMpB!`*RxAdck_I@jB% z?EN);(X-Y*?Kqr}k$+y0s!cFWMIAP&`Wvn_9Zq)m5sL=r3lQ=M0sjz1+9ijY=*fv9g?VDhssC^<}Iaj~P|L4tGC9 z6{PW5Vh7vijbKh%)(i+RhqU4mUv05DIPNq7{*v0{N<`hGfYnn3l)EwHUZBncZcyf| zREt6ZbZG2Ci`zYuJtkcHtbW6S5NHS+;G;bPPtLv`T@pVFp()g62SY!L;L}CD!3{6K zO`>BaaA!s5aNFT36h1GNrnsaV@@VIiR~ECaes)mdtg5@bSIz|POOP1z{l>Cz3E76+ z(rZE&AtVi*CF#PFInuFjewp#}HjDSl?kyJ$$ncArE!AQpk3Z~qoEEQTxb-HN++tJn z@>t290^YCSYOuBC~(i8hXQo+gAgPUXsp!GttbRFM2Pr9xupv$xB_Z;8T+h4weh z)l!D@A}e#r{f&p0=NW>^E&=flKP69UMHl9{e=23R`{^2Ta?jj2&;IiS1TC*B0sg-Q z@B??(i2RTS?>g_gL+0OM|HS{Juq41@lqG!rtbZ$zE}-$7#ByO^Mhb*eau0ofKIaWa zGoqg73*&V+9GB>QD)wkRMsC&ad3!KHR}!~;r;wBSNxiedwucjccA8-;wD~B4i)s^F zP<^tv=O37>hHs1trhHts-m;vmcpXvO;S$4y`SnRaAZ|1AaP=!*L+&8?*5z(WjI|pe z=u^$d858Nbw5F+HA>(ivQ;XoDG>3LmEO7iv+e!wk?}0q2QHb6mHhw(^1A2LVrH5od zl(%@;`5oV2^;XQJi2LH6x&Xhym$fc&&1Sbz7e)Plu-I7Q_?_*{`2T>!VGuJuk;`#S zc(oCEnVk%1avQ9TBY!9sHKjn4O-qj;;aj;Jn2;K(TgETL5LBbM!H0M$ zOWCxhs*%r%_KU+L3^s~g;&}+}55?QBmfA4^f-KDgZ)U4B8ly=2I~^-BrcHkKq7y3V z#gRx&L;(MYmOFsL9je^17#0A;16BObW9t++)%o9YDC2yR-*l`M=IkK z3ZHoAEBTS6>x^+<%U;qvUx{|p4$=43f%%=ha0A!;*%DZDVk$wm5v^g#NWn+~z>AdKxlguqF8l-vn= zzHIb`E9*Xvk6<4$CfqU^<)EA|j}65M>wF{;J0O&o(WlG5?kemC!3{Q&{lj!vg!veu z5li%Ra#+}n%~fDrT878`;dDXVH_u%q>rHL;?p-1kA4 z=-)o)e+@R!yfubnFLlIAG}(JT=xLMkCi*;(dXtu=K)<*a7(@EM;#{| zd%jL5acJjEA~|iol_XVCJA`Y@-^Vc#G#_$mdRQ=@TYqSRfxbPKmx8(8?Nq?;QoY~>n;f0ko&%9|!`?KPQqH?1`LA3UQS*OV>3{e3|LFMd%2Qwddl)!O zPU{K7{?`!j$5A$cHJa;H;-B@;&KTv2d+nN^z?i!J=))ULo!pKQV15{MMwSc4*WmE= zMT4>M#mSW9b-nT?@h^p;j!xjhf~j%70z=MeQ4(ShxlPW#2PK4dHerja=fR-j)OJqZ zTk@y>GmP+D?p23LZa)bb-WIw!Jyp<_nDKK?xvNZ=0Yiurz5x}Jc;Et8($QS;(M75# zS8KH|O!#%j!Li1uD~XGr*`i#a_6m>|y7b41exlGKK_eOvjrJ1Nh#DO!YU-~wWadGV zmleW7y_pK+m2)wY47oPLleuj|ex`ONv)}^kszP+1hrEd;^dc2su$EYT6NtdlaDl2V zt#WzC5Lc;vyStc|@SM>yF<38S6O8UGN=<>&;#z2GT6a#ZSFPw>w&Rkp3)p<;B5A|% z-ZoVA0?r(<47p-ZA{V``Fn{%WNBdc2&_pjU9qc0CfH)mB7wCDwk{tI$65GM-2-QgT zX2T{6zbLSuOI92e-2|tcQiPB=sE!Is(tU4*A5wWCLbU51(BG??*{P^ATXqHa7+vH2 zf>>eoqXvmxzsj$|-H=mrpO)_tTOz`Iv((BSm-eED2~=gpOzmd4Bq(IMV^Iz;gI;b? z#U~T z_lEVm91SUw?|!3=r@u~*X+#J!#aV5NTXq$0Uc4TRd{s?J41tqmp7xB{nq$XTzcnvj zHS!4ceYiZl`*me&+q94vOMK2~%caXeskY&Nd-gpn0UK+Q+BUmrXLI$AuL44%#k03) zj#Myx4B729IEE53>8^YbBjIGdB!_y#m(zP&V|qY(TltJK;{}&FndhZ~)Dly$WGV@n zwZOEO>(`Vf!ym%eXI4C;=8ubgqG^7vsCaDasigSZ3++m#j4>z)fUX_RiL2H4EPeuK ze=|@*_WKeX>j3%wtcnMH23fOytL^}vCGA@hIC$+SLeAOD@XojoQB2(aysiMjiS{Eg z-Q&BtZa>i}X^bXc?M9KaktYf##A_hD2^~?CMn`{wWO{R)kOm?lry9)iLBG|RtITfc&-vv^%#{imx%u9fHEoAn zR9K833wYDpK6KSw1P>8xu#iQC`OHb|OR+3K-}4shbmpkJiCv{(QJ?G&?^giI8NjA@ zF-g%GhH@paD3y#y>n1aL)Q&v~C+qm4#BZMecnSOn!A2bxWX4|phi<$Ma;uAx|tBGVJE zsKR>R1*rI+SVaqW<1+u!u5A}FDOk8IE3V)PseDso3N_4eRzxVcRHSwmDHU#g3Jg)%Dh?L!zLRw0 zmU9+A^YhQDZs~Mg-ezYa4-HK16vAvD zHHE#z)y1KcLXPGi&zI({uQKjOXE|1XDL~)5I!fvmZ>iAze(>@2O!Jk<&Udzc<=mq| zogp!*>;MFgi~_Z%$2Vk2Cf)t2LCXsMX`-V3e=B-${Ew^Pd|l6-lRv`$SFD3!`*pF{ zbY?Ugu_jaHZvcNhC{Dm=;YsCPhY!G&yelJPjaS0S!1!9SML~r=m*eyrUi$r5E%d{F z_4A3G)@&I*@W9Jk@Rorn6JUzVJ3Z>4k6=AFxJiqYq)x?UV z9kNVl&~G#cUmLqVELxE!(lH9Eu2#1ln#6LZS8=za$BroO z=6enRq6dE*>Kw8JgdD!RY-PTx&+X{gS#vD z@BaIxUs1MxXFrCINfj0^^_bzGdHQ^TkK1=G<2+mcA>{GZ`Xd6$2LIgscM6eFz6uX|rjzD3x+oKhC0oRM)7M=! zwO(K|?B1aN;{>9V0H0a~(tI6elm~AgKb0!shU^^h$KFqo@G$GlKj;`3#*wjWM0-6h z%5cW`d_;b5$LH#`=B2DBmiBr2i6hyq=~9GVOmoCou(67lWf!pFGwE4a9$xaggl^P@ z$ovZ%t~KI$Q?Q4&5Tkp^`4U63p$EZ2T@5G3&NtKXiQ@9}XJ0-ob7^T*Rp1W`zy82e zD^w9P>hkkvqXaWce=oK=S4z?hbP3~R-@xtSWDS3d15xyGvh)E9PnG;|2NU7+kGRCO zxE+lz3KK0X0`1i9J`zDNesycgUa)_OXyd#CInO#D7&`Y^{YWfL@X7t67C zrj&lyivy0B9uHNCwT8esDgIaqg6r#FHUF#7Tmi~@cH@4^WS$IRLQL|KCndKQ8gHW3 zxjLxD&+T!5lXeVOVIauvX#yJ7Ho*djrA!R|ulMT>78^)1@adR!b|7rqdP(tBytjt; yEz#uPnNx*97=2LxNXu_T>mPw1)sA>@bCOC*ELU7u8%guyj9E)vPpuN|5c5BGkmYm$ literal 0 HcmV?d00001 diff --git a/tests/typ/layout/grid-footers-1.typ b/tests/typ/layout/grid-footers-1.typ new file mode 100644 index 000000000..c7a59e600 --- /dev/null +++ b/tests/typ/layout/grid-footers-1.typ @@ -0,0 +1,192 @@ +#set page(width: auto, height: 15em) +#set text(6pt) +#set table(inset: 2pt, stroke: 0.5pt) +#table( + columns: 5, + align: center + horizon, + table.header( + table.cell(colspan: 5)[*Cool Zone*], + table.cell(stroke: red)[*Name*], table.cell(stroke: aqua)[*Number*], [*Data 1*], [*Data 2*], [*Etc*], + table.hline(start: 2, end: 3, stroke: yellow) + ), + ..range(0, 5).map(i => ([John \##i], table.cell(stroke: green)[123], table.cell(stroke: blue)[456], [789], [?], table.hline(start: 4, end: 5, stroke: red))).flatten(), + table.footer( + table.hline(start: 2, end: 3, stroke: yellow), + table.cell(stroke: red)[*Name*], table.cell(stroke: aqua)[*Number*], [*Data 1*], [*Data 2*], [*Etc*], + table.cell(colspan: 5)[*Cool Zone*] + ) +) + +--- +// Gutter & no repetition +#set page(width: auto, height: 16em) +#set text(6pt) +#set table(inset: 2pt, stroke: 0.5pt) +#table( + columns: 5, + gutter: 2pt, + align: center + horizon, + table.header( + table.cell(colspan: 5)[*Cool Zone*], + table.cell(stroke: red)[*Name*], table.cell(stroke: aqua)[*Number*], [*Data 1*], [*Data 2*], [*Etc*], + table.hline(start: 2, end: 3, stroke: yellow) + ), + ..range(0, 5).map(i => ([John \##i], table.cell(stroke: green)[123], table.cell(stroke: blue)[456], [789], [?], table.hline(start: 4, end: 5, stroke: red))).flatten(), + table.footer( + repeat: false, + table.hline(start: 2, end: 3, stroke: yellow), + table.cell(stroke: red)[*Name*], table.cell(stroke: aqua)[*Number*], [*Data 1*], [*Data 2*], [*Etc*], + table.cell(colspan: 5)[*Cool Zone*] + ) +) + +--- +#table( + table.header(table.cell(stroke: red)[Hello]), + table.footer(table.cell(stroke: aqua)[Bye]), +) + +--- +#table( + gutter: 3pt, + table.header(table.cell(stroke: red)[Hello]), + table.footer(table.cell(stroke: aqua)[Bye]), +) + +--- +// Footer's top stroke should win when repeated, but lose at the last page. +#set page(height: 10em) +#table( + stroke: green, + table.header(table.cell(stroke: red)[Hello]), + table.cell(stroke: yellow)[Hi], + table.cell(stroke: yellow)[Bye], + table.cell(stroke: yellow)[Ok], + table.footer[Bye], +) + +--- +// Relative lengths +#set page(height: 10em) +#table( + rows: (30%, 30%, auto), + [C], + [C], + table.footer[*A*][*B*], +) + +--- +#grid( + grid.footer(grid.cell(y: 2)[b]), + grid.cell(y: 0)[a], + grid.cell(y: 1)[c], +) + +--- +// Ensure footer properly expands +#grid( + columns: 2, + [a], [], + [b], [], + grid.cell(x: 1, y: 3, rowspan: 4)[b], + grid.cell(y: 2, rowspan: 2)[a], + grid.footer(), + grid.cell(y: 4)[d], + grid.cell(y: 5)[e], + grid.cell(y: 6)[f], +) + +--- +// Error: 2:3-2:19 footer must end at the last row +#grid( + grid.footer([a]), + [b], +) + +--- +// Error: 3:3-3:19 footer must end at the last row +#grid( + columns: 2, + grid.footer([a]), + [b], +) + +--- +// Error: 4:3-4:19 footer would conflict with a cell placed before it at column 1 row 0 +// Hint: 4:3-4:19 try reducing that cell's rowspan or moving the footer +#grid( + columns: 2, + grid.header(), + grid.footer([a]), + grid.cell(x: 1, y: 0, rowspan: 2)[a], +) + +--- +// Error: 4:3-4:19 cannot have more than one footer +#grid( + [a], + grid.footer([a]), + grid.footer([b]), +) + +--- +// Error: 3:3-3:20 cannot use `table.footer` as a grid footer; use `grid.footer` instead +#grid( + [a], + table.footer([a]), +) + +--- +// Error: 3:3-3:19 cannot use `grid.footer` as a table footer; use `table.footer` instead +#table( + [a], + grid.footer([a]), +) + +--- +// Error: 14-28 cannot place a grid footer within another footer or header +#grid.header(grid.footer[a]) + +--- +// Error: 14-29 cannot place a table footer within another footer or header +#grid.header(table.footer[a]) + +--- +// Error: 15-29 cannot place a grid footer within another footer or header +#table.header(grid.footer[a]) + +--- +// Error: 15-30 cannot place a table footer within another footer or header +#table.header(table.footer[a]) + +--- +// Error: 14-28 cannot place a grid footer within another footer or header +#grid.footer(grid.footer[a]) + +--- +// Error: 14-29 cannot place a table footer within another footer or header +#grid.footer(table.footer[a]) + +--- +// Error: 15-29 cannot place a grid footer within another footer or header +#table.footer(grid.footer[a]) + +--- +// Error: 15-30 cannot place a table footer within another footer or header +#table.footer(table.footer[a]) + +--- +// Error: 14-28 cannot place a grid header within another header or footer +#grid.footer(grid.header[a]) + +--- +// Error: 14-29 cannot place a table header within another header or footer +#grid.footer(table.header[a]) + +--- +// Error: 15-29 cannot place a grid header within another header or footer +#table.footer(grid.header[a]) + +--- +// Error: 15-30 cannot place a table header within another header or footer +#table.footer(table.header[a]) diff --git a/tests/typ/layout/grid-footers-2.typ b/tests/typ/layout/grid-footers-2.typ new file mode 100644 index 000000000..df3334349 --- /dev/null +++ b/tests/typ/layout/grid-footers-2.typ @@ -0,0 +1,31 @@ +#set page(height: 17em) +#table( + rows: (auto, 2.5em, auto), + table.header[*Hello*][*World*], + block(width: 2em, height: 10em, fill: red), + table.footer[*Bye*][*World*], +) + +--- +// Rowspan sizing algorithm doesn't do the best job at non-contiguous content +// ATM. +#set page(height: 20em) + +#table( + rows: (auto, 2.5em, 2em, auto, 5em, 2em, 2.5em), + table.header[*Hello*][*World*], + table.cell(rowspan: 3, lorem(20)), + table.footer[*Ok*][*Bye*], +) + +--- +// This should look right +#set page(height: 20em) + +#table( + rows: (auto, 2.5em, 2em, auto), + gutter: 3pt, + table.header[*Hello*][*World*], + table.cell(rowspan: 3, lorem(20)), + table.footer[*Ok*][*Bye*], +) diff --git a/tests/typ/layout/grid-footers-3.typ b/tests/typ/layout/grid-footers-3.typ new file mode 100644 index 000000000..070500f19 --- /dev/null +++ b/tests/typ/layout/grid-footers-3.typ @@ -0,0 +1,44 @@ +// Test lack of space for header + text. +#set page(height: 9em + 2.5em + 1.5em) + +#table( + rows: (auto, 2.5em, auto, auto, 10em, 2.5em, auto), + gutter: 3pt, + table.header[*Hello*][*World*], + table.cell(rowspan: 3, lorem(30)), + table.footer[*Ok*][*Bye*], +) + +--- +// Orphan header prevention test +#set page(height: 13em) +#v(8em) +#grid( + columns: 3, + gutter: 5pt, + grid.header( + [*Mui*], [*A*], grid.cell(rowspan: 2, fill: orange)[*B*], + [*Header*], [*Header* #v(0.1em)], + ), + ..([Test], [Test], [Test]) * 7, + grid.footer( + [*Mui*], [*A*], grid.cell(rowspan: 2, fill: orange)[*B*], + [*Footer*], [*Footer* #v(0.1em)], + ), +) + +--- +// Empty footer should just be a repeated blank row +#set page(height: 8em) +#table( + columns: 4, + align: center + horizon, + table.header(), + ..range(0, 2).map(i => ( + [John \##i], + table.cell(stroke: green)[123], + table.cell(stroke: blue)[456], + [789] + )).flatten(), + table.footer(), +) diff --git a/tests/typ/layout/grid-footers-4.typ b/tests/typ/layout/grid-footers-4.typ new file mode 100644 index 000000000..b6d978e9b --- /dev/null +++ b/tests/typ/layout/grid-footers-4.typ @@ -0,0 +1,42 @@ +// When a footer has a rowspan with an empty row, it should be displayed +// properly +#set page(height: 14em, width: auto) + +#let count = counter("g") +#table( + rows: (auto, 2em, auto, auto), + table.header( + [eeec], + table.cell(rowspan: 2, count.step() + count.display()), + ), + [d], + block(width: 5em, fill: yellow, lorem(7)), + [d], + table.footer( + [eeec], + table.cell(rowspan: 2, count.step() + count.display()), + ) +) +#count.display() + +--- +// Nested table with footer should repeat both footers +#set page(height: 10em, width: auto) +#table( + table( + [a\ b\ c\ d], + table.footer[b], + ), + table.footer[a], +) + +--- +#set page(height: 12em, width: auto) +#table( + [a\ b\ c\ d], + table.footer(table( + [c], + [d], + table.footer[b], + )) +) diff --git a/tests/typ/layout/grid-footers-5.typ b/tests/typ/layout/grid-footers-5.typ new file mode 100644 index 000000000..db2489fd9 --- /dev/null +++ b/tests/typ/layout/grid-footers-5.typ @@ -0,0 +1,28 @@ +// General footer-only tests +#set page(height: 9em) +#table( + columns: 2, + [a], [], + [b], [], + [c], [], + [d], [], + [e], [], + table.footer( + [*Ok*], table.cell(rowspan: 2)[test], + [*Thanks*] + ) +) + +--- +#set page(height: 5em) +#table( + table.footer[a][b][c] +) + +--- +#table(table.footer[a][b][c]) + +#table( + gutter: 3pt, + table.footer[a][b][c] +) diff --git a/tests/typ/layout/grid-headers-1.typ b/tests/typ/layout/grid-headers-1.typ index f1afe70e9..ac9980291 100644 --- a/tests/typ/layout/grid-headers-1.typ +++ b/tests/typ/layout/grid-headers-1.typ @@ -146,17 +146,17 @@ ) --- -// Error: 14-28 cannot place a grid header within another header +// Error: 14-28 cannot place a grid header within another header or footer #grid.header(grid.header[a]) --- -// Error: 14-29 cannot place a table header within another header +// Error: 14-29 cannot place a table header within another header or footer #grid.header(table.header[a]) --- -// Error: 15-29 cannot place a grid header within another header +// Error: 15-29 cannot place a grid header within another header or footer #table.header(grid.header[a]) --- -// Error: 15-30 cannot place a table header within another header +// Error: 15-30 cannot place a table header within another header or footer #table.header(table.header[a])