tweenr/0000755000176200001440000000000014305577002011561 5ustar liggesuserstweenr/NAMESPACE0000644000176200001440000000473114277360441013012 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method(convert_generator,along_generator) S3method(convert_generator,component_generator) S3method(convert_generator,default) S3method(convert_generator,keyframe_generator) S3method(get_frame,along_generator) S3method(get_frame,component_generator) S3method(get_frame,keyframe_generator) S3method(get_raw_frames,along_generator) S3method(get_raw_frames,component_generator) S3method(get_raw_frames,keyframe_generator) S3method(vec_tween_class,Date) S3method(vec_tween_class,POSIXt) S3method(vec_tween_class,character) S3method(vec_tween_class,default) S3method(vec_tween_class,factor) S3method(vec_tween_class,list) S3method(vec_tween_class,logical) S3method(vec_tween_class,numeric) export("%>%") export("col_types<-") export("ease_type<-") export("frame_times<-") export("gen_data<-") export("generator_settings<-") export("keyframes<-") export(.complete_states) export(.get_first_frame) export(.get_last_frame) export(.has_frames) export(.max_id) export(.with_later_frames) export(.with_prior_frames) export(PHASE_LEVELS) export(add_keyframe) export(add_pause) export(close_state) export(col_classes) export(col_types) export(data_frame_to_gen) export(display_ease) export(ease_type) export(frame_times) export(gen_along) export(gen_at) export(gen_components) export(gen_data) export(gen_events) export(gen_keyframe) export(gen_to_data_frame) export(generator_settings) export(get_frame) export(get_raw_frames) export(interpolate_custom_at) export(is_generator) export(keep_state) export(keyframes) export(open_state) export(prepare_keyframes) export(tween) export(tween_along) export(tween_appear) export(tween_at) export(tween_color) export(tween_color_t) export(tween_colour) export(tween_colour_t) export(tween_components) export(tween_constant) export(tween_constant_t) export(tween_date) export(tween_date_t) export(tween_datetime) export(tween_datetime_t) export(tween_elements) export(tween_events) export(tween_fill) export(tween_numeric) export(tween_numeric_t) export(tween_state) export(tween_states) export(tween_t) export(vec_tween_class) importFrom(farver,decode_colour) importFrom(farver,encode_colour) importFrom(graphics,plot) importFrom(magrittr,"%>%") importFrom(rlang,"%||%") importFrom(rlang,as_function) importFrom(rlang,enquo) importFrom(rlang,eval_tidy) importFrom(rlang,is_integerish) importFrom(rlang,quo_is_missing) importFrom(rlang,quo_is_null) importFrom(vctrs,vec_cbind) importFrom(vctrs,vec_rbind) useDynLib(tweenr, .registration = TRUE) tweenr/LICENSE0000644000176200001440000000006113252477477012602 0ustar liggesusersYEAR: 2018 COPYRIGHT HOLDER: Thomas Lin Pedersen tweenr/README.md0000644000176200001440000001033314276677320013053 0ustar liggesusers # tweenr [![R-CMD-check](https://github.com/thomasp85/tweenr/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/thomasp85/tweenr/actions/workflows/R-CMD-check.yaml) [![CRAN_Release_Badge](http://www.r-pkg.org/badges/version-ago/tweenr)](https://CRAN.R-project.org/package=tweenr) [![CRAN_Download_Badge](http://cranlogs.r-pkg.org/badges/tweenr)](https://CRAN.R-project.org/package=tweenr) ## What is this? `tweenr` is a package for interpolating data, mainly for animations. It provides a range of functions that take data of different forms and calculate intermediary values. It supports all atomic vector types along with `factor`, `Date`, `POSIXct`, characters representing colours, and `list`. `tweenr` is used extensibly by [`gganimate`](https://github.com/thomasp85/gganimate) to create smooth animations, but can also be used by itself to prepare data for animation in another framework. ## How do I get it? `tweenr` is available on CRAN and can be installed with `install.packages('tweenr')`. In order to get the development version you can install it from github with `devtools` ``` r #install.packages('devtools') devtools::install_github('thomasp85/tweenr') ``` ## An example Following is an example of using the pipeable `tween_state()` function with our belowed iris data: ``` r library(tweenr) library(ggplot2) # Prepare the data with some extra columns iris$col <- c('firebrick', 'forestgreen', 'steelblue')[as.integer(iris$Species)] iris$size <- 4 iris$alpha <- 1 iris <- split(iris, iris$Species) # Here comes tweenr iris_tween <- iris$setosa %>% tween_state(iris$versicolor, ease = 'cubic-in-out', nframes = 30) %>% keep_state(10) %>% tween_state(iris$virginica, ease = 'elastic-out', nframes = 30) %>% keep_state(10) %>% tween_state(iris$setosa, ease = 'quadratic-in', nframes = 30) %>% keep_state(10) # Animate it to show the effect p_base <- ggplot() + geom_point(aes(x = Petal.Length, y = Petal.Width, alpha = alpha, colour = col, size = size)) + scale_colour_identity() + scale_alpha_identity() + scale_size_identity() + coord_cartesian(xlim = range(iris_tween$Petal.Length), ylim = range(iris_tween$Petal.Width)) iris_tween <- split(iris_tween, iris_tween$.frame) for (d in iris_tween) { p <- p_base %+% d plot(p) } ``` ![](man/figures/README-unnamed-chunk-3.gif) ## Other functions Besides the `tween_state()`/`keep_state()` combo showcased above, there are a slew of other functions meant for data in different formats **`tween_components`** takes a single data.frame, a vector of ids identifying recurrent elements, and a vector of timepoints for each row and interpolate each element between its specified time points. **`tween_events`** takes a single data.frame where each row encodes a single unique event, along with a start, and end time and expands the data across a given number of frames. **`tween_along`** takes a single data.frame along with an id and timepoint vector and calculate evenly spaced intermediary values with the possibility of keeping old values at each frame. **`tween_at`** takes two data.frames or vectors along with a numeric vector giving the interpolation point between the two data.frames to calculate. **`tween_fill`** fills missing values in a vector or data.frame by interpolating between previous and next non-missing elements ## Easing In order to get smooth transitions you’d often want a non-linear interpolation. This can be achieved by using an easing function to translate the equidistant interpolation points into new ones. `tweenr` has support for a wide range of different easing functions, all of which can be previewed using `display_ease()` as here where the popular *cubic-in-out* is shown: ``` r tweenr::display_ease('cubic-in-out') ``` ![](man/figures/README-unnamed-chunk-4-1.png) ## Spatial interpolations The purpose of `tweenr` is to interpolate values independently. If paths and polygons needs to be transitioned the [`transformr`](https://github.com/thomasp85/transformr) package should be used as it expands tweenr into the spatial realm tweenr/man/0000755000176200001440000000000014276701255012342 5ustar liggesuserstweenr/man/tween.Rd0000644000176200001440000001120414067576055013757 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween.R, R/tween_colour.R, R/tween_constant.R, % R/tween_date.R, R/tween_datetime.R, R/tween_numeric.R \name{tween} \alias{tween} \alias{tween_t} \alias{tween_colour} \alias{tween_color} \alias{tween_colour_t} \alias{tween_color_t} \alias{tween_constant} \alias{tween_constant_t} \alias{tween_date} \alias{tween_date_t} \alias{tween_datetime} \alias{tween_datetime_t} \alias{tween_numeric} \alias{tween_numeric_t} \title{Create simple tweens} \usage{ tween(data, n, ease = "linear") tween_t(data, n, ease = "linear") tween_colour(data, n, ease = "linear") tween_color(data, n, ease = "linear") tween_colour_t(data, n, ease = "linear") tween_color_t(data, n, ease = "linear") tween_constant(data, n, ease = "linear") tween_constant_t(data, n, ease = "linear") tween_date(data, n, ease = "linear") tween_date_t(data, n, ease = "linear") tween_datetime(data, n, ease = "linear") tween_datetime_t(data, n, ease = "linear") tween_numeric(data, n, ease = "linear") tween_numeric_t(data, n, ease = "linear") } \arguments{ \item{data}{A list of vectors or a single vector. In the standard functions each element in the list must be of equal length; for the *_t functions lengths can differ. If a single vector is used it will be eqivalent to using \code{as.list(data)} for the standard functions and \code{list(data)} for the *_t functions.} \item{n}{The number of elements per transition or tween. See details} \item{ease}{The easing function to use for each transition or tween. See details. Defaults to \code{'linear'}} } \value{ A list with an element for each tween. That means that the length of the return is equal to the length of the elements in \code{data} for the standard functions and equal to the length of \code{data} for the *_t functions. } \description{ This set of functions can be used to interpolate between single data types, i.e. data not part of data.frames but stored in vectors. All functions come in two flavours: the standard and a *_t version. The standard reads the data as a list of states, each tween matched element-wise from state to state. The *_t version uses the transposed representation where each element is a vector of states. The standard approach can be used when each tween has the same number of states and you want to control the number of point in each state transition. The latter is useful when each tween consists of different numbers of states and/or you want to specify the total number of points for each tween. } \details{ \code{tween} and \code{tween_t} are wrappers around the other functions that tries to guess the type of input data and choose the appropriate tween function. Unless you have data that could be understood as a colour but is in fact a character vector it should be safe to use these wrappers. It is probably safer and more verbose to use the explicit functions within package code as they circumvent the type inference and checks whether the input data matches the tween function. \code{tween_numeric} will provide a linear interpolation between the points based on the sequence returned by the easing function. \code{tween_date} and \code{tween_datetime} converts to numeric, produces the tweening, and converts back again. \code{tween_colour} converts colours into Lab and does the interpolation there, converting back to sRGB after the tweening is done. \code{tween_constant} is a catchall that converts the input into character and interpolates by switching between states halfway through the transition. The meaning of the \code{n} and \code{ease} arguments differs somewhat between the standard and *_t versions of the functions. In the standard function \code{n} and \code{ease} refers to the length and easing function of each transition, being recycled if necessary to \code{length(data) - 1}. In the *_t functions \code{n} and \code{ease} refers to the total length of each tween and the easing function to be applied to all transition for each tween. The will both be recycled to \code{length(data)}. } \section{Difference Between \code{tween_numeric} and \code{approx()}}{ \code{tween_numeric} (and \code{tween_numeric_t}) is superficially equivalent to \code{\link[stats:approxfun]{stats::approx()}}, but there are differences. \code{\link[stats:approxfun]{stats::approx()}} will create evenly spaced points, at the expense of not including the actual points in the input, while the reverse is true for \code{tween_numeric}. Apart from that \code{tween_numeric} of course supports easing functions and is vectorized. } \examples{ tween_numeric(list(1:3, 10:8, c(20, 60, 30)), 10) tween_colour_t(list(colours()[1:4], colours()[1:2], colours()[25:100]), 100) } tweenr/man/tween_states.Rd0000644000176200001440000000347614067576055015356 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween_states.R \name{tween_states} \alias{tween_states} \title{Tween a list of data.frames representing states} \usage{ tween_states(data, tweenlength, statelength, ease, nframes) } \arguments{ \item{data}{A list of data.frames. Each data.frame must contain the same number of rows, but only the first data.frame needs to contain all columns. Subsequent data.frames need only contain the columns that shows change.} \item{tweenlength}{The lengths of the transitions between each state.} \item{statelength}{The length of the pause at each state.} \item{ease}{The easing functions to use for the transitions. See details.} \item{nframes}{The number of frames to generate. The actual number of frames might end up being higher depending on the regularity of \code{tweenlength} and \code{statelength}.} } \value{ A data.frame with the same columns as the first data.frame in \code{data}, but replicated \code{nframes} times. An additional column called \code{.frame} will be added giving the frame number. } \description{ This function is intended to create smooth transitions between states of data. States are defined as full data.frames or data.frames containing only the columns with change. Each state can have a defined period of pause, the transition length between each states can be defined as well as the easing function. } \examples{ data1 <- data.frame( x = 1:20, y = 0, colour = 'forestgreen', stringsAsFactors = FALSE ) data2 <- data1 data2$x <- 20:1 data2$y <- 1 data <- tween_states(list(data1, data2), 3, 1, 'cubic-in-out', 100) } \seealso{ Other data.frame tween: \code{\link{tween_along}()}, \code{\link{tween_appear}()}, \code{\link{tween_components}()}, \code{\link{tween_elements}()}, \code{\link{tween_events}()} } \concept{data.frame tween} tweenr/man/dot-max_id.Rd0000644000176200001440000000073414067576055014670 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween_state.R \name{.max_id} \alias{.max_id} \title{Get the highest id occuring in a dataset} \usage{ .max_id(data) } \arguments{ \item{data}{A data.frame as returned by \code{tween_state}} } \value{ An integer giving the currently highest id } \description{ This is helper for \code{tween_state} related functions to get the currently highest \code{.id} in a frame collection } \keyword{internal} tweenr/man/tween_appear.Rd0000644000176200001440000000327614067576055015321 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween_appear.R \name{tween_appear} \alias{tween_appear} \title{Tween a data.frame of appearances} \usage{ tween_appear(data, time, timerange, nframes) } \arguments{ \item{data}{A data.frame to tween} \item{time}{The name of the column that holds the time dimension. This does not need to hold time data in the strictest sence - any numerical type will do} \item{timerange}{The range of time to create the tween for. If missing it will defaults to the range of the time column} \item{nframes}{The number of frames to create for the tween. If missing it will create a frame for each full unit in \code{timerange} (e.g. \code{timerange = c(1, 10)} will give \code{nframes = 10})} } \value{ A data.frame as \code{data} but repeated \code{nframes} times and with the additional columns \code{.age} and \code{.frame} } \description{ This function is intended for use when you have a data.frame of events at different time points. This could be the appearance of an observation for example. This function replicates your data \code{nframes} times and calculates the duration of each frame. At each frame each row is assigned an age based on the progression of frames and the entry point of in time for that row. A negative age means that the row has not appeared yet. } \examples{ data <- data.frame( x = rnorm(100), y = rnorm(100), time = sample(50, 100, replace = TRUE) ) data <- tween_appear(data, 'time', nframes = 200) } \seealso{ Other data.frame tween: \code{\link{tween_along}()}, \code{\link{tween_components}()}, \code{\link{tween_elements}()}, \code{\link{tween_events}()}, \code{\link{tween_states}()} } \concept{data.frame tween} tweenr/man/gen_events.Rd0000644000176200001440000000501614276677372015004 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/gen_events.R \name{gen_events} \alias{gen_events} \title{Generator for tweening the appearance of elements} \usage{ gen_events( .data, ease, start, end = NULL, range = NULL, enter = NULL, exit = NULL, enter_length = 0, exit_length = 0 ) } \arguments{ \item{.data}{A data.frame with components at different stages} \item{ease}{The easing function to use. Either a single string or one for each column in the data set.} \item{start, end}{The start (and potential end) of the event encoded in the row, as unquoted expressions. Will be evaluated in the context of \code{.data} so can refer to columns in it. If \code{end = NULL} the event will be without extend and only visible in a single frame, unless \code{enter} and/or \code{exit} is given.} \item{range}{The range of time points to include in the tween. If \code{NULL} it will use the range of \code{time}} \item{enter, exit}{functions that calculate a start state for new observations that appear in \code{to} or an end state for observations that are not present in \code{to}. If \code{NULL} the new/old observations will not be part of the tween. The function gets a data.frame with either the start state of the exiting observations, or the end state of the entering observations and must return a modified version of that data.frame. See the \emph{Match, Enter, and Exit} section for more information.} \item{enter_length, exit_length}{The lenght of the opening and closing transitions if \code{enter} and/or \code{exit} is given. Measured in the same units as \code{time}} } \value{ A \code{component_generator} object } \description{ This is a generator version of \code{\link[=tween_events]{tween_events()}}. It returns a generator that can be used with \code{\link[=get_frame]{get_frame()}} and \code{\link[=get_raw_frames]{get_raw_frames()}} to extract frames for a specific time point scaled between 0 and 1. } \examples{ d <- data.frame( x = runif(20), y = runif(20), time = runif(20), duration = runif(20, max = 0.1) ) from_left <- function(x) { x$x <- -0.5 x } to_right <- function(x) { x$x <- 1.5 x } gen <- gen_events(d, 'cubic-in-out', start = time, end = time + duration, enter = from_left, exit = to_right, enter_length = 0.1, exit_length = 0.05) get_frame(gen, 0.65) } \seealso{ Other Other generators: \code{\link{gen_along}()}, \code{\link{gen_at}()}, \code{\link{gen_components}()}, \code{\link{gen_keyframe}()} } \concept{Other generators} tweenr/man/tween_components.Rd0000644000176200001440000000601614276677372016237 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween_components.R \name{tween_components} \alias{tween_components} \title{Interpolate individual component} \usage{ tween_components( .data, ease, nframes, time, id = NULL, range = NULL, enter = NULL, exit = NULL, enter_length = 0, exit_length = 0 ) } \arguments{ \item{.data}{A data.frame with components at different stages} \item{ease}{The easing function to use. Either a single string or one for each column in the data set.} \item{nframes}{The number of frames to calculate for the tween} \item{time}{An unquoted expression giving the timepoint for the different stages of the components. Will be evaluated in the context of \code{.data} so can refer to a column from that} \item{id}{An unquoted expression giving the component id for each row. Will be evaluated in the context of \code{.data} so can refer to a column from that} \item{range}{The range of time points to include in the tween. If \code{NULL} it will use the range of \code{time}} \item{enter, exit}{functions that calculate a start state for new observations that appear in \code{to} or an end state for observations that are not present in \code{to}. If \code{NULL} the new/old observations will not be part of the tween. The function gets a data.frame with either the start state of the exiting observations, or the end state of the entering observations and must return a modified version of that data.frame. See the \emph{Match, Enter, and Exit} section for more information.} \item{enter_length, exit_length}{The lenght of the opening and closing transitions if \code{enter} and/or \code{exit} is given. Measured in the same units as \code{time}} } \value{ A data.frame with the same columns as \code{.data} along with \code{.id} giving the component id, \code{.phase} giving the state of each component in each frame, and \code{.frame} giving the frame membership of each row. } \description{ This function is much like \code{\link[=tween_elements]{tween_elements()}} but with a slightly different syntax and support for many of the newer features such as enter/exits and tween phase identification. Furthermore it uses tidy evaluation for time and id, making it easier to change these on the fly. The biggest change in terms of functionality compared to \code{tween_elements()} is that the easing function is now given per column and not per row. If different easing functions are needed for each transition then \code{tween_elements()} is needed. } \examples{ from_zero <- function(x) {x$x <- 0; x} data <- data.frame( x = c(1, 2, 2, 1, 2, 2), y = c(1, 2, 2, 2, 1, 1), time = c(1, 4, 10, 4, 8, 10), id = c(1, 1, 1, 2, 2, 2) ) data <- tween_components(data, 'cubic-in-out', nframes = 100, time = time, id = id, enter = from_zero, enter_length = 4) } \seealso{ Other data.frame tween: \code{\link{tween_along}()}, \code{\link{tween_appear}()}, \code{\link{tween_elements}()}, \code{\link{tween_events}()}, \code{\link{tween_states}()} } \concept{data.frame tween} tweenr/man/dot-get_last_frame.Rd0000644000176200001440000000144714067576055016405 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween_state.R \name{.get_last_frame} \alias{.get_last_frame} \alias{.get_first_frame} \alias{.with_prior_frames} \alias{.with_later_frames} \alias{.has_frames} \title{Helpers for working with tweened data} \usage{ .get_last_frame(data) .get_first_frame(data) .with_prior_frames(prior, new_tween, nframes) .with_later_frames(later, new_tween, nframes) .has_frames(data) } \arguments{ \item{data, prior, later}{A data.frame. If a \code{.frame} column exists it will be interpreted as a data.frame containing multiple states} \item{new_tween}{The result of a tweening} } \value{ A data.frame } \description{ These are internal helpers for extracting and inserting data into a data.frame of tweened states. } \keyword{internal} tweenr/man/interpolate_custom_at.Rd0000644000176200001440000000073514276701255017242 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/gen_keyframe.R \name{interpolate_custom_at} \alias{interpolate_custom_at} \title{Fallback for keyframe vector support} \usage{ interpolate_custom_at(from, to, at, ease) } \arguments{ \item{from, to}{vectors to interpolate between} \item{at}{value between 0 and 1 defining the point} \item{ease}{the easing function to use} } \description{ Fallback for keyframe vector support } \keyword{internal} tweenr/man/tween_events.Rd0000644000176200001440000000547114276677372015362 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween_events.R \name{tween_events} \alias{tween_events} \title{Transition in and out of events} \usage{ tween_events( .data, ease, nframes, start, end = NULL, range = NULL, enter = NULL, exit = NULL, enter_length = 0, exit_length = 0 ) } \arguments{ \item{.data}{A data.frame with components at different stages} \item{ease}{The easing function to use. Either a single string or one for each column in the data set.} \item{nframes}{The number of frames to calculate for the tween} \item{start, end}{The start (and potential end) of the event encoded in the row, as unquoted expressions. Will be evaluated in the context of \code{.data} so can refer to columns in it. If \code{end = NULL} the event will be without extend and only visible in a single frame, unless \code{enter} and/or \code{exit} is given.} \item{range}{The range of time points to include in the tween. If \code{NULL} it will use the range of \code{time}} \item{enter, exit}{functions that calculate a start state for new observations that appear in \code{to} or an end state for observations that are not present in \code{to}. If \code{NULL} the new/old observations will not be part of the tween. The function gets a data.frame with either the start state of the exiting observations, or the end state of the entering observations and must return a modified version of that data.frame. See the \emph{Match, Enter, and Exit} section for more information.} \item{enter_length, exit_length}{The lenght of the opening and closing transitions if \code{enter} and/or \code{exit} is given. Measured in the same units as \code{time}} } \value{ A data.frame with the same columns as \code{.data} along with \code{.id} giving the component id, \code{.phase} giving the state of each component in each frame, and \code{.frame} giving the frame membership of each row. } \description{ This tweening function is a more powerful version of \code{\link[=tween_appear]{tween_appear()}}, with support for newer features such as enter/exits and tween phase identification. The tweener treats each row in the data as unique events in time, and creates frames with the correct events present at any given time. } \examples{ d <- data.frame( x = runif(20), y = runif(20), time = runif(20), duration = runif(20, max = 0.1) ) from_left <- function(x) { x$x <- -0.5 x } to_right <- function(x) { x$x <- 1.5 x } tween_events(d, 'cubic-in-out', 50, start = time, end = time + duration, enter = from_left, exit = to_right, enter_length = 0.1, exit_length = 0.05) } \seealso{ Other data.frame tween: \code{\link{tween_along}()}, \code{\link{tween_appear}()}, \code{\link{tween_components}()}, \code{\link{tween_elements}()}, \code{\link{tween_states}()} } \concept{data.frame tween} tweenr/man/tweenr-package.Rd0000644000176200001440000000336114276677372015545 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tweenr_package.R \docType{package} \name{tweenr-package} \alias{tweenr} \alias{tweenr-package} \title{tweenr: Interpolate Data for Smooth Animations} \description{ \if{html}{\figure{logo.png}{options: style='float: right' alt='logo' width='120'}} In order to create smooth animation between states of data, tweening is necessary. This package provides a range of functions for creating tweened data that can be used as basis for animation. Furthermore it adds a number of vectorized interpolaters for common R data types such as numeric, date and colour. } \details{ tweenr is a small collection of functions to help you in creating intermediary representations of your data, i.e. interpolating states of data. As such it's a great match for packages such as animate and gganimate, since it can work directly with data.frames of data, but it also provide fast and efficient interpolaters for numeric, date, datetime and colour that are vectorized and thus more efficient to use than the build in interpolation functions (mainly \code{\link[stats:approxfun]{stats::approx()}} and \code{\link[grDevices:colorRamp]{grDevices::colorRamp()}}). The main functions for data.frames are \code{\link[=tween_states]{tween_states()}}, \code{\link[=tween_elements]{tween_elements()}} and \code{\link[=tween_appear]{tween_appear()}}, while the standard interpolaters can be found at \code{\link[=tween]{tween()}} } \seealso{ Useful links: \itemize{ \item \url{https://github.com/thomasp85/tweenr} \item Report bugs at \url{https://github.com/thomasp85/tweenr/issues} } } \author{ \strong{Maintainer}: Thomas Lin Pedersen \email{thomasp85@gmail.com} (\href{https://orcid.org/0000-0002-5147-4711}{ORCID}) } tweenr/man/gen_internal.Rd0000644000176200001440000000211714106445702015271 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/aaa.R, R/gen.R, R/gen_keyframe.R \docType{data} \name{col_classes} \alias{col_classes} \alias{gen_internal} \alias{PHASE_LEVELS} \alias{is_generator} \alias{generator_settings} \alias{generator_settings<-} \alias{ease_type} \alias{ease_type<-} \alias{col_types} \alias{col_types<-} \alias{gen_data} \alias{gen_data<-} \alias{gen_to_data_frame} \alias{data_frame_to_gen} \alias{keyframes} \alias{keyframes<-} \alias{frame_times} \alias{frame_times<-} \title{Generator internals} \format{ An object of class \code{character} of length 5. } \usage{ col_classes(data) PHASE_LEVELS is_generator(x) generator_settings(x) generator_settings(x) <- value ease_type(x) ease_type(x) <- value col_types(x) col_types(x) <- value gen_data(x) gen_data(x) <- value gen_to_data_frame(...) data_frame_to_gen(x) keyframes(x) keyframes(x) <- value frame_times(x) frame_times(x) <- value } \arguments{ \item{x}{A generator object} } \value{ Various data } \description{ Generator internals } \keyword{datasets} \keyword{internal} tweenr/man/dot-complete_states.Rd0000644000176200001440000000154514067576055016623 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween_state.R \name{.complete_states} \alias{.complete_states} \title{Fill in missing rows using enter and exit functions} \usage{ .complete_states(from, to, id, enter, exit, max_id) } \arguments{ \item{from, to}{Data.frames to tween between} \item{id}{The name of the column that holds the matching id} \item{enter, exit}{functions to fill out missing rows in \code{from} and \code{to} respectively} } \value{ A list with the elements \code{from} and \code{to} holding the filled out versions of \code{from} and \code{to} } \description{ This function figures out which rows are missing in either state and applies the provided \code{enter} and \code{exit} functions to fill in the blanks and provide a 1-to-1 relation between the rows in \code{from} and \code{to}. } \keyword{internal} tweenr/man/tween_fill.Rd0000644000176200001440000000152714067576055014774 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween_fill.R \name{tween_fill} \alias{tween_fill} \title{Fill out missing values by interpolation} \usage{ tween_fill(data, ease) } \arguments{ \item{data}{A data.frame or vector.} \item{ease}{A character vector giving valid easing functions. Recycled to match the ncol of \code{data}} } \value{ If \code{data} is a data.frame then a data.frame with the same columns. If \code{data} is a vector then a vector. } \description{ This tween fills out \code{NA} elements (or \code{NULL} elements if \code{data} is a list) by interpolating between the prior and next non-missing values. } \examples{ # Single vector tween_fill(c(1, NA, NA, NA, NA, NA, 2, 6, NA, NA, NA, -2), 'cubic-in-out') # Data frame tween_fill(mtcars[c(1, NA, NA, NA, NA, 4, NA, NA, NA, 10), ], 'cubic-in') } tweenr/man/tween_along.Rd0000644000176200001440000000363214067576055015145 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween_along.R \name{tween_along} \alias{tween_along} \title{Interpolate data along a given dimension} \usage{ tween_along( .data, ease, nframes, along, id = NULL, range = NULL, history = TRUE, keep_last = FALSE ) } \arguments{ \item{.data}{A data.frame with components at different stages} \item{ease}{The easing function to use. Either a single string or one for each column in the data set.} \item{nframes}{The number of frames to calculate for the tween} \item{along}{The "time" point for each row} \item{id}{An unquoted expression giving the component id for each row. Will be evaluated in the context of \code{.data} so can refer to a column from that} \item{range}{The range of time points to include in the tween. If \code{NULL} it will use the range of \code{time}} \item{history}{Should earlier datapoints be kept in subsequent frames} \item{keep_last}{Should the last point of each id be kept beyond its time} } \value{ A data.frame with the same columns as \code{.data} along with \code{.id} giving the component id, \code{.phase} giving the state of each component in each frame, and \code{.frame} giving the frame membership of each row. } \description{ This tween takes groups of rows along with the time for each row and calculates the exact value at each at each frame. Further it allows for keeping the subsequent raw data from previous frame as well as letting the final row linger beyond its time. It especially useful for data that should be visualised as lines that are drawn along the x-axis, but can of course also be used for other dimensions as well (even dimensions not corresponding to any axis). } \seealso{ Other data.frame tween: \code{\link{tween_appear}()}, \code{\link{tween_components}()}, \code{\link{tween_elements}()}, \code{\link{tween_events}()}, \code{\link{tween_states}()} } \concept{data.frame tween} tweenr/man/gen_at.Rd0000644000176200001440000000351014276677372014101 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/gen_at.R \name{gen_at} \alias{gen_at} \title{Generator for interpolating between two data frames} \usage{ gen_at(from, to, ease, id = NULL, enter = NULL, exit = NULL) } \arguments{ \item{from, to}{A data.frame or vector of the same type. If either is of length/nrow 1 it will get repeated to match the length of the other} \item{ease}{A character vector giving valid easing functions. Recycled to match the ncol of \code{from}} \item{id}{The column to match observations on. If \code{NULL} observations will be matched by position. See the \emph{Match, Enter, and Exit} section for more information.} \item{enter, exit}{functions that calculate a start state for new observations that appear in \code{to} or an end state for observations that are not present in \code{to}. If \code{NULL} the new/old observations will not be part of the tween. The function gets a data.frame with either the start state of the exiting observations, or the end state of the entering observations and must return a modified version of that data.frame. See the \emph{Match, Enter, and Exit} section for more information.} } \value{ A \code{keyframe_generator} object } \description{ This is a generator version of \code{\link[=tween_at]{tween_at()}} with the additional functionality of supporting enter and exit functions. It returns a generator that can be used with \code{\link[=get_frame]{get_frame()}} and \code{\link[=get_raw_frames]{get_raw_frames()}} to extract frames for a specific time point scaled between 0 and 1. } \examples{ gen <- gen_at(mtcars[1:6, ], mtcars[6:1, ], 'cubic-in-out') get_frame(gen, 0.3) } \seealso{ Other Other generators: \code{\link{gen_along}()}, \code{\link{gen_components}()}, \code{\link{gen_events}()}, \code{\link{gen_keyframe}()} } \concept{Other generators} tweenr/man/gen_keyframe.Rd0000644000176200001440000000526014276677372015304 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/gen_keyframe.R \name{gen_keyframe} \alias{gen_keyframe} \alias{add_pause} \alias{add_keyframe} \title{Generator for keyframe based tweening} \usage{ gen_keyframe(keyframe = NULL, pause = 0) add_pause(.data, pause = 0) add_keyframe( .data, keyframe, ease, length, id = NULL, enter = NULL, exit = NULL ) } \arguments{ \item{keyframe}{A data frame to use as a keyframe state} \item{pause}{The length of the pause at the current keyframe} \item{.data}{A data.frame to start from. If \code{.data} is the result of a prior tween, only the last frame will be used for the tween. The new tween will then be added to the prior tween} \item{ease}{The easing function to use. Either a single string or one for each column in the data set.} \item{length}{The length of the transition} \item{id}{The column to match observations on. If \code{NULL} observations will be matched by position. See the \emph{Match, Enter, and Exit} section for more information.} \item{enter, exit}{functions that calculate a start state for new observations that appear in \code{to} or an end state for observations that are not present in \code{to}. If \code{NULL} the new/old observations will not be part of the tween. The function gets a data.frame with either the start state of the exiting observations, or the end state of the entering observations and must return a modified version of that data.frame. See the \emph{Match, Enter, and Exit} section for more information.} } \value{ A \code{keyframe_generator} object } \description{ This is a generator version of \code{\link[=tween_state]{tween_state()}} and its utility functions. It returns a generator that can be used with \code{\link[=get_frame]{get_frame()}} and \code{\link[=get_raw_frames]{get_raw_frames()}} to extract frames for a specific time point scaled between 0 and 1. } \examples{ df1 <- data.frame( country = c('Denmark', 'Sweden', 'Norway'), population = c(5e6, 10e6, 3.5e6) ) df2 <- data.frame( country = c('Denmark', 'Sweden', 'Norway', 'Finland'), population = c(6e6, 10.5e6, 4e6, 3e6) ) df3 <- data.frame( country = c('Denmark', 'Norway'), population = c(10e6, 6e6) ) to_zero <- function(x) { x$population <- 0 x } gen <- gen_keyframe(df1, 10) \%>\% add_keyframe(df2, 'cubic-in-out', 35, id = country, enter = to_zero) \%>\% add_pause(10) \%>\% add_keyframe(df3, 'cubic-in-out', 35, id = country, enter = to_zero, exit = to_zero) \%>\% add_pause(10) get_frame(gen, 0.25) } \seealso{ Other Other generators: \code{\link{gen_along}()}, \code{\link{gen_at}()}, \code{\link{gen_components}()}, \code{\link{gen_events}()} } \concept{Other generators} tweenr/man/figures/0000755000176200001440000000000014276677320014013 5ustar liggesuserstweenr/man/figures/logo.png0000644000176200001440000006324714067576055015476 0ustar liggesusersPNG  IHDRyXiCCPsRGB IEC61966-2.1(uKBA?jabP$]@B >jAנ үCu :AQt\ԥ5O%rwgYJAoAXҢ!\|m EWG#0 ^nZTZW"pa d8%(&kLtkǮd[US=v~ozJ'r}{{|ڽ3.ii~"/!xcڷ'7H[FûqصM{Y_-OKv}vX궫E"}_-]\xL. !wh0#R<kK|p)Ϯ ƶ0 'ӏV'ڟ{GN%;z8hT EUyi+/I?~8ш@OHM:ygsϽQm=/Ci9WySZ_~[޴_x>s>?^}-o Á}ɑm?2 g}>? N;_}S{N/,n|}pxUH𗟼әǎto'r8q*ص|瞓)˿;%{=b,ɑCJdJ3b8"$S*RӅ ۻz~ߕ?o}]687=ǧFHrh{ 3糜|+WU;ڟd|,мӅ'Ϥ9u6CDL}≵xXNJ~3SsJvM>k"ֽ,O_%}~$ $'-+uNIslť|^we1b1dRm}vR~¥C|':s,fx0#SGdU"%.^.{#!OO7 3粜B O1q`Fg2xx}+$xL%wG杖+\Uؿ' ox0Lvl?}a?L||txM n{>YX쌙^Ub8ض5J8̏\#+زDK2{FWPdr ϫ^>( \mؑ>ge\-~b* pPl}d[IxCS있"_8y&3iVx>W&PIƼ$MƼCl!W֔d ڳv{0wރ,/Vħ/u4 e[CxɕgoiB?%{=b<~Lxנ&f,Ap3JwKj* T(iskvb6ٜ25E 23Qxص#JK:ekC-c-T-mOg.ӀHw%+{wrH\(ߚӟTsh TĢk KyNNsZ9"aCJUNYJ\T֟,{}ny  5_+c͘pzx|?}z;|󎭣/>XOO\"8/Iz׋>anJ0!kfq/,֌ jTku[(])om^~EFC{&طm̥S7?w\wO٣u.:5ul]K256mcݼ;PWT{s >JPdC.i6!fs0l4ݦ01͵'li8O o=P6AnÃA2+ 箶ܜtc{x۷aӴ9~2}Lc)QRޏ~m0MΕ.>yqRV%Voezw0 #xy[#!LsJ-aB|MaaYF. wrɼ_p0lsWn~ail wkµn?gWҍ~h? ;]w݉* WƷg'9T;ps©[~~Y cr[8շn'RO\"1t _i| qm=\ͽAw})*UW7n FH}/Upѡ,iS3%4~Rx"%4]}n6 T3Y /f =~~GXǗw UQo-*%_`xȅH5+ߟi驷T#=D &~1`Utwxכs yp8{P7v'귦Y\{}G3;a lc,L.nHF"vY\19]py<"' I"K+5fJ󆂞]Ǣ\[֞7 V95/B!R7:Y$ko`Le2$oF0Bl:~2ٜ۷H7ɿo{ˡ=z._m|^0-T|A aO1=S&_hDWwPUmcamk/֎]f~йÒo9%CW3|h4,sZK*XR5g7G^1/I\S/ihù n0V8zǁ㧖)nĖ0AEkSE %m~EEvnӓS+}dYdaLlGw#aD`YպAotaO}* ^6KDz&#CA~=Iptßغ.p_#_x6<J r>ŧX}dqӓn{"'W_XnaXfasExumYoh у X<&+9&O()0Fdr Q/Ar,I%|7 @flǥe \Q5Q"l+y]/k욈ӥ[^/pcxPP72]ٿ>|^>;] G <0sܜY+Oe$Ï/mG^tWш73 E/Xc Iw *|_: (oWm1\+pb#ɒP;(ū9(2 dzlu4"EgˤuWt " pBseY mJyݾsL`#|y>G8q:/d˷y =A&J1;Mo<4KA;n륧C,/VOzHļCؓ| xDMѕqp֍SI?F#Le,I}$c^B!rY'opfqSPA#KH|_&I"Zh͹#a>O]αmԭ_ɑ/jLٙ`fl#eru%hD.|;3U#50ɸU5WjòBACy"x$,n)oUh[膵 n`O rd7sXxS il2K5laf%UpZe8+^:׿=:#m_ͿT7;*Jђ=QkMc9r U[ut'Ik}AN78qfÑD sfD GmfPo+:$қ1D)T6Ͱ6Ňh+9vٷ3ًWޞzx-rf 7 ɩ"SER C!n۟BmnΕYNپ5JO*t%}gyΓpl|A޶O2/L>#,ݵk9c#Ό+cb<ƅ92M2/zA՚wٻ30W& ,,Uٳ#A2&8A*'8`(ȒbaYH, ,(״1Mr'3?J>Jԥ,Xbt0ľI:'ltN:[ǫJ 7땱,bIgd(ޝqNoO:СY)ߓ Ug.,I)iۻ+e9\j˚oY[4m.^ęeq//D*黥f*zÃkk(kGn;O侞̉1$Ih%\)dswއa؈ L U&_/yevfv.ȉ%|ĝ.,rjbI.Ķ/VCD 𪑎KaG}z%7uG7lL$Ię4/Q( Bp]fVvv7-K5edGo IoWTGRC+7't lt|QY1[ "WhniS(kL͕E-a +TFnV<"} (wg5;OYTh-4b O +Llv|܅'Ϧx:GyZ%oҘH%v|a sRu*"3<$8JHHp^U"RYɺJnwӒ$e(JFf0ΫZH}ģ6. T+4MӎUQ/TG2# { Bed uϖ0L0}g-517 <͹KYLv G80Paf,-Tlf7nXN95!`U3sKwW[I<,ژXhf$ h/AOWK9; %I6֜J-IYֱ,M ֡f3Z7$Qֿ>Up\lz<"Pk+:btNP'Sh+6(5Uj ShNr ""Aw >Lʍ[Ȓ{WrTvX]]f.x)ҶK:?v$fVHWG6ha(kG|Acnޝ \^N Ur2Yh᭒ҥ;Vtne(BS%1/JJ:\b`vbaڤuVru2aSlN>~HP!RUb!w\(H@rFOO$ֺ\lA*%" Н/hJ:[Gq._˓+h؝d$Rݕ *iox(`@kEUrOADe] z8/EMWʓ$q#R(WprU0[nzaʖ0IO-#I"TƷgeю/IgW|ҵgWǁ rq[IԹ4l㈒%4+Vj%MrύOt"iSm>V KH&(y(5lZNn8, Fq6e=њ~|k7=WkfҵkGAp)]5T5OR3M,ZY$_Az,k-7m8fTF& wAUbTr `;n߫HkifEr]57QfRhWDp%f{ݙ`o*LdId%B(Slt<ŕ&{u߃m;-T:\9ex Jq߾I&1:jyU @oM51=;4ɸ_fiΣOMcLA gBa^U"T0MwFjlz>L$ UJUUTխu=RE'w3%~upd:[Y!vD\h2os.dMڰ |kSh_9`處x K.'2uĎmQuo?8Qb$ W;M}\1旪ݤn*Yj)Cl1M#!acke:fi94t7MY$Aа#햢MvgI:JQpCF2|Qñ4E}^t p;Sb6'ΤI%|li;ۥP7Q`TA=fg.kڨu19A$I+T5G:Bcz<"i *:ѐBC{5ZTj5ELv\Zm;覻|Ƈ|LL<&y")Uu!rUG7\dUmExMnΗGʲ؜'.\+/j=Խu[2OXFfJn3eYdxBQ'R,oTkƆNĖ5%w5!ȡ BӲXuMr3 EA5jSf&nB%BK.ϫ0q-Z׭P8lQvJlS 6^Ubq,CݛpcК%FB ҂4j= X[d;O\!s{lmzF7Wr[cb|keƅ+y{XWz5j5xnܸYnɫ>k&Bn*P(k@ K"k7_&U\l҄YexE)5!AbEǴlͅWEA\ 5JlY3"j5C ㆓j \qi.9[fqơ)[vpZiϪ7r7zot\1;17 \֋ky*j\0uLI\HV RpcU, 5"!<;^'U+#5\ vjq7 UZ a텈aK|"R/-AD LB^VihQGYn$ Զ 9eQI:}$Jj%bmPH$^2ن˟ 6n[BIc?At72־b[KWB$A?5 [ZiR?FkǾ XF>6Z7Ԥ0=4<=qe.!CaReWp*8L2PvCRrDv/!5.IW&m(dY\띙/3:"Q[={p1%L$p913cxöOs{{\8s~ 7M{r63W7ZN%3ڤb pdwjg~_w3()>AcBR5A"k9zFuQZ`{bin8F@uR%}wk7Ib]6/A lY嵎xNfKܗ}s|Y,J$ȂGeNR / ^/K~sBYסa$m]wc+6rF[k0@UyÜ^ zv_6"ʭe*XZ&F *c;}%ZDuH4sehTk&qǵLr_nRY<[n@mpMTŲ~MKebIgh š^ $9!_33WX#mfaQM4A`4qlSUR{9²?HW(X]ڃ+yOQ#f&`qN\RB#kڎ1s,rb<AP+;ܿL6 ,Mi3seFCDJk Zi5BΚ;Z}ز2;nIը^hfuW%א* VEze*e-͒M@zqp'C225:`p] nu }AFÌoZJ|MatWLV ]vYFyF"l@X\5)HD5:iñ֬Sޡ̢v4c,M^nFaixmnWgxuvJx G5r$^(2֎WEhlyF~X}eZ3x e,֒1P^,T>q`jc[l XDѱ~T].(ҦmIh&={A8fY:% eH Xa- Ջe;cJaв m Ģ~F$p$_dp)Cw/I &l)W*BbZONHX7JW.A0MY {bs.\N]Ez* .ynqJ_Ǝ&x"͇_d-\Mҗ%]skwEIx$aLfW{Yc)*ekDDҡ UdqqSl զܚE_[Jd/智YbnʁI._oXff˚lft՚G йi\A_w:.HDִd.#I._A= !4+Qxcd\,B8L4:`] Brg[E(tSJ-Dm1%ݥl?/FvKh]#\2  45@mBRHaX8^"D0ņ |!/K>6R$XZ(3>b6i)!kf. K5wr@];8SrnnWKɫ)˛[:ۺqsn43_a8=]~h0Y!G|4T%h։GzŘs},j%\A"%RDDKlx ؠ[ȒGvRV} WEj5c;x\#,JYR,%*K1"# 芟'"6e4A &*TɩL ܚTM鷦iTe׎ш4k׋9&śm:vGϭ]p%GbpPWǴ|AҜ~^W.9Ʊ)t*~qˡUd ^Uj^ꑰmEܟDEh-{dmZ.qGD-$Y[-nҤ#Ю 0$P] (suM~M!ڌx*BHX!|x%ikL[XrK^U4fdh#V nv u3f* 4jM +Ime;\Q`?Ԫ3ဂWTuDQīlqIF8~|KݕE֜!6jfk%E]$" mOze:;)@ւ/M]$sx43_Ft|-vU+ssΜ3KbɶHX@J 8@HH{{KoBPHM[O Ò&%iH!ƛlYk׌F3>;H $Ax$|~}A|G/ Mx p(;4/BШYD9H0=J2 (y^x >rpCSIʄ' C5ӷͬf:y$f&+ 2fp5Ĩdr:&-,~CXqdX$O!rS 8 kP)eaiւyD=c,DH4s%9BVE]W+ZF[EI6_,O)y)XI,^\(hd%p2hBөYĒCTi[J]F<_\NbT #+89S$tryDRErnSH 9#~ÊY3+$-d1+puM5+7WHxI’Mwta+0A`3+Q.X a(Q,ː͕%R1g˄B\F6On J.C.Ohn|iK$|r*>T6%i!J.%"CiSKz-TP1&\䱓kMԖ:: CcrK:Lv+8ATF0Te| IDATRI؟]ZIM#7D(2"S.iT@|,(BCdVȠ٬ CA sNB:5TBYi*SE&XrV3 QOt{ '_vp4CKs qe]$ylYW\ -8^] GsAOΞHt9h,щ TJX i*]? $B$RTT^`Y 9#Qo(LR54%-fgKH&$Ld|4fil߫ݪmVi[9|/q6֝GVH˨X,?Z@*]RZhۛ@Ciai# V:Z RɷF6WDKPSRT\[N r8\%׏0R"Chi!nor@ql&F4AcU0 EDHAAD`v1űDDx 'TD2]@*M%:-YI>T63ae4V\N Z- 6xfr%r,cP @M`F NÑkd~Rknji6:x D8ԺpBlc-Wb+)[J c{Igғ`gs%:$.ha9Qx"%Z[l4*mzur$08ŠZI Z9LzEY^A`AdEOf@RU*hl j K+ fT`M&?7,2դ|ӥ14.v`ۈL kG(ylZj,I*|_Ni+*A`̪$jAiN:MU/Iƶ3d De_ Mz#uP/¢7VFͥ٠D4C(P)Y0 EMijF'""j ryc(2Y*e, J6 8E]fQ"Un>xa²T*Cfqeh /*M]Kcitw%ppyYSy3^:%BCVIrQf1rr9lh+z24֨GguvPycY̹cddOഩ`cEY}i-4P*d𭥰$N r,F I:Jb`jio2U26%Elf%޷,(yhSbs|v/=j",&Sά _|jX0ؿLiW4H_KcQKg J`Z^K39SDM] R _C}V$S방*n^I`r6ϊt]F485(I*/ͥGsv5+ I Zt(Ir%(J: qIu2 N LMyIp`x?l=FLF15(@f {:EQ5!KY"."bxE|y4?ډf^;|}&ڱ^<* YIa'8r\RPk`qGrAVETrr9׏P(q\xc'u఩_Edl,B5 Y{W7`6SUA| ?`o͉tѪC̣Q`G*]ӫhphf@X䭅2(xu%Ka]%]!e(֭~6?o_cY"EA.R)ְHDָģb28^ˡIl!BYuH1huWqIa; &7dD8^/W'Vuغy DJ >mzg'$j(ᖛZp3K:9#-bѓҦ' +ǗZ(#."qbbnj\\ŕg(P!J()R[Tۚ K\1Vku2.J 38u6:C-1>Pz˯{$n Ͽx6 oJ)Aaŗ Ǻ$=͢ğ~f-M{;_lRAQc:=02{%&څmU{>Q~DMĉ18.Fҥ<J%l3EēyDb9i)DbH '*Zg0E zGGWq\}&7qb4 5[+H+լ@_6mgzMׅ7b+_2x2o"V08@_(n@._F.[DqēM twL;2t*}Duv! UE)6HVLդêBCz-r2q_F:SB$j JBLd5E!#FKdul!#gυ1B!h>G !&8*)O(b904~X- \qSaUǁ^; 8q*Ewu-d) nBYvs+Y6y%e {^J48y&@οV)h,]Ztiן‚;!^eLL[MEZ\:aǮ[6ŢZ㉼ǸP+einU/Ð}ťC6WɠP65c5ɱT4균ɥgw6Vᬪq9zWA) 7\C_xSU,=Sac[cgC[O8Gnn|;:;_M_>0Kct44}0۔*>hUW:dyiA+Tj[t'נӀ(6\uh5jVҘH\I0ވ#/AwF˾ph'gF\uZe.bniP+^<(dk_'3q-Jx})@HHHMZ0hnԢA(tZ5 sa/`6làó܆fFuvoH}~'Ҹ ~:Rp2ϖj^'wCb񏏟tuߏB`p==FqqTpjn>~ˣ?=!LKCg?znlic>`2 ^sњ1C m*L /ai9^34|d?"<$" DF[4NLjԩaˑHUpH U9Z .:[ G85UvⷸI UA׼5篸 YƒlP]van!^`3qSN!Ӟ^9^;t"kI9ʙ-]IL.:\fKZ?ʞ?pѥޞaU;y|cRщV=‘)WӸ|q/g{M,K#QQQ! e#Y"Y>!cM.-ZuIqdޡJ2*DGwʼnk[6-4/@n d4=}%֓^(pi!+˩[;LuF|ٮ6sw:_*Píؽӆl'<nzd2%%wExP+_ْg c(Ӓ1ڥELa5+kȊtc'Wgm ZqL,,bߌ;xe/^{&^V׼F޹x~~Xx Aitir="<2> 7^߈r TxuR ϡ|A.I%%Sē@p;^Uhգ7ЖgoWW!ӵ jono-_t646hC&c{0dKM@&?r*{+[2բ׽m:2̓+ x0?hLFVp* 8Zy;(\'lTK}PESdp{[UKY_Qe_ Z4jE$ͦTo|k;̛6o6_jj<{uH;7ÿ<>s՜&FDojAߞCi"4c6*`2a3+r҇P,o}ʅh,_n 5ikqt7,E`(m@o7q'ң ,V4t=FǗ[ꑧ=~[Aq]_`oQ|{|4Bj& ]7(H(D"\Zl*oSEkT"@7T,lf%yU$bG<#XDP*C^BTdp﵁?E7&,&9vj84MAQhk]ՏOFV'w~+OvsQ,w>8EC$ zsB}0 cٛŬ'EwRAoXm'*fVE(:CQ LG2B9.X*XXJ@q)q\'Nhx~]tܻ{jyk뷦p*ɔ{KXV󋘚.ڿ]TF7Vk2X-*RaVUS'؁g.Q|xn=EKX"=}&$(K6,364j!MrXLBKҴ~6Q, g g LjPcz)+pb4ScALr |cTpbn!~ˣ?=Nwv-_q۶~;zW3,<{M[8F*UĊ?Uz1AQ$I-"/IA RPcxP2b= ˞ NΏC׻왹Xtlw߱7w!p&w[b&Tŏî=wvC˕0>ߛ}ԛ)!|*FyC]:]x*ů7&ii"ա3Epb4Ew;ؿ]2c'7hۦF "ҩv3!%M槒ԬNTa߄C'Po # UDhmY܉ӡ{xIDAT_& .Z_߳vA/Hy AXXJHA IP4*htsЂ*bd4-~p5u. xמ~3\yxσ,_W<{غG+idR% eqlh43DPaGbp$ئRE:hKyۡ|^tbc'G<[ꑧ[仇_ ?zm_`_.]0C$dOG~z"wAŇ`zI0Ӱ9d` YFNM)l3:wс߹A*EN"cgßzO~⽳wQAHht dS,x9D"9reM02lW* 7} .5&L؉EϽȋ߸ MmaD\,8r6B0ÂORf8r<7uc}wAqoz}M5B}D7v+<z/W7>"ݾwMZ5 HcnK:@XnmÇoZ/E.,&Rc?}<\;ߚ Dj1+e.' 9 Nㅗ%Pp5N G e?^"/&~,_t5gضWT'1>A_B)P(艵##Ok'[d_G6 tweenr/man/figures/README-unnamed-chunk-4-1.png0000644000176200001440000006031014276677320020510 0ustar liggesusersPNG  IHDRz4iCCPkCGColorSpaceGenericRGB8U]hU>+$΃Ԧ5lRфem,lAݝi&3i)>A['!j-P(G 3k~s ,[%,-:t} }-+*&¿ gPG݅ج8"eŲ]A b ;l õWϙ2_E,(ۈ#Zsێ<5)"E6N#ӽEkۃO0}*rUt.iei #]r >cU{t7+ԙg߃xuWB_-%=^ t0uvW9 %/VBW'_tMۓP\>@y0`D i|[` hh)Tj0B#ЪhU# ~yhu fp#1I/I"0! 'Sdd:J5ǖ"sdy#R7wAgdJ7kʕn^:}nWFVst$gj-tԝr_װ_7Z ~V54V }o[G=Nd>-UlaY5V}xg[?k&>srq߀].r_r_qsGjy4k iQܟBZ-<(d=dKO a/zv7]ǰod}sn?TF'|3Nn#I?"mzv~K=گsl<b|_|4>?pߋQrib 2* (Ѧh{28oIyes8';Z9h6g>xRx'b8ՃWOϫ[xn%|^z}%x c8eXIfMM*i_@IDATxSwiKҖ*E@ERz)tA" ʽ@+"XBUitEzQT&-_nr.fsryBf7!f̜({@@B$.D   F  @H@CMb  |@@B*@RnC@ 3  RАr  (@@ @@@  T4$  @g@@ !&1@@P>  ! )7! @@hHI @@  @H@CMb  |@@B*@RnC@ 3  RАr  (@@ @@@  T4$  @g@@ !&1@@P>  ! )7! @@hHI *uViذy|WfW^dwCy;qD~eK 2X+;ɓ'eҥ&v%m۶yw\.\vfVZ%O}˟)ŋAz_oxt/"޺ޜ:uJΞ=+ Njd9rDҥK'Kv_v@%@`Ir}Yf-[6MצM={7?dϞ=EywH"&+XhkAѣݒ|րړaÆyѣY-T^]#111& .܋ϛY[X ( 7p-ZԔ1aۛtu?S/giӦƍ A`+K̙2k,d̙ҪU+@JI].]d=h?Kv9Ϫx>h/^'NH1=W{{p~7͔)lڴ</^,k֬ ͷY<ܹSjժ%gΜܹsnjr>k0yEˮ-Zo2j?/һ͓w_h)˗y.N  LZ@Y 0z}&9r0-TRP ?Ss Kz?r$O5h?9F[ 5PN̵͢SѥKs: dO'V^L|r3^dϓpJ*ǞE\}{Vx݅ 540LԼysٳحj;P)ͽ^~a76-O>i[~hډ-_F-/]^z%jy ַSY>%+W._ǎehVw>z~}g{=)]9>䟒%::Zʔ)=Dn  cz Yn)^5PLjh {I&6ݳgOmov}?١C6} ڧ5Ez&Yr.dz<׫WOt^D*U Go RxH % E `˟j_D%c_=Kƌ=/y4ל:+4(FDz%%KzNϳwgk@ - Ex(Q 4QޙHXVXQz) t浞wMK[ Z|[=u]S'Q7R[k2w@XLl>}zM:SB̈yD4`:s"͇'8jw}*]3Lb/3A_, mv<rweܗ:wCSk;X2*Wr{.wrPh^bw,dmQ&=еkWA \ͬR=U}%{&}7w_*nfw4=}x_mܸu=x׻z:tw;5ݷ umz}j_=ݓ믿n Ѣ, mvr-/A{_kp @~m<'l7YT5r_}USbntwoVj2IyQ|h-Mo@:R[/שS\&Lm۶"̘1CjԨaӹ<݁-[؋)SHND'lE'׉u ^kRent#/M|ޮs:=N>ӁR#F9sKR;v<:IbC0o@ "̵( @ DQs'$-Qe`3w?#}OԾtcxA5@ۍ^o:_}OФ]EG :)1  V.@@ :)1  Vа8  <P9%F@*@V~G@'@:  @X@O  @W@hXI@p# a +?#  u^Sb@@ a'q@@yΫsJ U4$ 8OyuN@@ @@ :)1  Vа8  <P9%F@*@V~G@'@:  @X@O  @W@hXI@p# a +?#  u^Sb@@ a'q@@yΫsJ U#Gȱc I   2=x 4HJ,)2e H|$W\+3g'^  !r Bb*ۿԩSGm۶RT)ɛ7y{3gkRtT  ]ڧOټy,ZHt4kLj׮-C ItV" Gv7m$;wN2Tƌ3J׮]eQ%U@@$l֪UKV\d<,Y"E@@",Ѿ}{ СCҡCS KΌ߷oܹsezO̎  !]PUٵkK-[&W^QF2x`iР5X  ^[/ʁD[=uQLL-ZLهg@@k :%A@Gv}@)siɐ!dɒC~6liӦ%{ƍ套^5k&/;  @\"gϞsɅ CzzUU/_6zgй>{^kiugkЩ5˖-d͚K'o˯ ,?._|oS<{dرRP.9EmPU hN@H^Z_l7F; ҿ,XUUA i%O?TfΜiԁC7sqU` [! dS>}ޮ];3GU; ڱ3 @ #34i:m۶lR_~1 i'gyweĉVz22gΜvrf(.i4 EgϖƍQ fYhh'c?(8-f  `'O:?gb7Δ)UH>Hs4'&@Dv-ͮϘ1CU #B#J@PH͚5%W\?K\\g*t,)@jj!S v)niѢ >'/.\E#ZK& O`… /ȑ#Gg/R2fxBʇ@ ,]T{99zilժKDž r JH {kw.z塇" ?)TԦG@+uV4hl߾;vӇ7SM6`" Жnݺ]w%M65h.]>Q=&6( ^SNRJf$Ν;' oM@mZqd@ 4.K&M$˗Ç˖-[d3gdT@F`R$@[NcZ9̙#UV Ή9  pC{rK߾}eժU2@@@HǏ[nE/;vN:ITTT V.@"*˖-+Z%k4⪔!DJÆ k׮b ϔ/ D:.`Q0J@-^Ad@ Ν3szN>]{=i޼y a @$ h筷*OXɔZ  @0.\`zN6M&L -Zi9 @ hh `/YZ5s'#m$W :D y=_u3}'y,%0W#aU:}-5oƴI"@hM1 X]`RJU,_F'@ 㪜#+pye2k,Yf!`cPWYG^r%s̲i&W `).[:  @  .nM6m*| g @"իw^)QdQE G@(#F;#:gzyrluVyG{[S}GB I2e:0  @ 9sFZn-_lܸ3rEP >u2O>D4l֬/(wYߤIyD/ɰ DΝ;߂ ȲeDY@> @Gik.ݻSovڙw} r ܹsv{wߕL2u;!ulرCڷo/ٲe(ԩl۶m<6mȞ={  H^dΜ9ңG{#`111doy^%E/-Zw@l*pE_mذAjԨaӒmP GSo/zJ./_Fɼy7ސ'R 68v옴jJr-+VYڼDdljӧɓݻv*~Nɡ<Ռ `OlڭJ; _ _/C[\iY.ۘ1c Ȝ-]t`#`.\X7o~]؆ `ҥ|gRn],"@J"*-ӧݐd:׻wUV%ߑ#Gĉ )>FK+Z);@/^\7nl"t~Q&z@hAɗ_~)WbŊĜ,'h߾}lٲ)K=\>Lb^@t<òw^s*O-Z$щvĈvSL!C$+@#giذ9pdT@ ޱi&ܹsjf̘5ca%q@zkM>x`!o;$`VZrdhɒ%RHdc@h٠A>|34 XRv۷o/:tH:t S iuo>sT'S v!"WX@ @u-[W^ҥKz55بQ#Y`sFV T`ȑ# >C*ObXWvR)Sƌpx8pz]4bbb݉E@ ^~eW9@2 @=z2e2, 8}+WN&L@i!7]v.F@ЫS+V4s}># ,Pg7E\?0ݟ~i6 `OP{F,);ig>},G2 @ "N<)7֭[ˠA"LF4m\9+ (gJӦMDQUOaH4 6B\|Yڴi#5jԐ^{ͳg@ I$i؀ 27ѣG';@#`y@C@ !um"xW4K˗/̙3[+s,-@j!s 5L"o^ZrmL+e!;w<3-111$BK Zz `-͛7Rtike mo" @x<(͛7KÛRG[ ں< ӧO=#O>QhR%THYʅIʕ+fڵkˀtVNN urSv@\t7|ӏH^AH XW_}U֯_/+V0Ac!(8U4 ni̘1vZɚ5k @@^dmۤk׮2g)Z2H@uy@ Ǐ-ZѣFO3"@˗͈֭[KNW @@ɩ@ <3g#Gڽ(,,@P WYCB)0aYxt.'-&@ @":矗UVIΜ9كU @P|k@ ۲sN裏B*I!@{X~v_zDGGGl9)X_ .dgΜ:9DB,p)iӦh h2eB:!l[NZh!ڑ^/RJ,) 49T"˗/_R!֭4kL:`]+Q\rYFH|dԨQ2f3r&MB-!# ^g=ztx3B lO>1s1E0a*TH40͐ӷo_3sҤIRn]*pMdȐ!W؏Grkݰa}^'N} >=ڷo/˂8UܹsfcǚnJNu `=*U3fȅ fE[C=uyI 'N@ OW.ڵ Q$'`K d_>ԪUKʗ//Փ~Xr!qqq7ʕ+S`/@ fϞ- .-[DX(D%Jw}'/t1^˧'L, <(={sAN+?E .UқoY>cy7e޽_'O)V+WHWJ䩧jժA H-POu%}TZճs,Yxرcrdw={j; "#GJTThw%@@ZxqiܸL>z]mŊVulHbo%X[@ |:Kx@ҥ2\ bP lٲ){E-5kvv!B&pys}ܸqfn%LB @:4A)3ϘHzw@@uϣGJ%o޼V& @,Y"f͒[ܜH [vQdɒ)S&)P+W.˙3g‹s"@v*'Nܹs[*odHJv-:uQm۶RJO#uZ3gրŋKҥ*;@ hw.Y@.5ji\hDGG'D.w;Zzl޼E! 0]E:wd1cFsIjNN8|<2uTɚ5SM9@ Bl=ܼ^h"E\o!W^Rzuۖ#slw }AC̜wS.k}I\\^gA"M`ڴi}vO#h"`rʲe˿K.=N4jH,X K tڹ'xB+3 C@ @ʔ)#:ŋy%EQ(Gݻ^Z.'CeTQ} .u ɓ#"\h C][?u̙3{F<#~ڵ30S{.G-l ĉRpk֭[`kdXO@=x +l ΧٲeDsa_(X *3gΘKz,Y\XE  . ߑ#Gd׮]r=˳_~Er)y䉷7 ]ms6@ nݺ~꽆ǎ欒< ˗/K_*s"$Pw!`Ajn#Y@HH6]f<3-eˮ  ޽[F%7n Dl$l}LN2~7y'mT\X_gϞKJ(a̒C@ dnM>kNk~FV $0e9~ xB }N @L+Wɓ'-\DC@|Pbccar(%}@}ϯAcޓK"E|7@ zͯZoߞ#@?,dٲeʕ+oq6V /s~#GdO@z οۦ# |…~f! d )@^~e9Y@$믢}֮]+UJZJ*s .-veʔ $LW``2sL3\rxb ٬.XG`޼yyf㏭)r@ iF!>t|A\˂ L@Zn]ٻwoI @d h޽{˻դȪZJ~$K= :LTR%ɐK3f(7+Wu@ wl͚5QF);@HҥK/Ħ_9{2dzY^* $/}w.ϟ?@D\ru{#GH,Y@HC@ ;Vr)]v 9# `DPܽ{u1k,;@]%6"/p6l[  dDЖ-[9:u${>SN7|SZnvV"xǤw @D!iϏ>H.>z!)[Ԯ}>,Y"~9RyQd@ eӧO7}? @ $j9ovٱc<32c 9q)~֬Y;0'k`ʂ p}'OJ~>ʎp@˽paGss\3FjԨE\ $.]Hܹ79  `o$[@KG3= @ 6/_.?wd+ PPT@ (N2uflقrNND@#`xYEׯ> `)Z@-Ud"E`ѢE7?)E @"ٳ4h N 9sn>ٳzC"V PDOςS駟ƍG8A Ulw W_}%}vV>}:inݗ @ZM:+F.D]˧~*y"Eī,ҥK.M!:::v i)ʕ+- lIJdĈҹsgs_t'>T6|{Lyl+OH-I&-GB!`>l>쳲l2 40Wi I ̞=[V\)M@ @=ũRlܸQ*VhZD'O3 RMc=&z&k֬!M@; /~ѿҼys3(K,yDG1.ըQ#$ `w[| @?O9rg5 @ L8t9sfE @DDQ@Oriɐ!*zUyzrzpef捌3:Hm&WŋK.]&MCcڵO?]s<+@Ccǎ2x` @p"6۷l2J]v+W$о^:)0l0ɜ9͙\ b.'$:thUG"j*3rsr@Ioվ:رcN7ʊa8ybA\v7m$;wN2T BIGϟ??pD+p%SG3 @  @kժ%+WLK,"E$;  OJ(aܾlGH^v۷o/:tH:t`xtҙ퓸8;wez@ 53f̐y?p, ʕ+˖-[DGꝎmfFdR^=HݻoFr̙@ IZ2eʘ/^zj)Zh(  [ڴic2~9"$e)>X@` hϲe˚`s!:@>}쮳n _4l,}v۷G#G#4L֥$g `wӧOl+eAHдq `CN:΢3l Ζ3#^~e3ɂ i@ .7|S6l`nk,E@>2ؿtQfΜiN8@ y&o }Y[nb! ^#@ΝB O(EAP.9@G >sd)4 Np6E/wy :KHpk#@Qz!ϗB 9P"#h @=*-[qI*UB* $ M({HK.?ѻ=YF E.5E>@ Uzٽdɒ2tT@R/@r!Cd۶mJTTsK@ :8Z࣏>I&ڵk%K, U@R.-7- 9! @`qX\`ҦM1cۑųK@G 0QMapÇYf2zh_3 M)@ ڨ*$/pi޼tU^,  ^#Pŋr}Ij, i-@ $W^;J޼y͝B( $ 8&Ojs޼y.V? 5Rॗ^+W関mY28IIMY@>@&N(V9sF` ) yWL:U^|EY`Aǔ"v { *0{l0`,[LJ*PSԞFpW^pB)_-(< `GP;yFzN:W_}% }ľuGpŋm۶իWw\)0 )FJMR"\`ƌȦMhx F~SBl/fݻ,YI@[.+:<-g˖-eʔ)ҠA{#[o̙3K͚5PgK. Wl$zj|wmU@ .iW4,Q 8P9"wy7zdL`ݺurM4Y. l7iҴiSyu6l ҷo_ɑ#׫m!`Kʃ>(4n&&  .ݿ 3**J*W\GyD)"5=~a5ka@ |LL ÇvI6md˖- 7l 0m4޽̛7E@@l/ҴvJ^z?/3?0Vj̒;@T .~a?|G[ 2{nMF ;^|TX9%k rϥdH!q9q*T(֮]+2h!+u1cH5Ry&G3Ϙ:ÅfA| BTT|RR%<#.]d{ڵKVX!yX @Z 6Mxfӧ'kgϖ%f޽8iMLu\_̙3Һuk6}>%  s"6yA˖-lذ̘1#z!)ZhЛG\ժUwyGҥ]W @"6չAYr%Hnɚ5hr'}vi޼^!8Jb8zO>dRX ,Y;jԨx7[9/ @ly2h )YdʔI ( 3-ҿ>f, ` S̜9UB.@ خToYN[pmVJ*eZ>cD9ŋta&q,W((s̑+WJ2eA@+`T/iEjrĈҬY32e 2$]Xi,pYy7O}E.  о}{ To١CS \t߾}'s5} kH[>n8SoW˂ @b @+W,[l^zѴW^\5 Hz {_^6l ~"@ bl/^VOtLL; @h~'iժԯ__;35ZhR&@ 2`2GgB+0i$0`ұc&Nj uj[u2Ν;'{6+-_\*T`}@P n|(qH WVM$ֈ5  [@Gwޑu'OYl%  p ?'BGnݺɟ)Vߵ? H-7 DN,_R%[ >#) :Z@CgMJJ@ c%::VO{V!Fl)@ -L#:}IϞ=2gsgԝ@_P ?^^|EZ4mT{O*@'@j:#$0c )W/i&߿O>sq |j8>}9=PuF@H4k9V@裏J 0ۙPޱ XJRAfH3g^+J9dǎcq=@ HA4[f2e޽{~QFIܹÝ5G@ }@q \rEo!C䦛noFbccWr PT54Wʧ~jU*\L8QH+&A@T9k,3o޼{Æ #Д@ @#:)L$ \xQ&M$$&&Fx iҤI$!DhV,Ŋs[o%~2e]v 8NqUN"py7MgƍJ*%@$)I6 +WJ6mrrdÆ  gxT@/@ hM9#)|L0A;&O>L}i;=#uV)RHrC ^4@˹`t~ҨQ#4h4k֌{;@@ :@T`nEӦM3swvEƍ':<  N ujS4شi7̔)kN/^,ʕK491 v SmWK =WX!_|̙3GVt~k<)@)@N}Ҷ3gLt(QB>svmq@ >G59WOCټy̛7Oϟ/ڷN:ҢE :t+V̡*@ 2=x;Vt`|)yΜ9dɒfΧ={pسg,YD.]j:)Z駥A%K@@ 7-O:Qw۶mTRfD;輊3g4BuGҥ` hKEoj*Yh\tI6lhÇ7?nBy@H F2щ1´TM2Y&ѝXh ^ﱮ˗3wRvm[idԺ?"@ l7:bRZe̘Qv*o&h~xrj 6~v֮]k~Mn6;gߗ ڥH@[ .Ui^oѾ{zBŋc_d˖-&ȑ##ӫT"wu7"#@@l"`}ACCg|$]t}$..NΝk٤ȦW]vݻm۶bŊfΝ<X  5lV\ٴn\I.zmvzntwqA(ӠRTdΝ+W.)SytMҩS'P-[tx ]5pKh#cbbhѢ-,Р_aL 4>lRKp Rxq3N𮃁4ibikNĂ el{Z6@T bP۸qc>}zjZ{z'5YA]tZ+ :Yz   Q@aѣ/o޼֑%'   KtW:u>m۶틩-gرcfș3g>:UN  `}1X\hQב͚5ڵks/x|   `lw ~ӦM:R;EGxwUϟ.G@Pʕ+Zd,  <۷ B6:t0}l2P@f \|Yv)*T7;˗Or̐Sz?@@CL  ^P//@@B!@ e@@ z)x   P(  WK @@PB4@@^ ^  B4ʤ   R@@ PIre wfj|U)xN#@&i+hz bw):@n&Nl5K |L2z-צM\?+suRIA}.5i$;xu,:)_.wO\ղeKW \6lHa=)}kŮ˗*W슍u[i:$zw੗\{7*Vz%K>SM7rN]f8:@ gF銊rˮk׺ze̟??޹yzYf8 K,ɞ,MɞԂ;qYP5_r[nIw[\Y4tzr]pTbk׭[MԩSٳ4aI͛]ҥs}ޓm۶͸ϛ7ϻ.[Ф[wل \8_՛_mRw˨w/m _|UHWNx:'N$Anav)u \O~M<G>;wnuo,X /qzW{rQY~w/-oTV͛p9ew/pz4k{ˋgtg a'G6ݭ;s"u~M2Ex)Z7څR`A:^.M;5݋+y*7ʊ+dna۔L`4ߵkI2^Jȑ#To= [CS^ c @{xZJ'5jԈ7 ܹSoP3C-~l]tf+R'wz̜9SZha1B!Kp?eCK;yGD'8geǎr}@6}r Hƕu}X_I ש;wnþy@0u2,ӣGsaO泯EǏ=$w/BܗuEӧOo~8H94iݺ:e]k֬1sΙ7}Ϗ6Lw{w\Z= SW'?_tZ 0x`^uqa~ysR) u>ך5k^?!H@`CI-ڏm޽&Ǟ={L뎾tbj)[wy}߮U u gV^mM sđoSj DZi$>&^J:^$4hsd˖MTaO@ )tD{~JqOޠeO?%ffyDҦ5bI@ez={I=7gϩgP`]V\i~0CJh_)9 Rj?,i,0n8;pt}W.eAט1cDqޔ~i޳ rw0w_W_}ճ ϩ݊r-4kr~R'}v1$qGrj܃\)\x'?9s27G#8| 39orwpGX'zSҥKgq%&wԡN:fO⾲ct֮]"LS'.oSs=чK ()\:w)^iӦ\fBm=}ճgON< z$_>G ^.w&w=qv"ոqc%3Dbg|w kGЀƳ=nql9I]Iojߺ B8 @.KoS$Fi!_,!:wjZ=}+;B`vKc²ΕNI̐W 2=Xh{E./` {3AMAp@@! E4(@@_P@@ (Aa$   +~  A #'A@W_)C@hP9   J  @P@I@@ W@@"@FN  R  Р0r@@@b?@@  +@! E4(@@_P@@ (Aa$   +~  A #'A@W_)C@hP9   J  @P@I@n*QQQ2m4`/@ @#R)  `eP+yC@"P4+"!}֬Y#իW]vIӦM%w+g϶O!) B; L'OMY`AyW%sҺukٻwo0\ e@-Sd*rgϞ2eѣ̜9St… JB@ @#)CAތ+V̴>}ڻ @$ FRmR@=SLrʕxxDh$@[ ܠ, S@RӔ@E*l  N uJMSN@@"Q>\ @@p-d XIJA^@@:)"  `%P+yA@ @J  @T@p*"" V Rm@@d XIJA^@@:)"  `%P+yA@ @J  @T@p*"" V Rm@@d XIJA^@@:)"  `%P+yA@ @J  @T@p*"" V?nx|IENDB`tweenr/man/figures/README-unnamed-chunk-3.gif0000644000176200001440000164666614276677320020363 0ustar liggesusersGIF89a1$Hl$$$H$l$$$$$H$HHHlHHHHHl$lHlllllll$Hlؐ$Hlش$Hl$HlU$UHUlUUUUU$U$$UH$Ul$U$U$U$U$UHU$HUHHUlHUHUHUHUHUlU$lUHlUllUlUlUlUlUU$UHUlUUUؐUUU$UHUlUUUشUUU$UHUlUUUUUU$UHUlUUUUU$Hl$$$H$l$$$$$H$HHHlHHHHHl$lHlllllll$Hlؐ$Hlشت$تHتlتتتتت$Hl$Hl$$$H$l$$$$$H$HHHlHHHHHl$lHlllllll$Hlؐ$Hlش$Hl$Hl! NETSCAPE2.0! , H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`7,ٳfӢ]-۷n+.ݻvݫ/߿~,0Æ#^1ǎ#C~˞-{/glΛ~ӠSFZi׬˶v۰s,oܻ[pÏGx̗KW~ytЧg_ W˲٦Oo{mߓY}X=~E߀   `^a6X!z"Hb%آ,Ƹ.8K`<j;wDdCg-)HrFQVI~V&pe 啻Megivddf!暓 益Ixީ]v瞀)J^["[2JڢF(o!jY'饛j:PV騍3g汤'}fb}j묷뮺cKB~y䦤x,f,Wf}"km6tMFv~-iӒ$E+[lЛg+ޫoo}DJ+IjAB*y Q* 1J9<Ĵi1ǿYșV[HH,0,im") <,DmL!= iz VSMWwX^).+ "-whu-$l@[]،9v?nyY mImYv ڄ;Kyf_]'|,%ܺq3 _/>w7ɪX0Ҙ쿪zv?˅*߿93`2l*Գ VO(hl]pb m\]υub! 6PV[[ &Qo^{$D ZL88*|t R)WE)ăJ,hDFQQ*810Z!,z'"IŪq/Ub H?y9ߨH6ϑܫcI ;(.\Ge0j1+gJZ.gP2ܥ/J\i,FdiFhR3Rx&|Bq!N r\9ο$|"yƳbd4I&Y47B+8QVKjE4{*I5=J;N+Cз(4y/]L[:SJm?I#Rr̩O ncIYPa%SJU1SZլvՖWղzլ`5&JS+-::j@ 05It%rYW.qtf(g4MMkXyzgdd}śehԐ=]RUHP6;jQZyf_#ۻֶHgVGlYߘTvJ%J{5r]tYwR6.x*+ܒInВw|/{9֭iXk|J, |+귘ȱ&a+ySkw]r0G:knD<6SWk&.Lo kۂ_l5irـQ4퉅!Mo6YOnul%cXTͅg{X%%b#^`]6loFy9r-zj=`}h@#$phB7xv:Xưguƨ0;09İ>3Cˌf˩pnX݆Ytky"ܫePZ3ٵnLQ2|׶l+:]uVev9Wlj}[2sM^ߗ-d.=wI)IC҇ā߅OҎX;vJ'wV < y:ƐWi8353t*/&-ZݟqzGj{\S.e#-م;R9sc=kcd{NSʼn'^;= wܥ o3qo\}~wSjmkO?s~9%n)w{|]gޯx,߽|>dhm۰oau4`bh*%aHcx0jxklnhXmhtxzg9{(ȇ8H(Ȉ8HXȉ艋(BXBtUnfcdxGфԀ$8R؁"x`V_̘('(Q1z+x~j5a'jM@Nu<ȅ(Ǝ5FntAu8&slXbɊi#d(ۦa F'߈mHR)Iwp:8ktg y&(lhhDT+)FHd5I_y8 86I"iظٸK~ɍq5V5%l"َ!N]& )ɍ-ɀ/DiF[ȟ/Gl$X8Dz7ڧy:z*8WyMIE=02Y6.Dp˩IcωǦD䦁s9uzbjfI:KYrRz|ZG=9Q\ 0 jdk8z<-*B:IJ~fɠtښ| *zǴ=rr#i.8ȢKUy©3ԆSΚZ9'Bz[5"Qj$Z=ڤ# D' ;ʥj՜{6 kZFDۢjq:i𕴂ڴA˴㊮š"bo$h뙲zS{Ư*xB๬7 9;t;F= 1?ۯA} ű!ᱷZ+7*v%`:-++g[{H:Wli!aR;EÄ>zk( ℔;;{M\QʲH˷;b6ڹ {; wD{k;$ A~!ۍI8 n٥{Ks39,֛y[r!9q6 w h#51) ۮ0) I-F;8[ ic4<|@N?)34ĝğĚLfVWڽ[k 0ۮkK~/1%-:n;0KڜٻHy[ ju EJ)뚔[y4V=BYM|W1m3 =;=Tܬ AeM6u}2Gvp'v x+v%:t֔eٙqيԜ7NmU,Ժԡ=uQݻT=%bj+t}}b<|7*tKٟٜ]]BȬ ׶ѽ6SzuidЫ.{⶗jйܚU}ڥ ]ګPJaw;$$SYۺJ!.5c}m_ .<eܟUTBLFNT ݲZbA a ` ]N}G2I nR@3} Ke8S⤭-^]1P,m=AX^e$m[33$.e-DNjd! ,L.\txd}ͭ l;C+2rή}O&2¡ !o֯nѾAI .sۜ=`.d..q~CԎnN /?ڴ>`3dn Uޞ~ 8n)~$n^ÞrŞ P 0OI^}W Z WOM;Mhq>:_~QCKl D410j ԊxK!,/.!3plpn:?F#_$T^/oW.a#/.q`>nP >wn:- R`sP_ݸom \^`rN{!xo\h aR sErO߲ 0>5=˞-{ ,80A6PB'Zň;bQ$G5 rG-Y2̕3mTQ_}Ֆ$iTRs U TO^:֬Xv*+Wdņײcݢ]ֱM҅;޶yzVo_5L0[ċu<1`ŕ'_fqb̛#CYrf2]j$EMqMcmݽowp}8pUt~tʣ/=dOݯ7]!Q|j)||o_~?o@D@dpA #pkMZK`V2(&DM.7OŗNZ]Fe(Gdt$Gxp ܂[BdBΤĒJ--L1$sL3toۄ D :r *Գ{ʺ>QN;-R'? RPDН NKQK4JSN7SQuTSKETUSRUEgnW[suW_kV`{V'zUXe]6Yfu6bmZhkv[oo%7`7r5]vU]peh 2\͔U=M~W~&x` ^zPxjb/Hb!=fHc;8dF~KVdSfXQ_o9wf}yfHFZh>Zn:jv" mik_,=?a;mC{mon)\EHNoBGNqȽpGI'NC|0MZɇ2g}I~%~_?˅ NH^G m31gB#o38% n0+`G# ]3a 5HBPa e8Є4t%dD .է pE E)ʈI|!D(VIL]")8%a 6@aO|g;҈q_nBd$|Hz>a7ARH̀G׼őTmdضINZ$h yJFIwSec9K\q$I>a$-53<#2?If.3uD 2DSQ99mNݤ!NB!g.mP$ 3 R“wCD8la@" 6 O05(CcP.D1ыvTCtMcIRuQ)[zP5U)sXXye;j3ԡ6?Pl! CzmJH2Μ3WZ#n:4+p y GOJ:{vUjWկ 3'!isX:Vdu.>%6.,pٙylPlj_/NAklak0(ᓎK\M-:/7BE,rܙsRPvZn>ŮEQfQw) Rf.z^񦉽my^J ):wvHߐL߱,?NS̍>fyg _8nEF((TV +r!<#+$eoj c!)] sn{1RA$3y1Cg.eq9Rwf?8)1={Fe#tvvd>QnJneWa=4upLf8 1&ɭO84djM|K(_Rԭ5CjP[7֬u?f{qCRnGgˇ>6 Liی`~v|h Ynpۋ,&{i3whK}6]I.ժoXn!D?R?(/(3{K C5C6|ík?)?0> ;Ϫj,@2BTiD[¡zH$!t*4 N̿Z$DDԻ;EӽĽVDFW</t9?4 ]|LtFP1j|>Rl'ld.[>:C C8,C Kp4qtCt,G6oƃF{sFL̹;̎lɣˠutt<:L rLʬGMͬ] <<L.^|9A$3,ĸ)@ILIlfh\LiLNlN|N[NhL^znDżνMݙNN<,LIl_+ $f:N9ND;M>$ }"alGRG MdaGr?- uPx$M P 5!dńM*QrgOeCĹΗ$Nu*KDNh[OO4&'edO}7X8#B=Z*[%u?CUa%t?Nm,dA.]Ld?PM+i='2%_VS%nN7uU}WU*W9WIWq:}TӌPEBԬEWzuTxPGW?%TNT:\T2V[Xj\URMST3opuq9\WEN@33=8Y>3VCք]eYql׌خ'63؋ɘUXD $בҒm9mm}XD xWWCZWH׭ CImO٠UMX֌QطX|SYZZ"i\?UU]Z\U+eYN[D**Z\ˣm˅>kZE[_({]][uZ]ܠլZRdАB[몡yUz-ױM[edzހ^YCt]}_ܕ_@݈ҸEeMŽ]ݾ%V}Y&N W_p_0^zکMi|u:U,յV9aY8N+] `%W0/W{ ޑ ' Ie6%f]1A`.`*X*(6Z\NakՏ&]! 5f"("`O&`+`~{hC65f(^Mï%ߎdHM^cK__=%`EN7n ,5R% #TZV%M6wQ a>b6%x~]Q;&}ܭ&(5&bm6=^8lm*VcIaߍ &`D6b^Sҁmf~68ͭ=p&^u*f6fcSeM$b>LhHab_71OPzN`3h.FZvi΋fCܝ0d8f&hc2ciRcJcg=LDWgD& ax:INdL6ۭ^~P f+nTW __E@[U]O&Nx}TӗUژNW*/8_3&M`.jMjYmYjM { %g+)PixgnlnPb*ղɡiݍ_H{@跞m&Nn..hBhRA2 &j6g^o pRV7feSp߉Pk(jM0'/7s/Gs.3W4/s7r1'67s6<=s7sі&fSz^㨶fmiHJoe$W@e.i8JU?/Zw8>af|&I_iu06nakR(iEfc":a:aɊh $hv o52WbFUvIc߰cV~h^[ *@*f/"^fpU DuW}#YV۬et x \ W~N jdj.Mnyj'*ŗH~Jh&hKXlj[e[x/Xd{8* SSo3x *,vvkDt_vD T>mfTb·dF [` @eW^`w7^/vh_ ^WTf&{~wcCnlFi^v/"Ph6^MgcSЊi |xx <~xm{W O.* wzNb^%mooC*$~5W0[6Ng&x7}"E!؀A" "$ROrGÇ=_~iϖI$ULr˖0gʬfLrgOA EФBm:)ML.t*֚Zzk֯Mj6S&];r+ܸrҭkw'^{yVBĈ-Uȋ%`p*+UbNlԨWn 5lײcv6ٺs7ƒn8w3_vίB{"D& 7ES" _p; ZfD-N뛬^ XN~,es'[! P(!^eavVRVs%xI|n+ MY|Tb2ڎiKg-(x`.d_LdI%R"Y^٤V]bbrIfcz&gfeZhx 'yƹ}:ĝxrTt2y 1C(M4){ڕPB)trPGPMdiNH:kV!޺++&ȶJ;qZi7"ģ~7cb;aLE QSmrvK/ڻ/ p ײ0Xt"TW 3tf,Fj4PADymqJhL@@'(}%)[ ߼s&389s3 M4ҲrQ %cLGcDXY1vu-<}wx7{-[ܯE- T-[ڣ1 --L1P+SpNeD =4~4NhLcxIwMt뎠׾`[β$/_٢ŧxaD. i߄+byb )=7}'p, oG&"i Hؗ(u"t_hv T ^bw/h!VIS %eOdAgʛЌî>$҄x )<(A14rS2(fc\\*0N?Ge%[k%GBőv[8G=K{# H=񱐃SyH*.|"!HIDNAݫLBHlNs0S# էc A%)[0MF$ eI$8D'hFJ~)̨ sA /9Sj *y5G5W\<ZApG_c&syyng='MeeN&kgYx35P&2[$93jYؒxJ-?@ 3]>$!0wacjUn8ݢ)D=T_+EQC~NMo-3m׶WNJzt[EP|-c8#&0Z;0.I17激`mUB˻ކ[daDž٥~`J4Qu0va (8b*0$HEilB fxo-u3PM r-Ϝkgn+:w6&KLa;8K+h!0!,g:11`nvs}Fl=A Jւ027٠=k㾚#aal1Vn'|oPTM%TVJ! ϠAq9"Xyusn0;o 1YMGwx-q P}N# 򯙿E5-ALO8|#~|cW>WKDr_+%h?/ƣRE+VE\`j<`ݜKΉ ")tٳN9!U/T^$rufʄ& -,LfK \qx̵T"Oz vWfz"0K'ON)xN()(ٕ*.΋ C0I!B+-,Hd'wь.~Hy(('Vy:¬ge/ չTӊC~jdq`JQ"JnfNj$B_ꨮ&)  aGBP9XML)i~酼h*ōjU$`VŲ>HZa?,*uѹރ Skuk+rimf)"7hZȐY) :o(2kJj) 6,a2K{+P@G6h E01Wjlվ++ɞ컾V E_'$͸Z%teqخ J-/"%[N^6B2t &rkmlmʢZ{N\lP.&[R%8J+T@`aa)6m&%Cg$|r]L܉`Oj>Ii)*LjjO*jMn.$j톪\non\U@ֈ )mVH:"l<-j>U Ɣ&GomVE-Z=m]qq2Zޚ#D,. v&SoD?>nz*0"p,J4I)l M(X/aQF+ .v_pl C Ml&]Le)Y loz*_kގKȨEH/0YeV)K E4h|\V1˱]k1\1SK1  r 1!!h!"F# ##r$2%O%;$cr%k%k''&C2''(r*2++r(?+2, r"s?0\&lA#E\L-112723#4H4S2_33Ws2g36Cs7O377389s87[399s93;6s;o;3@@s>>t@#@?shslA;|0  _4VFFp. Gs IcHCU&/)\f1%MߴR`f4t?I`aS+=l+ VUTTGUUVoK43gO'XgY 5LZ[b#3q{ڭ]_嵂mu !aCa/6c/LtcGd$d_6f[Hrfwvaf{hvhvё6k=$XlKb+lP0nj6p hsvpĶq'rr7rsG70tWu_7vgvo7www7xxw/yv;y{-Dzv{7k[p#|wv+Hmwd jh06cvSoE;\pgvSg6o)odW8cM~keoRS$ۈO-d;8/vl0+v;Hx+b8ao;[x-j{H{O9?D#G#9RoEymx/)8Vy%B1[Vv:/?:GO:W_:go:w::9)ظgxEE+wM:'AXy#Eh/?le#ۺ/;'o(=@oHMI&lE3;{xv\´ooC40 ;{g-;d{SCes?&z|p'@qv7&KÓB$N|;\\9$KA23ů`;[Vk v-,*h)@]B XLM@jeDƄ#AŶUyp&y!]BT?N=gDDgU| @='m |"TWqDn.QgB{BѤ:&ԣAXއ::7_yI y'Q+L}S I|qg _m{UfLWޙM d"L*8Q+Rɪ,P"]\i_DQREGUjg{Zg"Td"IP+ 5+L,>\U @F*e{]nX9P -HadZ!KI/E\(P|CHQ/1V=AIDW$B^t=+w`nNxA_މG4Dm>(RbQ 9U2G EA7oml2AUg@j.ӲTtg];B+S'=IY k SjƔgǧe5SsvP|s=R̽ mZp 4 c@ !ɊIbY nТ#eWf7*KbE{a #4HkL[L2v.Rݴ"9BòDa.LȞ Z%$TX{]<9 Zm*' &v+e#hX$M!̤EW,sA$˨TFȓ rII"cXW@F=ն𢡄gDIatB"e (>Ftl+^{cӹGOE޵Wr*k̵ dzi;ԣ]:yC /Jz S嗽丘)d du ).f8K.wwxvsb! ,0Pp`H%(ўpQǏ Ci@$S\9Ҥ M^I{9.dɳH>  ҥΜN$ʴH:łsIw%mj * ]Q@ $"@M&d˗(ڗэIm" 4@C3{Dţ)͠@% ,Ѕ D@ٰp6(bJf+Sxy[jE ࢝U_ƴT~ɍJ@!v]~WXP]%ZP[^4Q' T(U(!O = fHknD)51N2fPV Du?uqa ^8I=SxVb?!Kp'^LHdA7Ytu$`rM'ⵙ'phO@SFB6棍$KewEdQoKbJUݥY%2fDYbp%lz1;|b`Oʷ]ݖDTKb MhIu[\^1P5qhL'E* F S !T4Gvvq!?-%(\wʇ5W]gD'AdXEqA \'Pg[tAM/T d5A)PՄULnUK^]u`HĀpsIOXS@ )عij2Gir UuKkk2*]RbGQڻL_)ADf+W"-|aaF/*$ʉR*H =ʎ-60 p7%o}t:Դ'D$pG((H p_,AU& DSK@ U^QQ ΛROyeld8m,B4:^*bm6͓"^$Œ>0vbnlh. g}K,U8B,m6&4<`U4!i 9U|񌇽f#][H +A޲b1n/d3dS4UqMVa7{(2*"/690oU'P|Ed 6R& Jdj#"61`07C`)ƇI2seOGeQAwk$@do;|d6q6L!h1GtCr[#ngZvv ( "[q`w.2WPP pPXBCT0"aBF/&R'?;4ojqX҉҃bVIvU@!"ͱ*$*Pxw>g燚A[Kr"!$DE#y4+?em{D}W.AsrEc! ,0Pp`HUWA[2@-SȱǏ ;8R(˗ !Fڲ73eĚ` J#ˢH"hfEi*JjB*DYK w'*Mx׷IQ& _Jpo 1ѿ rEh \jȑ%(i*e2An {?H"w ⿠|E`uwK+`<۷{%j~I7(BstF T`N8 }Be%?0ATt1HVQK+⹳oau=7 aR+xHGRO`M*x 4Q)LUV#XP 00EPJ5S T`%\T!v4d+ny6Re]w]'|Dpqϓ+fԟHqe^t 4!K RtH$u1APF>nJ dcօE@w[v`/mĒ=ugP:pTr@ŹSruMoV[tFT]BFFxp=D=RA')5E)O6ԶFuleJEHQP{dK)e1)04-A4JMf[qftr5a=(P'&Zᅤ+ZY ȱƛ?1_KqV],@k6YdgiJ9Һ鶄 KU JDʄ)vb@JWx&6Z7'ZLզХ VJP`A d zog_Eib1}gY@w[|=D 5`W }l̞sfyuKƫfKUgf Alך+]Cdk ^Y}քf,"<UIh28yb_+Un 2Uz@fOВ"j$g*Va.!BS,A?-89+ΕW:A36#s@ +IK;r'u1Tr n02"[qe#q[ ?:CY09dA4cBԞAG@^D`w Q$ E\*TNR#MP.Pa \hN̆'\_t #ZBbWXbxTM2 ELKuDSϱUr%0Ap,+$.M]vGOtL (9ZH~ *mPZeG6-RlL|O;8b<)a/PHMY^XOtF}S 3:%Rqf<_FRz)DW (BtifKD 6!M6*Pg`/+@bz%N\h #q(:O"HlTP|$1b]BDNLG~E6!Sx* +$[;s6M[ZQS5'oL8UOL,0AT/tl?h lGTטR4Vz5YJ;2@[R\!`RL+TζȐ:"##AX>YGII"qbWov`+!yI!jsZm 2D6!LB"I80+ nOF !A0w UHxx 7z)692^{E' 꾸 ?'cP\X2 ՟paf 02)oC+&6bt Ue ;LLAd-)Lq(ʶJ鋨u1(ou TZyj:=ECԹ ,9Tr6 ̛7!JSGh\"@y ^^vb6m#^F߁[]!Q.'IWx$bEf¸r:p+jk^I&DSb Mq&jE[L:b q"wH5[+i{ i{Z\Skx3`S!5v.\eȯ}LH,,>]٦Ԋ~I rdUs՝f@˻ܑz~_ù!Å=rJxGAҴ~=DAH'|O4->wj"SsT%@Bz 7hHmWl~)=Jub]LH!ߣ;|GR=}њCv%QOCr{| E@'N9K8B8R=&) xa4S*Ǧ@dḅ}#xLW'2d0p"dMD AVK-`6T9;d#1bWRvWb [SQ)bU}*.6XPY!b=bru4ф:-B1Sk+Y D\M"'ZSwry-EP pshh/S}|*^"pYpC%5U% %E5&wq&qAcFH.rℲ\3h%!M&1Ј:A=!q?vRkv(adJVӈu!M0V p|'KR)MiUT*ANW`7B#t !(c~HR`Q[/XJ-1HEnbd@#n 4$}RvS=p #sz7_TƇT!1@"A"{aX!,wA"7Q$#dԀ ,@+Hh92[ց 3{ &Rd]!H-,$*Gh.c2i:U>S:hBH#,! N rr .q D"''R8(n0U'daxE2B5! ,0Pp`HUA B˞/)ȱǏ(r?\ɲ%G[ny/. dIH*mx&E".:U’NRT̙6ЀIS8}ʵ-UTh0'u WKȀ  < t㑐1bHV>ތfEKHaDw٘k$` ׯ~٪m& Dqk.AڄN\ξjh85YŋpZ( ;\W t!NsNZͧTN 4`TėYgJFQlLSNbWM;Q?> u TJJd"Wiك"SXR׍IM8/Lo H"AG"QL U%dfgNY=4qm٢jUaVXg@։ԑ(9Vp6)hPY?l1PIe`j$N1i@*xAR_݂YAYu:+h4zD=lPcF(*jS<>?-nDgrHT){+r;^tZ:+;O?pK0D  LhLBpLPpW"b1O\ut)$ ۔@FYDiqDJ, `el{\ k 6q9F`B+(A5`AhبJXW)p1OVtqKܱ VcYa&*mK Ql4رMc AV7fUtl)*wt'P|b[\BJ}j-x`?f{:m߯$6W)<{T-)R]tF_6xj6rG^N :e]Kڲ=W:npج'wAal̇`b38+-txRip*!GZ~"-V;1)~N-4=%@ Г3p38n]qV%9z4!^'mݢhwAUVAب xxΛZ! nъcyVϞdsƄ>/^ 81 ?P;o{ RʡRM4w=%>UC#0j{5^ =$Fi!KgkŒ&'OՀ!^ϸӀ"/,y's>yrOpn\Ϸ/n @.a)o'zXm+\d N ɯYfaY l.aSPՅs զ6\ "bW(AH$hsG`R"v e""0pGQ2aRW!J#w ('b ` 0g0>q UvI?M@r?3r,H(dR/!k4B#OwKnVfBCV#AZc,(}*YARqaU?,@0iA PUNvs1Q7bDJ$\f#.8ز| l.~0bl65A @2Q^%2`:%Yt*d1Q:̥0;6V%LO475sp*b1Z5W"(SEdyoX2q @04)5AqQ@u45'A_tV7nP]bЊDD<)ɲZ>#^OSwG#k=PzpсoIØDo=8hem30]ldd]֥rpwB寤O }IA8qʝ@F}8 h Քpeط.o`ݮ݋^+0·pA*#:$In&feb˭GM^̠D v3MqIt *:ʼnU.&o "$T>a]B)eysXe!X-&_nAM y_8R`Ѓ5PR']8tOXQEVy_L=W ]4lE^IPO(Gcte@6wЉ)^Pc3n5# XFe'PU@=I@*}V?0@kmeЉN8Pqmˡ5cIPi 3#牼F(u֌j-@+r;c ޡ iی 0Jdtu$mFUբ,Q1c1A\j$XrtyxAPj^2ɀ̞ABidXtpVY_U\%`y۸y @E-m];VDŽx1(4pS[Qn d28d4uSǹZ$x 2jE|m2Uߨ*P{mqB 7"&H:Pn;1 t"Kګ# Q+)dBk!&C+#}STNOi?F>q^lBŜOYKaS">&1E`OXw³R)Ԁ*GGwbIyZqB&qˣ› T(0"d~l 'v)'6Ǣ:A$a;*F-&#yxogcW Ȁ*'OB@'&PaB,{t'aY.(Bf# 3 FD: t($q#IuIw)"3Kψ= Jk FB9YQe4A5jQvdL /oj!M؍J=@{wt QªP@EcԘU؛׉(GTTt<"#,A.i!gP¬QU E="PϺ)׺zapbEiT5(Gem.;)[ q (V\ ywS19z!t:l$살HAA\N4tV|:SޑڮJ|j)yWtR]V9Q|Dz$]3ޝeC(i84R#AG W"Є؋d&[YL>1n v {^UA])N "ٲFJ iĮ'[,9BDx'f CKg^I.%y)j)Փ$fΔ}-lIZ@]RzJy.&"zn -$0) q8ϞɍG}Nx3CZo,HG6iE-bJ9ֆ'"S_GsT W2-!A5ȦFpEc j1L_FW0J>"ݻI<ߔ2`^xEK>RV m[ќZ bmfr\X*aenk2*n6OC z?  Ad`x^f$ar"7}tnCa 5NG[/J@l'u|Kdv&8d }؛kUA_:b+fN n)Y\ͨcw 6-9kO юmy Bn s ،"VB?IaCi\&|~yrd'g<8|O+(M'؂'ծ.s `x-YYt+);_$Cw HfV>0 gd>Yt3)N?uy7Ic i5"K6\=|+I#_+rU ;4PS/21&r'as0!jIB"9S5b5+%OkB [b $z';WB^1&1C,CubZ8b'dscp;3Cq;_&A tCu{ A] (,#Mg`VBdQۡql6XLH(BUX\pb*!.ť>FS)Dge"m|#d!yQV}MBbg[uGEV*rWDP4]X,,'%.3\hc(gpSx$Ba( &#MpyiT($R%|QrUDD(kiD[$>{LF9DsB 6jazKPBpd7B$rE<#Ii!<'xg? BBz 17?S0 sMR [sGx%Rs ?'L!isVJtZPIr:V[GW~"ixa4ى)%!c۶JBCɒ[xOU-<" B1e(o'%W('nHtXw(U_"q,;:x#]#RFpot cy7E})y&|%! ,@P``H=𥰢ŋ3&8Ə Cj=˞@WI#E5s3̼uϝH $9e %TRJ&J{4@" t̲U "`Tx-2uwWL4K8=p-؀ K.xLsHNFj=.ѓMjM".l/'Uɼ& }jO_t x6n٣TN!$;TQE^r/T[_uY>SOFՒGs5ЄcE7Z)Rox@oLc <)#A0y/IFNdlTX`Ȅ-楟 yG8 hK`pcD4AJJUȐ K Myި- [VrQz)=A6vO)&`Mqdu!IDC]%[=VL @Pg^^hG5ٕcqX)TLH?xc6 ߱Sme-Jk'?P!\uJ 1t#Es)H$Lӥh|97tLb $Ae T0AT/p1V'sQ-x]UgAbN.dlsƔ%'D \)ZbVx5e*)RȲ+ΚTO ` @p=]c akˣ\Pc)!$/}<%mU[S֔T]وL` HvĖ)fu$qe@`tcKx+cRķB||IF-s*]J:(B9tf9G)Zn uVA[@ɶ;ֆfK!{rĶVDX@'l>&3SV4Wأi(3OLtjZCST![KEҗ&a@΀^2 ܣ 朖=pV"Q|a7Xom8 :6 k7#Lq%=zC~Q$hzz+V胲4|%Q*ͥ? սv!$B4_qaKhJCQOL }y!Aw*HH֒19c \Npe)Wd@NV? ~Egq Q^xTdSN2*eR}6&mA, K>GC1TX7nUc%Va7c7uu%bSԁ !l$`&dR]lMQS3"_Q4;jHe)KUo$i9QNa8sX*'F6MP:9wo$Cf6-,$vrFj_&7_u&=+Xѵ?HUBY6]hi &C] a#@FuBy@̒4[x₱Q]d@@aΦU w l#DP߭?UQE OEp7Hr'ݐ^nh Qa eLL=6Wl"pQҳU Ir454Y ۗͲ L!hbQT4@_0f1s5 5m8ێ8qo68:)"9Y"h u]/.TKjCi{:4 QeN26=KtIL+2+O18= H s_.tH6ҳu < ,d-jece++}!T٤95 nLc{c⮺BT:01:THQW hFi[CgY⿥ @7K #z%%)g+jj2LaS;n 2<80|]yʑ-Py_LX@KS\89\ LNhdiGkr<;b\gRHHdR)εF\>d^vAR }"9C['M_%4խӑE`]w&t@T5̋31Q3jpA,Ƅ~/y3ÜkiC57|%B/zCHz` g>yDP&nXzrE:9L %Ii'gDWZC g/u_6Ic' "gq @ m5ƒFj^"i|3#0, ld57q_%tD5g#Z4iEhQ W`FQT!xoDtB"hByq?O 3A36[mA2fp!{Tw]@ ŧ.H`W/+^7rZr'r)'yZT62b1w*JL\! E^mHYȒc]@u&g%-"T"U<~PY"+XRnO;t RaN`B{$x9A-;bD@ViO$h%JNph1sx%h(9'`6QZF9{맓5Zw3xKyaQaN(Cr"#hVɴX)WzHbo~k2bB~Y4y! ,@Pp`H@ e׽[|#=[~mlHПA S\I͛8s&qbÍ0':tR CJu;QaB Jh|YYIڻ@0h F<xO)ɴg+D @" w S 4p%YhO_Cs})I.?(9B \.y5:lB܂tR0Ǝ#> uL%`^f\w+ŕ}1@fـX EB|CXUTPI?IWTva],h_QLv'SxKPJI/ 6aeSL$'\\Eu"haTEeތ]4dh 0&A%KR)HH@}}hE tT\u}=Yj zEDmVaWqv؞LGT^MAӛprViiVҝ@u%#T5kᤞG2nHp&W|@X 4lY Fǚ@R^!VFi4Pqz=Đ{ѮZݑ6Q)epQJ+!!vF\o9[)$gf`Z{u.U]a+}+{A@ +]nRy\ Hdļ!KPA VPsW-+]RʷܻkH8^UBWօٗ.]T? WDei]~jZE+eL7Q ,Aֽ$ C?CGsCM XSbFLiբIFF+MBiĤpFp * e8NB㼁L ?k"{C*4ΕTHg[0$ oEXꍪh1k]:x&c#<Ӵ;H\Lz"#I0# T Ŕ:9Wdbg0oS̈ 3*%ǽ'b2WrqG]\m(OT_YM'5p`s¼S"4A2؆vˋq+4Φ'Є7*H׉ tkE_/)qee@FlV$C@;9t"/?L&Q RD6X_L'xbTpiHIS!)1L60)v8!.8ɑt! ,PJ`VH‡#JHŋ3jȱǏ C!ɓ2!_X`UL(0- :'F_ )J- F^%dc [Teֽ3UKnv`٦JUjjUf po&׺Vrf@++Q&+D.^Uu ԩpnm1HgQמ/ Ȕ@۶` iY+rpevV[frCAʀR }¡XeKh9VU̔=\PTBqg=le8rWS0e-T&WcLeCy7bf -@+/X5\MSpGPZ$b 'LA\|XtK'h>*dxr;n-8?4zZI@TSRmeRW}L1AP^6M@_%bP YZev>IF[QaQ@jTr"Wne*X}*AdK+gZЪcAX)EcF+g9 7v&L@OByHW}h$VZYR1EPNx/]贕n/R(Ii h#BJBl#hQI~EA't\oN Ѻ_!*F>joJ޸ZuA#H@ˮfƨ}8tҬ) MMCDQJzԼItWPP\Q)MD.-0tiyyyMZڙKڽR T8c4cX鼳z??|KNs{A[O饿-4ѷӅ.D\FVb}6 ^"r% _y8 ވ `3'ŀP8ŏL0m^]jL8ғ1*$I"T,B`ٞ \0^6tHh']tZ@9c")f*@0LZqIHƨ>mBWX-r7 kUu+x=nuJ\*JM8i{X"`B:nBWqF<RT8~+H% QqYc]V%(Wis%$\]SL$#,_>w# $nnd#@0 LP{rv¬\Hj64.]+=ycUW"-02ucNY?\)PHHAO5fhF+=uhC$2Q4B`t"%,I/LnSa  .8Wb 0ߟ+Ic\!38PR D"-^2fJ2!#480GrGDqBT#9@ |TO wW)hCrpB7HiJ3O䩞T1 lP lg>~KQ$d-' +Jh6mˬtYN [Pv h4]vk0Lfh QM<[*W1iB+jQmNd<)d -\̼ ȩt2Vc8I+Tt՞v%!+5` yw (QlZt~ FE@tNaLMNJ,#yLDK+aB$0e g*b]suy9TWI:csio v?@zm(VZ؃F!rb ,ᝉiԞFƃ=5:]5ׇI?L d6+%xLj~HL9 )υ e) dYZQ ʖUth|L6-09p)<-6t[k .e8f1> - ]\li,URXKTP0Kፓ'A&/#@ҩZEKZqiRO+Y׌N{x!=s#v4h-Lq\2?o"-ӷC'6,F=}6] ^!~ V$#27wRfJ Хyxr xjq+(o%уq%,2^E>:o_~TY=64"!+=4z%r qosq0'sB炑ujߡAa*(#b!A; Q|XM/`-w R]}r"n(h&d!obq-D_1'! ,`@``Ho!,k#JHaŋ3j\ذ#Hɓ(SHTI毚8sG hĠ7*[/JE8aRS&t9%֮jUuYMBٴZ"ƕ[eB Ul,׻&sǐBl/{o6|0KM6d]H+^YW ^g@Tƙ7J]Ж=_:rW4؅32/̩zl-p \۟=ޭ;X S˓q֛=B@L7hT6m}G+a+zއx }1P" |56d6VkfwHP_U= M鹓cM` TPJU}[{h=֘-&+SG8M5ff#rׁM%x[guu_ Ɲf)gDSgK+\LT sFʗ&((8EH+@Upщy}xٛi4;=BpX^Wi )|xZhRP(5iB<&X_rTTPZ`҉i=gKbH=ee}LHљo ؘJ+~snŞٵ-օuir[ǓQPeh%'̕XÊ˗>fiJLaJF9ժcV'LpSt_U@Jy 1<$L,dXRp-E`k( HN+T>5hLzЦRV~}u{A53d\q4t8-K76%Lt1Exď)E6,}Llu:n. x Sh)fVʬǺwA _)';ƍ4~aY@3}J(^Qv1 6ىs4ئ31WN0s ZM` lx"eA0I >܁{zPީ&='7E~_C1X?Pql ?qM%`L3.,1 JZxq=Z"Fض>08]-VTSO9T2_]u^8Wh E)ND1E[$=k 2A4igq|g-$LE;٪RZvWx+{xTb{T׈<ٰی\).D!I : 3T]xCXI1/n%[f_> 'm=j!w;Hd"Rd!O&]-V4-ߑ"Ud+x) 13d}tZnҒj^>$C]!UiĘd!g6 LAcX+ۄD19AW$&+C¬ K*Pa n\S(N=oz8!$ijЎ2${v 4rʗTºhw 5b﹠nq(, =]F ]`(-(՛nL=`Sw<  /οpry*. Uu=3BGA#%4EWF49'y;% ;sNi[Eb1B@:PӅƓo  DbH Mde<Ԯ`zz.I Oϝ)y迨_9%4]2Z ˗ m?=鿀MkCW$2qWq oZcuQ׆>6)uwFP%xgvw}Uj1C]C}uXzG#5yGȃS7}awEjt*фYFxA(! ,`@o`H} @2,Ń/jȱ#_zII0LI@P8d͗*sɳϟ?}ci!Hop!LPqKWj9+ïUx!ɘf ZbĆlʝhOaY \Ħ3L*^n H0OOTL)3 S..Ӕ)P&,vR(\(0a *.t-WgW) tS`P2=;w. LHƷVK,?h-p1'_HV}Eo(DTUtQyTfc-@7@E56xSE) %TxB"!W!\㒔٥`pOf=))xa,Bh ߌSDp2x`Jwj&҅Tf]EJnNJQ4ܐɕ/PQUejS=NP皆N!ِ^UwG ɥʄ@R"7ꥺ1ܦN}HbtxVA ɨfƉk^d ;5[ҡ"P:FGEFVywKڸ撺)0H~1G0(]RHPM!,.H 4;UqEtlj~mM@NG, ZyE+/jp煵fKGwy+kpKLmv`7OS~(@ ,䋆<\ȽzN~*JL懦U|(UT{j LG巸b8+-u}ЃdS{w٤Kj 0[9^vށE~<ZÆe Inب]dPs2A5iyU#VMx*H1DΧ -$c7,*)r; L0ZQ tqzE)n0UO^^ 2vV~ 0 ;(Z9 2mjo濩5,b `b5d(UW\"ΗA!Br`S?L@"< g~;06M`:V./J{,qjX$42-N!P .pDL &hRTT ?d&f TTG/ZHd$$C됡+a+LD,()lHj$wR f%Bg5K0⽯ !G^Hy$Y,.x|sOH*y@^bVo~c"Ez iXq8s5"C6[@$ !DZ)]is3^ѱ )dwnٱ4-*da)uw:,&Zh?ߒ!ߖ CY})n!W{A(zz:ָåy(PhJ9#*T, ^1P+%9Z1[(h!,R4E\UU9jWSPA2^TL69cj{Wֻ֮n>*9B$T#7TN Qc.y$'iIHnV&v\BrX [da8P {`#t[|-^9YbM [t'v+GHN2.2ΚVucLz$D{xc9;*gWjݣd[~a2 G MZA]VS UGOJ+V46ֿdpGGRդti}ۜ[ UiJSC [1 U4CGIpVwC9b& 8ܢ *s85ma_[FsR .pKtv^PKX#VFܑ*7&wC% 㑁";QÜE#+RF8gz0oޭ(ݓf"+}n4w|,\m\ؐ&(}I!K,\$Mq!\6Ї CNO\d7(ŇZyݚ\ {$5^TTTwOFcn!ybb܆05w.x '̍(of}$2+LgPZɾXn[nÃwAGvs(v X4oq.ssglq}1v[ )%X{uwQasȂZ'ǀ0HJPx5ar-! ,p@`PH [PBK=(,F?IrcÒBrD @a,y@.'D8[5BEJP̧Pڜ95ɂ8qe?I ͸1ĥLMdUTݺ\!\Y E6b[a2Xiž? V&[L̥b[p.5"d&\}S/]%N@el*p6m^ t/ۉ 9<oMMa%sSXwSVm5!-ӧj=skRq3߽7nܺ!vXE-t=fo ƞUd?NxyǝgwFE+dL^|ugS]Id{\ŕtn[o8@Ud?wC?$SGfY/p݆q7wؑ]QVcB~ܽ8BUWMs= ۠ I]-f/mᤠvdIe.uqv-r)bXy$}q)=fۮR Pqa+nOgE Җ=Ti}"enmS]٢ʌ"(Gg=jyA@ +"*\Nhep_Ҧ +kFƞ VMzww-WHTJ(;S$i~]턷1aH Ttۚ;AQ՚yȧ? f?zlZ5l߂tWjYhg0hJN!ǚ"@"we{mkaFu :%_o9A` ԰F>SO]buzxw.OGa}{va+tky~O+oD*ǁj1 uv Y&%Y_ѓjf|1d(R"K=KBƵA6*@s VVc%l8]J@N`VL*^SAe{(dƥ84xܡ+\:=*P}Z>7s50*oFeti@ƴ DLأS9ٍOW%bF0 ̏k5FJ+^*'>T92Tejŵ$*hㆠb HS(^JX%FItGFj6tJƐ[ G@JƙB;Nfh Qv@h~Ll&Qh J"={CovjVT-8~G=yaTˍQjri⮓_JZ~1&3fhJd 6e0r쫠Tx&T)hjjz#fVZ³щ =KHFឡFqn#Hb2EM3\Ʊ1.i$SW4+ބ̀yO)3pHF $j]aC" *H1]uAKц6h|b[NBTіB*bjjOI |ov'z$nK(Cj Ba%QL3$17=}E~a. 2* z3ÙBUDX+#n>B+OSm K:]N0=n\/Jr` 3!S7lGISyLο`֒-F8N8 h-AsEsP8ΐ¸qkQqգgPU KN9ˊΰw!mB(| U<չ[ kuٿuE,֍ؒi'& u&}E]^Q t U (6F[s׿ |Vb,;\(bWG-Lٞ]mQOBI׭OaLpZO&g%Wtaf(*lj H*wnv@PGRʂɦɍm_[!"{:u}6 fq‚; ֧,v`LCƅh\D(tҦ #{Mo%ϩ`Zc=.)HON C%BŦݖ64 wv[p%HJg~$rR[d|O5Z{yE>:,{;@ȴ|sD?%[Ǽ.dW'E82p|G!H! ,0o_H*+- >Doŋ3jh#_=Hɓ >lp" aʓ8syΟ@O4QaїA9BJ*M6 6{%}saKYgj4^BjZsp?n (a-zy![ԲCa+v-ƺ=EWFS@APM0'mm -BPʧ'}_>hhbRTxW~! , p`H*Lx࿂ .@É3jܘPbE8 )I\r`J-r{'sɳϓ5knzϣ T*)ҧPJիDËƼJԮSxӚd2dܩ,2mSu32˔ l)5Obq=(vs[ O24e$\VlVhk Hj6뜷Zν-c4dS(@/-%l=)-"e W=Snxoָ_] $E[am!tH 8ڀ޹сPG{ r =d!wQtl4q#Sp/8c-@ }h"bdnt)/FX~DVR Q918])2BrQAqMMHʕ| _tyTHq&#S88lBw!N)ju:e$aHg*1fK]䊂VZ6UJ9K+ۉ%qFbgn]|+c=2kJ‰.u>DHڣּFd꾠;l-""=0l< V\t QgY.L@~prJ)q- ee6mmQ,Cj)T>+;,r)ji(M\5wY|1lSp;mhǍ4t$*(߆/elr{GNzgjߡdNt9ZԆ# M7ܰ;Dc {ĔJlݣ\[-MSF{{sJ}pj)|傺=1;"鎳_M~Ӈ/lO!dhZ= R iCq Bi;]&źam{X)7,7£]f.2ɡrO^"7%-JV1 tݞCMAN,H7Ҷa;[i^7tY2n.h^BHl[ \hE͖)jq_H).HAqޑ9g exR9ې$RlaVg7+.&1tGC Ciͷ]EzJ"IdRMA 2X'p=a9[y VΨjIU{'V8~S'1q#]&1(@YKePTP]*ymbK' NPL'FͨĒrNMDr: "nH&n Ca)|+G$lD٣dTHErE{c)a#i6ť9}&uhR=ht:Jh X3`{2r#0ūak,՞L̪Eu’.}aXAϴCPCύ+Bu#N-{.erPGy[l7,HuE]9B+ZA~s$!\͊,_8%6dL$ө⊘ZA3T|>]DQ i%:6͒Vlӹu3|̣&Ǭt|jNkinh(C\.{x#סO>A ZLHHOf]qj%ūXRjWrTxj_S9ceS}^+wCfXCv2uYWtA[ rFwera4sYgw1v"HGFՂ.Ffc}QyA!uiuVvWTw%&@~A7' AaWrFifC@7]7#(3"qt!yvx?"1ME'!B(9H臁sb2Ch!X! ,oH*\? >48@E 'II ˓0c,G \毁?mYṣHIA*JufŗW.mllYYHj-6%ݤFq/Mmm20a.N˸@[n7Lw[RukVi_Hf So)zk?9jzmɔ7߄!gDÃQ&ʷk7Lxr)kG0Þ2VdR#ߢVw3O-dH ڶ2nr|9J+a2OvlFqޅpQAh=jnmnHRYEs$TERVpjYvr EFyɕan`E.KDu8-"FrNAtY:5 Zl @ Ja!Av䏨#Nh&_A\H[WaRWuhTU}r5#"2PjzTVH棒q`Z\^Jeys jRuy*#rWEa]PRmqAV)2fQO8yqzgJVQR[TYn^/5lHaO,,WQJPkC(m-`g㙧s& h:+???Beq겖F=P?}=q)iea^םdz2LJ GhP-xYH-h^w@`\χN7 TmGuwZ 9E/Ⱦ |.4s+A /?έSk'T햗m/ۋ ſߨm>Le]PidxKTz2<&*jEéѬiC ZD@.! fw|T)$r*Wc!2g1 X?5u1Zj[@-h .f'Pk0Uh `FzQd 2Lpf3]ҼV mmT;6kE:|`5ŸRwR q)wҕ__!|.cl#F2hψL[ MCy + '@EPTiȀADAK: Dž RDR$(:m #4:8jڅg$d9hi/~,dG$㿶CQ^15.^C %*ц!PO|R-IBN6}3|/Өd neÞs*[P \F8W&|_@9s/.9{ ` ujDŜd'ЪR#BO_WJ=w(*\q #. $\[^=1fzkz(O{@"$qd)TTX@8y"ʊI[ \[bf#.E[Bg٘QA(MuE"9-bxLnGVp[f"R4tc.!O355ԂRS ҬXPTl\N[آIoxf?imby4Ftoa|?h $@a8N{ORӫO @ܣ9q7559k~1tψeۜj(](>fE;w֥S@#:q H?6]k VVq6;Yں(^ 2?N¡8E\?P&r3`ċL ?q[+_yעQG՟irv)]tkMnh-5I^+oכ[Q*fKQ |؎ڃʭ./)ps_ײUmPJl()jE kqT)\v9n;$͹qZY{< ]J抭[psG~rD`lx.)䍖=|GiO[!T2jjV5'xzJQzCf9ˏqbc[H|y!SXv[7R*0TT 81Clai$Gi__ZDeR35 67̷Dn2B;ӇZL e'#&jl&Oi(!RV;@'"ݓKцG6=}X@DD6ƦURHU^Kr+< v]ShEhAO5tCp2A{asXRa,˖bZ(md(We]z c9jRA6,B0ut('X87"(RtF'aa8BOe,*(.؊rP& ʼnBb؋GŊ VtZXh]^W7Xq7C@( V#3+SBX}Q2L0@AohHox$0k*Î3YrqncY8BBMhEU9Tu݈@xđS1}Q11R.I~4Y.(hgAI:Bӓ@1BEWGLٔNY*! ,pH*\ȰÆ @VdZWÏ CI`Ćh %KʜIfB_p ERVjذ%=\ʴØSJ0e՗PjuɁnECѳ>+ʶ-ȬmJ]R O[]lЗ]aUVܸ2߯< <-gt_+!۝%NHD2Y ߋZխZmNmYK3Fh8nvc[a]|u\1a^P[-IhWYcn A5Y?)'PEfw[tٙ &Ti>gEm'$&㨣I'M%|Rt_W[C`6QvJTPlAanҙuaN^:RD5*+7’=x%TA.Xި~)Qu t$F"P^T 6Tdi*o"ZZ diR@[js 3(^JM%P t]+#V ?- Tۢ*YslN僚a[Qskp?))]nq.NK"x^ؐh5T$/…%;@,alIzor@Ķ^qDžt"Z bzljbR@,p~CCM2賣 FH^拕z-X_,[BjMyPbݤ-peWhP+)(P|7yV)=|aZETڧKfqTCЯb2DKrIVG nAݕLԬbGRӤ0k iIϴ2,/Baa"+-W={6w6ReoʥcSZN ~Աl,+B>҇' #w'TO Q)KiQ/3$M3,DO^vq{FwWZeU[F+.8W+jk mlmdžUryh5PY  ^fn YfmdAR VL풙Mj Ʊ=4iОp>㠳‚j \4ͲjM'f:LpCqz+c5Q1hOGY6mF2'Ɛ]1pQ):ǐ ol[HY7i_x0LvR*5VA83Q_[(\_!YB}qFOV*1Q Ty^ 4"a@NQ#Y8R!@rZEqElVO{3c6tK܆:N)0wQ4GazӔ+G]W qIakBW\dP+3?Wc!F\P8vrmbQT_Qq1z$}Vz/hOOd2G [W~-4SgkYJT Ā[bu']bGGA:UaZB([HMLEB<*G$]P^ SHvqo(U/TGΆ[ՁoȊ&87a >A@d灔p:mH[GS#OuZhq0h d5I)<7$("x@af#q~yoHZ&Q7"$Ҍ58iWc.vpmxRT h]eg?Bkff#7/"l3c:s( W)8 R*ۓ7 2)"!Ғ6~]PKR 3dX-(#LhL=ƒ]IUYmF}a@ys^9F/XV([JxY$#:U`XؗmhhF?Cхg"$aj)\ci]ahBh)S™nGm򒬉H؁! ,H*\ȰÇ AHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sVwΟ'mi(УH*M(tSFJ(4*_CjhU+R^uf-l X$lAٹMZ} Z ic+{|k mwpe*D,h+vCߵhgZ]li6htM[-mýYZ.fu\ۂl1^Ȑ/6[k̖ӥYN<k3jȥw=gIŞ-d,foRhVp~dU4U&XZXq6ЅUvdx-m cveU6g@7 $ԅ>Ue-2jZA[jdZX"A9fePSe(]Ȣh9tal=*?Xae=$)Xxl)(JV7$B{doRt8&:b|IцRt~@b_(yWb_d[A׋JhlYsIHPŧ|[G+_Ug+rN٥b8jLvih )f=[i,]"ZU?vЫ@eKFEdhzQf @+hY28֥XPW Y3ZUێEq5dz0n o b1l^cr`[1DcJ%hKY[z K{lb{c?]][z2%ls%yY -[.R]һ$v,ɶJ,kTB;T-?p_{]-/tjЕVZɆM2u3]虪|V󅕞"gthl=当sV.FeWe7 2QLK' X}!jkPR++RuZױmkޣ)&Ę|@ӯ|RwQnyK_,,48&Pjzh@81pI7nnAĒB:qkE=h _NZ[oGMʤ@1%;V  MEr{_G56 C؂sTD bƔnXIl PrSK$a&pĐ$-c #>#٣?D'Ճb4AeN #6Ob0aOuvqfc DɂqS[Km.8)n@n CR!Dln_K<XU4'P<`Sq96-f˘4I ==Ke+!gdYH V4e.w:-]?OIQtvwR!2H="1 6i$}*r4/MԨNXIWwMK;a]:2=^j!EZe2>LN`*]ݹ;z,WJj[C=3|7{/-skpG56n Gh 4lC^V6ɐeQoCޥE0(ry&bQ} a"~B (sR0H"^H44i!mxt7*@L/#}3 cY,f !ŷahKٵ,I3%VzIEGEz:yD 80XfY"Ae!M*p~R\5UoWv8c2%Dd :vde7_jac7#r>P_B9ujk/@ *R^o~ 4Fm0#Y~=o4l2,2DfH4ri%s7q4b*U%(A N(s5B3dAaCpq43g REwc%9eA[+Xufe5Ka 6dLh .DzO`3%dacy Xd\22XD!{"dOt7`tEC)7x B1gWmAW,f?TUmcF3vI~cb{CB&C0Y4M8ETHQ/ 2hbrIXPh1''*FaoGC$O6cPh%Qxq#6.ZP9a yuU_rB(.A(m#AxzXD !+D#o1!fiWAiuYfwU(&$(Xl&k,7[@-Q"Wٓ BJwI09y ٟd8m9VTWJhxJgJTV =bu21G(72H JX!JZc@5:}!"(% j1Y8Q!89ZGfX,j٤P*&a! ,pH*\ȰC" /0"'Ǐ C,-(ی\ɲˑ`k-7sB8ϟ@CE H7m%bŠPJ=TNX/aϩ`~e HSpNP'ݜcn5*o_VG0"{{]ԫǷ#WhNH)V+n5wCo5ŃQ^i˖  ް/ڻ}ص 8j5B .JHYY6Fy)E߽.@z+jU7_? A֊gIphnob/hKD qDKL]8Uxv ƨ@,h٧bX֕4|H|ϵ;ND*-S!%QiNQƕ ိxMi.MdHRNi\oKt޾m$.U-3@8 jtV[KN%i=`H_B"%\h-tŀvafm-Î%Wd&8Pg+/\lF+!=T"x1cʸq`ZMjiWK/l<+⏇Drl91v/d +B@ +R ))8bl|=hz՗KZWmtwc#s[&D U} >T ?.%ZUN֚v0 67=A Jjخd C0z ҕl hÞ 3P |$"BT%[- GeL+5T:ĊRCrJ f)tEcTD{06nq k4;tXHDА⽅p x1UԼ jU^S Ւ 2P~OTt$=! G yO.qLl?o"[8TRmpCe^vxK0EЀM) uFNq4 "Ҥw_(L!d,'sAN V1:߫ԨQ~V`,ݜ /Tș0i 0WD(\E n",n#VQp hCjQc +@XC R mЮ c@6=m(RΈ[l"xKSm袢\@bZiACY_z+ gwV/& S429 ĆHA'׶^[4Y%'z3z !KeAtHjAh@لZѰI[xMmNd>s=m]†'Vnګl@NJ7h؁~p%+zuJ6>KJnz ZT^ԨhL٣_ Ha PWfbmeJLS4&KC28m)˿ܠ9gW)R4X6"+ziH424 qWݫ &:ɧU-JQ_lsa7_f7Bġ>BUeugJy_@j!{*oDe6v$v(Ԝ&9X{L79$ ~&h"ۑQ6@4Vi &W20K1LcMsV8je#l÷'vN{&Bљ,ٽmG g'Ժ|13QKcHz:w$sbm^ F,8o=%"{f<c.31ϗ!ev2j S!Ÿ]u[> fnnt_z2Zԁ?uj$NUw5 MZ OJOg_wwx2+r/r7!KN}4qEvr%+h'imwAoAuTEda|R7"3$HN`zdL+do'sAejiQ(#:)* ű R0rx3e(Cy2.;gJwU7XT-oR8]g$pmi "va9€/ &W9#NS@w>'uA0!!GbZqB Ue'PC$&=c_+.M@jR]PVNjQDWʱ&08.Y);g+^aBGŖGL235^FW '9e-+h71(5?s#\4+Ăqd8 QzkV T$[S$Q8$v(fP~36Cpd0O1hx1d!1cWa.vad X>?dP+c^QAg1% ;vuІ$J #.& B,C]Ba~pF66Q&)!Sp|bum/}c#~v#}W*fD+V&׃@T\#|m-"w:!t" wpq+!gdъY3jPo#T=$0# 4Z+QAx,{YYAB5$89X gY8Y[x|_[1b7G1KD>(dF9ᐈ5$h9hR<>I/*t'([;zy_5aFFu?liG_ș* n8R[#!V=3AE;4SG5RrbS ^T1J bkViQhzcœyWҟ::t)MMA[e 20너gJ FtM[ Ir. B:B*K#!i%Ӈ-AZHs!Siq蹟ibu2m0d@/$q")|4u a)nj'xe>w*m\DtV9gA'g\ꪺ'2\c\\'vv:Po/|BK-8ޏ uI-Ԣ=_ۊ-R8-04!#gzKVh Dڑ容lab2x}G!S5l6F io.jQ-t B6\ VטhP꣠9e'1jT{_OX3}L7Z'(̪XV)D] uAf1ȍGf d(B$"0ɫ 3E\0R!Dj!s6h"( —wَ=>IFjC&]dH*#_m&BR% =P7GOd=1JJQ|`7PB#$/,!zT7*s>)[0A5IX_ *#7}Hj;H`h?O~εNu&EG&u9=2NqnPs\"K O3 6(JlU_tjeRŊ:N#{}F)`Zhu@ CHؑ4וƠq=w!X`L)1ahIEFyw2<#Z걟`#Nw(zЌe7QEuws{xGR¯-Lhy`y@9߫Uؒ!D/:ۘt*f3xwz ^T4ˣ!m<谶0uL2:bY"dɍw+hI2U\5#&o-L-¯zhd5/Qztz/u&I~w=sT&e&#Z/֤]޷h|r[TsKsf']M@ +Mwm].0yG3++׷ ZN,2<);ns9uJ4+5:"OD-,E\#1S4 GmST6IF1\qkQJ5[Ɣruфm!L1|نA|JV7w*r'V7k#u<*H4Fr"xG"]Hz5 qgQ@ait<7WMJxc*'*hSw@ [ @8R'gwu?f}VIeU.8QiIOHF-^ wX!a'4/'z2!wO=dy$p @{8rU:4Vn8 0%E5*F0[.h_+2xX,`'t2 Ap&rm`tc^)S |Xk7ۑ'yb{QH!ۈEA^ (x>xl۲C$2ȍ1hPQKBelȂ8u`JdjbaV'V&>[ۈ_O]Ч#`B ~T(`²3sai3قG'r<N>G4qԢtڠkA͞Gtv^ol/A!(SʇxUɧS'{?Rvl2 ׭tBw|قͨGRD{ȂLMmn`NҚEHXWCs&B .cc&_xzt/d;D@ &Aye< Z_O @4E{rJ!-t6H;>*qqȄ^XezLGf"ъQtfGY]GUYL2zAj/"qAJ (6Rb$Æ4K@4i#0[؄D'-fg5;HLA/jѫ5#0 Hzp@ d?t@E6REP QYPevEI ʻ%A%MJcrhQ,GL 1}1 $Ai!Бߜ{D 3ĩway/'@T?&BsY2Im9TTIM}dJ(P?\#mQ[(BQ_*^ɢ r B@{˫Pȿ2*ET3vO3Nq@dkSld֫B~ZHr&pŎЗXF"1Աbےn3CP*Y{B)),TW5؜J%ZN~*BNx>6D9,@DNEkY'1T`)*{D SFq[U -liHVQ|96LfbK \weLG*7T-g(%hCgZ* *RkBTP6a^U \I,!mZ9=hlKFRv#2LQ\HtIHEq dQ:m2,ks\בGID2u[JH5bX"p9ׂq#mY˃~"<{ **u4N_΂dtmhCvȧQDt_1AD`DM.bTP4襑ȱ.]c{Ǹ&esD/R-^dABLKZ(xRKJR:o덨rc/NTDHGy;vr*>/O+DlVJdXE<;AVA1xierT"@KM!*bӄ:ζ;eS9n_:!q0gژdU]t Rrs9k DS&y"l-h^vDņzD^!RGEnѭj1Pz^fuyզ+RDC_5mLbq_E%k)n_^*wķRN(U9$oo\'eR$^% ]1$@ vz!r+b@%ff^Z.=b:g5q"60 'efnSi$-(VpbňA4R`AwЃ9) iZ[`Ee+ d v89(Mˁ^%f"׋"*>tyB'Rk 24wSF/kYpw$4S}u5Tb!444; DjQZNgi>UQz'4F}h%xH} @`Ub"y+V8xKr#Â*BF=AL~vs"{Y:bP b64ՄE #Yt:V.b~B$q[c=tauQGB5yrYy*RQu8!׆"<Kg2S(Ugw$sޗ84-E6p4-XfF[@HC [╷@/W2lkakIoGS9P<eF۲B5w'VYateJh%'u (|$W[DtDcX%2;ešؖ#tij9_1Vh;uzt'FrWeiĔ ~b}4*YFd)v[QVFs$9Csw'i!jR5!%l="R4dF0sz/%cpqbC!Jw4iMQWC% a)IkAsD$%)nfYQY4B韫 ZIY}aMvymP*QRSĕF藳6_2" BkE$=KT"t|Cp=f%ptK rd#JH[ij&ENOhIbls#|7TFc 2NGQ!QdYB$7tC>blow`r/B$B@u2M.xP;Z v 1 u  {J>G&+4R?YVA Xu:W!BaGY:)sRvv' byiDʹ.?D$0TxqLT'Y$ d1g"7e-4$ROeZ;2348f^|uYlF9Nҙ T}RW R1X@'F7bl%wBT”KDa)x"RHu+>#b"b9ǧJYcr{P,.~)b9ywblz,fUF09s ϛe'VrjP+Y$ŭvR*nml]ۦ۩ 5Q=R"1S]}ݗl)! ,H*\ȰÇm `Ł޻|ĸq$ē(S\2ł  ǖ8sܙ"ł?H}; #сOJՓZ!ժԫ`Ê;R6ZDhɠEØ:ݰ4i*,"2+w+FACGY%e~PŠCOVi Q %h/hѐZ!KI&l:`Z'./{2He:V1WRR_8ك<03yIJ utg/hf+đ{Ug |r_VGeg9Yghw2 o UOdOET=hb4'W<&ɐta.Br/ beAԚ'%`?KZahTAOn-^HP @q晧]צBcЩii#)nvOkRWFIM"WfjaҡEq)BcRs!U⭯'G"h@rG%wq$m`o K:hVy 'Xt߄aHb{=x FTM$/hbb}AF:w=jH?Tm:OԺw–_c(kSs|k=Vւ䮽Z: &!S +q2ƢmaS-6c[m"R-4TFun1g̏E ꫆y3ӵbh V+&`j= [oT+ $↋9EMmuA :͵5;\t?h+ܮ?Zyo/L Բ[D ]*pWdHM~4AH@CQJHz_Ʋ +`M!t!P0BXT,D_a )E! o<]@tz 6l" "? pd 5 J45c`vzA cQ e)ȴ69j8RC*ҊQTZa/ t=j50L-Z1l/|L Iq4GZ8RP5F5Pt~yfR{cr sg?:%& PTKHED!j(@HRLQ.-`:D`H@>f@o*H _x2S jBNzڐ_Å{`s;=4O@0eA ZZM!%>Ӳ1h`J2uZ@81 $fS6G]sVi~p MUԥcNAru&VB%iyOWPf7Qקrqwchڰ|kzFbCKP17uT(G+ ʣ$m'|ь#YbhS)cYwCL?ti`2DХKi$Y,ma+)Z<|b3Zo:b (1tDO XGEZA g ߻edŕmPp-5UB*N 0 |X!@ |HeL^3b]6_7MZRVTI )0&XǕSKKz*N<Zb tz YH-T&=OmAKOx':ɪh);Qr<()Z xdҡ|E':M^B!wdz^\j\L`b?O% #7>:WvQpeAh&OZ%b1%$2=M]$ ^M޹DAoQ1MK7wR(eQ 7,hLRNoYa:F9V>I+ĺS6v䰹hq1&rZM4EHJI)ZZ`TP 8w29ݽ}bjr "Hԃ)==_ѢH ;cj% $b'v5ǪoKB+O$i^( ɋx)HpZ$V!<&Gm-ԁ^JyGmn( $'G+-s\z[ha EFH73ų}tGMn wZa|I,S ki2G`v|PPO@!JauV0YFB4'Z%!?` F.B 7"v#b4prjI6bB;kugBOFXU ]>i\}U,%b@P`Lb&QsIe{Af1f23g& @'Mj-uz ufLwds(>r5#w&E^ZPa R5ou]$m[0u\qq'tz&g/D 3qo:޵bexB'axx;, `C-!.Dvd6]CA\d~p 2>J1!$٢P.By `zHhIJBwkׇ[kO0bDKoGcPE97].iMZ5tSeimJRZb?]+$,thr8j A': W.%6xc9J!Kt [_bIHqD'FkF4Pӆx7iis;O w7 5;k[!S掫fbw :cNz_"Zq}Jt/<[62Z(CJ\_t#88VPhYX|pUb0IMSI` R]b J[@"$8PytbE kkffl+LiWa$vScY5XqgRRgEaiGsJD9 T \-v"YD5pKXaTi>I 1bneYv6b]jeGk3rR&HO7C v~f"?ufXU \A`B(j`s.Z63 pW6Br0,b nPR/!u:F3bq_SUf6= RUPRESE$PE|'6c}2m)q>bFhU,b!Nd^4U^V !IWD)dVkG8r{vG:bu/Ch/, KA OՁ1ԓ@d7)##)TN7<&UjZG$ȧwkq7vE@(I3ٕc2֧#[Ւ5`fpH#}|ҥ B-w )(1ɞz=bz(ƇFc^5EH&0BZ ү2?G!tPI`>^`H "}ZNbJZxX2s&J `^!Z@*!9T6 ^g{3q1c]Jk`#P9$oGl{0ً/2bJjb~v9"8QB}'#EoǤ!r0Ji+Q2J6 UՒ:Vb ;R-e/ƒm~bC%QƱ 7>Se& 4Rq&'Hс!/)!"rlrgLs4 A+/ g m`c@c1eƻě*!F[q R"hyH\c(mz-'4!-Jw@ϒA?RèѾO?RCk?',vt'@r';3D1N6v4Jf9tҥ32A=SY[k5!p&0u#=!zin(e6!²h=f<\,a F Zec ug(`ǫ{x)$ynJq#72%clw(P` 7 Lsr/HWfZNC^C B4 k0 v1|qs>3e)NH2J!KģEW"RSTU(ki$+ d>q)u9/15d,H5gS5uX e5jX 30W:ƁIGuxH}W|j I"x;TYc*aPaGH{Wn\67Ddp|\vȪF@J+ĞwO}񟲲XQpk"##'ϲC bpsxKY7ȾaA.cmmJ ̲F Iڦ<(A3uh89뼃gWd۴;j6 jѿZre_Wd@jVh}=c`Û"X P\_}>Ϫ&+$QGOa 񢶐 qb(Tjc-MB`-PU SdBNE-]~b:mˣ%MsaǿD$BS22tO.^TZ۬ 7][+$({E7QY* ."6<+ȉ >E+}H4(/ >N79R|z*-B*&xhn1q(%R{+ëTYQgwO4Sw0S|0Zf(#'+OI3J"<{a"{QĹMoSkX {OęYT vGQ%Ѵ *q! ,H*\ȰÇ#1JȱǏ CIɓ(Cr@SʜI&_6sܹ%ϟ@ JȘ/Y)FJJUq*dׯ3Ki{ BMZ۴n%Lx/8QZ3~y@+Y2dE3jK ?g $-s?{je,zv0jݲg XްdB"By5&N=޾}2[C5hةR'|wȠOf^'b~͚7l{fwVw{5BhA]MiV/"r$f1,Zeކ ْL(aYґ0΅--y'^-E8PA&f3YLzGa)$]MD"(lCQk.ұ aSif[|1h('?x9i+IdEڳgp]w ڤ~xT'F-*@i$5'E Xwl墭r-ȥ/)㴔݉lMoןͶZt&lxWdV}>17]Aix潸2h˃RȜҋRo܆Ӑ/Sog9Xjx݉Z1epUWǍlf8VH(qI W,ƻieJ>cm3T޲ bX|B֋-2#u tLCayb-q.e)_Zh%SuP\s@A 1:FZ+:#1P )dҊ}τp ̉YvBzwY7FG*4hL[QZc$OtsbHѨU6%Ĝz$_/bx+ sh OtU] C+@PO#uoG.pR(#ncVsRt r:hw8 $j:4ꜟ֛F >_|% <z Rp g ~,}XYZ=CCiŕn*Z`:nz6ZʲYdqdWlRF[/AdVI[dbw7eRf/uw3.dn?05]L+"߆|x+>52D˿z&sPBqA{h}׍s}Ca@t7In*yfJE^A9bdݦd8vec` yMrYBr\)(L' ?2ҼvFֈlTV50@$6D轴 E98<VJмlTzώ%_=H]ouPEFc݆=!!LvQMǀxvU[&:n(!~"]bF?E{{|l0 ҧ g m0gF=fg^~0M7QPTS"16#`W̄<@XJZJE7?N %#/:QWη^x!A=I!M.+c#fCL.Q#4E'(eya$Rn$劮M&m EhBduQXCыx(KZѣ b1ZNS UOwPjo}E9#%ޒ_isf"Rc@ w8 # g:Lě5e[Bk[V8HZ..sk<1= @5c:.Z\4z,\p`mn("+3L!uS$Fv?/2i2E1k(#y'Bo{.0Bك+[W{+ QZRVSg7=&:sw5+B7})Q2D+A$>z"u+Eҩ\9]ZbI!Pf3˙@+}iA g[z40wq[W,LmbOBtq82KZPe50A,v u@c`ṙdsKt<S*4؆~I.[];Z5u1 6PՈIumpA%K? bsrf|#=NB )*j*\+ d!!P}?X/6e!Bg$-Fg<{h"7\D!T8 Cɵt!:ڇ'=.L=i%Y[s^]d$[Ȳ rcpZgp-yBC:7 "6w'wyVy,SNcܭh'ב90>eHôMR="vWC!= O3l⣽R+GfwC&l`':c.4h& )(2iƥMM/ B) $up9k@#2qFk(eIG)ƆFme=[Pz[q$#>VER>Ďk챧~Ǜ[c$k$ti-UwL cږQ ߫`:Ȧg3\Bo4ԁen&P+"TqJ/Qv! /z3b.eZ$ `fe02{3S'O|K-MUV5Huh SMq):or*G.!L 3%Horzh3VoV-le7_>܍ܰJkƦ^kZ hgKXDcl'!#7'%K 1sTr}EU#!k(بo+! ,H*\ȰÇ#@ ޻'Ǐ CŁ&I\ɲˑČi`̗8s2%ϟ@r QH*iQaӥP|*A(n8ԯ`(ПWhӎ`F/OxYK_1Zƴ:goM #k`˘ &,"2 "dSef/-CD YK?ոզoCVJd ={cyUȳG۹ F \6[\=־8>vȓ f,l=w"@V^q=eYw(!b-{@і'qD[&7 u7`/Ɖ yV]([ -0@e@1F#W6&y֋/klԂ@&Ydye->_*ffUuղAa?&niLX&jZ_[)gYFt@Ŕ(іd8`'&NZy"她H[iODED*ݭfũ&o'd? WhZknUhLuy!. allv`LI'ZlgԞVY Dю^ɦau2Ɔ&TXXEOaI1d|l!PV]e;u{P=𪚆@EX,8u5F֥'zS-h[\^4WB$" Ƶ2he X`1i"+H cʕyE%&(Qm+G6^-V|;|fel:.jwK>QWYA`Ar Ju;:H(pdOZ8dr8Fi[L/ҿ}h^Kwol"bu(/SENygEBLj>Y`D=0q'> #lEV[K\"kk8KEf 6K8_Arك Z61ip֢٭ #AHyE=xH!KLš1.< V-p!T gT0 4ˠ,-Dcb"+]ZJB& D 4hGԉ3#X_@)]ږ:u7 c. fH0EϘv$=)N6b=[O:dTBNN:)Ep d 嶕93ThNy)~eVe9)M1Ìxtѝ|:7(jp,$VQ%})ATTD`_}ap>48@b 7`e]aMZt\ Xű 9{`q5) }XP/g鶾-(`dXYq<.U[0s4q(*Se _W3p흃;cA]b(>e AFVZa|UEA C[̫BNRA( X,Rœ}(i[XڛRVtVc͐bCL,d%{`\n9m/Y/ -]MxaF 0(xXJ4eC`%ZSV]5H{vlty",p='p3`-Sb7:Vk:DA7L$ǃJ[,ᐝ8S?"6l1QG|KME,AKgTq bSRiiyM,J̩̕ZA } SE c -e=5x 5b kJXR\@zT&i8(7mG&0N"֢&1 "E-СbMj1 +ڳ$beaٙ^a=\G9C,͵Abfg5L3EG^X2e06sQ*29Kv0/o 5JQteqyR akձ_wiRV ++y+2dr<Ԕ8# V:1z < X H_`2"ul`e^ ,DY,Di|N/Jk)6SG_&=4ϕ73BzㅯP%xLwQ[ ^sd+CtpfVaE5DT31KiIv^JH5q:b*T3B' sxƶ3 `hrn e~({FqEs!iVV:(`1HT/gqT[5E-Ē275!?囊~\ Z~B;35W0&c1Ah-o۵D '\YKƛm6HSvL5YrQ*lp2wIR^$rh2& TAk"IhH(Pk@3 4)|Ro0dm`5Q2vl8AY9'L['0@u`U dX6?!"AG' w#?'c(+#6#U%d?!ў>'1V.t%&dUV.QcPccS: g!uQBs/ 21"1CE&tAyY!Uow!9 U9jb8*ZPa1dq| buE'` Zy 1\Sy1`Hy!!6=0]fiTo'2"=H%|!(IP㦟7[t!m%V [ϒqd{Ju`Xy@9 9z!yT5(dB0v&Z%"[dq|@ J aq/I Vif:v&CM9"*a7q1gP5Weĵrgyª5YY{4 dkZ, bׯ _tHl6cY V6.e'A'Tq&3m s7Az'0h+ h{M+yb@ޣPZQ wQ8]j\Rs=K6! b0mrjqa{Q-)2ac H =YP#"}sR1[^q&!B "`IBt:x{Cjm#]R9:(ÁH5pD-TdD7^Ӂ "e vҥY6: r6_11BFۯw.e6aJdq}.ymA49S`ėD ~}xiCò>ͱVP04l{h~(tA1t+ iҤ+ս{e|Tjr G$ATrD%ԄЯԛ@Bm&>Hzv;H$] =!^+Hg#:k~J}"fQI^SĿrUPp1-!oRV_6QIE2\M)Nf(&bݷeB]hЬr9_O98 pu d^GS2Cr7A7F}Ȅwqq3U3eO`|=iKh/фOɳl.wݨpo_(uy5xE>ſ֡ko,ϤXx!! ,H*\ȰÇ#UٳACIɓ(\ɲ˗%o)/-(P̋0 JѣHH޽*JA*ʵzFaejA^Ӫ5/{Q{ѐ%CYTUyS+еT+YBdeǐ_RTLuȠCKJLŨ1(װwl!kZAҌM[hpY ^Zj-O?pv{h ~ ,#pgQ!W iׁ"e~ٳbL[ GxLVB˂YQA*@Jt=Жa-1 +|IT(O-%1loYAqZQO[yF:5F&Ui?X8nRQ j-ֵfbRY$P:&{]]b8gRJߏ@7\iAijOot:fnqiH#A˲cz<ȟұ1_nUӵD=9ndozS[;r-"4GPt!ZPsafUI kMOośVTYƦ"\=tw'((&)"a4 -lF͓b E6:ېoROm PX8D65 Gd[$Ƨg wReK g#ˏ7a&xb! o/St6B2jvrr~-ˬ~ף"ͩ?0ڡMF;o|YOnCA|\:U/s[f"<<3Bos!&kk()Ųb*c=$GI[R[J?ϧ2.1XfƐ"Qy&+HsMd 8D"|SL%]CpD.!*"Daғ{"|b I?5_$¨\[Vȼcb%Ј !ADŬ S b(p7SE77B9%21pVVl(VB?2<Z!PnmD*q )"떗 _t9)lӋ@ro#bσ2"QB0DIdX;)?Sgc7iuF ŚjAP1?l Za uXFeyedF!3,s&|ъi.s^b#-i M愜 )'r iOAb9س)p]#!j Z椶%zU @m-E?1q SvPx^D# ]3?udQ WSd8Zc e\g;>)1Og5,HJPB@s;3@Hc9,F$xsŰ KXqK ՔYXj`6p_\M{!]ȱp 㲸}' *)N$s n5H%8ԠT AꎏrûdW _u#قl B\ YD,r6 lRcKHsn2G,cCQz`Ib1Za.mKcv&׭`WZp?~QR7u$"'#QjV^'T^u03~A塁 ,SR#k3b`16Q(R!a.l}v$4C?I HToGhjSQ K t`W{f4SYlbm4#t k 7#u@m'cMb2Zq=A &R*Җ!Q"`QjR kRjn0 c6Z@ SVa&oRp4"3p7j73>aV =!aR S_9s@u9JN3WroA%=$;Gwdq~ 7hE{u/;KAY#hۃ*Z.CJov*1FGbG^ W.V `5>B|=qt?L#B#hq)4x[`G["@M*ha5$^?|<53ypԖbb06p:CE^Qsa/4?UYL|4ؖ(:cQ}h!3WD\ $KD"|Q2B5}*IMA.qp6I"Ix/q3١UJ*'1Շ}E^ Rf( w$ee>uXV('^`DgŊP,Sa&[ \)?Zya."1R6Owae !V/UvsɠZ6f!-;Qp{ 1"C1c7$Q}_JM$_NG,Zi.zj)i,# 1'7D[O*@ AD -"Py!&U ݶ4@a YE)#cl^a8)l6t`x |jot0Nåp |IC:SEmxMNWų5WQ mfbg*۴VPl:x!2CgcUrBvG>H- S eSbl3e)WYPQrpobثrZy3D^YԐ*tCE"f: ȥXQ8Z:(f#CE:" CD 9nڳQ ?,)obV>`f8n›cfxAX_u17Ι[bpR;(2pk7b`>:y|TD1Sٞ7KM#F+l0`ta#1wIJue+FB1WprEDB%, a ; }/A&A39'#~A 9 !H(r/o?Ba&jofRѕA =R1EHĹ`C w4r*q|Q1Yph'UȅGс/x#TwC צS2 !}M7NL60ipN83W5QbkM<,Z0o`Rcj8# tp1U!/2lhm']uAR+i7&£zs"UoFIQiu!X=6|}65c[+qqV2;EǽɱQ#VFũc98t3I a9Bhķ=%Fֿ#,A;\!< IJrw, 1H*Z|mkV|ڊ9y9>{ɇ};|GA6؜z!0 k.)XŒ]a {Qi;hHpqQHr@qʦc1&@1 G21!KzGlw$Q`[^AI@s&'ɟ PRxk( 1&K?+jxM5a$撒7C%})Fm)ڲG2"L:+: = hC .YXd&dE}w>w;$\ K6+Èp:T2%f @F@AYۙ1Un&s(hh"#3cN)OKG3j}72cC6G;)P@uYzāYҎvNWX^I}bQaxS)0:T#!o>}V1t\<3H %-v8RrR; aWsk@*:Tv ܙBjoyZ ah Q5+o?b=wNhE/7ˆcEKJ @`MPw!jp};ζa4!lZ@`W"!ic{5Qm"QjE h- k2<*D5Ma΄w[1Ԕq¡ :`U :FFL&#^Yf_o`,m.ҽ>Dx0N@~}'agZHݙC_[qap/_X! ,H*\ȰÇ"_&Ey(Lj(S\ɲK9{I͛83$?_(cŊs*]T)ƃXiMMj2iHҐ%C,"hy(׷p,: ""KVX纍KRmm@ǎj$RØ3;F {CG鬹ih>,ƶ'OM0|e ! s݊9WK쁍fqQ,[1hQ >6aPj&X`y^OV}tKXԽfPܓڃoFAbPsx "[fK=J=2HQ=R؇D>D1)P+dd!FZSE:8QRm]e=FAW_eQKPet43a9?$_E-u(Nj$@b}"@@l%Thrq xjwFYDA&:/4[lY񨭯g!;o٩)(Z,4@v`JPvz?m ymi -l"WN޺niDv4D9mZ]l*00J3=/T]l}oŧPw/p&%ؕcJvi0Hrf+PCKg0F/aG(gQ =3*?գ֬P&OcTJE PqUw }Ӂ+[h¶ 6=+AVǝ%?eO%I$9c4^׵ ?cAKRG9tQR}Ь3:2Vhgug T\dS{9dW&Re*h)#FzqzT{AdQLO{9Nd+tF-,th p!zZ4&2܋8ҦLm 3 r'R8 M"qd r/X?,L'# KOl1iNxCIޚ<#VA"~dC"T0dL$H(_2S^p[@Y,$t I,Z@bGv\(~EG=}# bd;ɤ.H|d2h8OvMb [@(-AmQ P&D4s2jI d2&ɢ-(i;MBJ$C?rSMm*hhi6`XYϥb*Q55n UȬ<@pnz5mhCgh-kҾGzG0=NU!NC-ҥc^9iU,?`qşz(i&ʘmFTQ~"5 S(Z!5_li6d+x׊ήc^1 B54TrXkrkyYhϲ~eY1ZqKK{6]@:"S(),R+3&_$jsIb%%GVb;FA74B@6/%|. stzSGg'76bA9F74}V7y?ȇ%@NDeB@udb{ $Oex6fEVy0fp@Η%g;hqda^1`Xd0VyVɓ|hx@x: 63)3,;fwבa^e)7?Y08҂dfp }^ 3vwyWHR>J(-W„!>Ց1jq]Rc'HbF9cɫyr)IQf"y7I' r|uW9ICutFjeEG<r1?}IH2]`rt'Iǫ-b)_{z}a*Iij AcPr#C_V_OH ;&‘xW),x*ar d!Lڢ! z[`D%i[w;[VPRs$ét'; siqFDys C'-պgy]s;ZUh23z;iHt()[`da3(~$FfbP5Y0&Z4jXjkn4Y4!r?#0.HJ.BNys0g-avhFv"|H&nd |,Mb2~.qbB/dy6&g73+c8:6%T y `UA~3&2$!UZ2[ pa+3gC"Wh#OO~iηJQE+FY2lZlFkI2R$bIGVliB~:wyF"DuWǔ3g0O^KdPO1ҩCz 3QGÄ91!@VFqf ,VSUĄuM1S|y`1Su9. |F\^|a( A0 $=${yuٶeI)LɃ%:ğ^ʅ'/+hqs+)|)wjZ;䷮e*ٚi +a29)a%+ 5[9'G ѯL+RP)`cpƎ97Y8Ӹ%g%mq0SSk n(m~ 4 5 k`"!%MZ:B H$F"0 JQRV kRMqX T׳ * V!Ws.óΘ%s'HmB-ggepc.##VVh"E]=kupL֔e u\l6;IX1X4$윛'-f'd6v,bD\eq<.4!rRZ9BL4#} ;eK +=L˻dAJNh8FEuMٵ 3bUb!YAQ̾pkt!1,8 E X/gꂔAȏdIՀ)=Ɗ06-:W aCUl,M(3}X[A$ufIo-Um! ,H*\ȰÇ,޻u/G 5П(S\ɲK$V4(_+|ɳϟ@!8qZjBL-$/NիXx+-jPVֳhb5:Z#0D eT˷ߖꍑa ad$j3^8-fE CM5 T-p5M'ۉ;` b3ڱZ 53Շ} 4 @:C1o @={:Dt!qnK; Wed'EP-Wt|QLRKm9j TVB԰.MXVr_/F6b+9z7tO;K%G *{܃k?߹[ NQKjI|3(ϥ\gCS7fu,@rg_R;1.,*x㛶Fo8YbEB&77,sj&9-ℤLWܺ``){fsbӆU] M bq$y1LZlfU=JEsXMTaL$2C-~-:55@V@['M_!@QŷxzBgXB+Q!A`Ag@Drq#pidED lV(!5tG1#|Bh-#;^"c M{% RP R%|42cu^71*cQ-)&>@jb JHWBac!c 4b!& kYk#kPM61R .`% OOt k Q3bt'ԋ=ж f0XOOb4%;grdwHo1]RTGu˱# fV8c1I5Z0 k`\o d= Z0In.fV2" \Qø1(5*%!L9vir+q<]HuAA=]BWdh2RcS`5D;Lum"cV8WitGGQ16~W+bfsy)e' dyuDbW}Gr||M$ٷ(n5tZcPN_26!E. 跓9bб2E%xh LW?FU aiD=nhѵp+t9!HeCt&@B* .zW|/d$`AdxbxyfbX{i&qHD,5( P}Sd'1BBPGbq1[hɕfc."F'L.:DXb.ekbRg/w@Zj BNgM_&cr&RlXd4)Iy*aaTG\;ueUTX`;.Ur%IJ!aြqbśpc tV|ɗ\ Y ؞u(buxF1h"`UiO+2JQV e~s؇ Q9AYD ֦˧{ fr@8 b@ x)8MWBwtwZHAi{8EFs9A ~! *k0 88#l@Jha& i5G$ "#OTubb0(+cpajZ@ U4&$"b0R.G-ţS(&"%5F_15j#pj4MS)21Jrsޡ>23qwc3gNGKeVY"C }u.9`v!% K~Yo]:b<ZEZY+t=z;w(I/傡FwyŭTQ}YGL1=|!Up(hb$)-%JCvX>q\ub$bFQelsTh+x8枇5Iˀ}d'-CutkbX$(:=9v]6WF7b hb4*HT?z_7wDy)k@gM(JtF I)u,чe (34zF?`K/x~eXX 7yw6)6 [0 U8x2*!t!TIEf%Y$k>֛A3!*\ۣZqQSUw; E)yQ(82i0S>cÝ1 XF1~a10H*Jb۲'/Y09`#<#ɣD>YQ51[|!5#4b0"aKe-"XDžv.a4'FI=?Bj&rhNj7仵s9ew6hC 9CmDn l Ѱe"҇ r=7T|qBu'>.J[>^[Fc遟X_/gg5q.f&蚢E)̛R!\Ճ,qrHx]Zpslp*g:l")M"Zf. +={9b`K{]Ң_1/:"bpmg)|l,B*"Ɵ dpS'@l|' x{ ۳q.ⶉA @ 0a cQLc!1` ŭ}c7f]BxSsKpG#Z"γdLY,qZ,vSڑQ8Fwb1D~R&ȳ<0LV|\=q8Zl1CM]JAw3-F"7W`|<.-9jV1ӗ#&[{\=?c.z"|vg/b@eAOF(!g& /Z,H+ݓSm7ምe/bq@tP"(]qTI"J\؟E)6k3yw@сIdZhe+FV lMT]ZD d#ed=^Y&g6dAoJa珱ņ||UZ5UUIcjL/#UFYsx d։)X`1UYhP rZ{VohFHhzڲ_Ŗ_ J0Aa VQA2e Uq5?T4]W\z 5IT>u-,wCP iٕW~%?qeImLG"G՝24, mX/ghN!*&H>.)#zÜ1pd Ar!d}IN ?=#`&QLdI##9,eS6$ /j!`[HX'a-Q$ߜ,$L k&%*g"F8*7d@PH,yl`EvZJR6A `8!QGK%H[Dll'+%\e VH-p"ªfi("6J8ш$3/L&b'`5/9+BZ( -Ԫ0ґEVf IV \/Pj)6"sGuE |.? R\'֩ k%B`SXzQa+) Z9'sXm*=UTW>7/&& BDT5x R$T j[c̲ co2]$D#d *SbХsT{2k ۩!sD+ hhW3&=s‡6 (TLiQXHz89BtrB$0p]j yP =d΋˳ !fWɳB淒 {疁t&0^,r1ՀB"9pKRF$ Jk 1bcE %={R]Dl)C2byY@/f0a k&2i%ь pa H" mԕ# nlJl00a`C:&M ^}"XE 5a F<bZJjir eӜgʉiLjlQ?U$FleQ?;] NB!ֲJDxV!(ƒPZo@%1ԣ+HŠ L˒9JY"@nsc$wXVm4‰fX 9TnA!j/.֬+u>דF2 {WM "Hhw9m*9A,b mI\j#HݭUet?2c6Rk($}ҮX7Xqh)Q^"vLNvHV9dR9*yh-Jf] y f-|6MP{IEE| "{ T\}ŲlIWTl!!k0(f,;u$d?U8gf#7*E޳"EzG: ^`>u;c~0{^#ccQ&'Dhh%C5?F4Rա)?@F8Zk8!4ef.^13J@oB: ktY𵅃S:N޶ 9H]j ibb kg[ۇKP R6A'"$ m~T3$4/u H *b0mXWj @MAnD;($"RIYis"f!(Ȁ8IJ'br:ӵ)8]" {G4AU}[C[D` W7dfK2u+'thg{i@ vǂ-l&:5>Q7Fb\!G;apWuׂ?΁y}q,cײzSv6A?tZ5/vMS';XW/r2TA$#MUy"YR9EAy4`k92Jۗ"Ti`l!i65 kٖGfTb V~$EU1W&tĥ ёy-9dbXB+ӔT7ً*E A}d1Ec&W<,;4RNcgIBr51 fb&CSV\q4( `IQk^äxse(C%npo7Fr19qq= |c3ʁ$dm#)tcg-)){U;^9x5M[/%$bAC`G!7RsdgGZmf{ŦbAÆAMT ?בJsVȁ{ ! RuPDj$k?T![O4YeW!] C8.)u! AMin;9FZ <'Ԩ[R%zruQHm䡭*Ԛig94'F~e5 cCf`Fb^!+/|*H D#QςALࢶhNW"(* X$++nzΑ@ BG#0D3jfxUAZciO$(f`"!Ra7Z0w#!S>jm%bG)  T1Q P ˁN ǧt q$DH#QX -Š+Ub{Xjpkt ө}2,דNG''Q$ aF4! zMW"T2Y!C3BQJf\%REQl%0%ʹ!_k1u)1K@;xZ$8|WgY+j?b-C=vH)DLIQI\gK-K)!%|YKVyQ5taQc@$"u%GJ1O_ !̷;;I\vl5+ݴ)0=),ƙyY@%1&18IE##ӈ}Jc#\p2la&6Mr@`ꊬ(ʤM5b /F}Rq`=6ҵZ 17tٱG4q^nFK^"Q1q)е Wk GZu"+z!^Z>e~[ 'un6FI%6ݞ^![~R~0 d|[jU"^|66oqZidVqQx!zeq_@6NcB4-hrK;1)1DZ{|mKR 4]Od2Y8461-\uBL"rM#7q&6a-DEi^eBz+! ,H*\ȰÇh{l!G4 ˞ȁ"\ɲ˗0 hQ̎Ң1@LѣH68ֽ9&C68ē*KYf@[!zݻJgrjLSdc_MN]̸1₊ @Çk|WD"Y! 7˘33$w/װUOB-WͻXm71Z3HyRcJN=k,O&( -)pvY .i t6;|r!FWhtV2Ѥ` :-k$FP!n fX^)LdOJ)U=\STJΔ@D%Q-Z'c"@Dt8v!h/ȐPGtD_*5P\b#G v)K3PYP(PsfB?IH*.c#FeQB@FT(v|5j|fu2hyVFWFTVg 9ko)qY"TuaEPz&HՑ GuWZH5S`SQ6u,Jf"0 WB ⦵Ճ0jAˈ D Qa [$F i>Fדc*fPWi]qVRܸ)TAAws]adXhApia+|!d&) e[KsJc\J@nS ,P[dBiKe~B%K!*iw5jTjEI*錻$ii &ԊE!8 $-A[DJta[VQhdѯlo{$r- ]UYWp (bE$Mڒ  0۟!rM'bH$D4zȅ =mkXdBctUYz LF fы~,* ʉ;J"DQIĐ8LMpe6 )'-LӐ 5Q uA(tU 9kH56,N O ,wi!^BL_er q$bPMڂ0oCLe)^;_g?IBOv5/W"<Q-D2YH98M ,KS07] BZK/GM=9OP?gp $MaMT )=ݎ"X54o!ei3 P1wSH{ J L8/? :qbA3hܺDb*b7%ʐD~ˆ\>ruFW=*;E J%nXrƍwhEA=DRn|R䧸b#R†a(C4r krO2ZM[xҏZ´`U5 MAIхEZr pdx AA S(ZSb@q`F u\LcjVZv+T31azX۩ļ R#n&Y*c)ٮí8GS!q17 GveiGKhaw!|TN"W/߂'X#Xa`gXzP20d1Z{,gnOur-o? j昕>!HpDRpTiߌi|=Hh90NiHs] ggMS~:08$({fl[{hTw[WgT^D,?"@,l'ۃ۹ fHPjzY4dM*pipmdtšUhsPT ;Vc<28f︊rmK(fP6"{5QQ4R p^8`l` F ݔ&@ Xaze1K]1-ӌ 7J0|{0 @ 2Q P+MI!u.svSs fFWZ5! 3v cu;ڷqRK1#vo41$t`;paAXtx"% 9&xt>/a ] q5qPDzQlyA'3$]x(j[7"e'AuV=1rj+y. HQr) "BhG怪ho]IDP}Hry%V{SmIrJ*Fb`TWwAAUjBZ<6`jTA%7Hy!cX]3D#Nβ)VIu wS=~&zZCsu'wEZ{&[-!kWZaiRJ { 5=w]OwgP1t5b` x8sߨCr4rG V:NX(Hpy mM\ , V `9 Q^zIė7qYb᪇j4'6&'I |h%4r7l 2ٯhb ;1<9iF1/LR9fGcr)QSr;~#nubh"EVzWo!MgAapX a+?jZ+ UR@5.&&ucYT"c62:wQJ: ARhtEj$5 ިϩ HbR؆$Tlx:cAKxvl4kZy8wn.3"Yu+2)J?Ye%e!e(98N%^^U(zMF`Uղ5KW^zxd_ ! b$jP[* eJb 0Y*['WHFJj -@[pl0l%Mᘴ?[2/k:4;4z@[0 6j%'Dc@);>g{Rq]jYZFӽ e Q"BVi0F]VkPZIVM-+a圎 YA!븓^gе@+nѤB! :Krb V>d񐑙7!a>է^5"ꦄ93_l|qҼ!Vɀwq5 ,<A!+@8<)!BAD` }G|(AK~ y3r-1GK  AΔBUu^! `.OvQDŭ$$Ӆ.F)͎%Ď*Gs˩l 1*jˌ ^C 5! CsE$Xة!r8*Q h`9\x!rW^ {䓜[N "*V+;8 HdCEZ  )O|K bO\YH Egl_KPHD<(>b/db<)/Zɐ ^?A,+Qpɩ6AGUv0Œ8IĞ)u0Q<'TXdUAыLY8#AjT(dYXq=#WrĆ#Z.&VYHiP֬&B\-,"Y%$=̙p$Af, *ڢm&{;ꤨMP;aYP+ !p:4҇OTaf`my~!!hZ]`2c%Cpud&gAY݄#|@1S US: zIq3@L@%ip<4'c2iA^e'Ê:/N42*!]dac.@V]XiE{"De":'ќe'~@x׵H${bF>y #]G4b]FDY\6.acZ[oLpB0'"Bk=I00(*l2c76DC"P<@&f&8j d-/ElYRЀꑟaj{-6o\(rCg46 {axc5 Q8&QGHVZ(VS-RBVe8eIf0Zp]D̼O'v6z$6d2&qAcCy -.~%A9B✜xiAbׇ8t!r6{[gn8/ۺDpCONgawT困7aP ֡Ea"z|oq^Y?,?▄ڲf;Bށ9l_D`<~fub~"1p - ;d&E'GÕ=dD+ټ =nߖ|FpA d'1S)#swt}O%7<a]*1?{~b5gd"Lǂz-|gT$/5nWƑK?ܑZ6f[\K|`==>}-4NpK<_EeIYGhhh`UA2ԂY$цVGM$`0"SA34#^VR?QjafV{5 '!YK+ TmNWAJU(&F# vU'mh iN]Piea\~m֝:XgNZw4EzUB o~e|^JAd,'k"i+`F*N%n}֘(l izRPZ`\ARlvD3bcn ;G:(oiXwYQ@"Bk+ٶ@-:P mslaszj tD}\be)c:F}…_`yJYߥj77=ԼrJ*m;tՊ#b[% ZXpٻsfҌ5JUƞit1'u-{J]6bsđmL#y9EeQG]eb/ܢjec{3w T;~ ZU!k0fԏk$)BlH&k_ W.ԑkgbOZTHG5#K]_=AニXqLb@+c]4 UT yMO(2Pz^WӉSWh^S4+z>^vK`^yBfF:x^N4@P/I0`823Nh,5[[!*6Q٢Wo4%)8-@LS xxQ@3EB#Ff!bqkԦu*狵fg6NBIe7AD}{>ig.SL,KbTdr+s)іB g8D<ŧ0q4`D L D k(A&u65Epfyff| >bW7"2b*2C2D/C QDy))ied$}<2txP&M؏92eZ8"655EP8Y])!eCTJe6uq))!$hsc,ftN:_nyBBr{1EEYJs$ZvÀȈj53@Pw=kk8y⇑њCIR7tou?=`)k4ni a]w h6Ep'~sp/8Xb)AF!o=:‡6q$#BS^qgMjxg'IHN7H5 uvt=&9a&E q(px98h8cS'Sw3Q 9Xr$U>ti]ԤkI2{VP-9oqA7ux+sh4BD!$a` /VQ-a^jB1~G Ek8"ڦj?xj}6c{[Ff UHH <蠇VٲLR&c.EydX4evZAr*2FLwrɘP:)Bƙ J5:S;8xbV!CbCL-D Q0t)).%aqofƥ{7:BCե+"iu$*1J:AQ}3Q8HR$tBΪ4" t:z9j3]w#&;evշS@:˘O(ē"t|Mi.޺?TĚ*}QmbhC,S0Y ^#:9]7*) 5(JO.FyXD6.c8(k6s$m+QM6!< tc yc pF@6~#"M9YgP(`۹e>mCs\{33Yoq["Q\MY\d k b`{evMTc"ӵk+RgڔrxiЛ.AF:eB.s%LaWeY@ l#{9m ܞ|\ڔf)iT!Wc[>#$R脱tQ;ņ ax aS2L;=rx`1 NU(a2:rs lc% D~ WyKvX`?DRnF90)c\Hn8|0ۥ{K@SqYY9E8Rqx &,)NiR`blɋKQLckܵ~R|,;Wõcɮap?6%})| >81 Ԍ4,[Mּ! BYP1n:h5 aWXjݍɽc݇ <d-uo[.ޠ>M=7a#fՓ\Ӝ곽׊- 1ɧ^{Ê;Q |ҏ,|xolu>ƾ b|> l1~uප\M`l M:p.#[-9g>.# y=,?C<O?ߵ4n5{ĭ$!|l L0ue}M9_:_,\ =6O˼ B貜9P%/f]~RӺb?dOfc?an_k?tw_B4yqG}Oe'Y?XE-l* .:Q=?Wiz=! ,0`H*\ȰÇ} HD߽[ ɓ(S\R%II:ٲ͛8sd1@DӧPw 3իX$IT-46Yk(MZ4j۷O(+M[2ҫiӦp P"LVjU W IqZD#̹z4 V[iګIo֬GLN,gy]YE[1q-l+_~ެ'_XoҭgԊ hoe'X{Z؁O?auޭa$XuiX}GS-a_o `q1]~WO^iRkቜ7nYD@ع@;o5t Z Nhc(6yk9{5%*Ni%6eiq@;AFy]6~onA9tJW ZtZF!,-GĈVV|l$@ _2c5\kAT=v(L3bZБ ;V )G,_ȷwLX1 HgoƁ\BcwvFF͢N2/s]aQq?+,QfXHNt:h-ZT ?k?A Lz v=gϣRQܩ`D8A$\nlA Q'Er `)E ~Y%YCJd*yNCA`&ΣiqS%`h 9Ј۴ɀSɐM-`"3 P̣1qS(<[qAShZj8ZUU+Qڪ7t;i0" B_0I%+),QU;Xh# |V$1*&,DւoT"W&3ðC dbLU7!QE(mB:۲D83, $r.@ ^ԹQ)vbNFD lRh;OCQrM}1'aM5tXH#/LD`5 iunb RXk'./|EmU(\}P,b v>N\d},HMSI8V XoSv{)FApsOGMQE;jM$4ީ4İS*zBTؘ"eašY*)HTޙ%=%fmQF{ٗ2-6+WM AP~Py) 9:kkAfH,H m+c_)cy956g*Y/R򞴞 vBar)4}DK+'n .TN'QB%D{8)ű7 TH!CiuqĩXFvcź3_0 \c-_Z1NNjjAwC[/pq'_878Kn)ROK2i*^Ҥ?T" lS>OI9LJ[?eg9`jk۪"bo't6ckr M|MǻMxV:5ABn4т86D~L&D89ZNe8.n'-lŁ1_.YQӒh̰Vk&6Ht9C9?p( 6`!Z>ڡc:?)DU׶Iq [gil!!'pv4ΆG'5JRg=33"E*tI1],wWDh'&E`r{%ob,EX}%nI"tR'nR8O#eaSl@ m 3c8Z}2$ [ehm٧#.&Eᄈrl#!TqW/Ty'ϣFC$`i4S8+DN33OA$䖝P)ٝzfQ jn@ gjr(GF$}fl&pilN \Bt7-Ets"sVjJX$- \\$?O`%큂l*P|arj"+E4jwR[D{&p'EX{AtawpLx'&@ \=*F әAuZHKQ@J%*!lulZĎ[p#(߱u:k٣()Zam w^Lc>[d}r>WSsBP{VAe>`vhGnb(sȫ!J6tyZ7@Zt/SkS9pBqv4N!G(Vy~SV* GəXaoQn ?${*# "w"<MXsAw ≃oԉL}Iʐ9;JvXj=qF7{ʷlĵb{C2sv"$1o0m k+yKnˆw[S1|& OqJXFi RHZKBl 23%M!NiяZ%{S$)*{>}?#yXx&2}бKre䛵 ѻKאWRjlѾ7$1K*_z1 %a6,Q Ƽr`A{'vq(p ubJ8C,HlN8NtQD^J;Mvkb~Ĵ^a"ׂ{u"77>R޸n=%(ў`~~!JG)ZXM^mȾN]ԏ&>_f^2D)j'E%m9S L{..'~np1QZEKXvQ>.QkH єy4mdud?Bl?=FSOG,^TΧ6&%PNˈM:/b/^CK2+Z!(!ZVdǘ,S(RvЬީ$ &a?_ȿ{b_DXgIstƱ6Nū cvlGb2wJpy`aϖ_ ,P_ "M)Z8i@& ʔ|\fKԴE̖-_\SPEETR9TjTSV ֨93ʤ)&WJ)V&Qx2ZUȱF| W^}2ڰ@ D|XaI͚ WУȊ9pJ2<-vHj 8轔yƝ;Y}vUj-a+ԂSk5Jzzen,txͮ[xW;$*8qg?7-IA/,Z{^v[ J\"B +-C4J;n-40Vr,$Mj0Fo!㎽q1\>; ڨ$وR%k2@6gKK(̩dQFRk^4L06'2k=BM-B{ԱVO$r"\hIBDl!I%UPPW'@M3gwk9zp˥8dWFG G[Q2M-"h9JԨ<߼ b]8$jVaV{Uϯ xO\*z>4MDq7aBcCo0EɵbqQHi('U{ZaT3$ɨ'T8fo5J?O2LYuLb[*{>]vi V M:馮 MvCV긆;karTP(žl!19nmͰfVXŷΛQwz1EC=qV|gG|n}s- ;WLxiMQ{߼7֓=EZy跟\oh + |B[ʝ{fد~m}ww'Ⱃa|QNQ_Ԁ ~qEH; *L9xx  (X2PqCY#bH2IOt4Aъ+RxE.&̈Abȵ,VcD @-/o|_7=8QFNCя| ϜhFm< ְ5B ^,CBҒH]ғzpIR/<KIĀ! ,P H*\ȰÇĉ':UA 82ɓ(S\ɲˇG3 |ɳϟ@x^LP 9>}UHjʵWO&YSٳh.hN zºjݫہ ]+~Hw`Ul BjpĬB(rϠ ;lOS\ux)SՁؙ%ƍμ9WcΞ㹼e;ͪl1+e;عkk(M0ih uQd"`6DI=%e/L4[DQosUneaihހDI&MSH1V|cK=mh#zֱ`6cFTX3&h(x4G9;# +ި~( < qa$}3 =j"&[ֹRn+URI٦d'aIϏjeC$(YiI=~4楘 6$VZ?ȣx_䦗SBՙCRvQcHZ]tgJՅY3fM{A5iBIhe+ɪ(@#bjѼSYTYKO*L/.Ǭn&򗬎 ճI:mXEīcNѰPe]߂T#̖=I0|cyA+?+NNvdpJ]TOչNh=@#;!'ϢVQգho 4Qԉf1J{ vyA䈤iP`nB+fɳQ%17lkXLy7Yc ɽvYW&yVO-2u+oJAXFypҩX>/c4QSCCTɐUDP;1q`ivHoxL{$=iHV@e T@W{eΗ ʮd3s^޴MfF="x2r6~YֲhQ!!brh1XK7먍UUJ!;Hǔ2/wNLЪhS8wI/H}P1gHV|6>u;;}hPJ9N9PzH8=WQW;Ս$;64}߻|B2-h+)K-(::,YTfM1hV 3PQxH p/\it]?PZ")[GHDV,rhqtC<'UZ5&2%$dFX9@QU&u h@3Up I%HO=}an2$HyLӭ(: =ny͉ ߬-A>ˋ-9-## K3Ἃ bIБlqu М`7ͭ71;޻I`41WX7 YnVG0#l;N_2 1 idy^ 1C--IH=@<ѽg(4dK3;ɭ waiœM]UWbý/ 6ZNaB}Y`J޹VLA%wd$ -y޸I,=؎6^mg42EBtR2iarߢU A(z3.9 (.\Ph*ZۻN̷qxƗ;.R* k^>.c2sQѱ<“5\ OBǔRZ aLyqez5O0СH #!p)A23hKކ}n(Qvcӑ+z{Y)W4֞-ѾY k%8S٠rx@5 [v!|dsxB(gd0& !4q+*H>ˆX&9B˺$FJ~liF5614MbExO?!rɈU-ViSM5- e1"H!Gj'Q0lO6ҟuM E[nq߅7^2K^{ EZ5LhصD3UBYZi'?`64y_Eq_+bдIw7eoO9f1Kllią^ ȣ"[*N3ФOC*-4SSMZIlXF3U%*icx[v`84DE3,HkL+1 B_EQcZAmvʻ&KLwbp8R **Bg C戗fV lJDӴJr#'lD>`$qųK(E`Dc=^%*f%혉U)\R BH>h(CђFX6MKr{lp>iG.Gv${hj\5F<5T(ϳ=qꡍkq>7uѠ'>F3@:![rHvԃjޖ(V *jg$<شVBT!:cYJPuOdF`/Mji;Du !@sW"Df T0;! ] ,u$}Ũ2@OSF*gh\zМz$> 9&r)GNZbm "h$iBBd-GQi_e\/7!, -YbvȋH\Z&FA\Auޛv S1ɶڈĔ>"pRtqcHf1vY[~bvP٤ܕ6^uN : ±^Y>rݧ2hSQ:e'>`l!{7 wH@iPsPb[I;İ/pQHP B4 L\9k{?[ t 2ItT:̒9IB ё9.$[a>BaΡ. ߸Z5w>"1kvh#< !C=3H.9CcA6, ?ʗ =Zi帵@˯zz/QZKڶ b!D@ .,_9٦›ϳ A,b9äP[hP<š q @`#H(L;2BRqd8qnƸ1gL1Vh"A,Ҫ )J-ɶkآDyp {aVB$(4 IT YY>+Ԥ$I"Q2U}A)>uC/:ɾR!hBBF, ˆv F+BJ: .cL|&\T)Ǩ0 j zxӄq TM ,6( KĔ\M$;W3t̝3  q1,LlN,X!{SDLh!ȣ(.oMKLKnK:ɅۍKͮ4O8THuŻ蛀 ɔP"}#=sP< yƍ ÍH䣐@;džpMڴB$L H;*9eQ'3=h~ L.΢ !,<kQHKR&ُIøM`Dɂ- N\, <ÑOMFĉżb-x*2*S>lR Ɓ=7RU5`̯ogm Uӑ@˵UJ<~^յ,m FcEҫS`=s}ƺXAMR|i=V5 ]>E֖$BR,WmI,WU*PEgOERAĜc4ab G=õ\ID -E]i 33Ү e]!D)SGֵ]>aR)+ӨT qZ7̓VN%B2+_0BݗZ\u테 :ܛ! »ވp v؂5kv? 5_"6>a' 10èq 㔹̏`~Y=b*/m ^cM>܄SK,Y c9Vc Hhi?_zAHIF>)Tq tY}MUde`, ck\44횃U7q '|,CMLTK9ZhXAetb,Yb cDži ޺Q56i.?IALjbp䚏fC%MJ:֛.,bRv0f/SMb`p hieݝ= 6P;VՓHҴ= +Qdhf^XR2|DzNh}㜾/ϻ"]hgx:Aݸed\ި9N餀0%*Bjsifڵ~V~|I/X:k˥L.TUuVRȡBA^lsA໾jHAlS}؛6Wj&BTzץSQL3Tm둾G}4okɽmmEjZ`V`aLåynnnWd40fnKmN onHn=+qo׏8oRd`T 8Ůq^! ,P?H*\ȰÇ#=f+!E~XЗBVAUvt)͛8sɳOC%8t!P*sɴӧP4k`ժau`W`ÊK6jǢD>L*WeʝKYc7NqaV.GKr˘3c@-MiUAGJUmkͰckkqz2ޭ{TU3RudǎW')ОڌV|oˤ Zزަz}+tiw#PۢI9Ya)fFxR"S|F(hM&dax؈Nb3&k(]HJ`(clgi!~  ֣MVu)IinxW{3F)%SzRwe4|?a!wZf#(M);5}槛-' d&8iUvLRrtF*MԲa&yb8c߅W&љ@x^H&M*(zI;V5N6d&@zXudžԑ8`z_=jT =wٰ6ݶFRDec!وI[bRgYCMwFծԈ6j&x?Vw# iG9 .SA/CmoAسVfجfI`pAm͙D~ښ ~;(:dAQetۢ E=4HFK E}j^gƹekMP='^(މFNg.'_(&* -oU+^dOm DC z~Z0KP{"3 f"&i ^~j %nz!叢0/G҂9CynК\EV ;OΎ-<1DUjZѢ&ؐxrDzrYj$X:xa Habc|Bj\w&1UMQ^@ڑ,Vj)MAy]uG<.G(DZ!P;aV4B D+J !^+U(vsyb=Cn G[OpHA)ЏIІjU3~;ͺ"C]d&C,E~ˈ RRIWz7HuR{֒8C@6Krnp/CZ.ma_rE_H VCg$II)嶎OlUcRpK?LVLt^ Bȷ@up<.)mH_@S 1Ȉ/]Ɔα~jC.'P8'g~cT E=Dx-ZMc/-/]I6;S8>}-l±BA8.( ^6ƛ=H-8aD&!Nw)۰r8oaP-b=][ӏ ńaͣa1.YA#X/n>(Y=@  !Lj6 5N!DY-_ӹ^5`ť.eq-g9;H q(~$ fY m֖dc6Zwb^s$81P)A񪍩Q\tZbDdlA !2PO5+Zf(%2s -O56p`^S;H} :<ƩhsT7+]:py.AjPf(Qdb|Cb^b1)/齗4PCNƎM3G?#1־XFRw$m͊hVTlJ9O^pUeb݈QfI_u) !ECZZE4y.SP_8)kuBa* ;XYx"s`,ɯ}̖Oe 8pzrCS"a~,SйS5@DcIi4]SM jMal~~`Ot،f PVys{ٜ-Glf.ڥr#WY,D&ݺBR mBj_m҂&rzė-b%)xTYR}-W1N=.FL(JqZvpfYAx>zKyCk,U.Cy rG!ӝ]Y9 啚tiTAʭ$UtPu0$`ɋLpATM]*CDf٪H7-9BVO<)vY+j0`GVx};RmVB<0 Wb57#oLmIgguaA^ǂ9)TI^"Px D+6 "~SgW6 ĕFs !䁣 W63_"_'(iQ&e2yZ# Pt;w?%fzZ'i-yt6[P\=\BL"â F^ŏag$ׅfU+f苰qQY䐁[@bx0Ztwu?B5'i#0^N΃;̨9kԂ"3g$/p˜clKD7 ƙ+cW'WrEQ]%W b[gC)֙x_fE)nJ甉>M) AR'xc'`_AQĄՖ ucǔFZ9"T){1ze"p.;<*)!a(ȥbDV˥vݦoLYzatUD8WbKsjoqQ*,DT$*h5(_2J*yX ї `o&Ň!2h2o'&  لWxMU{2W($1)Vy=()PJ<"z7vU1Z@"79U`3ef:Ic`bxyc, `QBp;W۔LTz^W^6x{Nl8{ w$8sH. !C! -)zVQU;WTɄeN$urR5Q ! J?DёFa#&"IW'o(L巷_~;r=Q. o&3Jrú?b0LAI&ZI1CU)+3Z;ۿjKC`K*u-3+^@A2' C1DF^u$ۼ&_-AR[';)YM D8a!@P (e Rww`̋^Xz LP*wJ$M>׻0 [TfB^ WHs*?7*)H+q l-O JCs..ۜvϋÜL}U<8}YKF׵rUѻcdp1rQʖ[tv[wBMٵDC R+a ȴc1:Q)6l?<:v| n!DUM9D !; Ra5:*Ra2ZM)׻E#dw_-. Y5FRH /t+O-:2~GA2Đ!nChlXQ 4-?3Oe )(`F3 Jcј83%Ul}A.qA9W$yU*6N`4v٧ * ZRvDk$\-81ɦպĦ)734>QE *9WUFfW@:Ft }mx.U>]hio~jŝ?k.?p5Rzѽj. q9RChl+M2Ff$!$|I1zP$ws<q*d`ŔZp|9&dJ.3ڠ l Jw M$L x""%{پюl%|;#Azqrkt@:y?>'QM(U) &S%$ARR`v3}Sm{t@eq{U!Mzh}mm!ʶ4QMDۜ QD!C`@@޿ +HbDFĘQF=~@_J4_uDk[J 'J%n;&gJB*0'z2e˖]ɜ9eڳX4(׆cɵ;޻ӤMJoJ4SEXbs)dMF<@&gM3DYzBÚ zB<ʚXleMlÀSHO;82bխ_twEۻhGe8md3EJ9_&ڙFDz4Fd,Ҥ3*j +($6+q4p+q V7آFdB \z)+J zFxP4Ѹ4դˆ.DfJkq,jĔr-NM>{>5ZXeRa)"RjaQRaӰPD HQ(C7ĨPI4g5#[H!eG[ *Qí΄YPImrHiRK {*[գl2\s$JSX'-v(bz7ФtGKTpRh40}ρ> %>}/F؆-(H} %q{ }~؟{y.+i1k̒V_ؕ}NjHϪ>y w ͳ%LB0 G|LF *F=b8[zrd*w&&:׀Ɲ6ʅ%|ZV.r)Y2P?1vwɟv3|ҢgKoJZp ~V(uqW,G-"Hq/ :HQY(=n؄l,H :0 ߛ 4`JZ# Ghl#$ Y2MT`0M_3b8.gX 6Yr23 .c! x$'dbM -5\k$NGIO:CS9QXQ AlH#bu~U(^-1P+f2#CLLm.*Yfg:C5V^HLIi";RԎPCfd6*tyՠ!Ѻ,s.C!rhr!}VxhuAhTCu7'@F1ũ\8ܧEԳ)5%f>e bM,JHDAMl 2x;$$TYȈHrrww0 J=Zr|gc!({3)G ɐq"Ҏ0ws*Z,۰\ez#8H Q@FOf8`ZUZU͉8Ӂ ?yPҖ$T 4wLmaPRbMBIaXYJfro`37j Nm~<bښ- E_^+1e&-MC$j[æ\) 1=b.pȃZ}HPin:6&jWm$ n̑:Cci3V/x2w o&7&QQeJ~Ԛ:J p@-xFq)Di[F]#3*Ջ|4Λ !)'e$h6%Wsς5Ri.Q,sbtcCbc(3z_!4gQ+ ;Y2 K uR0L(->1PA) [s)*  $,5T% 30!3k- ?. ZЄe X1@nsVXڸLPx[' <#@J *@ǸbRY (1iBm.Z8ϒ>"YU1aC0=$#D\ ?Zdǀ62;*k= %ѹ R (:&l @Lz$! 5;D;)S9&iKjsX҄뺮hX#X|Hd"iH@ c@蘩(: d);8لz 8z*2M\{@T|N+M8luBu5gA͆nT-#&fVqбY-E9YҶKsJ'u_~#"되QQL`A٩YAk [(_K&zQ"hHASsY)G J8x㜢%/żicU N$xuc4'[ :n[ CB9R] B.Ѣ艪MSb[[O,DG1 a8 #Q4II5z˸ Ji8+Bd>Вv z @KUQF:J\*@qʰpВARx*x$1` !+f%i~ .#0Ys m( j U".{I^Td!b,cb5r2IJAؔ$&W֠3f'ȓij4bCJ_}&-<dRnJjW<2+)ʼnam݊#x.i..IIffZ~H>⤛ɆbԕeM*Ϯj". Jq,_K.Xl 7c V/IkI dneau#B,l>e^yU6uuJdk&ƹ^.PjȠLU1E ̎Х䐿:5͝rp ;)@%^_Ep,x!fcࠢouУNqO!1BE!W*~;)qa pzDf}gt~$A&b'2iPZɥV冕[m#N(p#6l#)g)PB0`AT[g(i%fZ-d(gTD2%GT3Jֿs>g#XԞx; CIt D=6Fez⺠y7!Pn$m`#wIbW6nD'wu* Rv,l\`Ay 3 r ;2l+W@m0TZn񏄤ćNяzdCi&{e Iȥ7hdM`9&CFHjAǀBң ºʀaoÎQh]|$7um">ff']RmdXt`(7jF&bH|&\20)%1))l&62h)8TjL e!W|3;09yK໑T'ɳ]Q4{ŽHTXPnq (D"w MNc-1*ҠȡK*#}=c&VxT;'+_3q+,"q;=fzՙ ShmӣRsK. f9q[UfKGXCi)}R \ZjULU ! ,P?H*\ȰÇ#='WB8 dNjE )ңA, Rt)͛8sɳgόaƣ?\ʴӧPwzE ҂Ԫ4ׯ`ÊꑫP>q۷p25 E{m5bǒrJ2\Xǐ##=joFU'T[3ȠC{K ^޵:Iʆ0aƌo^ xqZL|x惚 h6Iܮ/zKkۂgHӫwnܞ?TZ}ABy-zƥjf^~[Iqb-xVTPaVF }YgȝVq;ed{z+5k!7ڃth yd{+zxi%~bʭX"XfP?hM&{`lBZ]6d Vt&hM&{9iRJDYƵU=FA5"B $@Qϗ &㸧]>Vtu Ti]JQHD2jk&0D͗d&Zr'Z5+pj-N@aiZ +A|3?ץ;J=ޖ?&ڬ{]|yW`qd;d#8Գ$5v6-UM ?ٵ=i4|)&(Яyy(!J-wf&0 xU Jq{OjYٵj;ktưrg␪AՓ5JfS~}):;|rǂ?e6rg+6q{(: }qxA_Vd2 G; S՜[NIJ@I͇֧ЀU?"@tz:9͟UE˹? ,)iiڷ3K3]eݒujROL (sJ ke$T 6մfW2(v7yO[P$yK 6M:֥EP`͒brd츔 ,΁I raA_`WAkEIH=j W=q]iz4 *8&7DPe|t-WJ\(|%> HtNH;klZEV[Hj )Z$$n"iԱڱKpJױD QdVIb &3+Y`JSNd# U4[ I~R"QFU+m9qՒEj[SЧO܌DM jby"5 "]}X$D1մI^SWUIqJ7y(>JfAIޫИEcr9Qav9IX Y [wQS<RTB|=ZF!^M 2ە<" !̼-=,^XnHT E%i 1 ߧhIZg$s\a|ʉvV& 6/,fpEzUE=-u,iF+ G؁crdȽ뾤Z-.6F1t )M7G9` c-Eid(bi@K5'Ms!.mѕ~ZR!\#7O.jzB@셞{n,8ʘ764咻M3]#Z/ъd-IZ\b؁m{1/aa#B(K1Z qyWBvVƁᲚwMѶx[(sگ|Z;+41] X3J&Ի6x*AZPs:fUnO&qAyȒUpaY# sN+Yf8lƈjB12U@vF#i"'I6YΤ1Uxq=H8K;1hn} j2NjޢT hJfǩxrܺJ)TA|z5f'L>uBwr[8'$431%^GSaaR'&14$q@%99]SK/N|:oh0q(Xzeg@ZH61P|2UC. kGLE0.9} pdҙOBAأ`pdv)m'5g61 #QZx¯8F+54YB9c vTRZzi"7W_): wEE5Gt-DI.1'9ef4ATFTqaBK% B;qKr d pàasB@N ˰ud13,/1OPqЋ@ +O8|b)cİiʂp4&98$C1sMQKoZmA6%ɶU„^ ,c"i;}(}^p$j_N1a0M8\peK89.()='Hl,# Uh&U wnK dhOTK!ĚUKaZ<▗'k>k3TD@′c C:"nlK HKQlz ǤfGъ%0#Vd4ƍG6Q*ȿO  Jea6JHb5)VTϊs& ";sUKTWjwG^BlNgFsc8dɚ|\4W:1ɂa.\G|ǼEE,yґ@< BQ{CD:ٶuQgX-G3TX.&MY!b1FtVk{8;UޅJE#7cpǰ|/ Kq,-rLӤOi)7\>V[I=;5Y!GXd|R 1:̼mͳډIb]2oEt*N᷃sUXYUWفkzBP yce[&r+^Qp[)qm ĤEiD ^^29)7ɝWb!.Ak-М*2>&*{Q:qq_;llVʉbfzK6/B0XW''Hh7H!A'A51=iHݸySQ!1;1;55svuS, ˧G9A:B#xYD, w*H-7y pJ ,757"ui^M;DHpƫke91/K.!l& smG 9LY.Si3 Kusy12 '=h䑡:7)@&.aMڐDӊEZ>=@=!|VW&3~47J5ӜΜok1 2) b>:ơ͍Q]X% D|Ƥ,.=֨r <@Y*ZYTrNpAmvm"fr Dw6z,(:Sru`;6'#Sb{It91G"=?B(/ (G&1͌fJ84VB)t=<]9C2~vj~4âZ5b YT7U "z#H9b Eeϰ;Euɷ:AUvO6 (X>8SPkKձ)AS'4"mU g>,~q)0kKk]'/T<%:g9eŒrV`u2l\q{/,`m6S)$}>hF6΁:wǗ/F[ ҇qTeC_UwcCۃw:?$xA_b'*li8=\W=-(@!meybl2i`B=}'OC*OɋNF'cѣU^ŚUV;h -{b}Gòr6<{6d\dkSza=mbbUxÿt\˕Cb(giRIۖR;[l@ҭC{:d{\' @8D WV#gAqh$)Fuq.^cz[_g_sX( LRM-rH!*.6OLn1- :M4Y+#AF. ,Z!vh$̢1F#ܬ!"&lh~iCA-.7Nl*!)҄Bz..* I6(B:IA=h_0{"롒, K< E{jM! QVDuvBLTUմ`Q3[{\,H#+Q' SBeD|I嬛(M߆g8k MH= "Ӟuuӟ^j#vzl(߂Σͭ^m?GifHKOF˞j?[3K@ByXpS>-:TW+5^W_LҲY%w)l`: hlb٪Ν4j@ }e\ǖPyb%-=BqRQq.R _dΠ ?}1iK3z C86s?׊F(& L®nZPO,5zuȫ7(ޫ&4l%Ag*^LOS{-q Ѡy#)20ق!+'r˿zEiv-ɠf"4iG0XzMI&Df'*)/\T/F!Ԭh\[eP@ S,| 72=!1ighuH{7ŇH4 *T @ Ire2._D$t9-fڈuhI>#.ZV!EA;-EBpD! Xњ{-YюSH 8"I'E6 }znxrIbklJ;K0wXwzKDBq?2kc qđ1(rVu' I-͑!BEzz9 l( n .aioSR2-'v\%3*}2FH' $FbRkH=Fa'1'<Xj')$ d:l|"fimt![\գb*3Pfԫ QI'(EHѶk Wѣj#]7"J[T< N&-X\68iP[챭1R38i(m!ؐݦ⊔a2 ynylóRKYCƽ'4j}"S! HBwa_X:kE^቎)^z哿I8(,|-Z4@(UVd#sϸ~hҘ]/Ca{6<= k+_>0$̰S!K Z/Z؄,1LImX~؜!ԏs>IBQI-y͔0yšCKE҄#IG"D 1vgޡvvp=`o,8)PX&G"KCb& cNCl~RA_XpLP̑y0@%*4iN"2 BʙʝM˃Mp KI#'릈qц"j:3K"q4v vCTʸYX =7± z0^*xa᾿Ml2ъѰD2S1ZSƻ4EÞ6=(Tiq 9ĉ R,#`Q`/lH!II*SXR'RGBTb8k$ '-{ aI9Oa%9ľy@kV?*@VfPyQh"KpcӨQZ&Bx1Ph#0=LR؛#u0 MXVS QHMj[h+8 =X/4,M :TR(%{t>XVi _ږ\Q1ɂأ1׹?ɞr=38' H=r/r~97A^F)p2ۥ"qQIQh }7© \R?j˰I ̉]9<_$ vQ3hCM0_M獦6v@nQZNl4i&kzA򛯃47M,T^8;=c,֚Q5 EMYA0{ZQE@aUЃ[kM&c7+$C(&DU0`_XZ {@t͆>E3xgMڤA3?75Hv!K( Dmjc3]AȇGJ!hKa%R"εXU٭ IDl3h3-f9eR3C4Ll {)$N)X3Jx,m󗧛Cú e0((crV<(}?cGUlBqvΊ 4 ETN'[QCVT+PS! B!+ٵ.'a}6 !G:jP4B* k]Ģ)dߛ +A1,&1$3(EO4FhcN[Џ=pmdgjl|8I1Bb>bوe3IHr+]]ޠDՋl2b"4`(KdzV5xlV < w bZ'mzCe6նOJ: 4g=Gq-'BA/ 2xFs-(M&? AgӮXT!>9FςVџfʗ3*1[MjV j=p?wЃc<~ir+V,˙}u`Xvi'am :oNoIA$[rw} сxbI`3&TمA` $D6#A=t&lюLg^IU[B?%DT=`Yy]S;∢MA0ؚ` v9Agj~%zs/$T~ԟ;3JAvSe~p: l4DdS$4#(te:7_LQNau+tѐZ*̝ɕYd-XEt]XQ&C'{-FQ"D vYx6y]e.MS(։^l/"cX5Q+/ ^vEZK)|qB%&[gi%+X;as3M<3SbPC"0Vҕ-iO4.XB 6ֱ=-}T }Y:Uv;6&6dDYEr}k)lXJ7PMv]8aZ Dkv䙋f$9a/! ,P0H*\ȰÇ#65ċ3jȱǏ CIɓ(SD@K/WʜI͛,qɳϊlXϣH* sӧPR*jAQjʵׯ` :Ԟ_fê]V!ŘMʝ{@SKߥq KpͼD^Xe7LY#Z[.g&[Mz4dɠSskTlgaL;m끲hu۪o.6AhM#2GQ ]gV=5lﳿ++]o^$ܗpKW.y~Ko{֙EH[gwDYCgAE!lP9h w`D ዂEWB|0eIc*yEQck5@yQ1%'h9iy YǗ@ uzeb)ei]8ct5'cg'e%?Pe"1wCJ]\f'J'*7މ҉֔cYTd2d֨ as{*و< z-z vl/`+Pq~lׁHV)&}lN_u.[:lmv='?2ˬ@P> XM|\zk:^8nB-QFFW2X 1ZҖh,˼]-5+ȐwZ{ѳ9 v~ZVw-&+kS?m 7Cm'xpmmvT'w#i8i1#?hi "Aqc;h&:4:0Ns\s;:ay6Bfrl"P&kMdǷe}CF-܅-x3|@.̋4>˃+Q`,@zl> E&|"s1\o":UX;BOB&Iv{8xW nf3-(I`4+lavlzm #aǖpK}xD05G 5r u^ȩBm4EP20((`avjoJ2:eC 2# HÈpvg\A|JWk\؜R ClQӐ`&"1 OF45ъrB)LL(Qbs(EhubYJ TMw^9?Pr*)[ʬ ѫZ4ډ*l9 +(i aqJ9P# _M`EE J(F¦M(ڐ2iEH tԳf VlNI_V}`&B}_&Z;«ɈJ.s'EABknt,hU$7{┶TE5Z8GOv= j"ŨeAK01mމ~iYZ* Xžh QJ?JO[DM;;*:U nj6`oy߅ϭGåzآ?#f;xhNSsS=`7zyțhM,0ZT`o4bsth bI Z6vY9dc|=Ii;#¡VD@_Qx>oJ3V0K:P7;9lAyhG*,Ծ/f_2Ykd[fGfCH=Lwc m}\DY$ W祋^#x8Du._' Z1k.)juZ_Mcl% -/qhwɭ4Ml<y.`%iAR<Q4yg NYٵqwβ}a5 3 #z ŌLCwY uPɜ5$iŧb4rcE:dhyAB00vI,OIͪ}M~M_swR&p;kf42ȏrpM~Ef$Z>oA$-7ۑsV ]v8|"dt&ZʒoIz&]e)Zъ 06SI0Si6[4O1kآ"iCo'Xk5Cd-wBOVP 98.oD}2#l. xstAXbB\,c6؊Q%SF2B!v7Sz(8j$ $53F)i|Z4f02]h&|wrD[gyGT4A7-5sN123a1G#8>6j.{M&s w$mkxW5&({''h[|FsڣqiR72@7 $Jg'YM>SVda]ŎIZ2Vb_W {VsĄq3fQGbglGb6TҴF CL2ՐRr5HkX%;29*hiHR|XXXM23ςa~$x(o=xAc]Qy= {*G#L2-UtqsB>[4Iub8,@:Z3)u0CGKv0B <5O V.h:%'4Rn}tbBM4H+$ A6ڀ\wC!9 LE 3c4"9Y{֗cXdA!e4dsTiI}EDo`! w1pVN5Ih:_w5xX -4}Hsh_Gr}0xZA\DŽ]POEuHQ-a] 9fl~R $( 9VMWUmrScnkȦZgje5~G4$rGYd7Fpς z- x/rUB$%d(:GpX@e^$ .S'*>A:"uj!2jh ^14Ocu:G f,DA:? 4IBIoD}D~Х65腁B17R75Z*f${B3j 5ܺ'[ sD+J+ŋBri@";|A w2I{EP(3WJ&OC%80߇EZ+1jCI>I-e K!0?B |{ 1^RDDyΪzJ&7(K =r/TYW B9L[to< 4aUjaA ؕJ,ׂ2,P&M G]CW^:$EzyX>phT68cBԞƪg,erDZ-2$SElS aR7 .I~牯1;zHBR+G 8;1#;d&juB|R[dD; JjDxENKIO ,ox3 a? @ Rʓ]I s>2*R)&$Jsj )1d&4Ւ‚0ba= ō'73$z2U[Q?AojtDdlFxQiBQ~<lR>D# 4 !,k'5,aT Znq#Ot>-@{D҉hRKzs]G*̺͋[#P(R7It3ux'm%ɸAA2FJ%eD{GUCILKkV@ Nixb`$1u z (G_ۖ/3Iv:[!b\aTCKCdIǻ$7gzDWQ\eǐTL4d ՠ]4+t Ɣx$ Grtj)^M8ɤ aZYAPM(Jk\&ӫ1. G9p4"pCVGJ}.A>J6[6%%*L{@7n$ =c{پOKtwTV->RX[.c4}@;I*hBT V$:b  M4LYƸj)6}C@\ BOcU W߈r&{څs}}BNJ:޴b x;rF!U֕X`Е9^<J4ԟwVQ1:#ؒD`Eǭt)"tzOiZt1ܢt m.|!r 9qW~.S8Xf`A}3eJN w #eWu(׊靃)HXh|IB;]*L{ EԔMLRT~fê5SŸy-R5MX+bּ7U޾S*0TiҦ­ E3Ņ+gCmZ6 ?(=lU $TyaFnֈ"%:xQkG=xrk]WўϤuGu{<Ĭ!+'?|ڂ/ j*{6[@z0@+3*i!j)M4L*4?{KEQjE6 ̨%ʤP4h)hh Ie leMF!/JJ!$9܄σ Ғfp~'4&S#[̺OLA̋ w~BMXD!mZ.3$5&E)#QGLJK"qj* 6LUE$m~mbyH30U4Uki0<6!6g'!|:/5YP<3b*…b E@2#͗z8HކӊMMeT*ňx)HٞxGi ͠_Hc )#/`4i"|rt=4f5hʼ`{J,[ ekFmũ6W^Whz+Jʾi3B-CA &N;75GC}.:#i5 㥑 d 6㞉rgzˍ32Pµz3~T.b#=vBoFMQ$ȞsI v /UqoK:z8'7r}cGx5=_kY'n mG!fQΪif5ctRRl'c8! v6CQguĘ"ifl  ~J=jQgB˧DCh z҈ߴ5#쐦)V(d*Rj䭴[; շ"S k $gVdc'[`Td,)MA@֥ MF12JtnAR-JPAF1f> mȓ2bW܃}hOZ$w%҄mhlHh8{d{5O #X 4&V$ M \xpQW_d ub򴣕L'M|;5/Z8Ge}h p`w_SdB "Muq:h:.b1UXl Q gIL&k4f?)f3!ƸI2("Ӊ,rmJ(RN',pnrPRe+|9I׵ mɇN;S+{X}Q D2U7)r tB21UExUl}? 8UJO!Y$,dI4Y|<9E-QIfB8R2Z@;PReMX}ӄu]〬?0e"(nvMuGf6tBHV;{P{:^9{Y}nt-/C]AQpl' rP̶ +7~[V&>hNbSwR!NJJ4AJ{W=MB|9xfJIMV5^h)^K=5X@V+aE#o6&AH*;YacX+ ҢYB;@G*` H |Ih4Q@fYr"z0*H#:-I( :CÅh*9dQ~4% /HAzqPؾNBK,{ `B:'.:bzD0#_h4+,p0E40B _ɔ!ר 2sxs'DJ#`F#k9b"BZɔ31ەS(CM5=*-hCh`I)K܄klr}=QpèG{L9i T[Qnjё.A-~] $Zq|; ^c:ʯ+; [3bț9|ż2$5IH_ҹHJ#A E"ۄ|1tYYzXs7L̚Yk!'+5l8@AlƙhS)!GȍCt'M@M{f؀Fj5$g6ȜJ&&ĖQ!܂t,*Ơ8ql(ԄqK0G-ج(2M?'M$Cӄv3ʢӄhdd W<=4򒼲,6=;O2"2+˖X;Yy҈Mv`/тMxLxNEK{͠<- ՃL8Fc_9K'j!C̄ل rQج:j _kg+y6s6vJ CJ 3_qC 8Pə [ \"iɚ0`T I @q+IY93M9qpD16I{R \JPB$Cy!dj*0JMX]0:)B, ٥|l 4 m؄q)4ŧQUrc+Ze m :zhJ,tN=] ZG<ɍ@Č6qU*S*;i@ 9Lzx Cd%1n}^•RTzM#$wU[!+%W3%"A: b(!p"tgzQW_7^+ZWe _ M0)" cIHa21, .Eޛ_d& Ȧ 2.dVab,"N-x/ʝ SA&#(Nԑ)`ɿ ]5NaXaC&aC/^`\4xڪX'a*c=68W!K/CId& 8rR2C6ڙ( RF4<33KtM]#[i~P+j݈)+ b_V E[bE"M6fs^Wf<}^XQ`)G`y$2ѵ@MhR Vv 4` ^V+5}>Ih28(5hnN 8 m\; X[ef&j->Bfꊱ }a5VQ>j(׀~6O^ɫbLA[S9~PyD 5a掂h!Ą1Vzdvh'WQ[qbl.$˂̔VDCٌ_0 ֣Eٮ3U!b:Y݈p? ڵnƌ"'D)Y~^i:+=[n6-E+{`ن_^o6e `,vF1籵DAWQ Vf:hR;Ԑie]E], Oٓ!LlkiI]A ?8pDAEhI0YOwIe spQ]<٥.\Ԕ-S԰ Yɪվ&Yq|<𻔚p0ǁ{QC. P#"/!LUr62Sa^qp:W#s55+N(\5$1x[{M b]4Sj#]9&ҟ&M`=ORO?Xn,qaW$;jGB!+H`S2a8[c]HǖE=~7)Cvb%f2frwluG!(Ȇwن@͘}Fz0T)<嫎PwR?xFW,ȚL(鉗giE67Vrd?k $hWVyUb&2Qڢ.gjGFY}vdZ;WոP9ؑz񞳴:P@.7|;Ut/1YEw{KcX&F Za}! ,X0H*\ȰÇm 'WA )(bErܸcCS\ɲ˗0KWA3s Ϙ@ JE!"%IsSKMўR# iׯ`Wi'ٲ9ê]˶-юG Z-8*֨>Jҭ߿_Is*&8a#j2\rWJMctװ%o*Trݺƽc Ve2gF ?O={6QxǑY~ ƖXPȩ|fj vfH! 8&(uA0 Dcr1xAwYHy ]:)o"_@ԅ8AiXL7Uieu1tntyw!& ^ZoډbfQkPEMݘ'ht9v)qF'!xENfUmhzrX*jag;Zhd!6GQ村Ej)}e &% Z*\`ڷXKQȜ\E[Щ^'ֶVs'@鹓)j ߘ)=qgVo|H뒗YyZ5ًGtGbCܦqy&"Kly9E#V˵qӢ*C!\ͱi*mQn*'xiCW}"ѤU\A_A9c}XKebTdE=s]j]޷t=+K#xW-a,NJZmr-g-&mK=׊C+N2Znx @S((Cwvs6?㮉(C 4@[Ts})kgw24(h⏄ShR~&kZ dxLol9'"]ȡ9PwZv%7k^W?6o"ԕKȶHh4c&(Y4(?qЃ5ň N"3'$n0^&dB ƙԃyy;( Q)ʨt1`TxѧQ(tG  DQ2۳Ta~@׼ϋB=v$v$U fuJ`GK${eI Р 9M8CE:|c $iz]w$S(l'5Ml6֫?,'\jΖQD,%'uF,29:pxF`bT YS-.4p$qsm[CGQN.>w~ѕ+$7%e&Lʜf%YK/Ch-T\L&ύVv(\lDZV&H$/`iNR`<ԫDJh&rKa`u2ۮ6vآwPNVloqLJU^' cjvHE3Ft=Q?ݭÞ^׹oGvˊ2II߼N ž27Y7M,I#f6|9«vồ8EK2a־ѕ$阠"GO %id+j`8n&8I>vVIj}g {Z"5i $*B„-8R]my!:8j3J@j6A ;ESrFCH D d6@>,.g euq#y肢  n4$ ;6 v*r=qł\Dxaed|dhNUa}CHT37MNtNa;C`ecpk*bAt;$jC(IȉUiaq54 pPFCͳP{@B<TŌf Ć<$N$J[F]6SaE.P(^gG(W3]%DLn9z؂P37?3H>'gcȃ< # R3 3PGE;Si}yAq݅bXtskpƌGc!W{#70CF:!9 0 db5#CÅ*&Fwk&;XfNEy3was8y;14Qk1h.9g>eCrTJqUC+(:a oгb>z68ZĆ';sϘHN`ukuFB*+a8ZW`W`ԅ5ic HZC$cPqY@!q$r#!`h M6"mD#Cu3@O![<;g^&eqL)X'z[3.aFekO0"f5)$I! PI:bqv5h{&5SKt7G]6J d0 68E!SIkB1ѣÓ> 6otV5X~PZUyAA?էt GqAHIx\X+ԥ (, WtJE@4,LJsU&?qgzFNMb7!#~s--C3q~iK7fw!!P7K~ijR:64tWHoTN08\YR`Wu+!7ssRVSNQ9צ^Л:unw:Hdu?lOT+({GtRM>sS 'YW;e9>@YnWk1/ }2,TvU*6Q|/J X 3{$XðҖ:$j~HىC@bכ.;%}d8mY>C0V8 {+eigLCBbMZA8QǣbI@ 7[tC@hZL$nuTeFtSZm'ތqN:(G(WF$Y>U<ȰսsYNj*Pn̼z%> u+T%$٪k ^+S֚@c٣8jy %)([T$?GֺW;Y-oB0p|CH \Jܔ7P )C_xK>ߌ=ߌlYLz5y;8nSP 7R7s6A֐\KGmuɯF!a -{3WBtC{dQF=~Pȃ;kӦL\jL*W]̗=x2'P%AV=_ڸ IRp(ʛDVX <;0/ oݳuϟL[I+Bi-MM,ў[VlKqbZo 翦Nqcl: ZزEx-{iOX޽}3qQ[53yOH;tM~>p#g>\tµ`j߹o_GOx哀N\.-9 Lq .*K2 +d %rs) [ &k!2+!r-'din>2M첋#E+ VDVdZ=Zᾦai+af0lgNAR1#tr ς {"HMe PyRgoqg ?4RkM'P3rm[%%Ԏ^Ĵ"Lf1jatWf +yH*@TlJ.S+kfƱDfRI(>ɚs)iU٧Fw;K#)9dl-|.|7=Vk6.G] U]M13hi;ɞ_ŋtaH6w ]p5{nN#CW5& /ܾU/ ,p<+"gdڙ!JvC Vݶ}e51e-kXqF41]6AY6iה ]XcXL 4]%1u=^g W"ǜ=A>hegRl1Jbu|>NolpաDdu2ӴX# hBd@IlcG384a6?jWtӊ4Ղcxdآ#E;{شm^yw^-h! AD蘒Tv uN wMcGQvPKA]qߍ{Z#Iy?Y#IȏH$RĻ9wFhXO-58\LMgQ= R$Zx|7Zfr&%8 VD7dMCjF-r )=@㓯͠M.+P-M)wG<VU4{45\{ȉyu 1‚lA z mш,AAAMy %B*IK#4, sS><)e3r0Qpk!ma_c !r,QDF\8ڟB1x+A4BRl9;7>DŅ[v %8 C߸=HFK;]9$<( 41Eg)PJ < /NLEƉKyZMlSyń(v8zQkRjkL7H9):-r@~>-[/i>Js?;V IC°[܎;-f i&)QQ/){ QOʲB-`GE4s`<[ -ɋ% du8 *~yQb9 0E4_9( s1t.9 Xr̉{ȩp@"$K:LDz 53G4cܼK,D)[:;M`ŷG da0< ρ}LJYzAϓG0ŔFوH|cD4M˖R(e쯷`wfy}8Ot ?33¸2y_VF :c@@䑯QO\.p8LQ0 `:3Q`bӄ1`e;ѭ2Q%}ͫQ*]®F)UN/e>5|~sT:<2e? ʟdSFͶRCWʹ8Pޣ7&3 TbJ˳.-T0$ ! ,`PH*\Ȱ!C{qbh/{ 7(bI(S\ɲ˗Zl8sqw$̟@ ڲ"H=&Ə;UiǙL3F$ʵׯqx,ϳ<{sٷcłK.Ќz VIKتÈ7T ܝdJvS˘%TT `DѠE^͹tNיcJYɢkͻ7LH W7Sͼ9K'G]4ouν;ֽV jr|T/ﴻ{߆6>;>|^W-QxɝLMebBւ"qx')z$UG2gV]v߃(\iH/(P\S` BtODq=:v=(d%8#&ZҊ?4rAA dcB$'T t!G vhLcX+Reba&j2M)g]A qbָOZh(4鋎tʪiPl\aLLYHib=0"dO&b)-H1h2*Dlay#zBF䏲f(dn~j-y_Uf*{;z*(1ʒm'ҲKCE,jNGMw A$rx=&LMʓws $0$y8&Sc]C+rzzȁkuZHc T;X RApXY@`I7潳Sc0XIJHyXQL)^22$RQG@l A,tvD6R_VT)>1\*Y`4'laK͘ VRgI\%`O{Z8V-%IVŪ&v`ZQ(*,c,6Bw[@u#DA>,Ί'Z{/"WvTn^nPD;;ꁮ JWzi_EO ę[0k&Wdg%έگ;G3:m}A!Ӥ\y+"-1`;V dD[xu(<)aANEPea:Mw^2=Z1 u[q9)x??Œ3!']cZc4Zeȥdi@( t` !Dc;ZH&8hY5 rAt& ƉbU=nK-+A)dkSF dxx+V Dڞޭ>|Z UJd"rj ]kYc_qWJ,cV؃x, tr,N^՝NFQMn7bB /ó&F)&Si$(heqkW?4`z\&pdWVRe%Za#c*1e?F4DG@;n)yaPeJZ2۱qalt[W26#Cs95}%8%3so$ U":^Hv7Op9bBz+$@7H,ATBA2J8gI}@a7ZSSWn2@gA v7zm73b[WtDh_s8&SWxP'MX^]Vo.kuiJ6#Npn2HS**p$"$V"{I]Xo([@ gɔMʶa v7WGUUNOW?u4^=de(OXt )QSq!R|' gLUfU n,C{hZ}!:1{!5@3j`{&e@ʇ)_U`@{_OUi}xcLXZS.vBOf>,~;/:y7 qk&S="DIcuz{Ku/S7,X987>R\9g؍.҇Az|*M3T0H$zoxSqvXI뎷!t+([~ xHxoWEW ",>P"zh{ <QG* GUs)B]%yiǣ%^SB}.Iun]JOCTdf_ a6 Kd“2(q)A9`\|e;$ⶰ be4́ҧ#(RC/XLٟ,VnS5;B"&GQ ?Xx(8w( յ Am^[N x% X f]'&m)7nC]5QUb(^1&b ~QH}I`ܛH4(\P*኷rXJFqE U݌gPz絁Rwe+{$Q*a܁ŤB -qȰ.ɛ)4IuYuA4tE՗M$m$hԚ%̫[ q%Fw"61=?Al$fQ{Բ홡&\"yP"Yҷ7LTCTDagU&(03Z<9Ny5^ fۘ6+Z j!{iF!^{vVC^ js1:®@jXTL*aq[34y5*tQZ2F R 1߹k2CW3h b [1Ш"{ /S4(tVחTW\ 8>ANZ3EUOʳ<IV!r|z[S .$LYY-U)İ轍=Yނl$˻X񅒭<,עTZ;jJqno=^32JkU<Ɍ)b.GgՖFC Q+gB*'BKC& XdBMj|TZhز_w*넬sJDNcIE#XG`-y6\|@x.O|ʢf<ѝZU$2Gmlzgٞ3K*G8]2 S*ן$p0arN@Zܐw3-deȜ 1ib MR1{6^kѿ*2|[;'[B+o5M2Dčg7LUa-DZJ,wSzj*GɬZإ36v0]|43I"G\1':!ݞ.<z#&o&38 9҅]'"a^(Ya_K.G 8B7Jz jck Eѧشgdu^5! qWV pYC0/r@/熰QqN쳦p~r0Yԗ67zA*M/q {Ӥ%a&- *aLIƄXR-%Ke[*4$I5męSzT&132ԢRK6=zT˟8dԩEjpdQQ&]TkEM4m6Κ>튝KW^7S_=V =RpÆv|lT-|S=̔-gqϾFMc=Q)Zl8G Wp{d%aI8mVtHb+Ѣӽ˽Y :\ˈ-N0C\5j|Cn#-")XdO2L p ZiLj1Jhx7ķpӤcE~G9QpEE:2Q4)B%:DJ1Ql4R"*zJ":XQL@V!8 3vJG,SȖ0$, |>L4HiS!h1/1k"Bd0/eѧf-%&lZsӖ$zjai8Y)VVDuQÕ!mђZ+:$iŴYBŞR[)T%HXeMhB$MT]Wla]m% H)YGӆ:(M+ޚsԃqS'ҏ2ftehrU(m"KX s=l4$X*-E;ns_^鳌ŷ'ho4N>fڸ r?mPҥW]T>d%l^$&DwcQ>e%sq&8ƒN[s.prP6p$$a WOsaC"~)xc~C%uЊ+bu%c&HъQQUbbB]2q R XGĠ41%VbfFBRUQ$B15 5 SLG$l"y(  Wdc$Ubz7eLu8 xT[%!tR=4HQ<&͡hB)@IJ3_#LX˜Gė#*C,nrcJ}j~GU]I`cɌJ Yuh1Q %!nHÔ+TcO8!tsW=VPEsf7A3(5 t%P-c1޾uh8sy=p?5=,~Lv! ,``Hm5@ BDHBPȰ=]{"dh/\ڻqHsɳOJ"LTJ$ҧ2(իXs5ϔ#} 独̖S%^[pg%0HxXu/Om>ikI[4a8)~#KJsƔW^˶-&Z" KcGf _TҒxVn:=d-MZ"WeScȲKƉWV^r-WkW#݁bk,`r$n'Xo i2Jp Dfb)U~VF$ZNb!?@pH%ozmvEE(PA?ȉ(9؅he£(LxuefU)%-퀧E&eў{[̤W @ȝƥ1]pT`l`6\AJzh~(i(EoNՕzm[AɅYVEǁ'd{r#I!q1! \q%QDJ$(-ɗ3. *ruA$VJHԲPF5%9n)& U嵺` zۈXNZP=)(gIsjG" VY?@(H+c 4.jH(5yŠ&+fB!ıFQ%P+dh c UDdR,@TSMDE?g-Tλ*VAV'P; )n5moAiJ_Zaz2CUR|P)ŊiO1祛`YIT1-jԾxjj3Ķ]\w̝?䩪{'3(H BqF&B/wSl`™z0%&Qb.~='i'h=`*N[hG5L/Yd{2"`L+c7kCJēcn1ޭ7YfXs^8% J0U(4➚&9GßQЌsrYfC,{'4Ҋu-VE%-T~jbTHx#? .K [Y\ -p)pkF4SL|c5*hM yǝ,CA§pl0̲ǎcԍѿXH I1Ms#?XA Op0N%D:6ьDԟ$MXl~8!!go{v\d ڣfv hp/+iLPp'Y I (r"js$4\&@Y(Zrg7&Q)E {K)&]#2MZbQ=Kmܣe2HOQ0BP$cҨeAiuCU&L$"4Qq/BHU%CYzp*JYjIi?wMJDlֿ;Eȋ,@-fMe=G%vYhD9WCwr)InA &zcfbE=>ѽ|~vͭ ^ nW '-n>׋- ոs{TV*n)nUv$FH*Uvg&TQ2UfF0A1Zj2-L__S` ҝW%f T,Cr&x,9)BƜU(=I"H+h 8oݺ:(76 p4 HX%JtA12T\ƣ%:vOL 2 N'dfA vb)iڦ,Ih!RֲU0iy' -еPP_X&OI6Dʌ)M$;n$옄:GM#S^^_[8%,,שFHVgMpu;Պ[]eã2U@B4$ͭAdbHgvwhK95 ( aBnO{`|{fi&1hZ[D(s1"q4QkkL-#3wNZᤚo:* BQFn4zIwIrӹZryQ֒⫭a SB):t[&u6Q5qj;:y2(ۥq6U=4 \sZ!iauڞHu> V*rgUIkFOVY]hV3~18[j1ph'tzF#}f9''EF=6 RUW+f,5EG 3RrG"kLP/W|91:b dKB1t}('.#hB e0$^*F`3+#tMyXQ!"iGrV(58c BEd]D\Ȣ1(s'1r~5Ba6(=kv<V(- h'$`륁 E6Uh2KA?U$!YE=:qXw"&e$5eXYu:Ym6q&C.HdE@Wb'=&Wz 5ȶuFpdXXxKs" 3Bp)]6m^fSVRBvb:-2B*=$W -dT*/'1TBt9;YegFEv? " }1NNx})uGB R$87'"*eZNtS82nV%#r/,[4B{u V7`e$ 7}Yq! eWfIq@E ZP${2&! Q &%o;-Pr@hc0U8FE0>x7#ݲ3 btG*r@'s1&!3`hM<#]rzȉR7oc 6[OfAv\&%\%$(6tX1j #̵xy,4S'(3dgDŽeJAH Y畋C8fsB-0vlyq|yd{Ud?/WL8$*Ou͕pV)OF' @8!YkR1zR\tnR0VZC+f00wF9N9t7_%-aRcqNwr8W`t"k)2o7Zs lS)LJ:m4ы8$vSFo)Q!( h7|7lNj8ԫz6`ex+iSV[zYL[Owgp*,(\V6ZVr-<[0 7I=L:ańEFG(;?1i6a3^]*`n)d31e҂&!B+xHӳz!93khy\^)1`BزGU{Ū.AJ@A"Zucjs"Bj b6g&jL$o zSwsl%KWmCD5 d9Q&ڪa1؏r8Z>3:}n-hqB#ҠQ3 .@$F@@2scD0 c @iAIKuy,gN*!^ƙvK]xvK{#&;y(+FVՄM烐[ jj5^Z;3K" Su"")"i7:^^1]2mf!Hqc<ŭӤ64Q'"m6yrV*G ץC7i4gt;qkJa BjwX`o\x]OCbojI.Rp XA;V ݱAqP^QVR-6:XPW -Qx1n%'FF8Tk1pBjrNty8qlRSα[dXW xE.2ȇ.!&cP=RMpj ¦IHK"aN=6GĘг=;I(Sbah貿 ;ȓ/lq*,5!ȼL[!EהԈSOc?#BO=Va&Y=S. kr3%iџ6; JUT/2TQXͫZR@ikvzӅ.֖* IT\*ئ[(2dW!HwR4"Ε`k}" Q)Cl { hC` uyv2.^w]a<%d[4h/=1S)-Yy8RJv6ꠉ4JV%DMNsj87#",?>[#ZO5ԭe!<;|(oM.EQdl.w:q!Hfz;Pu8 +n`d@at׊6L;nhb7!+\1cX =piXO1BFP67{GRC1~YaQDm^-v)XbFI -*UeϖL*ęSN%頦-l!RhҔihQV]V$zJ5 "µ|%mLQ^̟X6WPMt&*H _Ɯ(+[cHKjk.ИmkSfrB[De(`Vōsuo :·Z[^wp^m~";3{"Lm*jՅ<~bs绡:$鞃HV$V\? 3M؄zϠ1TH Vpj 6Q3_HIQfH+{9˳yDPk)VйQHThZk/}L*ɗzl3v4蟵HY< j,SςBr-\H6E tN J%@*31!3H*Vq[H۫PR(ɃܯuG:^e+T_r R@V ӫ ڇT4"]|Q],TZu8 32]MiRp7!_iN[l,Da 2Dz5:1"[6i2h%2e~EEI ^?V(sOuްZiB {Sۃʟv{9%E=(YNBV{ˮpL%v$υλp gnj ~O7Hh`Vڡڻ9G#yKIK=^^Vv%W8Yvz߇4⏿t .z_>z)"᩿zGra,$! ,`PH*\Ȱa[ -({ RѡǏ CI$Ɏ,e˗0c$ @Msq͙@ JѣHcdTdӤPJ5rիSlRkJ:P,ֳhӪ]vV%ضn]/ k_,m-X)=Yd ο#'tS-Z,,Rso16JGǵH4jTzzصٴ'͔FiҒB^-HB d=EeҮi8)!Wx.JgҔxw `ǻgY?;r'`AQ+mՍAe&b$8ʀFx#aw{=W}؃ȟbMፖtzrV =*(J;7dT5QMx~i!AI=l&dR b0Fud?"Ϝ@ ޙ(L?!ѓ!2=Bb)PwA݂=$Y"qС7ɧ[ (z{C&AnI-R饗B`^8ܘ7Gոצ{"#j"eQ{Y&y2{zHJ.ݍݺdqf=7!@i@58ک?6 +8 -7 ) gLf-=)_"+i٣1)Sz]+Hu =xkg KO2_L%9 ݶ0ID+[ k^rTeѸyn}e)@fZ*Y+P;ӚvgYwlB K9BQ/|@QOC(P!}(+iC={xh^`#B됛٪vIݻRS԰q9( :J:gE=ي:EۣlqܳXtiQ21ׯjY|8=)$YZPHz.1$tҘ1 RڒЎ h#0Vɛ^$+pN;D-kCA:[t`RPC6L1Tn!3Ѩzf)[hΆaH5 Ȃ@RPE,QqֈIj&QV&:G8b4媁Lleظ2 AN:;K;mۋT٣h܃3m-RvSY@HNFtO̼izED'e7,nŤdyHSve9ŰQj*@rKd*n EWY8*;ʊ װGAL$B&Q1%Ŕ=bq(Gu| Rd~J48AKؓjhE,UENA%;('Z=s]SSs;=n%U_;f|)qGRʄv)Q[p5Y3ъ,eb7,i!kR2pT%96UGS3["4RmTQM*WՂry+*i;\WP2 GXM[t4%y[ ffjh%a3=j14eqN1&TĖq{J!y¦fI :b"Q$W# *A&x ~r(SE1}~+sLZ`2a%5SZuԞң1m#IB7jᣄ.U*ntܓ*BK4YK2ScH0~E'Ծ7KkVcm d~rM8#w>gdߒڢ %eέhA%2J d]DZkapڢbVPL찧!k%+~7֤g/d 3lF=:!*7f.l-CSʁlwRk9 V̫sPhM"6i01q[fޚh>bH1Yl~)a w-[^L}iq4>>'iXWv|;$ kyAW KAcx !v5i\im ٔwDDoL^-HdU{g.ӭ@0%8ƅt1/3izD®&d $ j*츔8b泇ĿaU 2hѮёKRVѱ1[NNjuoLJkA#~S>%qև0424 K`I˷~ bD_Fp RAWtb 1@ t_1!f>e2i`En%V a3q)ti60%R!-Rih=XJW5eVV:W>K !w1`&6AA`%"l0~U ~>:5Nq} /XR"V4fu XS66<'Bvc3Q$: T ENzdoS6 ,P!\ $+8N8,!G.rKt-) KCnH㐈 n)5e?,v.V87|`oR, 6&FWQT;E32}fKZ GIVlxu>!M;6 ;`(7a m'$D_4^3)E[[S.vW8|6K d'e8Vax%hzQD"QbЈ:aHXh6$"%X&]-)vcbO<ц1VB(ƷUT"n@V,^$4H?5]XeL]TsWs1zU5SXaS)sx1KBTXzNw?iKg'u ^uK^fQB:q@rswH@'XRc*%9#cb!3d ܤ}0OGc}3$2TsX@NSX֛PF2=9[1Q]R."Q]e`ͨыw_LU:0&R~!}7,ﴰ)ab0>1J3|$ Zqa5LR[[3;:%1UU#)*bY 4z*AD03`}R^i(NQeAbզ7F~VXsw(~9>!57!Vx궚"-HdXfH7FX#UMkZaym{8Zht-h"^{f?ڎj| Z$ Dn$H(, Y4΄SR*zc[RLImD%{*D5+)HH}| lfORe+^BȦ(XRì/6xw9fp;pm)1 %e2 w@wkI|8 /11Z'C(dq9.'AJǘ½Z zBf-3nE+y%3"77իMafw$.?j (id4)h;'w0ۓ$˧u+ |JxGqFQxoxh eRf\3W_c]Hڋ?k[˶" r3Cz!s6iѴt˷~}ҷXsGQ ]\|+l QQġoxG/GSlB8:ܲ:B&X&%Bs1BxSS:PCaQLD Y,RiVEeQ60s';LC׏!?6%!~%ꭦu:E s&'2c1 rthIL m')|2|YlǟQT"L#5+I#o!C_40 2qhe,/ "L0Y'_CS~1Fx৳H>vۛyPx"١ YpU܏SDpcY vC R4I<-"wSHrb:dZ$vdiˮQ=ėa?4 \~2AqP)°1,1`M- 9qȧRucbbwD VD[7R"|Ztbvv;!Q(1<6V쑭[WU@SG7hK&r>*f:6W69R 0 iuEm'٫sD ۋWwU\Z`aMU4t--|BQ rm])2 _:$$7&]e~F1L 0mtn/ߜ`!Vn܅ ,#5FЅks-\2}!;rS 0_;86AG X+ ߪޤ2I6Wɷ!3[kZN=. Wh'+),SqO [jhkbhDI:J Wu,D̲϶َө Ae_ѢCYޔ@1dq DHBaY\{i6ټbu$-Vӓ%d/ IfvQlNi&;3ex-bɯtT;e(%US᭪Dn0g[>'ȩpPQJ2&'y+aRUv!WsV; fb"<24zctJlEСJ|ͧm35;\8&&69t54Ј`ODJpnX+ ދȔQӚbx0Q[W307)8MG) 71#y4]>%əFi> $wւ-'Ҥ asОuz=vT9MW,;pOQL1J2@Hտ >L "CTaF1>aČ'eJ-;v RLo8!J0EDsńMf\jT)IRE*լYjK[|{i³5ޥ⍉W0M&\eÍC$!-Xf7ZSF4FU̹Qa2~|X6B{M2KÍ3Fk/g{.(:{hIgJLћ |э^I{֣]3,n?Kj8o@K$ Zm>(!7Cl3.A:$ =D1o*D,)R-+ş8S1H!iVrҐF"Dq,bDIVD MDd z*L3-(96 12$Ԣ9)˯"L,k-{$/Sz|<'Up98 TNMFDJGEQNHR*J-H.geKRoP͆ae6a$!{3NMmtN;qQ@M'ցV >qFUT;vkt%2SNlG{%H#!v,BӃf.XM5V[ خ{/{Hil۩'ecOF|{ȧ)}zV02 eI!e-6yvF2#05T0L[~Dݝz^ֽZᆵ'F!T 16B-k٩M%Q7'lM1UrLbQyy"e'[-Co"j#ֳ|Ryf5њ3Ŀ5e.v"8sP?Eۇ6^o:&I[Ovjqe9 k-M9VxsEtۄj%LP'2JylLa0, 4aSK mSomXw"p*QN9jG0 hif!bryyeDr=χڂ dR-Ž?dgڍ!xYN?1 oe\Ci;#wi\T5%%O;i"(@hQBiT.GCY*cqR\#Ό@cmt"kRld֦j*E/U+.wUUny˗|q[Uh~DbZ י=dx*#l0d잢NIUD ɞY:@l'_[!)6"gm>pjTv] bĤ*'BvNmQg3nj/|4S%S )!2l?>ΞKq+|lw„HG@ʋLzhAlnPsWgDNM~.%KōRW!AM>poGs%JnNǷ@k›AsAIAaף1lȶ(u P}r3B#U]eC~%=r3ph`K!3# x-b[ R>A*IxT#-H7KiFuDV ċբ EՖQ(n,W;7m}K:Q9c꩎scǕne3\Q + ijHz4(abH5kYFCTzjI[-::kqP&2 ,T`T&.-&(UUJ t `"Njzi5Y*i-\>3цM`hc\a;]k:Z@F&D択uDuGqP=I9AJCKR< m'pd.[9qJL0Q^!2\! a;FB't%Vnz,ks.w]hFDjJfBڵPx4lUE JjP&ءGָ@)rMsa$~p`/@˓7# S[Qt W]RBYbOX!]J UTIx |_mP3֊XYMR\S҃*BxPcpe 'db ~w#G7u9*{ႌ| aExABO ²1qTT)e'QN#4淂_UGe&DRV C!P3c3I0Mt[h5s*$o^ASz"HXQE DZOdb\b`A.clF3V_i7QA[@ TvQR({q&b#ua?+{@[8g;UM@r:F4?d wS)9 ^LJw"*DĕZ GV"JCxk,@Vz󔦁6b#q_E2W WGcW ~5R]ƥ1ѵuI%e ZQ#̣Gep#qZjFi $K74Acy3?R'&V㛊GoW%y!zIL!q:s2o`ec^Z9uev"\c Rܧ$c ~5=5>ٍEAn"I?gK5a^C"9ᤌF%$_$ r3DעO$Cdi VF`J$funPA2z11WR>4*@LBlQ!8/ ]@hqb0B+jgg,a*Gj bIbPsHI6 jri nK`0rnVpa@YC`2%`ǝT'(A1@fla!VGZ>P:0؅t|3 Ud-lZD'$y0g'a%cNw hyҌ6Z0@U'8&VQ@)t$J(O ؒ&#AğJY4ARt;8GA(*W>H+H cH;Bⱎt?~U!1Wvd 3zP779$A+!9 *K*C}PB{.K9`1')S>zmyGQj|~(QU|gD;0$[]'16@zHQvVcX7Pg H+wT Caa1F+qr#7^1t 34鹍$}qKbg7P05K&nUMev(҇z''Y{žjN,xtB3 3{d9il Ĵaԓ&J!c+ JSeU@Ы}å j^NWer'6GBB 6G@rEv4G%uo A!mxb0bC= WJD 7K9l|~X5YܩgE@C{Jvy+^<ț%|s1ObܧO@aB51 $yɿe>͆Bwb7@Bh_P02/zZ|kGELzGM\=q7vwuyu9T%4\$(ŀUe?Kp+qD 6 Κi3JW]! th!229))95U"J8eZpM쀑SMQ d#)YQ3ƅx()j n6m$J+ ͻ\^QkQn;x%l3 ۺpIz<Dkm waXp~V8B*Hܶh+XZd-@ǂJT!8 hT6C*W24͡@S0͌ftRGHe fFl1gQ+ZWkoq:!&y7$Hߜ^&_r% 1L1K^i)nc@`E\8gt1 [gv'r3 %ྡྷ"3[UՑƽWQٟ 2F)"Q+'I>< )#A&jz A Am-tVK(U|3rMMtb|'|5>qPB84EFxgU=sAqd1f9qT93'X)bd"؉5uWK7+J̽2:"nSM/?L}ٹ;s6E*STPeFf Q(^9W8" 9,aY| RǺQl{ј# v+A?s#~)ܐˎcQ87^/^6$A73@T_lBg+1hҔLlC{6ixQӖQoiRoH[<( &1٘TRM>mM[6j޿[%JQ@EV]r7N(U1 V֫eQ0v2:L[%*T/ם^%^] QPMF 0j@˺Iyڻ{VI ۬~6DTDsx—m+M^}zS&uzs^>CϿ O@X̮plƢ;ۭC .7s ;\23DD$"ZQnHŻ"$B1,)ZeY3)ϩ) -j-kh"T$ HS)FYTgPR`J![6=%}rgkCKFp(L:#L|~d Cs yQKhٮpRq+b@/Lnѩv#&~JBb)/A);hP1EK/)eBVDĹ!8Yh*RuPjᔠ䙢wP>z``N<, )*f*93LY;f5`٘5F?=ȨK*D+ӲѧQ Iu2]1S:G oPlWVV5$Ib\d Yk`O|.iG:Q͡vatqya~:ESآrSwr9XEVç="%4Mriݠ性Z>Ùm!YA&MK[g2\BL;DKߎ͙Ϗ#}B/ih^Cnxdzz!nfkc6 Q8N (&r;#XᬔVF* ADQғnKȋ&J(͞JXe 옳L⸳ܳ5d.F8xQhM:KcH&)x@%Rj ك"#XKU,Z;ɈK*cq1nڕ5ۏ-((%tI*sU[ feK=@^ؤ&[xxgtP-\&T(f䅣4YDT$=wœMf'A(iFi6fu=&I?Rfd+\OhiW\L?ͺL&e3зI϶0MV2v=v @hrgJ9/Uk#&-T| T`}Z=cpZ!O2C h3+0ュ<ЋRw6}u4iaCcO=T N+ܷhM?B _j ;ԢLG| ),}?gx+jz+M&$x:Aԑ=$0)m"p&Xr֎ DsrŵOLaޖLl-7$ k[D?;} ;k5QtVG9+MR7BACEʻO:u_|jܲZOc_^`t=#e:(e#L_h俷|."Z@n6SZUL[h ;{P,[_VX19 Vz`JSDb2DhڗpDLfғYR@X\kHh (F",Aip@ _b='_CƢЋ1L,QxI1+DVZԂ6]-ZYLdx, D~q,hH E v|-vaڧ9TM10!\B̆oEI !\Hk3`dp03+U"ƅ6*:'d2&4Kj"7# C"yS4Ob'di,c]9e2]gRG$xq"B|Ә0v vp07&ll]D>mA}Қf`YԃXϐtt$B5 )Z|xԊV">)&LgRH(*j@5e99 05SOpHSUld$qI@c=7(|T=\m8¨C ;Y$FN [B{VUn@}y奏F/_S"Em)v̦gDB(ԃ.ihޚM}M{>Z`ZgwN9!}iV;v{DKVAT\ m!=0+qu}hV< ^UceުsMhD`mfW"l9M_pddY}]8qs:פu;vʯIjQjg 9=zBƊbeD3}fV9z<] ε)8j-Q$ oܿ4 7Q0.,FM-LlmXRpȸ[~Yit16);5woy ńDa-R/|إQ߸#̞bSj{Du9(HJJs]ܭ%[wO, [ [yoq[0dJ%$gI '?}Dc'/>s*3A2=lV`TETb[n5}D=&Q61O)! $| TCsV{8c4S?8HsGHby#Kl053!CW=M8GFZ/1d=h' T)[x%a`@ )slE$;.T03)[F@HX;'\;XCJI$ D1e.p3A-n4g^6Q„F F-V{"1qEO:5`:XA>NBvC9,tw& ,LȖc`%Wh3١8@'c\8}}8At[:8`?!K6h6c3 w2I/)sd8#5~١k"wq7 % q>3{R6 @ ZDV16!TAS[g6WCS[+ !drHn)"b 3}pxƈ/ u8hi&`@h?Y(2U>%ilҟo J I3?`Vf4n8 v6qPF"A9D#&TN=V+*r :A&D$sQ(@@>Oyju4@) u$#@Bw ,h]r$Jr=攜k& W [Pzzw *24 44;C jǙ" 36#19" an'%EgRiFT_CXqF"h(z&`[׹N$w݂`oae?vv4vh%=|$W'e.X 'aSspIy&c֖!$%JtMHz_IV 7axv7i2`UIHv#!_Eka YW4-%!+i;F zC7E @5&crSK~1` \dTZ cvOH&\3g^TKdACk/]rg' "3T us83#9)R/a}aU1nf%QQ !Փ5UEh( 3@£Tty Ej~%FXiɡfDJA&;#cZ `OF4]Ë1e( = Eh(ʁ şw)Zu5l%?Z4Dc"(('KYu~h*i6GAX疧e) CՈx.DYAe̊DT@|*"e%uӷPb{H**2h..ͦDFxgXd:k3fHw_yB+Y7^*%]vtc2)wՐQĥ FIJ[@H}E+I!$4J'"s?'>_njYcXK-TjLn"w9B*yk-<ْ---%9\}-\,aC g=:iZD-l%iڐl.ˤ0Oɖ @'daM8 yX\zt/,"zLv!a7 {Bvlbr2XO1D`˱s4 O7wZ|b"|9cm ,jҫ\Ua88/JE=R;C@KyYv!\xZ;36@@1^{Mu,NbC X=e#;baU#7htCxOy|Z~ORI~#3hj 9I50[>X;6gKC<3gIx)%#rJǜm$d(?cBґ]`/lF, 834m"g|‹Dž[ qLj4JLbM]g]Ң+I1sD\z~(CvP`+[CP!" Bd߼{׊\Q?cxJ Y(lc(miW5< ٱZO阅-+=͒ns?@B"lA?#=^$2ĕ`r+3kC )prQBw*]6 ud8:ZjNq/` HY:"M&wI @C"_j%((+%Çxb1AeOa ,NǮF4D/Zqb֬2M2lH3. Ǣ#f*o6]Uʶ[ #ZoJI:Csx1G>sҺIRĪlh.P\3L&vg1s܉v~G<ڧbq8!5`YBl2[ D+t=DW}wD#z6:JRbK✞I:U8m7=ͶCH}u^QPUܹ6{T`<@ g:c0UA˪Nd@4 &Fdӯ_21;E#e$u?Aޠx*Z!̎d(ڰ*BMA#áRLK("0(Kjw@$E.?pAؼ2,Y!m^yb&` ]g. gE7~n-R&pEY. gSML6h ??ߢm">5DY].i<+R&Fv+pe MM}eQp1m5]x#JԔ)$) #IJ `a2dK"5|TPE%Ҥx:HHjbUḏWj4 ӥe)/b׉|iY[] lMWXThkNn\xZ^~8L$|ȶ-D-[*О#hl7߲s׉y1½8ƞvi Z{NU6W+ J^F^ը_&ϬQ}o?(iRD=RNQ 18鲲G< {J6I6vKl#M;Toz"H JJ\5ɡp2ɦHd[$ն[9-fܰˣF\ȟPϣҪgA@K(0RJBvt?clϯ5笅c1DC"t(4{6ÌBԻ!m)'|zXm)7z "R]ha8ۢ`I5tdK-(嬜0Ғ[RoLnl# (eQ"tH.5%пٗͬEQ %:LuWpXDYEZq-HQ8X)Fime16!8j!S2-vb!ɞhae `Lkdn$hj5ƉBQZج#|,~9f-f'}$/[ )FJ)ȫR!l)hmEϓ2ON!&Z+KZ?>)g}!h* cLsCFm끞2X!)v $'\q4'kZs_;w/ГN连ۓŶgJȯK4c "ӓ$6!-ЂL>\p~DzDQK2RDZkdA#zRWGCC>lDz#шL5x ȄB(>lDQ"4D+Ze[KCH5񉷋Vl]2̺({p(J8{$& 905Syjі3m y$L^<YHh>3OQ6 7a0rrb)#+XZ)C5;/!Ky\ dqY:L?U=ݶ(T~XlB@aQ=Kٖ hIl5j<dK~|QE)aRy z"Q?ҕ+0WW؂{rrpbRX,i/&H">GLo$C*g\Jt-lyOXG3]2%@X(ф`_.T)J!f@⍦7?m"/Ap8/@O#'Q'%z˖Mo`.F$, V b݆ ۙv&wta*>eS;ΐP޴"V!#^~ОD!ynJXX/&g l\yvliR<#&t;MČl@,VRf3,:Ej_dy5ĨVOfXe.ku;9ȠPobnHJ\q[ѳ`,èmOޕx) a 7Ϭ=]_U'N0i R87F$x΁Q.n c Ӆfk.s$iN^tj͞3LwmFǺq![Z=?.=+ݼu+, cx?pPf+yxj#! ,`@H*\ȰaA[ ({Q`vֽ!簥˗0cʜIE +N\aϚ@ J@GB(pӁ3&#-j%iׯ`Y͂dê]˖Դ7 )u\U눷\p LaO܊ǐ*tI%5 yf=sE9jӨ =k"C`M{h卍U~Um6nZ4`+oPeQHղ[Y/=*D>Qsh?ƑפUXd~u'r%( yZӘwWR&((yrlR!;&nQYVVO7ߌǡcj3F,nH}:5=Dfb FyU?VfytId=QQ 9E @&#Y)gd NkxBAĦHIlsrTDKr/'A,Q؃y ՘ـ b:P`Cc $@zj+B lBlvg&Һܢ!=[hqd+B=ä@,/d~^[j!R3*&ۥ Io]ToN:CUf=b쟠;i{ijNA ?ndQZ튱 ${\s;g,v?{!OtO]/C t/"R [hB IC&h&\uUr` +툽}Һg2 _= dj;_Bt|j& Bu]%6dGeE\2< ZT-v#t. .D1՟ 6"%L3Aִ!Q1yoC%hn'`eLX*]u:>D=EK%bHC$NUDzԹcS)RbEMI)c"XS@-2!Iz-fBoF!Z8ThƊ0R!^(=MT ~;Ȭ0&2^(_3\ɉ"?HȂ4ٱI.(Lbk@z-`qZSO]4L\yq@"gɹ{Dfa$fD!91!L)Di]la,P"F@MJ﹘IK9dJȔ T_`;X"TT SxrL ƉhHS))mh\=uDXl,!I u\vTÃ\=dq=,E;ӘMzɕqQ*y=fY{im0g#jSebit'` Kp#Ecl?i"p;r c */ǐH.(Rn"Anf+̠cOol디wlMnBu7556sC n-H-F뫝W QsY A-Sw£1"RJLo{v:mq w15j:z5#}nAHBneSX/n=)0E c4n9?"Gyi(Ra -GVz:@r kwc{G hXO״!AD:voO h5Eu a I"?|kj} h9[7X<(6QڊIv{##8bXoX1%%f-G8q7I"w$/-)\Ey$*z'# b]5%8J" Rc#+otB`Ll3T2>5%|V54w2< SA:)Apf%p(v5#0 ifVJ߻@(%ѮTDfJ$ꬂ 'B "B&TԺ=*fŎVVA\4Zx^<|2{2 '3@h.1x]9q x&nc|3s[L_9E!2`;]`t+2:(R#S!5:dl <);S3Ώ<%6ܒ@}G Gv}o-S,dl+S4B[lb Rk \!m$Bm2k*7eyצM{'SK<Շ(ta-  9Qнډ,Kȫ:)uFSv|;y݂M Z7 w!vCLGF8'8%t/a#ƳVu6!u :=EV>!j/L! ue\k%m +o'h;BݭLe+ BؽK]Fie!PfD E>rˋDȑWU þd>>rhcf+,U*jq5%H83+Ս#!F6毬\\,qRTS/ɶGa]r`&2WhUGJw8׭@RuFVR7[C,:#8f]sT+MDrlpk .kK ٫0\άc:}FӡV!-A.Z1T7{g352jc;. +'T }Yq<=Q./]&_w1]yB^*#W5.02Ezw%"KBA>>M+01az'fpi/a>+?|]6 -#޵O>0$Cm6 2bqZ$Xe_Ue+OgYh>bd+,E!I3Tۨ;n Ӯ &c];R0²>&!8R9 O!~FQ̃kuY SÞ聤!z(K?ÓgN4K8 CI,}PCcjEvWS_G^ 1W% O$u@ uC'XrZ@py8i('vEo.ldQU[ӱ$ma; {FȔL`DXI6-ax"Hܺ_-M-lSS=|G=}TOCAe%ƋB[$d[ 2H6, WϏEKdLOej*nϘXQhڌځ8vjI{)&v7YrϜX92e[*l4Fq73gZhe˜'V ۲7J4 Bgì}g`c}@1j6g8OFd4n*aSi5#nlLFG4j+M!̞qII0.gՠRLMp#(L:( Ĩ-+޶[++ ;HO %pCBҹb95òM7|cDz`3 X $bG0D52Mj@>ӊ! /싐qAo;sŪg9ҨI>(ƺq3էv6L-'j 6$ʄͦQԶL(D(n)08ִi,93p,ۺ<-]#;A42M!> /O0ތoUڊcgA0x'+$ Mp:'C=T,#mhqkb4k.̶۫*{.5M M7*o%=Iۈ!.X|*Q"1V.PCfrl0}R .jjvd(':,4jID6/ʰJkv,KũפM@ C5+fr(4D̃82 d^*\eq I}ˍ)ⴉ(2KEԘ5f1,؟&FTҘ(g:7bәI3_<On͡쒛ߜZhJ֓ӜMӝ$5 6s Ji'^ZJt;͗EOj|%,dgH )4ES5D9zJre)H` @BO"oJQ Ϛ:sxCYSN]L&F1 &I-6q-m*q S? 9MJՕbBߺJV#^HmuЄV7N%i4IשY'o`ڎoƤ2uG.lEk6v4E745GF0h3YmN1;R8RbB>ۋ)xZ-ۖy+ZҪ1v&~W1Hmf:@chFR ' [N'?|fNSKSI}6CfĚߺњ }j[tVb÷},Uϊ-ԍwaر b}w |aO_ȑ^=kc3Ok/ޓӒ^F|[s! ,`@H*\ȰÂޭj{D|Hɓ(S\pdI7:ɲ͛8sHЗƃ $x+F.MTӧPJfASjaFHfl:kҤ2xٮpʍjJwϿn^egYHia㾐#sk![̹ïADtG=˞ͰrfٳY!޲ JԌ1n'J&jh؍G_Um>ξ3͍#Iqx"~=ҟ&lBHdQZ bq]O @j@6i1p șKAmB] &7}=G &Y A8F(Z bA<ɆmQb>fV04B<)Ps 57`i=>ԦkdRFX6# '=>Д(ГϱCQO(-eX@@Y{H|hqRf]`$)6Ѕ )AVd[} j߰jΩ$i,E@\ usbi}p";?#QxzgԮ AUCl}OrZO֣YP&bģ~"!Ank m&1 ? .vl&[c q#a,dύ!0F=$MjQj/8k 3+h=ʱmc*c7ѫ`O=x7ʑRDO6֬"dOFK-VEnSq; \U-٢2QKߊZ-tJ@c/@ ffЂ%I" r pygo*}h(*r*447RK1M67;$8) [ Վs‹ܔOVt¹cߗ:I9Dd#TXmzÌcA j~sVp$XMl /<(6kYu-d,IL<0v!W;Ix8&2y ֵؕdz1K-&- URаe:`D5kG>f,#S~0~Axv@ (n@d EV7HG3l$V;Md- y͗֙ %^[ %)Dr% GȘ&X1zgLivmHW?ɬG2ɱ,eBn`H;L7QD'Lma!fT*r3 Oհ `4Vt%&IAՇiBWtKCRN5,MH}ŠlJhe<&PJ"<b1ا99DA"v1GYf2$rHӛ 4/f`cp* 9W+D Hkv(1pʷ4H^VZ$R$ZBBzL 駜CB гBȗ0 K,|!CaHQT j՟jl0uFݞـ.!m"ĝ ALUK{cL5ĶDqHu A^Z09~!SذQmAj^{+y+*E\j´b jNi^+!"Cv84G [yLt 0U%Ck7rEHێ2!\[+HAPj4W %-Eb\%w9*IpKҰqP[6&8rxSˀͲ:nDpqS):b3S>}TH 4(֎RAnYrBS-+vE2 'Ĺ yvD.؂ڑՃvVTd88:Z‰ qT.OR_,I9dLvqؑ *'vi&Rf$P89&$]4Q@ӗq ȁfQyF[KvyrI/Iw0 4B*СPGe#ҡ%5{u~RM,V`̊LX#R窎g< y!E݄p5lUqm9IUӬ=73_"8Y ߋskQHRITG].X#_$xxօ6x{TMMHv'9R@ݳTm~Q~r,!`v,wwd `3j>1GA8s{E{A=1"[@?qx St> t5zE|CEx}qQ<A2Z2'#TfF04p-31g<"ET>1R+M2&c 5 A5~]&@/d ?r}RB?8ŁU~yM7_ܲ2%Ac#s>$8}B1>b{Ŕ' "|U₣'x()blg[$=-Y(t)oTc9,r݄XE;dgFac8E),6@z{i9h'Qbn-1;_r("w(8@PvmeYn݈Q9GJ$)@ Q9%xAy9' d=Rpv*W=CҘtH} ؕ[HN`:dkWIv` "amkV7Ev5 Q$|b]"GY E)zc1iy;G]7z!% X=9TѕC7R[& $H<*fA{g!}v&V!Hт IgD0&1O5+"1kv ] ;'|bX*yoLg<ر96|C'Q!B c;YҐWvd™y+a3V!1;uv"3Uv^icc5AFe"7G/5oEaix2jY"sw0]i6j8vez~zm3sv14] QheYcq9:nZGoY12XQ28Mj3CvI4++#zc((p" ?[l\d9ef#QlGB :540 iI W+**u˜.xwCa_WHMz6saI4+4 v:RcDB6K]7b r.m"9L0u@kd3HI׺A=62Bz9^)I8j7z:a Hn=x5#Av-dq,d9}{BH:}ϚL;[ HE zAb@5bAЩFF@'*A셎Y@|VX~WfHG d_DVzéNJԐI]K)Af'mAtub`JF-*srqX>UMo%ۀ"ةC\'w9&0Ydž jDQyՒ$V,a`)4A+5=1312H 1QTP$&a@Jh5Xc^Inq>kՒE2V;<$*ղ Ez!c'E!(ƅe6'Þ|~Ԗ7O%dÔ\> q&$}M6L[sI/HS"C&-?_8@<=c/& 1A?_T1]13Z05/&?M#*1 2 32:6ı T {H`W 68`$5" 6PՐc@+XpV9D"`DkrU53<-c`f3Ku>S>ZaPC<0IV$S!φf$ٗ1LZ+/Y|[RߍC,* r[Ԭq搚gzs"wޘFd&ׁޣcf(GwvB  4 !2P.M94\Z 2q>ܒAX9D {]C"\јm (&h99n\XW){8Zuے4^jUl9(lSۗ PC7a,Y5mAl#%̆[4c٠uk"E!#e$pu*Ph_|#Ȟ4:.͌eJūn>;a4@,TIaU?:BޒYU3. ?c=`U~gFEBXRB:CQMMM"L<R knAW9kE@P^F<]Ҧ,nT+η7>MRL8A<=vq+|'O (ߛaL@5ҥϊ4!/ yd;zz#"{fiJƿV&AVZJ4_uxdb`9N&Q@ DPB >-{!^ĘQ#C| $5PV~ܘRJ-]tI*‘SNDЖA=ooH#"xTUvLEV3j$ 꿭en-PY%@&vV^e;*) !Ծ k\ InS>_Ɯ9帑q$;0fS P*[;&?fM0hi=G;mo}  pgqc|a1&5juܽlTKw MnOx{GF.S}Wt>,8L /"hj-1ABA,=D1oъZĆBRK3Z*SZL-C{R;hZ:13!Y̌jOC+( r C,tZ6hM{N(N)I$;e9ȪeLFIV %M[߄(1[b';uXs #h:SUg_THImU~͂ A7ޔP]7ߋ,2!MX#G0`U#Ȟ(#.Hb RbES؏Y*mdH 凷YfVPT]ML٠! ,`@H*\ȰaA_ (DPୈ ܘѢ{:\ɲ˗0c4#E)$Sϟ@ *M-f$^Ɣ&ҡXj݊bφJɵٳh5B`/ߗm>mξIq@q~؝= ;Im% uW?T2+!3FM)l"+'&/_o(hbu=d&! &@&J |~Xu)$&C'&AF$ɚ֗es&ev K =kf٬9|h!P&~>dO24ufoGi1$))b : }fIvĚJ4ޟ@ ZSeϚۧ#"ɨf裬6^Id?}J&hkP=@ jf+nb h>VdduTԥ?g6TO#.:mA$qjzm@uk8B*Aa-gQKmĩr`AE)cJJ"+k=lJ*&9mՔmkLd^ˬN'\Wr6uM5$DuBG uپQ|ߡiKx|#(ԓ`G#bעV擯9zۍ6_=$(SٝJS+X!>]v^eRYģId;4~AٲIKN-u|5^4 -)4 )RSf)9σ?4>$Դ$V M$7.5~+HS/IɎ0?1a:$,dK}I E~74 DSI2! 4 Z}feAT E' muU'X-`z'"AIw;-D|fY`*A `Ɯ(p0v! ;@Ra\Yh.eo#A`62V,T? `"AsZ(֭U1dy9@UGFɴPh+HVT(9s&U yQoif6aZ0# )&GF%DZ1^éYSi+kqFuJ$*؂WTOUAS4EQI&r5vS\;Vʇo 4ʽ-s2D %YB&D^x,fY= SMȐ?È&@> Z*Hj\rpUC\ӐמУdƴ&Jr 2aT,v<1pM@E>5!CTxG[wōT=S_0߁<04*^w2L .Y1_D;6E!(D BHa;%d5&%hJC `f_Fh\M4[GC֖VffJf@ˆv3‹d8!DRȦ@t!`$U傓Nq6֔(F`dn&e;XvW-Iq|$,%Dj;cd]zy \ "1O} WɚȮ6e|a3>&%Q1? dO_v5Iy~oN%"*̈́c0"n#'Q)eduOM8ƂQ<ޫgS|W ?1S=?WU<|jŝb&QsOsg b-21I]iaS%+8ogUT;Z'6r^TFڵގrMP1DM ccǁLՇ}d;U1q{;x/O\妱s5*YV㐡Hۑ=2=@ta . tG(ء<+"0S[g%%t;U<+2 }o ^(WQ4c<#"g ]'G(;$N2CA,C4Qfq 0!PZ q,%PI Zt\51Vqd0&3ICɒmCc| v9aW "$>ЈrF&_ *I0 .k0vpS7b7!1a$ф^UShz{&m26ya0fƴ1{h1 !a-&q⤍2y/1]D&>q5bP%[cHZxeX$8|wg& I0ursةSzl;51(<2$74S)e+hLP4dzs9BA`ew-ep$8e-"@rc;DAx%Be)ɆѴ ".{=7j{tܷHo;UR/ ^ 2z5Y𘨲dqQxV ~0: PM ָ "͗VW뀐V|!R'i9aVw"U;; D:ƀQ T"[@ ,:qhA y98erA0 $ 7jds?ϡ(P װj \ LJ5 YDlS28Awkg[i@!rB59"MF) Cxa1tCQyyq2_Th;&6j )0 $ iR3_H" $%|X:I\'y -"J>kHBm1S{D'K6t>bZa3BdQ:BDt'7qgJ%?쫬# ܪrB'B,Q0+ %CA `ijgaGTG cp:3MIc$psZ=D  4qQk;FD{Ӵ'>pgNEr/Twm7hG4B,J]zBzhֱ$ l{K:GnQM;W26@(zoi4IfGa(U4`Y$Dڢ؛`+4rsRk$HK:W*CeD#?C8>l=S#ܼ7՗F4b4: %p$vL|.8=w!|KͰG5-O' ^@Qv0²3Ѣ}oکtjN,<$!4et^bs 3Ʊ`9=&w<͌YK5Ed'WGI|rУuDH9ޥk؅sNx{gxpN@ bv 0X0)m98 85E2kID:GU:֢?pet8t0)jxM@~zZL)RJ `$[ZAoE! οq.Q2T5fsi@}|Uz58By.8̦dg(Z!Ί>~$ 89I|l&CfѶ)o޷!٩۸'y @e3;;[ a@ c_=^k~3FNbe&0:R&aQo&Xv=!uEc2=nE,Mga 1g*rApD||L}~gl;lZW914x{(3N$ʎ2)^+;M Qv 9v]v託AeXbIN|~x a& ^'m@=4&c[@K/jp3^pѲ IGǙ1Ѩ[4TAK>M;0prrE48ʴxx"6CfA%s`d~q؂+yhvq-CRXeNq_7uk ;b%؛c +]@9E5*8:K PzհUd[$ i1Ao`3Xu!  5F<9]6s>#D ib'HpQêq6e73 룘;M2̝x-$ {(,DPN!>>#Yxc[1SIc9ls(v$K2Sv/cZ(zl,a.€9xuAڏRB"~;>5L7qL*8T8 Q& DxPTQ)R ?2UDIT;0 U&)"$I5mę<h!t𢦋I fҲagP:_U:fR|czmZ-|G%TZ,zPAJr@MdJNʕs|hV#ȓ6jF]X.-ɉ^9f?"n(zF< {!X%T ڃR:)-@t\׬K=6ۜv (T+̟VVJ2Ô09*E!ʄ),8,H^O&ӍłxhƲe/QRjv\1B!u(Pr{B+B ,{6-`.o2j&mGp;'oG҄(s'iJI̢WYyq:Cl'}dR Yb}0͵0̟f̡vi>oi']0&(\v߯Z߬ʂ|§/a ژx+0i[` z,$&~$A/5:WE?)Fi- oBB2JT k :a}L8,+ F\(*QnR@A>=O=/"Eĉ<*"D8»|*XAjHH%C9 <g&d=G Bd6yL')Na,It(*yęLvH!M(KCoH+7W!D#ʯ ~LQ <]iNmhAj3BwY.z=cfԾonw0dw,v$X:Wָ1. UR߄b}]hG-Hh: I=oR-ɮ)&I ?YR.c -MtR6h92YkՏ-H W @VlzS3c܅*|Md3 \.ޛN{B.fI8i0KfC:YEy2 SOsRGDͭ-G;Pu3$6]R+ӧ2;j#6tBc.A ȮG-v^-[sZ72ol7ٔ6 Ǒ)80<6")9 q3i\ 2&nBm&A17pArP?"3`b+Г3g<#!prM@tG&fc&}80FHEqdghZWPv tn9Mg0d"XUdnp,8X Ms|;OТ#d woU>(Aw}a4Uo8T14ōyYPi5RaB ?T.&Qh ! *tZXqa'y#{"q$T`Nc?SkpT4e_1؂h0V^m6#y*a(lEe&  b)25::-ojΑbB-Zr,WBX(2G ,Y -z>b6eAdXX[8^IoӴ\Òh@P4^uIA;4]K s5#"b8rG|$akiЪnu.)|ܡuT-d "IvãUir6(Jqg1-Qʼn\r i W xl?)/ tr'GHwt52) ֘.}H _t8Ki /L"H} :BT"xuwxr?#++QFчL!2ʨEgxg) 3YwyYr$"V˲a5b8Z/C9ŅYuADT^KC ؉3ށxц7%)D/ S(C+z& IXq| X*u;):ͳ%1Gf%%"3Z6i]@ cew*Xb|bbOɀQ( 1( 'ji I$ ,RZ\7Tie Ӝ_&G׸"4rr:$3l@Io +[mGL;gq,1" g(6QEdTf S %ʖb]-l(mԜrd'W[fnTO'܃H"*(Y E8\9-Ƣ=# б{B",5t9{Ɗ > AotTUYa*rQ)[2EKëBUq/!t @I9hP䉇غo[8FjK$ 񒑥K鬅Ja͈i쮫<ӭvDAyxf12v:kղ4m-(IȟqډzE4gD%܍hAJ؁^.Vڹh<袛F{0l჆ .+R_2i4 ;XLC Ȳka5A/J! 8_=i6"ʮ$w+iJL"$Av(Kgql;Zf;_hm<;3B5yNoOQeWqq[z>7\ J%<5jqE &畴c.{KMZqPN9d|2PW \4$!W7)bɏR IB-MEacI*:Z,"jъ8(0hEJ$ pqYN nG"JBQa'97c/MEIe͐㑾1Ӟ @>D$A6L8 CQgXQEkeԤ68L LDZ,Gx 7˶%UIʨQ o ވi7b`Lf?ڬ("խċ|WHY$]a&IH :E2ev@$#hBmjE[ޝc2:O=]-7P$T8iRtp$hBʦODdL=z6u9(ƙV.(gFҗD2ĹIsY-(==MDAB%( ] )Rb;aQ2cV:N}`rSΤlKmvPF"NCC3[lٷ!`\:*smUir̙'Td2"cC- bmDԗiQGl=+ofK쐗@JV'HcӧlDv .)&HRO~u\ O;B_)p+/S;kjQ=xdkxmpb@%Tr @-Z`EiV{%+1&E.I^]DnOg}iitCY]e+G^ATe dPm|֊=RU;=?tI-^qAژm$J=8:֣Ԩ@hB(6!=T:y'ErsAymkBƱ<.PޓD@EG>M8PqZZ5k%%e.ÜAFn{A+K^ZNSgfS8a{AGv< +O\&+"3 >ik,2.b$m'Jnu9wD#Z&9`eƓe^RH89@tL Vy)V6 bs&gRqeGv^rV`Re} 3؃XUF. \ZTA`9V#Kb&d,|̤.PmC "udMSb4J+,֊kh0o:.Ș1jN<h GdD:9p(mYIg=mbɂ&ĊuDHApg+3M#1㤢oF@Σfl&"!+@az8dR$Sܐ!tZHbo)4 h?h+-I׬MسNn\D*}h6^VU4kSCä(6KVEH_񒚿̰kQ3'% XNip?aU>DI/O4P\TpBMȨz`Er3̴ yAF#ƪ NդֲX5!Z.bDcDAeWA)8M^]h1^$sJVVx-Jw؟V]c^C_G8C-Obk%ifY*GNn%~wQ9/ xSɔV(8ˑ10nB4KCʍ\ g"HuQ*Y*? ]AY!F2ځW*ֹ2A&$@T&h&Qѝ"3EA9V9seW[{*cJb4UAXŘzIg4`kX Eco:׹6$f 8Nn("+,ni0(v@r p]Q\*; D1NŚFcGQTU_$t>3$XPתQ 7Q5 Y\`jѠ6iUvmv7i)0 R0l/"E+SR_NYE8ƞ" 7o RcFBqF}3y?涓\{}rl{Pl й$7kQA<1)|*)wk=- r(lg#͝:3^h=W^·ǖPh˖{Hpq4BtQm[Q4!u8='s M$DP|Z U.$tmtp63.|n@*EYO -<ݦ FZqRj=9 Qi" |V)Q`O\bE6RB&^Drbt>*6CB :6HC"]3>DCse$_sYYrxVa'0D~@pűcE)21&A{cӃc/{#X*^RQi %ShDqa,BCV6n(DA-DÄ#~o1}WuqdBa6(EC\%V;`,_~MCr4N׈PS"kqX=ALH=e5-**O @f(x39F$b$AoJTG88%?4vI:;cy'.Ո۱gBF_TVW!oFwj&7Z^gi1oa{v9/HhZD:WEpN 6R1LƔOogS1rIo@TBLwcZ9)o& J~q%08*8 phH7CRsa)'DJѪᄧH~o jL P3 xW =3WoJ7'kRSPw2!eap%1!(Ypŕ ៏C@-?%Ne.*#xb+AZ'ruC5j١nd({bDjqKAGJ[E"6-whU8,- E1d~ȋk ?Q`Pt6LZ\ 8BG>%t^t0ۡ_fڦeGCD"Ez5n118GI)w1< tW 11JsJH5Za)1B!0+U5 "x)'[[!kR~D75.?"c& bRbEBuIo{s}ylxh-H3biZߑ$܃$ș?`,9-,&ı&LA{N:7y,q V\I#*ۿ3<gjVBQ4M q˱aAR%աJ:@c+;:MDz}*AͱIg ![{gz)h'j\<-:r`TBGW?pA".vrjF[I7:e٤s,kBxcA5eZ}ۼǵR_3} ,`Rdddd@j+Q㭞id5OV$5xv|wќU@m:;d (֦&H&+|/e8fM>L,HKv"sye"dRiN]_f9Lks+8x|Y[DN,y./%m"KMԴn)i;)tuzh>0p$c ' t8^a3JJ(6L*YW ckDvL >wlrM0l&Jh CNQ `L'I鮔zBT+ f5RU79y,Rqp=]A{UZ%?SM_w! EGbZBVq`b"SoQ"ͣU]DݵW[kB{wPUH>avHZsv94HL+ʔOՁ͖Uk9^m'RjvP6=:.Vm9peB]@Dn%s~m= шďA(A<%-e"%ҩݢayw2$a }-e/h>Y]jz\)԰o!|lyhY6Al")`5BҵQu>z{c*E ^ KđK4L]Any[Bx]9ly*Tw }}p.OB åpOqbx~#zy<qhߵEA&,|k~8{c`X(/fzT QX BFdoc-ī4<#C#W3[d #jMz}`(_Da{|rģhڲ=[ jDK?*$)3 gT歨Yj5FMJeT+[/eyV/co}95)v,TxzKV@_U#ɁG_Ӗe[2Jz#a.ܻx~֚R̛;�)j"'ة6I${0DG}O,PVPQJm2Uci>?݋+H"#EEg!3̖)j"Eɓ&E:bMZŽVلK6ᰳ‚4Y .쳉WBڨ8E4qKMN"g@M:LKbfi!E~dr›P$(6jtz(O90P,f+4[ B)=mF; i6}1JO=HqQnsh0t$c !QD~aHr 9&GXBO#-,S=::őB6A0E 0!(q(1F3a&ҨHd넕'^xgX̒($`iP}Љ94)E"L* J__ Jf3}SPEB&$AWE 4;{H$ mu) $0򢌰$$E:EJi!%s{RCuМ6!=aY%e9>^UeM%23jΰQ1dYպV9ddkntˬUR0U/a@! ,`PH*\Ȱ_le{Jh=_ Q?{ݓ |鰦͛8s3=%Ci0(BBz̞PJJՠEګǵ?XNY=ر-;V Q0˷oA4JM~:goTGc(V44귳7AzlY9¢${@˂[W )bu'&QN~-)&M kєy?. ][^"]:ݺ9Xy@V4m&rQDa5U_w$ W&5P=4\}Z8T^X7FP= ?[RT2HWGr'nvАZ6wPmiV BT&GKy ?_F#vFg $ J-); sM`"7I4jQbzH<(9tDhX;*@J%Q ; )Pui/YtD'a# {H,aTL 'A-T_&َ.(!CKR/mAP$TL*{ UKݘA-A$%k3x읦mcd@jPGd}]kc?Ļ&ᄔLH$# 3nM)?̦lloA3K=)a}F3[PFHc[5k}z=(^tpxԥZB^2A?ˉ&D$w*AzJQ'i=^:Hf:_bv[YO "XNH݃ސMIM;č)qYmd#]yMg6~V]"D,)Ps}"M?CTyHfڹ65;;MUIKZR5Qo/`A,h٧$U{ f=2AV6 s™}f~:F mf>Z+)$,^A|qyi?VKRŃVYV-XcQY eE-(H.~8"I4QBf{Y`3PfJ@U9U쑍'Y.EH @uxc62 ` X(/! {b@"e Bơ$ S;)& $\'0&FD2l"FQ/WӒl$-"zȂ0g"bri iP0}ZeZo[ _h"Fb9gHfOZd &9 g. zDdzx.O q1\f"VKCH zU[訆<٢T$&Ԍ4 RÌb3 gHQQ5O$KBZn=цq<«==$!В@5e"EԞMa^sˈDhn% Y҅p2ZaS٭/ >$ vV78IYT>JOd\VM+AFHmh9MTZM<WLP;H -vQ &4uAHjrYvڬܤxUmAdb`q$ъj@ZaYujwUE,Xī8uviź$+ A ^Qz;p7[%X#.rcETxB]Cΐ}w`9=IRWCN=_n%K՜lmlOrq*;ej/=iXmC^$Y d-{}ɾ7!&U7T&Nι6x1{i@rF pCހD<@uΊ1AF륆hz59ˤԃ6"ǰ3 7>rN/h=@Q3Ƒ3sl*R*[F=# C3e-qk*-v#[ jǂ"(gV*Z mU d#-k@Y`HaFr%fgTiD C2 "yg=Z"O! w 2A(\Dp~Rq'6xa67)h"]V( ! RZCRQLS !emDxA#OSTA#!A]< rj|Zz7cNm7 %":xe|0 kExȉI+5&'?`1JdnhDU/x'(5bTHs#7 &2>5RsHX?G%wQBnCNENX25Oݸ9;6d3 ^GO2";HwT!?#Րrv`Rx߈;4v"0uu {p(JKhc~.2+cň!luC4y2sS_x2O1%$&V4n#7 QC>ϸ\m'40ER6>%&K&Gr`t#-NF咿ÈbEňq w9yȏ·npb1~evr77!`Gk"eAeM)7fRSZf#B"lA[k!=Jy$9kx2Pg[@ *vH83sqg4ʴ(h1nQX`J3vqFA #faB lq%#A ć!W8tcy;rN~OrRcZJ)1Qd=wADlxjI[-'Dq/hץ [j$x}xbTg9:0JU/R8"`>PW7e3k9yN38!s04,4s1lbQ,'K%g*U(߂`ﳕ.Z{O}:ɂ( Ssj&_!LiwcQwMx\w:4.uMCUt?,1B5ځ#W~0iZFo F:2Pr]hLfV%@02JA;d*/Y8^0bAQ9ˣg8z}\H[Ypa *gswtOL"cQ &u؇.1RW>AS! FJ2Q31o b027F$ut|~mZ<i0ԨxyWD"aR ⅩQHcPge:odrZ ɴm0X[*#CnyI: ߱ jT,\3R{( R{s GPN37i P)4Q5by:>|RiBdY'Wi@ *{&t*a77iڈ.K#6qCkrG2 iOyJK3@b[ 0;-XD|B A'@e) Qp[%Ubmjl^(n:ɢ,Vz뀓`PKS5k$Che9ٚš4ÈЉ8F73$0!q(cA*PN|?!@c.Q13tAkFaabWh[3Ń!${:P_KLCͳ,M^Q95˱WbkmQ_ Qey1?$gXyG^+9i2& $RBX~=$Q.{7Ka%#aO‡*h;5r4(mX0Wneʘg`Z,7ŻՑ(@1p)Q'e:eЖ)- ?jIF<>IBe1dgBƜRPyy{^^j;<?r1#a_IO-.%kQ"3;6BM'G 7M`DYRu[OA  hbD.Mڳ6'v{(8?2*kEc]_|HG8FAk1 urd4"n*'*ݩT; F-)@ ycIyD12'wOқRCsV*JHdJbw$Z !VSj\ 1 ڽzOo|h6Kn)^)NX8`4}9t`vŰX_;Ğ]s{_Haqķ-!N&8QD]3g1H,=^UE8~t %ZPߘktY ,i*1k៿q?%&5?HvoIopOE31>$پ/{SaЕNrAI: Q 1j-l@ >QD-^ĘQF$ĪտZXIQ%Ɉ dRL5mdQ˸Q390͌)};DD>М52͡bVe͞^=-JĊ`ךtJlz7A=0)#BxU`vcX ϸo- _Y*u!Yʭ]'ڗ5M{ݦWj\6D=1oC^:vݽ[Gj6b6]z"̒nĘE >Cf/z3pi7d7 z j뤄>ȣ ;j0DF0i.S02~KODkF> #!g.鼴ƚJv$DB2~m? :H!<ŽLzRν?2Nod ʞtD/+[J MNR4PKyH+ojMDKG!DwK喽ᚰ[qjةt\w)S # "MwJHh#4_7X5Ńjr杖!m)b*vc/v&lcOF,]N֔_9fct3 ! ,`PH*\ȰaA_pD{Neo#1(p{}k?n9I͛8s4R`ς-yi0+,sӧPJ%rUX5UXRzDi$kQk5V݂eʷ߿ IȤ)McX(aZ6>LyTk#l 6e8PljaR?f&RwAͻїiT S^HXͽK?kDvT]+X{Z\Owt@@|UOgZAse0zgy)%:QmIc>$Xg}Y,G4B4JcA%E&%D^=@_Ah8P+EVIUlaRf@Yvm@2g*>rҝdEyOF栀A[ Q-YhKG%`3_K6jD=_I=FJ+8xV- CHpYԃ= =g'j$8qi-DTx.םu&&i4А4 ĭYrAƷeTzgN7P%*ԺKkTaphymyaV뚵$ZA2T#uLLcu qf;RO@2,CKo N噩6X#d͆Y&Z(g?kXEoıEd(6.A?}QuU|rfԥQ `&{@e/?khNP\BvFؒE֊b*a+Dq33ބMTm{]^ i\Ntl_iTU]lF_ d_ZH?rd! 9]x0j#B5P4%V^9D3$ظbAyG>&/QFX>VAe=w)ndV0(kCHyo.<~SԫC%"-H-B$YaG0F9b5/Q^@;2 hDW(HA}ipU+v+(ڵhb Ec9 pY#*Ѥ8$FǭE`G# b0: 2fcrG%3#\Q5jX§S4Zә5y% e 48H^kт :8C/qmnS!,5áI,i%[b&a! ?'-eNyJpI;RV;s ;sdBGKJ$m-! A~Ul 5aBNkX6&fp ! <Ɨ,p$e7hˆN$LoOwrAOAJ!@Z 3-5/6!waIJ¾\v9EQw?ymG8x(*mf?Mp $2 <b+?GC^pDrDDO")>wTryte <ׁ#qæj"S&:BZb#y]4`K$I՗Y}ԣjbGXR+Rf+:I!h+GQ9bũ0bVb ÁG%{Ccd,&D|J-(D+rSk7Wڔ4ZǑ 1O'Ý Ќb6M&.F%[v aW Fi ?dD-qb\lvTL\- [Zj‘[=(N _-N"u]r4C{>ia\{XYF,{0DfA;|P(B /T8;JHD0.L #iF|؏{- yyN퇄Pm=zNB9#C~G]0Uݠ9$N8&=0^&\z-- y%{1Gf׫^*sr ;R| G}N$q@|Dfmc(R6TH U;JVFc)>b;(}0 ODk\@ڊқq3-5^ d^48Hb+H7w۴I WtX54C4FOT{t@g2"$ K h!RX`uq2HeX^`D;&XXf&vG Nc;t,GjHRBbr a"MbRP3a#YcBa&/rz# >T`Q +a9'7Km܅s{$ׄ7%2QLRE^lE7@IsgF WSC;tFS|oT6ryu'& zB;&+e'Lg՘"ubHa4#,Oy(=[CFsUX(w&uNj5bm3c-vA//݁NMAr!z'Bi(l%!AYwE'ԚƏUYPAqaqjL-[ CWy4z՛}jRg4TEפ=]Nu U'FA]͙B ][DžEr5wTsj(e pagɍbR+a$ !t+b9DY]?pV@1(ѫze\H&Wk %iHE/(Fjş!`"t棤Q ]K!>{YrgAo*lh7oZ(T?0''Up 1$W1=Z> Ip:,6Fkl [I?p؍YuscF(d 6qm! |hX*u`?}.r&,i!y8B9,9DQtC;G]:!r!آVkqN>VJe"Y [01V5A9;yW.S.u,7XGV_E~Z±9"0b5Qb-wEQLo:v, V *RY'+J ry"eV׺z512TF&U3V;!JN6PXc]X]K~1Bpws oM5S}%_&AreY Pc&za`o&sd1 QgѬcAPv>A0e;51~&.&i(P !@!)Qu;#qFkc+ Y&[u^01hdJF%=1i9_hQL&FkYt/GKCg~fx h 2FGo 6s2<"cӁ(U 4hJ,10Ha|AI:@Ctu!,1 @ĩHzMvA{ !Ay6q/K~0 MuBJd4s BSKǵUɄ1?>2#dwuq0AU;[R")L:Vjzn᝘f8$LG2a\k6?!)ZGb9h]y0zUF inSTT2x^7&7#WAĬ?:(#[ZYtwOhшUɁy_"%0YM\&Cu{f1/qG牪Y!_|/ɦ155Myҙ+ 3yT%bhAJQT TDj6Ղ̼ojCQ/4[own眪#LH'x 1(FP=a|+E'T; }Aa.|RʪA; |%r'Gcj,07q0˽+/cIҨZ_̠|pz^T~A>?o젮R8F3N0o4PeP"D!\ f)UL8 3ֽ1ۼ3}4/P2h vߗyna<2Hf³2F 켲%\ܐ ^钍ǹ>fom[CulN@ޟ(LF:@ެ;\<&'Ig3T-9 h܏ιL K#ʙY||"qt )nϲǭp*v<9{AW~|1+Ee4 `0K ʲm >v_dl X ooF;q U'/{MxaK#6qS8AZ4;ٓϣ uL>cgz#P#Q#KXyxS-^@__$;|-Ckt*v"c`ڣc@ h]RG1bK(P6el㬙?}6$Ro8E%j NG^kc A/!R"y<_ 7!&>ٸIƏ3DDUoX`&b7!޿>S&&*SKd ):SQ=ԧ@+UPÈE=~RH%M|h|Ɏ z(MSN=}U=8m)]‚`NUTpjcч @&VEVǭ-6g["x¼#]+Ma2ݸVb^˖ 2 B' ,…"S/-D_%y3o9 "q$GD8C 5lL2 ʵ"R:tK/& 43͒Ⲵk:5{ ! ,`PHÇX࿁"n8r?/qd{cʜI͛8A"lGjӖMM4R`Q{iԨZlbiԏ9jU`DžvȰ,L4iʔiv^dXї=Vj3hV޽j$X7È+NX/MZ嫩FZXw_ZL4N W@:6٪eUuD=kM~7j@Q[ul=%oքU =m[k._?qytt E "AgPwv-Ț^d1C+ydqn#~VE`,*T^:-V?&(hgqx]$Wj;bTWf~@I)4RD o0v=&A4hՎvfC]Vi}ZUd=HsYd=UOHU$ i+*=hch"WK=x=4%j&4cfv4̆FTlj;ħaݣ] kϢj=MVK)I+&LBZ+l.RBdI:wnK2$Mgm&=H$vL;^(ZӋ̪x\ULAd֑ $iCAD(DzYG}^cde+ҘGQǫe"BLubdA!tuAx !2 E{I)d 7]Z!&=!խCýX~g5ƑXLE)㪛|W'JՎF_\4"U;gA?* da)PaqY1O4H s{g ~͸fOc) snĜy1m|d3H6 'D.hġHF7Q1oDDF$,"Mh8EsD9Ċ$tR`$ Ѐb̑&$6`S5 #eIP9 KDEpyktx~9|㼙ЏMZfbKFИH(8Pc+x!;#{ oRS]-Aꍫ :XrX:XdYP–6KdW;"v+LߴR}s[E * %IG1:ݍh ڄ+FyNDŽ7"{F R9(2 ԘzGT1'w8FPBP'5g3ä@rsMѮ3֐ćp:[2d,ɪR=E(hXAc4/4 UyS-"̝6Q v25iԘhdUVe)m^K}8N(S"D9""(8 N e(I<)yDl3A&d[9ALGvhyPu3;\ i[2h̚LVX,/4xú >3ήIDR-j! vnC3աr8g}Mej-ha9E&)gqbw}ƒ ➔݃o_ۥ NhFCR&ϐ·LK(pvBRmt~-HbPla΍YѢl]7$M\9̡jI k{Ήd|- iR Z_9w;*m$;f4#fd@Rha=~tB^=im-zZm v9v`&93b680~winrߊw}:!(H#5VT9#x#7sJa&'| Ca,W\-4@AsQ-pE1xlc,Kjd_%3!\peFOg`w*R7T{4d6AT=v{HWD"A5dkb PHЅ_*|D`#vdRP<B*P*&0CU _5'jpaHNb,8,ӂ)+RNPa.5WZZ 7eס7bMǔ4q1wxNŀ9ȗ@mԣh\S?l"Ȋqp?EFQ:|1BQhCYQ% 3VX$mZ_%swAp[B\S73!RcxNW6R'#<]SY>(S!f7bRvTq86Y'X%\Zb 7-3e&?R}$'Dxr(2 6N?Rc^Aw8='A~#f\rw5(⸐IjD%Ay߱r*yXU3Ix5wr%$iG?=a_OB9~"gw?uXZs)4& bx:Cy ē !""yU8)|눆]\3}yf/ng >!ePKxh./d $1q c b[$Hzb&Z|f ! 5UUtqbiS[> @hVd,wK #Ԓ5)˜ZӤۦmS5!] ְ4T]B#{ h1QA㥙19A[299a426R"\a.HfDlaC~yVcVR9g4h絘"grJ\TVv^+ v:ȓo7;c H3rBTA 5 d5+DyF*7BG'wrKyW7$H-) /hֳU6# ؕ8y{AmT[߂ sacXWg04#k^rTZ0j%Z Wz-냧jz7j&op{!G$/fs\C5!AZ i aq(ui_]1ϥ~BUaFˣu=v'[y%znD]5n;hH*ɥ ΁W6ᱬ^ ^NM!鳆^f^!>Lfe+ysvpFJ<I#ĺBBQPz+?p u%yx *kxF39dT%c|@X?[Ov!cBb=)qµy xUDZpz)DsZUL䠈eWv5,#Lwx/doa8lk&i(Xd\DduYA)(m!t,:zJA2%rܕM:@))|sWmU$kh\ 2eZ2/{I6Ziar&ȾjN baC @ *CDּ')1䇜m*-f ??#HUwX3A9u.4&dhȗ=~QtjaD hyƔ\yRDh \؎h/lcP.̣ '>8W9z(&*Aܓ9'cd+9'oKah^X`\3M"BgCnXc#7Gi?9XcaWYQ8c%Wb6 I (ǔ *  A~Q'aǿ# *n]DžvK^&7*wm,AB(AE®h/ӄSЁ51~0k V%HɈyLȺZ%uðP?<0*729*CYw;6zڲ>7 rQ'*¿eFiZ47*PjkBImS, tJah2gFGA#yO<*Aw1 d@ p+WG0,q4uʖ,2-[YG ٖJ2pPhM*keR [ƪrr&ʛr 'm2-!odJYjTpuM-1W,4֙jqʉO2Ȋ1$boޞ_HmQ#| k[1[̑_""/j0}fyLwyџ" bdyFѮb6OjI/T@-|G.MZ/g;O&4iO _ >QD-^(WF=~b (RJ-)ZӡH칄x F"u 鏝$d҄LM>eJh>WoQ ԴuXdFlγiP!LRDPAX0ū#k7A#ʎ2, ̔i[$F姫#xbUSͅ<- \Rz]f͝?hƞ7) ];Ժ莩f{Q]X;o]ׯ܈TiavqQ6H:b|4 m&<$0Dʊ6 +, "jZ^+2fMD3iz,/z:Kɶ!ȧ{Dhp<*說(s?Jj GZ! [JsK$33/KRȲ$wF" L,&DT$62H Ԣj"4Պ~CU4*݊3X+[| l~}asK~şۏvA-"0# F'[oXQ! ,`PHu #J4 _I8V5С@M5J6MΥ&qF🽞 JQ &=Jt)A[6IҔISԐ V$eUM44(hӪ]+IlDid?^Z^E E:)v`ah+߸#Klt)55 VIQM:R*%3t+Lf΁ ;XXl*)qȓ7XUarj恢 fZ̕/ {3N_E<7iȌWK,fhAUUeҊ{HQ7ނ A&(UBbb (=hd $\*GOa&E@"Y܀eFt h$d-De {|`E@6!wkOVQF)UE#ScAV혔[`*Qh qAƎc* iB]DcF)c=, Cc$]tI@&5jNA$d"YSώZOC?Fl;HpdGJFnWfCR*84At*`u (qEf+eI@hCem$]X&=+"{˄af4j&tCi4yz/Œ-B06͂X8=4įEIr~uU},G+.:$? tT3\ΔQ^D`T hDL"dE$khUNg?IjEH5oH?d>qpIlPUn|q^HRP'dM3=_ CĢ=m\ >Cydd/4A/(єJ4O>P18/s?2b)48a'zѓgz-:rN{n;_r<>ֱ|R%<zX=I"CrV*?|Sb&ZB~Ivo9RĐSNcJ`^XEE*pd `_v/FP=ŎVH U*}(!jQ d Nri-R;rˣ!EMlG)Ҏ#MޑjJGG,j%ڨAYRbOZAi+Ze' +Τq[ \"WCkB'47:8@W?bj.Q)6튊8\H0y d5BU"|W+CX"''[RF2 =e'"|Ȓ 2D C6Hen!&HLa nov{eWb#K'KB&sH9\eo8`f"6A?1"Ҁc$St5mzXHx#k4~Z g瀢ESaR'gpWtGvn7Z {HW_68vGw4K=8fXguR5$ H(AuCW%G 3f{Tcgd8 2aWtq'YKWPƀr 3$d%BAU27^3 #Re B9I=%^UU%YYV>X;ŖWhGEb @reD9!8|>?V7`y=9&#Tu:qgv!1S9g=OoC{n';.x+sBQ uvT3@s/2:yw YwɇI0b10;9^ch3aA)1U_g!b5rB52cghb @nvn - $^5HhW2n Qr:sxD1 EBmc(iӷ+h9 hf5-6DΖ_?j$;9\$=X4;+OfaRKaNbN6<we`DLF0 Ԟ';0R7,`[$HG~G>P[iT5$)u8!Pٗ1X yzAGYxH_# Χ1&k@%(Uku4'tHhGAwԓGC_Ej\3*AXxy{V"hWP5/cBғ浮 !d*iiS8B!E0J!7Dp'wRxB7vơ ŚzzQXCzRAFPو\ "]T!jJdQ%%PT)uS; LgkOX:>I|42cR1$V@&8THbac6ˇZ40]G&q: u'դJD:;a?7vBplQ`>Y68aJ 쐝p&:t^XsUtɐ-qY@gHG tlRHX#RF  3"8Cdandy44Zq:A6cCw!t Bz`V\BEfk$$h9k vf!l$*+?rARFB!z7V-,u""TQ^ 2]Mk3";9z]GY=%w\1'X E.7Z8+W".veEVV\HKCyTaC^3/_ J&L_(^+#C_FlI@" &4K=J=n4Q <$)k)]SkPľX&?rryi757aaT~Ǽ\CFbO(cjQrc]s~|!HNFe"K!781#;)IY+KXbEt,2!|#)E83i7FU ğMȧp0Zx!e;D;u㽼r(c c $Ρkg|"t"&N 6<5S;'D)'@W sBy WC4wl8$n,'Ԝ$-y'ia 9krQ! r,]|zYJS`2 Gz#i8ዀAJ:'^&7bQ0'aGC M#HQcqMs"|'Q7_y'-Q%fi( CGԢsdUQ#Yq""3TeD~+ `7&>i-9єu#b^KkXeJ۬;Zkq  qN)!;"^a!Or_V,YewI˗J*v%DE6*@1`;|GL,UTD&" ȏ܌1Hu~'6EލT6U-}5;7A?;X}aƬĊOFse ̵)wxAX^s*a|^[_tyW_Q^!?,(Z3 uS.aB*Rw~v51Ynh.H#gbwƪZ޸!" `b!2oqPvsS$rMQ߸[9%%0iң+F┋I1ND@V ?BN =MSR"\!=`_C=BAeHlo1&r*DQcE68)d)fD#kFRBU'Td2lhZ&GJ 4cb-'9+TY=C{tfDo$E~#aDMjA%p/ |?n!&/*=ߐEZ_A-y'4qboP3XLCӏ;뀌@}q)4ސ2ScO|RϏx@oϿ L4ia- >QD-^Ę?6jRHhz(*Mq$SL#}A͚1mA/{PlxaQ{>njT?6*C{&}XPBe͞!AZjUT9\1zqXbVu]**RD ?0q3@[ނH;Y蚓#WQ&]]kfj_Mk&-pr<\+Ѥ6{oo\S+G=vDbP!IVXkQ m@b/I IPM {-'t  ,,rC{(D.hiÉ^č2-ǎ #ri6lH"|({>ô>.j4I)$J+jQ!s;8l7"Q$OC#zC*{HʆMΩ6C?Q P5UnGGh°RL1r6UUʟ02B1'|C|- "ip Dz]-2Ys'Bzc J L:\9z)__gɆ r=*e5W"{TD<Fxωu!-N{hIPVOF#[2UTDԸ8T8h9NXbԘ)gZRIw~pU56fZӍM !M lcJZl\2rh5ݦcRqibn)SٞUFV+zNnc[p>ZrsKs._WYO~#woM+w[<0! ,`@H*\Ȱ#JHŋ3jqǏ CI$[&S\ɲ˗0cʜḮn(14ѣV5{SԓlD4`Fs+R\ kodžDHN%1ck3X2u?aP`[!0A "*FƔK$1gR 6l JN(LTNEPSH{ o:c7YFB! OCb+7@!r QiXW}C A(ySbC&_@)!)`Bfoe'7xD}GE8$Y֣t^d@7wLG8W;qc^4:&%#h1 `y;ZX 4_ט7R%":fr\FyB:\&4@pPsGӧJ RR?qQ:+XY.3 #5' %RvX%[I1!x!Gԥ lQBc&ѦIqQjPFR7ۅ¦XZz~Z;㮪nNhYpNS"Pq®'X%Q 8VC"D$AbXaB.!r@A2`25Z9KSE!BA*F(ӗfQqhߑ3B0Np5TOkD 2~rY,/bfGE^.xI "|6S*Q&28Q9 m+G}gKC҇Z(m-| j_q\6t:T@ *bd*^5:굓2SdӼW0ڰPΘ2͇lwK}~A䅾b W;T[vEr&41 8죷2N #%`kdt _UT1O6g2adp)BQ`_S!bA?urp۽Glr'%G"cviZJH.<٠G1WY `qD Y( Y&5u~IG3@Y3X (/dvEJDQ}2Wu5a;~I&!J*e2=0Դ{ 2 {.1! sAC'0$_{S5ȰNc4Չ4S%Lg̿Ls dó¶[;>#9 vI#)D(Z{c2T)Ģ^c RRoXQe:JBQḐ#8]>4lkivN@gE%Be:]Ô^ \($(-z(m!zQz}KabJcD~LZY Q#j[w뀎Œ\:Fu[3e*Mӱ0&=E͹Q`)Ѱ\E E=D c/?F,Pu胰,D4@% "v] cĩ-v\ X&8;>/1:^zdS+}W}#D6 W%HZ$6L5<>~|! [w zS ف =˛tZQ; 69 K> eIğ=qB,qwݷS?R9=*8s>w뗔s".swu_ىF6Er]qv~f|xWٓijSrK#%DU]Mp'>BAX5LOcQ26Uq25S+谡;UC%Sc1qHdąď/eg)$jO>'Xc֏YΨ*&chotS@u|?Q1&DX0B >QD-^ĘQcB_ D $5BWQL5m|ȪHy24yPEKmZ`LH!޲UV-,EXb;^EkkǃUXi%ܲlėu ܅lFlǃk/A. 6f2{p)V(?4٫?vJl8EQė={pp0Qƽ+v{PSՐCǞ&M~^_;upx\wG}>*o#VZ˨CBX9n@ /Ĉ JC ?Z B`;-D/ADD0[F-lQ4n!  2IЋ -YA%ͼ1?*D00D3M5ds@&%M9i2s73OԳOOASA5P 8dK( ! ,`@H*\ȰÇ Hŋ3jȱǏ Cl`ɑ(S\ɲ˗0cʜI͛nܩ2L[< Jѣ'"]ʴӧK,3!PJNʵA{^"W*gŪIVٵpԺj2@%0LX @cJp; )B]wzmd>5΀= D„ֶryTX@0@mUYIv5stY«BeX]tPC\k+Em5FEX[7Z2&zύ 4)/Bdi9+ĎbɔxU;X! aW?`k\VA"j< C+P"f؟irYweܵnxq ]3"gxbSI4O ^^8C5c 1zDɬ;u=skg4{&o(9GN&dܟAٓlgD~D4nDo $u-o{}(NfAEh 44{t )d-}ӧJ9Dl o7ѐ햂lp҉G+8w*0 Brⱚ5+Hӓ!c^i]4Qb Y]4'J x9C1{i ljuʕaq)Ep8W Ž3& =܉%:acQ7P 9%zE1ˣeĚ,Z_F \P@6q S GpBjnyZ\a uVE|Q}"vUh%rn2]AVhAW((TIJ["#\X, s<* `S;|-)"p HXة p~AA^($R%&L[1dNAKحHuW"mDb MgdKm\~u+o4ܓm2^M evlyC%oqmXFsKC\,g`*p .?DA&{ K`B\T#E+b6$,C.v"|1!XrLq"`xQ.9aݡ&U]fp,uNUq7VL'e!PaRm!fJ7H8O?Lu&+dB1 %RB!cs+s9a?T}=wP \KF>WcN{wHyS7OlEE#~P}c3r* LfFXORqЈsFPr|A(Yak`91$ gbp5FaVԆƑ9ť`qGRAVJ`&)1E& ddUBt9*:aeZ! Wwjlm8KCe˗kT1!"6V'ld!8#yņ;&!w5o0gchHqGTaskD>AB9 b;ADlT,EXNSsxYUs6(2]`0 (Pe! Xe"c92` 2r|HhA).BAx%(0QUsW+_,2^kWw AIAӈjׄdX$k#,GdM1f"cW }y oc適-"Ty _t&!{4R9NI$BvI*xaʙh䚔u~|؜BL5H^2&:9&SmyC*bn ;3c8@m 4(Tс  ѡ&чD9+ !k1aNjvmDQ1^8@zFey3$A ʧ11op@)S3 p%8HfItɩ6(aE*Vڪzv*W! ,`@H*\Ȱ_#*(ŋ3jȱ Ŏ CI$Əmr˗0cʜI͛8s܉F<  @FD*]zӧPupjԫXZ՚+VFֱbM뵭[H}Evؖe &&ZўV nr%S):!`(J ;N@VGK|*?:f%MN9SV1<[ ~zMZcP& 4J;AlRw$y0@dq{v77ቩU,6t݉4 HA8i(HmB!_s4Fi-J0ioQԟx94[Kx]SX"jsA ؙWnvY2`A:c2П)8&qb&a bq"A[ӘA*%vnb;V}hH:/^(@ZS>ħBa=팱a}d?lų)ch&me&FN+]CJ+d&)5L{vCY%dOkΓ Yjf-66 f%麤@dpA@:(əB&pbϘb:kC$y^FP{PGgAjE FXB7[7rlZA+H`u)C1ϥ\{'DHw;4ۓmSl^+WƘ6\:hGvob4OTSyPz/<|a9AU$ +_P=wIPB{Td,3QEbL<3&K&a~$egNL@a}x $ nO&cs͋" y& b'0(fu iE' j^)SR1R"ZrJ#,ljNxfqiaAf0'5y=)؃ ъRAy׽ZE|z"^\L+FAVxqx c-ءFx +Z }1j( ᩆ8;5`N|WQfgG&u>;K?"?IᱠN7S::p:@'[RuDvGUd| nM"QW <Z SL1p@K 6 B g&zp2LK= hmQsͭ ,M,/ Ʉ 8}1ԃ6E>kRD͍:S+(ŧQbۖ"˝ͷ٦3 쓍b3 -BZ a*J&IKPMT3(vKͳYT̬KAVx(ORcA8&q$-A5"!(?IM]/Jq!f2E'eSEi>8k |Bj QzvƱ"$FMYB6N@Hmĸ*mD@^Mq/ȮRnYQ!&$ ?.AA$UQKIN^S޴H )O;ZoV]|9="s2j[)(kI,U'Kl͌,W{weCߟ J灛O6gRT&1voSx8!5!PG(uIͯF²5ɂjz升y{.Tr_6Z D|%NgJQ&vᱪP1 7A{ C8=]&K[uRq59IXTJᝪ[G [L|_]8pl W'_ÕI@nE;:—fCGͧJWq^YD7wMu"0V,G]qabYHe Tvz(yYDvY"hqU>3e'u 7`n4RMuZ Q2'4g1;݁$'q2x+v*\(H [ M,^R$15lBe{wJ'&2W}!ey<#WbraT5*{"-h$&C$40%k07$6',zD# 'f HrP V`*:"$^kG%/E(R\lIl32"5M $_C/= *}OfmFaXNH9%WWh)1mFxLn6D9/X 5Q+P%{+gopp=Ba@!/_R4iaN1u>/RqE/@Bm:dFNCcX#;k1e0o\\Br6o(U&١TقcP{h  rFHHBqtG]"W" hx$hjs|q+ex8dQfI.Nr1N|A /.w(YLoW{J#sT\2w!B\/lBWj6"(蕂1dW6b0Z #gqALQ*1:Jcǔ :aKY1ؖu(y xj%$G3|ѣynT+#EKFi 8Fa8t)qr 28BfeA$톗$P 8YTw%ih67hz3'W",xq)IrK.)SodauOm8% ^g53XqwzyU%鸭E5N(s$t )PQ{Q1iE$ez%Ң18GfӲ+u=ӣv7o3}"¡%(1͘bHw'n[ʨuyVXtOJ<1&qq"0APY(jgmQlZ @ THށ "Pԡ8Jt:qG2 9)# cįdP+%E69Cv!#CcԜE"&y3.z4!_#H!&@)e(o1nv&Z,+b{K+nFOz>љ ;gQ _][;(4 WLxڣix< H3:wO 7q, \TkZ HQdЈ5&&\kT8oUC &l 8{x{"99\wTVnqrZ:# V@ѐ%F聐sx:oxz]~4#d 6ĽFQ-YZ M$w}G^" %W#"+!kVFJ3|jycSVhіC 6Nc4A3]!W,]I*%8%`t): _ V-hgP\$Z.uR׍D1F5@bLGD#1WPp5[\}n5ˠ(9aA+Szz 0PB+4 di)lZw11|7= %gKmR6q]M2g<=pw4J2[V4R $-U(7!(}\TN80ڋ9~ `:x'[z.*Y.$zINlM2g:N뢐mڝ8^zޜUP 7M.lhAUn#}<0a`['DZَZ+sa+8&6/OQWZ>+jm`2@],fZь-8I@Jbm >!6$ޒL9Am+n}62n}H0ND@ȵ!83s[nC!;7xҮ[-#N,AօmV^5NHѹaNsc4A1l+ʾ-j~Քr1|(5{To*5~cjET` *'|Ѧ"9y:N%֓ɢ>`'b:r2EdaQa (XW_Ol Ѿ;mQ'-joPKq?b<c&z_v_'3/:5B! ,`HH*\ȰÇm=ŋ3jȱCId_Q`K0cʜI͛8sɳό IQ/DţPvgo(FBJ:-C{k7J8VU\O N:؍&j\-okOU\[}|sF&$Ph{S;pkQ'0.u ~>灣Z7}P 5i"]S+ϝ#l0L ]..h? {v@DW= u!A\g \HIC Be2/{V{. JQN4`i D][ #J02T7k̅ScԎ&e[2GW9 bm`'TQX0ATACt!I&Q_5X+kpnZ_KΕ1%[yJw&xc'G)0$6΁Nh;f7AMJԊ&ǎ-PkIb)&IFQ=(=iEg6foNzaXHO~@}IfU-@EK=f4vұdA)V@ξW&糿5QbVgIŠңhXRC!&g@IVQpq8W zbgQ YwF&diB&+4@8/w=}/uty*ѓ4uʃVY*AJugrkCX=Gc,=F*DjqSFAVfS .+ݞ:|JK%4cK _ht>k[Tp ux~)P;T.V m&nk}Z*%:jf}Nf J0, uz@_ aΕk܌7h!{zFo *W#O`&t#UuD'&"YÛW7Q7I @ }P =A3i;<Ek iGZ({h gRߴ?* J☦e +Z'XaG'ц@XяI aD3D0}ڛFp P-3@eMBH0{JD3H rTrEIԃo*ȌvN4@ `DWQ$XRۉ rluNC_ub ?:NT8hQ=梳g1-͜tj>JA t5l" l`"<&O9_`*#ޫH8dԁ DV"jm O?䈍bV{ܭv/ R 9EKJbH  ]X&R$.iTPJ( ;LL1&i"4 "SQq!, ̅J$¸Ssl(8~A9az"IKxwуpwS c2X\@fz覙YOQn :VR1W#\@d] : iwGF:z€&pFŸ4)ʾPfMy}{,6ZiIud`IS'`G{㶈HlZz 3d&1ЪTR`5JR]+F-= 61؃c& jb Kd'ȩ@|\H̎Zn^MH5k"mj;X _y1Ѥ@!"QqI~ф |ܔ&Q򘶰31.Uk9ԉ{$#3+d!"— -(zt$a [VUZ0JY #By@a&G%c pLH H|llIp4'mϱDUim0h`|Ckl? {S{!DzLd~gW~|!JRw<{܃fM0$kk6 W!4iMkwaK)k"+ =tͧ7-=r wk5PĖYT8ƪͺ+7I͔ޯ4c"Zm\!B,I7T ka%,5୵_ X r0V'aGjIW3ֳ%vcQZxwpm+F1QS4=< V1#'VS0+14hTSv&"(N&Y-g@>kv$c 4e(NyDw2AoU7l}gW5Be[!rm5Qc>?hL%yAuE29s5#?&QaK_j7r1W-#1^G`RXeWL1-<_x6a 2" (%;Ih4q 2qq] v"z7Z0RP_B e$ZSfa51%;vF{EJ"K X ]fniMv2[j%?(S!Z95i^kKt^er.灉kٳLcbemFJQS#;s"  O_sBk?:s&42"C<G;'_b_vzcs%WtAfrH f F $ԁ#@QCGBw!W9$Bo>&.!Fpa<@ @ G ՐA[B}&7clb6)SB s&AB C $Te nX:9Jj A).&Xgԅ=5%C<4qGsg6ؒ!xf2wxaMץGt#%Y܁-rWDD#(q1?2Ks#10,GFh2U\h'awPY!01-RQXC%DZSe< [pb7(zbP8WN54ؗ7]o6ұ )X-uM8? r_WՉW870 'My4*%1 R #8Sx6$.BY^54xI{2u@8y!uo1_5eaW@q}Qk8O ǏwE !$ET!=Ak((ZssCRV!6[bLOj  2(C)κ'-?P0H47I |ç(zv!'5$DQqq)8}/#@ !4H`»|3#*wHk˄:PlMBJbxzQe%Bu)#=XBHѺAm-wz#{6ѣ H;{.bnډPYC/vLJ(O0|5wsz|y.TL+"mZet9>gAQ q!`wU {0e1F\3OXsc=Ta^Ͷ%&1'LGc'Ȏ3S%+$t8K@ʄ9(*s04WDmwKex~j,'e9TЪE\:rai~E%= }ťOqy0^84o42u.1pQGyP>]́*U>[@@]?Ttbۑlnäv$rz^wWi5kOAZ pքhڪiwPgK,,2xn@ȑjJI<)n{yt 7#%џblK#>E Clwp׏2ޒvl9ΫJ  tk73-5='DK˽A,.3R Pov@^_wHb >F'Ϗӳj/aUu5Pd 0p {{F1J-RSoaʒE ^u,9wz}ꠏ׋U@q_↰FE_5!֚EGi?u]! ,`PHu_)Hqb=VXgϗć8`=vYDZFV>>@/sɳO 'QhR* +{Be" Fm`L&c6<*TѢhӪ-zlAG5!CR}H?&`Dpǐ#?ZլXY`S&% ١oNR-+Wvx ׂ@62$xk-Ҭݨ‡|,0+ԂnG^`YB?.[\`׮S_Ub?z[5)7ހG BIw{' )4Nt!UIfHT8dhW!ARuIt@7kE_P?Բv}P=[ mf8OߙH[q>v\mBnP~z[whqc >(QQx ee&AVpz=n 4@UB&D7IaMRYt@ZĐPjO9gA38&cE(pգ:Pj)3(7N-G%)Ѷ[~̎&_-}5wZztTsAH(4 U6?VLdOJ9\w|EInJiA#;Q4A=B:tmx+bYH$ՅZ:ĐČɥ[0Ԏ r&TghBWԵ`k,a )jI6#="\XVυ-e]$儶]N EH(줁rٛ"|T~-%R$f:ЭsfR@JWNTgzK1&XnluD=Rbj\{DݣҧJ%2u>nD$iu_Lt@!E=Vu-ʢV| wR `!a @Q AlIeɕS%pcrbZZeP;ZK-lE+Xѿ}+IٯroɅhsf]hxLG=Nea#Hpיmx K P@(End v 4au3#eA=C:aKkb99aLQO6|VC?dJaAu&9K/9QQA=CB9D6hIti:uw.%<rnAXHx{fK20r7n"zW*N`}3& ƃtii6I5"$BV[w<Vd6]4Dw;Ru5*TeW` gw:(6&\u1 /.жG9r&.Mss#s?!&ztx!lp/ƦaM'B+x4tOWVlQa&s=qEptu>o=I :J0s*i~Fo-$6vd?w ]DxvR b)I .jxrh[%-dIuAG4A3l"6GVڬq55hT^yzJ! ǨN7n26R |Y"1W2LVk$,Ue荎!j3S %JšfA k˘072XUuUorbK'$d~*z1U+UÐ96T0{BWCdS8<5I r&ek*S$~2 .J1TUnGN#̚` wC+38؁5ŗ 3ݣi&mCM%cKbDgGZ9iݡ{D?5Q~M5qE>T&fHr[2ZEJ^No&$(zKP$u?/JGI}{w&3!-A*7x&+;sd]464'ִj-̴XTe#▤ڟ58!`'+5^ $RsWf|gHuihǮ.4d"7*YLǩ;,H¥:1/ӧT !1Ee6P"M 33Hg2yIw;_3+[ )aS,I\Nfۅ %a4{BQXwG /@}k;&@jBS!Lx z<lYhwv&U|sh6r> \ҚF=̛aל,]gaؗF%cszAh?Q_E4zfVeZʘ0,k@ú 7=Px MZV5!ķٺIُqɄA˖ ٍٝ ;X؍}'ڪm*ūڰ-Y}cY{m|ۊ[ z!0v=҃+ڇܟy:69xԽݿs>Ebر:ָ\]1XN >|•M32z}YSmJ,127pڟ| )M߸u|#r-z2ԛ`%޺g%n@8xb F0y2+'B.=JaE'H!Ĺ9I10m{lƨa-" 2h..7aM׬u2ٔx.F< Cp8{z3X,LN!V6<9_'Y;6hсn2"+3W6Rb!!;caMX^(o80;me uƋWb>  @+(TM[4 2ϫXjE{2nyo 3Sڂ~vرx3TQjTԁU#gKp(䌖j;J`׋MӨs 0hM/3ŵSM1_I[w:>m2ِï7xQ6( `ߵם:恮bqjM(' dWPpi@vәbX64uueeCR%thar(OG߂YQm!AhEOD3ŐC tD! ?*4aARd+:xcoC&#P;|&o6+^㈢ `w$)Tu}Y}fzJ]n {A|EaceGV7IjA/bf(2FfmR_V>'ШƓ6geH߭U{esVgwu%BvN@VЖJ]pfDzӞ%APLoBu<eڥB]ȕynɚ29$1%"4jUqN'uD%A9P5 É<J.䫭BꡥY s=\FsmsDPvނ D*BYV؄_TANg,R[c\cFس%MZ6su9Sڔs1WAt6ʑdy*p:]@`X iP`&3ʢ Jg$h6yO}$V <wTg+O?_jQ"`~Ib%?) ȏѼ >?t 5Jd&{&7JRGU$Yֵ!~C0XdGIF] g۝v 'A.<|U0HQ48HƬAc$ǡ[DC6;xPlnCy>jƏa܎xb?_A8eY-1EF$1O('^EUC'[bÈ"=ǘ7XDZ텢J*Vh4VcraqƒP r?H ITa&{F-B-N9d$'a 2'f+!=DieJjc ,XZR4f›a36Ha6'IET2*=eHfIlBFIGl1jM(mhfG57@Ij!a=|Cyg-PmUU" 5"o,luP pPҭ;/I]:3TaE q ʉMXfBpƱ V'C&#ރnV%A f8‡HP^TY}^V1ۋO^̣o2iX$6!7}2LHi 4{/uj0$Vl G3yc*!%3&4q$X8 ʂ j%O> c"-֜ v"%΢?e2^{tPfngdv):+h2ÃI|1f"j!WdYi(3Q 0&#r ɜ!ׇZFsT*, 3TQh$ ZqCY9?[*XF>V(O{$Uxq}- UHu m^T*̼PۉqIKyې[QK|Qxp1v=Uk &)6 s,e'x$g#7Ԙ-_u4#q:I愦qə(VǢ6΢R>dM P<9ĉNԣ=d-s`_~H}!(5=/O|ʮ|%HcX"!8B&$܅o_C<qyB>IU0[0@TV&䌊J%[VgzE,3ʄZnʌJVg`_9,'%HZ1>722#A|[!Qʦ'ǔmM'q]]b]rZj!Qcv+WKC')6I I B<^A>FׄxWq(4ePq%N2vq/5jt9P"U2X"JWƷx?qz\H?1dbtH`tQag.?-lU],F'' dF[AF3 umwmr#hk|~ML%\3pLU2`8L`wk3qOBcDu86 'phb`J,dGlG,vˆV2(nnEu{we xaбMcuL]u/Sx9`QO7Q+bFw݈#H? 2f 1Ċ^.=A'b&O"n0 e`=R # [8_r18!&eN?cq&N>9#R #u \_10 +qUI$P7#wpV81EDQЇ= ׂ|i fGf]bs˧}9nI}It72SeuzQ.dňb[_Ey5V׊xDÊ(Ò tx{QH"PZ+SFg*\A$WYA8C1K0tJYwc4ape*nnGEIȸ2 V3a%zd:9U )#iyH`1vu0PE w1Us. h`av$ ) *LJ$Bs_KmVrZWx7zk>g+({&#A(!:vP{ 0%7w [+hADN̤Ģv TZDPue] ]6wYhX r q1YĢ/*D_a7{;s)Q8{Aaɪ r$M@b蝎5h I`I) xDYdcZи깡WN)RjvQ %Ѧ,Z~E)f Jr! JʊUz{e~^b /n'X4 1o_[)K>s]!uѪ([cqGK#Q =G,x$Axx5:8 &qQ6pGa1GQ{+_1HX1%Ƶ\R e *rfZT.bn%-y1g4~;1YD}?2]:j5Czsɷ{8bh(H7{Wa#RrzbB2zi(j4Usr(nc PWrYIL131& hy[ڻ8x᫢a[X#滾J67 [88C[<_˾f&9ؠШ{[_ykMD(bX8.[K- “t\ógVw6 ivBƯAlY/{`Xc =Z&%S((Qvi1 - KѡC`IX1OXYl!~~j|- Du2+-qѷ2OU+F(fT;XDܥQ. r|H̬X1{y򁥳.*裢\|b˼{"X"r˧AH$q(:j| :- ٳh_J%XUշnkWike4q}KL-v*^ 0[f;qKʑ3kภDe mP@Mqz0װ: ^9o֚}*-,a jE9a7F[5(mH7:3GW~g#tmST$*uY dvXSE#7* 4`R(A+u}{@@Ji9ԓ&r&y/ed X &AErOq=&IфmdC~͸;+9MH~D!&UPQl*U mĐc2:yٝm&FUVD%s-QifRGi騕(4q~iikmzZv4}+LiY;%h m ;Ш%xvj_nzwD 活WDtZP=Amz&A?NS)6הC[\FxE}9TuK"Fm/ߚI؈U? jmZ%))7BICQ`A1ɏ5HJl \mj|SRIi0B!#E%hq]D0  7Ap<iDe⠬]wk(AL۪{5T&vmU+$"A[!@LiT6GfzJ9_ߊb)P }%X yigm6Y][eղ9 Վ8&gU-|{;X/][;_tWYVm!bSV,,5} BM ( h'[Ѧ2)KdY|A{ƒmZSIE+ԣuZRpX0fXot$#?6ǫ`w퐅[Y4!_´(yB# EI?¥90)p&q% _m3CTˎ1aN$n0`HSvzh#c|E[rK&M 4^}H0%!U7`Ge* Z P"hJKbLcrL+H10BdL"91/pQ }tzY"EVḾnoa(փɒDmFRGURJ g5 |&Pvh-tIy6+K~t=d/Q$i"@/ىk"rU*,l\Oʄ)HP%4tkZwRKh$GQ!PrH|SƜ(( SsjYh(ՈHeY[E 2\a2Rf >l[]:i*aT6D DK?5QH->NdӲ R;ڗLuuzNղ5ZUk^~ћsxkrE J,首T=`*hBǎzpwb1.*!Mw# eЈ,4J@$} X=J"D(_=i cLf(YTJG%O! ^ozMlD5!. 5F\$rHa"c|6ApfY-|7)ԡ"KWӹLPq'M gfF'"WJQ \:53ee̦6^ n%)Ul6]3-vY=Z,=Fw.1$ff&[>qˢ;%aAښUkiEЉl"Xf6ER|0ĎDJQ{SDHLQ SB+Q"╎z%Ch'd!NO]![N׼3!,ݟumDfJ%y |*TYC3r.jiX3*aIJIY=ߤ49HjDhӿaGyAG"i!e W,ERtD{0kFm:k μ ;`{#>spRS0 f7^!6A3.uvfD(n]!SH rqQvzU.廷1/fzIz/9 \z1bN]BY2HD+ʅ,rL20!~$BXk8,O4uG+-;D*{lYg9/Q؏(ZHXY YV8Y 9WՐVb]xH(E b8ztR')2?EbI}`y4)N)B$P](!G&‘ԧ  $X}Ti$! 1 |f”[I94%1K2!^y`-yRэ&-i&{zf@$7foX"I}QIGقAe !tvzz4*$bTq|Ywf9YhwUuH֔)9P3 Siiٜ7zѣ _RY9 i1Y.ٟ^7%L! ,`PH_})HQ{'q85?ֱh#H,Y͛8sTqgN240(+oԒIQ4iHA}jէ_$vx+ϖBi@R95;Hj,Ь߿ʶ ]MFRk.{ Ly+!x`gh*Z`q J̺kBNҏ_]L|\-aOr9vL;!+ɋjq˼.a Iao\ذc +05Nvڱ@h0]ހ:_vrXAG_Tg*=H u$Cq7A5&t904/pv_]yfbhcAȇ$}rG{}W[DX76 ITđ="- AdU1՘U$l4NRhW)|X|(! ZmUKj#B e$WROXeF&yeIUգfajh(KzAA7UE_i8SWf^(٪ɷAy:DAإ+!_A?]Ȓ 1{ޒv&jBe$/_D&Joz%DodM!en'|ЭJק Y*%Zc!7hh:J- {S Tl˴U@2Oxs;6!o%0j9E>(@t"NG:MBXЂ*SȨ2S NCWh].v$KҜ5hB [9.1әrrP;fZAZ2F#eӯL`L4FKH8).nSk$1F3 4!$l&dl^[l"@RH6X{di:6?Lc; nN}bnXq$ RmSdžszV :օ4HZS˿#jx2rdr&o7D2Odb$AxCaYN3 D2.i(/]C޴tR3H7r+P |k55(hG#TC>9 B׸= )Pnq|zZʈCr%hS=wV)ɫ#hr)ˈP>Xj:,f'Egȥ1a#3H]fV[c f3Gr8E$*eLH 8Ґw!f A3'Oo9d S"TE`vLt b:IP7ןsogD"m/''"I GLIfꈢ)xL\Z^6Xwj{2V$cA7I"dTTtH A 2dj *O”Q_Z HoUge "irJQ7۝/ڡ8;Q(BD]𠍠l.)4g+HJsd%#<_v"zUϕgWvG~!dZVDc\+v,{xSJU'`n酳MQ RfV$!iŎg*I$))[]2F 0F0EҶ%m(P5,}B-Rٲ^s )͋MI@sv+cù1vM$`҈8ܑ^ U#EܓqhMXDj@xߤZA[jpH6fm\݊1raŊ([5SP}b pX́d/>.FI[-2$)6KGf75FxY%8.8*Tm&'Y#Cwib2IGQ95 $˦ uЗU[zylt7o 9Hdq?h wܻ񋥀 Rk]mXF^V\c.k|c#A˫V%v\sj.HL쑫0Z֠OEK+BxůL!JccÐ,PeEYօ6Xo(J^WdaV3/L/e[qw |!"GxxF?AI%h[Q41p{VDr^AcFdo OEWsC:B Rx Admbڑu=r`gCYzyh!wn>3\L0w"< VP$0X+VNqM!DyFBLT儱ruuSGյ!!pZ'2$R"7goA)F1EG8ev]c#-b]'avYgRpN]]@_!@H<:R6ub6J2 w"1-$Y5n 2fvemJ22[AVz4x*SFrP*$Av=͘`wap$&3}qb%ob %gG>lM5A 9n>(6ɇUa(rD  u}=sVULד7v^OTX<ڑ <  1SaSH/hζ.9-$D(6(W;@&AV&aa w#ZUHŀ.OD%!8$ 9A!osf@ʗ58AS12zph2nʏMGqM+`XON4UCoqWb'B=d%"=&472-i葏r8Զ82/k:(B&iv9o,[#B_W3)j6:a!dRmz2b}){Jihí[;֛$ǽe6ġ){&;RGի(I}IwaT"Hǫ~ .3]U %ٗ3L!@ 1~ir#2f*|nqM Cm! f”a4\U{! G @\#%f#}7W7 O&[s(<û\,hapLW]V;]^ N2n}w+ L2(Y9qF'thcD]dci%Nj7+ģɻA ^ )EcuШʽ"®6C;ɮ\|U#]z1]E^g{Q\~![D&uiþ;.S%NyZk g87t A뜛scqW!;ECJ-J2?:\D 4~ vM1sxf! ,`PH*oÇn '^ARFU/>8Qq(qP ͛8s fO7`Mc&)DmjU&Lʵׯ`o~XZ,(qٳYK]e"|@#ȤIZz*^̸+т $pې *\mg)w&xdӨ 2x5Ew/QqW(^w8]J,[?J)ʔx|Ë돔hQ _Pmenߝr/E @H=3w߄4\d =[,w^B1T:QWWM568]@} nسVi$SC7WC$((jG܀ iC,bXcmTmҋ#)!#]),-U=ȅ@IVR-:yPs&Vg`aPM%-3I]O-M"gAP}~@V`vySAy(gb+bT%MF&km2 rD5e"iA1%ZcfdKPM*l]^&RN6Y}*&V؃ib" K@֠A KVo8SޚoA˧xaI8q &[f[ae1VYZluX :^)` ˫D6{S8\xpNKй2)!pBqG)S@N$ɩȴۃ -T -ve[i KuTi23mճ.k4Q=8p=W^_v $-{~O=[!+$Bdz'Ԗxڐhkӊ=t *Ѩ`ӟ7=/%&NCQ,1I;M0Ao$l/3!BpngV!WGxmK>P4'q qDs?7T N-7 *A;lC R, LjdI_+[Nu8 >_$Uj D GeB-nKj,!!i z^F0KEDԍ?زSWX$SDH#_3 YDfGGsL&#Gv&iA BDrT&د^W1 ćLNHS)3̤GDa  6`XR6S1^>D'XB%Fba1! eQ]A,xtwz bzGW%'M5ZX -LAz-xu0[+jGzjAZ z7/i3{B{g{`Gr>ae8vuPےwp,-&$H~b3J͉akQjNkإj%AVz96H΁..lpPF?KEӖ0Z&=(M^YTf\}+¬#^W^eLXs"HQWR.$o2z)/)aQEEJhī\F;1IE tJ0uJČ,.a4]CݸM􅄖}ݵA\`Bk`\Ҥrw@:R.0u6%'q  QUH.CYc}Tˑ }aBB:MaSx@)?-&'ˋ'${`]܅m+H;H- pRRߴ"`Ek.@%Z'@(V`r!E6>$+zڢ>&h cLh#4VD3M+qI/D"Y 5=밷I rv/ʝ]ȃ4]q{ɬqR JH݈֥Rx{%E_F sɠ;yxod@Qi1o-d8^Ò=j$~.LfJ I˶"!ќp "Ӑ5i#Q9Rgmr5Sb.3&7W FckXqa6W4;BRlAsi"wi4hu08-27x;aOE]Co _*AH! T^ `=:b{TTʋc;kQ* @Z'9_AV~C_,z` AO"K%RN^`dPNmqwO+DRm Pr g{IrCI&P zdBi&!5D!51"Q*/>*~z5D+%G!$cG/d VC4 *Y;G-X0J^ośaSxE/s7c-DH0yqٕ}2we{r Y&i]]! ;[{ cۼ9n? 弧*Wfi"?*g6jηC#A: ?ҙ ˼3#BTE!eR;1sztAڳ_B |#"51VLgk ;c1L'GYC- :dRsݵ܆;" c1KQO奂E `y¿EsRA*#fFK019x$%!Z['C#& 5JR,hK `+Fq 52K$2{W ⴂ1S1XT&N$Lě[]iX(DA-JG-aVjZ@0i] \1 GG-n j$6]țDd{LbXߪoP@6+88ЄZQmi# rG(:+nH&d7Gb$m$bh~v9f3A*"1HSa OM Ȕ=:9AMl! u$0;p3 ?!Elt"NT]`fZ=MfnQlaL7SkƱ` Us91L$"d>F=$CH(""0.BOP$?XBZgܴ/y!oJU$24!'ebFwi[ݳӽ< WyEcM{fr*c,R=hf 4S~]1nMZ6@($E~a(1\$'q]U W!PGin˞G&uSN/[P&J>ʨɭ\\31A0n?`%fdfb\/VW)5eO%Wy0(bs{*Mw2ۃo9ȼ2eNrн[|HCM7AKz\aP|iK 95{bS3IuWp"2rtO W S83A k%@@vpo*Gz4$B ,+3No1X'@S7>!BL !LZY+t'J!>4q'$ZuQ4RQ<S/13~MsxCS9tdsA9T|g&Aa ڰ"v[ q5P@e6(4A!T3\ᄒ!P K||3rjŅZPvW`ñ/V$LyEarcbcrmN3qNJW@0 Gr`bp AW&&5^2@d&WXM!N7S@b? V)eńs47p\2hdt-BAQtstize!r7,:RzO25S-+/4cU_ >)w|BV:e'5$/SQ$a/bl]?N1IBa!'_g,x,Fu?6<jiHKP+ _1_!ck9 6r)Ax,Dvf{?ffANN1{@ ЁWj1A I/&T/aEyyffR:Ff Xn)^DN,5-洌P8qw"Zsq>)\`݈ձ6f7s/F8TJ^x:ÄEǣ0&;WYzzCs!EBAA$FO pPip"ȑ8_YS~#ܢxe )G;c%iN7G5yhGW~c>Rt!zOAR|hk1u!'{b (9M1![Cs>@;+,"җSN:C|n# .@q+>1D#SD@CG!rP[5Apjr*~$K$cc >ria!>$/ճ c\†rAK!y٘ D[ }Dt=S* f(y/K0P(RxKHqa:lI s*LEVcx]#u%& )A${(pCN+("l[WJqtqG<"LaMYBYy8ᆟA/3`,)6;_j~ToaԣUS  ty~Gk ^ ޓ#7xGT]%O)qtjrw2Npϳa{ פq=0w21W%nC'FequvK*@Q< B]]$r/1;?b6G!668a"akACwS("&0[ $|}ǻ.@CJ#^.(Zj9rgMەU@;Hx;D*K$e/2AAၬӥTg8(.UVԴ@ eG6d,t4ւqU,A)1 vCuڦR v"Z,}i4!ѡ'ep9)cR|ٙz"}O'nj夏Y!"q肈u,y!A4F;η~{m~=|S@ -&m/ZƞL Aw$լk! QCF:ށ'#s?xz!BW)-6GA3{I_J B}E!@=^ÔMK;q0 3\QT]73R%[[eنe I;Wl7 r1)_/|x*)9 O8kVZM>$?dxWOZ??V 0I !""@@"VB >QD-^h( djGeJ-]9q!W"t88H3(὘M>A3$H &FmJ jTeNIѧδ +qi`ZԪ{V`…]қPM@O<Mk° y)1k+Yj!>5ZnS=X@s;@(ʟ[Ly_ѺE-m>p4fgG^I8z @TzA 0AS QĆZB _c#.|zY.DAl [F#AlG>}$ـ,26Ӊ<%J+2K-$2 B-( ! ,`PH@)H1=_Æx^I2?{)K`@sɳO)fC{HrLjOAkW]ӎMm{ٔѡ`Ê{S 1M=#Docx3$U=Z{P4JLXoD${*D(6$8uZM{,ѵݬ%khJpt䚛Yg"@圵ԋWm=; j5AVN4*4Ծ˿R4|+`-CqoYAZV?ō$|6aCjiRBr%Յ8PBWMY]gmQAճɁ.Hrh[hOGWB*#& +#I]XVBa@%(@cH&Y(> C4uuYЕY;@)@V5P-AP:v[))AIĐ ]')9)FkBDӝPW;ș("N,ɕvwI%Х0qSn/%l2(<_DS-lJDZl$dq)({;&6eb|@d?{]bχ0·ڣja_N(@ cNI'Ɣ>#HHw'{dW邛p%CVis %і~y?`l$y1F# k%tq^͵ѝvo oܢpAVTO+^hlMg; sr/Idə&șY uD\'߇HR(sQ]ەL*)a&<{yH;Y]흄Duq[m xjoWA:΃!|Gf "g| 9ns~2# SܳYˆ4AD8% r‚<vnfh@Sgoi_~qll-< g3CxFcQbgrޗg {nCd4?eAEn X4/;5\Xq;jh5K6Ih"3"-AdSir1dcм4|dRZ*rV;T(t6 R`&4VTkӼfG؂l&hFhVm  bV,S][R伃v)!zp xc5&5i&[F5AZ`hpƔ>[X-h\r%!QQ xMha+ _ڙ }QI&KApgL=$)ThyVxbT='y4q@%4qf: y$uI %|'|ְO HLPQaN01>H,B%K30(Z85d!&5:mjsx#&P22B*X.V24/I#aEjbI!4' C @ŋ$o-HMUצ֭LEŸ5kĉZv*Is \)TGj&=#I>`aZ%ɔ0z$ ۯgerjvt )M^b*=GX}l` FF $Hn&(*a2:PBm~vkc(elޘ4sL"oůw:v/=80 "5ұ}YԱt!kb@l-INf|a59lapiEF$2c_ /Y145Յj1&P`="dU y<E;4Ò]^[̍ɆgVU[V;ZLӛ!jE+o Ѻ[^B+pBRzw~a0w2׾Բ)VHh1[œ#! $Kɞ-"c4 |q _,fӎlҔT0qĔ D6f8B8@1 F:ۼ*G"'XVn0IOxL& F;1R+Nl܎\htc47R)& #4i*"HD*ꏋ-҉61Ad* EԀu>{3%= )j`wx]+|DG GfpU8ctnAG{8p:S pPT01b=m$$ GlE2X06Cwc Bs-7/4.-8I6.SICn;#U?/29*"A6yU#'p !&TFj1b"%Ǎ?MXRX~`2 Pⓕ,o˵\!ZuU %'aabA6k֒m6W!8&Im֕e^+0]-HYYyTjia07DN f~Vud}#g#' <уST8P4W $2>^HcX 1Lr<(cWHGSQ8yFQ7g-!It4|B A"i$SfA eBjD%GIQ) 9? =73B&fEP<3AUU:qV1YNfC>W1!D󜑶Pe Zd Jd2Fjh9DK .sJx.SC}- XcO8qo19sAʦn6W8 ?Z&I-(ls`00#Q ?:ɸAsx F1Bba1x~AYjDkC\Ib$ʸ ]#5rs ti!%IPM3e0szi/ )1Uy_ _!O3qsxSHke~(i2yX :8ќ! CfF#$tkQ=rWITsc55_"|]iGd!ӌf*ȱRWy"u#6ǡnYwGs7A a!xDInSUrY1F1g?ES $ " bD{c }Z+ "X?V?۪בW sbdCp(@i'Du`YZe:Qī7"禇{zHDe;1B%Gcj$1YrX34$%)U]C0K!;Q Dhiu5'TqJl[&DI:)Й 3=x  11vDLyw>YH0D4FKc HjR9;m=F{$H D%`‘l"[_ kn٦j)b7sA>=.*UfSB:; Q@qOUc]-8594A,1)arчq#?T-*2!h pRAI 5oK'cU5ɺ+ f~ჷGB\n#61YSe T;tB& ѱ͛'vvC!EӢ;&Feٱe#;ziq瓇j[Ĉ2J0L":"t)&ѱ;2]A4KF+Į`SgXPF[' 5"YvAny.(BBȮ)w ,[Xɖ0)I-$w aYK$-`|UQ dak*tW[|tqyj7Di$Gi 2t .]#V$_X|4@ơb+"@Z!d ^dSѿQD3>ݴ5`ԙĒ 9QA t͉ì. V2y5UWcMv`a#CX= i3-3W^&ֻ\]SB}74ER",,&A74SSS:a,]C XT)#Y&B @3'@ϲG؏3-xR#q W mTΰe^]in:A"#!9맱N θk: ff^Rk8EWQ+v(R OtΡBPQCs?,G֪ mΜ',2zD-"d`-d؃2f6szԗM :EVJߜl>ܣRa WqqcRW 0:%;S)WR/=I' ) Aϖ= DPB >_nu/F=~IaMDɱbW/ i/2}x MTVjeRUUQ @MyeAzjk\*N&"5eVo?.bŋj1Blp6:E2k)~)Nm EݗH[ҌޅX9 0ikݣŭX"[S$n9x n5jRҟH+Gk@=|ceV~hZx 0Xj&2a/R6Ę*=  Z&I? Fj饉Vb'/CBբ{RH!,1Yl"6ل 7 ˴AqSvC +v` * r~SɈ< "(]7.H[a}4/ҞzB`dy:P<+ _4y4V a1Bj:+4;0? ҆޺$y6H#~kP8ܐܢ& vC179"'!6s7ռ$95X{qkg뫁ѡ^-/4)~[uIfu({Mz:ܫ k M#vcg3Q苜~cy:ųZ۩eN=(dQuP+,Уii6Ͳj?]?*бl4ڲVVJ[{RJ; [R_d+l2)hP ۅ1;YU-9ʩa6Pv[h `VTDН$g3vS@mZGjl_w6Yq%Hk-Ӕ}]!Ku:g`M"AШ VԊ۲)\ jޫi>b͝rJwvA_%B[d oWNpRC9/.$`Tτc^dA3TSA}{3`BdBj$J4]!@T H/g+h(,I@CkzB9kˊUF(K" v~gPDqpzKA6&$ o: u ]XF M 9Hu WUM.vBb'8Q[.=eTc"2mWA=$%. ^d1=MF;g oDt ²Hi䍪V ƀ"|]nسY oy* qR%57kR%bĎL?'-]EZ-zl1N%fsq^yűE! ;XC`VAV_G-yj1ǣMH9"6b~4G=aEsM890Ĕӓ?`sKPHL'I"Q~)d2lsS6qXR[Mc>L/ysB `O͚%zqACƝ,Y۞EFeB eWH*"FGRJ4\QX Di)ŏ2 MYJ3!\"F72Z1gG LS`рXkF+ʦiU[d*`$fp"F{QtmRܮH~M"wA3xKU5?D#+>"ƴD| < :Bj4]W"yi۰R 83 *[-}t%{Ĕ;pXX+c]1awcW]QwJΜ)ʁP6M2{fv_Y3"GHaY)NMR~#su!5W%a#ragkuF>^$5f)vkqv{ׁS2+Fw_HJwnG Yo$v4:)Е&"f4*gfu7%_h{RI NNQg Oc%sAWU~H=0m&ogdxVvQ&kg0w,[E&{H~Hd)4rO"me)vOUrN1dF&yt!{2A2\QA2Q$Ac~Ceu>$PuX`1d]#_ Y-B`T6A%gX5\ gP$! bE3M4B i4{VI|r"G!b2Z#[/4_1FaG}N?JCS18ǂ14`tAbVa'!t( i#va{iBT.XTCi]9/qDB(?]]q"J"b0cș!:h"RAKH&;2 6H ww189C5AAI~PNcUSgbrf!ڄZwz,G,r=.WIL'xtd[%&`?^ :]vAcJɉa|csga /=(ݑZ7DvFQ :a%R$SHH0mS3;HS||4݂lal¤NJ,!,* 9y0le.X/#$Ae,X/=f13ل5c!xz! ȧ0zA`1Hxv? PAtXAg |)rOZn|`R0 E";#NÔM;NaqjR32MyULqsKg3 6!z(XEFlP iP51Ǩk1,Sd)Bg%'[kҎD7xip#75%!SZf:w#9σosj{Bf[i,% z!V55~U䦑dkXm`ٝR6xJfc#dt6|Wb<(<*b@3E#wL{gO9A2QU:7K':ꅁ ,~3_NEҨc^W (2AFak6 )ؙ6!f E&\c(JaCX!r!*ۄS>/4=j2@1bE!*^c )&[ZH)gF 0ROQk>KRkW~b ;Tq+?OVIhT3tl~іR.bf{cFybF3u)'0!KEJI - ;jB{^kBC;5Gq(FT0w6TZC%(hQ;͖HRxR@ ɡd-Q2{ S)aDd2502{ Y4RN)fJ)8 )^Ԝ+5锦Fr?HVLkIT/IocWb46v 0bP'm8543Fc_š!K*ٰՇ)mE/};~"yq%DhwLjO}Xm^ztaN8-:B'׷ }Q]ck%tYv $:@5 l9nȓIS:GScxّvG#Z)H#-6Dldcak3zWKpWtV6 I!ʁXV-՚Z7|4-)ie!b 3$Җ>wcų<<WـaЗ^$qD#h,SF_!!Vv)g]ׅMǕa9fR{h9brA=M8bLFx_X_txbǓHdچ+t\(("E$~ttg ʎ3ZH"I6ry0qA>" M27 Qd#cB-%(|G8^@>4<&B%f(H0-,K!Oio&RPsU쓞Seh)s7v Rt j+2JANQ]jѤUlou׉-2"%l3]c! ,PPH*\ȰÄ 5Dk`FmH 70^͛8sɳ ͂,Y$(cKC*]ʴ)Nv܈?1јe1ӳhӪiі=Ek}+bĸkݻw#E &ƯF+یn3{'˘33WVZ |A{}z5^Ͱc~9@M4i߯ _oF .0QYxu/_Νi+ܸokmB6~ԦQs"U^{d)|LiB=e t``nZZl2KV~fP (v?7( }H٧0zT`xc@W5I@jd$e16wD2ЍmbAh"J&ۗZ`p9i@9@ ~ tKESVdٙje{>(!XrCcJVzErgnD_! E=Ҷܖ?V|\j!'J.^#P,Y5Ѕ M%ȒYdc[`XEٳւcmj$DjjZSGW Tkk#d(]0w^tm [@U͉j fhdvT{)[CJ-o w Mn(OC&cl\@ ׎DLgO=//l q?TlG&TELVܶ[,A4)ctzP7`+1keXQںuq>UMaW)V#|@6ۑlD?ylx}cN]jBǞeP;[<$K׺Cq]<D5{B}H$4jb?]lU15lWn& ҦQU ꒔ 2!fwu5~b܆wJJ GG 2n“ѭ Ÿ2?}MgqHG-7 nBAU3CBE_-5/{]|Npк'lډ RQQc7 "DKQIЩ J"5BÔIFŕ L8dy6'0&caʘAV@+ZĢؒ5,@x ޭqJ4H.k0f y9AL=ԂhG->%1xMЎɉWD!E(5.0|B$r4OQj3zl C]R݄ҘGLDM^Q|.e_Њ XZhM;523 rԌBqIbAT-샇T%5bBrLhO,|ĩof,"I%Ȫp*8Ә3j]>QȠ2&ZQ* o = `[DD&垉m<%-RAb)$#WQ$`%SD"iBkW[ ş ss])TeE1e:1E a>J֍ڈJ3 qT?L4q+;smm?*7A(mɈQ4FDX8vs*nYC&鍀*+Xq"CM<&]XaK&\d%Ne/pBM ?(q:\YX46xH? [I&qkNRd2'ċ:Ğego&q0ιτ1ov"CQ^F7y ,7ȜX2*w>S*|>FBM^ݫ$ChgdW³,fCZ)q@76a2}{! _|AJs" " Q !_wgG>!>%Yty`T4fc1͇MiءP39 @(N[bb%2C' ။.m1Am+VApGn' dM"Z%^Huff,TRsx}jy{d$h%:9[w@!9Qx v稈RMoHs͑c@ ;3 e>,8-tyqfSWh;WQGz0'Qo.@ 2*Q 'u"Qzsi& t<&8S0@!eHiyu_k.\3TFh ZaH;Ac ) G%%G1K4G3aD5m%'giSaw& B9Wzɟ'& R5`G"lD[$9JISxivPFey e 'jD?Ii}<{0Xg44CEUv'{h$"-F$k*s)H#F:ǙGHVƔ\}gd-7FJyFqr"E։i)'{r7(̹/m\"o0xn@47um/Bh 8II0Pr Ǔ = R--WFp BNyc22 g3s6C GWh7" @4xL0BCU50 ܚZ, /tuQ"PLE؁"QLvbMz2܊f'r-Dg$AS$JliV$ ;y#c"Gr%}UL#J[9V1rT㣵 )28Y[KqS!\U!㰴&*L:HM;Tk!V`*SVCr#5m{vc "a5iWj9a0!SHyy+v~A! ARU3(?qX&\FlbD#7S{$Eb>5()RH2Bf&UC:ѷ&*ҧ:{i Q8ڣS85ؘ!ʝAI[e$g1'N3r `bZWa !1SF ),q JJxbL篝CQĕn$&TF)5$bN煢(Ȃ#\m-30"?,jcRF(1vIt&Ztn4ܫ4|Ƽ,[!JE*+(t&\=hev/EI6y:#ɿ18b-0mmэwSP̹.ػ"%[U8S&# 8Q()Y%d'Ic3xrU\uJ Zb,<$s5K7mqIQF2 Oj1J 3?adMVO;h~<`+"sb4*z& Q<ua :(#^2 ZR:,@ w'jUBp'GMHFlE[ "$3ݫ'P'>AS;퓪ֻXt(bҷph3zң%([PX5" d Eb0AM& M}4ι)h [yY 1 _:G$ )w}Idyc->H4?IV 6 Km_2#tc7R]|%8%:dwYi֕LUMą RV[ Dykg9GE>4h7)!c-yB뻦>\TcY'[r\^.EoWh`=^z7amV*.+l8!9\ O1#e|{LS]o&2Um?3kIY$~vM qƵkJ 8z]]@(h 5 T7;֣3}A4hbH@&MDej &R X^hM 8yc`{)ƒ#2 n@Q\I-VCfyȡ։,.]{[c{— v4']?u 0*ڢPë2p+&sP 8Ci@ vX*b  h:(^.@8?jq#{#~[KeRX0i'gC pH5!C@gV0/9\#=`A1ɞ;|=` $$֙/cd 7<Z;yIy*@qL3MnrGmaW#i2ƐO݆vJjb$rXBu 96znDZ8VŽP[ VԢ% ,cѐKlert'bh;cJ6I0"=5Jd4|IO %"MH8Hʚ䒕Ih:Nd3ZS~!9!!4ZC{XwCCf&qUl)`e7ȧxM"W:Ŋ1 $/ՙDO"g s_10h!iM1-@;IzHz,[BLQJ(@JiԤLRAB}+,08~s(JEM@6@͛"pxzbc[rԌh/昕r(FӪvQ,G85*ՔuB#!1IH:A2z[a2ӝD$s2@D7H#mo ϩ$ !EMǫW)Ѷ6@Ɖ4ֶiFPOc-!mm+L餘B:)\&J0jVwEyԺBv- Due.~6!JE&;ߚ2C+^?hG-PswIӯ۶#+-"% K8(0))*\Ako%zƔiϘ! ,PPH*\ȰaA_UP"A)' z IУ{$ ڣ谥˗0cʜIK4qhѦϟ@ uqBGDz)Đ0MI0ҡXjݺ@BrKقV Q`Ѷ,ЗxF\kC{+1I d̠5k|yĨSV uև_&={6Y<(n=vFg˞ +ОsCw~_丳kJ &IZ4mݵcFCzVZ3zfb']tFQh22)Ȋq~f+@@ Xs`"&@& ֦ዸѥTF4rc8P&cs06Za&)~X@¶x):9)&WLQ[Tt88@[@Wܘ|)[DfF^T1ix^ $9=A}:EAVhiCnBax)PE?ZPxZZ!fN:d1P=(&[@P-lFڦFfA\ZuNE8JiΪfx!U2c#~UXۺWk jwp=4ӊ"h}b(Qqu]XZ)?^c(I&Μ*{^XAD鮀ڎpܥ=k* (fF9o3 PH!X82γvMcG d5#_J'`t}-& g^4qX( !l9QJi& tK\XQO*N*((ePOBHZXc'Ё;J3Dǜ)쏬 ^cQW:F)lS=a%y؂sV0]Uu-ZbVJVA8.E˺2gIRjVb@7) }0k !3j7҄#R8p&/|Av'䓗URa] d1^-iSJ_+j,p Ra=P3t/\9cغgFʦJR=itЧUIYX#HFkʄ(՞Ex Ys"Y?C2D#K\BhT p5Aohe t좧ڕ6#ajawQ(XբlM;X 2l"z  RLj*)Em )+TEG=j Pd(D i&*"H=U8ZFcOSw4܂R"z2% 4#c^8@z@-:ђbRAj q袶)Hbh-pIb>KŋUSHGmP{9ݒF2H:KBXYݑdS`Q IUjz]jj,eiR}"W1+v ݐHKZX"MNTܧҎL>V3!"j Unh-[JA@jےY E[0K-] r!͎Dz| 宼UM]U")bh!gD(B >dS*[b;/fxҖ{xK+OqI&`歵.Z]5%!.Ǟb]C7I)YwXSÄ@ ".FؔAw&Rcqxb8yGiRV*\)k*y屁}"y/.Vu4rL5Bk^IaJF1C@Fd6q]vq1PeIT4 2SV0 "r"퐡1k|5rQW,S Ө^L7Sq;Mg ݃2nXjym5c_ /o2(>YV5RvSɡu+[u$No;|)'uAA!! J: Pj49 !|!,"GCDpxD5!PJs0: P Mq ZQa*4r32HDO4QXz):5S^zm]c)K×8VZ#E'"XE7< &6vL5tw4r. f[z;tע0B 2[%#^ۖG/ѝaaVgX2P/"~P~#D{X!;Qў*862e^#%QK6]7&Mӡ]rQ$xf%62Q]gxjSJmI!8;YYc)FR+G@r3[Hy/5]Dz~Amo+aer1Jve$R9iY*hR&khCúP54U՛qI-8: S%bDG!5M_#k;?*f+fLfoH㙍BmFRbAx1SaTc%$:~Y#uM:Q$>lщJ #,cDId2"khĹ 9Y59]'&QQjV+,ń+x4!# Y˖NL1+[(" kpWۨ (F\8r(lC1 ;!Mei&b%:r}k*b#C*B#Dm2# EsRY_[ȥ"eR0:墇6L#2{aLo6?xg)G+{Ɔ #+ Q"f-h2GGm)a*Q6HoXI|2o7()|C#`D4.6i D@Zm :" S+,|`a19e&ۘUh!EEٙF]>E([Κc&|ьQ<2F 4?d&QgrLdz HZ᫣^"2'g}CHNEBEM.Y6{h|/$;A9ccM#'F"AWkSSa}Q ~Xv, ;-2e<&8(#џ7?#lª [D޿ X("Cё*f$i'ЗՋH(S̱(K>K 5dRNB_wFTeF,ŕ;׭]/H==S2bࡡUI$n!=2^DI} =dtd,j7rB 0ᯝM d@/D-)P-p -:QJ-]S&٫yʔ+e`z4m:T^l4(4gRPDyTF]~УzQb#{-mBZp)WܒG@qle!_n5j]-{?֫@{5vs-Hiq#hwbW=:۞=fխeuvţlJnjSp^ky3fG|}gn{/.ɒ>{Bn80#0#.ޛ0PB:$2dULÕLp抍D%e,Ǎ$YP%Is&gZkYj%<ǫo,[=ag݄"oniU8Ms;-nwNgv"ȧGJ#YVb9\/TuDaYe z/ WyJ-җt K ⃬C(H~2s-ƣ>6O|ĦL3$~&LhlSuKa/m@VZ" Gs:8$pj1KPh3!0^DNi@H&#/ C9D3:Ri!\b0H[`:=#1% FӚAAT39MJ*@gQLqiȩAF)ut*A7yEF%`+ъGT0nT`ZS)*"ܠ1g`SXUMSK1% )\* gog|H~@ *ieEƣ m _T imýIV\Ul $̢.LH!GΎ/evj rLd.a?7ҽٽoC|qe~{_ $:$i_7QRyE"68*Q2 r@.YlUQi*iR1pۛbpO[wִ4Yݻ- =WDl5Z>+r@! ,PPH*\Ȱ_lHPbA{aT=#Hѡɓ(S\r心/3$͖8s3gɒ}*hAhqhϧPJJիX6TJ_&]Vٳhgfڷpu^^y %?n*^̸Opk`eٳyύJ #2ǚSF]ԞFͯftM;{'͛H:sYRE޲Y])٫mek[^ M[ղK{1'}'Pb%(WX3& {t7@"&?| qS{ AS1Ԟ@ZNxS*&I)8ZzTfɌ=&H^J*vX}7 ]գ i"1r TW ۂ731F 7eId%](RkSU, T١%AF9 )iIpQfA))ARy+( @)kFoyQ]t=kuesZ),#tJն~SLa'BqW):i v“n/`F?s(s(y;QD$dW) 2HK 6A(AU[ B,|9PG62A4TRe0BKN5j*K݂}j1h r8`jHH~~,BĶ1)W[Y47- ~D9GI*}HB†;h62$ި =H;d" ٜQn!bR=s1 QS+Dƣ`E6dt795)Ff!?\HIGX\GC|-YKI|EuZ^-)Mi:wf"`ZIBF[th`vLTo)Kfif_&5R9Hю4JlN]M R6rl[]Hㄞ*t%׶TipqKa cc)!S0mwL-X Rpza+;X!ҁh~I&L$lvב&/fG]{SN18JX$ .$FgtiZ V U+.i8a6<=mUٜL7i7E}vC  "Ȍĭn Ɗ!l@ȱr`mIgHgBDR'W,E-6ĤL{ s@#E/nM9EU6W=ʵTʘw)!H!ݰ"hz,HI-la: ',.Q3ŊWt 佞1zܢ $@# [GȦa㶙EFt2#1ez p3swE-@kB H$ PK)S1߆ :2?f" Hbֆ#+k{U,Nv? [D&^[CTL' DϚs1w p-"e%<+׵ 1ŽW>4\S ~_Unz^ZmlW8|vt=[ڷݠ@E~&-ʡంR+å&<4\v; ;)zgT4bZ: 6Ρ+Ɩ$tx0X2[ٸqPcv8;әG,̻KKm j/ZGKR( :pί7!գ\='\k9WRys+Bf[fY۶1&xI0h0mQWqW5bV5N[mzR.O(P{J*$|a19-P0=7Fca8BIcMKc3{7/0heC?LP<7,㈐ aשMJA7:kWcbStM2?#s=@5BtB&D1{c`xrgxX%LB1=0 G3}em uAG_y}Z@Ss$A9Ri=B!PʃQ/D0! Am0LdrMhA]DcC8VPJ`J⇂,rQ"3dwDevD70C|&nVLvNÅ5?th-GA2@C8D!IOJ{ -":~A!O0L3%FN(=3tpFY0v4oq2m jуPb1> TC2Ճ^HnD*Pߴ_{D6!C~xxEĤn 1 p" !"xs0c'-NjfuG[DtSp$sz!IJ5OTn\(u:%Gjv*Qp'a"%X4 r/CbR7Xˆ RYg7"r!XlAq&Q`V0Si)6 ?  *J9_sb$)/ Jz)y>):VuX8Ņ%^ Py^56c1dZa +!z&k %maBwidD d>`tga_% f1rқP)f`a]tqRKr<BaA7~g0iAVB66*hVF:wQ'AJYӨ$ f?yC A_BcrK )%HC,1q-ڢfYa{xx _#>c+ S66@55x 9$2 L8gagD艠Rf3\)(q%}´ Eß7:D(=jC5HAJ-V)H4,"pb{DB7o2 >UK}r _Be G)G0Q;0*U::IPA%b.کڝ i6sF2.&3NlKzɚASUPr44SvȖr4U㥠3q|.wz4.{*%7E:L]su5sӕ`(:i[2$XH66i[@{T5oMQ\ArX-:@Q!;(CqR " Ǭv7v!7q4g4ou{.k^X E ɓl!CwQ)Áv ħ)b'u!ib{E'gwpCZV1h%&G)΅<.ՉOM.Ud5'9ԖW~H*wboZ+)%{ß--`ҐN7qg ) Xp = `6ZAY)#E(hĥ%LHmj71sNo7Ἲ\m*SMx1țlbM *Ip,R!K:Q2s,s: ` D\7U"&M+D14s5f#!c6"ɍvvF2v3vPXGWw|Č @@V%F9a ņͭWȯP9{qWձFDTW!br*!'u%C3u*m"S3X4crp\}^ca;j2+_USl` Dci‘tYZ0* 1pyq=w9ڞǫLQ]H;!UYbz2/[qpg<=% (`)- YϞzX/Thfȴ ʿ1Ż } ƥ BčBVf+Dr' AT884Ɨ1ԞsŪ%az е6ŏKʘC)u #l 8i{f' W1fqMQc.=# 9T"D4 M-ݒ0R%Pތg&Qh_24\2**m[\Oo DD|5h<IHb\?,!mz ={ %Kֺ{,Ql)Zku33画^m19 uP}j@g5=@rO"^R(4VDB!א_8t`C7Z$ (@U0r]¼{)'3|KI[ ;ehV.Ґwfbq/S4e-,M7DZRqw[riM?&-^FDd OiI#͕k䃫ֻ drx$y۟%u94!4$ lo!~،{-7YhPAKzo|-, 1ϝ=2YD(>o fRhCSVmGX HL~)Hn W%1yU`UYvAqH:_AQ%ʔ taq1!JL  سިjZ_D~r$\X!+H?VJjPaCGj˛ RM>૩ٻz { ڸíZ45[Zh76ZN*TUvhav Џ֒5;+QsRjި7/{AޅZtS =Ki$i,Q1c ;7ҮGadG7ERC:6M&^OOّ"W bjɥH.ߎԦ-ԓZs!o1l T<"[dQZHB j$t2?;qFI *! :~*#EvXa7L$M HdJ–F1C/: -H20L,WhT+ʦ@ Ԫ{(̞@ATćejE~lIǤOLqFӿ7RTgIZJglj;s)R,,E3$߼GV+g ܰVVLqEjQA#Vq]-Qtʵ6O}jU,ǕVTXU}jPRyIT-WtWIA[XԶX0:wG1~tTr(M=xWZΟu7yK}Y܅Gk_L---:;8]zbZjGC9^?:xٞK,[c߻7PCLj%CjE`q˃S0mjj>4P2ΙPD8誷DowMĽwcg4xJ*0~xqF^"UWyƷܟQ2|"^Nm^J2@mZL=eȞ~vcO܆sЀ㢐"դ*E@HO*jQH]bx%1 $tdØBv )4ЌekMJ",*Ғj?$呮<QtBB d,D1Ȧ;=j)Zъu]ŔrJZZTN\Tv 5%@[S2mA'@C0BM‘6i\)0h:X}"BbKu>SI 8b@)~RiH64z "al%3'.P!!$!i5MLF1)KUŢbJƑ0!"HԌq_sKZ@9F)7*DwyP7U#v(hdIE6H#kL%.41IEc:\6e,RN5UB}9uC8D ò 6XC=B;˺f l[qTW:0 ?ʼn>$EntkT&mS`l(]69%Aϩ7;ɕjqoHڿb]o~4?SyCFK([Z`[T 96xDNz Iaf0MMp~)qQ {nM1Y٘5'B3@WG+uk! ,PPH*\ȰaA[&"{3jȱǏ R48RdĒ\ɲ˗.!`q!ŚoY'̟@ JѣHٲgҧPU)իԪcW*}Jٳhӆ)I%t{Qݻ f(W^e:x.SvO}KjA 1Oޜ_l}Au!,q>N뺯+v냷){Emw=I\kuW' 4)cH$m2?-R{"vawnU:H^tդ?hѸ9?NJ&@Ȏ?2(bՂ'FiP{[H@HI+%Џ[d0J|I;zRtquЙ2I&cßm&$4";atITxA^ߥmVf،^ @%IhHr&Wz3%(AGz @lQmQ&3yA4J9EElbz)AHIf򩧡—?A U[Vgf~i3FJ#*䫢ѩxf8yZ@T{ _ bGטLǁFɯ2V=Εkf AJ4oLmV!ѼhOkj£[@^[(&*P,ߒ%'ֻ^cql [H<H4[Om`Bb;YY=cO=/2zH R;\i=IF#$~pZ~BZc(J}9Kk|GH+Ztћ+9m*K~OaѮV+@ՓtzHO+>Yt,=9D{ J(>z D\*W0YnRa2 s |ŨRtTHC#L`U: (;n&gAe 0$%6$g@A6AsM UAtq( B#-NQ M8ů dYIJ QU(@J="7(ZLrjԅ4MZz"@bWc2!4" E2FQb?+){X:T6A_*KLYHQ5lEQ L$%ץeRVrIf -)lp@6A!(F Fբj r]q  +"XŢ)T};g;'-I5ԔƐ&M*iM,D2QjvJXd 65iSjEv*C?:v.c4t* zo)?EXY{TLc=(jmBQS"UˣCڋ-QV`Hi9$sbU>dv JC$ >cQ?3(-ɲR+#DE+t`,- d&EćB3DYhbml{. sT4%!6jj%[ U/O%KdLH>ZX1 r՜=(,keb_ڠ2eW-؈Mw@.,F9g,f+ec}6A{D>64B%*>u3HH!Z".RZXтi[(@+^u!mˁ5$*SFw&6kU5_?Ȼ"^9!Ai( +q 1ӡz{'| {EbҬOJKi"~[z>qvRRJK5&;lJak&r' AF1\ m@}1JQ.3อ l)+ij\vg@UQg2MB9(_}ϔەJVAyqgw,I/Ҝ[&w$'9 am/}AvjA4дLQc4l͚/9)IYnUJu29vԟ&la<(8!BtR/6HEV=O5Ё(Xk#bID*=մϚP+g%6ԣ A2u_$jkeѪt6ӡXM!t]H⥵ml' O@o=L<&O=q%d̺|MDL~IO9R3-1ָ ʧPZ-ң~.?BZr=7gj/Z"l|~ $!fnNvk`|9("8_e/w&b}ceJm>Z\w3Y)KQOf,GERtBpTb2ڇ'lWTPg}cFuW nY8C*qfBZ%H]#K.a{A'c4A'MxsHu`c^GG+HC1%5BO{m?Vrxx.\P^IUa)Dʑbk&3f} 2o ha{`@GJ#2h &*Z1Д&KCmM&0g٤s?QG!ccxA:qy:s +BLEe2RT*ӊ1qd{]T$a=TXS& lAEÏmcE3"ui{at%d GU[jS23CQUY{KR $926d ?s!WÁuqk6 (dVT$S4Y?1}Wr&TV2x"U&#TV`802$KZ)Sm7Qv6$kV'bsqbUKYr&,)3v+pb5VQl2FcՄ+4>5`'\s{hEX1d019-_D3Q&My&Y5)B=8&H0V.ە-km"8m%$cCT6 bq : bcAs a91qB?5&,c/C\""څ'1Tu!~QWH=6-i&/i\rHE),L.HtW"g'8H2:H(2T43c"jrc`o7(:B;HW ,"]vjWqi˳<10 M.L{ $`xzzICfN4$:nuJ}6cSd NrEtB Oׂ@:z@ {}Қwfiڨ"tas!ՓjbZ1o |BRͶ{_fM5$AӥGWW+c@L)#jӕXIg'6w a Y5(R",!?KcT4v2ZΧ8f" 8U1X5~}5`8XC|DR/kiQvCcg|Ve5[7bD6>>p B=bBt y]ѫ!vI5z3F;%CiU*bygU;Ɓzwk+qhkk5I] hȅ]2>֍h] ^Ue*T~Wix6rt놠eT`;E!"F!Zczra& !XѫbB,Ir]iqfbf,Zu~J?  Ca'>:X&0[$CaheifۈDmQ~1Z2V#vSEZq :5moA oofV23 dt5[R/4lyKsGQdaqI!@Y1;i{0^?F<x-G!vQUp丽gF:1&YjMNc, hĊv-beH1f@V6$AeAf%x fqT:!WΪPB#8 Ī]tyG+Iʦ|&:&?KrpkMANhO7 ф|7&wSW] Ŗ-@l#"_A=u٩0e;A%'Kg#Qň!T ިAtt4ὥMJ\q1 Հs;4SocjQ*`<&kU#J)% ;~#2sDQ%_jw<5hZ'26jz'0S6OpASqc^ z\whn.(Qh2iٍц"eZNԸQ$k&XH&1P]q8M6-Cji#b-4r`SDj0,z'5Q{d8JL QB)FkNIXRؼל˵:8d;~ \\NW_*iż(D-DЎQF(@}0*B7ebФv%Jgdusi,厞ɸ0P IKC%O8Q;6^8d,ih٧`"/ٵJd+Qj=X9i:h'>j7$Nf_Ԟ m]zRNKU.$1yV1Xm ~@.\-MKRdv6NA C6 ޖoӍTeR[¥ٜ!F@h)f@^,[BE@@S4Mӻ&rOO,,@l_~˿*vk3JZL1 +ZhK#d С`lXh HiRlIL 5IrvZ8M=~8Jƅ":ر`BMd_Z-M.|La$p(3{ET[gϟ=[|Q-MZʞhVmKvMomVYK rEpڅkմ@^)E5{MD오~+RF*=F# zEDS2ҬU] .I(v 1*dE(jwvO]B-Z=yR0>)YymJGndl-6!8:(ʐo¼){jB :^TB[; km>Ƃ B"H" IH)rD4JãD0̴̫Kæ\ ТYsLt,QCANtsJ?",,M.ϏE*Il;?J/SK4/H,O)og h ӣ-У !d͂E2)5V_)t dKZ"ʤl ҤM1ϼTRqSsal꩑BuwG} M%\Lj!nӂ3)!XHY7`ubbI4Z^CFypr&&N9fwϓ+kGW G`ZhFQFQNBM_M>FKjGпNӣi],N*"*.m$#k[Sֳh~8Χy,>Gfpe\HQ IRWs s:8jP/FnaiPSDU s;&#y'Kvr#Wj"oKqlNd!D3 )Q a wƷ)AYu-*nOOJR#X;#D$w#qV1ԫ?I)@Oe[pPia4˷'ٙ]&7g-R)Q#Ju9SjFhfk2E@mBPjY!3aQFFNV7J&=kH)dvfbr 5{R #A!  8c' ψFҴ@ăr(QiZ{JaZhFp0?T)v v3c) wA`4՛RUw2Ytt$LQ 8UBj&UURR.n ['Kbٶ U!#Uz#㪂T,ZNVv)!7 ;Zx,@5Kql;GSϾmHNn3zg:0ީ#KA\wvָbN N׹Xd$%>fl8Mó"K.G;6h-Hx~$ ! ,J`H*\ȰB[ e= W_?(G#XtȲ˗0c(qf͘2fΜ 9rѣHeIAH[ )=쉵ȧlʶ۷2s97$Ÿt%:/ܿmHأ?P/󧘪YzJ=k=R[l@co ˓^v̷^ uMZnjY"۫G[[6oسi&M%D\Hiڴ\[̣Uj.hoE=%w @-lIheg!["P{x@@&2G]hL>LepƢpTuT`"\p[CE;FvXrX9 f Ar@d bUcpJ闒DiJo|A&^uq6H @= $+@_6[":#W_C=Eg1w@*7b4莫n&^'wr~B{-x%zVaUREe9QKtODM*@nAmtX;Jk(9Gj]<$iQш.](tXAT ~6>LІ;I''bb+] s-3gк9!40m7 .C̵#\ 9xE]rqp-N]*Gƭs+)Ik=&pndp*5a= )xtpllyzךL|u_2dɀ-Xy=Ifv4%/APDّn?%9o¹9Ktr/SK jchn= ZP+zg4;VKUZYT!r!JB6M<4a4ǩ4:)b v:X'\ŊVBRЯӕp$8!D&õ]OȀWZ ȮE k硋δH,"9lLz B4Cpx1=bN/iB#Xyav& $Gbif݅6d6N5gP|bkZcTPF88)MgofUDHHєk͙_")" FSDQU"Lכ=S9J'$T D!@LQC zR|fE9Zٵp} E$³v֧0ˠm:0j D vf+)gSMQW&SF,Y襤㜳QҘ9"G4(81d#JВce94lKD!O\H""D3D%dhTK"Vj԰ ON'd]t,[J?i )]BȄs\p&2Rd !# }+8lY(z=b[Awdl+A,#տ]6fc%aꅎ[_fe `@""¯:ќb@!hl]buk3dLR.w& ɍ iw.ͳu=N&׬ K;خPԄӚPcGZiVZ!j&AQx:֊Fl0MBtB5b;9bsWJ# kCEҌlu|;a $6aKBiF~ Õr@Z1(}So=M&dύv{ !$#GocluKAIqsVLo;h(kb&m4ikκIe 2cf2By;U>%t֟Ni:v-W@dcWAH䝇w8׽RN=&|LkSze0]JY{>p[UJu SUm儑T="(61!>S*yiUe[zryP"WnN*ew >V`I^g[WiF ͒ZA1D f`8S\a)+]5dC'roa AA&27\|E@") DE_`AqvBUJ CUoo*x2]b &w|LSY~rxRp$ny5Nu:wSjr\3$$ovab!tE0mue_1Uͱ^h!1r{$R3 6 4|txXET^Z d6SSf"DWc #䰈Ef8;3@䀇|GWm1HK Q b^1HNCW%%Hxx$gApf3 1F5A"$ֲ8~!k% xl!DqRlVYuV6(bW( ("sV s,D 2a6A<=i&$ Fe:^H"b:y UVBgj%+;i5˧!Dg|$(@TR9yau$>a+fd(_3-!*]I*DS@7ebGm[vq]veq W(!7|hj&Qo6"{bS-#1'iOB'&.mEr&xAx%l'5Ym&VO7WLq*GlgFƂFwa"R:Sp!PSW{PHaP9SPPrR'/cI9<,D}ɦIbOd{[[)&bIHC2Gg-4t ;)-G HRM"<>y!D5^`8Np>& k"!ǜSٔ9,RG40VBD.m1?%p(7IC7Hd=UtYgS`N~MJC&rqe%բh{H(1Y0-sZ8,EFB!7Oȇ$vSO9ĺ>a0I6 6 5>qRٕ7-P+,NTj. j$[@Qݕl)ǣ2mHf&MTFfC6>#8?ֶtzd!#šWr qFف2t.(hgv!t)c%raO) -WTzI.2``E1P/3 aޚk%DTRphzd0sScr VrV a+KYb%Ӆ)!;bk/$qo;5wa 7dCe"Pvvdv2qUqjOA!X`J|q%P$&:a ; y'/8蝡ZauW0%t#}hc7-j؂S "!#Egwq8"R H{@^ߵ~.>,ÐŽgADoC?$=$u*s׌i6 "^hhAw{Nd&1SLvWH-w|ċc: }$ qQ.k$A 4YrAW) xv|+wɉ~hyWꗝQh5$!ָ,#:$ET^AA%gt|X[ڱEXdd$w3 A}1_Uf`/EBr{2Wf:;)\gc_,M;"I ȱt ̬Ux%(@VآfЖ/UM12t޹Rrs/ZZG(q%u<#uT(Lt8eP2OE d}p|Gd y26wd H FT7wV! ) "[G&YdbT_{QYq̙_Т7ɖG znsze _± sNorσa8jakʤQ[D%R cQhHtN6Y#Ae&grL^ &0gtQ"CJU5~G癘";JjE? G2&;{LZ {(F3}πlzE]S8oS$0Ju Vٕ%ZY+BY%ԻO&GgG2BgHc;+Z6Q/ճO0uvCP6"J4)2"DhȊ݀SN&@XXc8$cQ aӔ۪@L6&&Ln+f zAY㝓jH^]Sl7d) 0^ rip;ӹɑ7b4(fGҨ\g ,SևRRxODc|4XMwq+Kn#S iK$av-ߢ6q ֲO3ⵚቶ RrIӄu ']N4AyeF $O $nEYU+O7x7Gn-_D@S1y0iO11! *hʑSȎm2nђ1FJH)/rhC 7̦w,#~>,$*OyE#ӅWυi 1-:ʍ2?@-@@ DPB Ҥ%A-Xgϖ_;"PH%=V•! S̃4AԔSMvnʘ1$MEETJrJhUR S4x X+Zm$i'ρaVoÎCxVp%0c^'?0dF? gNRw'Wү ?aMuBm㲪e;HX޴%2!{׎$.sA?ٸ鬎k**'b[ &%6;!QC 1IMs26a2ޏpΪZ'j*Kk9=hMRrQ.ƛ,mio_5vCzB=T(Vg g2:2ݎv5Y8hZ8h<+zɫbgqo~3:Q d+13%A@!{cGCB$^D]&%geqC1$ڨ$NT"#r`̸qtEB>̀%S0vhGa!TR!zr2InHFzn~8Ò#4`|Dbi2ՓXe. zgbe0!KKd6әτf4RIl&+d`Vg8i) Dg:չNv-ؼ;! ,@`H*\Ȱ //$b`LJ CIɓ + ˗0cʜ'h^[M4*]4˖MJ%ԠxUG[~JY+ڷY.Jٻxi^<*(P[llpƽ&NlΝ'L9[/9sZCF1b] ̺qZk m۰s~h/-bn{cw+ivHjZlum J^N>7M[$me '<ny8FjEdQV]R'Rcd@G&gbqbi"{ 8 q.@ zNkƓHFNzf($HJp1&8)&&YfUEquPj]DWF@0]):ֹBqG\EXkCytf`dN@\d9 )'hbʼngr8_X]buֹ)8O= AZpHYgT ej&T˅Jze3fȥ@,e !'ЁТ )mHc,n;)!%ׇWW;1zZzi63*Al^>Qj؍V]׻4f]ICe&-u*yi(yٯDGʁA@V+vW6?.3ʇ3s y*Mp-EmvveEʞ%·H^יqATOWdc;xh:(9kpOHE䧓yOf^~䪪35Lء$ XF>('-ҴŇaӠ9ۼضZLK@LFc=ܡ_1nzX%snܾ%#kaDJّ"xHP4+Q*O$M͜?=SA@0 _c0Q֘,x낙'2["?Rh"F1qUk M25舻 ?FA: D =7;s3 DB"V c EVkVdN+.#*bD֤V$Ds*ݞHPj'`u0!j2Ȓ-&`ilp-ؚmXszɶŴ&)T(>dYXSZlX5N"3HR$$hX4EDI$UFg4SDCM=pA۩u] vbI5&lPD)|dG;ʵvG*[Se=394"@: rTQt S&:>h-8ЈܤRAە>?\dteH? 2M0,XQD(J6_h ^zIbh5zn2D++,H+K5%. KғX\(@X-.g jŖ*hHæ&3=DN\\Iwƪ,t Z_,I]Z**#1p\Mц#RfsR "قH6z Db}DB%kDkԟ(c^@BV>D_ ;R6lQ`$7M/X,n1]E:zz<z(Z)P,)6Q,GK#I琛4v1fHDֹF\~&L({ DlJ%Q(^55-hm[1_X݄ҎVS Fv!>*P~ALߐL5j!,gK2iJ mPlJ[OtGA1|^1:ME8fS,2dEgKw f(! O:xnrOrC(W/hVg ]X11{.af0f*uvA?Cju9˖=!լ*%u-~[#9!cGe0)JEn1-3 nI)vsi 3rǒ;bX3$[mjʁ#Kِ@Zf2ڣ `+Pszߏ*|#Q?SZ/b_P >| y\.2";©?m]bvL 9 24E&O#(jBeq};EZ`cT1B317b~'a(%`a&#C Mm~%v2Gn$&sOTT_4s">A+7X'r)#̅j/XOg 1-PA1p%WL;$?hsGfxh%60\pt1LcWMOdЅI{}tgreL'sHG8ofhN8 XRpwbZ$$yu!eM2tEYE%$)CA+h.'HbU,XDm}\TEwGuA+FD+sCBCHao0!"@DQ_o5WR_3 "T&)؊(!j`ͥ`0 =PqSp9WeNE}Gk$2e`5wLy !e65iuu5Y[2[1Z3y5Zei(8Gm9Jb{ӏ>gHLzW[W7\&Lj'XzZHYUZlW"#YJf%N-S ^TYQc]1jX6.b95* V9/TYшUw}]| 8p܅B1ycz T)5#\{H2#Y%no!d~[HH!e43au$]Q7Ie"R ;ven`!cUI3y9 QOq)s깖<e#ze7g''3j!:1S\]Xa e s/m5ہ?s$^UǛv7w SU+hb.I.<0bVhMs&$3Z@`|)bDB%7r[%?kP#'<xY`I}2 CC=`6zkp5$RN$%QX_]1.s<# -^x]fI]Cw9ɕ_Xӂ!Np'I2T[ycg`UB$\VyS2K4;gȆ;Jճզx. j7veR"iMTF5#tZ;2a1PK( 5hyaؐP^ZFC#9X͚ke;'$z{Y5 R~dObY%+c1K8:S|n@F "Aj6zA[3 r937ٮ"ǥXB>er:<$@;m)2HVLDDny-ë3~6-2eB#I_fD Hxi;铊{![9ЮGf=͹Y({YҒ]ITɡ4Wu9g5kMދ$gD~J 1Qi@K7 H ժ.MhzVaa("dN1OO0 pA/ў'& +顨z.GWӈd rSO9kUA/;Iwspִuau4,TR^iZe0Nta!CY{D=̏^cxdX#ItzzGXr‹xIԈMmV?/QTĺ!ZzHY}6ɵYD0{8z$E ŃC?gb5k9|}!;?85Ƿ- ꧱Y?ILq}cU@aG,̟?GLA'rՈ[le)]2C rt!C2DX^PlԒ7g[2Na$ۘwLWv W dڑ7&"?j2++<;%vbÝuPe̕c; {:\˵!*^d#xZ;(_o 2g6x"R@P.٘:λ4rV$~ش 2QL_p [/00?Bf b&?RzP+/ZE,LF5i)vwY $Z=BFv GRǁPqVOǪcP-۳XRcCCu-QRVjEy ǼLd5[A:7@xoC34u6t㢕ɤqԈl/Y e CmMt H3o5qgzkrU.ub"懰ځ쇺Kܚ%\h*)z_7UX4[Bo*6Zth%j;;!x}WXoܘ?V!a@eUlFFW[Ǒ#J'}tÌuْ'10 `I>^.[әwOǘaISO_EgX[ D!g;)UۘZSZOyaILz[V ~#WꝬB&wc;ɘmTW52]x$T1D3riQ҂0N7KY͙Sz).^Vgw3DX ηꌹ+AIp(i[JgNjt:l1˓h޼ٽ:WH~k[ zRfed+ Ȅ\a$Jcee.. ?>-4uX~kx6!lEj6cf:gv==*Q|-ۃr\L&pX 3"[ ];7kN4;?D©&4~¥fJ%NB46<Lwti G"_ђB !ZniaRF63nlv[:[/!$g!:$}{:u!-tz$WIN745?FHLj,#aڲ5]#/o"Rh(4^/̘#]21Wq _8@*d`D-^ĘQF=ZE&Il2 @M7̎2i2IL61|h1ğ ,SR,I&S#j`ޭ|y5@[<#4״ %P#[g-X,{(PApFޘTHy±I_&bN͝=#'7ي ,ݍm1v؁[_Y8ƅF:FXSN|'gfN=ȩ5u5/j-E=m8xMm|WkPXjLM,@ ʯ&(A?R6MHJ񜋯[0* Pa(*3B3Zƍ3|z)I40ȏF̌* _\t"/-ӼΛ뿶i%`+[*F. S#(<$*-X-T2I>=aљ3+ %Jhz^q e0 k 𸪔2$]}/꯬ ޾Rװ fXHtbLq_;zSk%Q8vԤ nb=QEH-6F}40ّoVR8^YtA%I6ѳ-q,=OMZiRZ)7CV;[Z0varO }F{,ҳZ.!ªXQ;t E?)9W#; Be\do J:Sv 3;Rm1FZ]]Y+S; .{jڰwƇNn4M؊g (kyI{^m{ƭSuV5Oʛ>~,ŹHB$a洷tj7c&a7^1AQ&خ!T;H3m7DI_O7d_r{V<::9ۍҴEMFk)܀-~XqݦLEl[sgqǝ=G^pgXh- @$n&kB`!hr66mIT~a+呷T+tOy(IؙŘ=@$q'Ɏx&IЊ;n! ZBlAxI>Pl$!X4XrzcT`*U䣏nE*JSNSvbS*Iw(& ٬cvGuckXa;Ģ-~'-RHF 'I,S{}˓h bsuyl2*􏆠j19+pHQl+Jg=;-Z<@\W{vJi 0ƥ?nI-Y $j=nw撒a4(B&f(y+/gAܵC}4[o*ܚs6)x |Y5Rƨ鰌kvHjG-h2KMO|/@}yNE׳X;9`Q߆73g+ W[E1PEhinwg %A ۸˳sN,)-W]بķ:GD! L `/zqTXE% @GNQ%_|aR?Bj 9ut򧫥?!WgŢ# OM~?j<~uT%Xt(tD1boHJ?H/Q+]A&{*s>C<@D(qh:?ȳ P(Zu ihФuƋ9FVd'XxU&m5%9'ўnKtл?_m,(5}iCQ61(]V#g11GVFa5q-3+a3-jno,MYƠ'MkP#֨+/L'\֊FA|cQPvьNo,jU AqIj&\ôn9eie9 Jj3b;)2ydr-8(1=BLy(/X5?Y78[B`\G' z :/a`մڵ V'8K( y:]ك@`i4ި$TV%.(kݻeۂ+nWiTQ3t<-#咮@Z$8p[)MSG 0Dh@Lm105՘-Zg[}cc3RezV$ čl#bڗV' XkG_f gs6Ј2dEre#-\Dό9.jݩgƎ>Hs,]bRZV/BB6G%U\5ij/Uڦ V|DCZE[1ex_-IdVVvY}5KH޽ZchOv_ll=@.HdCnC[X CٌkΆM8G F mcw e /&ɦ$@N@ zy-db\mĉ-k/A#'R㧦o "һWu9.)~ĕTFnw=Q QkaƑsjNhbj׷`DtcM(zMb pFih㸩y.k?Oxdz"#8# =F5υH>d'P_^wItcY ;60Ԛ;VDH%b dVi!BAc3a f1bxz7D8Y/F3]": AA]+`_@ /b&Cbw3%slB'='lL4bIH.D=1c\SlRngfNȄ;1gEZ"$%H CN8sino M 1ZFhyس" 7߇p 3@8E_N1}=XFd&HA6G"L2s6z4W6e%eQdv `OdUeWXbNgcWP} D"Q]HDYQ.sGiK4zWu$% g'Kgn/a`/6kxQ;=5~!@k6VܗM-ETRa;H3bKqrI΃%GE+$cwՂ ,ޖ*1W/>v'QDa+k q^ !w] \2lQB1qg "A&rᖖxWi/"50n3h“5AqF+EX#C@8OiօWbDoY##)x#sbӥ&#=VGj2|HWяimZ aVtsUsE34Rff]8F~F$USB~cBBAb" uA24dD%S3qBgNAc]MѢvW4<ԇ#4Z.h$09U K Umof(f6o]6th/qqovamoF(X&t.0I &jQ4tuPcj~r؉EOS "%x%"mk vVw/tY r1h3K{[BVz@9"<0Jf )*, 2]c7*`TlX*AS=2â?&XDxd:d#( #8>#:9Jpjf-]R-ڳzgJ=>(hH*4]S!\>ɸ549?!&+I#KR 5i}Xk'2 G|3x2?i_@L*X6*0AOT-u(d/x[-ӖK0umc9&wa*"ix"oZt(5bWC(́vSv Q'HSRjt&q㊟y#y:, J%U؛ /Ĩ?(a1Zmf#"KhbGue*5H "{փ=Ay=GC8#a&hI)`qvhv%_W%79)Y6 %=SZ9QMr}O(kvWz0OelrqbAô"Z3^}XtɵRC49\ ,#2;Zz9d `a$@5BA+#i5ߴa7.Q~Xq.qA?>z/JyѩT##젬izuAki_ l hM۵]#BM/3>Ȼ](F.!W2E-6.^z8FR5%cnhLQ2$'mnzZŦjg$@X<YY!;&pg6R )i"K2 ՕƊz*(S83)M2R<,)U٢j($.꘵r"rT|ĮkPiʚa[@lpܢ^%jbR5ko1GW8'62'm46_P#{:8R y Gm$&: Fg TZ5#$z$ 5Wy-|_ k}U"~R$̦*u6>< cG9^:چ!f@N՚@R .ZG |`53̦Jcq@QJ&s.f9ߒ%U4Y)r%Υ6`veb8p[{̠¡\EX^lgAž?#?.~ܙ<.#̠c%%~PjaC R?&R K"ks; #=kFjE # zv8bRD+ȎQC0 LUR q|J5`i[\6Kb΂yy_xsAqaR?>*h#qO.@%&JNft/v nR`;Q _ۢ'KJ.B1tOB8@6(Ŕ'KlԴ7 (rT)xl牾pmkjv,G]iON%v e)xiBkwha*+mN0xPӷF~?O756=يIjk[]j1W-}U/(1  v9Uqɍ< %E, ;rK;vLJ4c>f'lsam3Ѕd :{^ɛ~u*xe 1a&}FBJE3cQKj1 np/oD07`61v*0xy/T?QrCw/ea#epvLHݠZw/q{y}LpW/bJǶ:7/FKqDz=W9s,o!v_R~y."bh⑮/~WB pAnj҂Uv,xd:\IkHhft E -ۈ|$U$@IpR IHn*Ǵn9COlN2J-xR)2n͌ ()P4)?3A[ϱ+H{> s2ӧ3-)vDOu.!>WM?-W&fb71jg5h<]$Pg-` 0ì9{']Ƹ*Ɍ}__XHu 9fDBMtjqMel# ǵ͂*P Xܚ%LhWJA?YYz:*.%f'WvlZE9k&E96\i[]f|jXNbE̚s?`mta$UAg-ײ0fFWZ XY/#t։sU90:(FhK#vg oRVHil;ܩVjBRBVѼٕS5#nFcCTNK^u9ȣQ+b b."i!M")Ij%Ci?LB槤P1)e !,YTBD%*Z4'!UcK"C̈́p c(mf}:x-TU57GLr`L͐seFQC6(sd$$IJ`I VI%e(mIQp`+F! ,1pH*\Ȱ}_l ŎAj8О@S\ɲ˗0 B\hŚ5[8pf̟@ P"[%jD"F_: cՁV$ʵׯ-gIvB2]˶mZ*޴(uƊWfyoVn 'IJ61"6sNj}L+I B9gP6wk/ңSc\kXm"Ebdoo6m4&RBx9ur_z̭n% "i$[ DN?HN\ =^z5z&wmw geC(y⑕i+g}mp%r@;c?=78U6݃ NhݑۍB q[A A t#g'9rc7ME囇}E)"ЂFzi2wvxכIVS5N%A"Ud&Zp$%`6:P^Mtޡ+ty,I?BHL ~"y(%DUgdTDifP3yuq[)cFuIDTZ&5FEwDx*jo6T"I`uS K0 9ǍϠ]{f-5)zgxJ&$I~3#$6ҷybR } ,?ֻ5Кl]"I#Ҧ[Y8^IA9"ՂTUw7n}],g[\OD-ք)9BYe7}Ĉjb / ׶#Xzφ)-4"!f}:JrɄDNۑӒg |q1Ii` ׼dp,u!`\4@eWS'Npk碄~(&(*¥Y6AD#fGYA3oA6Ċ!N\ 71#" ,sH&`&LbWUl32'h{R@OԦNc7#\e)#&趓E5l[3h+\4,[O*=&.'jYD$9[Re68HN8!k[$L 6!5{A3Ysh2q#*8 vCYSO2g% 2TJVV}E*P ba]F{B#4(r%J~e12LJ.9z_ '8d1v'gzXjI6zY7.K4 _5v()(..,*cGSx-0#EĘ{.7XE`d[b" HJ@S&iKP8=f 5)dav3 AvViV^s9b%6'ZzfWX@Ȥ *"┌ *a6Ń/v5}<ѭ ! ҷpu -HM&718[ea1 PV eZ?'cԡadӑe).IEocˊCYxҝ5[ RW*sjq72'L os^0*i(Nk3)9Ai5B|AJ!2d.yD/^/Ш ?f~@yi2*xJ*5Hr\^[hbAAe΋S9m(T.i}p^mZP}j[RJlU vֽ&0XTXqg .Ո_ D2Mzr Gvd ˂H,.:n¾4+[|Ċn>1ǗT-ESU/TH 60 үHE=望zdkH`Ʀ)- =AI1tHL(pSC ԲRMJ@;*z(%SdSf\r)F٢wb8n]1auWnA WرpC=$R ʣ'i0Pْ,h}ۋO[jgZH|rM؂ʴܒ]GyKjIB|9_<{ɓSJ ݩT>q=$2d珶xR$*:).q cHQ*f$k=MJ46+|?L(\#E=4aG(8*Hю^Dt':ż^fi2KpE)"!&_Eoiy[DtVMLtj'ZY:/Qnay NuW ,N/W"gUV]LYaOR t?=y[W4O`+X .9T~,v#QOkKVBˀ+I/3lLߚB$e bX h"T`gg-ރ{2dded 0Z1?B2%*%),k>gZ'U32.7蹓 '<0F+dcc^S3dH#~{8Tc/#S*{unW!SZ*ZSAHq_oT9JAv?DpQ7.K15|xhwX(G7FF]):`gSK2zlj4ABEe31(0 JH fb9u#Q;+HTf)隽'tl5Rrm\ɘG1'vT(3'vBPt=AB6aQdHR@NW."Ijc=#!,5ywbdI*_qJ|OwQwCq3Z/ c^! =&eQ)S`EsbCѫlAfhX1/2 ؖ&),!]Cqđ4ovb TTF~9BY5xZ$⒁OREI(IsZ"7#KWW;2 I:B5dPjNŇ蒯*c_!S0AL ~nFTnGk[2le! V fs hFCg!w p|X+棨*%DkF.pŽC`T!%DGdM~DttJ1vYa*++8T)("Cu*cJ{(! QaMFW턼H2\(#*lB4,nq7n"'ï#_Q-s?O*8שkHtKyQAl؜Uv f4R e ~4 )`ztl.{QGFƄ~%Gcv(ڿ嘬 ԍG Tǫ?tQjw|T"wyH2)겁"!HI9(ŽAۯLh]8WUkaLH$GHwSV L})*XTH[Mh*̀mp!3^uٶHK.JBfQ#U)g(2mJG=;G*QIqO|d+EP97kov4$t X} ѻ6Bꈮik/rq\[ңçfsbYlT%΍@Ü.m5 _ɞ7y4>8:{FRQx`d%Z<@N!e/tQD$̲bEn-MQuusԯs? Y`8NFǏJ?r!0-.Q g埽@PB >QD-R cF/2^-H*ŤII" G5męSgE$mi@;ETXmJi*M1g"TV*ʕ>O{شZmzĸpf1Pn @S XG[Fm"E `5! ,0pH*\ȰÂJHŋ3jȱǏ CIɓ(S\ɲ˗0cʜIE[6sɳO JQ <迦P ԫ=b^D `)׳2S6)ڭV;j-8W X^HoA| 68jy۪EhxaMrޱa1Z/ϛv6 +V Ŧc+c"m;oh Խ8U' yo]ގ=nQ7ڊ̦-7N8ǫ|.=Ro=_^3րUAGQ~lQalQka=ab a{:XgJ]gE0Wazc@慝vFAUn"nr^; rP&Guv^1b_;mю="Z &є17E̵E$Y[yR&7rCI֣-zng"c~G]+VMv(q ynHbşyFިjW b_E^z))6*H)4-3!aSu;bSؓ)no&ZhYwJ $x#n1 &N& ^A߻=^qX')ڇglJ5wxq5f+x 3_1'1W˶z6֛Z^*4$m%ʲm5 g\*k DgP\{d)z5hA¸z)ȱ\Ś.%V`:׍r=sCʖ-.iݾ' -L`nN/xwпWP#ۘtm:آًsIJ Iʰ\2vO݃yntnB^H̲_CZB,??1 BDc$U)CǑ`|7Պ`Ƞ%B f R8d:AЀ6 "%տ: dFcQF` x@V{ J-b$Zz n)&<%(Bbj U,?‹yXgFapDϾ@CQvQ;@3HD6^MR2 LKuA:aN tT wa-;ȅ$<$h`|΁\\RXtwTgR[iD^Z"">rYfR"0_ Bެ%2Uy?VÆ Kry Z'A%TۖV=U3s%@J(RWHAMz#% `Ҋ؃puH<ƹL#[hAHIr} dڵuSғZa4L>PhAmr;"*˭¼L8U ,tv *k,i2$(uR@=.2fLªX(=F{b&<%,/W5|mْ2-d9WRb{aksܢ z2*)EMQJ*2\4$b1I cY$5$!XhԖ)ܞǪzsz[ΚBIPlc\WKDc =-XU8*jüBd/ U΃659M_#4D*`ʚdBxwU63b'E1Nn޴IK>-g0`<6 vd@Gb,$e]$*j,i"[1>0X)mD{^ 7КoNDX "KD5U t)e]ը-PZ$ƃCD[_\k5HdOsyDƽMR ĆG:NE.r:ݕ{^_T-WDNZ~@FE=V*9/o)d:VRE|MCl(G 4@>悥OtrF'nDjak<7^JXse?j[b.7Gܶ8FtQKqAuRTڣ Gs8j;E'bpD/q'g:03Z J-h-:Q 70[„}1&lHcUGT&bN'V#HJryGHwcJjq}d .HiCcw_pgCUGg#n:u5qb`Tye0v1Z%.tx$|A7b$4CoV=zcb8f3tU3J(o%hg:r.1!y;djgj~"&\v,(*FRvXv+:;{{k2H 4d]&_ZM\S_E+@5!!vJ6FdOqQ3Gyj$2fDnU; .G_#qcL 3&0\R>0k!91FXE)9cwda0YT=TTx؉8Y eB}qy2?E#T SR-|苅Be7EWYkFUPcf,GՃ!V9B2' Ba33 dEwun(l3"[yMQ_gg^62POGĂʣKZ|9!/␈h4rL}a:n9PKIcwA] l2*ā|?GJBaCH"' nQD*Vy9 A\' *9+L70Uh'OXDojf`GARhFy' a3ƞzJThxkB9=~"#n0OF!G98)oJ'ɠ-*S`?<8/a;-GtCMTWPz{+ڸLX,*erg!PSK9ǁkTGEL>(u[cqrDQ"2;6B=Ld5U#jMS[SJ 苖 s4>ztCG,I2z'$zX vzgQxuM6RcؑVs#'R;AIGa'iN$ZHX|kÏ e0p\/v4d6[7kE7$.syjc-nl.l ٍ(6:uT%GEUB7V[-sGqR4Mݗw *Hh3I_D3 C(+DG$; #G'C5;ȖTVhȱTUyGscp>kQd!:ȡ{pOA+YFA\3{08Ap*H{_7rob2CHgH:)CD+yJa<}:aJJ PUcf'DjGBA}Cֶ󶦛0 cc["ygQsQ~ L㈑&?xAlA= jXO=3fp]kCHýŒ1K 8XPz8#?0Cd>Pxu) (0ʻ14AI1:eEMyŎܕE;]k!^$^Ys^0_HXaѸ):%:V`"nXRzֱC׃V/iĨ;qaZKs[^iJb{w`M1Ք џtLW68Ǽ"%{&#6  jShX2Tb'е,!awƬ%6yP~Kn*gA[誉x6茮ء4 6C%FUf{3Ͼ69xb"n5n4S ] ]81̫Bo"Qq/+IcmY9*1 dN?39Z+W1GUF +a)2A05 (Sa?FS*=U](U%Y~!.a$jrXGMpLۘ qq*j\4e-)՛'W=ucmߩ$Jrۊ{-]9d]·.unM'j^F>ȡ6!i 6)M̰"&/ߨc6!: t/&LM;ai#B?G܉F *IPRI/! ,!H*\Ȱ_#JHŋ3Jw@=ɓ(S|XVE"WʜIfA6sӡK"cJ@8*]t!D`ڃφWjz?`rKvөly*{![Z.WâHx ^꒮@mJ;5_LJt;Vz1ٲa-bhB̺gR͙aָ1ҽbԢ 9qZ"vl*tt|զ-oٔxt兏y:'[I"i|I{v1lzX]^BU Jx 'yTބ !E^}n m#]mnAR;]x3[s]܎ĥhm !wy&2vr?$>c!t qwp)\Klte}t"_tn'fO(O~1&ZrX؟<uvTRi*}H^%wQATVGUob$^` :I]. biFdqٺifm#uMm9\ #)`W.GZ;^ ?4eBWˑAKd(z@S,n[Ҋ*f)rމˮ@R$5Xzj/cP$,@:,wYEd.'6 ,6[E%];يbxzYi[nMZ$gdBA\~ ,DC ĉ ڄ4㬽q-?ʶF d96XfRBDy1?D,؏=gE.xsn~cRխ7ʈP\C41B:}hXk^DV)q^ π$9ӹ()(TAX(u'bIwpAN #D}䡒?Xɔ"qB1rV AHb 1J\BXյ=n/mN-" yx\ 7OCM6F&Hdhml.\\|cG"t wʦMpQ$…Zr{\<g븫d %(ùg63t8ʝtjpu´0;x[c\A..\jJ@%SUO8PuE+i rG+J IarcSi}R&{D읽 y%J].brtucFa_[iZE:0,*k $"pY.&oD 4P꩏a!Hxzun1S]Z6I4hDVRo?k!͞W,unt]m ˒N*5U \l|Nv'}E]4םh,R'+V}|L%rѰ$юv\bxK~G'*i\hpQcC<*!ERK-dO|nr 3m89hOx2X D"*pi4ZW Jؠö! p%#ڣri-h N5ƙ xȓ mw9H5%)pR8nP L*(f1I!&~cu c ^QUXtZYELd}zq*V6Dp-v͇A=e-.tJf^U#ԦYSDii$a#1. Lk\0G} Cv,hNϼ )ZH--Ԛ#?C^+nb Ku^*.P!IW)FpB@ȁ@'a7M߃F"qxǥӱrcT_0y}:.&N coESN6cc"|FWLqbZbL %R4v Y6a>S "CnW$X5jA$ TX1'z*zzdTw~!L>3;0:wI6`Y`Z\FkxQdp!c߱d `K^7'v*uL~/'|+Cwmq17X:^2Rv"zKQ6j+V:m?BAu}(ch.h9X$ma K ]~h7h!2>!d#tE1>*fZay5a( C;]DvQf,+m)f4hudoѐ#-1f3#'Ag;>P)19%)0e 3cG|ӋVl8S0gطB8&Y!e٥9 fc-YfawLwR8x'a_(h%CDcX$RvMGdjtɖyNA *8S$IEsT1EPyXdhLZ|7(ZRjX4DŽYVԷ[`f0 Ct9 KV#]u<4$)U"B}T'5aah8#HoAsq`nF63⢮78n)h\nF[G5#x W}NRQb7fL4IH8pm0HFFPq(C)z5AAwcl# 'ٞnϥ.c%Ȇv>$ZJ}#\ (F^qԪ/ӧErHLC0jӍxa=S%b|A6rf'F.zkzb0M;&-vD:u6b`C _Ag39 X糛A0z=@`)R`ə6R37WC DՑ~6E#њ>QAUGʴ4Q妰faa0Ew8U! ѥS$a!'Ņq(Wb7  ,%)VuM:!?J*?v#qYqwIw\#"C G^t[ "U[vqYW1P#RS=N{HNuFw^BK<vdO*VO8A{ij \\C17J';F9SGbR9Lt3n{h,i!S9w@=w9SIiVU!Ht&(Q؊Wٺ;Ga! YTղ^V@c`i*Ma{ :\nK^d,v!E*ɡD?HI!G'! SQ+D㥢b&M7LLl\)fD1st,%&-BHj!Ȼs `v I3c44$ 2 fbj 1*[#R cH Qsbʶ;6CIftY i3^+Z'uzZM⇤ + 9,;9x,3EW)߱d UdXL&}$~Ol4GTuhqʅW>9]a9C;!%#!|cB|:9rv|vq :Q.Uw9!$:{3_j0KHp''᥽4u49]U7sG=QM1p:}fa-V:%QQb-;pq|1:@餛aiCA5^zG4^6q乱%F>T.Qy`^Kwe>}I ӑl`cFZqvy筑! , H*\ȰÂJHŋ3Ǐ CIɓ(S\ɲ˗0cʜI͛8sɳϟ$9JТH*]@LJJU"ԁVj=^?Y#ڲڶ ";iY_}ZB_m U[1ߨz#}Ly!Ø۾=HXmNk[Q`-a͙ kqAۥ[teζ[Oyf"ˤ-:rwФ^3{\ߤ{k ;oKqy`-Sl! [H-1O 6蠃4e^$aY\W+^w݀+nA[4-Ԟ;ՏWZDbF$m4ʴ)ع n2V9^s9@vOM2)r#_rlAJtqgm+8#ץHxw |~Fi@a\Ato 䵭T:,g'Fv'=%WIhttxa dG(HˢuP!K)re~8lQy##pkDcB5@&wF0{~HJU >;BGS HGxR{&b`XF&{D)`FS=H~S\CfD5%6?S:wx{)Ee9!dRs(Gz j#u504SE-6_f]722mamEW'4K*APBL:d>De9B&{n'>rk-Hq8Ta!eܔkqO7M&Txa&Wf W?AvC? GwgNpDGSe\0|BwE ?fÒYrd D{203A82ilUoVw7I`1(%_#sth9!? z4l#X44Q8t`S(^VZ S7tQ+-c\BpmvX\V~R^f5ah78q3M6)u,7a0ɢBoDy)SL"'ѥ6wai5^ ,s#sB6TQz‘=7-=VKIhhlcb惩y7?;qz3PU,dIe"cw}sJx/axN{<5:[`jJ|#۴R:*=vhv5+4%t 3" "$:";SO|f|S8 cԢ#RTlyc#DVul;|)Y;&%R"k"2i0^DN7a[\sECO9sV& ^7@ ED]zUW%CQA.,?RtEň#Hgw*!vw H=qzAC:UZA:Uҩ/Gm:RLx:d'áNJ<2w[HAS2RBbuYX՛VLkDq~4yS[cv1as1(tluJĶ ȁdaDyTTXh7k,>}󃁤U|Shi5YV;FL;'2\,$Jݲ'6O`V[N+qT8 z!o8cQ}W.RPb:Z:?%ި"NzFJ ʜ519AyJ*1veWA%a!<SØ%ZCxC]jPgA7Իn;g nuYUW[jg7k$`h~@[2qP ##GgH,X)n9:zUu?=P)MReFM|O,TvI! ,H*\Ȱ_!:Hŋ3j܈PbACIC[@@i˗0cʜI͛8soϟ6=BD%УH*]ʴ@lJ*_e걧կ`ڊjoؔO࿷p%vݚ*[u fU+iTd!]Lˈ Wb`SLZ;wLru˶]ݒŌfY [}.=ڡ\~,YGE ۺe )dZUejN'RLO-{`[N`+Rl1} .(WjUyؒjh\uc$S8߉[/~a5]V | "y@VHIDMچE4}dd|%Wʇ#io!ahPl!'L# 8PMx\viJ]tVtb=I-ܕ2gI@jd^+ yGJ yFCќDYitl2ЉQ>I"'w}ZYiZTi`bVL(h&V[ }iuS-6[[s|hj )uϪ\ZP@ރ)< )nj$\PjroW*}kV&z6?kfaxl^6"8ؓUiqgKcWh | /DJ %N@ DL"SXSpN"+E-OeER pնXC8$5b[;mM h⅙ry(AfnA)E\d' Xj-g4R; w&RK,T'>/iْǨ)r"qb9|ϏRO=|:V:װ@]:Ѫs'r 4е,gT_VW[(fl1/k @0I!hA% xKj'7E&A-4縅M~()%*P (S ^n BDA8a En !GHn(hor7ڜMh &5^qxLg NpЊZ 2p"|j=(^s֩eb8(NR B3Fni#¸*9F:ḦIEП|W5ţ [QdVz].2r -3fb5i 3 g"R4@ly>c3"Ei4[hpHؚnҲ_4uC(8IxQ[hxJ.Lt%G!<| DnvrBBlgo{g8>n!X*T5 BY[(@ 2TpF#d. MZ4B8m *8PQ e%G8)2jb~FNLNi[ѲKmD9T^%D1AGzN)Z[1r&@'e+0(_;N Cg $-aNq:V6x&|$nVֺj0\HR"4odӽүl}Z1ˤmҨa &V=j{@i4ɢ?ڊ\I+BO*; 8V! ^ K`-H+]~LvY١l [w9Dd0e"M)SS:XpIaVPUVlɈWOLdL =U7-Tњ^<E A?&dO-4dXtXx*ݴsq +;UPsfL5B)OMc\"*]T[r Fi=I_x-bvw yKQUB4USsEf-Ylklq{BN/QoM~kp;:=Neq}%AS?2BU?3'QR5I]p3b+"9Iq-Ipwq_4RAH%lS$5aR<"eδ7̣Rx%Bk'PY1qkV<cnxxU#FC(=$M/HSpNOo7/rVO:G[QӁ3J|ӅDs5R1F3_( bWdc?83!2x2M:jus Q]sS1qqS S?W:aR V |a IWs#%a(%DWueщ`A`n! E2u[PQj-n>.M>tC7eœUDCR##aDS1DE[fMfTo`/'Aj R&&hS0sK 3a ds>^GQMpvHx 9_(C=[0u|1PZ$ 9  uZw,+$*m5aQ 0jpMut EUb&) >Eqow6h t=@? `\F[SQ$4_Qx"ACJU֕-L]cx  Q– Qe7ei@D$$[De8b%= Log$x 8-(g86 ^U$`jâp4tC}ŤeS }ifjPVGw19xa9m`M=F}-X!QqtwK18b|fqe2x֧;Ջxwb3$y))y+:#38W*wS k76h%5󈊛mb^#kT"o888L>:a1'`dW 4Ix e%3h% ^S^"٢UYpmy|eIչ'U "DG3/Gi.Dj!gtry *We-zåG83JT؁EZhRCw97$E8Oj)gsF zKh/s,X#9wv[c]WVbX('dpidJ<6{4tm(Q:cYA3i" ,aNCf|$Fd<Q%s^ާu(8A(z$C>*u|U)L I:% Oi4ƴ 'tw`34BFrHc71_,U~g{uG-0MD-T _[03[opK@&Ťs4/u(6)6$md:Ěۖ$Um*-2†rEr k2˫!v  @ԝ| c]Vn~ \a9 T-E=>(k+%FREYt(__ES.`gpVo.#~%~>Zg?n芾茞sh6m! ,H*\ȰaA_ !:Dkŋ3j⿁9Hɓ(V5J{##2͛8sfgϙ: 4=[0&e)ӧP1Wbʵ+[@tiҳ#2P׷pMV:5ݻ(+LJLsR=\ݶ2൓BvtLGu_h+g픭Hnu"eӖIŹ0oKi]ps 9m;ww}慛|})'\,HyBojM[AiEhp1mܷ2U HN&Dmsl_'"tjQ[J%Z)-|:*wdNV25A#VJ)&X=gs)TsIA)SrܥIVUU$ըI,!ؑf5}zE'YiQX k}%W^օ%i(@%B"ԛoRf*'? 8YG6KdV~ԚS)剛gUyvFn?1ؓy r曛~Fuk^Xg٢ZUfh{V+RVl{a[B$݆kUױJ)pI+ɓ?=j[Hƕ=@7WeUHYr0A[={OZ{mjaO꤃h[)vrg;z 4Sd9]ک?W);ڃ"|pwE1J0u9(g٭ ?hJ[x:l&)ۥuC7[`{y)qAHq6t,|қaBIJGAmUԤD$VJO(P)@;.g;8%ϑ#mqm mQ0[٬g/|@B}J KLT%kӿ[HqYl! ^@3R(M!q<or:r{`8(HavآZ)SҶPm[`cԸhUZs%+)řDqB G‰J|*D_ⱟCgI\q \08&:'~JnYچ5kQjC$8#_Ed{ ZjeJA5rzDa Sfhº$H EְР'jc>CO8FL ,ElnrgY`,VP! z&>*W8b,MMB#53P4{D ؃d0)I$dyba"k+D*ai3PJf|)'9ΡE%];@k6ë Zbef5f1YLNZ_jzi (On/WiZc|Un2|[KFuN ,d{N6&,B 6myips&6(r;rV)VHM#Z>ItJq` "Ԝ@z52_:X,S} v.c kJ@-NxISb NTQapaڧ8!\y OpdzE;+Ƞ J iFwLH}Va;ʘ%†tՔBd\jځ Gh$v{`v3<'ڎ|SQU 2l'\6b"[s LH]+?`8U:%Wk˞PnzTᘧDuVA{NىUOoԂ%*ZPEW.Dfs9&36@1-Nɝ̑|F=z&*иl(Q_吡EJ]A}B1svQn/+9fq;nbql.;[hnaR~g4RV>~p4~rш㔘t{ `ie+-,6fB $ŬoƷ}`ehLvL!SdɽdrGpb&2 sϬlJBgyMؓ~ 0y&2KQ0|&wN up.w8QhPT\/EP}4U{d&`@ oe]FYe(QxIqӊ{s<猳syaRZ4tVNvGivXէRdIzu݂s]Ĉ[9S[e(9':as3R2ܲm駗^c{^QvuUwULo=dwf1?ֻ׼-KF|I@RFES' #.5?3RP Ef%SZ1ƅT*XaCgP RЀ Q 3d*ZV"0;{IA&H2Q?.ht+R^xZyxsMKsUiB8ffvTK rVufAUËQ]YS)ha;'aB> ̡;qy846?Ѕ&% b[ZQp~%FvuF&R2$A$D'fQp3%\1CICfF :sC1(3'xS^/ղL"K؇^}W-')~ҸG,gb=jdtQPsmhfr; HEbIdƁl"kXI ADLhnu8T9rh2 Ga?}8Zsz(p9c^RK` lhD̆X=g_zsCU~j)~if d=49ULs#|%L'{3HbD(}%1Jq "8;=hh53RX'}>1셑U5xP)r)Sm )=pKt dBHEG_-3J^DsI.E+Yg/(icQX%if%HRڥC2zu_U24#J&f6'2rXgTwTǙ4-+/mcwH'$q()Dԃr&- j!WTa;)7r?eW͕E|E%wn; W:q.*BtW466|H@rT0tY(z|$i1trHu1HvVU386kiqt&Na6\d2z6:FDh#a|g4::M+:SIJoIkPqrq >q9@})TNcDCWsELR ?7V)DsJLww.ɺss5)|Lg=-TO,<#6k7<3ʚٚV9= #\ :AKos0x8{J!lrhtGNbf`YW p-<;@Ӂ3%:ݵ;N%#_9O X yXAfUsō [ RfE:f(+RB؎2+&_- ~sSaqo"8Q]UBgfi]RLsF4Զ ҷm#gNRL3ԸYJd;CVVN=8䵷794H2$sSG95xDA qTb'e&{?y%W/uc Dƹ7l<|4?H:)f[zR0% $dUvi5 s3UIҒ-7EH|vSe(hk {(S!:7\=A>d}0SĜQط; f( b& Ɲai|ȭAoZ v,Fz'XbQgq^ien vi87o%'x!uK{t,'A)Ȓi;pif6LEK9Hi<`TA?+\o{Z)QaܟbM6?qq*Vd 4#h%ޥG AN: AN-XnReqwf*p}3AlknB#1+DcW|F%+a߆n6'w\Eg! ,H*\ȰaA[谢ŋ3jqbǏ CyA$S\ɲ˗0cʜI͛8s64)DJѣD}"]ʴӧyզj/{> lf5-{_ڶnʴxס[t傅;x.لZ=U/iM\c kEX v t偖 ״ٵaMl3* @ ZK3պ[ch;5+{nsN 5HYzpQ2~oeר`/Oˤ)l1S`qF܂S\}0= ݆p0V=ʀMrfx ZaBBG #{=!5dRW.H=ߓnNX_ǚVdhju$aZȅ4]nITHڣxTՉW z$r gQ L&)e_mi@=fŇ[y#`@ rVj&<:ڈVbY%hUh憮7@Jx8סiV:L))q+q=ut~E-9 *\Ki޺Kt1Y—ʪq];JK&(7 >y)pN0rE-VZҔv<Хprϲ;YalB|lM⏌hKv#uϻ$jn8 (aXE5ʿZэ u:dz84gBwR^ʝG -w,w ᶔB'e2@ $rz79^h%}ݣ%K]g_E(.2)s|wEwFXmK⟀[lw/vc:г J$w"+1{6msQ E,Zz).7G§)|U'M,>גɲXV @ 8%^p<‰Ɋ0&EKztaŹ bY6pjVȰ Rpz$|W :Q=VH Y{lJ l uMErRG S!{H?%<'V40UTEpwÕu*ą3SdgI/y xo T^m&φڨ^$ $ $21ӏ{Cּ(G:Uʻe i#+MG|_JĘ1q^qG|@2ST dfybAЎ3$x!@'ƭd#>L9\kP#'JᎠqdhQ  WdE+ REuPⲩBg+뙩^p`'rЩ}IZܓ ΦE|#!` 2$(JM{R W}jAI\mĮLZYwA #iI)-|i !*à =b QCTճG=t(c]JH)$Jd *?jI_Zv|q$HC:3+h,ufҬXb6D7[B\W!Ӆ纨4tr J߃T~O޴;|VT1Mo)3d .l!Zep)[,rn^)7ZO d@{".r(tE+Jъp%MhV8A GK"t[%dD$C!V6O; ҢG, nLEOhWZ% p#\-AXn\X'a )8}!_bʹ5UpPxH$ɒ-c*Yl{rR4=HpnT &g;[v1xZxN|[DX-ȾtPctו,؈E6Ȁ$m %ͱrF#O1 G0$=h~3@XԦ`6;Q+3Hx)‡x +)L*sQn&?[b)ajj|!lf15[%Ŵ le%{&ǿEWnaGTBɤ?7nm Y>#u-K"qja}Uxzrŕ[^[gw@2#Whc)ﻨEOÉtuڀ^uwDpvu aM'C.c$n(CSQByfW=6}[dJWM!OQXs=1rh=,?nt\TXCC@!8+tx*L{vIs"nlVӴ5uQuxxWODȡ2T6)PEow~y^l(\V4CwPx*Yar3G"h k$M\Ç`u)gLT  O(IE,M1j:&dWr+FPQ(] o]е{byD CtURnsPcnDDw>BsbC718hC37!PHg>k#,F|dHXs-w 5Etϖ7mXFE5=)vh&D48wVIbˆ4b)a<`ZD_ӔDs⡈t;J!GXJWȗEJ?ӑ))i[ERY(G /fzYrO$CM8~btat)ՆN:VՆ:s-0^.$+;Q@C\WT#Dvfw[5w\/%8@ř~i] N8 C.$C`CZ"715Ŕa)ƜbI$I K㧧E]YAr PZ-"43[wз$ty/"e/s%EU@&D`vGf!:wZ+"w Krw)%"5\C:j%t^H%1*?_ڇ`8XXu?{b'H.eV*{*JuxX'X4(!Hy+D8h:4:"[Qꋀ^.8U %(ru7zkeF;taS#I F ǵ.SI%TwUW}lcLp8]W۹d%(R`>vu9Ç@WD,41jF+ADETrO+- [!DCqp%y;Qu~"SW`3Dd8dR碲w6L%Qxdx _f!| UUAC Bs!5< JS1CF$Yf{b!c#zW_B8C ۔& .yؑ*t!NKDz_ijKf5[Jk&f&[48G:2:0Lq#AÙ9`!&ьBƒN/Q1Jc[dh?29w$ʞVIj5ϸ[\~e0ޱ$7gT,1;y*0'i[?[^L)0蒧19bѫ.R=BJv@Y|-L" 0u]2[ "CuJ#F7 E4bʐq] 纃lLhl1vSCWNr'v`[&` !E|ق R)9R$o|Z+ VJ$$r+hó߅\Qg+MH^(VgBFrj=h˙p]R>.t(j+)B(C+p7 R-lad; ͌Ӌy98-Vepۧ[!$u/R cR=sX6!LLK*unpu0:OZAz0F3+oR3j^Ն-q͠ze BEtJt*7uSԋ<ɒ'RfJuC{"k@f;- $Mvp#+8fzl Cu-2G eRֺOPuqb>atc`":xwwtz t-6)W= d9RiLR)zŪg''"k't~zaX :"C2x5ϝ}2i"R Yyl%wIxMn`h$#OVd#^w1o0=¥k r:Omr1iegHؚݫ!xcwZq.u+v%I.K(ݢBsC]dHgLdvlqec6·oܢ?^]+ܯ$N㖹)I:P( a8:X2c&*gl8q44RF!f^I cgLS3޲2\SI%urM+;/k}2p<,_ 3Z@*s@їjN&a'Ag($$e}PwQXs!f:pmx^W-2QQ$DW@&gU[$d-.XdbMe$6E>F$f};,RjsF@ )T/s30: L1MRTilwOvruUQlKh> ׇT0Zy0v泂\QpAn4c ƔW0fFv#\tueb7E$ V3?6X3Vci?>38aba8C"SNsE^$a:xJ W"S1_7radN`h7&^3MUQem9ytb8,&Tlti_6HXO:t4zlj6` aEy@S1)VuW"AR12YtE?458s,Y*gZ$#%@;4ERv`;a %R:]{_@q"Ez%F<'OadA$}12L=2 GwhʑZt<~֨֕!|a2\-s$IeiRy{8Wy @gtui$)H?uB`gSFO.T QfF?Mvd{dE jP.ȵWH 焊 W<dH,itL_I¶|I'WtqaXtnD0p,B6˓ Y0+o`v5xjyA66#ry"p=yPqX2H5j$M$z3kda#h×vAzYU7@s;'FUIimٗO(#+-ʧm b^AP&GHBQTM֡2Ax'z@_+<_61"8&p)m`G.Y|57>G*@cCYvhq4}KU-dF`^()}/9Y@tX=GCuSBt2WTRtBi:Ȫ *YRPX҆5fu0+$q擮|ձ~0\]: NN6DZ[9[lz)_hƶ;k7Eh(:|)qAnms1A2((RkiAk2(3"Y_btRM $p1\z;}6=d h!zE@(2df T{m¡ $oZIrJE'HgvNv4) =|=wun?r< x<+xuPmSPjGFUEW3e $s|^"c'B_p{9Cg7Mx S7[Pվ:!xB66뭪.8:dWtF̗9]Fエ$5XHlRK[ 5KMg}t1Z{3rNk%5uF^M 3hr4kf)E(R 6uI56p#:!A7Def%vY^+fB/@$pB1M@J12PkC^v(յt<,˫yE k7F~tZ6}Ius39d걂#S"!o !Ypݥ5`/#"`:lKZEFl?c ma\2v; g-!z"\#اH*#HqkuIvu=]I! ,H*\ȰaC[!簢ŋ3jQு:II~^J'cʜIScȚ8sJ{?[J*MjӚ,]ς)jݺ0ץJT[g^5ۭH[z]m5˗*y *ńK69Pe @Cwl觑>N g0=u=ڴ]rvwcl;FzGY)eZ՞\ӧuԻЈ?:V-SLYυ쩷؟Ul]܁STԠ@7 (=ϩDž Xvb{}7= H!HW|ؔ?VxWX+P#2j 98giYTd;Tdz,+Dbx!(f&\r%u`2dNuZL'A9۟St{e&ՐE}_ ӖM`CZHka9إV򆡐@ݓ,Z-D$b$Df5}Q%;vb KB4 .won篧}N+)ujST-}.]tb:FF+l32J⪢:MW?r,=37P2?3L-=ߙ% / 4L3E6t[ fuQ ?l%5ub9i*,\mJa9;DİUQ"m @)Q_+! YNx*y}M$ )TI2r)nU6x+mI)/Q vm,pH ˸;"BYvسqNRnk6ۘxelgCG0/g+!)\`D2FKL܂+z o!u"[t!H1,g9Ӑ4B`ődLLתRx PZC[X_gNQ -4H.T"ۂ.(aHZV0exW łk$kņa#≪pr,d )I=isK+@j9Z=ǷtGv>vݢpH%(BT傒ݪ yeB/I+ڜВqiXF⿠Wpk48\r)|;=v *'6*3uegޭL9Qݗkbq\StN}v+~̤n|fvDo=Ūd^/H͕[>| $$#N0eQrZM${5{"PSQtVHF'Zy^S /Ӥ&Tq 2J18)~HkrA,^ dMF83NLMY?E-yKATDQ`*:"_0svN??z;3g Mq\#'eFk5hYc7l#g3=ƇV7S]CK=URMF*6cguA8;s4j8LhyIbvM[`Aj2~!/ Yzd>ncj=1oAQ ʖOH=T&q6d?G~(*vxxXU"P;i8'd[/3R&h(g=S BS cBZV9Ճ*2M"akrInhsHTFwKP'59''w#O1m<GƇUy2GJ8^n4xi'[[pGKbGB>#BMYM 9sqWT s{6 WH4b2"hћxqByt$8vYeЍG&;Y4JZ3Wh%ZQ 5xjM(|tw?qTf-(u!IZ^Ƿm!3p^TrsH59U.aa\rJz5jvڬ+(w(zDnc - deKH?r8l}A UJF#QaZJsZ+b5#k5p8Dyq +O ևGu 7V[RPyQD?oHWk>[DG.1{ڂPXpCADt 6`?Իz5#SPbR {A%ջv"5;3hTR;ks2J0 )2WrpWcA%%x A"SyOX#|LUU4BYw渆bc1 9Al)D+?,v 3K#>b0|ܤ(z󷓲[G'&GjQU%#oP,C{xS2VCp5IK0byiƤ):DNSc#tT -Ha:A| Î(*]ye5$Q"-I~[ }2&:/qXԃ_S 2kʜQ $=q(p3j[C,1`I61r݊˼FꑺjϘDq %a|m;R0 =L0>3l0{b%fILm΢Kzvϱutm(yF;I3 lan%MdȸJq Va DG'[D:q`3Ѳ\$j=p FN- \q\&E99fc'wR#`ɥhfakMVV92JW˹czI)JIdfz)q v宏]qHDVf TPb;.bkO{=q\Al@2k2A+#2r)J7֩bbEx$z"eU%'^vi&UAwQe |[{"t!tH AujuVNyTnhXonاk_EHΣ'CbM ;\T+SJ"fILt`wn1 ;N$%(=*-yCafTD5@\3NG`P_9R>B{Yy#ɪ@,j%3 (- d.Rۃ-Ts٩sS#p&ӽ$2j` />^NW gwD1IdDdrNs%'E 㨁-մ vdTQH8n1v Rs'_qH8]%)Q2=['+@^Q*HK\L0wڱ@ekv=3&.B&n A[@3dlCI&F֦P!R<uSp):&Ҏ"6AYN/,.IbN!E3 YE( :trL,XT2qf33-TONɼwPn,,kb4z3óW-SRHtw;S4!wDƾc49]q9xk'1Y2j{;?[qhR%m}!u pz]8:džonر'i)3i Hfx @Gj  RyjXuH|G}+|>c}PD6::,V5kCSQǁKdD2U3z7pC/K@UgKjXF''bv9CC?s1>CJ]g},kER$9ׂR,#Z8$gT]@5o-A GyDFܖ6&MN"vfv^6uLVsL|LR&e0<4v1AUTBՀ@ߥ 8@%$}cqA ZS'T:D3O"Vvq~ 񁋶7_oe4cml9 E="OB <7rj7$[P/Sr%e ąi'O029ԇ8m[E5I qVi莟U>#VJcSPfwsG9O\}S h]Y$˴S B v6a:d[J7xx5oU]Nwpc0 sk&g"'N^ęhXiD"cGK$NX!A5Z- :&+0Ǜ +t60~ǗSiVaBjEGѸMTK)ZBS Sy$[Q[Y%Nq<{Qթt!g(5JpMq&ig Ut}[ 5G;mJU`/w٘EZQ4`Rt@ Q 0QkswKx\s'BBiד2OT0&hqjvS[hl M ,,,Fq4\_#a&cOD ;P9G%tCg2n FRAhrZ0y D0HD9I[fF@oeD@,XEUxZ8r/ZedUFfARPb:c:`weeYb"F݁Y6[CQy3Ihi dF[ W= 47DMRi4_vA?AOgP?a*#%B \akr,եMɤ0te!ae4§9C:4"%߳ c9T%I$:k!LSɛ@?!Fuq29UAZGSnVrơDr4)0/b3 J"z"]Ba|33c1kӧ=E@!)V+ Did96Ji,ZF@LHA({d:UK S;jO fRX:-fi1~3ȠI'p::xˆ'iLYiG4IT9@q+*6dBAa -&4oEb D[@x( 0XvKw:C~>T dW>6IE,;rר0@^!q 9lt"41f~2[31_ ,4Ћ2 Tӕ!h;ŗCw%Ktp($8RŽ1Uet7:LDZku"!AlǗ!H ;AI;)Z:Ł3}<3ŏQ=$Cas VHCfhLa/*tzx~lȄ\˽! ,H*\Ȱ_#JHŋ3jȱ#G[ )ңɓ(S\ɲeEaI͛8/,s$9 JB K4ʴiHP["s`UQzkN!ٲKl^nUۆhw-;W,Y{e}?{ܶ/M T,ǎ2V߿1_\ذ烄C 9hI&:5D?+n]{KgVoҺӮq9o5=jf/ g vNz2w^n==;?<6=PCaRy=SW TPAIp= dwGO)HW7SP⊭({(Ȓ"s/V裋Tp+6bsp2EK8^%r\?J&[ax2%G \DYa-2#TPoWPqtK fW׎e!c)x $&UhUxtTRhhN)* jKm'Y}呾?3P@ޙeܓ}*P[r%U]TGX^omzORAg")㶷REj;2Ȏ +7^BjN[u[z4F\=E@cp/p-9nPy(졾c&٢h nS2K[+n̥c_[E5-/e5 ԳnkE׾X/4n3d0섧9al`@VHDhB@z1O'?3[ )2$JV3} Ա*TLۑ]>('ʰ{|Nj"DJV"xPr\HR1.Fςv"{de-Y.RAWиo%"bZ%3)RY ;:24PzM{eG#Dl/zW1ZGAV~y'_t0*ą-od9h uYP ܡAh(# iRH}`Q'Z"wc6W&԰x%`1@)E]LJ &IkVg!K+\ [<2N!(dgP e>It#ȆBdsn^,w"|)N)hGlC[m$2XR64CB% 2q0)2IlNTpā8 Rdb-QErE:ăX8τ^YlPEc>Mo?IƮ=fJ%tay4Gjvr ]@Q/@BJ(%l3jHxi#}> |XDiͣ@(=܂JfLZqE%pi?FE UbԜmڋ[b)\ofRb*W ąRT.1pHRR(E):A0ĵ"WKװVZ0ZR9$RɞE1TKP"Yńq.~nQ(cZYf3ya=Iȶ)eG9e!T@vD!)lkƂk:FHn{㹏;:^5cW䎱%'0)v1cFQW 1:e5Q =LoR>gNxFW~aTBl1-l1eWvcvۏ tٶ΁Jِ H_;H Ulg9%O](Es2lĥjJJT+)B|X7;Uj뮶a!!+];tE~nyym.d7.tD ΪU&8uXT>!<’C2kp0PN REa71{-L-l;'mM{~{E(FT*\pWr0`Ϯn]gs!slb9`yF@ɿ^^C{[{XC{ZAh2CY6tzb4#W`|qMQfD|:S.h>f >|"H.DR s *fA%l'(GBZ{xxRv_3_dNQgt} nv'fA0RucJϔT@Tx20D qF]3~#I5P &~lq ?HD&]30@osy[[GOC D}nDc"I1\B61p&771!='L'?gWLbc."5=$ 3\BcF5H9Y\§YK/£Z&\D]>71IF,r"cX)biE"XQ`YhqtS$AExh`$IshQaWsvug{c"2R,eRGۅ>B 4%1H2qS mҗ.E҂Z5-#b #8(6W~%xRFi#~%M!#VVE.fסk%6"/-Ih7w":c~uYQs]oPBBQ#jjyydb brz=VOh@I$P81@`]T@ +h:E+gCiPς@:#:76+A4s姿S$(s51J}gn᰾ʢn+/6K# HEw[@8+` Fs`'1r$⫪iB Lek&"fUaI&Ge{bfRc⪀cal!ω?::\)QBb;WrKj4[Kw;Xv*zX!Bq3r[` '8[%L E38{sgXS[˫z+%џb$Wxӛ,TlS`{"TX"6,D+k+e߱ v!XZY:`{6 v :]! ,H*\p=x(D 3jȱǏ CIr㯁姉3+ב!߶7['|@\IntfuC]g7Il7JZG=YoH.gOr1ٶ=ʙECzDnoKj3̥[צ03bO8,\Rxx!= :天PxbM G]ՑתN&uRKȢ>-&_Ic&:WS]2w h)p!>@VRDv` PNDH O$H\ErIs $-S\wCJE;ZRH4Z]#G8g)BO$қ&=> ڛŅ1B2htFvFwR8%E DSElEdr" |C9us?Vf0vJQ}9VpHdV+l@ݽ E)HA`0]nfd4sfJKЉIlT& '*#E đ2@:PB񒷒S4Sy+V#4szU ͞Q hDß8!FDm;6YMIξ~ɯtjFtKfs=(L009XLSBbLbՉIXm(Ce d {- ).3Pq\WS$:Q, 浚צڎ~vCNtA IW)OSxNN2ɚ(=MlZb[h>NO>WBPݒTнhCv`wT8}EA]K5H;mLOÉS.y-SS|e.uj[*?>sN nCC̓la.0XLWt;! CwdֈFw9F 2 `Ϻgԫ1WVG8u*L`:*婍q i@Pv7eo V\3]YCj֜Nx]NL ypO̅x;pQ2Cnq} s0&=sLK7Q WAUҊ*2D*Lo Qgw;M;*ql#n}Cr5XܷsB 3Aw4{AU93bP]P ͓JMub{dtO%ɭ}]21H{A>SGBO{agO#PnSw#SoA@p44vE\` piw>GBzQE7'x!+8b S )!=.`# ?P6Hy%_^@mF*$V UnT<`}ƀghYx 4=wRw#LBqnvn.&A _!i)rZLu|chLl}@6}3 nS D]gY%UAWm<ײAu+6A^^6Z cle&0IPVaU3Le9]To.d<`ČՌ~t]Y Q#{`Q3>gs0QQ$Ufc7^7H%Lm:T8~Bl$34H)9 Vb9"Lv\%~+d`.DkNEa!`wwhE,c&&&L 5Pc[q'@*00Wz3%NY7e[04g#N2 Dh4.{iH!e'`L][*wB!E2&{S*&G?j)&r]KRSđ4t u1@ 1(YqUuxCePb&ZQ$()duIZ H1V<9mVwRn PtNh{( :'e$jjoV `sf,Ia$0qKOg)E]#eWw@#2`;D#|Drw)3TZQe!sHb`.$\!gW4ϳ+YT@Y's"~7_A R6YqZ85wvN gָհ҇QS33Eq}XʉpA1СZ G3SxhF,y q$}om6fg-|3ntJ,jEBRup U킑B1't=)9H#C6NR*$ʁvYKՙ. p0B>7ŏb Ą?Չԥ. x;[#lf$8UP @ڑ*B 'Rr>CB+ R U6;Rmqŵ~4Si PP2tRd?F V (RH& }pΠ:함4t6G>;Yv"WX+W[w+ 2 ܣ($LZ?d $-B#vVN/x " w U('P ^+TS7ES,"{pAmRu?Eװ'JUFKSAka$9@"{׭:C X ^!1x.[&O}*vpB7Q~^[eF .7 -腩t+&p1A.t!i]1y<52$qa/Hrmh/JyEs.t|V-ZqUX\(:0s $:=_!E< p$\~щ̮5\*υ tGQoAI>\(E: ;oAK_$!~@脣_Zۙ&9ok^Cd-}wUjJs΃m(y1 VHƹr_$rFP $+Ŝ`3xR. 6Uu.si jojwT\)AR-mr b+QPA].a?ؗ[piN^$r[U!r6.=PLG Ւۿ˹sQ{8@lESGH8紧A#k`m`EJ(yJ>F{ =`YTAkeZ2tKf˼|7/o{]ؚ/꺳(.at\sRoa}MFN[WT~;s7cg%fn(!L1W+SpW+#FP p Ђu!aBHqq \\:A(=erS37xQc@&0WT;9E%.#vVzDyTH/6LS$dI2kVw!PkFx?ovaCXB!SCf+ivK\qb%$P F%A"b_25mW+7j=r V+T@2%q'46"RG;aCr' }I7Ac<CC҄3r!bWe!iGm97Z[f&2d UeR 3(9wr*ck8$b7Ph r73FwJYGp%ch(%0q98UWcV花(JFX4CikTG+].RXf+O76T E&9YRcigRhK]~P'zwhSW@X"3 Xh e@+d." Z/>(Qnv0gs&M-܄0cVĐ!|M*rK1m~_80U2+PSӒsrufE+0?3 9FNC"c*R#CY@chrAܤP iSf`t G Q`mrLO(9M.Ro ^UP% } eY OOTsj3ek"268RqAR>1ɘX7 iR -a _Yi,~ 6id|d2gifU |e[n)EUpwz*4' q&5u7pY%:!iNHE)-' "')a0*l~g~c%tu7D0qQJESXtzQ%hnj`Ts%x%AH;6" ޅT@tGB <\[be6!ʞ#l)![gu@g9q'wg")! ,pH*Lxk`CfȱǏ AS/aɐ(S\0bg/6X'E@=H ]ʴAgiş 7:U!тIUڵY #F$蒪[4+^s ֳxώvI VfթpkX[d3w_LPuj^ĽfM[ÑQ.S@{{M|v`oݻNmFL}:];qK)cx;» l2- LçB=7y޽{yq_,A 6Ql핐4`]a?"_|Ǡ)@=e/[z5 H .хGVMq8MP%TKUs Wy+\8k`&?VfsNLRHj0rdݍ]gHvdQ d &QcSUuw 4)#ziM$I\L)Qt)@#%&p꤂` _~-6W1esW2ݟ/j}^Dl$h}O's妩<m2lfuSd =d0UiפW˷Jht˕3}fM0wQ)?v*Pk /t$>\#LmTЌMm'{@rO`odCt½qM +dd] ꦖ-,'F69^Z QF(3H ҶR)@)WByfu(y> @Ǯ\Mf-ۼZd?zࠒuND~ 2pSpXB3RN8 Gtx$=fyqEYBD jjLiP OiD JD(Q Z AT0FS%s0uY*-22Ħs@]DzR4ETu'4j!!W#2>'YW$9T[ڕPWLI3(pMHRn][dHl)NmTDAQ-8$ύnUE5zVDNk DT' m.‚=ZkRu%ڶY*Lan[' (fʵ 9bUEQ^"miƱ LTBDNxfBLiɼA Zl߻8 Nh*!꺯@8FKO{O1BiFH>rR;jq[u:Po r^I4[ƬqIZM)d yAPN\WFdZBw(';lU `?VVƭj4|WYLDj> ZzT Q`4$ĚA{-bSآF-Q!) uݸ"h<#sWjٛm-~1.:<9A3pʟka4*c]*spS#q6f0 O6W. &Tkaac3J}Q% "ffTHwgu~dI _bPdr!Mpe$l6q2f$tG_E cu5]!5pd;7xeXJdlEA71O~%B\@ =wTV2,mffjVvѧH"EJsk `hIhZ`I8"'.8T=w~!.@|fjkb=xヒQ3)urcr%!A} 凋Ih4:P^eADL'B/aV0kV,VdFo0+o,> \rA}U(~h"Tb`\+f" QI<6XXnen5[:(:]j3[ _w`C QX HA9.aYG%l!S$A=e^l:?c&W=bq,EsD(hJ*wk:9lP21= w]&!!" `o,`/MM|}ʤ4$ RVƓ#z&(g zK ;)]e&b֧ F@pIb&5كkBA0lp@D^_A6@f: i"tZbt45{Q=XT-tT',!ډYemcg ٩GjFJOaIc+QF$.xN"RJdz^bALѵGB*|3 [N6/N!FlhpT m'jðakki@ @l Fe 7.pT~{'( }עf%׉)RR!QUM3yEb 5m&LM])*cȩ\1BȨEsW*tWXUX@_ @!V3l,ۑoTՒVSfh N1cnYTD,(E;C`2؅\m[e1H%[b[2)&sجp*vz2PѬU6ʘ9d0a,7PNj{HC "i#S 6#/YhfIeoީg7 5^Oǝwb`R,4M'>loԯ(Eu<-$pd)Zi c~1K8+k$jЉqu)' Ʈ;hkt!KL \STf Bmeb3j|@'nE:43*N='"d'W ."Ǭ̐XXd۟r vU0PAĔ :)>܁N%L"K4MIdU@.lҚթEuޮ%)"Qƿl"ӹ m r RZ[љ2 sUulLqf1 EWMl o *h?o0V&eN*Ƿ)!RDU8Cghԅy$aжq1Kp =[OؕQ!V5|hN6jJ>WoG3j5?YY0UP jORT",'"'y]BCVquS&n}O2oeAavJ,V9SP 2h`}8VT8C[4HbJx9pSdK&\5eO\a6 3G3lVP5l6HׁAYdG P9776j"oWSv47{Wu4vG$o{KP.D+l7U]Je. X'j((OcxK"~jy_mgU3:da0%YtQoU'CKg<q+Z~Q'\6q2or_s7oUHT#EO jblfkcVZQ0kvPx9QnH8WgΦ` mȏ@u__', 44=g$G*sJB%<ߘv&ZRj\hp ֕marOXp*/|9F-6萪_'_oy{t>C w.=u+Ov`w\yv,rq[v(q 3S'jfEy{'cWq1$G$2`Kו]}8hEEA|UbKUq NhVsIo>JY^1LQUqE!3K_%T])HɒX-1P^qVUBR#9CrIH}7s.&})t9d[dHH2Y& ac.dmt&^JUIIr%H*I^SoNFkd4S4B/,Au\¡%\C4(k $/V[CuIWbhQ,g~钋+%8:O>Y).U'a2dMA)xb5|#XF08dFN2,Ssh3j2Yrzd^S@Ҙʞa&ӝBT+T)I' P?Y-ux z^r:WGL|1ep*B fu8HvBo1x@zEBک @hz9xxn.a *]O*i,ɇT"! 3@xnG1/ Ԁ(@$[@r'K&ӱGʲ92 W8)W,ʰ!! ,pH*\[Ȱŋ3j$/!ō C!D%ٲÑ0cʜI͋)OrΛ@2h(F*Y`SP\JիAJHӈXÊ*aRhInʓ-םib<+Ʃ&ի֖vg… ^\֩{y6~X0Ø /^ݭa}+N  giԃ8PuRJUahݠZuR 0R85:Wb20ZK'i/1M"T҅9D:aaUAqZtM|`w&jp[_2ʈZ)$&pRZ5qeH@%weJThhwN4iwT mD\h B.i!S*(S Hń-THh&ąݩˆD@0ށgYXTV-^(`bҦ($fX .. ^B^ͼElb*+ efc 4ywGJu2b%R9R$IrswHHO ;)T+{rKQ+aKBF0)F"(>Rg/'6wQa #Lɦu1i ]pR iD*4wLGT+TQH lGxn Sp94*uw!"(BJ0<i Rv&ќ 5}IҗaH] QVW I+#%in؅NV7ZVqQN2iƓ9 gSCJ h TR-~<=[4uS`FfyE'Ed=p>mpU_V? .VMAȹHPgKӞNF31W~y`h uaTB'nYT򕗪2^APʬUA\Q a5WERw[nnm-YTÐN HPfl&U p_&pAPBvϱ|-d:r/YY&7IQ??-f d8ћK~T- wsh u]f൉:nVffDhfbAI1pWDs(D, r$ D \^"&b]ԀpCb[Ft <1TQ!o WVT`xUDp 7X.I&֦(mIJŇAh1ec'Y[Bi<A4bx3Rw$$a>i(S8[sC=В]T9@m".Y)xi##1eh@UPnA2Wo <TmoI*M%2EՕi]LAd@ȕ^"4'_kQrW2WI*FY&Tq5bV˘m_UPj[HS.S[86{?Q{pc ň_<eH~gC)0ܭ0XJA` eJJWtSnh SԙБE+H5Zc!d(&̉8E'N%q;b&*catifgCWUvs.Kq_IgCobl)l3 R(1K. JIR_P: K0Ȃ2Xq #,Zg&[ԺƊNTU)›zoL+0zJov6=93X.BNP2la :Y [Ox&TAzI:CIhޜ<$2&t5D_e=.Q+j˟/E\2[qixu9:(Q*iDᢘ7nadM76[&֌} oRiI.mr>ƒTzr.1R9R Hw}z% aIM_`#{E*zQgS(a?Fp`^P D!hs&v_.HRd=}=eIS0S b[E1 a^a"WjycW|¢FT|EI`kPb" Sw PW8E.zgteYFִ)_$8r LK){NhT"Cx=wlLIBh3rw%|^K-J9] (~X#Rp vB^.j~5Mb=95zK.xw` Os P PR pf} 2!s8Zvf@ bT>XpQ3|(05(]x8<_&9`^KF)MHjgRT:((Q(R&?,Diau!XG 0`WU\wY1_(q ^&e\TSzAA,gT ҄ gP^ ;iqA_-QoI(g者tD1"e24)n"U!wxxB_!uWb m$(B$3y1&r " Gs\JX#! X JC)z7!YGr.Qay,9Eei71)Ys9bDO#qљY*! ,P0ppH*Lhk_5Сŋ3j`ǎCy"'g˗0cʜ ÁeϟAzJTΞQN3eѧD JUʁL.RbWyVK]Ѫ=8lեaqzɕn׸`hOm߿~%k)ůՉtchN=s*9lzAFL_Pߺwk2Áu9Ǟ4ɂfMgI<,cZ D@՘y<+ak/@]c.ˎyT-P=ꊲ6*0gO(Z2 ^5^r%=FaeXRmlpP xASL4D)6EVy_YՍU   ċQn<6ij͝dT20+&bZ*uYeiUU9 -$#AZi%VNxŕ;9bbhKD & ,fAi%PRM6ڤSICPb-5lҦ)*F>ZyIZNvDf,qgwNI}ei*W8I]C & ?hd EꗸV`rM)?8k][j U֍+]P^그6 PC^;m•hqU^-ol7m|h_b 1iEF_i`{spU7U6ttS@B6QxxR>&\aY&1P@ )/n)\LA<2@cgK=^1>Suu3@?TPA1 |uJ%P` \hEpLAx/,-1IxDZZ)W"i{3̈]R"$(__ D.N  $M'ŠH&p^hWtA)XHOmLbMN kUT',,o4X$<q*u@('JQ SH 7{]hB WL ~\ l9q^ œMD :3źBE*di5V ^P*JxD&䖑`-nu}X"1`B{^h xN&9KSL + NnN+ܻef+mz?JAY*Ehy[/<$(fj3@VDIUh44ͅx,,!͹]D~A/p ΄ LHOb[T?})p *`Ԙ)!H=T+-A$HQrESԊκY#b@0iE ^Sb{`> 5a bDPMt2st!F- e*\ 8ʪWUvD=@%[y[s}€C hGb?Ƞf"ʀ 䨑qiQN?0ΐrC=DLda@FԖ ^sܣ MogBl7$Xs,*'-\H~6CFU.!];B ϭg Vd6ztaw3T(@/-cRZ5 d?Pk DtGwBC3.L74XO&ZN+NpT < 7G4pB *Sd8IILV\ryeW\ nk{JXҳJ4 D&[tmo;-lh8CЄ x^NLQD6 -X4zrRʳuuE]pΛdm]i8EL@&W q.ԝ[S{xU V!*jg]#kݯ2B i;Etty#4TևBKWuZQ`(- $H; J}ŁA~"/PAHج`{IHr]rp2s'_AjB #с@g8[EqRD@$R,&5h@~U-4+-4U&Ћ:d^m '*DWQ 1TUW-/ԦRUbą[.\CC1`1@MtpKaN !@V (5eTI4n[-j6l|,ӸXleR{MK\AAR:@St)h_QC=u1d` 6` Q ]غDc[b\)x ehXTRO@FZlB1)/qSxS>\Z+$\Y\'NaOa-ĺè$Dg|?Q5d/]@2#KD&^s VPdRc4Ԙ֐Le _ E|-5p39`\ $H?Not!Zs9mIKPlsvkB tHХAV\PhtP8F"ơ)Y-`Kz[֕E^?&^g @tDGA +7ev/9[aFc# `793ri L\|]_1ke2g܈?ƭ[p;2Mxzӵ.gn;PvxD%y`EVf+`On.^lizn υ4F 6u'P La,żp3ft^!Loc#Ē="ps88}2.**tY~OA{jkrO7%V[sRa]S࿑$]&1e@\%} \title{Objects exported from other packages} \keyword{internal} \description{ These objects are imported from other packages. Follow the links below to see their documentation. \describe{ \item{magrittr}{\code{\link[magrittr:pipe]{\%>\%}}} }} tweenr/man/gen_along.Rd0000644000176200001440000000317514067576055014576 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/gen_along.R \name{gen_along} \alias{gen_along} \title{Generator for tweening along a variable} \usage{ gen_along( .data, ease, along, id = NULL, range = NULL, history = TRUE, keep_last = FALSE ) } \arguments{ \item{.data}{A data.frame with components at different stages} \item{ease}{The easing function to use. Either a single string or one for each column in the data set.} \item{along}{The "time" point for each row} \item{id}{An unquoted expression giving the component id for each row. Will be evaluated in the context of \code{.data} so can refer to a column from that} \item{range}{The range of time points to include in the tween. If \code{NULL} it will use the range of \code{time}} \item{history}{Should earlier datapoints be kept in subsequent frames} \item{keep_last}{Should the last point of each id be kept beyond its time} } \value{ An \code{along_generator} object } \description{ This is a generator version of \code{\link[=tween_along]{tween_along()}}. It returns a generator that can be used with \code{\link[=get_frame]{get_frame()}} and \code{\link[=get_raw_frames]{get_raw_frames()}} to extract frames for a specific time point scaled between 0 and 1. } \examples{ # Default behaviour gen <- gen_along(airquality, ease = "linear", along = Day, id = Month) get_frame(gen, 0.22) # Overwrite keep_last or history in get_frame get_frame(gen, 0.67, history = FALSE) } \seealso{ Other Other generators: \code{\link{gen_at}()}, \code{\link{gen_components}()}, \code{\link{gen_events}()}, \code{\link{gen_keyframe}()} } \concept{Other generators} tweenr/man/prepare_keyframes.Rd0000644000176200001440000000064214102474265016333 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/gen_keyframe.R \name{prepare_keyframes} \alias{prepare_keyframes} \title{Prepare keyframes for generator} \usage{ prepare_keyframes(.data, keyframe) } \arguments{ \item{.data}{A keyframe generator} \item{keyframe}{A keyframe to add} } \value{ A valid keyframe generator } \description{ Prepare keyframes for generator } \keyword{internal} tweenr/man/gen_components.Rd0000644000176200001440000000506014276677372015664 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/gen_components.R \name{gen_components} \alias{gen_components} \title{Generator for tweening components separately from each other} \usage{ gen_components( .data, ease, nframes, time, id = NULL, range = NULL, enter = NULL, exit = NULL, enter_length = 0, exit_length = 0 ) } \arguments{ \item{.data}{A data.frame with components at different stages} \item{ease}{The easing function to use. Either a single string or one for each column in the data set.} \item{nframes}{The number of frames to calculate for the tween} \item{time}{An unquoted expression giving the timepoint for the different stages of the components. Will be evaluated in the context of \code{.data} so can refer to a column from that} \item{id}{An unquoted expression giving the component id for each row. Will be evaluated in the context of \code{.data} so can refer to a column from that} \item{range}{The range of time points to include in the tween. If \code{NULL} it will use the range of \code{time}} \item{enter, exit}{functions that calculate a start state for new observations that appear in \code{to} or an end state for observations that are not present in \code{to}. If \code{NULL} the new/old observations will not be part of the tween. The function gets a data.frame with either the start state of the exiting observations, or the end state of the entering observations and must return a modified version of that data.frame. See the \emph{Match, Enter, and Exit} section for more information.} \item{enter_length, exit_length}{The lenght of the opening and closing transitions if \code{enter} and/or \code{exit} is given. Measured in the same units as \code{time}} } \value{ A \code{component_generator} object } \description{ This is a generator versions of \code{\link[=tween_components]{tween_components()}}. It returns a generator that can be used with \code{\link[=get_frame]{get_frame()}} and \code{\link[=get_raw_frames]{get_raw_frames()}} to extract frames for a specific time point scaled between 0 and 1. } \examples{ from_zero <- function(x) {x$x <- 0; x} data <- data.frame( x = c(1, 2, 2, 1, 2, 2), y = c(1, 2, 2, 2, 1, 1), time = c(1, 4, 8, 4, 8, 10), id = c(1, 1, 1, 2, 2, 2) ) gen <- gen_components(data, 'cubic-in-out', time = time, id = id, enter = from_zero, enter_length = 4) get_frame(gen, 0.3) } \seealso{ Other Other generators: \code{\link{gen_along}()}, \code{\link{gen_at}()}, \code{\link{gen_events}()}, \code{\link{gen_keyframe}()} } \concept{Other generators} tweenr/man/vec_tween_class.Rd0000644000176200001440000000046014276701255015775 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/aaa.R \name{vec_tween_class} \alias{vec_tween_class} \title{Get the nominal class of a vector} \usage{ vec_tween_class(x) } \arguments{ \item{x}{a vector} } \description{ Get the nominal class of a vector } \keyword{internal} tweenr/man/tween_state.Rd0000644000176200001440000001244614276677372015176 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween_state.R \name{tween_state} \alias{tween_state} \alias{keep_state} \alias{open_state} \alias{close_state} \title{Compose tweening between states} \usage{ tween_state(.data, to, ease, nframes, id = NULL, enter = NULL, exit = NULL) keep_state(.data, nframes) open_state(.data, ease, nframes, enter) close_state(.data, ease, nframes, exit) } \arguments{ \item{.data}{A data.frame to start from. If \code{.data} is the result of a prior tween, only the last frame will be used for the tween. The new tween will then be added to the prior tween} \item{to}{A data.frame to end at. It must contain the same columns as .data (exluding \code{.frame})} \item{ease}{The easing function to use. Either a single string or one for each column in the data set.} \item{nframes}{The number of frames to calculate for the tween} \item{id}{The column to match observations on. If \code{NULL} observations will be matched by position. See the \emph{Match, Enter, and Exit} section for more information.} \item{enter, exit}{functions that calculate a start state for new observations that appear in \code{to} or an end state for observations that are not present in \code{to}. If \code{NULL} the new/old observations will not be part of the tween. The function gets a data.frame with either the start state of the exiting observations, or the end state of the entering observations and must return a modified version of that data.frame. See the \emph{Match, Enter, and Exit} section for more information.} } \value{ A data.frame containing all the intermediary states in the tween, each state will be enumerated by the \code{.frame} column } \description{ The \code{tween_state()} is a counterpart to \code{tween_states()} that is aimed at letting you gradually build up a scene by composing state changes one by one. This setup lets you take more control over each state change and allows you to work with datasets with uneven number of rows, flexibly specifying what should happen with entering and exiting data. \code{keep_state()} is a simple helper for letting you pause at a state. \code{open_state()} is a shortcut from tweening from an empty dataset with a given \code{enter()} function while \code{close_state()} is the same but will instead tween into an empty dataset with a given \code{exit()} function. } \section{Match, Enter, and Exit}{ When there are discrepancies between the two states to tweeen between you need a way to resolve the discrepancy before calculating the intermediary states. With discrepancies we mean that some data points are present in the start state and not in the end state, and/or some are present in the end state but not in the start state. A simple example is that the start state contains 100 rows and the end state contains 70. There are 30 missing rows that we need to do something about before we can calculate the tween. \strong{Making pairs} The first question to answer is "How do we know which observations are disappearing (\emph{exiting}) and/or appearing (\emph{entering})?". This is done with the \code{id} argument which should give a column name to match rows between the two states on. If \code{id = NULL} the rows will be matched by position (in the above example the last 30 rows in the start state will be entering). The \code{id} column must only contain unique values in order to work. \strong{Making up states} Once the rows in each state has been paired you'll end up with three sets of data. One containing rows that is present in both the start and end state, one containing rows only present in the start state, and one only containing rows present in the end state. The first group is easy - here you just tween between each rows - but for the other two we'll need some state to start or end the tween with. This is really the purpose of the \code{enter} and \code{exit} functions. They take a data frame containing the subset of data that has not been matched and must return a new data frame giving the state that these rows must be tweened from/into. A simple example could be an \code{enter} function that sets the variable giving the opacity in the plot to 0 - this will make the new points fade into view during the transition. \strong{Ignoring discrepancies} The default values for \code{enter} and \code{exit} is \code{NULL}. This value indicate that non-matching rows should simply be ignored for the transition and simply appear in the last frame of the tween. This is the default. } \examples{ data1 <- data.frame( x = 1:20, y = 0, colour = 'forestgreen', stringsAsFactors = FALSE ) data2 <- data1 data2$x <- 20:1 data2$y <- 1 data <- data1 \%>\% tween_state(data2, 'linear', 50) \%>\% keep_state(20) \%>\% tween_state(data1, 'bounce-out', 50) # Using enter and exit (made up numbers) df1 <- data.frame( country = c('Denmark', 'Sweden', 'Norway'), population = c(5e6, 10e6, 3.5e6) ) df2 <- data.frame( country = c('Denmark', 'Sweden', 'Norway', 'Finland'), population = c(6e6, 10.5e6, 4e6, 3e6) ) df3 <- data.frame( country = c('Denmark', 'Norway'), population = c(10e6, 6e6) ) to_zero <- function(x) { x$population <- 0 x } pop_devel <- df1 \%>\% tween_state(df2, 'cubic-in-out', 50, id = country, enter = to_zero) \%>\% tween_state(df3, 'cubic-in-out', 50, id = country, enter = to_zero, exit = to_zero) } tweenr/man/tween_elements.Rd0000644000176200001440000000366414067576055015666 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween_elements.R \name{tween_elements} \alias{tween_elements} \title{Create frames based on individual element states} \usage{ tween_elements(data, time, group, ease, timerange, nframes) } \arguments{ \item{data}{A data.frame consisting at least of a column giving the observation id, a column giving timepoints for each state and a column giving the easing to apply when transitioning away from the state.} \item{time}{The name of the column holding timepoints} \item{group}{The name of the column holding the observation id} \item{ease}{The name of the column holding the easing function name} \item{timerange}{The range of time to span. If missing it will default to \code{range(data[[time]])}} \item{nframes}{The number of frames to generate. If missing it will default to \code{ceiling(diff(timerange) + 1)} (At least one frame for each individual timepoint)} } \value{ A data.frame with the same columns as \code{data} except for the group and ease columns, but replicated \code{nframes} times. Two additional columns called \code{.frame} and \code{.group} will be added giving the frame number and observation id for each row. } \description{ This function creates tweens for each observation individually, in cases where the data doesn't pass through collective states but consists of fully independent transitions. Each observation is identified by an id and each state must have a time associated with it. } \examples{ data <- data.frame( x = c(1, 2, 2, 1, 2, 2), y = c(1, 2, 2, 2, 1, 1), time = c(1, 4, 10, 4, 8, 10), group = c(1, 1, 1, 2, 2, 2), ease = rep('cubic-in-out', 6) ) data <- tween_elements(data, 'time', 'group', 'ease', nframes = 100) } \seealso{ Other data.frame tween: \code{\link{tween_along}()}, \code{\link{tween_appear}()}, \code{\link{tween_components}()}, \code{\link{tween_events}()}, \code{\link{tween_states}()} } \concept{data.frame tween} tweenr/man/get_frame.Rd0000644000176200001440000000230514067576055014570 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/get_frame.R \name{get_frame} \alias{get_frame} \alias{get_raw_frames} \title{Extract a frame from a generator} \usage{ get_frame(generator, at, ...) get_raw_frames(generator, at, before = 0, after = 0, ...) } \arguments{ \item{generator}{A \code{frame_generator} object} \item{at}{A scalar numeric between 0 and 1} \item{...}{Arguments passed on to methods} \item{before, after}{Scalar numerics that define the time before and after \code{at} to search for raw data} } \description{ Using the generators in tweenr you can avoid calculating all needed frames up front, which can be prohibitive in memory. With a generator you can use \code{get_frame()} to extract any frame at a fractional location between 0 and 1 one by one as you need them. You can further get all raw data before and/or after a given point in time using \code{get_raw_frames()}. } \examples{ data <- data.frame( x = c(1, 2, 2, 1, 2, 2), y = c(1, 2, 2, 2, 1, 1), time = c(1, 4, 8, 4, 8, 10), id = c(1, 1, 1, 2, 2, 2) ) gen <- gen_components(data, 'cubic-in-out', time = time, id = id) get_frame(gen, 0.3) get_raw_frames(gen, 0.5, before = 0.5, after = 0.2) } tweenr/man/display_ease.Rd0000644000176200001440000000341214067576055015301 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/display_ease.R \name{display_ease} \alias{display_ease} \title{Display an easing function} \usage{ display_ease(ease) } \arguments{ \item{ease}{The name of the easing function to display (see details)} } \value{ This function is called for its side effects } \description{ This simple helper lets you explore how the different easing functions govern the interpolation of data. } \details{ How transitions proceed between states are defined by an easing function. The easing function converts the parameterized progression from one state to the next to a new number between 0 and 1. \code{linear} easing is equivalent to an identity function that returns the input unchanged. In addition there are a range of additional easers available, each with three modifiers. \strong{Easing modifiers:} \describe{ \item{-in}{The easing function is applied as-is} \item{-out}{The easing function is applied in reverse} \item{-in-out}{The first half of the transition it is applied as-is, while in the last half it is reversed} } \strong{Easing functions} \describe{ \item{quadratic}{Models a power-of-2 function} \item{cubic}{Models a power-of-3 function} \item{quartic}{Models a power-of-4 function} \item{quintic}{Models a power-of-5 function} \item{sine}{Models a sine function} \item{circular}{Models a pi/2 circle arc} \item{exponential}{Models an exponential function} \item{elastic}{Models an elastic release of energy} \item{back}{Models a pullback and relase} \item{bounce}{Models the bouncing of a ball} } In addition to this function a good animated explanation can be found \href{https://easings.net}{here}. } \examples{ # The default - identity display_ease('linear') # A more fancy easer display_ease('elastic-in') } tweenr/man/tween_at.Rd0000644000176200001440000000200114067576055014436 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween_at.R \name{tween_at} \alias{tween_at} \title{Get a specific position between two states} \usage{ tween_at(from, to, at, ease) } \arguments{ \item{from, to}{A data.frame or vector of the same type. If either is of length/nrow 1 it will get repeated to match the length of the other} \item{at}{A numeric between 0 and 1 recycled to match the nrow/length of \code{from}} \item{ease}{A character vector giving valid easing functions. Recycled to match the ncol of \code{from}} } \value{ If \code{from}/\code{to} is a data.frame then a data.frame with the same columns. If \code{from}/\code{to} is a vector then a vector. } \description{ This tween allows you to query a specific postion between two states rather than generate evenly spaced states. It can work with either data.frames or single vectors and each row/element can have its own position and easing. } \examples{ tween_at(mtcars[1:6, ], mtcars[6:1, ], runif(6), 'cubic-in-out') } tweenr/DESCRIPTION0000644000176200001440000000227414305577002013274 0ustar liggesusersPackage: tweenr Type: Package Title: Interpolate Data for Smooth Animations Version: 2.0.2 Authors@R: c(person(given = "Thomas Lin", family = "Pedersen", role = c("aut", "cre"), email = "thomasp85@gmail.com", comment = c(ORCID = "0000-0002-5147-4711"))) Maintainer: Thomas Lin Pedersen Description: In order to create smooth animation between states of data, tweening is necessary. This package provides a range of functions for creating tweened data that can be used as basis for animation. Furthermore it adds a number of vectorized interpolaters for common R data types such as numeric, date and colour. URL: https://github.com/thomasp85/tweenr BugReports: https://github.com/thomasp85/tweenr/issues License: MIT + file LICENSE Encoding: UTF-8 Depends: R (>= 3.2.0) Imports: farver, magrittr, rlang, vctrs LinkingTo: cpp11 (>= 0.4.2) RoxygenNote: 7.2.1 Suggests: testthat, covr SystemRequirements: C++11 NeedsCompilation: yes Packaged: 2022-09-06 07:43:28 UTC; thomas Author: Thomas Lin Pedersen [aut, cre] () Repository: CRAN Date/Publication: 2022-09-06 08:00:02 UTC tweenr/tests/0000755000176200001440000000000014147724140012724 5ustar liggesuserstweenr/tests/testthat/0000755000176200001440000000000014305577002014563 5ustar liggesuserstweenr/tests/testthat/test-components.R0000644000176200001440000000335314067576055020070 0ustar liggesuserscontext("components") df <- data.frame( x = c(1, 5, 7, 10), y = c(4, 3, 7, -1), col = c('black', 'red', 'green', 'blue'), type = letters[1:4], stringsAsFactors = FALSE ) test_that("tween_components works", { tween <- tween_components(df, 'linear', nframes = 10, time = c(1, 7, 13, 20)) expect_equal(nrow(tween), 10) expect_equal(tween$x[6], 19/3) expect_equal(tween$col[2], '#52170B') expect_equal(max(tween$.frame), 10) expect_true(all(tween$.phase[c(1,4,7,10)] == 'raw')) expect_true(all(tween$.phase[-c(1,4,7,10)] == 'transition')) tween <- tween_components(df, 'linear', nframes = 10, time = c(1, 7, 13, 20), rep(c(1,2), 2)) expect_equal(nrow(tween), 14) expect_equal(tween$x[12], 25/3) expect_equal(tween$col[2], '#162A10') expect_equal(max(tween$.frame), 10) expect_true(all(tween$.phase[c(1,5,10,14)] == 'raw')) expect_true(all(tween$.phase[-c(1,5,10,14)] == 'transition')) }) test_that("enter/exit works", { tween <- tween_components(df, 'linear', nframes = 20, time = c(1, 7, 13, 20), enter = function(df) { df$x <- 0 df$col <- 'red' df }, enter_length = 3) expect_equal(nrow(tween), 20) expect_equal(tween$x[3], 2/3, tolerance = 1e-7) expect_equal(tween$col[2], '#A51B0B') expect_equal(max(tween$.frame), 20) expect_true(all(tween$.phase[1:3] == 'enter')) }) test_that("weird input gets caught", { tween <- tween_components(df, 'linear', nframes = 0, time = c(1, 7, 13, 20)) expect_equal(nrow(tween), 0) tween <- tween_components(df[integer(), ], 'linear', nframes = 10, time = numeric()) expect_equal(nrow(tween), 0) expect_error(tween_components(df, 'linear', nframes = 10, time = 1)) expect_error(tween_components(df, 'linear', nframes = 0, time = c(1, 7, 13, 20), id = 1)) }) tweenr/tests/testthat/test-fill.R0000644000176200001440000000107514067576055016630 0ustar liggesuserscontext("fill") df <- data.frame( x = c(1, NA, NA, NA, 6, 4, NA, NA, NA, NA, 20), type = c('a', NA, NA, NA, 'b', 'c', NA, NA, NA, NA, 'd'), col = c('red', NA, NA, NA, 'blue', 'green', NA, NA, NA, NA, 'black'), stringsAsFactors = FALSE ) test_that("tween_fill works", { tween <- tween_fill(df, 'linear') expect_equal(dim(df), dim(tween)) expect_equal(tween$x[3], 3.5) expect_equal(tween$col[10], '#183112') expect_equal(tween_fill(df$col, 'linear'), tween$col) tween <- tween_fill(df[-c(1, 11), 1], 'linear') expect_equal(tween, df$x[-c(1, 11)]) }) tweenr/tests/testthat/test-at.R0000644000176200001440000000223614067576055016306 0ustar liggesuserscontext("at") df1 <- data.frame(x = 1:2, y = 4:5, col = 'black', type = letters[1:2], stringsAsFactors = FALSE) df2 <- data.frame(x = 11:12, y = 14:15, col = 'white', type = letters[1], stringsAsFactors = FALSE) test_that("tween_at works", { tween <- tween_at(df1, df2, 0.5, 'linear') expect_equal(nrow(tween), 2) expect_named(tween, names(df1)) expect_equal(tween$x, c(6, 7)) expect_equal(tween$col[1], '#777777') }) test_that("tween_at handles weird input", { tween <- tween_at(df1, df2[1,], 0.5, 'linear') expect_equal(nrow(tween), 2) tween <- tween_at(df1[1,], df2, 0.5, 'linear') expect_equal(nrow(tween), 2) tween <- tween_at(df1, df2[integer(),], 0.5, 'linear') expect_equal(nrow(tween), 0) tween <- tween_at(df1[integer(),], df2, 0.5, 'linear') expect_equal(nrow(tween), 0) expect_error(tween_at(df1[c(1,2,1), ], df2, 0.5, 'linear')) expect_error(tween_at(df1, df2, numeric(), 'linear')) expect_error(tween_at(df1, df2, 0.5, character())) }) test_that('tween_at works with vectors', { tween <- tween_at(df1$x, df2$x, 0.5, 'linear') expect_is(tween, 'numeric') expect_equal(tween, c(6,7)) expect_error(tween_at(df1$x, df2$col)) }) tweenr/tests/testthat/test-along.R0000644000176200001440000000166514067576055017007 0ustar liggesuserscontext("along") df <- data.frame( x = c(1, 5, 7, 10), y = c(4, 3, 7, -1), col = c('black', 'red', 'green', 'blue'), type = letters[1:4], stringsAsFactors = FALSE ) test_that("tween_along works", { tween <- tween_along(df, ease = 'linear', nframes = 10, along = x) expect_equal(nrow(tween), 30) expect_equal(tween$col[22], '#78B785') expect_equal(tween$y[8], 3.25) tween <- tween_along(df, ease = 'linear', nframes = 10, along = x, history = FALSE) expect_equal(nrow(tween), 9) expect_equal(tween$col[8], '#78B785') expect_equal(tween$y[2], 3.75) }) test_that("tween_along throws errors", { expect_error(tween_along(df, ease = 'linear', nframes = 10, along = 1)) expect_error(tween_along(df, ease = 'linear', nframes = 10, along = x, id = 1)) expect_error(tween_along(df, ease = 'linear', nframes = 10, along = x, range = c(0, 0))) expect_error(tween_along(df[1,], ease = 'linear', nframes = 10, along = x)) }) tweenr/tests/testthat/test-events.R0000644000176200001440000000213314067576055017202 0ustar liggesuserscontext("events") df <- data.frame( x = c(1, 5, 7, 10), y = c(4, 3, 7, -1), col = c('black', 'red', 'green', 'blue'), type = letters[1:4], stringsAsFactors = FALSE ) test_that("tween_events works", { tween <- tween_events(df, 'linear', 20, x, x + 2) expect_equal(nrow(tween), 17) expect_equal(max(tween$.frame), 20) expect_true(all(tween$.phase[c(4, 8, 13, 17)] == 'raw')) expect_true(all(tween$.phase[-c(4, 8, 13, 17)] == 'static')) tween <- tween_events(df, 'linear', 20, x, enter = function(df) { df$x <- 0 df$col <- 'red' df }, enter_length = 3) expect_equal(nrow(tween), 23) expect_equal(max(tween$.frame), 20) expect_true(all(tween$.phase[c(6, 13, 17, 23)] == 'raw')) expect_true(all(tween$.phase[-c(6, 13, 17, 23)] == 'enter')) expect_equal(tween$x[2], 0.2) expect_equal(tween$col[3], '#931B0B') }) test_that("weird input gets handled", { expect_error(tween_events(df, 'linear', 20)) tween <- tween_events(df, 'linear', 0, x) expect_equal(nrow(tween), 0) tween <- tween_events(df[integer(), ], 'linear', 10, x) expect_equal(nrow(tween), 0) }) tweenr/tests/testthat/test-state.R0000644000176200001440000000224314067576055017020 0ustar liggesuserscontext("state") df1 <- data.frame(x = 1:2, y = 4:5, col = 'black', type = letters[1:2], stringsAsFactors = FALSE) df2 <- data.frame(x = 11:12, y = 14:15, col = 'white', type = letters[1], stringsAsFactors = FALSE) test_that("tween_state works", { tween <- tween_state(df1, df2, ease = 'linear', nframes = 5) expect_equal(max(tween$.frame), 5) expect_true(all(tween$.phase[c(1:2, 9:10)] == 'raw')) expect_true(all(tween$.phase[c(3:8)] == 'transition')) expect_true(all(tween$.id == rep(1:2, 5))) expect_equal(tween$col[5], '#777777') expect_equal(tween$x[7], 8.5) expect_equal(tween$type[4:5], c('b', 'a')) }) test_that("keep_state works", { expect_warning( keep <- keep_state(df1, 5), NA ) expect_equal(max(keep$.frame), 5) expect_true(all(keep$.phase[c(9:10)] == 'raw')) expect_true(all(keep$.phase[c(1:8)] == 'static')) }) test_that("enter/exit works", { tween <- tween_state(df1, df2[1,, drop = FALSE], 'linear', 5, exit = function(df) { df$x <- 0 df$col <- 'red' df }) expect_equal(nrow(tween), 9) expect_true(all(tween$.phase[c(4,6,8)] == 'exit')) expect_equal(tween$col[8], '#BB1909') expect_equal(tween$x[8], 0.5) }) tweenr/tests/testthat.R0000644000176200001440000000007014067576055014717 0ustar liggesuserslibrary(testthat) library(tweenr) test_check("tweenr") tweenr/src/0000755000176200001440000000000014305575040012350 5ustar liggesuserstweenr/src/at.cpp0000644000176200001440000000537714276676722013514 0ustar liggesusers#include #include #include #include #include #include #include "utils.h" [[cpp11::register]] cpp11::doubles numeric_at_interpolator(cpp11::doubles from, cpp11::doubles to, cpp11::doubles at, cpp11::strings ease) { R_xlen_t n = from.size(); std::string easer = ease[0]; cpp11::writable::doubles res(n); for (R_xlen_t i = 0; i < n; ++i) { double pos = ease_pos(at[i], easer); res[i] = from[i] + (to[i] - from[i]) * pos; } return res; } [[cpp11::register]] cpp11::doubles_matrix<> colour_at_interpolator(cpp11::doubles_matrix<> from, cpp11::doubles_matrix<> to, cpp11::doubles at, cpp11::strings ease) { R_xlen_t n = from.nrow(), m = from.ncol(); std::string easer = ease[0]; cpp11::writable::doubles_matrix<> res(n, m); for (R_xlen_t i = 0; i < n; ++i) { double pos = ease_pos(at[i], easer); for (R_xlen_t j = 0; j < m; ++j) { res(i, j) = from(i, j) + (to(i, j) - from(i, j)) * pos; } } return res; } [[cpp11::register]] cpp11::strings constant_at_interpolator(cpp11::strings from, cpp11::strings to, cpp11::doubles at, cpp11::strings ease) { R_xlen_t n = from.size(); std::string easer = ease[0]; cpp11::writable::strings res(n); for (R_xlen_t i = 0; i < n; ++i) { double pos = ease_pos(at[i], easer); res[i] = pos < 0.5 ? from[i] : to[i]; } return res; } [[cpp11::register]] cpp11::list list_at_interpolator(cpp11::list from, cpp11::list to, cpp11::doubles at, cpp11::strings ease) { R_xlen_t n = from.size(); std::string easer = ease[0]; cpp11::writable::list res(n); for (R_xlen_t i = 0; i < n; ++i) { double pos = ease_pos(at[i], easer); res[i] = pos < 0.5 ? from[i] : to[i]; } return res; } [[cpp11::register]] cpp11::list numlist_at_interpolator(cpp11::list_of from, cpp11::list_of to, cpp11::doubles at, cpp11::strings ease) { R_xlen_t n = from.size(); std::string easer = ease[0]; cpp11::writable::list res(n); for (R_xlen_t i = 0; i < n; ++i) { cpp11::doubles state_from_vec = from[i]; cpp11::doubles state_to_vec = to[i]; state_from_vec = align_num_elem(state_from_vec, state_to_vec); state_to_vec = align_num_elem(state_to_vec, state_from_vec); double pos = ease_pos(at[i], easer); cpp11::writable::doubles state_vec(state_from_vec.size()); for (R_xlen_t i = 0; i < state_from_vec.size(); ++i) { state_vec[i] = state_from_vec[i] + pos * (state_to_vec[i] - state_from_vec[i]); } res[i] = state_vec; } return res; } tweenr/src/element.cpp0000644000176200001440000002116614276676722014533 0ustar liggesusers#include #include #include #include #include #include #include #include "utils.h" using namespace cpp11::literals; [[cpp11::register]] cpp11::writable::data_frame numeric_element_interpolator(cpp11::doubles data, cpp11::integers group, cpp11::integers frame, cpp11::strings ease) { cpp11::writable::doubles tweendata; cpp11::writable::integers tweengroup; cpp11::writable::integers tweenframe; int current_group = group[0]; R_xlen_t i; for (i = 1; i < data.size(); ++i) { if (current_group == group[i]) { int nframes = frame[i] - frame[i-1]; std::vector ease_points = ease_seq(ease[i-1], nframes); for (size_t j = 0; j < ease_points.size(); ++j) { tweendata.push_back(data[i - 1] + ease_points[j] * (data[i] - data[i - 1])); tweengroup.push_back(current_group); tweenframe.push_back(j + frame[i-1]); } } else { tweendata.push_back(data[i - 1]); tweengroup.push_back(current_group); tweenframe.push_back(frame[i-1]); current_group = group[i]; } } tweendata.push_back(data[i - 1]); tweengroup.push_back(current_group); tweenframe.push_back(frame[i-1]); return cpp11::writable::data_frame({ "data"_nm = tweendata, "group"_nm = tweengroup, "frame"_nm = tweenframe }); } [[cpp11::register]] cpp11::writable::data_frame colour_element_interpolator(cpp11::doubles_matrix<> data, cpp11::integers group, cpp11::integers frame, cpp11::strings ease) { cpp11::writable::doubles tweendata1; cpp11::writable::doubles tweendata2; cpp11::writable::doubles tweendata3; cpp11::writable::doubles tweendata4; cpp11::writable::integers tweengroup; cpp11::writable::integers tweenframe; int current_group = group[0]; R_xlen_t i; for (i = 1; i < data.nrow(); ++i) { if (current_group == group[i]) { int nframes = frame[i] - frame[i-1]; std::vector ease_points = ease_seq(ease[i-1], nframes); for (size_t j = 0; j < ease_points.size(); ++j) { tweendata1.push_back(data(i - 1, 0) + ease_points[j] * (data(i, 0) - data(i - 1, 0))); tweendata2.push_back(data(i - 1, 1) + ease_points[j] * (data(i, 1) - data(i - 1, 1))); tweendata3.push_back(data(i - 1, 2) + ease_points[j] * (data(i, 2) - data(i - 1, 2))); tweendata4.push_back(data(i - 1, 3) + ease_points[j] * (data(i, 3) - data(i - 1, 3))); tweengroup.push_back(current_group); tweenframe.push_back(j + frame[i-1]); } } else { tweendata1.push_back(data(i - 1, 0)); tweendata2.push_back(data(i - 1, 1)); tweendata3.push_back(data(i - 1, 2)); tweendata4.push_back(data(i - 1, 3)); tweengroup.push_back(current_group); tweenframe.push_back(frame[i-1]); current_group = group[i]; } } tweendata1.push_back(data(i - 1, 0)); tweendata2.push_back(data(i - 1, 1)); tweendata3.push_back(data(i - 1, 2)); tweendata4.push_back(data(i - 1, 3)); tweengroup.push_back(current_group); tweenframe.push_back(frame[i-1]); return cpp11::writable::data_frame({ "data1"_nm = tweendata1, "data2"_nm = tweendata2, "data3"_nm = tweendata3, "data4"_nm = tweendata4, "group"_nm = tweengroup, "frame"_nm = tweenframe }); } [[cpp11::register]] cpp11::writable::data_frame constant_element_interpolator(cpp11::strings data, cpp11::integers group, cpp11::integers frame, cpp11::strings ease) { cpp11::writable::strings tweendata; cpp11::writable::integers tweengroup; cpp11::writable::integers tweenframe; int current_group = group[0]; R_xlen_t i; for (i = 1; i < data.size(); ++i) { if (current_group == group[i]) { int nframes = frame[i] - frame[i-1]; std::vector ease_points = ease_seq(ease[i-1], nframes); for (size_t j = 0; j < ease_points.size(); ++j) { if (ease_points[j] < 0.5) { tweendata.push_back(data[i - 1]); } else { tweendata.push_back(data[i]); } tweengroup.push_back(current_group); tweenframe.push_back(j + frame[i-1]); } } else { tweendata.push_back(data[i - 1]); tweengroup.push_back(current_group); tweenframe.push_back(frame[i-1]); current_group = group[i]; } } tweendata.push_back(data[i - 1]); tweengroup.push_back(current_group); tweenframe.push_back(frame[i-1]); return cpp11::writable::data_frame({ "data"_nm = tweendata, "group"_nm = tweengroup, "frame"_nm = tweenframe }); } [[cpp11::register]] cpp11::writable::data_frame list_element_interpolator(cpp11::list data, cpp11::integers group, cpp11::integers frame, cpp11::strings ease) { cpp11::writable::list tweendata; cpp11::writable::integers tweengroup; cpp11::writable::integers tweenframe; int current_group = group[0]; R_xlen_t i; for (i = 1; i < data.size(); ++i) { if (current_group == group[i]) { int nframes = frame[i] - frame[i-1]; std::vector ease_points = ease_seq(ease[i-1], nframes); for (size_t j = 0; j < ease_points.size(); ++j) { if (ease_points[j] < 0.5) { tweendata.push_back(data[i - 1]); } else { tweendata.push_back(data[i]); } tweengroup.push_back(current_group); tweenframe.push_back(j + frame[i-1]); } } else { tweendata.push_back(data[i - 1]); tweengroup.push_back(current_group); tweenframe.push_back(frame[i-1]); current_group = group[i]; } } tweendata.push_back(data[i - 1]); tweengroup.push_back(current_group); tweenframe.push_back(frame[i-1]); return cpp11::writable::data_frame({ "data"_nm = tweendata, "group"_nm = tweengroup, "frame"_nm = tweenframe }); } [[cpp11::register]] cpp11::writable::data_frame numlist_element_interpolator(cpp11::list_of data, cpp11::integers group, cpp11::integers frame, cpp11::strings ease) { cpp11::writable::list tweendata; cpp11::writable::integers tweengroup; cpp11::writable::integers tweenframe; int current_group = group[0]; R_xlen_t i; for (i = 1; i < data.size(); ++i) { if (current_group == group[i]) { int nframes = frame[i] - frame[i-1]; std::vector ease_points = ease_seq(ease[i-1], nframes); cpp11::doubles state_from_vec = data[i - 1]; cpp11::doubles state_to_vec = data[i]; state_from_vec = align_num_elem(state_from_vec, state_to_vec); state_to_vec = align_num_elem(state_to_vec, state_from_vec); for (size_t j = 0; j < ease_points.size(); ++j) { cpp11::writable::doubles state_vec(state_from_vec.size()); for (R_xlen_t k = 0; k < state_from_vec.size(); ++k) { state_vec[k] = state_from_vec[k] + ease_points[j] * (state_to_vec[k] - state_from_vec[k]); } tweendata.push_back(state_vec); tweengroup.push_back(current_group); tweenframe.push_back(j + frame[i-1]); } } else { tweendata.push_back(data[i - 1]); tweengroup.push_back(current_group); tweenframe.push_back(frame[i-1]); current_group = group[i]; } } tweendata.push_back(data[i - 1]); tweengroup.push_back(current_group); tweenframe.push_back(frame[i-1]); return cpp11::writable::data_frame({ "data"_nm = tweendata, "group"_nm = tweengroup, "frame"_nm = tweenframe }); } [[cpp11::register]] cpp11::writable::data_frame phase_element_interpolator(cpp11::strings data, cpp11::integers group, cpp11::integers frame, cpp11::strings ease) { cpp11::writable::strings tweendata; cpp11::writable::integers tweengroup; cpp11::writable::integers tweenframe; int current_group = group[0]; R_xlen_t i; for (i = 1; i < data.size(); ++i) { if (current_group == group[i]) { int nframes = frame[i] - frame[i-1]; cpp11::r_string type = data[i - 1] == "enter" ? "enter" : data[i] == "exit" ? "exit" : data[i - 1] == "static" ? "static" : "transition"; for (int j = 0; j < nframes; ++j) { if (j == 0 && (type == "transition" || type == "exit")) { tweendata.push_back("raw"); } else { tweendata.push_back(type); } tweengroup.push_back(current_group); tweenframe.push_back(j + frame[i-1]); } } else { tweendata.push_back(data[i - 1]); tweengroup.push_back(current_group); tweenframe.push_back(frame[i-1]); current_group = group[i]; } } tweendata.push_back(data[i - 1]); tweengroup.push_back(current_group); tweenframe.push_back(frame[i-1]); return cpp11::writable::data_frame({ "data"_nm = tweendata, "group"_nm = tweengroup, "frame"_nm = tweenframe }); } tweenr/src/easing.h0000644000176200001440000000436713352364025014001 0ustar liggesusers// // easing.h // // Copyright (c) 2011, Auerhaus Development, LLC // // This program is free software. It comes without any warranty, to // the extent permitted by applicable law. You can redistribute it // and/or modify it under the terms of the Do What The Fuck You Want // To Public License, Version 2, as published by Sam Hocevar. See // http://sam.zoy.org/wtfpl/COPYING for more details. // #ifndef AH_EASING_H #define AH_EASING_H #if defined(__LP64__) && !defined(AH_EASING_USE_DBL_PRECIS) #define AH_EASING_USE_DBL_PRECIS #endif #ifdef AH_EASING_USE_DBL_PRECIS #define AHFloat double #else #define AHFloat float #endif #if defined __cplusplus extern "C" { #endif typedef AHFloat (*AHEasingFunction)(AHFloat); // Linear interpolation (no easing) AHFloat LinearInterpolation(AHFloat p); // Quadratic easing; p^2 AHFloat QuadraticEaseIn(AHFloat p); AHFloat QuadraticEaseOut(AHFloat p); AHFloat QuadraticEaseInOut(AHFloat p); // Cubic easing; p^3 AHFloat CubicEaseIn(AHFloat p); AHFloat CubicEaseOut(AHFloat p); AHFloat CubicEaseInOut(AHFloat p); // Quartic easing; p^4 AHFloat QuarticEaseIn(AHFloat p); AHFloat QuarticEaseOut(AHFloat p); AHFloat QuarticEaseInOut(AHFloat p); // Quintic easing; p^5 AHFloat QuinticEaseIn(AHFloat p); AHFloat QuinticEaseOut(AHFloat p); AHFloat QuinticEaseInOut(AHFloat p); // Sine wave easing; sin(p * PI/2) AHFloat SineEaseIn(AHFloat p); AHFloat SineEaseOut(AHFloat p); AHFloat SineEaseInOut(AHFloat p); // Circular easing; sqrt(1 - p^2) AHFloat CircularEaseIn(AHFloat p); AHFloat CircularEaseOut(AHFloat p); AHFloat CircularEaseInOut(AHFloat p); // Exponential easing, base 2 AHFloat ExponentialEaseIn(AHFloat p); AHFloat ExponentialEaseOut(AHFloat p); AHFloat ExponentialEaseInOut(AHFloat p); // Exponentially-damped sine wave easing AHFloat ElasticEaseIn(AHFloat p); AHFloat ElasticEaseOut(AHFloat p); AHFloat ElasticEaseInOut(AHFloat p); // Overshooting cubic easing; AHFloat BackEaseIn(AHFloat p); AHFloat BackEaseOut(AHFloat p); AHFloat BackEaseInOut(AHFloat p); // Exponentially-decaying bounce easing AHFloat BounceEaseIn(AHFloat p); AHFloat BounceEaseOut(AHFloat p); AHFloat BounceEaseInOut(AHFloat p); #ifdef __cplusplus } #endif #endif tweenr/src/element_at.cpp0000644000176200001440000001147514276676722015221 0ustar liggesusers#include #include #include #include #include #include #include #include "utils.h" using namespace cpp11::literals; [[cpp11::register]] cpp11::writable::doubles numeric_element_at_interpolator(cpp11::doubles data, cpp11::integers group, cpp11::doubles time, double at, cpp11::strings ease) { cpp11::writable::doubles tweendata; for (R_xlen_t i = 1; i < data.size(); ++i) { if ((group[i - 1] == group[i] && time[i - 1] < at && time[i] >= at) || ((i == 1 || group[i - 2] != group[i - 1]) && time[i - 1] == at)) { double p = ease_pos((at - time[i - 1]) / (time[i] - time[i - 1]), ease[i - 1]); tweendata.push_back(data[i - 1] + p * (data[i] - data[i - 1])); } } return tweendata; } [[cpp11::register]] cpp11::writable::data_frame colour_element_at_interpolator(cpp11::doubles_matrix<> data, cpp11::integers group, cpp11::doubles time, double at, cpp11::strings ease) { cpp11::writable::doubles tweendata1; cpp11::writable::doubles tweendata2; cpp11::writable::doubles tweendata3; cpp11::writable::doubles tweendata4; for (R_xlen_t i = 1; i < data.nrow(); ++i) { if ((group[i - 1] == group[i] && time[i - 1] < at && time[i] >= at) || ((i == 1 || group[i - 2] != group[i - 1]) && time[i - 1] == at)) { double p = ease_pos((at - time[i - 1]) / (time[i] - time[i - 1]), ease[i - 1]); tweendata1.push_back(data(i - 1, 0) + p * (data(i, 0) - data(i - 1, 0))); tweendata2.push_back(data(i - 1, 1) + p * (data(i, 1) - data(i - 1, 1))); tweendata3.push_back(data(i - 1, 2) + p * (data(i, 2) - data(i - 1, 2))); tweendata4.push_back(data(i - 1, 3) + p * (data(i, 3) - data(i - 1, 3))); } } return cpp11::writable::data_frame({ "L"_nm = tweendata1, "a"_nm = tweendata2, "b"_nm = tweendata3, "alpha"_nm = tweendata4 }); } [[cpp11::register]] cpp11::writable::strings constant_element_at_interpolator(cpp11::strings data, cpp11::integers group, cpp11::doubles time, double at, cpp11::strings ease) { cpp11::writable::strings tweendata; for (R_xlen_t i = 1; i < data.size(); ++i) { if ((group[i - 1] == group[i] && time[i - 1] < at && time[i] >= at) || ((i == 1 || group[i - 2] != group[i - 1]) && time[i - 1] == at)) { double p = ease_pos((at - time[i - 1]) / (time[i] - time[i - 1]), ease[i - 1]); tweendata.push_back(p < 0.5 ? data[i - 1] : data[i]); } } return tweendata; } [[cpp11::register]] cpp11::writable::list list_element_at_interpolator(cpp11::list data, cpp11::integers group, cpp11::doubles time, double at, cpp11::strings ease) { cpp11::writable::list tweendata; for (R_xlen_t i = 1; i < data.size(); ++i) { if ((group[i - 1] == group[i] && time[i - 1] < at && time[i] >= at) || ((i == 1 || group[i - 2] != group[i - 1]) && time[i - 1] == at)) { double p = ease_pos((at - time[i - 1]) / (time[i] - time[i - 1]), ease[i - 1]); tweendata.push_back(p < 0.5 ? data[i - 1] : data[i]); } } return tweendata; } [[cpp11::register]] cpp11::writable::list numlist_element_at_interpolator(cpp11::list_of data, cpp11::integers group, cpp11::doubles time, double at, cpp11::strings ease) { cpp11::writable::list tweendata; for (R_xlen_t i = 1; i < data.size(); ++i) { if ((group[i - 1] == group[i] && time[i - 1] < at && time[i] >= at) || ((i == 1 || group[i - 2] != group[i - 1]) && time[i - 1] == at)) { double p = ease_pos((at - time[i - 1]) / (time[i] - time[i - 1]), ease[i - 1]); cpp11::doubles state_from_vec = data[i - 1]; cpp11::doubles state_to_vec = data[i]; state_from_vec = align_num_elem(state_from_vec, state_to_vec); state_to_vec = align_num_elem(state_to_vec, state_from_vec); cpp11::writable::doubles state_vec(state_from_vec.size()); for (R_xlen_t i = 0; i < state_from_vec.size(); ++i) { state_vec[i] = state_from_vec[i] + p * (state_to_vec[i] - state_from_vec[i]); } tweendata.push_back(state_vec); } } return tweendata; } [[cpp11::register]] cpp11::writable::strings phase_element_at_interpolator(cpp11::strings data, cpp11::integers group, cpp11::doubles time, double at, cpp11::strings ease) { cpp11::writable::strings tweendata; for (R_xlen_t i = 1; i < data.size(); ++i) { if ((group[i - 1] == group[i] && time[i - 1] < at && time[i] >= at) || ((i == 1 || group[i - 2] != group[i - 1]) && time[i - 1] == at)) { if ((at == time[i - 2] && !(data[i - 1] == "enter")) || (at == time[i] && !(data[i] == "exit"))) { tweendata.push_back("raw"); } else{ tweendata.push_back(data[i - 1] == "enter" ? "enter" : data[i] == "exit" ? "exit" : data[i - 1] == "static" ? "static" : "transition"); } } } return tweendata; } tweenr/src/fill.cpp0000644000176200001440000000760514276676722014032 0ustar liggesusers#include #include #include #include #include #include #include "utils.h" [[cpp11::register]] cpp11::doubles numeric_fill_interpolator(cpp11::doubles data, cpp11::strings ease) { cpp11::writable::doubles res(data.size()); std::fill(res.begin(), res.end(), R_NaReal); int last = -1; std::string easer = ease[0]; for (R_xlen_t i = 0; i < data.size(); ++i) { if (cpp11::is_na(data[i])) continue; if (last != -1) { std::vector easepos = ease_seq(easer, i - last); for (size_t j = 1; j < easepos.size(); ++j) { res[last + j] = data[last] + easepos[j] * (data[i] - data[last]); } } res[i] = data[i]; last = i; } return res; } [[cpp11::register]] cpp11::doubles_matrix<> colour_fill_interpolator(cpp11::doubles_matrix<> data, cpp11::strings ease) { cpp11::writable::doubles_matrix<> res(data.nrow(), data.ncol()); for (int i = 0; i < res.nrow(); ++i) { for (int j = 0; j < res.ncol(); ++j) { res(i, j) = R_NaReal; } } int last = -1; std::string easer = ease[0]; for (R_xlen_t i = 0; i < data.nrow(); ++i) { if (cpp11::is_na(data(i, 0))) continue; if (last != -1) { std::vector easepos = ease_seq(easer, i - last); for (size_t j = 1; j < easepos.size(); ++j) { for (R_xlen_t k = 0; k < data.ncol(); ++k) { res(last + j, k) = data(last, k) + easepos[j] * (data(i, k) - data(last, k)); } } } for (R_xlen_t k = 0; k < data.ncol(); ++k) { res(i, k) = data(i, k); } last = i; } return res; } [[cpp11::register]] cpp11::strings constant_fill_interpolator(cpp11::strings data, cpp11::strings ease) { cpp11::writable::strings res(data.size()); std::fill(res.begin(), res.end(), R_NaString); int last = -1; std::string easer = ease[0]; for (R_xlen_t i = 0; i < data.size(); ++i) { if (cpp11::is_na(data[i])) continue; if (last != -1) { std::vector easepos = ease_seq(easer, i - last); for (size_t j = 1; j < easepos.size(); ++j) { res[last + j] = easepos[j] < 0.5 ? data[last] : data[i]; } } res[i] = data[i]; last = i; } return res; } [[cpp11::register]] cpp11::list list_fill_interpolator(cpp11::list data, cpp11::strings ease) { cpp11::writable::list res(data.size()); std::fill(res.begin(), res.end(), R_NilValue); int last = -1; std::string easer = ease[0]; for (R_xlen_t i = 0; i < data.size(); ++i) { if (data[i] == R_NilValue) continue; if (last != -1) { std::vector easepos = ease_seq(easer, i - last); for (size_t j = 1; j < easepos.size(); ++j) { res[last + j] = easepos[j] < 0.5 ? data[last] : data[i]; } } res[i] = data[i]; last = i; } return res; } [[cpp11::register]] cpp11::list numlist_fill_interpolator(cpp11::list_of data, cpp11::strings ease) { cpp11::writable::list res(data.size()); std::fill(res.begin(), res.end(), R_NilValue); int last = -1; std::string easer = ease[0]; for (R_xlen_t i = 0; i < data.size(); ++i) { if (data[i] == R_NilValue) continue; if (last != -1) { std::vector easepos = ease_seq(easer, i - last); cpp11::doubles state_from_vec = data[last]; cpp11::doubles state_to_vec = data[i]; state_from_vec = align_num_elem(state_from_vec, state_to_vec); state_to_vec = align_num_elem(state_to_vec, state_from_vec); res[last] = data[last]; for (size_t j = 1; j < easepos.size(); ++j) { cpp11::writable::doubles state_vec(state_from_vec.size()); for (R_xlen_t k = 0; k < state_from_vec.size(); ++k) { state_vec[k] = state_from_vec[k] + easepos[j] * (state_to_vec[k] - state_from_vec[k]); } res[last + j] = state_vec; } } res[i] = data[i]; last = i; } return res; } tweenr/src/utils.h0000644000176200001440000001620114062333522013656 0ustar liggesusers#pragma once #include #include #include "cpp11/doubles.hpp" #include "easing.h" enum Easer { linear, quadratic_in, quadratic_out, quadratic_in_out, cubic_in, cubic_out, cubic_in_out, quartic_in, quartic_out, quartic_in_out, quintic_in, quintic_out, quintic_in_out, sine_in, sine_out, sine_in_out, circular_in, circular_out, circular_in_out, exponential_in, exponential_out, exponential_in_out, elastic_in, elastic_out, elastic_in_out, back_in, back_out, back_in_out, bounce_in, bounce_out, bounce_in_out, UNKNOWN }; static inline Easer get_easer(std::string ease) { if (ease == "linear") return linear; if (ease == "quadratic-in") return quadratic_in; if (ease == "quadratic-out") return quadratic_out; if (ease == "quadratic-in-out") return quadratic_in_out; if (ease == "cubic-in") return cubic_in; if (ease == "cubic-out") return cubic_out; if (ease == "cubic-in-out") return cubic_in_out; if (ease == "quartic-in") return quartic_in; if (ease == "quartic-out") return quartic_out; if (ease == "quartic-in-out") return quartic_in_out; if (ease == "quintic-in") return quintic_in; if (ease == "quintic-out") return quintic_out; if (ease == "quintic-in-out") return quintic_in_out; if (ease == "sine-in") return sine_in; if (ease == "sine-out") return sine_out; if (ease == "sine-in-out") return sine_in_out; if (ease == "circular-in") return circular_in; if (ease == "circular-out") return circular_out; if (ease == "circular-in-out") return circular_in_out; if (ease == "exponential-in") return exponential_in; if (ease == "exponential-out") return exponential_out; if (ease == "exponential-in-out") return exponential_in_out; if (ease == "elastic-in") return elastic_in; if (ease == "elastic-out") return elastic_out; if (ease == "elastic-in-out") return elastic_in_out; if (ease == "back-in") return back_in; if (ease == "back-out") return back_out; if (ease == "back-in-out") return back_in_out; if (ease == "bounce-in") return bounce_in; if (ease == "bounce-out") return bounce_out; if (ease == "bounce-in-out") return bounce_in_out; return UNKNOWN; } static inline std::vector ease_seq(std::string easer, int length) { std::vector res(length); double p; // Just linear for now for(int i = 0; i < length; ++i) { p = double(i) / length; switch (get_easer(easer)) { case linear: res[i] = LinearInterpolation(p); break; case quadratic_in: res[i] = QuadraticEaseIn(p); break; case quadratic_out: res[i] = QuadraticEaseOut(p); break; case quadratic_in_out: res[i] = QuadraticEaseInOut(p); break; case cubic_in: res[i] = CubicEaseIn(p); break; case cubic_out: res[i] = CubicEaseOut(p); break; case cubic_in_out: res[i] = CubicEaseInOut(p); break; case quartic_in: res[i] = QuarticEaseIn(p); break; case quartic_out: res[i] = QuarticEaseOut(p); break; case quartic_in_out: res[i] = QuarticEaseInOut(p); break; case quintic_in: res[i] = QuinticEaseIn(p); break; case quintic_out: res[i] = QuinticEaseOut(p); break; case quintic_in_out: res[i] = QuinticEaseInOut(p); break; case sine_in: res[i] = SineEaseIn(p); break; case sine_out: res[i] = SineEaseOut(p); break; case sine_in_out: res[i] = SineEaseInOut(p); break; case circular_in: res[i] = CircularEaseIn(p); break; case circular_out: res[i] = CircularEaseOut(p); break; case circular_in_out: res[i] = CircularEaseInOut(p); break; case exponential_in: res[i] = ExponentialEaseIn(p); break; case exponential_out: res[i] = ExponentialEaseOut(p); break; case exponential_in_out: res[i] = ExponentialEaseInOut(p); break; case elastic_in: res[i] = ElasticEaseIn(p); break; case elastic_out: res[i] = ElasticEaseOut(p); break; case elastic_in_out: res[i] = ElasticEaseInOut(p); break; case back_in: res[i] = BackEaseIn(p); break; case back_out: res[i] = BackEaseOut(p); break; case back_in_out: res[i] = BackEaseInOut(p); break; case bounce_in: res[i] = BounceEaseIn(p); break; case bounce_out: res[i] = BounceEaseOut(p); break; case bounce_in_out: res[i] = BounceEaseInOut(p); break; case UNKNOWN: cpp11::stop("Unknown easing function"); } } return res; } static inline double ease_pos(double p, std::string easer) { double p_new = 0; switch (get_easer(easer)) { case linear: p_new = LinearInterpolation(p); break; case quadratic_in: p_new = QuadraticEaseIn(p); break; case quadratic_out: p_new = QuadraticEaseOut(p); break; case quadratic_in_out: p_new = QuadraticEaseInOut(p); break; case cubic_in: p_new = CubicEaseIn(p); break; case cubic_out: p_new = CubicEaseOut(p); break; case cubic_in_out: p_new = CubicEaseInOut(p); break; case quartic_in: p_new = QuarticEaseIn(p); break; case quartic_out: p_new = QuarticEaseOut(p); break; case quartic_in_out: p_new = QuarticEaseInOut(p); break; case quintic_in: p_new = QuinticEaseIn(p); break; case quintic_out: p_new = QuinticEaseOut(p); break; case quintic_in_out: p_new = QuinticEaseInOut(p); break; case sine_in: p_new = SineEaseIn(p); break; case sine_out: p_new = SineEaseOut(p); break; case sine_in_out: p_new = SineEaseInOut(p); break; case circular_in: p_new = CircularEaseIn(p); break; case circular_out: p_new = CircularEaseOut(p); break; case circular_in_out: p_new = CircularEaseInOut(p); break; case exponential_in: p_new = ExponentialEaseIn(p); break; case exponential_out: p_new = ExponentialEaseOut(p); break; case exponential_in_out: p_new = ExponentialEaseInOut(p); break; case elastic_in: p_new = ElasticEaseIn(p); break; case elastic_out: p_new = ElasticEaseOut(p); break; case elastic_in_out: p_new = ElasticEaseInOut(p); break; case back_in: p_new = BackEaseIn(p); break; case back_out: p_new = BackEaseOut(p); break; case back_in_out: p_new = BackEaseInOut(p); break; case bounce_in: p_new = BounceEaseIn(p); break; case bounce_out: p_new = BounceEaseOut(p); break; case bounce_in_out: p_new = BounceEaseInOut(p); break; case UNKNOWN: cpp11::stop("Unknown easing function"); } return p_new; } static inline cpp11::doubles align_num_elem(cpp11::doubles from, cpp11::doubles to) { if (from.size() < to.size()) { cpp11::writable::doubles res(to.size()); if (from.size() == 0) { double mean = std::accumulate(to.begin(), to.end(), 0.0) / to.size(); std::fill(res.begin(), res.end(), mean); return res; } for (int i = 0; i < res.size(); ++i) { res[i] = from[i % from.size()]; } return res; } return from; } tweenr/src/easing.c0000644000176200001440000001421214026057511013760 0ustar liggesusers// // easing.c // // Copyright (c) 2011, Auerhaus Development, LLC // // This program is free software. It comes without any warranty, to // the extent permitted by applicable law. You can redistribute it // and/or modify it under the terms of the Do What The Fuck You Want // To Public License, Version 2, as published by Sam Hocevar. See // http://sam.zoy.org/wtfpl/COPYING for more details. // #define _USE_MATH_DEFINES #include #include "easing.h" // Modeled after the line y = x AHFloat LinearInterpolation(AHFloat p) { return p; } // Modeled after the parabola y = x^2 AHFloat QuadraticEaseIn(AHFloat p) { return p * p; } // Modeled after the parabola y = -x^2 + 2x AHFloat QuadraticEaseOut(AHFloat p) { return -(p * (p - 2)); } // Modeled after the piecewise quadratic // y = (1/2)((2x)^2) ; [0, 0.5) // y = -(1/2)((2x-1)*(2x-3) - 1) ; [0.5, 1] AHFloat QuadraticEaseInOut(AHFloat p) { if(p < 0.5) { return 2 * p * p; } else { return (-2 * p * p) + (4 * p) - 1; } } // Modeled after the cubic y = x^3 AHFloat CubicEaseIn(AHFloat p) { return p * p * p; } // Modeled after the cubic y = (x - 1)^3 + 1 AHFloat CubicEaseOut(AHFloat p) { AHFloat f = (p - 1); return f * f * f + 1; } // Modeled after the piecewise cubic // y = (1/2)((2x)^3) ; [0, 0.5) // y = (1/2)((2x-2)^3 + 2) ; [0.5, 1] AHFloat CubicEaseInOut(AHFloat p) { if(p < 0.5) { return 4 * p * p * p; } else { AHFloat f = ((2 * p) - 2); return 0.5 * f * f * f + 1; } } // Modeled after the quartic x^4 AHFloat QuarticEaseIn(AHFloat p) { return p * p * p * p; } // Modeled after the quartic y = 1 - (x - 1)^4 AHFloat QuarticEaseOut(AHFloat p) { AHFloat f = (p - 1); return f * f * f * (1 - p) + 1; } // Modeled after the piecewise quartic // y = (1/2)((2x)^4) ; [0, 0.5) // y = -(1/2)((2x-2)^4 - 2) ; [0.5, 1] AHFloat QuarticEaseInOut(AHFloat p) { if(p < 0.5) { return 8 * p * p * p * p; } else { AHFloat f = (p - 1); return -8 * f * f * f * f + 1; } } // Modeled after the quintic y = x^5 AHFloat QuinticEaseIn(AHFloat p) { return p * p * p * p * p; } // Modeled after the quintic y = (x - 1)^5 + 1 AHFloat QuinticEaseOut(AHFloat p) { AHFloat f = (p - 1); return f * f * f * f * f + 1; } // Modeled after the piecewise quintic // y = (1/2)((2x)^5) ; [0, 0.5) // y = (1/2)((2x-2)^5 + 2) ; [0.5, 1] AHFloat QuinticEaseInOut(AHFloat p) { if(p < 0.5) { return 16 * p * p * p * p * p; } else { AHFloat f = ((2 * p) - 2); return 0.5 * f * f * f * f * f + 1; } } // Modeled after quarter-cycle of sine wave AHFloat SineEaseIn(AHFloat p) { return sin((p - 1) * M_PI_2) + 1; } // Modeled after quarter-cycle of sine wave (different phase) AHFloat SineEaseOut(AHFloat p) { return sin(p * M_PI_2); } // Modeled after half sine wave AHFloat SineEaseInOut(AHFloat p) { return 0.5 * (1 - cos(p * M_PI)); } // Modeled after shifted quadrant IV of unit circle AHFloat CircularEaseIn(AHFloat p) { return 1 - sqrt(1 - (p * p)); } // Modeled after shifted quadrant II of unit circle AHFloat CircularEaseOut(AHFloat p) { return sqrt((2 - p) * p); } // Modeled after the piecewise circular function // y = (1/2)(1 - sqrt(1 - 4x^2)) ; [0, 0.5) // y = (1/2)(sqrt(-(2x - 3)*(2x - 1)) + 1) ; [0.5, 1] AHFloat CircularEaseInOut(AHFloat p) { if(p < 0.5) { return 0.5 * (1 - sqrt(1 - 4 * (p * p))); } else { return 0.5 * (sqrt(-((2 * p) - 3) * ((2 * p) - 1)) + 1); } } // Modeled after the exponential function y = 2^(10(x - 1)) AHFloat ExponentialEaseIn(AHFloat p) { return (p == 0.0) ? p : pow(2, 10 * (p - 1)); } // Modeled after the exponential function y = -2^(-10x) + 1 AHFloat ExponentialEaseOut(AHFloat p) { return (p == 1.0) ? p : 1 - pow(2, -10 * p); } // Modeled after the piecewise exponential // y = (1/2)2^(10(2x - 1)) ; [0,0.5) // y = -(1/2)*2^(-10(2x - 1))) + 1 ; [0.5,1] AHFloat ExponentialEaseInOut(AHFloat p) { if(p == 0.0 || p == 1.0) return p; if(p < 0.5) { return 0.5 * pow(2, (20 * p) - 10); } else { return -0.5 * pow(2, (-20 * p) + 10) + 1; } } // Modeled after the damped sine wave y = sin(13pi/2*x)*pow(2, 10 * (x - 1)) AHFloat ElasticEaseIn(AHFloat p) { return sin(13 * M_PI_2 * p) * pow(2, 10 * (p - 1)); } // Modeled after the damped sine wave y = sin(-13pi/2*(x + 1))*pow(2, -10x) + 1 AHFloat ElasticEaseOut(AHFloat p) { return sin(-13 * M_PI_2 * (p + 1)) * pow(2, -10 * p) + 1; } // Modeled after the piecewise exponentially-damped sine wave: // y = (1/2)*sin(13pi/2*(2*x))*pow(2, 10 * ((2*x) - 1)) ; [0,0.5) // y = (1/2)*(sin(-13pi/2*((2x-1)+1))*pow(2,-10(2*x-1)) + 2) ; [0.5, 1] AHFloat ElasticEaseInOut(AHFloat p) { if(p < 0.5) { return 0.5 * sin(13 * M_PI_2 * (2 * p)) * pow(2, 10 * ((2 * p) - 1)); } else { return 0.5 * (sin(-13 * M_PI_2 * ((2 * p - 1) + 1)) * pow(2, -10 * (2 * p - 1)) + 2); } } // Modeled after the overshooting cubic y = x^3-x*sin(x*pi) AHFloat BackEaseIn(AHFloat p) { return p * p * p - p * sin(p * M_PI); } // Modeled after overshooting cubic y = 1-((1-x)^3-(1-x)*sin((1-x)*pi)) AHFloat BackEaseOut(AHFloat p) { AHFloat f = (1 - p); return 1 - (f * f * f - f * sin(f * M_PI)); } // Modeled after the piecewise overshooting cubic function: // y = (1/2)*((2x)^3-(2x)*sin(2*x*pi)) ; [0, 0.5) // y = (1/2)*(1-((1-x)^3-(1-x)*sin((1-x)*pi))+1) ; [0.5, 1] AHFloat BackEaseInOut(AHFloat p) { if(p < 0.5) { AHFloat f = 2 * p; return 0.5 * (f * f * f - f * sin(f * M_PI)); } else { AHFloat f = (1 - (2*p - 1)); return 0.5 * (1 - (f * f * f - f * sin(f * M_PI))) + 0.5; } } AHFloat BounceEaseIn(AHFloat p) { return 1 - BounceEaseOut(1 - p); } AHFloat BounceEaseOut(AHFloat p) { if(p < 4/11.0) { return (121 * p * p)/16.0; } else if(p < 8/11.0) { return (363/40.0 * p * p) - (99/10.0 * p) + 17/5.0; } else if(p < 9/10.0) { return (4356/361.0 * p * p) - (35442/1805.0 * p) + 16061/1805.0; } else { return (54/5.0 * p * p) - (513/25.0 * p) + 268/25.0; } } AHFloat BounceEaseInOut(AHFloat p) { if(p < 0.5) { return 0.5 * BounceEaseIn(p*2); } else { return 0.5 * BounceEaseOut(p * 2 - 1) + 0.5; } } tweenr/src/cpp11.cpp0000644000176200001440000005431214276676765014034 0ustar liggesusers// Generated by cpp11: do not edit by hand // clang-format off #include "cpp11/declarations.hpp" #include // along.cpp cpp11::writable::data_frame numeric_along_interpolator(cpp11::doubles data, cpp11::integers group, cpp11::doubles time, bool history, bool keep_last, cpp11::doubles frames, cpp11::strings ease); extern "C" SEXP _tweenr_numeric_along_interpolator(SEXP data, SEXP group, SEXP time, SEXP history, SEXP keep_last, SEXP frames, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(numeric_along_interpolator(cpp11::as_cpp>(data), cpp11::as_cpp>(group), cpp11::as_cpp>(time), cpp11::as_cpp>(history), cpp11::as_cpp>(keep_last), cpp11::as_cpp>(frames), cpp11::as_cpp>(ease))); END_CPP11 } // along.cpp cpp11::writable::data_frame colour_along_interpolator(cpp11::doubles_matrix<> data, cpp11::integers group, cpp11::doubles time, bool history, bool keep_last, cpp11::doubles frames, cpp11::strings ease); extern "C" SEXP _tweenr_colour_along_interpolator(SEXP data, SEXP group, SEXP time, SEXP history, SEXP keep_last, SEXP frames, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(colour_along_interpolator(cpp11::as_cpp>>(data), cpp11::as_cpp>(group), cpp11::as_cpp>(time), cpp11::as_cpp>(history), cpp11::as_cpp>(keep_last), cpp11::as_cpp>(frames), cpp11::as_cpp>(ease))); END_CPP11 } // along.cpp cpp11::writable::data_frame constant_along_interpolator(cpp11::strings data, cpp11::integers group, cpp11::doubles time, bool history, bool keep_last, cpp11::doubles frames, cpp11::strings ease); extern "C" SEXP _tweenr_constant_along_interpolator(SEXP data, SEXP group, SEXP time, SEXP history, SEXP keep_last, SEXP frames, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(constant_along_interpolator(cpp11::as_cpp>(data), cpp11::as_cpp>(group), cpp11::as_cpp>(time), cpp11::as_cpp>(history), cpp11::as_cpp>(keep_last), cpp11::as_cpp>(frames), cpp11::as_cpp>(ease))); END_CPP11 } // along.cpp cpp11::writable::data_frame list_along_interpolator(cpp11::list data, cpp11::integers group, cpp11::doubles time, bool history, bool keep_last, cpp11::doubles frames, cpp11::strings ease); extern "C" SEXP _tweenr_list_along_interpolator(SEXP data, SEXP group, SEXP time, SEXP history, SEXP keep_last, SEXP frames, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(list_along_interpolator(cpp11::as_cpp>(data), cpp11::as_cpp>(group), cpp11::as_cpp>(time), cpp11::as_cpp>(history), cpp11::as_cpp>(keep_last), cpp11::as_cpp>(frames), cpp11::as_cpp>(ease))); END_CPP11 } // along.cpp cpp11::writable::data_frame numlist_along_interpolator(cpp11::list_of data, cpp11::integers group, cpp11::doubles time, bool history, bool keep_last, cpp11::doubles frames, cpp11::strings ease); extern "C" SEXP _tweenr_numlist_along_interpolator(SEXP data, SEXP group, SEXP time, SEXP history, SEXP keep_last, SEXP frames, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(numlist_along_interpolator(cpp11::as_cpp>>(data), cpp11::as_cpp>(group), cpp11::as_cpp>(time), cpp11::as_cpp>(history), cpp11::as_cpp>(keep_last), cpp11::as_cpp>(frames), cpp11::as_cpp>(ease))); END_CPP11 } // along.cpp cpp11::writable::data_frame phase_along_interpolator(cpp11::integers group, cpp11::doubles time, bool history, bool keep_last, cpp11::doubles frames); extern "C" SEXP _tweenr_phase_along_interpolator(SEXP group, SEXP time, SEXP history, SEXP keep_last, SEXP frames) { BEGIN_CPP11 return cpp11::as_sexp(phase_along_interpolator(cpp11::as_cpp>(group), cpp11::as_cpp>(time), cpp11::as_cpp>(history), cpp11::as_cpp>(keep_last), cpp11::as_cpp>(frames))); END_CPP11 } // at.cpp cpp11::doubles numeric_at_interpolator(cpp11::doubles from, cpp11::doubles to, cpp11::doubles at, cpp11::strings ease); extern "C" SEXP _tweenr_numeric_at_interpolator(SEXP from, SEXP to, SEXP at, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(numeric_at_interpolator(cpp11::as_cpp>(from), cpp11::as_cpp>(to), cpp11::as_cpp>(at), cpp11::as_cpp>(ease))); END_CPP11 } // at.cpp cpp11::doubles_matrix<> colour_at_interpolator(cpp11::doubles_matrix<> from, cpp11::doubles_matrix<> to, cpp11::doubles at, cpp11::strings ease); extern "C" SEXP _tweenr_colour_at_interpolator(SEXP from, SEXP to, SEXP at, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(colour_at_interpolator(cpp11::as_cpp>>(from), cpp11::as_cpp>>(to), cpp11::as_cpp>(at), cpp11::as_cpp>(ease))); END_CPP11 } // at.cpp cpp11::strings constant_at_interpolator(cpp11::strings from, cpp11::strings to, cpp11::doubles at, cpp11::strings ease); extern "C" SEXP _tweenr_constant_at_interpolator(SEXP from, SEXP to, SEXP at, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(constant_at_interpolator(cpp11::as_cpp>(from), cpp11::as_cpp>(to), cpp11::as_cpp>(at), cpp11::as_cpp>(ease))); END_CPP11 } // at.cpp cpp11::list list_at_interpolator(cpp11::list from, cpp11::list to, cpp11::doubles at, cpp11::strings ease); extern "C" SEXP _tweenr_list_at_interpolator(SEXP from, SEXP to, SEXP at, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(list_at_interpolator(cpp11::as_cpp>(from), cpp11::as_cpp>(to), cpp11::as_cpp>(at), cpp11::as_cpp>(ease))); END_CPP11 } // at.cpp cpp11::list numlist_at_interpolator(cpp11::list_of from, cpp11::list_of to, cpp11::doubles at, cpp11::strings ease); extern "C" SEXP _tweenr_numlist_at_interpolator(SEXP from, SEXP to, SEXP at, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(numlist_at_interpolator(cpp11::as_cpp>>(from), cpp11::as_cpp>>(to), cpp11::as_cpp>(at), cpp11::as_cpp>(ease))); END_CPP11 } // element_at.cpp cpp11::writable::doubles numeric_element_at_interpolator(cpp11::doubles data, cpp11::integers group, cpp11::doubles time, double at, cpp11::strings ease); extern "C" SEXP _tweenr_numeric_element_at_interpolator(SEXP data, SEXP group, SEXP time, SEXP at, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(numeric_element_at_interpolator(cpp11::as_cpp>(data), cpp11::as_cpp>(group), cpp11::as_cpp>(time), cpp11::as_cpp>(at), cpp11::as_cpp>(ease))); END_CPP11 } // element_at.cpp cpp11::writable::data_frame colour_element_at_interpolator(cpp11::doubles_matrix<> data, cpp11::integers group, cpp11::doubles time, double at, cpp11::strings ease); extern "C" SEXP _tweenr_colour_element_at_interpolator(SEXP data, SEXP group, SEXP time, SEXP at, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(colour_element_at_interpolator(cpp11::as_cpp>>(data), cpp11::as_cpp>(group), cpp11::as_cpp>(time), cpp11::as_cpp>(at), cpp11::as_cpp>(ease))); END_CPP11 } // element_at.cpp cpp11::writable::strings constant_element_at_interpolator(cpp11::strings data, cpp11::integers group, cpp11::doubles time, double at, cpp11::strings ease); extern "C" SEXP _tweenr_constant_element_at_interpolator(SEXP data, SEXP group, SEXP time, SEXP at, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(constant_element_at_interpolator(cpp11::as_cpp>(data), cpp11::as_cpp>(group), cpp11::as_cpp>(time), cpp11::as_cpp>(at), cpp11::as_cpp>(ease))); END_CPP11 } // element_at.cpp cpp11::writable::list list_element_at_interpolator(cpp11::list data, cpp11::integers group, cpp11::doubles time, double at, cpp11::strings ease); extern "C" SEXP _tweenr_list_element_at_interpolator(SEXP data, SEXP group, SEXP time, SEXP at, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(list_element_at_interpolator(cpp11::as_cpp>(data), cpp11::as_cpp>(group), cpp11::as_cpp>(time), cpp11::as_cpp>(at), cpp11::as_cpp>(ease))); END_CPP11 } // element_at.cpp cpp11::writable::list numlist_element_at_interpolator(cpp11::list_of data, cpp11::integers group, cpp11::doubles time, double at, cpp11::strings ease); extern "C" SEXP _tweenr_numlist_element_at_interpolator(SEXP data, SEXP group, SEXP time, SEXP at, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(numlist_element_at_interpolator(cpp11::as_cpp>>(data), cpp11::as_cpp>(group), cpp11::as_cpp>(time), cpp11::as_cpp>(at), cpp11::as_cpp>(ease))); END_CPP11 } // element_at.cpp cpp11::writable::strings phase_element_at_interpolator(cpp11::strings data, cpp11::integers group, cpp11::doubles time, double at, cpp11::strings ease); extern "C" SEXP _tweenr_phase_element_at_interpolator(SEXP data, SEXP group, SEXP time, SEXP at, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(phase_element_at_interpolator(cpp11::as_cpp>(data), cpp11::as_cpp>(group), cpp11::as_cpp>(time), cpp11::as_cpp>(at), cpp11::as_cpp>(ease))); END_CPP11 } // element.cpp cpp11::writable::data_frame numeric_element_interpolator(cpp11::doubles data, cpp11::integers group, cpp11::integers frame, cpp11::strings ease); extern "C" SEXP _tweenr_numeric_element_interpolator(SEXP data, SEXP group, SEXP frame, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(numeric_element_interpolator(cpp11::as_cpp>(data), cpp11::as_cpp>(group), cpp11::as_cpp>(frame), cpp11::as_cpp>(ease))); END_CPP11 } // element.cpp cpp11::writable::data_frame colour_element_interpolator(cpp11::doubles_matrix<> data, cpp11::integers group, cpp11::integers frame, cpp11::strings ease); extern "C" SEXP _tweenr_colour_element_interpolator(SEXP data, SEXP group, SEXP frame, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(colour_element_interpolator(cpp11::as_cpp>>(data), cpp11::as_cpp>(group), cpp11::as_cpp>(frame), cpp11::as_cpp>(ease))); END_CPP11 } // element.cpp cpp11::writable::data_frame constant_element_interpolator(cpp11::strings data, cpp11::integers group, cpp11::integers frame, cpp11::strings ease); extern "C" SEXP _tweenr_constant_element_interpolator(SEXP data, SEXP group, SEXP frame, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(constant_element_interpolator(cpp11::as_cpp>(data), cpp11::as_cpp>(group), cpp11::as_cpp>(frame), cpp11::as_cpp>(ease))); END_CPP11 } // element.cpp cpp11::writable::data_frame list_element_interpolator(cpp11::list data, cpp11::integers group, cpp11::integers frame, cpp11::strings ease); extern "C" SEXP _tweenr_list_element_interpolator(SEXP data, SEXP group, SEXP frame, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(list_element_interpolator(cpp11::as_cpp>(data), cpp11::as_cpp>(group), cpp11::as_cpp>(frame), cpp11::as_cpp>(ease))); END_CPP11 } // element.cpp cpp11::writable::data_frame numlist_element_interpolator(cpp11::list_of data, cpp11::integers group, cpp11::integers frame, cpp11::strings ease); extern "C" SEXP _tweenr_numlist_element_interpolator(SEXP data, SEXP group, SEXP frame, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(numlist_element_interpolator(cpp11::as_cpp>>(data), cpp11::as_cpp>(group), cpp11::as_cpp>(frame), cpp11::as_cpp>(ease))); END_CPP11 } // element.cpp cpp11::writable::data_frame phase_element_interpolator(cpp11::strings data, cpp11::integers group, cpp11::integers frame, cpp11::strings ease); extern "C" SEXP _tweenr_phase_element_interpolator(SEXP data, SEXP group, SEXP frame, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(phase_element_interpolator(cpp11::as_cpp>(data), cpp11::as_cpp>(group), cpp11::as_cpp>(frame), cpp11::as_cpp>(ease))); END_CPP11 } // fill.cpp cpp11::doubles numeric_fill_interpolator(cpp11::doubles data, cpp11::strings ease); extern "C" SEXP _tweenr_numeric_fill_interpolator(SEXP data, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(numeric_fill_interpolator(cpp11::as_cpp>(data), cpp11::as_cpp>(ease))); END_CPP11 } // fill.cpp cpp11::doubles_matrix<> colour_fill_interpolator(cpp11::doubles_matrix<> data, cpp11::strings ease); extern "C" SEXP _tweenr_colour_fill_interpolator(SEXP data, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(colour_fill_interpolator(cpp11::as_cpp>>(data), cpp11::as_cpp>(ease))); END_CPP11 } // fill.cpp cpp11::strings constant_fill_interpolator(cpp11::strings data, cpp11::strings ease); extern "C" SEXP _tweenr_constant_fill_interpolator(SEXP data, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(constant_fill_interpolator(cpp11::as_cpp>(data), cpp11::as_cpp>(ease))); END_CPP11 } // fill.cpp cpp11::list list_fill_interpolator(cpp11::list data, cpp11::strings ease); extern "C" SEXP _tweenr_list_fill_interpolator(SEXP data, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(list_fill_interpolator(cpp11::as_cpp>(data), cpp11::as_cpp>(ease))); END_CPP11 } // fill.cpp cpp11::list numlist_fill_interpolator(cpp11::list_of data, cpp11::strings ease); extern "C" SEXP _tweenr_numlist_fill_interpolator(SEXP data, SEXP ease) { BEGIN_CPP11 return cpp11::as_sexp(numlist_fill_interpolator(cpp11::as_cpp>>(data), cpp11::as_cpp>(ease))); END_CPP11 } // state.cpp cpp11::doubles numeric_state_interpolator(cpp11::list_of data, cpp11::data_frame states); extern "C" SEXP _tweenr_numeric_state_interpolator(SEXP data, SEXP states) { BEGIN_CPP11 return cpp11::as_sexp(numeric_state_interpolator(cpp11::as_cpp>>(data), cpp11::as_cpp>(states))); END_CPP11 } // state.cpp cpp11::doubles_matrix<> colour_state_interpolator(cpp11::list_of> data, cpp11::data_frame states); extern "C" SEXP _tweenr_colour_state_interpolator(SEXP data, SEXP states) { BEGIN_CPP11 return cpp11::as_sexp(colour_state_interpolator(cpp11::as_cpp>>>(data), cpp11::as_cpp>(states))); END_CPP11 } // state.cpp cpp11::strings constant_state_interpolator(cpp11::list_of data, cpp11::data_frame states); extern "C" SEXP _tweenr_constant_state_interpolator(SEXP data, SEXP states) { BEGIN_CPP11 return cpp11::as_sexp(constant_state_interpolator(cpp11::as_cpp>>(data), cpp11::as_cpp>(states))); END_CPP11 } // state.cpp cpp11::list list_state_interpolator(cpp11::list_of data, cpp11::data_frame states); extern "C" SEXP _tweenr_list_state_interpolator(SEXP data, SEXP states) { BEGIN_CPP11 return cpp11::as_sexp(list_state_interpolator(cpp11::as_cpp>>(data), cpp11::as_cpp>(states))); END_CPP11 } // state.cpp cpp11::list numlist_state_interpolator(cpp11::list_of data, cpp11::data_frame states); extern "C" SEXP _tweenr_numlist_state_interpolator(SEXP data, SEXP states) { BEGIN_CPP11 return cpp11::as_sexp(numlist_state_interpolator(cpp11::as_cpp>>(data), cpp11::as_cpp>(states))); END_CPP11 } // state.cpp cpp11::strings phase_state_interpolator(cpp11::list_of data, cpp11::data_frame states); extern "C" SEXP _tweenr_phase_state_interpolator(SEXP data, SEXP states) { BEGIN_CPP11 return cpp11::as_sexp(phase_state_interpolator(cpp11::as_cpp>>(data), cpp11::as_cpp>(states))); END_CPP11 } extern "C" { static const R_CallMethodDef CallEntries[] = { {"_tweenr_colour_along_interpolator", (DL_FUNC) &_tweenr_colour_along_interpolator, 7}, {"_tweenr_colour_at_interpolator", (DL_FUNC) &_tweenr_colour_at_interpolator, 4}, {"_tweenr_colour_element_at_interpolator", (DL_FUNC) &_tweenr_colour_element_at_interpolator, 5}, {"_tweenr_colour_element_interpolator", (DL_FUNC) &_tweenr_colour_element_interpolator, 4}, {"_tweenr_colour_fill_interpolator", (DL_FUNC) &_tweenr_colour_fill_interpolator, 2}, {"_tweenr_colour_state_interpolator", (DL_FUNC) &_tweenr_colour_state_interpolator, 2}, {"_tweenr_constant_along_interpolator", (DL_FUNC) &_tweenr_constant_along_interpolator, 7}, {"_tweenr_constant_at_interpolator", (DL_FUNC) &_tweenr_constant_at_interpolator, 4}, {"_tweenr_constant_element_at_interpolator", (DL_FUNC) &_tweenr_constant_element_at_interpolator, 5}, {"_tweenr_constant_element_interpolator", (DL_FUNC) &_tweenr_constant_element_interpolator, 4}, {"_tweenr_constant_fill_interpolator", (DL_FUNC) &_tweenr_constant_fill_interpolator, 2}, {"_tweenr_constant_state_interpolator", (DL_FUNC) &_tweenr_constant_state_interpolator, 2}, {"_tweenr_list_along_interpolator", (DL_FUNC) &_tweenr_list_along_interpolator, 7}, {"_tweenr_list_at_interpolator", (DL_FUNC) &_tweenr_list_at_interpolator, 4}, {"_tweenr_list_element_at_interpolator", (DL_FUNC) &_tweenr_list_element_at_interpolator, 5}, {"_tweenr_list_element_interpolator", (DL_FUNC) &_tweenr_list_element_interpolator, 4}, {"_tweenr_list_fill_interpolator", (DL_FUNC) &_tweenr_list_fill_interpolator, 2}, {"_tweenr_list_state_interpolator", (DL_FUNC) &_tweenr_list_state_interpolator, 2}, {"_tweenr_numeric_along_interpolator", (DL_FUNC) &_tweenr_numeric_along_interpolator, 7}, {"_tweenr_numeric_at_interpolator", (DL_FUNC) &_tweenr_numeric_at_interpolator, 4}, {"_tweenr_numeric_element_at_interpolator", (DL_FUNC) &_tweenr_numeric_element_at_interpolator, 5}, {"_tweenr_numeric_element_interpolator", (DL_FUNC) &_tweenr_numeric_element_interpolator, 4}, {"_tweenr_numeric_fill_interpolator", (DL_FUNC) &_tweenr_numeric_fill_interpolator, 2}, {"_tweenr_numeric_state_interpolator", (DL_FUNC) &_tweenr_numeric_state_interpolator, 2}, {"_tweenr_numlist_along_interpolator", (DL_FUNC) &_tweenr_numlist_along_interpolator, 7}, {"_tweenr_numlist_at_interpolator", (DL_FUNC) &_tweenr_numlist_at_interpolator, 4}, {"_tweenr_numlist_element_at_interpolator", (DL_FUNC) &_tweenr_numlist_element_at_interpolator, 5}, {"_tweenr_numlist_element_interpolator", (DL_FUNC) &_tweenr_numlist_element_interpolator, 4}, {"_tweenr_numlist_fill_interpolator", (DL_FUNC) &_tweenr_numlist_fill_interpolator, 2}, {"_tweenr_numlist_state_interpolator", (DL_FUNC) &_tweenr_numlist_state_interpolator, 2}, {"_tweenr_phase_along_interpolator", (DL_FUNC) &_tweenr_phase_along_interpolator, 5}, {"_tweenr_phase_element_at_interpolator", (DL_FUNC) &_tweenr_phase_element_at_interpolator, 5}, {"_tweenr_phase_element_interpolator", (DL_FUNC) &_tweenr_phase_element_interpolator, 4}, {"_tweenr_phase_state_interpolator", (DL_FUNC) &_tweenr_phase_state_interpolator, 2}, {NULL, NULL, 0} }; } extern "C" attribute_visible void R_init_tweenr(DllInfo* dll){ R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); R_forceSymbols(dll, TRUE); } tweenr/src/state.cpp0000644000176200001440000002617014276676722014222 0ustar liggesusers#include #include #include #include #include #include #include #include #include #include "utils.h" [[cpp11::register]] cpp11::doubles numeric_state_interpolator(cpp11::list_of data, cpp11::data_frame states) { cpp11::integers state_index = states["state"]; cpp11::integers nframes_per_state = states["nframes"]; cpp11::strings easer = states["ease"]; R_xlen_t nelements = data[0].size(); R_xlen_t nstates = states.nrow(); int nframes = std::accumulate(nframes_per_state.begin(), nframes_per_state.end(), 0); int frame = 0; cpp11::writable::doubles res(nelements * nframes); for (R_xlen_t state = 0; state < nstates; ++state) { if (easer[state] == "constant") { cpp11::doubles state_from = data[state_index[state]]; for (int currentframe = 0; currentframe < nframes_per_state[state]; ++currentframe) { R_xlen_t res_index = (frame + currentframe) * nelements; for (R_xlen_t element = 0; element < nelements; ++element) { res[res_index] = state_from[element]; ++res_index; } } } else { std::vector ease_points = ease_seq(easer[state], nframes_per_state[state]); cpp11::doubles state_from = data[state_index[state]]; cpp11::doubles state_to = data[state_index[state] + 1]; for (R_xlen_t element = 0; element < nelements; ++element) { for (int currentframe = 0; currentframe < nframes_per_state[state]; ++currentframe) { R_xlen_t res_index = (frame + currentframe) * nelements + element; res[res_index] = state_from[element] + ease_points[currentframe] * (state_to[element] - state_from[element]); } } } frame += nframes_per_state[state]; } return res; } [[cpp11::register]] cpp11::doubles_matrix<> colour_state_interpolator(cpp11::list_of> data, cpp11::data_frame states) { cpp11::integers state_index = states["state"]; cpp11::integers nframes_per_state = states["nframes"]; cpp11::strings easer = states["ease"]; R_xlen_t nelements = data[0].nrow(); R_xlen_t nstates = states.nrow(); int nframes = std::accumulate(nframes_per_state.begin(), nframes_per_state.end(), 0); int frame = 0; cpp11::writable::doubles_matrix<> res(nelements * nframes, 4); for (R_xlen_t state = 0; state < nstates; ++state) { if (easer[state] == "constant") { cpp11::doubles_matrix<> state_from = data[state_index[state]]; for (int currentframe = 0; currentframe < nframes_per_state[state]; ++currentframe) { R_xlen_t res_index = (frame + currentframe) * nelements; for (R_xlen_t element = 0; element < nelements; ++element) { res(res_index, 0) = state_from(element, 0); res(res_index, 1) = state_from(element, 1); res(res_index, 2) = state_from(element, 2); res(res_index, 3) = state_from(element, 3); ++res_index; } } } else { std::vector ease_points = ease_seq(easer[state], nframes_per_state[state]); cpp11::doubles_matrix<> state_from = data[state_index[state]]; cpp11::doubles_matrix<> state_to = data[state_index[state] + 1]; for (R_xlen_t element = 0; element < nelements; ++element) { for (int currentframe = 0; currentframe < nframes_per_state[state]; ++currentframe) { R_xlen_t res_index = (frame + currentframe) * nelements + element; res(res_index, 0) = state_from(element, 0) + ease_points[currentframe] * (state_to(element, 0) - state_from(element, 0)); res(res_index, 1) = state_from(element, 1) + ease_points[currentframe] * (state_to(element, 1) - state_from(element, 1)); res(res_index, 2) = state_from(element, 2) + ease_points[currentframe] * (state_to(element, 2) - state_from(element, 2)); res(res_index, 3) = state_from(element, 3) + ease_points[currentframe] * (state_to(element, 3) - state_from(element, 3)); } } } frame += nframes_per_state[state]; } return res; } [[cpp11::register]] cpp11::strings constant_state_interpolator(cpp11::list_of data, cpp11::data_frame states) { cpp11::integers state_index = states["state"]; cpp11::integers nframes_per_state = states["nframes"]; cpp11::strings easer = states["ease"]; R_xlen_t nelements = data[0].size(); R_xlen_t nstates = states.nrow(); int nframes = std::accumulate(nframes_per_state.begin(), nframes_per_state.end(), 0); int frame = 0; cpp11::writable::strings res(nelements * nframes); for (R_xlen_t state = 0; state < nstates; ++state) { if (easer[state] == "constant") { cpp11::strings state_from = data[state_index[state]]; for (int currentframe = 0; currentframe < nframes_per_state[state]; ++currentframe) { R_xlen_t res_index = (frame + currentframe) * nelements; for (R_xlen_t element = 0; element < nelements; ++element) { res[res_index] = state_from[element]; ++res_index; } } } else { std::vector ease_points = ease_seq(easer[state], nframes_per_state[state]); cpp11::strings state_from = data[state_index[state]]; cpp11::strings state_to = data[state_index[state] + 1]; for (R_xlen_t element = 0; element < nelements; ++element) { for (int currentframe = 0; currentframe < nframes_per_state[state]; ++currentframe) { R_xlen_t res_index = (frame + currentframe) * nelements + element; if (ease_points[currentframe] < 0.5) { res[res_index] = state_from[element]; } else { res[res_index] = state_to[element]; } } } } frame += nframes_per_state[state]; } return res; } [[cpp11::register]] cpp11::list list_state_interpolator(cpp11::list_of data, cpp11::data_frame states) { cpp11::integers state_index = states["state"]; cpp11::integers nframes_per_state = states["nframes"]; cpp11::strings easer = states["ease"]; R_xlen_t nelements = data[0].size(); R_xlen_t nstates = states.nrow(); int nframes = std::accumulate(nframes_per_state.begin(), nframes_per_state.end(), 0); int frame = 0; cpp11::writable::list res(nelements * nframes); for (R_xlen_t state = 0; state < nstates; ++state) { if (easer[state] == "constant") { cpp11::list state_from = data[state_index[state]]; for (int currentframe = 0; currentframe < nframes_per_state[state]; ++currentframe) { R_xlen_t res_index = (frame + currentframe) * nelements; for (R_xlen_t element = 0; element < nelements; ++element) { res[res_index] = state_from[element]; ++res_index; } } } else { std::vector ease_points = ease_seq(easer[state], nframes_per_state[state]); cpp11::list state_from = data[state_index[state]]; cpp11::list state_to = data[state_index[state] + 1]; for (R_xlen_t element = 0; element < nelements; ++element) { for (int currentframe = 0; currentframe < nframes_per_state[state]; ++currentframe) { R_xlen_t res_index = (frame + currentframe) * nelements + element; if (ease_points[currentframe] < 0.5) { res[res_index] = state_from[element]; } else { res[res_index] = state_to[element]; } } } } frame += nframes_per_state[state]; } return res; } [[cpp11::register]] cpp11::list numlist_state_interpolator(cpp11::list_of data, cpp11::data_frame states) { cpp11::integers state_index = states["state"]; cpp11::integers nframes_per_state = states["nframes"]; cpp11::strings easer = states["ease"]; R_xlen_t nelements = data[0].size(); R_xlen_t nstates = states.nrow(); int nframes = std::accumulate(nframes_per_state.begin(), nframes_per_state.end(), 0); int frame = 0; cpp11::writable::list res(nelements * nframes); for (R_xlen_t state = 0; state < nstates; ++state) { if (easer[state] == "constant") { cpp11::list state_from = data[state_index[state]]; for (int currentframe = 0; currentframe < nframes_per_state[state]; ++currentframe) { R_xlen_t res_index = (frame + currentframe) * nelements; for (R_xlen_t element = 0; element < nelements; ++element) { res[res_index] = state_from[element]; ++res_index; } } } else { std::vector ease_points = ease_seq(easer[state], nframes_per_state[state]); cpp11::list state_from = data[state_index[state]]; cpp11::list state_to = data[state_index[state] + 1]; for (R_xlen_t element = 0; element < nelements; ++element) { cpp11::doubles state_from_vec = state_from[element]; cpp11::doubles state_to_vec = state_to[element]; state_from_vec = align_num_elem(state_from_vec, state_to_vec); state_to_vec = align_num_elem(state_to_vec, state_from_vec); for (int currentframe = 0; currentframe < nframes_per_state[state]; ++currentframe) { R_xlen_t res_index = (frame + currentframe) * nelements + element; cpp11::writable::doubles state_vec(state_from_vec.size()); for (R_xlen_t i = 0; i < state_from_vec.size(); ++i) { state_vec[i] = state_from_vec[i] + ease_points[currentframe] * (state_to_vec[i] - state_from_vec[i]); } res[res_index] = state_vec; } } } frame += nframes_per_state[state]; } return res; } [[cpp11::register]] cpp11::strings phase_state_interpolator(cpp11::list_of data, cpp11::data_frame states) { cpp11::integers state_index = states["state"]; cpp11::integers nframes_per_state = states["nframes"]; cpp11::strings easer = states["ease"]; R_xlen_t nelements = data[0].size(); R_xlen_t nstates = states.nrow(); int nframes = std::accumulate(nframes_per_state.begin(), nframes_per_state.end(), 0); int frame = 0; cpp11::writable::strings res(nelements * nframes); for (R_xlen_t state = 0; state < nstates; ++state) { if (easer[state] == "constant") { cpp11::strings state_from = data[state_index[state]]; for (int currentframe = 0; currentframe < nframes_per_state[state]; ++currentframe) { std::string type = currentframe == nframes_per_state[state] - 1 ? "raw" : "static"; R_xlen_t res_index = (frame + currentframe) * nelements; for (R_xlen_t element = 0; element < nelements; ++element) { res[res_index] = type; ++res_index; } } } else { std::vector ease_points = ease_seq(easer[state], nframes_per_state[state]); cpp11::strings state_from = data[state_index[state]]; cpp11::strings state_to = data[state_index[state] + 1]; for (R_xlen_t element = 0; element < nelements; ++element) { std::string type = state_from[element] == "enter" ? "enter" : state_to[element] == "exit" ? "exit" : "transition"; for (int currentframe = 0; currentframe < nframes_per_state[state]; ++currentframe) { R_xlen_t res_index = (frame + currentframe) * nelements + element; res[res_index] = type; } } } frame += nframes_per_state[state]; } return res; } tweenr/src/along.cpp0000644000176200001440000002574114276676722014205 0ustar liggesusers#include #include #include #include #include #include #include #include "utils.h" using namespace cpp11::literals; [[cpp11::register]] cpp11::writable::data_frame numeric_along_interpolator(cpp11::doubles data, cpp11::integers group, cpp11::doubles time, bool history, bool keep_last, cpp11::doubles frames, cpp11::strings ease) { cpp11::writable::doubles tweendata; cpp11::writable::integers tweengroup; cpp11::writable::integers tweenframe; std::string easer = ease[0]; for (int i = 0; i < frames.size(); ++i) { double frame_time = frames[i]; for (R_xlen_t j = 0; j < data.size(); ++j) { bool last = j == data.size() - 1; R_xlen_t jj = last ? j : j + 1; bool before = time[j] <= frame_time; bool after = time[jj] > frame_time; bool same = group[j] == group[jj]; if ((history && same && before) || ((!same || last) && keep_last && before)) { tweendata.push_back(data[j]); tweengroup.push_back(group[j]); tweenframe.push_back(frame_time); } if (same && before == after) { double pos = (frame_time - time[j]) / (time[jj] - time[j]); pos = ease_pos(pos, easer); double interp = data[j] + (data[jj] - data[j]) * pos; tweendata.push_back(interp); tweengroup.push_back(group[j]); tweenframe.push_back(frame_time); } } } return cpp11::writable::data_frame({ "data"_nm = tweendata, "group"_nm = tweengroup, "frame"_nm = tweenframe }); } [[cpp11::register]] cpp11::writable::data_frame colour_along_interpolator(cpp11::doubles_matrix<> data, cpp11::integers group, cpp11::doubles time, bool history, bool keep_last, cpp11::doubles frames, cpp11::strings ease) { cpp11::writable::doubles tweendata1; cpp11::writable::doubles tweendata2; cpp11::writable::doubles tweendata3; cpp11::writable::doubles tweendata4; cpp11::writable::integers tweengroup; cpp11::writable::integers tweenframe; std::string easer = ease[0]; for (int i = 0; i < frames.size(); ++i) { double frame_time = frames[i]; for (R_xlen_t j = 0; j < data.nrow(); ++j) { bool last = j == data.nrow() - 1; R_xlen_t jj = last ? j : j + 1; bool before = time[j] <= frame_time; bool after = time[jj] > frame_time; bool same = group[j] == group[jj]; if ((history && same && before) || ((!same || last) && keep_last && before)) { tweendata1.push_back(data(j, 0)); tweendata2.push_back(data(j, 1)); tweendata3.push_back(data(j, 2)); tweendata4.push_back(data(j, 3)); tweengroup.push_back(group[j]); tweenframe.push_back(frame_time); } if (same && before == after) { double pos = (frame_time - time[j]) / (time[j + 1] - time[j]); pos = ease_pos(pos, easer); tweendata1.push_back(data(j, 0) + (data(j + 1, 0) - data(j, 0)) * pos); tweendata2.push_back(data(j, 1) + (data(j + 1, 1) - data(j, 1)) * pos); tweendata3.push_back(data(j, 2) + (data(j + 1, 2) - data(j, 2)) * pos); tweendata4.push_back(data(j, 3) + (data(j + 1, 3) - data(j, 3)) * pos); tweengroup.push_back(group[j]); tweenframe.push_back(frame_time); } } } return cpp11::writable::data_frame({ "data1"_nm = tweendata1, "data2"_nm = tweendata2, "data3"_nm = tweendata3, "data4"_nm = tweendata4, "group"_nm = tweengroup, "frame"_nm = tweenframe }); } [[cpp11::register]] cpp11::writable::data_frame constant_along_interpolator(cpp11::strings data, cpp11::integers group, cpp11::doubles time, bool history, bool keep_last, cpp11::doubles frames, cpp11::strings ease) { cpp11::writable::strings tweendata; cpp11::writable::integers tweengroup; cpp11::writable::integers tweenframe; std::string easer = ease[0]; for (int i = 0; i < frames.size(); ++i) { double frame_time = frames[i]; for (R_len_t j = 0; j < data.size(); ++j) { bool last = j == data.size() - 1; R_xlen_t jj = last ? j : j + 1; bool before = time[j] <= frame_time; bool after = time[jj] > frame_time; bool same = group[j] == group[jj]; if ((history && same && before) || ((!same || last) && keep_last && before)) { tweendata.push_back(data[j]); tweengroup.push_back(group[j]); tweenframe.push_back(frame_time); } if (same && before == after) { double pos = (frame_time - time[j]) / (time[j + 1] - time[j]); pos = ease_pos(pos, easer); if (pos < 0.5) { tweendata.push_back(data[j]); } else { tweendata.push_back(data[j + 1]); } tweengroup.push_back(group[j]); tweenframe.push_back(frame_time); } } } return cpp11::writable::data_frame({ "data"_nm = tweendata, "group"_nm = tweengroup, "frame"_nm = tweenframe }); } [[cpp11::register]] cpp11::writable::data_frame list_along_interpolator(cpp11::list data, cpp11::integers group, cpp11::doubles time, bool history, bool keep_last, cpp11::doubles frames, cpp11::strings ease) { cpp11::writable::list tweendata; cpp11::writable::integers tweengroup; cpp11::writable::integers tweenframe; std::string easer = ease[0]; for (int i = 0; i < frames.size(); ++i) { double frame_time = frames[i]; for (R_len_t j = 0; j < data.size(); ++j) { bool last = j == data.size() - 1; R_xlen_t jj = last ? j : j + 1; bool before = time[j] <= frame_time; bool after = time[jj] > frame_time; bool same = group[j] == group[jj]; if ((history && same && before) || ((!same || last) && keep_last && before)) { tweendata.push_back(data[j]); tweengroup.push_back(group[j]); tweenframe.push_back(frame_time); } if (same && before == after) { double pos = (frame_time - time[j]) / (time[j + 1] - time[j]); pos = ease_pos(pos, easer); if (pos < 0.5) { tweendata.push_back(data[j]); } else { tweendata.push_back(data[j + 1]); } tweengroup.push_back(group[j]); tweenframe.push_back(frame_time); } } } return cpp11::writable::data_frame({ "data"_nm = tweendata, "group"_nm = tweengroup, "frame"_nm = tweenframe }); } [[cpp11::register]] cpp11::writable::data_frame numlist_along_interpolator(cpp11::list_of data, cpp11::integers group, cpp11::doubles time, bool history, bool keep_last, cpp11::doubles frames, cpp11::strings ease) { cpp11::writable::list tweendata; cpp11::writable::integers tweengroup; cpp11::writable::integers tweenframe; std::string easer = ease[0]; for (int i = 0; i < frames.size(); ++i) { double frame_time = frames[i]; for (R_xlen_t j = 0; j < data.size(); ++j) { bool last = j == data.size() - 1; R_xlen_t jj = last ? j : j + 1; bool before = time[j] <= frame_time; bool after = time[jj] > frame_time; bool same = group[j] == group[jj]; if ((history && same && before) || ((!same || last) && keep_last && before)) { tweendata.push_back(data[j]); tweengroup.push_back(group[j]); tweenframe.push_back(frame_time); } if (same && before == after) { cpp11::doubles state_from_vec = data[j]; cpp11::doubles state_to_vec = data[j + 1]; state_from_vec = align_num_elem(state_from_vec, state_to_vec); state_to_vec = align_num_elem(state_to_vec, state_from_vec); double pos = (frame_time - time[j]) / (time[j + 1] - time[j]); pos = ease_pos(pos, easer); cpp11::writable::doubles state_vec(state_from_vec.size()); for (R_xlen_t k = 0; k < state_from_vec.size(); ++k) { state_vec[k] = state_from_vec[k] + pos * (state_to_vec[k] - state_from_vec[k]); } tweendata.push_back(state_vec); tweengroup.push_back(group[j]); tweenframe.push_back(frame_time); } } } return cpp11::writable::data_frame({ "data"_nm = tweendata, "group"_nm = tweengroup, "frame"_nm = tweenframe }); } [[cpp11::register]] cpp11::writable::data_frame phase_along_interpolator(cpp11::integers group, cpp11::doubles time, bool history, bool keep_last, cpp11::doubles frames) { cpp11::writable::strings tweendata; cpp11::writable::integers tweengroup; cpp11::writable::integers tweenframe; for (int i = 0; i < frames.size(); ++i) { double frame_time = frames[i]; for (R_xlen_t j = 0; j < group.size(); ++j) { bool last = j == group.size() - 1; R_xlen_t jj = last ? j : j + 1; bool before = time[j] <= frame_time; bool after = time[jj] > frame_time; bool same = group[j] == group[jj]; if ((history && same && before) || ((!same || last) && keep_last && before)) { tweendata.push_back("raw"); tweengroup.push_back(group[j]); tweenframe.push_back(frame_time); } if (same && before == after) { tweendata.push_back("transition"); tweengroup.push_back(group[j]); tweenframe.push_back(frame_time); } } } return cpp11::writable::data_frame({ "data"_nm = tweendata, "group"_nm = tweengroup, "frame"_nm = tweenframe }); } tweenr/R/0000755000176200001440000000000014276677051011776 5ustar liggesuserstweenr/R/tween.R0000644000176200001440000001041714067576673013254 0ustar liggesusers#' Create simple tweens #' #' This set of functions can be used to interpolate between single data types, #' i.e. data not part of data.frames but stored in vectors. All functions come #' in two flavours: the standard and a *_t version. The standard reads the data #' as a list of states, each tween matched element-wise from state to state. The #' *_t version uses the transposed representation where each element is a vector #' of states. The standard approach can be used when each tween has the same #' number of states and you want to control the number of point in each state #' transition. The latter is useful when each tween consists of different #' numbers of states and/or you want to specify the total number of points for #' each tween. #' #' @section Difference Between `tween_numeric` and `approx()`: #' `tween_numeric` (and `tween_numeric_t`) is superficially equivalent to #' [stats::approx()], but there are differences. #' [stats::approx()] will create evenly spaced points, at the expense #' of not including the actual points in the input, while the reverse is true #' for `tween_numeric`. Apart from that `tween_numeric` of course supports easing #' functions and is vectorized. #' #' @details #' `tween` and `tween_t` are wrappers around the other functions that tries to guess #' the type of input data and choose the appropriate tween function. Unless you #' have data that could be understood as a colour but is in fact a character #' vector it should be safe to use these wrappers. It is probably safer and more #' verbose to use the explicit functions within package code as they circumvent #' the type inference and checks whether the input data matches the tween #' function. #' #' `tween_numeric` will provide a linear interpolation between the points based on #' the sequence returned by the easing function. `tween_date` and `tween_datetime` #' converts to numeric, produces the tweening, and converts back again. #' `tween_colour` converts colours into Lab and does the interpolation there, #' converting back to sRGB after the tweening is done. `tween_constant` is a #' catchall that converts the input into character and interpolates by switching #' between states halfway through the transition. #' #' The meaning of the `n` and `ease` arguments differs somewhat #' between the standard and *_t versions of the functions. In the standard #' function `n` and `ease` refers to the length and easing function of #' each transition, being recycled if necessary to `length(data) - 1`. In #' the *_t functions `n` and `ease` refers to the total length of each #' tween and the easing function to be applied to all transition for each tween. #' The will both be recycled to `length(data)`. #' #' @param data A list of vectors or a single vector. In the standard functions #' each element in the list must be of equal length; for the *_t functions #' lengths can differ. If a single vector is used it will be eqivalent to using #' `as.list(data)` for the standard functions and `list(data)` for the #' *_t functions. #' #' @param n The number of elements per transition or tween. See details #' #' @param ease The easing function to use for each transition or tween. See #' details. Defaults to `'linear'` #' #' @return A list with an element for each tween. That means that the length of #' the return is equal to the length of the elements in `data` for the #' standard functions and equal to the length of `data` for the *_t #' functions. #' #' @examples #' tween_numeric(list(1:3, 10:8, c(20, 60, 30)), 10) #' #' tween_colour_t(list(colours()[1:4], colours()[1:2], colours()[25:100]), 100) #' #' @export #' tween <- function(data, n, ease = 'linear') { type <- guessType(data) switch( type, numeric = tween_numeric(data, n, ease), date = tween_date(data, n, ease), datetime = tween_datetime(data, n, ease), colour = tween_colour(data, n, ease), tween_constant_t(data, n, ease) ) } #' @rdname tween #' @export tween_t <- function(data, n, ease = 'linear') { type <- guessType(data) switch( type, numeric = tween_numeric_t(data, n, ease), date = tween_date_t(data, n, ease), datetime = tween_datetime_t(data, n, ease), colour = tween_colour_t(data, n, ease), tween_constant_t(data, n, ease) ) } guessType <- function(data) { data <- unlist(data) col_classes(list(data)) } tweenr/R/tween_states.R0000644000176200001440000001101114067576055014620 0ustar liggesusers#' Tween a list of data.frames representing states #' #' This function is intended to create smooth transitions between states of #' data. States are defined as full data.frames or data.frames containing only #' the columns with change. Each state can have a defined period of pause, the #' transition length between each states can be defined as well as the easing #' function. #' #' @param data A list of data.frames. Each data.frame must contain the same #' number of rows, but only the first data.frame needs to contain all columns. #' Subsequent data.frames need only contain the columns that shows change. #' #' @param tweenlength The lengths of the transitions between each state. #' #' @param statelength The length of the pause at each state. #' #' @param ease The easing functions to use for the transitions. See details. #' #' @param nframes The number of frames to generate. The actual number of frames #' might end up being higher depending on the regularity of `tweenlength` #' and `statelength`. #' #' @return A data.frame with the same columns as the first data.frame in #' `data`, but replicated `nframes` times. An additional column called #' `.frame` will be added giving the frame number. #' #' @family data.frame tween #' #' @importFrom vctrs vec_cbind #' #' @examples #' data1 <- data.frame( #' x = 1:20, #' y = 0, #' colour = 'forestgreen', #' stringsAsFactors = FALSE #' ) #' data2 <- data1 #' data2$x <- 20:1 #' data2$y <- 1 #' #' data <- tween_states(list(data1, data2), 3, 1, 'cubic-in-out', 100) #' #' @export #' tween_states <- function(data, tweenlength, statelength, ease, nframes) { if (!(is.list(data) && all(sapply(data, is.data.frame)))) { stop('data must be a list of data.frames') } if (length(data) == 1) { stop('data must contain multiple states') } if (length(unique(sapply(data, nrow))) != 1) { stop('All elements in data must have the same number of rows') } data <- lapply(data, function(d) { d$.phase <- 'raw' d }) origNames <- names(data[[1]]) if (!is.list(ease)) ease <- as.list(ease) allNames <- unlist(lapply(data, names)) if (!all(allNames %in% origNames)) { stop('All columns must be specified in the original data.frame') } nstates <- length(data) tweenlength <- rep(tweenlength, nstates)[seq_len(nstates - 1)] statelength <- rep(statelength, nstates)[seq_len(nstates)] ease <- rep(ease, nstates)[seq_len(nstates - 1)] pauseIndex <- which(rep(c(TRUE, FALSE), length.out = 2*nstates - 1)) tweenIndex <- which(rep(c(FALSE, TRUE), length.out = 2*nstates - 1)) statesOrder <- order(c(pauseIndex, tweenIndex)) states <- data.frame( length = c(statelength, tweenlength)[statesOrder], nframes = NA_integer_, state = NA_integer_, stringsAsFactors = FALSE ) states$state <- rep(seq_len(nstates) - 1L, each = 2, length.out = nrow(states)) states$ease <- lapply(c(rep(list('constant'), nstates), ease)[statesOrder], function(e) { structure(rep(e, length.out = length(origNames)), names = origNames) }) fullLength <- sum(states$length) framelength <- fullLength/nframes states$nframes <- as.integer(round(states$length / framelength)) nframes <- sum(states$nframes) framelength <- fullLength/nframes data <- Reduce(function(l, r) { extraCols <- !names(l[[length(l)]]) %in% names(r); append(l, list(vec_cbind(r, l[[length(l)]][, extraCols]))) }, data[-1], data[1]) colClasses <- col_classes(data[[1]]) tweendata <- lapply(names(data[[1]]), function(name) { d <- lapply(data, `[[`, i = name) d_states <- states d_states$ease <- vapply(d_states$ease, `[`, character(1), i = name) switch( colClasses[name], numeric = interpolate_numeric_state(d, d_states), logical = interpolate_logical_state(d, d_states), factor = interpolate_factor_state(d, d_states), character = interpolate_character_state(d, d_states), colour = interpolate_colour_state(d, d_states), date = interpolate_date_state(d, d_states), datetime = interpolate_datetime_state(d, d_states), constant = interpolate_constant_state(d, d_states), numlist = interpolate_numlist_state(d, d_states), list = interpolate_list_state(d, d_states), phase = get_phase_state(d, d_states) ) }) tweendata <- structure(tweendata, names = names(data[[1]]), row.names = seq_along(tweendata[[1]]), class = 'data.frame') tweendata$.id <- rep(seq_len(nrow(data[[1]])), each = nframes) tweendata$.frame <- rep(seq_len(nframes), each = nrow(data[[1]])) attr(tweendata, 'framelength') <- framelength tweendata } tweenr/R/gen_keyframe.R0000644000176200001440000002055414276701222014547 0ustar liggesusers#' Generator for keyframe based tweening #' #' This is a generator version of [tween_state()] and its utility functions. It #' returns a generator that can be used with [get_frame()] and #' [get_raw_frames()] to extract frames for a specific time point scaled between #' 0 and 1. #' #' @param keyframe A data frame to use as a keyframe state #' @inheritParams tween_state #' @param pause The length of the pause at the current keyframe #' @param length The length of the transition #' #' @return A `keyframe_generator` object #' #' @family Other generators #' #' @importFrom vctrs vec_cbind #' @export #' #' @examples #' df1 <- data.frame( #' country = c('Denmark', 'Sweden', 'Norway'), #' population = c(5e6, 10e6, 3.5e6) #' ) #' df2 <- data.frame( #' country = c('Denmark', 'Sweden', 'Norway', 'Finland'), #' population = c(6e6, 10.5e6, 4e6, 3e6) #' ) #' df3 <- data.frame( #' country = c('Denmark', 'Norway'), #' population = c(10e6, 6e6) #' ) #' to_zero <- function(x) { #' x$population <- 0 #' x #' } #' gen <- gen_keyframe(df1, 10) %>% #' add_keyframe(df2, 'cubic-in-out', 35, id = country, enter = to_zero) %>% #' add_pause(10) %>% #' add_keyframe(df3, 'cubic-in-out', 35, id = country, enter = to_zero, #' exit = to_zero) %>% #' add_pause(10) #' #' get_frame(gen, 0.25) gen_keyframe <- function(keyframe = NULL, pause = 0) { if (is.null(keyframe)) { keyframe <- data.frame() } if (!is.data.frame(keyframe)) { stop("`start` must be `NULL` or a data frame", call. = FALSE) } keyframe$.phase <- rep_len(factor("raw", levels = PHASE_LEVELS), nrow(keyframe)) class(keyframe) <- c(c("keyframe_generator", "frame_generator"), class(keyframe)) generator_settings(keyframe) <- list( keyframes = list(list(keyframe, keyframe)), frame_time = c(0, pause), ease_type = list(), col_types = col_classes(keyframe) ) keyframe } #' @rdname gen_keyframe #' @export add_pause <- function(.data, pause = 0) { cur_frame_time <- frame_times(.data) if (has_last_pause(.data)) { last(cur_frame_time) <- last(cur_frame_time) + pause } else { cur_frame_time <- c(cur_frame_time, pause + last(cur_frame_time)) } frame_times(.data) <- cur_frame_time .data } #' @rdname gen_keyframe #' @importFrom vctrs vec_cbind vec_rbind #' @importFrom rlang enquo #' @export add_keyframe <- function(.data, keyframe, ease, length, id = NULL, enter = NULL, exit = NULL) { id <- enquo(id) .data <- prepare_keyframes(.data, keyframe) from <- last(keyframes(.data))[[2]] keyframe$.phase = rep_len(factor("raw", levels = PHASE_LEVELS), nrow(keyframe)) full <- vec_rbind(from, keyframe) full <- .complete_states( full[seq_len(nrow(from)), ], full[-seq_len(nrow(from)), ], id, enter, exit, 0 ) last(keyframes(.data))[[3]] <- full$from keyframes(.data) <- c(keyframes(.data), list(list(full$to, keyframe))) frame_times(.data) <- c(frame_times(.data), length + last(frame_times(.data))) ease_type(.data) <- c(ease_type(.data), list(ease)) .data <- structure( vec_rbind(.data, keyframe), class = class(.data), generator_settings = generator_settings(.data) ) col_types(.data) <- col_classes(.data) .data } #' @export get_frame.keyframe_generator <- function(generator, at, ...) { # clamp between 0 and 1 at <- min(max(at, 0), 1) ft <- frame_times(generator) # normalise to generator time at <- at * last(ft) # Find start stage stage <- max(first(which(at <= ft)) - 1, 1) if (at == 0) stage <- stage + 1 key <- (stage + 1) %/% 2 # if in pause, return the unaltered data (with "static" phase) if (stage %% 2 == 1 && !at %in% ft) { frame <- keyframes(generator)[[key]][[2]] frame$.phase <- factor("static", levels = PHASE_LEVELS) return(frame) } ease <- ease_type(generator)[[key]] pos <- (at - ft[stage]) / (ft[stage + 1] - ft[stage]) frame_at(keyframes(generator)[[key]][[3]], keyframes(generator)[[key + 1]][[1]], pos, ease, col_types(generator)) } #' @export #' @importFrom vctrs vec_rbind get_raw_frames.keyframe_generator <- function(generator, at, before = 0, after = 0, ...) { # clamp between 0 and 1 before <- min(max(at - before, 0), 1) after <- min(max(at + after, 0), 1) at <- min(max(at, 0), 1) ft <- frame_times(generator) # normalise to generator time at <- at * last(ft) before <- before * last(ft) after <- after * last(ft) # Find before and after before <- which(ft >= before & ft < at) before <- unique((before + 1) %/% 2) after <- which(ft > at & ft <= after) after <- unique((after + 1) %/% 2) list( before = vec_rbind(lapply(keyframes(generator)[before], `[[`, 2)), after = vec_rbind(lapply(keyframes(generator)[after], `[[`, 2)) ) } #' @export convert_generator.keyframe_generator <- function(x) { data <- keyframes(x) outer_id <- rep(seq_along(data), lengths(data)) data <- unlist(data, recursive = FALSE) inner_id <- rep(seq_along(data), vapply(data, nrow, integer(1))) data <- vec_rbind(data) settings <- list( attributes = attributes(x), data = data.frame(x), inner_id = inner_id, outer_id = outer_id, converter = function(x, settings) { data <- settings$data attributes(data) <- settings$attributes keyframes(data) <- split(split(data.frame(x), settings$inner_id), settings$outer_id) data } ) list(data = data, settings = settings) } # Utils ------------------------------------------------------------------- #' Prepare keyframes for generator #' #' @param .data A keyframe generator #' @param keyframe A keyframe to add #' #' @return A valid keyframe generator #' #' @export #' @keywords internal #' prepare_keyframes <- function(.data, keyframe) { if (!is.data.frame(keyframe)) { stop("`keyframe` must be a data frame", call. = FALSE) } if (!is_keyframe_generator(.data)) { stop("`.data` must be a keyframe generator", call. = FALSE) } if (is_keyframe_placeholder(.data)) { new_start <- generator_settings(keyframe[0, ]) frame_times(new_start) <- frame_times(.data) .data <- new_start } if (!has_last_pause(.data)) { .data <- add_pause(.data, 0) } .data } is_keyframe_generator <- function(x) inherits(x, "keyframe_generator") is_keyframe_placeholder <- function(x) isTRUE(names(x) == ".phase") && nrow(x) == 0 #' @rdname gen_internal #' @export keyframes <- function(x) generator_settings(x)$keyframes #' @rdname gen_internal #' @export `keyframes<-` <- function(x, value) { generator_settings(x)$keyframes <- value x } #' @rdname gen_internal #' @export frame_times <- function(x) generator_settings(x)$frame_time #' @rdname gen_internal #' @export `frame_times<-` <- function(x, value) { generator_settings(x)$frame_time <- value x } has_last_pause <- function(x) (length(frame_times(x)) %% 2) == 0 get_phase_at <- function(from, to) { factor( ifelse(from == "enter", "enter", ifelse(to == "exit", "exit", "transition")), levels = PHASE_LEVELS ) } frame_at <- function(from, to, at, ease, classes) { if (at == 0) return(from) if (at == 1) return(to) at <- rep_len(at, nrow(from)) ease <- rep_len(ease, ncol(from)) data <- lapply(seq_along(classes), function(i) { switch( classes[i], numeric = interpolate_numeric_at(from[[i]], to[[i]], at, ease[i]), logical = interpolate_logical_at(from[[i]], to[[i]], at, ease[i]), factor = interpolate_factor_at(from[[i]], to[[i]], at, ease[i]), character = interpolate_character_at(from[[i]], to[[i]], at, ease[i]), colour = interpolate_colour_at(from[[i]], to[[i]], at, ease[i]), date = interpolate_date_at(from[[i]], to[[i]], at, ease[i]), datetime = interpolate_datetime_at(from[[i]], to[[i]], at, ease[i]), constant = interpolate_constant_at(from[[i]], to[[i]], at, ease[i]), numlist = interpolate_numlist_at(from[[i]], to[[i]], at, ease[i]), list = interpolate_list_at(from[[i]], to[[i]], at, ease[i]), phase = get_phase_at(from[[i]], to[[i]]), interpolate_custom_at(from[[i]], to[[i]], at, ease[i]) ) }) structure(data, names = names(from), row.names = .set_row_names(length(data[[1]])), class = 'data.frame') } #' Fallback for keyframe vector support #' #' @param from,to vectors to interpolate between #' @param at value between 0 and 1 defining the point #' @param ease the easing function to use #' #' @export #' @keywords internal interpolate_custom_at <- function(from, to, at, ease) { UseMethod('interpolate_custom_at') } tweenr/R/gen_components.R0000644000176200001440000001055514106444737015140 0ustar liggesusers#' Generator for tweening components separately from each other #' #' This is a generator versions of [tween_components()]. It returns a generator #' that can be used with [get_frame()] and [get_raw_frames()] to extract frames #' for a specific time point scaled between 0 and 1. #' #' @inheritParams tween_components #' #' @return A `component_generator` object #' #' @family Other generators #' #' @export #' @importFrom rlang eval_tidy enquo quo_is_null #' #' @examples #' from_zero <- function(x) {x$x <- 0; x} #' #' data <- data.frame( #' x = c(1, 2, 2, 1, 2, 2), #' y = c(1, 2, 2, 2, 1, 1), #' time = c(1, 4, 8, 4, 8, 10), #' id = c(1, 1, 1, 2, 2, 2) #' ) #' #' gen <- gen_components(data, 'cubic-in-out', time = time, id = id, #' enter = from_zero, enter_length = 4) #' #' get_frame(gen, 0.3) gen_components <- function(.data, ease, nframes, time, id = NULL, range = NULL, enter = NULL, exit = NULL, enter_length = 0, exit_length = 0) { time <- enquo(time) time <- eval_tidy(time, .data) id <- enquo(id) id <- if (quo_is_null(id)) rep(1, nrow(.data)) else eval_tidy(id, .data) if (is.null(enter_length)) enter_length <- 0 if (is.null(exit_length)) exit_length <- 0 .data$.phase <- NULL if (length(ease) == 1) ease <- rep(ease, ncol(.data)) if (length(ease) == ncol(.data)) { ease <- c(ease, 'linear') # To account for .phase column } else { stop('Ease must be either a single string or one for each column', call. = FALSE) } .data$.phase <- rep_len(factor("raw", levels = PHASE_LEVELS), nrow(.data)) class(.data) <- c(c("component_generator", "frame_generator"), class(.data)) gen_data <- .complete_components(.data, time, id, enter, exit, enter_length, exit_length) time <- gen_data$.time id <- gen_data$.id gen_data$.time <- NULL gen_data$.id <- NULL d_order <- order(id, time) if (is.null(range)) range <- range(time) if (diff(range) == 0) stop('range cannot be 0', call. = FALSE) generator_settings(.data) <- list( data = gen_data[d_order, ], id = id[d_order], time = time[d_order], range = range, ease_type = ease, col_types = col_classes(.data) ) .data } #' @export get_frame.component_generator <- function(generator, at, ...) { d <- generator_settings(generator) # clamp between 0 and 1 at <- min(max(at, 0), 1) range <- d$range # normalise to range at <- (range[2] - range[1]) * at + range[1] data <- gen_data(generator) ease <- ease_type(generator) type <- col_types(generator) frame <- lapply(seq_along(data), function(i) { col <- data[[i]] e <- rep_len(ease[[i]], length(col)) switch( type[i], numeric = interpolate_numeric_element_at(col, d$id, d$time, at, e), logical = interpolate_logical_element_at(col, d$id, d$time, at, e), factor = interpolate_factor_element_at(col, d$id, d$time, at, e), character = interpolate_character_element_at(col, d$id, d$time, at, e), colour = interpolate_colour_element_at(col, d$id, d$time, at, e), date = interpolate_date_element_at(col, d$id, d$time, at, e), datetime = interpolate_datetime_element_at(col, d$id, d$time, at, e), constant = interpolate_constant_element_at(col, d$id, d$time, at, e), numlist = interpolate_numlist_element_at(col, d$id, d$time, at, e), list = interpolate_list_element_at(col, d$id, d$time, at, e), phase = get_phase_element_at(col, d$id, d$time, at, e) ) }) structure(frame, names = names(data), row.names = .set_row_names(length(frame[[1]])), class = 'data.frame') } #' @export get_raw_frames.component_generator <- function(generator, at, before = 0, after = 0, ...) { d <- generator_settings(generator) # clamp between 0 and 1 before <- min(max(at - before, 0), 1) after <- min(max(at + after, 0), 1) at <- min(max(at, 0), 1) range <- d$range # normalise to generator time at <- (range[2] - range[1]) * at + range[1] before <- (range[2] - range[1]) * before + range[1] after <- (range[2] - range[1]) * after + range[1] # Find before and after before <- d$time >= before & d$time < at after <- d$time > at & d$time <= after raw <- d$data$.phase == 'raw' list( before = d$data[before & raw, , drop = FALSE], after = d$data[after & raw, , drop = FALSE] ) } #' @export convert_generator.component_generator <- convert_generator.along_generator tweenr/R/tween_colour.R0000644000176200001440000000141714067576055014631 0ustar liggesusers#' @rdname tween #' #' @export tween_colour <- function(data, n, ease = 'linear') { data <- as.list(data) prepData <- prepareTween(data, n, ease) tweendata <- do.call(interpolate_colour_state, prepData) unname(split(tweendata, rep(seq_along(data[[1]]), length.out = length(tweendata)))) } #' @rdname tween #' #' @export tween_color <- tween_colour #' @rdname tween #' #' @export tween_colour_t <- function(data, n, ease = 'linear') { if (!is.list(data)) { data <- list(data) } prepData <- prepareTweenTranspose(data, n, ease) tweendata <- do.call(interpolate_colour_state, prepData) unname(split(tweendata, rep(seq_along(data), rep(n, length.out = length(data))))) } #' @rdname tween #' #' @export tween_color_t <- tween_colour_t tweenr/R/get_frame.R0000644000176200001440000000226414067576055014056 0ustar liggesusers#' Extract a frame from a generator #' #' Using the generators in tweenr you can avoid calculating all needed frames up #' front, which can be prohibitive in memory. With a generator you can use #' `get_frame()` to extract any frame at a fractional location between 0 and 1 #' one by one as you need them. You can further get all raw data before and/or #' after a given point in time using `get_raw_frames()`. #' #' @param generator A `frame_generator` object #' @param at A scalar numeric between 0 and 1 #' @param before,after Scalar numerics that define the time before and after #' `at` to search for raw data #' @param ... Arguments passed on to methods #' #' @export #' #' @examples #' data <- data.frame( #' x = c(1, 2, 2, 1, 2, 2), #' y = c(1, 2, 2, 2, 1, 1), #' time = c(1, 4, 8, 4, 8, 10), #' id = c(1, 1, 1, 2, 2, 2) #' ) #' #' gen <- gen_components(data, 'cubic-in-out', time = time, id = id) #' #' get_frame(gen, 0.3) #' #' get_raw_frames(gen, 0.5, before = 0.5, after = 0.2) get_frame <- function(generator, at, ...) { UseMethod("get_frame") } #' @rdname get_frame #' @export get_raw_frames <- function(generator, at, before = 0, after = 0, ...) { UseMethod("get_raw_frames") } tweenr/R/tween_appear.R0000644000176200001440000000373514067576055014603 0ustar liggesusers#' Tween a data.frame of appearances #' #' This function is intended for use when you have a data.frame of events at #' different time points. This could be the appearance of an observation for #' example. This function replicates your data `nframes` times and #' calculates the duration of each frame. At each frame each row is #' assigned an age based on the progression of frames and the entry point of in #' time for that row. A negative age means that the row has not appeared yet. #' #' @param data A data.frame to tween #' #' @param time The name of the column that holds the time dimension. This does #' not need to hold time data in the strictest sence - any numerical type will #' do #' #' @param timerange The range of time to create the tween for. If missing it #' will defaults to the range of the time column #' #' @param nframes The number of frames to create for the tween. If missing it #' will create a frame for each full unit in `timerange` (e.g. #' `timerange = c(1, 10)` will give `nframes = 10`) #' #' @return A data.frame as `data` but repeated `nframes` times and #' with the additional columns `.age` and `.frame` #' #' @family data.frame tween #' #' @importFrom vctrs vec_rbind #' #' @examples #' data <- data.frame( #' x = rnorm(100), #' y = rnorm(100), #' time = sample(50, 100, replace = TRUE) #' ) #' #' data <- tween_appear(data, 'time', nframes = 200) #' #' @export #' tween_appear <- function(data, time, timerange, nframes) { if (missing(timerange) || is.null(timerange)) { timerange <- range(data[[time]]) } if (missing(nframes) || is.null(nframes)) { nframes <- ceiling(diff(timerange) + 1) } framelength <- diff(timerange) / nframes frametimes <- seq(timerange[1], timerange[2], length.out = nframes) tweendata <- lapply(seq_along(frametimes), function(i) { data$.age <- frametimes[i] - data[[time]] data$.frame <- i data }) tweendata <- do.call(vec_rbind, tweendata) attr(tweendata, 'framelength') <- framelength tweendata } tweenr/R/gen_at.R0000644000176200001440000000143014067576055013354 0ustar liggesusers#' Generator for interpolating between two data frames #' #' This is a generator version of [tween_at()] with the additional functionality #' of supporting enter and exit functions. It returns a generator that can be #' used with [get_frame()] and [get_raw_frames()] to extract frames for a #' specific time point scaled between 0 and 1. #' #' @inheritParams tween_at #' @inheritParams tween_state #' #' @return A `keyframe_generator` object #' #' @family Other generators #' #' @export #' #' @examples #' gen <- gen_at(mtcars[1:6, ], mtcars[6:1, ], 'cubic-in-out') #' #' get_frame(gen, 0.3) gen_at <- function(from, to, ease, id = NULL, enter = NULL, exit = NULL) { gen <- gen_keyframe(from, 0) add_keyframe(gen, to, ease = ease, length = 1, id = {{ id }}, enter = enter, exit = exit) } tweenr/R/tween_along.R0000644000176200001440000001004714277360337014422 0ustar liggesusers#' Interpolate data along a given dimension #' #' This tween takes groups of rows along with the time for each row and #' calculates the exact value at each at each frame. Further it allows for #' keeping the subsequent raw data from previous frame as well as letting the #' final row linger beyond its time. It especially useful for data that should #' be visualised as lines that are drawn along the x-axis, but can of course #' also be used for other dimensions as well (even dimensions not corresponding #' to any axis). #' #' @inheritParams tween_components #' @param along The "time" point for each row #' @param history Should earlier datapoints be kept in subsequent frames #' @param keep_last Should the last point of each id be kept beyond its time #' #' @return A data.frame with the same columns as `.data` along with `.id` giving #' the component id, `.phase` giving the state of each component in each frame, #' and `.frame` giving the frame membership of each row. #' #' @family data.frame tween #' #' @importFrom rlang enquo quo_is_null eval_tidy is_integerish #' @export tween_along <- function(.data, ease, nframes, along, id = NULL, range = NULL, history = TRUE, keep_last = FALSE) { along <- enquo(along) along <- as.numeric(eval_tidy(along, .data)) id <- enquo(id) id <- if (quo_is_null(id)) rep(1, nrow(.data)) else eval_tidy(id, .data) .data <- .complete_along(.data, along, id) if (length(ease) == 1) ease <- rep(ease, ncol(.data) - 3) if (length(ease) == ncol(.data) - 3) { ease <- c(ease, 'linear', 'linear', 'linear') # To account for .phase and .id columns } else { stop('Ease must be either a single string or one for each column', call. = FALSE) } if (!is_integerish(nframes, 1L)) { stop("`nframes` must be a single count", call. = FALSE) } timerange <- if (is.null(range)) range(.data$.time) else range timerange <- as.numeric(timerange) if (diff(timerange) == 0) stop('range must have a length', call. = FALSE) framelength <- diff(timerange) / (nframes - 1) frame <- 1 + (nframes - 1) * (.data$.time - timerange[1]) / diff(timerange) frames <- seq_len(nframes) groups <- unique(.data$.id) group <- match(.data$.id, groups) colClasses <- col_classes(.data) tweendata <- lapply(seq_along(.data), function(i) { d <- .data[[i]] e <- ease[i] switch( colClasses[i], numeric = interpolate_numeric_along(d, group, frame, frames, e, history, keep_last), logical = interpolate_logical_along(d, group, frame, frames, e, history, keep_last), factor = interpolate_factor_along(d, group, frame, frames, e, history, keep_last), character = interpolate_character_along(d, group, frame, frames, e, history, keep_last), colour = interpolate_colour_along(d, group, frame, frames, e, history, keep_last), date = interpolate_date_along(d, group, frame, frames, e, history, keep_last), datetime = interpolate_datetime_along(d, group, frame, frames, e, history, keep_last), constant = interpolate_constant_along(d, group, frame, frames, e, history, keep_last), numlist = interpolate_numlist_along(d, group, frame, frames, e, history, keep_last), list = interpolate_list_along(d, group, frame, frames, e, history, keep_last), phase = get_phase_along(group, frame, frames, history, keep_last) ) }) tweenInfo <- tweendata[[1]][, c('group', 'frame')] tweendata <- lapply(tweendata, `[[`, i = 'data') tweendata <- structure(tweendata, names = names(.data), row.names = seq_along(tweendata[[1]]), class = 'data.frame') tweendata$.frame <- tweenInfo$frame tweendata$.id <- tweenInfo$group attr(tweendata, 'framelength') <- framelength tweendata[order(tweendata$.frame, tweendata$.id), , drop = FALSE] } .complete_along <- function(data, along, id) { if (length(along) != nrow(data) || length(id) != nrow(data)) { stop('along and id must be the same length as the number of rows in data', call. = FALSE) } data <- data[order(id), , drop = FALSE] along <- along[order(id)] id <- sort(id) data$.id <- id data$.phase <- 'raw' data$.time <- along data } tweenr/R/gen.R0000644000176200001440000000422014106445677012667 0ustar liggesusers#' Generator internals #' #' @param x A generator object #' #' @return Various data #' #' @name gen_internal #' @rdname gen_internal #' #' @keywords internal #' NULL #' @rdname gen_internal #' @export PHASE_LEVELS <- c("raw", "static", "transition", "enter", "exit") #' @rdname gen_internal #' @export is_generator <- function(x) inherits(x, "frame_generator") #' @rdname gen_internal #' @export generator_settings <- function(x) attr(x, "generator_settings") #' @rdname gen_internal #' @export `generator_settings<-` <- function(x, value) { attr(x, "generator_settings") <- value x } #' @rdname gen_internal #' @export ease_type <- function(x) generator_settings(x)$ease_type #' @rdname gen_internal #' @export `ease_type<-` <- function(x, value) { generator_settings(x)$ease_type <- value x } #' @rdname gen_internal #' @export col_types <- function(x) generator_settings(x)$col_types #' @rdname gen_internal #' @export `col_types<-` <- function(x, value) { generator_settings(x)$col_types <- value x } #' @rdname gen_internal #' @export gen_data <- function(x) generator_settings(x)$data #' @rdname gen_internal #' @export `gen_data<-` <- function(x, value) { generator_settings(x)$data <- value x } convert_generator <- function(x) { UseMethod('convert_generator') } #' @export convert_generator.default <- function(x) { list(data = x, settings = list(converter = function(x, ...) x)) } #' @rdname gen_internal #' @export gen_to_data_frame <- function(...) { data <- lapply(list(...), convert_generator) settings <- lapply(data, `[[`, 'settings') data <- lapply(data, `[[`, 'data') id <- rep(seq_along(data), vapply(data, nrow, integer(1))) data <- vec_rbind(data) attr(data, "generator_id") <- id attr(data, "generator_info") <- settings class(data) <- c("generator_df", class(data)) data } #' @rdname gen_internal #' @export data_frame_to_gen <- function(x) { if (!inherits(x, "generator_df")) { stop('This does not appear to be a generator in data frame disguise') } info <- attr(x, "generator_info") data <- split(data.frame(x), attr(x, "generator_id")) Map(function(data, info) { info$converter(data, info) }) } tweenr/R/tween_state.R0000644000176200001440000003640114305574357014445 0ustar liggesusers#' Compose tweening between states #' #' The `tween_state()` is a counterpart to `tween_states()` that is aimed at #' letting you gradually build up a scene by composing state changes one by one. #' This setup lets you take more control over each state change and allows you #' to work with datasets with uneven number of rows, flexibly specifying what #' should happen with entering and exiting data. `keep_state()` is a simple #' helper for letting you pause at a state. `open_state()` is a shortcut from #' tweening from an empty dataset with a given `enter()` function while #' `close_state()` is the same but will instead tween into an empty dataset with #' a given `exit()` function. #' #' @param .data A data.frame to start from. If `.data` is the result of a prior #' tween, only the last frame will be used for the tween. The new tween will #' then be added to the prior tween #' #' @param to A data.frame to end at. It must contain the same columns as .data #' (exluding `.frame`) #' #' @param ease The easing function to use. Either a single string or one for #' each column in the data set. #' #' @param nframes The number of frames to calculate for the tween #' #' @param id The column to match observations on. If `NULL` observations will be #' matched by position. See the *Match, Enter, and Exit* section for more #' information. #' #' @param enter,exit functions that calculate a start state for new observations #' that appear in `to` or an end state for observations that are not present in #' `to`. If `NULL` the new/old observations will not be part of the tween. The #' function gets a data.frame with either the start state of the exiting #' observations, or the end state of the entering observations and must return #' a modified version of that data.frame. See the *Match, Enter, and Exit* #' section for more information. #' #' @return A data.frame containing all the intermediary states in the tween, #' each state will be enumerated by the `.frame` column #' #' @section Match, Enter, and Exit: #' When there are discrepancies between the two states to tweeen between you #' need a way to resolve the discrepancy before calculating the intermediary #' states. With discrepancies we mean that some data points are present in the #' start state and not in the end state, and/or some are present in the end #' state but not in the start state. A simple example is that the start state #' contains 100 rows and the end state contains 70. There are 30 missing rows #' that we need to do something about before we can calculate the tween. #' #' **Making pairs** #' The first question to answer is "How do we know which observations are #' disappearing (*exiting*) and/or appearing (*entering*)?". This is done with #' the `id` argument which should give a column name to match rows between the #' two states on. If `id = NULL` the rows will be matched by position (in the #' above example the last 30 rows in the start state will be entering). The `id` #' column must only contain unique values in order to work. #' #' **Making up states** #' Once the rows in each state has been paired you'll end up with three sets of #' data. One containing rows that is present in both the start and end state, #' one containing rows only present in the start state, and one only containing #' rows present in the end state. The first group is easy - here you just tween #' between each rows - but for the other two we'll need some state to start or #' end the tween with. This is really the purpose of the `enter` and `exit` #' functions. They take a data frame containing the subset of data that has not #' been matched and must return a new data frame giving the state that these #' rows must be tweened from/into. A simple example could be an `enter` function #' that sets the variable giving the opacity in the plot to 0 - this will make #' the new points fade into view during the transition. #' #' **Ignoring discrepancies** #' The default values for `enter` and `exit` is `NULL`. This value indicate that #' non-matching rows should simply be ignored for the transition and simply #' appear in the last frame of the tween. This is the default. #' #' @importFrom rlang enquo #' @importFrom vctrs vec_rbind vec_cbind #' @export #' #' @examples #' data1 <- data.frame( #' x = 1:20, #' y = 0, #' colour = 'forestgreen', #' stringsAsFactors = FALSE #' ) #' data2 <- data1 #' data2$x <- 20:1 #' data2$y <- 1 #' #' data <- data1 %>% #' tween_state(data2, 'linear', 50) %>% #' keep_state(20) %>% #' tween_state(data1, 'bounce-out', 50) #' #' # Using enter and exit (made up numbers) #' df1 <- data.frame( #' country = c('Denmark', 'Sweden', 'Norway'), #' population = c(5e6, 10e6, 3.5e6) #' ) #' df2 <- data.frame( #' country = c('Denmark', 'Sweden', 'Norway', 'Finland'), #' population = c(6e6, 10.5e6, 4e6, 3e6) #' ) #' df3 <- data.frame( #' country = c('Denmark', 'Norway'), #' population = c(10e6, 6e6) #' ) #' to_zero <- function(x) { #' x$population <- 0 #' x #' } #' pop_devel <- df1 %>% #' tween_state(df2, 'cubic-in-out', 50, id = country, enter = to_zero) %>% #' tween_state(df3, 'cubic-in-out', 50, id = country, enter = to_zero, #' exit = to_zero) #' tween_state <- function(.data, to, ease, nframes, id = NULL, enter = NULL, exit = NULL) { .data[] <- lapply(.data, fix_old_mapped_discrete) to[] <- lapply(to, fix_old_mapped_discrete) from <- .get_last_frame(.data) from$.phase <- rep('raw', length.out = nrow(from)) to$.phase <- rep('raw', length.out = nrow(to)) to$.id <- rep(NA_integer_, length.out = nrow(to)) id <- enquo(id) if (.has_frames(.data)) nframes <- nframes + 1 if (!setequal(names(from), names(to))) { stop('from and to must have identical columns', call. = FALSE) } if (nrow(from) == 0 && nrow(to) == 0) { return(.with_prior_frames(.data, from, nframes)) } to <- to[, match(names(from), names(to)), drop = FALSE] if (length(ease) == 1) ease <- rep(ease, ncol(from) - 2) if (length(ease) == ncol(from) - 2) { ease <- c(ease, 'linear', 'linear') # To account for .phase and .id columns } else { stop('Ease must be either a single string or one for each column', call. = FALSE) } if (!is_integerish(nframes, 1L)) { stop("`nframes` must be a single count", call. = FALSE) } classes <- if (nrow(from) == 0) col_classes(to) else col_classes(from) if (nrow(from) > 0 && nrow(to) > 0) { to_classes <- col_classes(to) mismatch <- to_classes != classes for (i in which(mismatch)) { all_na_to <- all(is.na(to[[i]])) all_na_from <- all(is.na(from[[i]])) if (all_na_from) { storage.mode(from[[i]]) <- storage.mode(to[[i]]) } else if (all_na_to) { storage.mode(to[[i]]) <- storage.mode(from[[i]]) } else { stop('The ', names(to)[i], 'column differs in type between the two inputs', call. = FALSE) } } } full_set <- .complete_states(from, to, id, enter, exit, .max_id(.data)) to$.id <- full_set$orig_to tweendata <- lapply(seq_along(classes), function(i) { d <- list(full_set$from[[i]], full_set$to[[i]]) state <- simple_state(as.integer(nframes), ease[i]) switch( classes[i], numeric = interpolate_numeric_state(d, state), logical = interpolate_logical_state(d, state), factor = interpolate_factor_state(d, state), character = interpolate_character_state(d, state), colour = interpolate_colour_state(d, state), date = interpolate_date_state(d, state), datetime = interpolate_datetime_state(d, state), constant = interpolate_constant_state(d, state), numlist = interpolate_numlist_state(d, state), list = interpolate_list_state(d, state), phase = get_phase_state(d, state) ) }) tweendata <- structure(tweendata, names = names(full_set$from), row.names = seq_along(tweendata[[1]]), class = 'data.frame') tweendata$.frame <- rep(seq_len(nframes - 1), each = nrow(full_set$from)) tweendata <- vec_rbind( if (nframes > 1) vec_cbind(from, .frame = rep(1, nrow(from))) else NULL, tweendata[tweendata$.frame != 1, , drop = FALSE], vec_cbind(to, .frame = rep(nframes, nrow(to))) ) .with_prior_frames(.data, tweendata, nframes) } #' @rdname tween_state #' @export keep_state <- function(.data, nframes) { state <- .get_last_frame(.data) state$.phase <- rep('raw', length.out = nrow(state)) if (.has_frames(.data)) nframes <- nframes + 1 if (nrow(state) == 0) { return(.with_prior_frames(.data, state, nframes)) } states <- state[rep(seq_len(nrow(state)), nframes), , drop = FALSE] states$.phase[seq_len(nrow(state) * (nframes - 1))] <- 'static' states$.frame <- rep(seq_len(nframes), each = nrow(state)) .with_prior_frames(.data, states, nframes) } #' @rdname tween_state #' @export open_state <- function(.data, ease, nframes, enter) { to <- .get_first_frame(.data) if (.has_frames(.data)) nframes <- nframes + 1 tweendata <- tween_state(to[0, , drop = FALSE], to, ease, nframes, enter = enter) .with_later_frames(.data, tweendata, nframes) } #' @rdname tween_state #' @export close_state <- function(.data, ease, nframes, exit) { from <- .get_last_frame(.data) if (.has_frames(.data)) nframes <- nframes + 1 tweendata <- tween_state(from, from[0, , drop = FALSE], ease, nframes, exit = exit) .with_prior_frames(.data, tweendata, nframes) } #' Helpers for working with tweened data #' #' These are internal helpers for extracting and inserting data into a #' data.frame of tweened states. #' #' @param data,prior,later A data.frame. If a `.frame` column exists it will be interpreted #' as a data.frame containing multiple states #' #' @param new_tween The result of a tweening #' #' @return A data.frame #' @keywords internal #' @export #' .get_last_frame <- function(data) { nframes <- attr(data, 'nframes') data <- if (!is.null(nframes)) { data[data$.frame == nframes, names(data) != '.frame', drop = FALSE] } else if ('.frame' %in% names(data)) { data[data$.frame == max(data$.frame), names(data) != '.frame', drop = FALSE] } else { data } if (is.null(data$.id)) { data$.id <- seq_len(nrow(data)) } data } #' @rdname dot-get_last_frame #' @export .get_first_frame <- function(data) { data <- if ('.frame' %in% names(data)) { data[data$.frame == 1, names(data) != '.frame', drop = FALSE] } else { data } if (is.null(data$.id)) { data$.id <- seq_len(nrow(data)) } data } #' @rdname dot-get_last_frame #' @export .with_prior_frames <- function(prior, new_tween, nframes) { nframes_before <- attr(prior, 'nframes') if (is.null(nframes_before) && nrow(prior) > 0 && '.frame' %in% names(prior)) nframes_before <- max(prior$.frame) frames <- if (!is.null(nframes_before)) { prior <- prior[prior$.frame != nframes_before, , drop = FALSE] new_tween$.frame <- new_tween$.frame + nframes_before - 1 if (is.character(prior$.id)) new_tween$.id <- as.character(new_tween$.id) else if (is.character(new_tween$.id)) prior$.id <- as.character(prior$.id) vec_rbind(prior, new_tween) } else { nframes_before <- 1 new_tween } attr(frames, 'nframes') <- nframes + nframes_before - 1 attr(frames, 'max_id') <- find_max_id(prior, new_tween) frames } #' @rdname dot-get_last_frame #' @export .with_later_frames <- function(later, new_tween, nframes) { nframes_before <- attr(later, 'nframes') nframes_before <- if (is.null(nframes_before) && nrow(later) > 0 && '.frame' %in% names(later)) max(later$.frame) else 1 frames <- if ('.frame' %in% names(later)) { later <- later[later$.frame != 1, , drop = FALSE] later$.frame <- later$.frame + max(new_tween$.frame) if (is.character(later$.id)) new_tween$.id <- as.character(new_tween$.id) else if (is.character(new_tween$.id)) later$.id <- as.character(later$.id) vec_rbind(new_tween, later) } else { new_tween } attr(frames, 'nframes') <- nframes + nframes_before - 1 attr(frames, 'max_id') <- find_max_id(later, new_tween) frames } find_max_id <- function(data, new) { max_new <- if (nrow(new) == 0) 0 else max(new$.id) max(max_new, .max_id(data)) } #' Get the highest id occuring in a dataset #' #' This is helper for `tween_state` related functions to get the currently #' highest `.id` in a frame collection #' #' @param data A data.frame as returned by `tween_state` #' #' @return An integer giving the currently highest id #' #' @keywords internal #' @export .max_id <- function(data) { max_id <- attr(data, 'max_id') if (is.null(max_id) && nrow(data) > 0 && !is.null(data$.id)) max_id <- max(data$.id) else max_id <- nrow(data) max_id } #' Fill in missing rows using enter and exit functions #' #' This function figures out which rows are missing in either state and applies #' the provided `enter` and `exit` functions to fill in the blanks and provide #' a 1-to-1 relation between the rows in `from` and `to`. #' #' @param from,to Data.frames to tween between #' #' @param id The name of the column that holds the matching id #' #' @param enter,exit functions to fill out missing rows in `from` and `to` #' respectively #' #' @return A list with the elements `from` and `to` holding the filled out #' versions of `from` and `to` #' #' @keywords internal #' @importFrom rlang eval_tidy %||% as_function #' @export .complete_states <- function(from, to, id, enter, exit, max_id) { from_id <- eval_tidy(id, from) %||% seq_len(nrow(from)) to_id <- eval_tidy(id, to) %||% seq_len(nrow(to)) if (length(from_id) != nrow(from) || length(to_id) != nrow(to)) { stop('id must match the length of the data', call. = FALSE) } n_to <- nrow(to) if (anyDuplicated(from_id) || anyDuplicated(to_id) || !setequal(from_id, to_id)) { from_id <- paste(from_id, count_occourance(from_id), sep = '_') to_id <- paste(to_id, count_occourance(to_id), sep = '_') entering <- !to_id %in% from_id exiting <- !from_id %in% to_id if (is.null(enter) || sum(entering) == 0) { to <- to[!entering, , drop = FALSE] to_id <- to_id[!entering] enters <- to[0, , drop = FALSE] enter_id <- to_id[0] } else { enters <- as_function(enter)(to[entering, , drop = FALSE]) enters$.phase <- 'enter' enter_id <- to_id[entering] } if (is.null(exit) || sum(exiting) == 0) { from <- from[!exiting, , drop = FALSE] from_id <- from_id[!exiting] exits <- from[0, , drop = FALSE] exit_id <- from_id[0] } else { exits <- as_function(exit)(from[exiting, , drop = FALSE]) exits$.phase <- 'exit' exit_id <- from_id[exiting] } from <- vec_rbind(from, enters) from_id <- c(from_id, enter_id) to <- vec_rbind(to, exits) to_id <- c(to_id, exit_id) } from$.id[is.na(from$.id)] <- seq_len(sum(is.na(from$.id))) + max_id orig_to_id <- from$.id[match(to_id, from_id)][seq_len(n_to)] to <- to[match(from_id, to_id), , drop = FALSE] to$.id <- from$.id list(from = from, to = to, orig_to = orig_to_id) } #' @rdname dot-get_last_frame #' @export .has_frames <- function(data) { !is.null(attr(data, 'nframes')) || !is.null(data$.frame) } simple_state <- function(n, ease) { data.frame(state = c(0L, 1L), nframes = c(n - 1L, 0L), ease = c(ease, 'constant'), stringsAsFactors = FALSE) } count_occourance <- function(x) { if (length(x) == 0) return(integer(0)) unsplit(lapply(split(x, x), seq_along), x) } fix_old_mapped_discrete <- function(x) { if (inherits(x, 'mapped_discrete') && storage.mode(x) == 'integer') { storage.mode(x) <- 'double' } x } tweenr/R/tween_fill.R0000644000176200001440000000361414067576055014255 0ustar liggesusers#' Fill out missing values by interpolation #' #' This tween fills out `NA` elements (or `NULL` elements if `data` is a list) #' by interpolating between the prior and next non-missing values. #' #' @param data A data.frame or vector. #' @param ease A character vector giving valid easing functions. Recycled to #' match the ncol of `data` #' #' @return If `data` is a data.frame then a data.frame with the same #' columns. If `data` is a vector then a vector. #' #' @export #' #' @examples #' # Single vector #' tween_fill(c(1, NA, NA, NA, NA, NA, 2, 6, NA, NA, NA, -2), 'cubic-in-out') #' #' # Data frame #' tween_fill(mtcars[c(1, NA, NA, NA, NA, 4, NA, NA, NA, 10), ], 'cubic-in') #' tween_fill <- function(data, ease) { single_vec <- !is.data.frame(data) if (single_vec) { if (length(data) == 0) return(data[integer()]) data_df <- data.frame(data = rep(NA, length(data))) data_df$data <- data data <- data_df } else { if (nrow(data) == 0) return(data[integer(), ]) } ease <- rep(ease, length.out = ncol(data)) classes <- col_classes(data) tweendata <- lapply(seq_along(classes), function(i) { switch( classes[i], numeric = interpolate_numeric_fill(data[[i]], ease[i]), logical = interpolate_logical_fill(data[[i]], ease[i]), factor = interpolate_factor_fill(data[[i]], ease[i]), character = interpolate_character_fill(data[[i]], ease[i]), colour = interpolate_colour_fill(data[[i]], ease[i]), date = interpolate_date_fill(data[[i]], ease[i]), datetime = interpolate_datetime_fill(data[[i]], ease[i]), constant = interpolate_constant_fill(data[[i]], ease[i]), numlist = interpolate_numlist_fill(data[[i]], ease[i]), list = interpolate_list_fill(data[[i]], ease[i]) ) }) if (single_vec) return(tweendata[[1]]) structure(tweendata, names = names(data), row.names = seq_along(tweendata[[1]]), class = 'data.frame') } tweenr/R/tween_at.R0000644000176200001440000000643014300625107013711 0ustar liggesusers#' Get a specific position between two states #' #' This tween allows you to query a specific postion between two states rather #' than generate evenly spaced states. It can work with either data.frames or #' single vectors and each row/element can have its own position and easing. #' #' @param from,to A data.frame or vector of the same type. If either is of #' length/nrow 1 it will get repeated to match the length of the other #' @param at A numeric between 0 and 1 recycled to match the nrow/length of #' `from` #' @param ease A character vector giving valid easing functions. Recycled to #' match the ncol of `from` #' #' @return If `from`/`to` is a data.frame then a data.frame with the same #' columns. If `from`/`to` is a vector then a vector. #' #' @export #' #' @examples #' tween_at(mtcars[1:6, ], mtcars[6:1, ], runif(6), 'cubic-in-out') #' tween_at <- function(from, to, at, ease) { single_vec <- !is.data.frame(from) if (single_vec) { if (length(from) == 0 || length(to) == 0) return(to[integer()]) from_df <- data.frame(data = rep(NA, length(from))) to_df <- data.frame(data = rep(NA, length(to))) from_df$data <- from to_df$data <- to from <- from_df to <- to_df } else { if (nrow(from) == 0 || nrow(to) == 0) return(to[integer(), ]) } if (length(at) == 0) stop('at must have length > 0', call. = FALSE) if (nrow(from) == 1) from <- from[rep(1, nrow(to)), , drop = FALSE] if (nrow(to) == 1) to <- to[rep(1, nrow(from)), , drop = FALSE] if (nrow(from) != nrow(to)) { stop('from and to must be same length', call. = FALSE) } if (any(names(from) != names(to))) { stop('`from` and `to` must have the same columns', call. = FALSE) } at <- rep(at, length.out = nrow(from)) ease <- rep(ease, length.out = ncol(from)) classes <- col_classes(from) to_classes <- col_classes(to) mismatch <- to_classes != classes for (i in which(mismatch)) { all_na_to <- all(is.na(to[[i]])) all_na_from <- all(is.na(from[[i]])) if (all_na_from) { storage.mode(from[[i]]) <- storage.mode(to[[i]]) } else if (all_na_to) { storage.mode(to[[i]]) <- storage.mode(from[[i]]) } else { stop('The ', names(to)[i], 'column differs in type between the two inputs', call. = FALSE) } } tweendata <- lapply(seq_along(classes), function(i) { switch( classes[i], numeric = interpolate_numeric_at(from[[i]], to[[i]], at, ease[i]), logical = interpolate_logical_at(from[[i]], to[[i]], at, ease[i]), factor = interpolate_factor_at(from[[i]], to[[i]], at, ease[i]), character = interpolate_character_at(from[[i]], to[[i]], at, ease[i]), colour = interpolate_colour_at(from[[i]], to[[i]], at, ease[i]), date = interpolate_date_at(from[[i]], to[[i]], at, ease[i]), datetime = interpolate_datetime_at(from[[i]], to[[i]], at, ease[i]), constant = interpolate_constant_at(from[[i]], to[[i]], at, ease[i]), numlist = interpolate_numlist_at(from[[i]], to[[i]], at, ease[i]), list = interpolate_list_at(from[[i]], to[[i]], at, ease[i]), phase = ifelse(from[[i]] == "enter", "enter", ifelse(to[[i]] == "exit", "exit", "transition")) ) }) if (single_vec) return(tweendata[[1]]) structure(tweendata, names = names(from), row.names = seq_along(tweendata[[1]]), class = 'data.frame') } tweenr/R/interpolate_state.R0000644000176200001440000000361014277141641015637 0ustar liggesusersinterpolate_numeric_state <- function(data, states) { res <- numeric_state_interpolator(lapply(data, as.numeric), states) c(data[[1]][0], res) } interpolate_logical_state <- function(data, states) { res <- numeric_state_interpolator(lapply(data, as.numeric), states) as.logical(round(res)) } #' @importFrom farver decode_colour encode_colour interpolate_colour_state <- function(data, states) { data <- lapply(data, decode_colour, alpha = TRUE, to = 'lab') data <- colour_state_interpolator(data, states) encode_colour(data[, 1:3, drop = FALSE], alpha = data[,4], from = 'lab') } interpolate_constant_state <- function(data, states) { constant_state_interpolator(lapply(data, as.character), states) } interpolate_character_state <- interpolate_constant_state interpolate_date_state <- function(data, states) { as.Date(interpolate_numeric_state(data, states), origin = BASEDATE) } interpolate_datetime_state <- function(data, states) { if (inherits(data[[1]], 'POSIXlt')) { warning("POSIXlt converted to POSIXct") data[[1]] <- as.POSIXct(data[[1]]) } tz <- attr(data[[1]], 'tzone') as.POSIXct(interpolate_numeric_state(data, states), origin = BASEDATETIME, tz = tz) } interpolate_factor_state <- function(data, states) { all_levels <- Reduce(union, lapply(data, levels)) ord <- is.ordered(data[[1]]) data <- interpolate_character_state(data, states) if (ord) ordered(data, all_levels) else factor(data, all_levels) } interpolate_list_state <- function(data, states) { new_data <- list_state_interpolator(data, states) attributes(new_data) <- attributes(data) new_data } interpolate_numlist_state <- function(data, states) { new_data <- numlist_state_interpolator(lapply(data, lapply, as.numeric), states) attributes(new_data) <- attributes(data) new_data } get_phase_state <- function(data, states) { phase_state_interpolator(lapply(data, as.character), states) } tweenr/R/tween_constant.R0000644000176200001440000000135114067576055015154 0ustar liggesusers#' @rdname tween #' #' @export tween_constant <- function(data, n, ease = 'linear') { data <- as.list(data) data <- lapply(data, as.character) prepData <- prepareTween(data, n, ease) tweendata <- do.call(interpolate_character_state, prepData) unname(split(tweendata, rep(seq_along(data[[1]]), length.out = length(tweendata)))) } #' @rdname tween #' #' @export tween_constant_t <- function(data, n, ease = 'linear') { if (!is.list(data)) { data <- list(data) } data <- lapply(data, as.character) prepData <- prepareTweenTranspose(data, n, ease) tweendata <- do.call(interpolate_character_state, prepData) unname(split(tweendata, rep(seq_along(data), rep(n, length.out = length(data))))) } tweenr/R/aaa.R0000644000176200001440000000714214277113042012631 0ustar liggesusersBASEDATE <- Sys.Date() - as.numeric(Sys.Date()) BASEDATETIME <- Sys.time() - as.numeric(Sys.time()) validEase <- c( "linear", "quadratic-in", "quadratic-out", "quadratic-in-out", "cubic-in", "cubic-out", "cubic-in-out", "quartic-in", "quartic-out", "quartic-in-out", "quintic-in", "quintic-out", "quintic-in-out", "sine-in", "sine-out", "sine-in-out", "circular-in", "circular-out", "circular-in-out", "exponential-in", "exponential-out", "exponential-in-out", "elastic-in", "elastic-out", "elastic-in-out", "back-in", "back-out", "back-in-out", "bounce-in", "bounce-out", "bounce-in-out" ) #' @importFrom magrittr %>% #' @export magrittr::`%>%` #' @rdname gen_internal #' @export #' @importFrom farver decode_colour col_classes <- function(data) { classes <- vapply(data, vec_tween_class, character(1)) names(classes) <- names(data) classes[names(classes) == '.phase'] <- 'phase' classes } #' Get the nominal class of a vector #' #' @param x a vector #' #' @export #' @keywords internal vec_tween_class <- function(x) { UseMethod('vec_tween_class') } #' @export vec_tween_class.default <- function(x) 'constant' #' @export vec_tween_class.numeric <- function(x) 'numeric' #' @export vec_tween_class.logical <- function(x) 'logical' #' @export vec_tween_class.factor <- function(x) 'factor' #' @export vec_tween_class.character <- function(x) { colour <- try(suppressWarnings(decode_colour(x)), silent = TRUE) if (all(is.na(x)) || inherits(colour, 'try-error') || any(is.na(x) != is.na(colour[, 1])) || all(grepl('^(\\d|\\.)+$', x))) { 'character' } else { 'colour' } } #' @export vec_tween_class.Date <- function(x) 'date' #' @export vec_tween_class.POSIXt <- function(x) 'datetime' #' @export vec_tween_class.list <- function(x) { if (all(vapply(x, is.numeric, logical(1)))) 'numlist' else 'list' } prepareTween <- function(data, n, ease) { if (!is.list(data)) { data <- as.list(data) } if (length(unique(lengths(data))) != 1) { stop('All elements in data must have the same length') } if (!all(ease %in% validEase)) { stop('ease must be the name of a valid easing function') } n <- c(rep(n, length.out = length(data) - 1) - 1, 1) ease <- c(rep(ease, length.out = length(data) - 1), 'constant') states <- data.frame( state = seq_along(data) - 1L, nframes = as.integer(n), ease = ease, stringsAsFactors = FALSE ) list( data = data, states = states ) } prepareTweenTranspose <- function(data, n, ease) { if (!is.list(data)) { data <- list(data) } if (!all(ease %in% validEase)) { stop('ease must be the name of a valid easing function') } n <- rep(n, length.out = length(data)) n <- Map(function(n, l) { s <- floor(n / l) s <- rep(s, l) overhead <- n - sum(s) if (overhead) { s <- s + rep(floor(overhead / l), l) addInd <- seq_len(n - sum(s)) s[addInd] <- s[addInd] + 1 } c(s, 1) }, n = n - 1, l = lengths(data) - 1) n <- unlist(n) ease <- rep(ease, length.out = length(data)) ease <- rep(ease, lengths(data) - 1) easeSplit <- split(ease, rep(seq_along(data), lengths(data) - 1)) ease <- unlist(lapply(easeSplit, append, values = 'constant')) data <- as.list(unlist(data)) states <- data.frame( state = seq_along(data) - 1L, nframes = as.integer(n), ease = ease, stringsAsFactors = FALSE ) list( data = data, states = states ) } first <- function(x) x[[1]] `first<-` <- function(x, value) { x[[1]] <- value x } last <- function(x) x[[length(x)]] `last<-` <- function(x, value) { x[[length(x)]] <- value x } tweenr/R/tween_numeric.R0000644000176200001440000000154714067576055014774 0ustar liggesusers#' @rdname tween #' #' @export tween_numeric <- function(data, n, ease = 'linear') { data <- as.list(data) prepData <- prepareTween(data, n, ease) if (!all(sapply(prepData$data, is.numeric))) { stop('data must consist of numeric elements') } tweendata <- do.call(interpolate_numeric_state, prepData) unname(split(tweendata, rep(seq_along(data[[1]]), length.out = length(tweendata)))) } #' @rdname tween #' #' @export tween_numeric_t <- function(data, n, ease = 'linear') { if (!is.list(data)) { data <- list(data) } prepData <- prepareTweenTranspose(data, n, ease) if (!all(sapply(prepData$data, is.numeric))) { stop('data must consist of numeric elements') } tweendata <- do.call(interpolate_numeric_state, prepData) unname(split(tweendata, rep(seq_along(data), rep(n, length.out = length(data))))) } tweenr/R/tweenr_package.R0000644000176200001440000000140414067576055015077 0ustar liggesusers#' @details #' tweenr is a small collection of functions to help you in creating #' intermediary representations of your data, i.e. interpolating states of data. #' As such it's a great match for packages such as animate and gganimate, since #' it can work directly with data.frames of data, but it also provide fast and #' efficient interpolaters for numeric, date, datetime and colour that are #' vectorized and thus more efficient to use than the build in interpolation #' functions (mainly [stats::approx()] and #' [grDevices::colorRamp()]). #' #' The main functions for data.frames are [tween_states()], #' [tween_elements()] and [tween_appear()], while the #' standard interpolaters can be found at [tween()] #' #' @useDynLib tweenr, .registration = TRUE '_PACKAGE' tweenr/R/interpolate_element.R0000644000176200001440000000503314067576055016161 0ustar liggesusersinterpolate_numeric_element <- function(data, group, frame, ease) { numeric_element_interpolator(as.numeric(data), as.integer(group), as.integer(frame), as.character(ease)) } interpolate_logical_element <- function(data, group, frame, ease) { res <- interpolate_numeric_element(data, group, frame, ease) res[['data']] <- as.logical(round(res[['data']])) res } #' @importFrom farver decode_colour encode_colour interpolate_colour_element <- function(data, group, frame, ease) { data <- decode_colour(data, alpha = TRUE, to = 'lab') col <- colour_element_interpolator(data, as.integer(group), as.integer(frame), as.character(ease)) data.frame( data = encode_colour(col[, 1:3, drop = FALSE], alpha = col[,4], from = 'lab'), group = col$group, frame = col$frame, stringsAsFactors = FALSE ) } interpolate_constant_element <- function(data, group, frame, ease) { constant_element_interpolator(as.character(data), as.integer(group), as.integer(frame), as.character(ease)) } interpolate_character_element <- interpolate_constant_element interpolate_date_element <- function(data, group, frame, ease) { res <- interpolate_numeric_element(data, group, frame, ease) res[['data']] <- as.Date(res[['data']], origin = BASEDATE) res } interpolate_datetime_element <- function(data, group, frame, ease) { if (inherits(data, 'POSIXlt')) { warning("POSIXlt converted to POSIXct") data <- as.POSIXct(data) } tz <- attr(data, 'tzone') res <- interpolate_numeric_element(data, group, frame, ease) res[['data']] <- as.POSIXct(res[['data']], origin = BASEDATETIME, tz = tz) res } interpolate_factor_element <- function(data, group, frame, ease) { all_levels <- levels(data) ord <- is.ordered(data) res <- interpolate_character_element(data, group, frame, ease) res[['data']] <- if (ord) ordered(res[['data']], all_levels) else factor(res[['data']], all_levels) res } interpolate_list_element <- function(data, group, frame, ease) { new_data <- list_element_interpolator(as.list(data), as.integer(group), as.integer(frame), as.character(ease)) attributes(new_data$data) <- attributes(data) new_data } interpolate_numlist_element <- function(data, group, frame, ease) { new_data <- numlist_element_interpolator(lapply(data, as.numeric), as.integer(group), as.integer(frame), as.character(ease)) attributes(new_data$data) <- attributes(data) new_data } get_phase_element <- function(data, group, frame, ease) { phase_element_interpolator(as.character(data), as.integer(group), as.integer(frame), as.character(ease)) } tweenr/R/interpolate_fill.R0000644000176200001440000000323014067576055015453 0ustar liggesusersinterpolate_numeric_fill <- function(data, ease) { numeric_fill_interpolator(as.numeric(data), as.character(ease)) } interpolate_logical_fill <- function(data, ease) { as.logical(round(numeric_fill_interpolator(data, ease))) } #' @importFrom farver decode_colour encode_colour interpolate_colour_fill <- function(data, ease) { data <- decode_colour(data, alpha = TRUE, to = 'lab') data <- colour_fill_interpolator(data, as.character(ease)) encode_colour(data[, 1:3, drop = FALSE], alpha = data[,4], from = 'lab') } interpolate_constant_fill <- function(data, ease) { constant_fill_interpolator(as.character(data), as.character(ease)) } interpolate_character_fill <- interpolate_constant_fill interpolate_date_fill <- function(data, ease) { as.Date(interpolate_numeric_fill(data, ease), origin = BASEDATE) } interpolate_datetime_fill <- function(data, ease) { if (inherits(data, 'POSIXlt')) { warning("POSIXlt converted to POSIXct") data <- as.POSIXct(data) } as.POSIXct(interpolate_numeric_fill(data, ease), origin = BASEDATETIME, tz = attr(data, 'tzone')) } interpolate_factor_fill <- function(data, ease) { all_levels <- levels(data) ord <- is.ordered(data) data <- interpolate_character_fill(data, ease) if (ord) ordered(data, all_levels) else factor(data, all_levels) } interpolate_list_fill <- function(data, ease) { new_data <- list_fill_interpolator(as.list(data), as.character(ease)) attributes(new_data) <- attributes(data) new_data } interpolate_numlist_fill <- function(data, ease) { new_data <- numlist_fill_interpolator(lapply(data, as.numeric), as.character(ease)) attributes(new_data) <- attributes(data) new_data } tweenr/R/interpolate_at.R0000644000176200001440000000370014067576055015133 0ustar liggesusersinterpolate_numeric_at <- function(from, to, at, ease) { numeric_at_interpolator(as.numeric(from), as.numeric(to), as.numeric(at), as.character(ease)) } interpolate_logical_at <- function(from, to, at, ease) { as.logical(round(interpolate_numeric_at(from, to, at, ease))) } #' @importFrom farver decode_colour encode_colour interpolate_colour_at <- function(from, to, at, ease) { from <- decode_colour(from, alpha = TRUE, to = 'lab') to <- decode_colour(to, alpha = TRUE, to = 'lab') data <- colour_at_interpolator(from, to, as.numeric(at), as.character(ease)) encode_colour(data[, 1:3, drop = FALSE], alpha = data[,4], from = 'lab') } interpolate_constant_at <- function(from, to, at, ease) { constant_at_interpolator(as.character(from), as.character(to), as.numeric(at), as.character(ease)) } interpolate_character_at <- interpolate_constant_at interpolate_date_at <- function(from, to, at, ease) { data <- interpolate_numeric_at(from, to, at, ease) as.Date(data, origin = BASEDATE) } interpolate_datetime_at <- function(from, to, at, ease) { if (inherits(from, 'POSIXlt')) { warning("POSIXlt converted to POSIXct") from <- as.POSIXct(from) } tz <- attr(from, 'tzone') data <- interpolate_numeric_at(from, to, at, ease) as.POSIXct(data, origin = BASEDATETIME, tz = tz) } interpolate_factor_at <- function(from, to, at, ease) { all_levels <- unique(c(levels(from), levels(to))) data <- interpolate_constant_at(from, to, at, ease) if (is.ordered(from)) ordered(data, all_levels) else factor(data, all_levels) } interpolate_list_at <- function(from, to, at, ease) { data <- list_at_interpolator(as.list(from), as.list(to), as.numeric(at), as.character(ease)) attributes(data) <- attributes(from) data } interpolate_numlist_at <- function(from, to, at, ease) { data <- numlist_at_interpolator(lapply(from, as.numeric), lapply(to, as.numeric), as.numeric(at), as.character(ease)) attributes(data) <- attributes(from) data } tweenr/R/tween_components.R0000644000176200001440000001350214277360430015500 0ustar liggesusers#' Interpolate individual component #' #' This function is much like [tween_elements()] but with a slightly different #' syntax and support for many of the newer features such as enter/exits and #' tween phase identification. Furthermore it uses tidy evaluation for time and #' id, making it easier to change these on the fly. The biggest change in terms #' of functionality compared to `tween_elements()` is that the easing function #' is now given per column and not per row. If different easing functions are #' needed for each transition then `tween_elements()` is needed. #' #' @inheritParams tween_state #' #' @param .data A data.frame with components at different stages #' #' @param time An unquoted expression giving the timepoint for the different #' stages of the components. Will be evaluated in the context of `.data` so can #' refer to a column from that #' #' @param id An unquoted expression giving the component id for each row. Will #' be evaluated in the context of `.data` so can refer to a column from that #' #' @param range The range of time points to include in the tween. If `NULL` it #' will use the range of `time` #' #' @param enter_length,exit_length The lenght of the opening and closing #' transitions if `enter` and/or `exit` is given. Measured in the same units as #' `time` #' #' @return A data.frame with the same columns as `.data` along with `.id` giving #' the component id, `.phase` giving the state of each component in each frame, #' and `.frame` giving the frame membership of each row. #' #' @family data.frame tween #' #' @examples #' #' from_zero <- function(x) {x$x <- 0; x} #' #' data <- data.frame( #' x = c(1, 2, 2, 1, 2, 2), #' y = c(1, 2, 2, 2, 1, 1), #' time = c(1, 4, 10, 4, 8, 10), #' id = c(1, 1, 1, 2, 2, 2) #' ) #' #' data <- tween_components(data, 'cubic-in-out', nframes = 100, time = time, #' id = id, enter = from_zero, enter_length = 4) #' #' @export #' @importFrom rlang enquo eval_tidy #' tween_components <- function(.data, ease, nframes, time, id = NULL, range = NULL, enter = NULL, exit = NULL, enter_length = 0, exit_length = 0) { time <- enquo(time) time <- eval_tidy(time, .data) id <- enquo(id) id <- if (quo_is_null(id)) rep(1, nrow(.data)) else eval_tidy(id, .data) if (is.null(enter_length)) enter_length <- 0 if (is.null(exit_length)) exit_length <- 0 .data <- .complete_components(.data, time, id, enter, exit, enter_length, exit_length) .tween_individuals(.data, ease, nframes, range) } .tween_individuals <- function(.data, ease, nframes, range) { if (nframes == 0) return(.data[integer(), , drop = FALSE]) if (nrow(.data) == 0) return(.data) if (length(ease) == 1) ease <- rep(ease, ncol(.data) - 3) if (length(ease) == ncol(.data) - 3) { ease <- c(ease, 'linear', 'linear', 'linear') # To account for .phase and .id columns } else { stop('Ease must be either a single string or one for each column', call. = FALSE) } if (!is_integerish(nframes, 1L)) { stop("`nframes` must be a single count", call. = FALSE) } timerange <- if (is.null(range)) range(.data$.time) else range if (diff(timerange) == 0) stop('range must have a length', call. = FALSE) framelength <- diff(timerange) / (nframes - 1) .data <- .data[order(.data$.id, .data$.time), , drop = FALSE] frame <- round((.data$.time - min(timerange[1])) / framelength) + 1 .data$.time <- NULL colClasses <- col_classes(.data) tweendata <- lapply(seq_along(.data), function(i) { d <- .data[[i]] e <- rep(ease[i], length(d)) switch( colClasses[i], numeric = interpolate_numeric_element(d, .data$.id, frame, e), logical = interpolate_logical_element(d, .data$.id, frame, e), factor = interpolate_factor_element(d, .data$.id, frame, e), character = interpolate_character_element(d, .data$.id, frame, e), colour = interpolate_colour_element(d, .data$.id, frame, e), date = interpolate_date_element(d, .data$.id, frame, e), datetime = interpolate_datetime_element(d, .data$.id, frame, e), constant = interpolate_constant_element(d, .data$.id, frame, e), numlist = interpolate_numlist_element(d, .data$.id, frame, e), list = interpolate_list_element(d, .data$.id, frame, e), phase = get_phase_element(d, .data$.id, frame, e) ) }) tweenInfo <- tweendata[[1]][, c('group', 'frame')] tweendata <- lapply(tweendata, `[[`, i = 'data') tweendata <- structure(tweendata, names = names(.data), row.names = seq_along(tweendata[[1]]), class = 'data.frame') tweendata$.frame <- tweenInfo$frame tweendata$.id <- tweenInfo$group tweendata <- tweendata[tweendata$.frame >= 1 & tweendata$.frame <= nframes, , drop = FALSE] attr(tweendata, 'framelength') <- framelength tweendata[order(tweendata$.frame, tweendata$.id), , drop = FALSE] } #' @importFrom vctrs vec_rbind #' @importFrom rlang as_function .complete_components <- function(data, time, id, enter, exit, enter_length, exit_length) { if (length(id) != nrow(data) || length(time) != nrow(data)) { stop('id and time must have the same length as the number of rows in data', call. = FALSE) } data$.id <- id data$.phase <- rep('raw', nrow(data)) data$.time <- time if (any(!is.null(enter), !is.null(exit))) { time_ord <- order(time) if (!is.null(enter)) { enter_data <- as_function(enter)(data[time_ord[!duplicated(id[time_ord])], , drop = FALSE]) enter_data$.phase <- 'enter' enter_data$.time <- enter_data$.time - enter_length } else { enter_data <- data[0, , drop = FALSE] } if (!is.null(exit)) { exit_data <- as_function(exit)(data[time_ord[!duplicated(id[time_ord], fromLast = TRUE)], , drop = FALSE]) exit_data$.phase <- 'exit' exit_data$.time <- exit_data$.time + exit_length } else { exit_data <- data[0, , drop = FALSE] } data <- vec_rbind(enter_data, data, exit_data) } data } tweenr/R/gen_events.R0000644000176200001440000000465214067576055014265 0ustar liggesusers#' Generator for tweening the appearance of elements #' #' This is a generator version of [tween_events()]. It returns a generator #' that can be used with [get_frame()] and [get_raw_frames()] to extract frames #' for a specific time point scaled between 0 and 1. #' #' @inheritParams tween_events #' #' @return A `component_generator` object #' #' @family Other generators #' #' @export #' @importFrom rlang enquo eval_tidy quo_is_missing #' #' @examples #' d <- data.frame( #' x = runif(20), #' y = runif(20), #' time = runif(20), #' duration = runif(20, max = 0.1) #' ) #' from_left <- function(x) { #' x$x <- -0.5 #' x #' } #' to_right <- function(x) { #' x$x <- 1.5 #' x #' } #' #' gen <- gen_events(d, 'cubic-in-out', start = time, end = time + duration, #' enter = from_left, exit = to_right, enter_length = 0.1, #' exit_length = 0.05) #' #' get_frame(gen, 0.65) #' gen_events <- function(.data, ease, start, end = NULL, range = NULL, enter = NULL, exit = NULL, enter_length = 0, exit_length = 0) { start <- enquo(start) if (quo_is_missing(start)) stop('start must be provided', call. = FALSE) start <- eval_tidy(start, .data) end <- enquo(end) end <- eval_tidy(end, .data) enter_length <- enquo(enter_length) enter_length <- eval_tidy(enter_length, .data) exit_length <- enquo(exit_length) exit_length <- eval_tidy(exit_length, .data) if (is.null(enter_length)) enter_length <- 0 if (is.null(exit_length)) exit_length <- 0 .data$.phase <- NULL if (length(ease) == 1) ease <- rep(ease, ncol(.data)) if (length(ease) == ncol(.data)) { ease <- c(ease, 'linear') # To account for .phase column } else { stop('Ease must be either a single string or one for each column', call. = FALSE) } .data$.phase <- rep_len(factor("raw", levels = PHASE_LEVELS), nrow(.data)) class(.data) <- c(c("component_generator", "frame_generator"), class(.data)) gen_data <- .complete_events(.data, start, end, enter, exit, enter_length, exit_length) time <- gen_data$.time id <- gen_data$.id gen_data$.time <- NULL gen_data$.id <- NULL d_order <- order(id, time) if (is.null(range)) range <- range(time) if (diff(range) == 0) stop('range cannot be 0', call. = FALSE) generator_settings(.data) <- list( data = gen_data[d_order, ], id = id[d_order], time = time[d_order], range = range, ease_type = ease, col_types = col_classes(.data) ) .data } tweenr/R/tween_datetime.R0000644000176200001440000000160714067576055015123 0ustar liggesusers#' @rdname tween #' #' @export tween_datetime <- function(data, n, ease = 'linear') { data <- as.list(data) prepData <- prepareTween(data, n, ease) if (!all(sapply(prepData$data, inherits, what = 'POSIXt'))) { stop('data must consist of POSIXt elements') } tweendata <- do.call(interpolate_datetime_state, prepData) unname(split(tweendata, rep(seq_along(data[[1]]), length.out = length(tweendata)))) } #' @rdname tween #' #' @export tween_datetime_t <- function(data, n, ease = 'linear') { if (!is.list(data)) { data <- list(data) } prepData <- prepareTweenTranspose(data, n, ease) if (!all(sapply(prepData$data, inherits, what = 'POSIXt'))) { stop('data must consist of POSIXt elements') } tweendata <- do.call(interpolate_datetime_state, prepData) unname(split(tweendata, rep(seq_along(data), rep(n, length.out = length(data))))) } tweenr/R/cpp11.R0000644000176200001440000001136614276676764013066 0ustar liggesusers# Generated by cpp11: do not edit by hand numeric_along_interpolator <- function(data, group, time, history, keep_last, frames, ease) { .Call(`_tweenr_numeric_along_interpolator`, data, group, time, history, keep_last, frames, ease) } colour_along_interpolator <- function(data, group, time, history, keep_last, frames, ease) { .Call(`_tweenr_colour_along_interpolator`, data, group, time, history, keep_last, frames, ease) } constant_along_interpolator <- function(data, group, time, history, keep_last, frames, ease) { .Call(`_tweenr_constant_along_interpolator`, data, group, time, history, keep_last, frames, ease) } list_along_interpolator <- function(data, group, time, history, keep_last, frames, ease) { .Call(`_tweenr_list_along_interpolator`, data, group, time, history, keep_last, frames, ease) } numlist_along_interpolator <- function(data, group, time, history, keep_last, frames, ease) { .Call(`_tweenr_numlist_along_interpolator`, data, group, time, history, keep_last, frames, ease) } phase_along_interpolator <- function(group, time, history, keep_last, frames) { .Call(`_tweenr_phase_along_interpolator`, group, time, history, keep_last, frames) } numeric_at_interpolator <- function(from, to, at, ease) { .Call(`_tweenr_numeric_at_interpolator`, from, to, at, ease) } colour_at_interpolator <- function(from, to, at, ease) { .Call(`_tweenr_colour_at_interpolator`, from, to, at, ease) } constant_at_interpolator <- function(from, to, at, ease) { .Call(`_tweenr_constant_at_interpolator`, from, to, at, ease) } list_at_interpolator <- function(from, to, at, ease) { .Call(`_tweenr_list_at_interpolator`, from, to, at, ease) } numlist_at_interpolator <- function(from, to, at, ease) { .Call(`_tweenr_numlist_at_interpolator`, from, to, at, ease) } numeric_element_at_interpolator <- function(data, group, time, at, ease) { .Call(`_tweenr_numeric_element_at_interpolator`, data, group, time, at, ease) } colour_element_at_interpolator <- function(data, group, time, at, ease) { .Call(`_tweenr_colour_element_at_interpolator`, data, group, time, at, ease) } constant_element_at_interpolator <- function(data, group, time, at, ease) { .Call(`_tweenr_constant_element_at_interpolator`, data, group, time, at, ease) } list_element_at_interpolator <- function(data, group, time, at, ease) { .Call(`_tweenr_list_element_at_interpolator`, data, group, time, at, ease) } numlist_element_at_interpolator <- function(data, group, time, at, ease) { .Call(`_tweenr_numlist_element_at_interpolator`, data, group, time, at, ease) } phase_element_at_interpolator <- function(data, group, time, at, ease) { .Call(`_tweenr_phase_element_at_interpolator`, data, group, time, at, ease) } numeric_element_interpolator <- function(data, group, frame, ease) { .Call(`_tweenr_numeric_element_interpolator`, data, group, frame, ease) } colour_element_interpolator <- function(data, group, frame, ease) { .Call(`_tweenr_colour_element_interpolator`, data, group, frame, ease) } constant_element_interpolator <- function(data, group, frame, ease) { .Call(`_tweenr_constant_element_interpolator`, data, group, frame, ease) } list_element_interpolator <- function(data, group, frame, ease) { .Call(`_tweenr_list_element_interpolator`, data, group, frame, ease) } numlist_element_interpolator <- function(data, group, frame, ease) { .Call(`_tweenr_numlist_element_interpolator`, data, group, frame, ease) } phase_element_interpolator <- function(data, group, frame, ease) { .Call(`_tweenr_phase_element_interpolator`, data, group, frame, ease) } numeric_fill_interpolator <- function(data, ease) { .Call(`_tweenr_numeric_fill_interpolator`, data, ease) } colour_fill_interpolator <- function(data, ease) { .Call(`_tweenr_colour_fill_interpolator`, data, ease) } constant_fill_interpolator <- function(data, ease) { .Call(`_tweenr_constant_fill_interpolator`, data, ease) } list_fill_interpolator <- function(data, ease) { .Call(`_tweenr_list_fill_interpolator`, data, ease) } numlist_fill_interpolator <- function(data, ease) { .Call(`_tweenr_numlist_fill_interpolator`, data, ease) } numeric_state_interpolator <- function(data, states) { .Call(`_tweenr_numeric_state_interpolator`, data, states) } colour_state_interpolator <- function(data, states) { .Call(`_tweenr_colour_state_interpolator`, data, states) } constant_state_interpolator <- function(data, states) { .Call(`_tweenr_constant_state_interpolator`, data, states) } list_state_interpolator <- function(data, states) { .Call(`_tweenr_list_state_interpolator`, data, states) } numlist_state_interpolator <- function(data, states) { .Call(`_tweenr_numlist_state_interpolator`, data, states) } phase_state_interpolator <- function(data, states) { .Call(`_tweenr_phase_state_interpolator`, data, states) } tweenr/R/interpolate_element_at.R0000644000176200001440000000474114067576055016652 0ustar liggesusersinterpolate_numeric_element_at <- function(data, group, time, at, ease) { numeric_element_at_interpolator(as.numeric(data), as.integer(group), as.numeric(time), as.numeric(at), as.character(ease)) } interpolate_logical_element_at <- function(data, group, time, at, ease) { as.logical(interpolate_numeric_element_at(data, group, time, at, ease)) } #' @importFrom farver decode_colour encode_colour interpolate_colour_element_at <- function(data, group, time, at, ease) { data <- decode_colour(data, alpha = TRUE, to = 'lab') col <- colour_element_at_interpolator(data, as.integer(group), as.numeric(time), as.numeric(at), as.character(ease)) encode_colour(col[, 1:3, drop = FALSE], alpha = col[,4], from = 'lab') } interpolate_constant_element_at <- function(data, group, time, at, ease) { constant_element_at_interpolator(as.character(data), as.integer(group), as.numeric(time), as.numeric(at), as.character(ease)) } interpolate_character_element_at <- interpolate_constant_element_at interpolate_date_element_at <- function(data, group, time, at, ease) { res <- interpolate_numeric_element_at(data, group, time, at, ease) as.Date(res, origin = BASEDATE) } interpolate_datetime_element_at <- function(data, group, time, at, ease) { if (inherits(data, 'POSIXlt')) { warning("POSIXlt converted to POSIXct") data <- as.POSIXct(data) } tz <- attr(data, 'tzone') res <- interpolate_numeric_element_at(data, group, time, at, ease) as.POSIXct(res, origin = BASEDATETIME, tz = tz) } interpolate_factor_element_at <- function(data, group, time, at, ease) { all_levels <- levels(data) ord <- is.ordered(data) res <- interpolate_character_element_at(data, group, time, at, ease) if (ord) ordered(res[['data']], all_levels) else factor(res[['data']], all_levels) } interpolate_list_element_at <- function(data, group, time, at, ease) { new_data <- list_element_at_interpolator(as.list(data), as.integer(group), as.numeric(time), as.numeric(at), as.character(ease)) attributes(new_data) <- attributes(data) new_data } interpolate_numlist_element_at <- function(data, group, time, at, ease) { new_data <- numlist_element_at_interpolator(lapply(data, as.numeric), as.integer(group), as.numeric(time), as.numeric(at), as.character(ease)) attributes(new_data) <- attributes(data) new_data } get_phase_element_at <- function(data, group, time, at, ease) { phase_element_at_interpolator(as.character(data), as.integer(group), as.numeric(time), as.numeric(at), as.character(ease)) } tweenr/R/gen_along.R0000644000176200001440000001057514106445604014047 0ustar liggesusers#' Generator for tweening along a variable #' #' This is a generator version of [tween_along()]. It returns a generator that #' can be used with [get_frame()] and [get_raw_frames()] to extract frames for #' a specific time point scaled between 0 and 1. #' #' @inheritParams tween_along #' #' @return An `along_generator` object #' #' @family Other generators #' #' @export #' @importFrom rlang eval_tidy enquo #' #' @examples #' # Default behaviour #' gen <- gen_along(airquality, ease = "linear", along = Day, id = Month) #' get_frame(gen, 0.22) #' #' # Overwrite keep_last or history in get_frame #' get_frame(gen, 0.67, history = FALSE) gen_along <- function(.data, ease, along, id = NULL, range = NULL, history = TRUE, keep_last = FALSE) { along <- enquo(along) along <- as.numeric(eval_tidy(along, .data)) id <- enquo(id) id <- if (quo_is_null(id)) rep(1, nrow(.data)) else eval_tidy(id, .data) .data$.phase <- NULL if (length(ease) == 1) ease <- rep(ease, ncol(.data)) if (length(ease) == ncol(.data)) { ease <- c(ease, 'linear') # To account for .phase column } else { stop('Ease must be either a single string or one for each column', call. = FALSE) } .data$.phase <- rep_len(factor("raw", levels = PHASE_LEVELS), nrow(.data)) d_order <- order(id, along) if (is.null(range)) range <- range(along) class(.data) <- c(c("along_generator", "frame_generator"), class(.data)) generator_settings(.data) <- list( data = .data[d_order, ], id = id[d_order], along = along[d_order], range = range, ease_type = ease, history = history, keep_last = keep_last, col_types = col_classes(.data) ) .data } #' @export get_frame.along_generator <- function(generator, at, ..., history = NULL, keep_last = NULL) { d <- generator_settings(generator) # clamp between 0 and 1 at <- min(max(at, 0), 1) range <- d$range # normalise to range at <- (range[2] - range[1]) * at + range[1] data <- gen_data(generator) ease <- ease_type(generator) type <- col_types(generator) if (is.null(history)) history <- d$history if (is.null(keep_last)) keep_last <- d$keep_last frame <- lapply(seq_along(data), function(i) { data <- data[[i]] e <- ease[i] switch( type[i], numeric = interpolate_numeric_along(data, d$id, d$along, at, e, history, keep_last)$data, logical = interpolate_logical_along(data, d$id, d$along, at, e, history, keep_last)$data, factor = interpolate_factor_along(data, d$id, d$along, at, e, history, keep_last)$data, character = interpolate_character_along(data, d$id, d$along, at, e, history, keep_last)$data, colour = interpolate_colour_along(data, d$id, d$along, at, e, history, keep_last)$data, date = interpolate_date_along(data, d$id, d$along, at, e, history, keep_last)$data, datetime = interpolate_datetime_along(data, d$id, d$along, at, e, history, keep_last)$data, constant = interpolate_constant_along(data, d$id, d$along, at, e, history, keep_last)$data, numlist = interpolate_numlist_along(data, d$id, d$along, at, e, history, keep_last)$data, list = interpolate_list_along(data, d$id, d$along, at, e, history, keep_last)$data, phase = get_phase_along(d$id, d$along, at, history, keep_last)$data ) }) structure(frame, names = names(data), row.names = .set_row_names(length(frame[[1]])), class = 'data.frame') } #' @export get_raw_frames.along_generator <- function(generator, at, before = 0, after = 0, ...) { d <- generator_settings(generator) # clamp between 0 and 1 before <- min(max(at - before, 0), 1) after <- min(max(at + after, 0), 1) at <- min(max(at, 0), 1) range <- d$range # normalise to generator time at <- (range[2] - range[1]) * at + range[1] before <- (range[2] - range[1]) * before + range[1] after <- (range[2] - range[1]) * after + range[1] # Find before and after before <- d$along >= before & d$along < at after <- d$along > at & d$along <= after list( before = d$data[before, , drop = FALSE], after = d$data[after, , drop = FALSE] ) } #' @export convert_generator.along_generator <- function(x) { data <- gen_data(x) settings <- list( attributes = attributes(x), data = data.frame(x), converter = function(x, settings) { data <- settings$data attributes(data) <- settings$attributes gen_data(data) <- data.frame(x) data } ) list(data = data, settings = settings) } tweenr/R/interpolate_along.R0000644000176200001440000000627614277412323015630 0ustar liggesusersinterpolate_numeric_along <- function(data, group, frame, frames, ease, history, keep_last) { numeric_along_interpolator(as.numeric(data), as.integer(group), as.numeric(frame), as.logical(history), as.logical(keep_last), as.numeric(frames), as.character(ease)) } interpolate_logical_along <- function(data, group, frame, frames, ease, history, keep_last) { res <- interpolate_numeric_along(data, group, frame, frames, ease, history, keep_last) res[['data']] <- as.logical(round(res[['data']])) res } #' @importFrom farver decode_colour encode_colour interpolate_colour_along <- function(data, group, frame, frames, ease, history, keep_last) { data <- decode_colour(data, alpha = TRUE, to = 'lab') col <- colour_along_interpolator(data, as.integer(group), as.numeric(frame), as.logical(history), as.logical(keep_last), as.numeric(frames), as.character(ease)) data.frame( data = encode_colour(col[, 1:3, drop = FALSE], alpha = col[,4], from = 'lab'), group = col$group, frame = col$frame, stringsAsFactors = FALSE ) } interpolate_constant_along <- function(data, group, frame, frames, ease, history, keep_last) { constant_along_interpolator(as.character(data), as.integer(group), as.numeric(frame), as.logical(history), as.logical(keep_last), as.numeric(frames), as.character(ease)) } interpolate_character_along <- interpolate_constant_along interpolate_date_along <- function(data, group, frame, frames, ease, history, keep_last) { res <- interpolate_numeric_along(data, group, frame, frames, ease, history, keep_last) res[['data']] <- as.Date(res[['data']], origin = BASEDATE) res } interpolate_datetime_along <- function(data, group, frame, frames, ease, history, keep_last) { if (inherits(data, 'POSIXlt')) { warning("POSIXlt converted to POSIXct") data <- as.POSIXct(data) } tz <- attr(data, 'tzone') res <- interpolate_numeric_along(data, group, frame, frames, ease, history, keep_last) res[['data']] <- as.POSIXct(res[['data']], origin = BASEDATETIME, tz = tz) res } interpolate_factor_along <- function(data, group, frame, frames, ease, history, keep_last) { all_levels <- levels(data) ord <- is.ordered(data) res <- interpolate_character_along(data, group, frame, frames, ease, history, keep_last) res[['data']] <- if (ord) ordered(res[['data']], all_levels) else factor(res[['data']], all_levels) res } interpolate_list_along <- function(data, group, frame, frames, ease, history, keep_last) { new_data <- list_along_interpolator(as.list(data), as.integer(group), as.numeric(frame), as.logical(history), as.logical(keep_last), as.numeric(frames), as.character(ease)) attributes(new_data$data) <- attributes(data) new_data } interpolate_numlist_along <- function(data, group, frame, frames, ease, history, keep_last) { new_data <- numlist_along_interpolator(lapply(data, as.numeric), as.integer(group), as.numeric(frame), as.logical(history), as.logical(keep_last), as.numeric(frames), as.character(ease)) attributes(new_data$data) <- attributes(data) new_data } get_phase_along <- function(group, frame, frames, history, keep_last) { phase_along_interpolator(as.integer(group), as.numeric(frame), as.logical(history), as.logical(keep_last), as.numeric(frames)) } tweenr/R/tween_events.R0000644000176200001440000000630614067602303014616 0ustar liggesusers#' Transition in and out of events #' #' This tweening function is a more powerful version of [tween_appear()], with #' support for newer features such as enter/exits and tween phase #' identification. The tweener treats each row in the data as unique events in #' time, and creates frames with the correct events present at any given time. #' #' @param start,end The start (and potential end) of the event encoded in the #' row, as unquoted expressions. Will be evaluated in the context of `.data` so #' can refer to columns in it. If `end = NULL` the event will be without extend #' and only visible in a single frame, unless `enter` and/or `exit` is given. #' #' @inheritParams tween_components #' #' @return A data.frame with the same columns as `.data` along with `.id` giving #' the component id, `.phase` giving the state of each component in each frame, #' and `.frame` giving the frame membership of each row. #' #' @family data.frame tween #' #' @importFrom rlang enquo quo_is_missing eval_tidy #' @export #' #' @examples #' d <- data.frame( #' x = runif(20), #' y = runif(20), #' time = runif(20), #' duration = runif(20, max = 0.1) #' ) #' from_left <- function(x) { #' x$x <- -0.5 #' x #' } #' to_right <- function(x) { #' x$x <- 1.5 #' x #' } #' #' tween_events(d, 'cubic-in-out', 50, start = time, end = time + duration, #' enter = from_left, exit = to_right, enter_length = 0.1, #' exit_length = 0.05) #' tween_events <- function(.data, ease, nframes, start, end = NULL, range = NULL, enter = NULL, exit = NULL, enter_length = 0, exit_length = 0) { start <- enquo(start) if (quo_is_missing(start)) stop('start must be provided', call. = FALSE) start <- eval_tidy(start, .data) end <- enquo(end) end <- eval_tidy(end, .data) enter_length <- enquo(enter_length) enter_length <- eval_tidy(enter_length, .data) exit_length <- enquo(exit_length) exit_length <- eval_tidy(exit_length, .data) if (is.null(enter_length)) enter_length <- 0 if (is.null(exit_length)) exit_length <- 0 .data <- .complete_events(.data, start, end, enter, exit, enter_length, exit_length) .tween_individuals(.data, ease, nframes, range) } #' @importFrom vctrs vec_rbind #' @importFrom rlang as_function .complete_events <- function(data, start, end, enter, exit, enter_length, exit_length) { data$.id <- seq_len(nrow(data)) data$.phase <- rep("raw", nrow(data)) start <- rep(start, length.out = nrow(data)) if (is.null(end)) { event_end <- data[0, , drop = FALSE] end <- start[0] } else { event_end <- data end <- rep(end, length.out = nrow(data)) data$.phase <- 'static' } if (is.null(enter)) { enter_data <- data[0, , drop = FALSE] enter_time <- start[0] } else { enter_data <- as_function(enter)(data) enter_data$.phase <- 'enter' enter_time <- start - enter_length } if (is.null(exit)) { exit_data <- data[0, , drop = FALSE] exit_time <- start[0] } else { exit_data <- as_function(exit)(data) exit_data$.phase <- 'exit' exit_time <- (if (length(end) == 0) start else end) + exit_length } data <- vec_rbind(enter_data, data, event_end, exit_data) time <- c(enter_time, start, end, exit_time) data$.time <- time data } tweenr/R/tween_elements.R0000644000176200001440000000672114067576055015145 0ustar liggesusers#' Create frames based on individual element states #' #' This function creates tweens for each observation individually, in cases #' where the data doesn't pass through collective states but consists of fully #' independent transitions. Each observation is identified by an id and each #' state must have a time associated with it. #' #' @param data A data.frame consisting at least of a column giving the #' observation id, a column giving timepoints for each state and a column giving #' the easing to apply when transitioning away from the state. #' #' @param time The name of the column holding timepoints #' #' @param group The name of the column holding the observation id #' #' @param ease The name of the column holding the easing function name #' #' @param timerange The range of time to span. If missing it will default to #' \code{range(data[[time]])} #' #' @param nframes The number of frames to generate. If missing it will default #' to `ceiling(diff(timerange) + 1)` (At least one frame for each #' individual timepoint) #' #' @return A data.frame with the same columns as `data` except for the #' group and ease columns, but replicated `nframes` times. Two additional #' columns called `.frame` and `.group` will be added giving the frame #' number and observation id for each row. #' #' @family data.frame tween #' #' @examples #' data <- data.frame( #' x = c(1, 2, 2, 1, 2, 2), #' y = c(1, 2, 2, 2, 1, 1), #' time = c(1, 4, 10, 4, 8, 10), #' group = c(1, 1, 1, 2, 2, 2), #' ease = rep('cubic-in-out', 6) #' ) #' #' data <- tween_elements(data, 'time', 'group', 'ease', nframes = 100) #' #' @export #' tween_elements <- function(data, time, group, ease, timerange, nframes) { if (!all(data[[ease]] %in% validEase)) { stop("All names given in the easing column must be valid easers") } if (missing(timerange) || is.null(timerange)) { timerange <- range(data[[time]]) } if (missing(nframes) || is.null(nframes)) { nframes <- ceiling(diff(timerange) + 1) } framelength <- diff(timerange) / nframes specialCols <- c(group, ease) data <- data[order(data[[group]], data[[time]]), ] groups <- unique(data[[group]]) group <- match(data[[group]], groups) frame <- round((data[[time]] - timerange[1]) / framelength) ease <- as.character(data[[ease]]) data <- data[, !names(data) %in% specialCols, drop = FALSE] colClasses <- col_classes(data) tweendata <- lapply(seq_along(data), function(i) { d <- data[[i]] switch( colClasses[i], numeric = interpolate_numeric_element(d, group, frame, ease), logical = interpolate_logical_element(d, group, frame, ease), factor = interpolate_factor_element(d, group, frame, ease), character = interpolate_character_element(d, group, frame, ease), colour = interpolate_colour_element(d, group, frame, ease), date = interpolate_date_element(d, group, frame, ease), datetime = interpolate_datetime_element(d, group, frame, ease), constant = interpolate_constant_element(d, group, frame, ease), numlist = interpolate_numlist_element(d, group, frame, ease), list = interpolate_list_element(d, group, frame, ease) ) }) tweenInfo <- tweendata[[1]][, c('group', 'frame')] tweendata <- as.data.frame(lapply(tweendata, `[[`, i = 'data')) names(tweendata) <- names(data) tweendata$.frame <- tweenInfo$frame tweendata$.group <- groups[tweenInfo$group] attr(tweendata, 'framelength') <- framelength tweendata[order(tweendata$.frame, tweendata$.group), ] } tweenr/R/tween_date.R0000644000176200001440000000155714067576055014250 0ustar liggesusers#' @rdname tween #' #' @export tween_date <- function(data, n, ease = 'linear') { data <- as.list(data) prepData <- prepareTween(data, n, ease) if (!all(sapply(prepData$data, inherits, what = 'Date'))) { stop('data must consist of Date elements') } tweendata <- do.call(interpolate_date_state, prepData) unname(split(tweendata, rep(seq_along(data[[1]]), length.out = length(tweendata)))) } #' @rdname tween #' #' @export tween_date_t <- function(data, n, ease = 'linear') { if (!is.list(data)) { data <- list(data) } prepData <- prepareTweenTranspose(data, n, ease) if (!all(sapply(prepData$data, inherits, what = 'Date'))) { stop('data must consist of Date elements') } tweendata <- do.call(interpolate_date_state, prepData) unname(split(tweendata, rep(seq_along(data), rep(n, length.out = length(data))))) } tweenr/R/display_ease.R0000644000176200001440000000373114067576055014567 0ustar liggesusers#' Display an easing function #' #' This simple helper lets you explore how the different easing functions govern #' the interpolation of data. #' #' @details #' How transitions proceed between states are defined by an easing function. The #' easing function converts the parameterized progression from one state to the #' next to a new number between 0 and 1. `linear` easing is equivalent to #' an identity function that returns the input unchanged. In addition there are #' a range of additional easers available, each with three modifiers. #' #' \strong{Easing modifiers:} #' \describe{ #' \item{-in}{The easing function is applied as-is} #' \item{-out}{The easing function is applied in reverse} #' \item{-in-out}{The first half of the transition it is applied as-is, while #' in the last half it is reversed} #' } #' #' \strong{Easing functions} #' \describe{ #' \item{quadratic}{Models a power-of-2 function} #' \item{cubic}{Models a power-of-3 function} #' \item{quartic}{Models a power-of-4 function} #' \item{quintic}{Models a power-of-5 function} #' \item{sine}{Models a sine function} #' \item{circular}{Models a pi/2 circle arc} #' \item{exponential}{Models an exponential function} #' \item{elastic}{Models an elastic release of energy} #' \item{back}{Models a pullback and relase} #' \item{bounce}{Models the bouncing of a ball} #' } #' #' In addition to this function a good animated explanation can be found #' [here](https://easings.net). #' #' @param ease The name of the easing function to display (see details) #' #' @return This function is called for its side effects #' #' @examples #' # The default - identity #' display_ease('linear') #' #' # A more fancy easer #' display_ease('elastic-in') #' #' @importFrom graphics plot #' @export #' display_ease <- function(ease) { easepoints <- tween_numeric(c(0, 1), 100, ease)[[1]] progress <- seq(0, 1, length.out = 100) plot(progress, easepoints, type = 'l', main = ease, xlab = 'In', ylab = 'Out', bty = 'n') } tweenr/NEWS.md0000644000176200001440000000074014305575016012663 0ustar liggesusers# tweenr 2.0.2 * Fixed a recycling bug in `tween_state()` # tweenr 2.0.1 * Fix bug in logical state interpolation due to wrong argument order passing # tweenr 2.0.0 * Added generator versions of `at`, `along`, `event`, `components`, and `state` tweens that output a single frame at a time at any fractional time point * Allow lambda-style functions in `enter`/`exit` # tweenr 1.0.2 * Added a `NEWS.md` file to track changes to the package. * Fixed numerous small bugs tweenr/MD50000644000176200001440000001047614305577002012101 0ustar liggesusers789c2eeb64197d1d48879ee67dc5ad8e *DESCRIPTION 928d886d4e8454f3db823a37d4de465f *LICENSE 571e6a775e95e68ad2d2a9e5ca91af78 *NAMESPACE 9366f6d66342240e75bcfe63941acb5c *NEWS.md aa3700bd529296bd7f880898ebf31fcb *R/aaa.R a93f9ddd26b6dcebbe939e5d383bc8d0 *R/cpp11.R 032419b5cfcaa8dd4107e3e7c3cf2bec *R/display_ease.R e0dcf8b140456be7f23522ec503537f0 *R/gen.R 3f55f9434499334e795db6232c52a61b *R/gen_along.R 297f25a2a95668e61c62bf245b0f3f3d *R/gen_at.R 15f2dd5455d010dad621ca60365d815d *R/gen_components.R 6b6181391b707dcf022cc0806945481a *R/gen_events.R d8b1b9a11b6e7d671b2bf7655acd1ca9 *R/gen_keyframe.R 85e33107d458aa7821bf206394d74c7f *R/get_frame.R 1ac0df76576a151692f9c0a58d53c7df *R/interpolate_along.R f41f120cf0de9d09d2ff236c37a489af *R/interpolate_at.R 3109b63161f1a23565237170280dc985 *R/interpolate_element.R 9a4b0eb24099905046926d6d382bf5d9 *R/interpolate_element_at.R bc67f086154b598278a118b5c91a5cbb *R/interpolate_fill.R 565d499fc4f2f22813be2b78254a5dda *R/interpolate_state.R f0b516aa6708b94984b827d1efd15308 *R/tween.R 33b4d85caddce41f07eda2744ff913c8 *R/tween_along.R 98b4f6b93c1f27b50efd1c6f9a380e7a *R/tween_appear.R f33fa3816daf134c03e819aef448f2c0 *R/tween_at.R 7757b66240d489dfd06891a4b4bcd626 *R/tween_colour.R aa288673d4573622acf04bdf9b9bbaae *R/tween_components.R e2bf81312be495522d36feace8ca4291 *R/tween_constant.R 81d553e0dabc78640045286414615d9c *R/tween_date.R c043ef5f53d196435d92b7502733ed98 *R/tween_datetime.R 97a45463e42668b5a98b0b1d1201a7e5 *R/tween_elements.R 3fc00521e8bf1076ed4dec2dd637b90f *R/tween_events.R 8d2d40175112d9250bbf643846105c5f *R/tween_fill.R 3fbebb9b93bfc70f98c8d4da699a7517 *R/tween_numeric.R a0c7c4a3094eadf3dd2eb1e556aa9823 *R/tween_state.R 7a48e1410bb61e800d0962dc5ae1a958 *R/tween_states.R 13b07fd6cd55f184f53414e5a8a06ca8 *R/tweenr_package.R dce8272174233e0d904fd6626a494bcc *README.md 006d520fdb51f615fa84db95ca6b4076 *man/display_ease.Rd 34366927919391bd1a708125f2175dd4 *man/dot-complete_states.Rd 4c6856bef70b38658bdb9adf438ddbf8 *man/dot-get_last_frame.Rd 822defaec9293e5bce6728c6bfcecddc *man/dot-max_id.Rd 6616ee7150ded00a88fcfe86d629e34e *man/figures/README-unnamed-chunk-3.gif 152c1de11d09be541d1bb504fe20719e *man/figures/README-unnamed-chunk-4-1.png a43cef038c756170afdfda6598b4886c *man/figures/logo.png 9b254cb7c71ccf960eced34c7ab2d91d *man/figures/logo.svg 71b8bf321aa8c900f35e8d184511b289 *man/gen_along.Rd 43b4ffcf940a5eae197c23a506586dfd *man/gen_at.Rd eb09e55c9678b77c298c202cfc9e4075 *man/gen_components.Rd 6627895d22e820b477f89c1ba35a3723 *man/gen_events.Rd 6f9a26d80cb97d3600dd76f2b22456f9 *man/gen_internal.Rd 588a829d11aaeb1e04685b827c79fd4c *man/gen_keyframe.Rd 932e6b97ff95ecf5c2d215b65d5ef459 *man/get_frame.Rd 0b8ba11147eb09c0661942f379c03c63 *man/interpolate_custom_at.Rd ee097a564b8a1432cf561f8ecc36ca8e *man/prepare_keyframes.Rd c3a1403cda76e69677010cd563c99af2 *man/reexports.Rd 1f081c01cd58e66dd3e34d1523e3e551 *man/tween.Rd e4373e9693e32eea83e0efa810df6402 *man/tween_along.Rd 8c2f535034f643c88cbd62434d41c266 *man/tween_appear.Rd 5ae8335a6fb227f5334ca7e2d863aa99 *man/tween_at.Rd e44fc42789226d0083028644d8a05153 *man/tween_components.Rd 9b53857281041b4f8fc2f3b21a7f983c *man/tween_elements.Rd 7e0062c857915420ea0252ee6b4a7de2 *man/tween_events.Rd 27b0ed281713d21cae636526fe08fb06 *man/tween_fill.Rd 83d2b61c15d0404d249a7416b35c0bea *man/tween_state.Rd 4368bbcc5cd1df401e37373da32bdcaa *man/tween_states.Rd 3cd0e7a1f6c8044842cd75f49d80404f *man/tweenr-package.Rd 0511084574d83421cc9f79c3b045a513 *man/vec_tween_class.Rd a984b69e512fa4f89572954c9bf0827b *src/along.cpp 1c0ae3ee92015a004ce278cd6848e963 *src/at.cpp fad14a5d835c45d5192caba434310f69 *src/cpp11.cpp 402909f0606ef2ea238175b22c3b4813 *src/easing.c 20db4b5dfde1a8274bafe699cb5b5cc4 *src/easing.h a949b444ebe7e1b1665047f8c312d565 *src/element.cpp 8a0511a0e3165d2db81e510510fd3532 *src/element_at.cpp 12c2b4cec9fb5c8cb6bbc4ce4391327b *src/fill.cpp 166404bc2ddb14c31b86a0547c73ee09 *src/state.cpp a9927948e79227af3bed234590c10de8 *src/utils.h aa895b44ba533f702387d9ec557e501a *tests/testthat.R 9fd5370e51962e32a0b27f1dd9d83052 *tests/testthat/test-along.R ec7f03bba6a7a9fa151000c0dc183eab *tests/testthat/test-at.R 08b9c296262eb34f21d869bc06f8a77c *tests/testthat/test-components.R eeb47b732dd6fee4463ae8ef2febfe30 *tests/testthat/test-events.R 38b676a2badd317f67d5d2204f9c4a15 *tests/testthat/test-fill.R 827c2ead19dd9b8d9ebce2893dc62eaf *tests/testthat/test-state.R