isoband/0000755000176200001440000000000015115215077011675 5ustar liggesusersisoband/tests/0000755000176200001440000000000015114504265013036 5ustar liggesusersisoband/tests/testthat/0000755000176200001440000000000015115215077014677 5ustar liggesusersisoband/tests/testthat/test-label-placer.R0000644000176200001440000001053115114504265020321 0ustar liggesuserstest_that("minmax label placer", { lines <- list( "1" = list( x = c(.5, .75, .5, .25), y = c(.25, .5, .75, .5), id = rep(1, 4) ), "2" = list(x = c(.5, 1, .5, 0), y = c(0, .5, 1, .5), id = rep(1, 4)) ) labels_data <- data.frame( index = 1:2, break_index = c(3, 7), break_id = c("1", "2"), label = c("a", "b"), stringsAsFactors = FALSE ) lp <- label_placer_minmax(n = 0) out <- lp(lines, labels_data) expect_equal(out$index, rep(1:2, each = 2)) expect_equal(out$break_index, rep(c(3, 7), each = 2)) expect_equal(out$break_id, rep(c("1", "2"), each = 2)) expect_equal(out$label, rep(c("a", "b"), each = 2)) expect_equal(out$x, rep(0.5, 4)) expect_equal(out$y, c(0.75, 0.25, 1, 0)) expect_equal(out$theta, rep(0, 4)) lp <- label_placer_minmax( placement = "rl", rot_adjuster = angle_fixed(1.5), n = 0 ) out <- lp(lines, labels_data) expect_equal(out$x, c(0.25, 0.75, 0, 1)) expect_equal(out$y, rep(0.5, 4)) expect_equal(out$theta, rep(1.5, 4)) lp <- label_placer_minmax(placement = NULL) out <- lp(lines, labels_data) expect_equal(nrow(out), 0) }) test_that("angle adjustments", { theta <- c(-3, -2, -1, 0, 1, 2, 3) expect_equal( angle_halfcircle_bottom()(theta), c(-3 + pi, -2 + pi, -1, 0, 1, 2 - pi, 3 - pi) ) expect_equal( angle_halfcircle_right()(theta + 2), c(-1 + pi, 0 + pi, 1, 2, 3, 4 - pi, 5 - pi) ) expect_equal( angle_fixed()(theta), rep(0, length(theta)) ) expect_equal( angle_fixed(2)(theta), rep(2, length(theta)) ) expect_equal( angle_identity()(theta), theta ) }) test_that("none label placer", { lines <- list( "1" = list( x = c(.5, .75, .5, .25), y = c(.25, .5, .75, .5), id = rep(1, 4) ), "2" = list(x = c(.5, 1, .5, 0), y = c(0, .5, 1, .5), id = rep(1, 4)) ) labels_data <- data.frame( index = 1:2, break_index = c(3, 7), break_id = c("1", "2"), label = c("a", "b"), stringsAsFactors = FALSE ) lp <- label_placer_none() out <- lp(lines, labels_data) expect_equal(nrow(out), 0) }) test_that("manual label placer", { lines <- list( "1" = list( x = c(.5, .75, .5, .25), y = c(.25, .5, .75, .5), id = rep(1, 4) ), "2" = list(x = c(.5, 1, .5, 0), y = c(0, .5, 1, .5), id = rep(1, 4)) ) labels_data <- data.frame( index = 1:2, break_index = c(3, 7), break_id = c("1", "2"), label = c("a", "b"), stringsAsFactors = FALSE ) lp <- label_placer_manual( breaks = c("1", "2", "3", "2"), x = 1:4, y = 4:1, theta = (1:4) - 2 ) out <- lp(lines, labels_data) expect_equal(out$index, c(1, 2, 2)) expect_equal(out$break_index, c(3, 7, 7)) expect_equal(out$break_id, c("1", "2", "2")) expect_equal(out$label, c("a", "b", "b")) expect_equal(out$x, c(1, 2, 4)) expect_equal(out$y, c(4, 3, 1)) expect_equal(out$theta, c(-1, 0, 2)) }) # Two isolines id=1 test_that("middle label placer", { lines <- list( "1" = list( x = c(.5, .75, .5, .25), y = c(.25, .5, .75, .5), id = rep(1, 4) ), "2" = list(x = c(.5, 1, .5, 0), y = c(0, .5, 1, .5), id = rep(1, 4)) ) labels_data <- data.frame( index = 1:2, break_index = c(3, 7), break_id = c("1", "2"), label = c("a", "b"), stringsAsFactors = FALSE ) lp <- label_placer_middle() out <- lp(lines, labels_data) expect_equal(out$index, 1:2) expect_equal(out$break_index, c(3, 7)) expect_equal(out$break_id, c("1", "2")) expect_equal(out$label, c("a", "b")) expect_equal(out$x, c(0.75, 1)) expect_equal(out$y, c(0.5, 0.5)) expect_equal(out$theta, c(pi / 2, pi / 2)) }) # One isoline with two id values (1 and 2) test_that("middle label placer", { lines <- list( "1" = list( x = c(.5, .75, .5, .25, .5, 1, .5, 0), y = c(.25, .5, .75, .5, 0, .5, 1, .5), id = c(rep(1, 4), rep(2, 4)) ) ) labels_data <- data.frame( index = 1, break_index = 3, break_id = "1", label = "a", stringsAsFactors = FALSE ) lp <- label_placer_middle() out <- lp(lines, labels_data) expect_equal(out$index, c(1, 1)) expect_equal(out$break_index, c(3, 3)) expect_equal(out$break_id, c("1", "1")) expect_equal(out$label, c("a", "a")) expect_equal(out$x, c(0.75, 1)) expect_equal(out$y, c(0.5, 0.5)) expect_equal(out$theta, c(pi / 2, pi / 2)) }) isoband/tests/testthat/test-isolines-grob.R0000644000176200001440000000261215114504265020553 0ustar liggesuserstest_that("basic functions", { m <- matrix( c( 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 2, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ), 5, 5, byrow = TRUE ) l <- isolines((1:5) / 6, (5:1) / 6, m, c(.5, 1.5)) # incorrect number of labels expect_snapshot( isolines_grob(l, labels = c("a", "b", "c")), error = TRUE ) # incorrect margin specification expect_snapshot( isolines_grob(l, margin = 1:4), error = TRUE ) expect_snapshot( isolines_grob(l, margin = grid::unit(1:3, "pt")), error = TRUE ) # default settings create two labels per line for this dataset g <- isolines_grob(l, label_placer = label_placer_minmax(n = 0)) expect_equal(g$labels_data$break_id, c("0.5", "0.5", "1.5", "1.5")) expect_equal(g$labels_data$label, c("0.5", "0.5", "1.5", "1.5")) expect_equal(g$labels_data$x, rep(0.5, 4)) expect_equal(g$labels_data$theta, rep(0, 4)) expect_true(all( abs(g$labels_data$y - c(0.75, 0.25, 0.5833333, 0.4166667)) < 1e-7 )) # extra breaks are ignored g <- isolines_grob( l, breaks = c("0.5", "1.5", "2.5"), labels = c("a", "b", "c") ) expect_equal(g$labels_data$break_id, c("0.5", "0.5", "1.5", "1.5")) expect_equal(g$labels_data$label, c("a", "a", "b", "b")) }) isoband/tests/testthat/test-isobands.R0000644000176200001440000005312615114504265017607 0ustar liggesuserstest_that("elementary polygons get merged", { # two connected polygons get merged z <- matrix(c(0, 0, 1, 1, 1, 1), ncol = 3, nrow = 2, byrow = TRUE) out <- isobands(x = 1:3, y = 2:1, z, levels_low = 0.5, levels_high = 1.5) expect_setequal( 10000 * out[[1]]$x + out[[1]]$y, 10000 * c(3.0, 2.0, 1.0, 1.0, 2.0, 2.5, 3.0) + c(1.0, 1.0, 1.0, 1.5, 1.5, 2.0, 2.0) ) expect_equal(out[[1]]$id, rep(1, 7)) # # two unconnected polygons don't get merged z <- matrix(c(1, 2, 1, 1, 2, 2), ncol = 3, nrow = 2, byrow = TRUE) out <- isobands(x = 1:3, y = 2:1, z, levels_low = 0.5, levels_high = 1.5) expect_setequal( 10000 * out[[1]]$x + out[[1]]$y, 10000 * c(3.0, 2.5, 3.0, 1.0, 1.5, 1.5, 1.0) + c(1.5, 2.0, 2.0, 2.0, 2.0, 1.0, 1.0) ) expect_setequal(out[[1]]$id, c(1:2)) expect_equal(length(out[[1]]$id), 7) # two separate bands get merged in second row z <- matrix(c(1, 2, 1, 1, 2, 1, 0, 0, 0), ncol = 3, nrow = 3, byrow = TRUE) out <- isobands(x = 1:3, y = 3:1, z, levels_low = 0.5, levels_high = 1.5) expect_setequal( 10000 * out[[1]]$x + out[[1]]$y, 10000 * c(3.0, 2.0, 1.0, 1.0, 1.0, 1.5, 1.5, 2.0, 2.5, 2.5, 3.0, 3.0) + c(1.50, 1.25, 1.50, 2.00, 3.00, 3.00, 2.00, 1.75, 2.00, 3.00, 3.00, 2.00) ) expect_equal(out[[1]]$id, rep(1, 12)) # circle gets closed z <- matrix(c(1, 1, 1, 1, 2, 1, 1, 1, 1), ncol = 3, nrow = 3, byrow = TRUE) out <- isobands(x = 1:3, y = 3:1, z, levels_low = 0.5, levels_high = 1.5) expect_setequal( 10000 * out[[1]]$x + out[[1]]$y, 10000 * c(3.0, 2.0, 1.0, 1.0, 1.0, 2.0, 3.0, 3.0, 2.0, 2.5, 2.0, 1.5) + c(1.0, 1.0, 1.0, 2.0, 3.0, 3.0, 3.0, 2.0, 1.5, 2.0, 2.5, 2.0) ) expect_setequal(out[[1]]$id, c(1:2)) expect_equal(length(out[[1]]$id), 12) }) test_that("NAs are handled correctly", { z <- matrix(c(NA, 1, 1, 1, 1, 1, 1, 1, 1), ncol = 3, nrow = 3, byrow = TRUE) out <- isobands(x = 1:3, y = 3:1, z, levels_low = 0.5, levels_high = 1.5) expect_setequal( 10000 * out[[1]]$x + out[[1]]$y, 10000 * c(3, 2, 1, 1, 2, 2, 3, 3) + c(1, 1, 1, 2, 2, 3, 3, 2) ) expect_equal(out[[1]]$id, rep(1, 8)) z <- matrix(c(NA, 1, 1, 1, 1, 1, 1, 1, NA), ncol = 3, nrow = 3, byrow = TRUE) out <- isobands(x = 1:3, y = 3:1, z, levels_low = 0.5, levels_high = 1.5) expect_setequal( 10000 * out[[1]]$x + out[[1]]$y, 10000 * c(1, 1, 2, 2, 2, 2, 3, 3) + c(1, 2, 2, 1, 2, 3, 3, 2) ) expect_setequal(out[[1]]$id, c(1:2)) expect_equal(length(out[[1]]$id), 8) }) test_that("All elementary shapes are calculated correctly", { # a matrix that requires all elementary shapes for isobanding z <- matrix( c( 0, 0, 0, 1, 0, 2, 1, 0, 1, 1, 1, 2, 2, 0, 2, 1, 2, 2, 0, 0, 0, 1, 0, 2, 1, 0, 1, 1, 1, 2, 2, 0, 2, 1, 2, 2, 0, 1, 0, 2, 1, 0, 1, 1, 1, 2, 2, 0, 2, 1, 2, 2, 0, 0, 1, 0, 1, 1, 1, 2, 2, 0, 2, 1, 2, 2, 0, 0, 0, 1, 0, 2, 2, 0, 2, 1, 2, 2, 0, 0, 0, 1, 0, 2, 1, 0, 1, 1, 1, 2, 0, 1, 0, 2, 1, 0, 1, 1, 1, 2, 2, 0, 2, 1, 2, 2, 0, 0, 2, 0, 2, 1, 2, 2, 0, 0, 0, 1, 0, 2, 1, 0, 1, 1, 1, 2, 1, 0, 1, 1, 1, 2, 2, 0, 2, 1, 2, 2, 0, 0, 0, 1, 0, 2, 0, 1, 0, 2, 1, 0, 1, 1, 1, 2, 2, 0, 2, 1, 2, 2, 0, 0, 0, 0, 0, 1, 0, 2, 1, 0, 1, 1, 1, 2, 2, 0, 2, 1, 2, 2, 0, 0, 0, 1, 0, 2, 1, 0, 1, 1, 1, 2, 2, 0, 2, 1, 2, 2 ), ncol = 18, nrow = 11, byrow = TRUE ) out <- isobands(x = 1:18, y = 11:1, z, levels_low = 0.5, levels_high = 1.5) expect_setequal( 10000 * out[[1]]$x + out[[1]]$y, 10000 * c( 16.00, 15.50, 15.50, 16.00, 16.25, 16.00, 15.00, 14.50, 14.75, 14.75, 14.25, 14.25, 14.00, 13.75, 13.75, 13.25, 13.25, 13.50, 13.00, 12.75, 12.00, 11.50, 11.50, 11.00, 10.00, 9.00, 8.50, 8.50, 8.00, 7.50, 7.50, 7.00, 6.50, 6.50, 6.00, 5.75, 5.75, 5.25, 5.25, 5.00, 4.50, 4.50, 4.00, 3.50, 3.50, 3.25, 3.00, 2.50, 2.00, 1.50, 1.00, 1.00, 1.00, 1.25, 1.00, 1.00, 1.50, 1.00, 1.00, 1.25, 1.00, 1.00, 1.00, 1.50, 2.00, 2.50, 3.00, 3.25, 3.50, 3.50, 4.00, 4.50, 4.50, 5.00, 5.25, 5.25, 5.75, 5.75, 6.00, 6.50, 6.50, 7.00, 7.50, 7.50, 8.00, 8.50, 8.50, 9.00, 10.00, 11.00, 11.50, 11.50, 12.00, 12.75, 13.00, 13.50, 13.25, 13.25, 13.75, 13.75, 14.00, 14.25, 14.25, 14.75, 14.75, 14.50, 15.00, 16.00, 16.25, 16.00, 15.50, 15.50, 16.00, 16.50, 16.50, 17.00, 18.00, 18.00, 17.00, 16.75, 16.50, 17.00, 17.25, 18.00, 18.00, 17.75, 17.50, 18.00, 18.00, 17.00, 16.75, 17.00, 18.00, 18.00, 17.50, 17.75, 18.00, 18.00, 17.25, 17.00, 16.50, 16.75, 17.00, 18.00, 18.00, 17.00, 16.50, 16.50, 12.00, 12.25, 12.00, 11.75, 11.00, 11.25, 12.00, 12.25, 12.50, 12.00, 11.75, 11.00, 10.50, 10.00, 9.50, 9.00, 8.75, 9.00, 9.50, 10.00, 6.00, 6.50, 6.00, 5.50, 4.00, 4.50, 4.00, 3.75, 13.00, 14.00, 15.00, 15.50, 15.00, 14.50, 14.00, 13.50, 13.00, 12.75, 8.00, 8.25, 9.00, 9.50, 9.00, 8.00, 7.00, 6.75, 7.00, 7.75, 7.00, 7.25, 7.00, 6.25, 6.00, 5.00, 4.50, 5.00, 6.00, 6.25, 7.00, 7.25, 7.00, 6.00, 5.50, 5.00, 4.50, 4.00, 3.75, 4.00, 4.50, 5.00, 5.50, 6.00, 2.00, 2.50, 2.25, 2.00, 1.75, 1.50, 11.00, 11.25, 11.00, 10.50, 13.00, 13.50, 13.00, 12.75, 12.00, 12.25, 12.00, 11.75, 11.00, 11.25, 11.00, 10.00, 9.50, 10.00, 9.00, 8.25, 8.00, 7.75, 7.00, 6.75, 7.00, 8.00, 9.00, 9.50, 16.25, 16.00, 15.00, 14.50, 15.00, 16.00, 15.00, 14.00, 13.00, 12.75, 13.00, 13.50, 14.00, 14.50, 15.00, 15.50, 12.00, 12.50, 12.25, 12.00, 11.25, 11.00, 10.00, 9.50, 9.00, 8.75, 9.00, 9.50, 10.00, 10.50, 11.00, 11.75, 11.00, 11.25, 11.00, 10.50, 6.00, 5.50, 6.00, 6.50, 3.00, 2.50, 3.00, 3.25, 3.00, 3.50, 3.00, 2.75, 2.00, 2.25, 2.50, 2.00, 1.50, 1.75, 3.00, 2.75, 3.00, 3.50, 4.00, 3.75, 4.00, 4.50, 12.00, 12.25, 12.00, 11.75, 6.00, 6.50, 6.00, 5.50 ) + c( 1.00, 1.00, 2.00, 2.50, 3.00, 3.50, 3.25, 3.00, 2.00, 1.00, 1.00, 2.00, 2.50, 2.00, 1.00, 1.00, 2.00, 3.00, 3.25, 3.00, 2.25, 2.00, 1.00, 1.00, 1.00, 1.00, 1.00, 2.00, 2.50, 2.00, 1.00, 1.00, 1.00, 2.00, 2.25, 2.00, 1.00, 1.00, 2.00, 2.50, 2.00, 1.00, 1.00, 1.00, 2.00, 3.00, 3.50, 3.00, 2.50, 3.00, 3.50, 4.00, 4.50, 5.00, 5.25, 5.75, 6.00, 6.25, 6.75, 7.00, 7.50, 8.00, 8.50, 9.00, 9.50, 9.00, 8.50, 9.00, 10.00, 11.00, 11.00, 11.00, 10.00, 9.50, 10.00, 11.00, 11.00, 10.00, 9.75, 10.00, 11.00, 11.00, 11.00, 10.00, 9.50, 10.00, 11.00, 11.00, 11.00, 11.00, 11.00, 10.00, 9.75, 9.00, 8.75, 9.00, 10.00, 11.00, 11.00, 10.00, 9.50, 10.00, 11.00, 11.00, 10.00, 9.00, 8.75, 8.50, 9.00, 9.50, 10.00, 11.00, 11.00, 11.00, 10.00, 9.75, 9.75, 9.25, 9.25, 9.00, 8.00, 7.50, 8.00, 8.75, 8.25, 8.00, 7.00, 6.75, 6.25, 6.50, 6.00, 5.50, 5.75, 5.25, 5.00, 4.00, 3.75, 3.25, 4.00, 4.50, 4.00, 3.00, 2.75, 2.75, 2.25, 2.25, 2.00, 1.00, 2.75, 3.00, 3.25, 3.00, 2.50, 3.00, 3.75, 4.00, 5.00, 5.25, 5.00, 4.25, 4.00, 3.50, 4.00, 4.25, 4.00, 3.50, 3.00, 2.50, 2.75, 3.00, 3.25, 3.00, 2.50, 3.00, 3.50, 3.00, 3.75, 3.50, 3.75, 4.00, 4.50, 5.00, 5.50, 5.00, 4.50, 4.00, 3.50, 4.00, 4.75, 5.00, 5.50, 5.50, 5.50, 5.00, 4.75, 4.00, 3.50, 4.00, 4.25, 5.00, 5.25, 5.50, 6.00, 6.50, 6.75, 7.00, 7.75, 8.00, 8.50, 8.25, 8.00, 7.50, 7.00, 6.50, 6.00, 5.50, 5.00, 4.50, 4.00, 3.75, 3.50, 4.00, 5.00, 5.50, 5.00, 4.00, 4.75, 5.00, 5.25, 5.00, 5.50, 6.00, 6.50, 6.00, 5.75, 6.00, 6.25, 6.00, 5.75, 6.00, 6.25, 6.50, 6.00, 5.50, 7.25, 8.00, 8.50, 8.00, 7.25, 7.00, 6.50, 6.50, 6.50, 7.00, 6.00, 6.50, 6.50, 6.00, 5.50, 5.50, 8.25, 8.50, 8.25, 8.00, 7.50, 7.00, 6.50, 7.00, 7.50, 8.00, 6.75, 7.00, 8.00, 8.25, 9.00, 9.50, 9.50, 9.00, 8.50, 8.00, 7.75, 8.00, 8.50, 8.00, 7.75, 7.00, 6.75, 7.00, 7.25, 7.00, 6.25, 6.00, 5.75, 6.00, 6.25, 6.00, 5.75, 6.00, 6.75, 7.00, 7.50, 7.00, 6.50, 7.00, 8.00, 8.50, 8.00, 7.00, 5.25, 5.00, 4.50, 5.00, 9.50, 9.00, 8.50, 9.00, 8.75, 9.00, 9.25, 9.00, 8.75, 9.00, 9.25, 9.00 ) ) expect_setequal(out[[1]]$id, c(1:26)) expect_equal(length(out[[1]]$id), 324) }) test_that("Six-sided saddles", { # a matrix that contains all six-sided saddles z <- matrix( c(0, 1, 1, 2, 1, 0, 2, 1, 0, 1, 1, 2), ncol = 4, nrow = 3, byrow = TRUE ) # midpoint outside the band out <- isobands(x = 1:4, y = 3:1, z, levels_low = 0.6, levels_high = 1.4) expect_setequal( 10000 * out[[1]]$x + out[[1]]$y, 10000 * c( 3.0, 2.0, 1.6, 2.0, 2.3, 2.0, 1.6, 2.0, 3.0, 3.4, 3.0, 2.7, 3.0, 3.4, 1.0, 1.0, 1.0, 1.4, 4.0, 4.0, 4.0, 3.6 ) + c( 1.0, 1.0, 1.0, 1.4, 2.0, 2.6, 3.0, 3.0, 3.0, 3.0, 2.6, 2.0, 1.4, 1.0, 1.6, 2.0, 2.4, 2.0, 2.4, 2.0, 1.6, 2.0 ) ) expect_setequal(out[[1]]$id, c(1:3)) expect_equal(length(out[[1]]$id), 22) # midpoint inside the band out <- isobands(x = 1:4, y = 3:1, z, levels_low = 0.4, levels_high = 1.6) expect_setequal( 10000 * out[[1]]$x + out[[1]]$y, 10000 * c( 3.0, 2.0, 1.4, 1.0, 1.0, 1.0, 1.4, 2.0, 3.0, 3.6, 4.0, 4.0, 4.0, 3.6, 3.0, 3.4, 3.0, 2.8, 2.0, 2.2, 2.0, 1.6 ) + c( 1.0, 1.0, 1.0, 1.4, 2.0, 2.6, 3.0, 3.0, 3.0, 3.0, 2.6, 2.0, 1.4, 1.0, 1.6, 2.0, 2.4, 2.0, 1.6, 2.0, 2.4, 2.0 ) ) expect_setequal(out[[1]]$id, c(1:3)) expect_equal(length(out[[1]]$id), 22) }) test_that("Seven-sided saddles", { # a matrix that contains all seven-sided saddles z <- matrix( c(0, 1, 0, 1, 2, 1, 2, 0, 2, 2, 0, 2, 0, 1, 0, 1, 2, 1), ncol = 6, nrow = 3, byrow = TRUE ) # midpoint inside the band out <- isobands(x = 1:6, y = 3:1, z, levels_low = 0.5, levels_high = 1.5) expect_setequal( 10000 * out[[1]]$x + out[[1]]$y, 10000 * c( 6.00, 6.00, 5.50, 5.00, 4.50, 4.00, 3.50, 3.00, 2.50, 2.00, 1.50, 1.00, 1.00, 1.25, 1.00, 1.00, 1.50, 2.00, 2.50, 3.00, 3.50, 4.00, 4.50, 5.00, 5.50, 6.00, 6.00, 5.75, 4.00, 4.25, 4.00, 3.00, 2.75, 3.00, 2.00, 2.25, 2.00, 1.75, 5.00, 5.25, 5.00, 4.75 ) + c( 1.50, 1.00, 1.00, 1.25, 1.00, 1.00, 1.00, 1.25, 1.00, 1.00, 1.00, 1.25, 1.75, 2.00, 2.25, 2.75, 3.00, 3.00, 3.00, 2.75, 3.00, 3.00, 3.00, 2.75, 3.00, 3.00, 2.50, 2.00, 1.50, 2.00, 2.50, 2.25, 2.00, 1.75, 1.50, 2.00, 2.50, 2.00, 1.75, 2.00, 2.25, 2.00 ) ) expect_setequal(out[[1]]$id, c(1:4)) expect_equal(length(out[[1]]$id), 42) # midpoint outside the band out <- isobands(x = 1:6, y = 3:1, z, levels_low = 0.8, levels_high = 1.2) expect_setequal( 10000 * out[[1]]$x + out[[1]]$y, 10000 * c( 6.0, 6.0, 5.8, 5.0, 4.4, 5.0, 5.6, 4.2, 4.0, 3.8, 3.0, 2.4, 3.0, 3.8, 4.0, 4.2, 4.0, 3.0, 2.6, 3.0, 4.0, 2.2, 2.0, 1.8, 2.0, 1.0, 1.4, 1.0, 1.0, 1.6, 1.0, 5.0, 5.4, 5.0, 4.6, 6.0, 5.8, 6.0, 2.2, 2.0, 1.8, 2.0 ) + c( 1.2, 1.0, 1.0, 1.4, 2.0, 2.6, 2.0, 1.0, 1.0, 1.0, 1.4, 2.0, 2.6, 3.0, 3.0, 3.0, 2.8, 2.4, 2.0, 1.6, 1.2, 1.0, 1.0, 1.0, 1.2, 1.6, 2.0, 2.4, 2.6, 2.0, 1.4, 1.6, 2.0, 2.4, 2.0, 2.8, 3.0, 3.0, 3.0, 2.8, 3.0, 3.0 ) ) expect_setequal(out[[1]]$id, c(1:8)) expect_equal(length(out[[1]]$id), 42) }) test_that("Eight-sided saddles", { # a matrix that contains all eight-sided saddles z <- matrix(c(0, 2, 0, 2, 0, 2), ncol = 3, nrow = 2, byrow = TRUE) # midpoint above the band out <- isobands(x = 1:3, y = 2:1, z, levels_low = 0.5, levels_high = 0.8) expect_setequal( 10000 * out[[1]]$x + out[[1]]$y, 10000 * c( 3.00, 3.00, 2.60, 2.75, 2.00, 2.40, 2.25, 2.00, 1.75, 1.60, 1.00, 1.00, 1.25, 1.40 ) + c( 1.75, 1.60, 2.00, 2.00, 1.40, 1.00, 1.00, 1.25, 1.00, 1.00, 1.60, 1.75, 2.00, 2.00 ) ) expect_setequal(out[[1]]$id, c(1:3)) expect_equal(length(out[[1]]$id), 14) # midpoint inside the band out <- isobands(x = 1:3, y = 2:1, z, levels_low = 0.5, levels_high = 1.5) expect_setequal( 10000 * out[[1]]$x + out[[1]]$y, 10000 * c( 2.75, 2.25, 2.00, 1.75, 1.25, 1.00, 1.00, 1.25, 1.75, 2.00, 2.25, 2.75, 3.00, 3.00 ) + c( 1.00, 1.00, 1.25, 1.00, 1.00, 1.25, 1.75, 2.00, 2.00, 1.75, 2.00, 2.00, 1.75, 1.25 ) ) expect_equal(out[[1]]$id, rep(1, 14)) # midpoint below the band out <- isobands(x = 1:3, y = 2:1, z, levels_low = 1.2, levels_high = 1.5) expect_setequal( 10000 * out[[1]]$x + out[[1]]$y, 10000 * c( 3.00, 3.00, 2.75, 2.60, 2.40, 2.00, 1.60, 1.75, 2.00, 2.25, 1.40, 1.25, 1.00, 1.00 ) + c( 1.40, 1.25, 1.00, 1.00, 2.00, 1.60, 2.00, 2.00, 1.75, 2.00, 1.00, 1.00, 1.25, 1.40 ) ) expect_setequal(out[[1]]$id, c(1:3)) expect_equal(length(out[[1]]$id), 14) }) test_that("Inconsistent numbers of isoband levels cause an error", { m <- matrix( c(0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0), 4, 4, byrow = TRUE ) # single values are recycled expect_silent( isobands(1:4, 1:4, m, 0.5, c(0.5, 1.5)) ) expect_silent( isobands(1:4, 1:4, m, c(0.5, 1.5), 0.5) ) # error, multiple values are not recycled expect_snapshot( isobands(1:4, 1:4, m, c(0.5, 1.5, 2.5), c(0.5, 1.5)), error = TRUE ) expect_snapshot( isobands(1:4, 1:4, m, c(0.5, 1.5), c(0.5, 1.5, 2.5)), error = TRUE ) }) test_that("Swap isoband levels if given in the wrong order", { m <- matrix( c(0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0), 4, 4, byrow = TRUE ) out1 <- isobands(1:4, 1:4, m, c(-.5, 0.5), c(0.5, 1.5)) out2 <- isobands(1:4, 1:4, m, c(0.5, 1.5), c(-.5, 0.5)) expect_equal(out1, out2) }) isoband/tests/testthat/test-isolines.R0000644000176200001440000001032315114504265017622 0ustar liggesuserstest_that("line segments get merged", { # two connected line segments get merged z <- matrix(c(0, 0, 1, 1, 1, 1), ncol = 3, nrow = 2, byrow = TRUE) out <- isolines(x = 1:3, y = 2:1, z, levels = 0.5) expect_setequal( 10000 * out[[1]]$x + out[[1]]$y, 10000 * c(1, 2, 2.5) + c(1.5, 1.5, 2.0) ) expect_equal(out[[1]]$id, rep(1, 3)) # two unconnected line segments don't get merged z <- matrix(c(0, 1, 0, 0, 1, 1), ncol = 3, nrow = 2, byrow = TRUE) out <- isolines(x = 1:3, y = 2:1, z, levels = 0.5) expect_setequal( 10000 * out[[1]]$x + out[[1]]$y, 10000 * c(2.5, 3.0, 1.5, 1.5) + c(2.0, 1.5, 2.0, 1.0) ) expect_setequal(out[[1]]$id, c(1:2)) expect_equal(length(out[[1]]$id), 4) # two separate lines get merged in second row z <- matrix(c(0, 1, 0, 0, 1, 0, 0, 0, 0), ncol = 3, nrow = 3, byrow = TRUE) out <- isolines(x = 1:3, y = 3:1, z, levels = 0.5) expect_setequal( 10000 * out[[1]]$x + out[[1]]$y, 10000 * c(2.5, 2.5, 2.0, 1.5, 1.5) + c(3.0, 2.0, 1.5, 2.0, 3.0) ) expect_equal(out[[1]]$id, rep(1, 5)) # circle gets closed z <- matrix(c(0, 0, 0, 0, 1, 0, 0, 0, 0), ncol = 3, nrow = 3, byrow = TRUE) out <- isolines(x = 1:3, y = 3:1, z, levels = 0.5) # circle is closed expect_equal(out[[1]]$x[1], out[[1]]$x[5]) expect_equal(out[[1]]$y[1], out[[1]]$y[5]) # coords are correct expect_setequal( 10000 * out[[1]]$x + out[[1]]$y, 10000 * c(2.5, 2.0, 1.5, 2.0, 2.5) + c(2.0, 2.5, 2.0, 1.5, 2.0) ) expect_equal(out[[1]]$id, rep(1, 5)) }) test_that("NAs are handled correctly", { z <- matrix(c(NA, 0, 0, 0, 1, 1, 0, 1, 1), ncol = 3, nrow = 3, byrow = TRUE) out <- isolines(x = 1:3, y = 3:1, z, levels = 0.5) expect_setequal( 10000 * out[[1]]$x + out[[1]]$y, 10000 * c(1.5, 1.5, 2.0, 3.0) + c(2.0, 1.0, 2.5, 2.5) ) expect_setequal(out[[1]]$id, c(1:2)) expect_equal(length(out[[1]]$id), 4) }) test_that("All elementary segments are calculated correctly", { # a matrix that requires all elementary segments for isolines z <- matrix( c( 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1 ), ncol = 8, nrow = 5, byrow = TRUE ) out <- isolines(x = 1:8, y = 5:1, z, levels = 0.5) expect_setequal( 10000 * out[[1]]$x + out[[1]]$y, 10000 * c( 7.5, 7.0, 6.0, 5.5, 5.0, 4.5, 4.0, 3.5, 3.0, 2.5, 3.0, 4.0, 4.5, 2.5, 2.0, 1.5, 8.0, 7.0, 6.5, 7.0, 7.5, 8.0, 6.5, 6.5, 6.0, 5.5, 5.5, 3.5, 3.5, 3.0, 2.0, 1.5, 1.0 ) + c( 1.0, 1.5, 1.5, 2.0, 2.5, 3.0, 3.5, 3.0, 2.5, 2.0, 1.5, 1.5, 1.0, 1.0, 1.5, 1.0, 3.5, 3.5, 3.0, 2.5, 2.0, 1.5, 5.0, 4.0, 3.5, 4.0, 5.0, 5.0, 4.0, 3.5, 3.5, 3.0, 2.5 ) ) expect_setequal(out[[1]]$id, c(1:5)) expect_equal(length(out[[1]]$id), 33) }) test_that("Saddles", { # a matrix that contains all saddles (there are only two) z <- matrix(c(0, 1, 0, 1, 0, 1), ncol = 3, nrow = 2, byrow = TRUE) out <- isolines(x = 1:3, y = 2:1, z, levels = 0.5) expect_setequal( 10000 * out[[1]]$x + out[[1]]$y, 10000 * c(2.5, 3.0, 2.5, 2.0, 1.5, 1.5, 1.0) + c(2.0, 1.5, 1.0, 1.5, 1.0, 2.0, 1.5) ) expect_setequal(out[[1]]$id, c(1:3)) expect_equal(length(out[[1]]$id), 7) out <- isolines(x = 1:3, y = 2:1, z, levels = 0.6) expect_setequal( 10000 * out[[1]]$x + out[[1]]$y, 10000 * c(1.6, 2.0, 2.4, 3.0, 2.6, 1.0, 1.4) + c(2.0, 1.6, 2.0, 1.4, 1.0, 1.4, 1.0) ) expect_setequal(out[[1]]$id, c(1:3)) expect_equal(length(out[[1]]$id), 7) }) isoband/tests/testthat/test-clip-lines.R0000644000176200001440000001240515114543031020031 0ustar liggesuserstest_that("basic clipping", { x <- c(0, 0, 1, 1, 0) y <- c(0, 1, 1, 0, 0) id <- rep(1L, 5) # clip box entirely inside line out <- clip_lines_impl(x, y, id, .5, .5, .8, .8, 0, 1) expect_identical(out$x, x) expect_identical(out$y, y) expect_identical(out$id, id) # clip box entirely outside line out <- clip_lines_impl(x, y, id, .5, .5, 1.2, 1.2, 0, 1) expect_identical(out$x, numeric(0)) expect_identical(out$y, numeric(0)) expect_identical(out$id, integer(0)) # clip top right corner out <- clip_lines_impl(x, y, id, 1, 1, 1, 1, 0, 1) expect_equal(out$x, c(0.0, 0.0, 0.5, 1.0, 1.0, 0.0)) expect_equal(out$y, c(0.0, 1.0, 1.0, 0.5, 0.0, 0.0)) expect_identical(out$id, c(rep(1L, 3), rep(2L, 3))) # clip bottom left corner out <- clip_lines_impl(x, y, id, 0, 0, 1, 1, 0, 1) expect_equal(out$x, c(0.0, 0.0, 1.0, 1.0, 0.5)) expect_equal(out$y, c(0.5, 1.0, 1.0, 0.0, 0.0)) expect_identical(out$id, rep(1L, 5)) # clip right half out <- clip_lines_impl(x, y, id, 1, .5, 1, 2, 0, 1) expect_equal(out$x, c(0.0, 0.0, 0.5, 0.5, 0.0)) expect_equal(out$y, c(0, 1, 1, 0, 0)) expect_identical(out$id, c(rep(1L, 3), 2L, 2L)) # clip left half out <- clip_lines_impl(x, y, id, 0, .5, 1, 2, 0, 1) expect_equal(out$x, c(0.5, 1.0, 1.0, 0.5)) expect_equal(out$y, c(1, 1, 0, 0)) expect_identical(out$id, rep(1L, 4)) # clip in middle out <- clip_lines_impl(x, y, id, .5, .5, 2, .5, 0, 1) expect_equal(out$x, c(0, 0, 0, 0, 1, 1, 1, 1, 0)) expect_equal(out$y, c(0.00, 0.25, 0.75, 1.00, 1.00, 0.75, 0.25, 0.00, 0.00)) expect_identical(out$id, c(rep(1L, 2), rep(2L, 4), rep(3L, 3))) out <- clip_lines_impl(x, y, id, .5, .5, .5, 2, 0, 1) expect_equal(out$x, c(0.00, 0.00, 0.25, 0.75, 1.00, 1.00, 0.75, 0.25, 0.00)) expect_equal(out$y, c(0, 1, 1, 1, 1, 0, 0, 0, 0)) expect_identical(out$id, c(rep(1L, 3), rep(2L, 4), rep(3L, 2))) }) test_that("clip multiple line segments", { x <- c(0, 0, 1, 1, 2, 2, 3, 3) y <- c(0, 1, 1, 0, 2, 3, 3, 2) id <- c(rep(1L, 4), rep(2L, 4)) out <- clip_lines_impl(x, y, id, 0, 0, 1, 3, 0, 1) expect_equal(out$x, c(0.5, 1.0, 1.0, 2.0, 2.0, 3.0, 3.0)) expect_equal(out$y, c(1, 1, 0, 2, 3, 3, 2)) expect_identical(out$id, c(rep(1L, 3), rep(2L, 4))) out <- clip_lines_impl(x, y, id, 1.5, 1.5, 2, 4, 0, 1) expect_equal(out$x, c(0.0, 0.0, 0.5, 2.5, 3.0, 3.0)) expect_equal(out$y, c(0, 1, 1, 3, 3, 2)) expect_identical(out$id, c(rep(1L, 3), rep(2L, 3))) }) test_that("rotated clip box", { x <- c(0, 0, 1, 1, 0) y <- c(0, 1, 1, 0, 0) id <- rep(1L, 5) out <- clip_lines_impl( x, y, id, .5, .5, 5, sin(2 * pi * 45 / 360), 2 * pi * 45 / 360, 1 ) expect_equal(out$x, c(0.0, 0.0, 0.5, 1.0, 1.0, 0.5)) expect_equal(out$y, c(0.5, 1, 1, 0.5, 0, 0)) expect_identical(out$id, c(rep(1L, 3), rep(2L, 3))) out <- clip_lines_impl( x, y, id, .5, .5, 5, sin(2 * pi * 45 / 360), -2 * pi * 45 / 360, 1 ) expect_equal(out$x, c(0.0, 0.0, 0.5, 1.0, 1.0, 0.5, 0.0)) expect_equal(out$y, c(0.0, 0.5, 1, 1, 0.5, 0, 0)) expect_identical(out$id, c(rep(1L, 2), rep(2L, 3), rep(3L, 2))) out <- clip_lines_impl( x, y, id, .5, .5, sin(2 * pi * 45 / 360), 5, 2 * pi * 45 / 360, 1 ) expect_equal(out$x, c(0.0, 0.0, 0.5, 1.0, 1.0, 0.5, 0.0)) expect_equal(out$y, c(0.0, 0.5, 1, 1, 0.5, 0, 0)) expect_identical(out$id, c(rep(1L, 2), rep(2L, 3), rep(3L, 2))) }) test_that("singletons are carried over or clipped", { x <- c(0, 0, 1, 1, 2, 2, 3, 3) y <- c(0, 1, 1, 0, 2, 3, 3, 2) id <- c(1L, rep(2L, 3), rep(3L, 4)) out <- clip_lines_impl(x, y, id, 10, 10, 1, 1, 0, 1) expect_identical(out$x, x) expect_identical(out$y, y) expect_identical(out$id, id) out <- clip_lines_impl(x, y, id, 0, 0, .1, .1, 0, 1) expect_identical(out$x, x[2:8]) expect_identical(out$y, y[2:8]) expect_identical(out$id, id[2:8] - 1L) x <- c(0, 0, 1, 1, 2, 2, 3, 3) y <- c(0, 1, 1, 0, 2, 3, 3, 2) id <- c(rep(1L, 3), 2L, rep(3L, 4)) out <- clip_lines_impl(x, y, id, 10, 10, 1, 1, 0, 1) expect_equal(out$x, x) expect_equal(out$y, y) expect_identical(out$id, id) out <- clip_lines_impl(x, y, id, 1, 0, .1, .1, 0, 1) expect_identical(out$x, x[c(1:3, 5:8)]) expect_identical(out$y, y[c(1:3, 5:8)]) expect_identical(out$id, c(rep(1L, 3), rep(2L, 4))) x <- c(0, 0, 1, 1, 2, 2, 3, 3) y <- c(0, 1, 1, 0, 2, 3, 3, 2) id <- c(rep(1L, 3), rep(2L, 4), 3L) out <- clip_lines_impl(x, y, id, 10, 10, 1, 1, 0, 1) expect_equal(out$x, x) expect_equal(out$y, y) expect_identical(out$id, id) out <- clip_lines_impl(x, y, id, 3, 2, .1, .1, 0, 1) expect_identical(out$x, x[1:7]) expect_identical(out$y, y[1:7]) expect_identical(out$id, id[1:7]) }) test_that("empty or incorrect input", { out <- clip_lines_impl(numeric(0), numeric(0), integer(0), 3, 2, .1, .1, 0, 1) expect_identical(out$x, numeric(0)) expect_identical(out$y, numeric(0)) expect_identical(out$id, integer(0)) expect_snapshot( clip_lines_impl(numeric(0), numeric(1), integer(0), 3, 2, .1, .1, 0, 1), error = TRUE ) expect_snapshot( clip_lines_impl(numeric(0), numeric(0), integer(1), 3, 2, .1, .1, 0, 1), error = TRUE ) expect_snapshot( clip_lines_impl(numeric(1), numeric(0), integer(0), 3, 2, .1, .1, 0, 1), error = TRUE ) }) isoband/tests/testthat/_snaps/0000755000176200001440000000000015114543071016157 5ustar liggesusersisoband/tests/testthat/_snaps/isolines-grob.md0000644000176200001440000000103515114545753021265 0ustar liggesusers# basic functions Code isolines_grob(l, labels = c("a", "b", "c")) Condition Error in `isolines_grob()`: ! Number of labels must match the number of breaks. --- Code isolines_grob(l, margin = 1:4) Condition Error in `isolines_grob()`: ! The `margin` parameter must be a unit object of length four. --- Code isolines_grob(l, margin = grid::unit(1:3, "pt")) Condition Error in `isolines_grob()`: ! The `margin` parameter must be a unit object of length four. isoband/tests/testthat/_snaps/clip-lines.md0000644000176200001440000000104315114545753020547 0ustar liggesusers# empty or incorrect input Code clip_lines_impl(numeric(0), numeric(1), integer(0), 3, 2, 0.1, 0.1, 0, 1) Condition Error: ! Number of x and y coordinates must match. --- Code clip_lines_impl(numeric(0), numeric(0), integer(1), 3, 2, 0.1, 0.1, 0, 1) Condition Error: ! Number of x coordinates and id values must match. --- Code clip_lines_impl(numeric(1), numeric(0), integer(0), 3, 2, 0.1, 0.1, 0, 1) Condition Error: ! Number of x and y coordinates must match. isoband/tests/testthat/_snaps/isobands.md0000644000176200001440000000070015114545753020311 0ustar liggesusers# Inconsistent numbers of isoband levels cause an error Code isobands(1:4, 1:4, m, c(0.5, 1.5, 2.5), c(0.5, 1.5)) Condition Error in `isobands()`: ! Vectors specifying isoband levels must be of equal length or of length 1 --- Code isobands(1:4, 1:4, m, c(0.5, 1.5), c(0.5, 1.5, 2.5)) Condition Error in `isobands()`: ! Vectors specifying isoband levels must be of equal length or of length 1 isoband/tests/testthat/test-iso-to-sfg.R0000644000176200001440000001255415114504265017774 0ustar liggesuserstest_that("conversion of isolines to sfg", { #m <- matrix(c(0, 0, 0, 2, # 0, 1, 0, 2, # 0, 0, 0, 0), 3, 4, byrow = TRUE) #lines <- isolines(1:4, 3:1, m, c(0.5, 1.5)) lines <- structure( list( `0.5` = list( x = c(2.00, 2.50, 2.00, 1.50, 2.00, 3.25, 3.25, 4.00), y = c(1.50, 2.00, 2.50, 2.00, 1.50, 3.00, 2.00, 1.25), id = c(1, 1, 1, 1, 1, 2, 2, 2) ), `1.5` = list( x = c(3.75, 3.75, 4.00), y = c(3.00, 2.00, 1.75), id = c(1, 1, 1) ) ), class = c("isolines", "iso") ) out <- iso_to_sfg(lines) expect_equal( out[["0.5"]][[1]], cbind( c(2.00, 2.50, 2.00, 1.50, 2.00), c(1.50, 2.00, 2.50, 2.00, 1.50) ) ) expect_equal( out[["0.5"]][[2]], cbind( c(3.25, 3.25, 4.00), c(3.00, 2.00, 1.25) ) ) expect_equal( class(out[["0.5"]]), c("XY", "MULTILINESTRING", "sfg") ) expect_equal( out[["1.5"]][[1]], cbind( c(3.75, 3.75, 4.00), c(3.00, 2.00, 1.75) ) ) expect_equal( class(out[["1.5"]]), c("XY", "MULTILINESTRING", "sfg") ) }) test_that("conversion of isobands to sfg", { #m <- matrix(c(0, 0, 0, 0, 0, 0, # 0, 2, 2, 2, 2, 0, # 0, 2, 0, 0, 2, 0, # 0, 2, 0, 0, 2, 0, # 0, 2, 2, 2, 2, 0, # 0, 0, 0, 0, 0, 0), 6, 6, byrow = TRUE) #bands <- isobands(1:6, 1:6, m, 0.5, 1.5) bands <- structure( list( `0.5:1.5` = list( x = c( 5.00, 4.00, 3.00, 2.00, 1.25, 1.25, 1.25, 1.25, 2.00, 3.00, 4.00, 5.00, 5.75, 5.75, 5.75, 5.75, 5.25, 5.25, 5.25, 5.25, 5.00, 4.00, 3.00, 2.00, 1.75, 1.75, 1.75, 1.75, 2.00, 3.00, 4.00, 5.00, 4.25, 4.25, 4.00, 3.00, 2.75, 2.75, 3.00, 4.00, 4.75, 4.00, 3.00, 2.25, 2.25, 3.00, 4.00, 4.75 ), y = c( 5.75, 5.75, 5.75, 5.75, 5.00, 4.00, 3.00, 2.00, 1.25, 1.25, 1.25, 1.25, 2.00, 3.00, 4.00, 5.00, 5.00, 4.00, 3.00, 2.00, 1.75, 1.75, 1.75, 1.75, 2.00, 3.00, 4.00, 5.00, 5.25, 5.25, 5.25, 5.25, 4.00, 3.00, 2.75, 2.75, 3.00, 4.00, 4.25, 4.25, 4.00, 4.75, 4.75, 4.00, 3.00, 2.25, 2.25, 3.00 ), id = c( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4 ) ) ), class = c("isobands", "iso") ) out <- iso_to_sfg(bands) expect_equal( out[["0.5:1.5"]][[1]][[1]], cbind( c( 5.00, 4.00, 3.00, 2.00, 1.25, 1.25, 1.25, 1.25, 2.00, 3.00, 4.00, 5.00, 5.75, 5.75, 5.75, 5.75, 5.00 ), c( 5.75, 5.75, 5.75, 5.75, 5.00, 4.00, 3.00, 2.00, 1.25, 1.25, 1.25, 1.25, 2.00, 3.00, 4.00, 5.00, 5.75 ) ) ) expect_equal( out[["0.5:1.5"]][[1]][[2]], cbind( c( 5.25, 5.00, 4.00, 3.00, 2.00, 1.75, 1.75, 1.75, 1.75, 2.00, 3.00, 4.00, 5.00, 5.25, 5.25, 5.25, 5.25 ), c( 5.00, 5.25, 5.25, 5.25, 5.25, 5.00, 4.00, 3.00, 2.00, 1.75, 1.75, 1.75, 1.75, 2.00, 3.00, 4.00, 5.00 ) ) ) expect_equal( out[["0.5:1.5"]][[2]][[1]], cbind( c(4.75, 4.00, 3.00, 2.25, 2.25, 3.00, 4.00, 4.75, 4.75), c(4.00, 4.75, 4.75, 4.00, 3.00, 2.25, 2.25, 3.00, 4.00) ) ) expect_equal( out[["0.5:1.5"]][[2]][[2]], cbind( c(4.25, 4.00, 3.00, 2.75, 2.75, 3.00, 4.00, 4.25, 4.25), c(4.00, 4.25, 4.25, 4.00, 3.00, 2.75, 2.75, 3.00, 4.00) ) ) expect_equal( class(out[["0.5:1.5"]]), c("XY", "MULTIPOLYGON", "sfg") ) }) isoband/tests/testthat/test-cpp.R0000644000176200001440000000013115114477620016557 0ustar liggesusers# Commented out to remove compile-time dependency on testthat # run_cpp_tests("isoband") isoband/tests/testthat.R0000644000176200001440000000061215114504265015020 0ustar liggesusers# This file is part of the standard setup for testthat. # It is recommended that you do not modify it. # # Where should you do additional test configuration? # Learn more about the roles of various files in: # * https://r-pkgs.org/testing-design.html#sec-tests-files-overview # * https://testthat.r-lib.org/articles/special-files.html library(testthat) library(isoband) test_check("isoband") isoband/MD50000644000176200001440000000666315115215077012220 0ustar liggesusersb7905395d989c427f16b2177466f1f82 *DESCRIPTION fd29f135e91475dab010d4c458350167 *LICENSE 0b08cb67c371aa5ae6e4086a96a6003e *NAMESPACE 327f04a312d477d45476892b2a928cdb *NEWS.md 6177bee7a5d6412925ca22c579d73b5c *R/catch-routine-registration.R 4f77ade9d886257e0276a44d90a35431 *R/clip-lines.R cde2e8bde42a7277fac6738ab50db5be *R/cpp11.R 7d82c3ca014dce269d073b661071ddb7 *R/iso-to-sfg.R 96a65b6792807b53e633eff4b3049c92 *R/isoband-package.R 9027d2a8385a0170a3d0cde39bb7c951 *R/isobands-grob.R 841cc1f9eabd68d424bf20266f67ed80 *R/isobands.R c28d2104af7789f6ca4fc262174e31ac *R/isolines-grob.R c792da05e12b88be3f6835aa7faa4ef6 *R/label-placer.R 8af9745f4e4f97401cd1d0c7dcf2b9cb *R/plot-iso.R 04fddb3a245f5fc574320c1bc1c7cb90 *R/utilities.R 3317d6eda6c10633437e8d0fcba598fa *README.md 520ee083c227b2596e8349c3f5939f95 *build/vignette.rds a04a40ed5a30ba4828529130820a1ef3 *inst/doc/isoband1.R 646623a9b132e87fe68fc923354032a5 *inst/doc/isoband1.Rmd 9fa55d976d79bfae973adbe246dc3496 *inst/doc/isoband1.html 055106eed78beb602c605992a10d78e1 *inst/doc/isoband3.R 8a764c1b38546a9a5819bb285e7c3143 *inst/doc/isoband3.Rmd 9f13f7157bd36ec655fe23b94f271c8f *inst/doc/isoband3.html 4982eca2b1c0f4dba2e771dbcdb217be *inst/extdata/ocean-cat.jpg 936436350c43cd60434d76af8dd4d0da *man/angle_halfcircle_bottom.Rd 7553d8efb8831ffcc3e8bef24f8d6397 *man/clip_lines.Rd 24646c0a709860a5ee51db8c96b1901b *man/figures/README-basic-example-plot-1.png 42b0b694b0e4a7e98c9a7db659b6b468 *man/figures/README-volcano-1.png b1b0065382a9ba25acf3d9d848ddaced *man/figures/logo.png cdad55cede9fff4fb4c4b51256f5f05e *man/iso_to_sfg.Rd 59507d8b7c671e19b97e087769b2fed0 *man/isoband-package.Rd 2f749db681548986bea043265e946c3f *man/isobands.Rd e6414005fa788d49ef59732da41c0629 *man/isobands_grob.Rd b071066784f2475c1a42fb3dbf97ff82 *man/isolines_grob.Rd 40209cee102daeef99bcd40f6bf37bd6 *man/label_placer.Rd 51464d65197322829abb30b8fc3ff31e *man/label_placer_simple.Rd a7ea5c28ccb5b62c1a524cf71d5b9da9 *man/plot_iso.Rd 9440640553f2c2bebd585f9d14f89a7e *src/Makevars 9440640553f2c2bebd585f9d14f89a7e *src/Makevars.win 9148bb1d2aad78bdee91996b8e28815e *src/clip-lines.cpp 9edcaa259c9f1cc866603c1ed97c7e34 *src/clip-lines.h ee29e05c6d7de5a556baed5bcdb24e87 *src/cpp11.cpp 2a4581b78dd553c50e4eef51c731879d *src/isoband.cpp 406d1d0d8761c2df7a6a177cd9ae599a *src/polygon.cpp 4b5d7e7954f13b70ba899b219e1a81dc *src/polygon.h 27605a0ef8eb7d8707e779e914038a2d *src/separate-polygons.cpp ef0f3ce5fd22962f8dd4bdf6293f1ca1 *src/separate-polygons.h 56aeeedb32bc3d8c0f510e4e658f1d2d *src/test-clip-lines.cpp 5d3ba8dc9ac2d25c48cef6458f944e35 *src/test-runner.cpp bfe091947456d0e00a08cc4d4a7cc040 *src/test-separate-polygons.cpp af9d151a20c4cb54702bc5f41b0f3a6b *tests/testthat.R 8c834125312ce06600a767ad688d0d29 *tests/testthat/_snaps/clip-lines.md 9d01d561fb3cf8eddc844cc26a360ca2 *tests/testthat/_snaps/isobands.md ec6fbc041b71a50815bfbdd3b272ae83 *tests/testthat/_snaps/isolines-grob.md becad0df0cba1f1c5da9b2c15cf4f790 *tests/testthat/test-clip-lines.R 1de0837f3fc5b15a9d0f7c3778b65e3e *tests/testthat/test-cpp.R 57e138918c579aafc43d0792d6eb3a79 *tests/testthat/test-iso-to-sfg.R 4ddedffe6ea2ff5b13454600c0d9e30b *tests/testthat/test-isobands.R 9b4752f9846861dc017688b0cd2f3e69 *tests/testthat/test-isolines-grob.R 42d676875e7f5d035e2c4f4d75c9f911 *tests/testthat/test-isolines.R 1eb795b3eab2bd6b8648d91cde953671 *tests/testthat/test-label-placer.R 646623a9b132e87fe68fc923354032a5 *vignettes/isoband1.Rmd 8a764c1b38546a9a5819bb285e7c3143 *vignettes/isoband3.Rmd isoband/R/0000755000176200001440000000000015114546205012075 5ustar liggesusersisoband/R/cpp11.R0000644000176200001440000000103415114546205013142 0ustar liggesusers# Generated by cpp11: do not edit by hand clip_lines_impl <- function(x, y, id, p_mid_x, p_mid_y, width, height, theta, asp) { .Call(`_isoband_clip_lines_impl`, x, y, id, p_mid_x, p_mid_y, width, height, theta, asp) } isobands_impl <- function(x, y, z, value_low, value_high) { .Call(`_isoband_isobands_impl`, x, y, z, value_low, value_high) } isolines_impl <- function(x, y, z, value) { .Call(`_isoband_isolines_impl`, x, y, z, value) } separate_polygons <- function(x, y, id) { .Call(`_isoband_separate_polygons`, x, y, id) } isoband/R/utilities.R0000644000176200001440000000042415114504265014233 0ustar liggesusers# evaluates all arguments # (simpler than forcing each argument individually) force_all <- function(...) list(...) rethrow_interrupt <- function() { interrupt <- structure(list(), class = c("interrupt", "condition")) signalCondition(interrupt) invokeRestart("abort") } isoband/R/isobands-grob.R0000644000176200001440000000427315114504265014757 0ustar liggesusers#' Render isobands #' #' This function generates a grid grob that represents isobands. #' #' @param bands Isobands, as produced by the [`isobands()`] function. #' @param gp Grid graphical parameters. Parameters are recycled among #' the total number of bands drawn. #' @param units A character string specifying the units in which to #' interpret the isobands coordinates. Defaults to `"npc"`. #' @seealso #' See [`isolines_grob()`] for drawing of isolines. #' @examples #' library(grid) #' #' viridis_pal <- colorRampPalette( #' c("#440154", "#414487", "#2A788E", "#22A884", "#7AD151", "#FDE725"), #' space = "Lab" #' ) #' #' x <- (1:ncol(volcano))/(ncol(volcano)+1) #' y <- (nrow(volcano):1)/(nrow(volcano)+1) #' bands <- isobands(x, y, volcano, 5*(18:38), 5*(19:39)) #' #' b <- isobands_grob( #' bands, #' gp = gpar(col = "black", fill = viridis_pal(21), alpha = 0.5) #' ) #' #' grid.newpage() #' grid.draw(b) #' @export isobands_grob <- function(bands, gp = gpar(), units = "npc") { gTree( bands = bands, gp_user = gp, units = units, cl = "isobands_grob" ) } #' @export makeContent.isobands_grob <- function(x) { make_bands_grobs <- function( data, col, fill, alpha, lty, lwd, lex, lineend, linejoin, linemitre ) { if (length(data$x) == 0) { return(NULL) } pathGrob( data$x, data$y, data$id, default.units = x$units, gp = gpar( col = col, fill = fill, alpha = alpha, lty = lty, lwd = lwd, lex = lex, lineend = lineend, linejoin = linejoin, linemitre = linemitre ) ) } # merge current and grob-specific graphical parameters so we can redistribute among isolevels gp <- modifyList(get.gpar(), x$gp_user) n <- length(x$bands) bands_grobs <- mapply( make_bands_grobs, x$bands, rep_len(gp$col, n), rep_len(gp$fill, n), rep_len(gp$alpha, n), rep_len(gp$lty, n), rep_len(gp$lwd, n), rep_len(gp$lex, n), rep_len(gp$lineend, n), rep_len(gp$linejoin, n), rep_len(gp$linemitre, n), SIMPLIFY = FALSE ) children <- do.call(gList, bands_grobs) setChildren(x, children) } isoband/R/iso-to-sfg.R0000644000176200001440000000726615114543410014215 0ustar liggesusers#' Convert isolines or isobands to sfg object #' #' Convert isolines or isobands to an sf geometry collection (`sfg`) object. Further downstream #' processing needs to happen via the sf package. #' #' The function `iso_to_sfg()` is a generic that takes an object created by either [`isolines()`] #' or [`isobands()`] and turns it into a simple features (sf) geometry collection. Importantly, #' the isobanding algorithm can produce polygons that do not represent valid simple features. This #' happens usually when the lower limit of an isoband is exactly equal to some data values (see #' examples for a demonstration). This can be worked around either by slightly shifting the data #' or band limits (e.g., round all data values and then shift them by a value smaller than the #' rounding error) or by fixing the geometries using the function `st_make_valid()`. #' @param x The object to convert. #' @examples #' if (requireNamespace("sf", quietly = TRUE)) { #' library(sf) #' library(ggplot2) #' #' # Example 1: simple 5x5 matrix #' m <- matrix(c(0, 2, 2, 2, 0, #' 0, 1, 0, 1, 0, #' 0, 1, 0, 0, 0, #' 0, 1, 0, 1, 0, #' 0, 0, 0, 0, 0), 5, 5, byrow = TRUE) #' #' z <- isolines(1:ncol(m), nrow(m):1, m, c(0.5, 1.5)) #' lines <- iso_to_sfg(z) #' x <- st_sf(level = names(lines), geometry = st_sfc(lines)) #' ggplot(x) + geom_sf(aes(color = level)) #' #' # Example 2: volcano dataset #' m <- volcano #' b <- isobands((1:ncol(m))/(ncol(m)+1), (nrow(m):1)/(nrow(m)+1), m, #' 10*9:19, 10*10:20) #' bands <- iso_to_sfg(b) #' x <- st_sf(level = as.numeric(sub(":.*", "", names(bands))), geometry = st_sfc(bands)) #' ggplot(x) + geom_sf(aes(color = level, fill = level)) #' #' # Example 3: invalid simple features #' m <- matrix(c(1.5, 1.5, 1.5, 1.5, 0.6, #' 0.5, 1.5, 1.5, 0, 0, #' 0, 1, 0, 1, 1, #' 0, 1, 0, 0.7, 0, #' 0.9, 1.3, 1.8, 1.4, 0.4), 5, 5, byrow = TRUE) #' #' raw <- isobands(1:5, 5:1, m, levels_low = 0:1, levels_high = 1:2) #' bands <- iso_to_sfg(raw) #' #' iso <- st_sf( #' id = factor(1:length(bands)), #' geometry = st_sfc(bands) #' ) #' #' # the geometries are not valid #' st_is_valid(iso, reason = TRUE) #' # this doesn't prevent us from plotting them #' ggplot(iso, aes(fill = id)) + geom_sf() #' #' # make all geometries valid, requires GEOS >= 3.8.0 #' if (sf_extSoftVersion()["GEOS"] >= "3.8.0") { #' iso2 <- st_make_valid(iso) #' st_is_valid(iso2, reason=TRUE) #' # the plot should be unchanged #' ggplot(iso2, aes(fill = id)) + geom_sf() #' } #' #' # alternatively, if we shift all data values by a tiny #' # amount (here, 1e-10) so they don't coincide with the band #' # limits, no invalid geometries are generated. #' raw <- isobands(1:5, 5:1, m + 1e-10, levels_low = 0:1, levels_high = 1:2) #' bands <- iso_to_sfg(raw) #' iso <- st_sf(id = factor(1:length(bands)), geometry = st_sfc(bands)) #' st_is_valid(iso, reason = TRUE) #' } #' @export iso_to_sfg <- function(x) { UseMethod("iso_to_sfg", x) } #' @export iso_to_sfg.default <- function(x) { cli::cli_abort("Cannot convert objects of type {.cls {class(x)}} to sf.", ) } #' @export iso_to_sfg.isolines <- function(x) { mapply(multilinestring, x, SIMPLIFY = FALSE) } multilinestring <- function(object) { x <- split(object$x, object$id) y <- split(object$y, object$id) structure( unname(mapply(cbind, x, y, SIMPLIFY = FALSE)), class = c("XY", "MULTILINESTRING", "sfg") ) } #' @export iso_to_sfg.isobands <- function(x) { mapply(multipolygon, x, SIMPLIFY = FALSE) } multipolygon <- function(object) { separate_polygons( as.double(object$x), as.double(object$y), as.integer(object$id) ) } isoband/R/plot-iso.R0000644000176200001440000000446515114504265013777 0ustar liggesusers#' Visualize a single isoband #' #' This function visualizes a single isoband calculated from a matrix. It is mainly useful #' for debugging and visualizing the isobanding algorithm. See [`isobands()`] for more #' examples. #' #' @param m input matrix #' @param vlo lower cutoff for isobanding #' @param vhi higher cutoff for isobanding #' @param col_lo line color for lower cutoff #' @param col_hi line color for higher cutoff #' @param fill_lo fill color for points below the lower cutoff #' @param fill_mid fill color for points between the two cutoffs #' @param fill_hi fill color for points above the higher cutoff #' @param fill_band fill color for the isoband #' @param newpage boolean, indicating whether `grid.newpage()` should #' be called or not #' @examples #' m <- matrix(c(0, 0, 0, 0, 0, 0, #' 0, 2, 2, 2, 2, 0, #' 0, 2, 0, 0, 2, 0, #' 0, 2, 0, 0, 2, 0, #' 0, 2, 2, 2, 2, 0, #' 0, 0, 0, 0, 0, 0), 6, 6, byrow = TRUE) #' #' plot_iso(m, 0.5, 1.5) #' @export plot_iso <- function( m, vlo, vhi, fill_lo = "gray95", fill_mid = "gray50", fill_hi = "black", fill_band = "cornsilk", col_lo = "black", col_hi = "black", newpage = TRUE ) { x <- 0.05 + 0.9 * (0:(ncol(m) - 1)) / (ncol(m) - 1) y <- 0.05 + 0.9 * ((nrow(m) - 1):0) / (nrow(m) - 1) df_bands <- isobands(x, y, m, vlo, vhi)[[1]] df_lines_lo <- isolines(x, y, m, vlo)[[1]] df_lines_hi <- isolines(x, y, m, vhi)[[1]] df_points <- expand.grid(y = y, x = x) pfill <- c(ifelse(m < vlo, fill_lo, ifelse(m < vhi, fill_mid, fill_hi))) pcol <- c(ifelse(m < vlo, "black", ifelse(m < vhi, fill_mid, "black"))) if (isTRUE(newpage)) { grid.newpage() } if (length(df_bands$x) > 0) { grid.path( df_bands$x, df_bands$y, df_bands$id, gp = gpar(fill = fill_band, col = NA) ) } if (length(df_lines_lo$x) > 0) { grid.polyline( df_lines_lo$x, df_lines_lo$y, df_lines_lo$id, gp = gpar(col = col_lo) ) } if (length(df_lines_hi$x) > 0) { grid.polyline( df_lines_hi$x, df_lines_hi$y, df_lines_hi$id, gp = gpar(col = col_hi) ) } grid.points( df_points$x, df_points$y, default.units = "npc", pch = 21, size = unit(0.5, "char"), gp = gpar(fill = pfill, col = pcol) ) } isoband/R/isolines-grob.R0000644000176200001440000002426715114504265015007 0ustar liggesusers#' Render labeled isolines #' #' This function generates a grid grob that represents labeled isolines. #' #' @param lines Isolines, as produced by the [`isolines()`] function. #' @param gp Grid graphical parameters. Parameters applying to lines #' (such as `col`, `lwd`, `lty`, etc.) are recycled among the total #' number of lines drawn. Parameters applying only to labels (such #' as `fontfamily`, `fontsize`) are recycled among the specified #' breaks only. The two parameters `col` and `alpha` are also applied #' to labels, unless overridden (see `label_col` and `label_alpha`), #' but are matched to the corresponding lines. #' @param breaks Character vector specifying the isolines that should be #' labeled. If `NULL`, labels all isolines. #' @param labels Character vector specifying the labels for each break. #' If `NULL`, uses the breaks as labels. The number of labels provided #' must match the number of breaks provided. #' @param margin Unit object of length 4 specifying the top, right, bottom, #' and left margins around each text label. The same margins are applied #' to all labels. #' @param label_col Color applied to labels. Can be used to override the #' color provided in `gp`, in case labels and lines should have different #' colors. #' @param label_alpha Alpha applied to labels. Can be used to override the #' alpha value provided in `gp`, in case labels and lines should have #' different alpha values. #' @param label_placer Function that controls how labels are placed along #' the isolines. Uses [`label_placer_minmax()`] by default. #' @param units A character string specifying the units in which to #' interpret the isolines coordinates. Defaults to `"npc"`. #' @seealso #' See [`isobands_grob()`] for drawing of isobands. See [`label_placer_minmax()`] for #' label placement strategies. #' @examples #' library(grid) #' #' viridis_pal <- colorRampPalette( #' c("#440154", "#414487", "#2A788E", "#22A884", "#7AD151", "#FDE725"), #' space = "Lab" #' ) #' #' x <- (1:ncol(volcano))/(ncol(volcano)+1) #' y <- (nrow(volcano):1)/(nrow(volcano)+1) #' lines <- isolines(x, y, volcano, 5*(19:38)) #' bands <- isobands(x, y, volcano, 5*(18:38), 5*(19:39)) #' #' b <- isobands_grob( #' bands, #' gp = gpar(col = NA, fill = viridis_pal(21), alpha = 0.4) #' ) #' l <- isolines_grob( #' lines, breaks = 20*(5:10), #' gp = gpar( #' lwd = c(.3, 1, .3, .3) #' ) #' ) #' #' grid.newpage() #' grid.draw(b) #' grid.draw(l) #' @export isolines_grob <- function( lines, gp = gpar(), breaks = NULL, labels = NULL, margin = unit(c(1, 1, 1, 1), "pt"), label_col = NULL, label_alpha = NULL, label_placer = label_placer_minmax(), units = "npc" ) { if (is.null(breaks)) { breaks <- names(lines) } else { breaks <- as.character(breaks) } if (is.null(labels)) { labels <- breaks } else if (length(labels) != length(breaks)) { cli::cli_abort("Number of labels must match the number of breaks.") } else { labels <- as.character(labels) } if (length(margin) != 4 || !is.unit(margin)) { cli::cli_abort( "The {.arg margin} parameter must be a unit object of length four." ) } # first set up a data frame with all the label info labels_data <- data.frame( index = match(breaks, names(lines)), # index of labeled lines in original list of lines, for matching of graphical parameters break_index = 1:length(breaks), # index into original list of breaks, for matching graphical parameters break_id = breaks, # identifier for each break (corresponds to the name in the lines column) label = labels, # label for each break stringsAsFactors = FALSE ) # then calculate the position of all labels via the `label_placer()` function labels_data <- label_placer(lines, labels_data) gTree( lines = lines, breaks = breaks, labels = labels, labels_data = labels_data, gp_combined = gp, margin = margin, label_col = label_col, label_alpha = label_alpha, label_placer = label_placer, units = units, cl = "isolines_grob" ) } #' @export makeContext.isolines_grob <- function(x) { # store current graphics parameters for later x$gp_cur <- get.gpar() # if we have no labels then nothing else needs to be done if (nrow(x$labels_data) == 0) { return(x) } # we need to set up the gp slot for text labels, so font calculations work gp <- modifyList(x$gp_cur, x$gp_combined) # map graphical parameters to duplicated labels # we only handle font parameters here, to guarantee proper # calculation of label sizes n <- length(x$breaks) cex <- rep_len(gp$cex, n)[x$labels_data$break_index] lineheight <- rep_len(gp$lineheight, n)[x$labels_data$break_index] fontfamily <- rep_len(gp$fontfamily, n)[x$labels_data$break_index] fontsize <- rep_len(gp$fontsize, n)[x$labels_data$break_index] # fontface needs special treatment, since it can be NULL if font # is specified if (is.null(gp$fontface)) { # we work with font font <- rep_len(gp$font, n)[x$labels_data$break_index] x$gp <- gpar( cex = cex, fontsize = fontsize, lineheight = lineheight, fontfamily = fontfamily, font = font ) } else { # we work with fontface fontface <- rep_len(gp$fontface, n)[x$labels_data$break_index] x$gp <- gpar( cex = cex, fontsize = fontsize, lineheight = lineheight, fontfamily = fontfamily, fontface = fontface ) } x } #' @export makeContent.isolines_grob <- function(x) { labels_data <- x$labels_data if (nrow(labels_data) == 0) { # no labels to be drawn, nothing to be done return(isolines_grob_makeContent_nolabels(x)) } # need to correct angle for current aspect ratio Sy <- convertHeight(unit(1, "npc"), "mm", valueOnly = TRUE) Sx <- convertWidth(unit(1, "npc"), "mm", valueOnly = TRUE) theta <- atan(tan(labels_data$theta) * Sy / Sx) labels_data$theta <- ifelse(is.finite(theta), theta, 0) # calculate label widths and heights in npc units label_widths <- convertWidth( stringWidth(labels_data$label), x$units, valueOnly = TRUE ) label_heights <- convertHeight( stringHeight(labels_data$label) + stringDescent(labels_data$label), x$units, valueOnly = TRUE ) # get viewport aspect ratio to correct clipping for rotated labels asp <- convertHeight(unit(1, "pt"), x$units, valueOnly = TRUE) / convertWidth(unit(1, "pt"), x$units, valueOnly = TRUE) #print(asp) # calculate margins in npc units margin_rl <- convertWidth(x$margin[c(2, 4)], x$units, valueOnly = TRUE) margin_tb <- convertHeight(x$margin[c(1, 3)], x$units, valueOnly = TRUE) margin_w <- sum(margin_rl) margin_h <- sum(margin_tb) margin_wdiff <- margin_rl[2] - margin_rl[1] margin_hdiff <- margin_rl[1] - margin_rl[2] # calculate the clip box for each label # xoff and yoff are needed to correct for uneven label margins xoff <- -margin_wdiff * cos(labels_data$theta) / 2 + (margin_hdiff / asp) * sin(labels_data$theta) / 2 yoff <- -margin_wdiff * sin(labels_data$theta) / 2 - margin_hdiff * cos(labels_data$theta) / 2 clip_boxes <- data.frame( x = labels_data$x + xoff, y = labels_data$y + yoff, width = label_widths + margin_w, height = label_heights + margin_h, theta = labels_data$theta ) make_lines_grobs <- function( data, col, alpha, lty, lwd, lex, lineend, linejoin, linemitre ) { if (length(data$x) == 0) { return(NULL) } clipped <- clip_lines(data$x, data$y, data$id, clip_boxes, asp = asp) if (length(clipped$x) == 0) { return(NULL) } polylineGrob( clipped$x, clipped$y, clipped$id, default.units = x$units, gp = gpar( col = col, alpha = alpha, lty = lty, lwd = lwd, lex = lex, lineend = lineend, linejoin = linejoin, linemitre = linemitre ) ) } # merge current and grob-specific graphical parameters so we can redistribute among isolevels gp <- modifyList(x$gp_cur, x$gp_combined) n <- length(x$lines) lines_grobs <- mapply( make_lines_grobs, x$lines, rep_len(gp$col, n), rep_len(gp$alpha, n), rep_len(gp$lty, n), rep_len(gp$lwd, n), rep_len(gp$lex, n), rep_len(gp$lineend, n), rep_len(gp$linejoin, n), rep_len(gp$linemitre, n), SIMPLIFY = FALSE ) # calculate color and alpha for text labels if (is.null(x$label_col)) { col <- rep_len(gp$col, length(x$lines))[x$labels_data$index] } else { col <- rep_len(x$label_col, length(x$breaks))[x$labels_data$break_index] } if (is.null(x$label_alpha)) { # alpha is cumulative, so we don't take it from the current viewport alpha <- rep_len(x$gp_combined$alpha %||% 1, length(x$lines))[ x$labels_data$index ] } else { alpha <- rep_len(x$label_alpha, n)[x$labels_data$break_index] } labels_grob <- textGrob( labels_data$label, labels_data$x, labels_data$y, rot = 360 * labels_data$theta / (2 * pi), default.units = x$units, gp = gpar(col = col, alpha = alpha) ) children <- do.call(gList, c(lines_grobs, list(labels_grob))) setChildren(x, children) } isolines_grob_makeContent_nolabels <- function(x) { make_lines_grobs <- function( data, col, alpha, lty, lwd, lex, lineend, linejoin, linemitre ) { if (length(data$x) == 0) { return(NULL) } polylineGrob( data$x, data$y, data$id, default.units = x$units, gp = gpar( col = col, alpha = alpha, lty = lty, lwd = lwd, lex = lex, lineend = lineend, linejoin = linejoin, linemitre = linemitre ) ) } # merge current and grob-specific graphical parameters so we can redistribute among isolevels gp <- modifyList(x$gp_cur, x$gp_combined) n <- length(x$lines) lines_grobs <- mapply( make_lines_grobs, x$lines, rep_len(gp$col, n), rep_len(gp$alpha, n), rep_len(gp$lty, n), rep_len(gp$lwd, n), rep_len(gp$lex, n), rep_len(gp$lineend, n), rep_len(gp$linejoin, n), rep_len(gp$linemitre, n), SIMPLIFY = FALSE ) children <- do.call(gList, lines_grobs) setChildren(x, children) } isoband/R/isobands.R0000644000176200001440000000726215114544500014025 0ustar liggesusers#' Efficient calculation of isolines and isobands from elevation grid #' #' @param x Numeric vector specifying the x locations of the grid points. #' @param y Numeric vector specifying the y locations of the grid points. #' @param z Numeric matrix specifying the elevation values for each grid point. #' @param levels_low,levels_high Numeric vectors of minimum/maximum z values #' for which isobands should be generated. Any z values that are exactly #' equal to a value in `levels_low` are considered part of the corresponding #' isoband, but any z values that are exactly equal to a value in `levels_high` #' are not considered part of the corresponding isoband. In other words, the #' intervals specifying isobands are closed at their lower boundary and open #' at their upper boundary. #' @seealso #' [`plot_iso`] #' @examples #' library(grid) #' #' #' # one simple connected shape #' m <- matrix(c(0, 0, 0, 0, 0, 0, #' 0, 0, 0, 1, 1, 0, #' 0, 0, 1, 1, 1, 0, #' 0, 1, 1, 0, 0, 0, #' 0, 0, 0, 1, 0, 0, #' 0, 0, 0, 0, 0, 0), 6, 6, byrow = TRUE) #' #' df_bands <- isobands((1:ncol(m))/(ncol(m)+1), (nrow(m):1)/(nrow(m)+1), m, 0.5, 1.5)[[1]] #' df_lines <- isolines((1:ncol(m))/(ncol(m)+1), (nrow(m):1)/(nrow(m)+1), m, 0.5)[[1]] #' g <- expand.grid(x = (1:ncol(m))/(ncol(m)+1), y = (nrow(m):1)/(nrow(m)+1)) #' grid.newpage() #' grid.points(g$x, g$y, default.units = "npc", pch = 19, size = unit(0.5, "char")) #' grid.path(df_bands$x, df_bands$y, df_bands$id, gp = gpar(fill = "cornsilk", col = NA)) #' grid.polyline(df_lines$x, df_lines$y, df_lines$id) #' #' # a similar plot can be generated with the plot_iso() function, #' # which is useful for exploring how the algorithm works #' plot_iso(m, 0.5, 1.5) #' #' # NAs are ignored #' m <- matrix(c(NA, NA, NA, 0, 0, 0, #' NA, NA, NA, 1, 1, 0, #' 0, 0, 1, 1, 1, 0, #' 0, 1, 1, 0, 0, 0, #' 0, 0, 0, 1, 0, 0, #' 0, 0, 0, 0, 0, 0), 6, 6, byrow = TRUE) #' plot_iso(m, 0.5, 1.5) #' #' # two separate shapes #' m <- matrix(c(0, 0, 1, 1, #' 0, 1, 1, 1, #' 1, 1, 0, 0, #' 0, 0, 0.8, 0), 4, 4, byrow = TRUE) #' plot_iso(m, 0.5, 1.5) #' #' # shape with hole #' m <- matrix(c(0, 0, 0, 0, 0, 0, #' 0, 1, 1, 1, 1, 0, #' 0, 1, 2, 2, 1, 0, #' 0, 1, 2, 2, 1, 0, #' 0, 1, 1, 1, 1, 0, #' 0, 0, 0, 0, 0, 0), 6, 6, byrow = TRUE) #' plot_iso(m, 0.5, 1.5) #' @export isobands <- function(x, y, z, levels_low, levels_high) { nlow <- length(levels_low) nhigh <- length(levels_high) nmax <- max(nlow, nhigh) if ((nlow != nmax && nlow != 1) || (nhigh != nmax && nhigh != 1)) { cli::cli_abort( "Vectors specifying isoband levels must be of equal length or of length 1" ) } levels_low <- rep_len(levels_low, nmax) levels_high <- rep_len(levels_high, nmax) # swap high and low levels when they're given in the wrong order idx <- levels_high < levels_low if (any(idx)) { levels_tmp <- levels_high levels_high[idx] <- levels_low[idx] levels_low[idx] <- levels_tmp[idx] } out <- isobands_impl( as.double(x), as.double(y), z, as.double(levels_low), as.double(levels_high) ) structure( out, names = paste0(levels_low, ":", levels_high), class = c("isobands", "iso") ) } #' @rdname isobands #' @param levels Numeric vector of z values for which isolines should be generated. #' @export isolines <- function(x, y, z, levels) { out <- isolines_impl(as.double(x), as.double(y), z, as.double(levels)) structure( out, names = levels, class = c("isolines", "iso") ) } isoband/R/isoband-package.R0000644000176200001440000000027715114504265015236 0ustar liggesusers#' @keywords internal "_PACKAGE" ## usethis namespace: start #' @useDynLib isoband, .registration = TRUE #' @importFrom utils modifyList #' @import grid rlang ## usethis namespace: end NULL isoband/R/label-placer.R0000644000176200001440000002255115114504265014550 0ustar liggesusers#' Generic label placement function #' #' The simple label placer processes separate isolines independently and places #' labels for each line using a placer function that does the actual placement work. #' This label placer is not meant to be used by end users, but rather facilitates the #' development of new label placers, such as [`label_placer_minmax()`]. #' @param lines Isolines object for which labels should be placed. #' @param labels_data A data frame containing information about which labels should #' be placed. #' @param placer_fun A function that takes an individual isoline plus its associated #' break id as input and returns a data frame specifying label positions. The data #' frame should have three columns called `x`, `y`, and `theta`. `x` and `y` specify #' the label position, and `theta` specifies the label angle in radians. The data #' frame can have multiple rows, which results in the same label being placed in #' multiple locations. #' @keywords internal #' @export label_placer_simple <- function(lines, labels_data, placer_fun) { # Calculate the label position for one set of isolines (one level). # # The line data is specified as a list of x, y, id. The parameters `index`, `break_index`, # `break_id`, and `label` are provided simply so they can be added to the resulting data # frame holding label positions place_labels_impl <- function( line_data, index, break_index, break_id, label, placer_fun ) { # return empty row if either missing line data or missing label if (length(line_data$x) == 0 || is.na(label)) { return( data.frame( index = integer(0), break_index = integer(0), break_id = character(0), label = character(0), x = numeric(0), y = numeric(0), theta = numeric(0), stringsAsFactors = FALSE ) ) } # calculate label position pos <- placer_fun(line_data, break_id) # return results if (nrow(pos) > 0) { data.frame( index = index, break_index = break_index, break_id = break_id, label = label, x = pos$x, y = pos$y, theta = pos$theta, stringsAsFactors = FALSE ) } else { data.frame( index = integer(0), break_index = integer(0), break_id = character(0), label = character(0), x = numeric(0), y = numeric(0), theta = numeric(0), stringsAsFactors = FALSE ) } } rows <- mapply( place_labels_impl, lines[labels_data$index], labels_data$index, # index of labeled lines in original list of lines, for matching of graphical parameters labels_data$break_index, # index into original list of breaks, for matching graphical parameters labels_data$break_id, labels_data$label, MoreArgs = list(placer_fun = placer_fun), SIMPLIFY = FALSE ) Reduce(rbind, rows) } #' Set up a label placement strategy #' #' These functions set up various label placement strategies. #' #' `label_placer_minmax()` places labels at the horizontal or vertical minima or maxima of #' the respective isolines. #' #' `label_placer_none()` places no labels at all. #' #' `label_placer_manual()` places labels at manually defined locations. #' #' `label_placer_middle()` places labels at the middle of each isoline. #' #' @param placement String consisting of any combination of the letters #' "t", "r", "b", "l" indicating the placement of labels at the top, #' to the right, at the bottom, to the left of the isoline. #' @param rot_adjuster Function that standardizes the rotation angles of the labels. #' See e.g. [`angle_halfcircle_bottom()`]. #' @param n Size of the point neighborhood over which the rotation angle should be #' calculated. #' @rdname label_placer #' @export label_placer_minmax <- function( placement = "tb", rot_adjuster = angle_halfcircle_bottom(), n = 2 ) { force_all(placement, rot_adjuster, n) placer_fun <- function(line_data, ...) { # find location for labels idx <- stats::na.omit( c( which( # placement "top" isTRUE(grepl("t", placement, fixed = TRUE)) & line_data$y == max(line_data$y) )[1], which( # placement "bottom" isTRUE(grepl("b", placement, fixed = TRUE)) & line_data$y == min(line_data$y) )[1], which( # placement "left" isTRUE(grepl("l", placement, fixed = TRUE)) & line_data$x == min(line_data$x) )[1], which( # placement "right" isTRUE(grepl("r", placement, fixed = TRUE)) & line_data$x == max(line_data$x) )[1] ) ) out <- data.frame(x = numeric(0), y = numeric(0), theta = numeric(0)) for (i in seq_along(idx)) { out[i, ] <- minmax_impl(line_data, idx[i], n) } # standardize rotation angles for text labels out$theta <- rot_adjuster(out$theta) out } # final placer function function(lines, labels_data) { label_placer_simple(lines, labels_data, placer_fun) } } # function that does all the work for the minmax label placer. # requires a single index idx minmax_impl <- function(data, idx, n) { # set of indices belonging to this label idx_set <- which(data$id == data$id[idx]) idx_min <- min(idx_set) idx_max <- max(idx_set) # if the first and the last point are the same we wrap, otherwise we truncate if ( data$x[idx_min] == data$x[idx_max] && data$y[idx_min] == data$y[idx_max] ) { idx_range <- (idx_max - idx_min) i <- ((idx - n):(idx + n) - idx_min) %% idx_range + idx_min } else { i <- (max(idx - n, idx_min):min(idx + n, idx_max)) } x <- data$x[i] y <- data$y[i] xave <- mean(x) yave <- mean(y) m <- cbind(x - xave, y - yave) v <- svd(m)$v list(x = xave, y = yave, theta = atan2(v[2], v[1])) } #' @rdname label_placer #' @export label_placer_none <- function() { function(...) { data.frame( index = integer(0), break_index = integer(0), break_id = character(0), label = character(0), x = numeric(0), y = numeric(0), theta = numeric(0), stringsAsFactors = FALSE ) } } #' @param breaks Character vector specifying the isolines to be labeled, #' as in [`isolines_grob()`]. #' @param x,y,theta Numeric vectors specifying the x and y positions and #' angles (in radians) for each label corresponding to each break. #' @rdname label_placer #' @export label_placer_manual <- function(breaks, x, y, theta) { # recycle all inputs to the same length # also has the side effect of forcing them n <- max(length(breaks), length(x), length(y), length(theta)) breaks <- rep_len(breaks, n) x <- rep_len(x, n) y <- rep_len(y, n) theta <- rep_len(theta, n) placer_fun <- function(line_data, break_id) { idx <- (breaks == break_id) data.frame(x = x[idx], y = y[idx], theta = theta[idx]) } # final placer function function(lines, labels_data) { label_placer_simple(lines, labels_data, placer_fun) } } #' @rdname label_placer #' @export label_placer_middle <- function(rot_adjuster = angle_halfcircle_bottom()) { placer_fun <- function(line_data, ...) { out <- data.frame(x = numeric(0), y = numeric(0), theta = numeric(0)) # It identifies each isoline subdivision. For an individual isoline the id column identifies the number of subdivisions. line_sections <- unique(line_data$id) # Then the label is printed at the middle of each isoline subdivision. for (i in 1:length(line_sections)) { x <- line_data$x[line_data$id == i] y <- line_data$y[line_data$id == i] middle_index <- as.integer(length(x) / 2) x_mid <- x[middle_index] y_mid <- y[middle_index] xtheta <- c(x[middle_index - 1], x[middle_index], x[middle_index + 1]) ytheta <- c(y[middle_index - 1], y[middle_index], y[middle_index + 1]) m <- cbind(xtheta - mean(xtheta), ytheta - mean(ytheta)) v <- svd(m)$v out[i, ] <- list(x = x_mid, y = y_mid, theta = atan2(v[2], v[1])) } # standardize rotation angles for text labels out$theta <- rot_adjuster(out$theta) out } # final placer function function(lines, labels_data) { label_placer_simple(lines, labels_data, placer_fun) } } #' Standardize label angles #' #' Function factories that return functions to standardize rotation angles to specific angle ranges. #' #' `angle_halfcircle_bottom()` standardizes angles to (-pi/2, pi/2]. #' #' `angle_halfcircle_right()` standardizes angles to (0, pi]. #' #' `angle_fixed()` sets all angles to a fixed value (0 by default). #' #' `angle_identity()` does not modify any angles. #' @param theta Fixed angle, in radians. #' @export angle_halfcircle_bottom <- function() { function(theta) { ifelse( theta <= -pi / 2, theta + pi, ifelse( theta > pi / 2, theta - pi, theta ) ) } } #' @rdname angle_halfcircle_bottom #' @export angle_halfcircle_right <- function() { function(theta) { ifelse( theta <= 0, theta + pi, ifelse( theta > pi, theta - pi, theta ) ) } } #' @rdname angle_halfcircle_bottom #' @export angle_fixed <- function(theta = 0) { force(theta) function(x) { rep_len(theta, length(x)) } } #' @rdname angle_halfcircle_bottom #' @export angle_identity <- function() { function(x) { x } } isoband/R/clip-lines.R0000644000176200001440000000244615114543255014267 0ustar liggesusers#' Clip lines so they don't run into a set of boxes. #' #' Clip lines so they don't run into a set of boxes. Useful for labeling isolines, #' as it allows removal of line segments that would run into any text labels. #' @param x Numeric vector of x coordinates #' @param y Numeric vector of y coordinates #' @param id Integer vector of id numbers indicating which lines are connected #' @param clip_boxes Data frame specifying the locations of boxes to clip to. #' Should have five columns, named `x`, `y`, `width`, `height`, `theta`, which #' specify the x and y positions of each box midpoint, as well as the box width, #' box height, and box angle in radians. Each box is specified by one data #' row. #' @param asp Aspect ratio (width/height) of the target canvas. This is used to convert #' widths to heights and vice versa for rotated boxes #' @keywords internal #' @export clip_lines <- function(x, y, id, clip_boxes, asp = 1) { out = list(x = x, y = y, id = id) for (i in 1:nrow(clip_boxes)) { box <- clip_boxes[i, ] out <- clip_lines_impl( as.double(out$x), as.double(out$y), as.integer(out$id), as.double(box$x), as.double(box$y), as.double(box$width), as.double(box$height), as.double(box$theta), as.double(asp) ) } out } isoband/R/catch-routine-registration.R0000644000176200001440000000054315114477620017503 0ustar liggesusers# This dummy function definition is included with the package to ensure that # 'tools::package_native_routine_registration_skeleton()' generates the required # registration info for the 'run_testthat_tests' symbol. # Commented out to remove compile-time dependency on testthat #(function() { # .Call("run_testthat_tests", TRUE, PACKAGE = "isoband") #}) isoband/vignettes/0000755000176200001440000000000015114552567013714 5ustar liggesusersisoband/vignettes/isoband3.Rmd0000644000176200001440000000747215114504265016064 0ustar liggesusers--- title: "Labeled isolines" author: "Claus O. Wilke" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Labeled isolines} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r} #| label: setup #| include: false knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ``` Labeled isolines can be drawn in the grid graphics system via the `isolines_grob()` function. ```{r} library(isoband) library(grid) x <- (0:(ncol(volcano) - 1))/(ncol(volcano) - 1) y <- ((nrow(volcano) - 1):0)/(nrow(volcano) - 1) lines <- isolines(x, y, volcano, 5*(19:38)) g <- isolines_grob( lines, breaks = 20*(5:10), gp = gpar( fontsize = 10, lwd = c(1, 2, 1, 1), col = c("grey50", "grey20", "grey50", "grey50") ) ) grid.newpage() grid.draw(g) ``` The function places labels at the isolines specified via the `breaks` argument, and it crops isolines around the labels so no lines run into the labels. It is possible to leave extra space around the labels using the `margin` argument. ```{r} g <- isolines_grob( lines, breaks = 20*(5:10), margin = unit(c(3, 5, 3, 5), "pt"), # margin specified as top, right, bottom, left gp = gpar( fontsize = 10, lwd = c(1, 2, 1, 1), col = c("grey50", "grey20", "grey50", "grey50") ) ) grid.newpage() grid.draw(g) ``` Where the labels are drawn can be controlled via the `label_placer` argument. A few different label placement strategies are provided. The default, `label_placer_minmax()`, places labels at the maximum and minimum y value for each isoline. However, this label placer can be further customized. For example, labels can be placed at maximum and minimum x values and at a fixed rotation angle of 90 degrees. ```{r} g <- isolines_grob( lines, breaks = 20*(5:10), gp = gpar( fontsize = 10, lwd = c(1, 2, 1, 1), col = c("grey50", "grey20", "grey50", "grey50") ), label_placer = label_placer_minmax( placement = "rl", # place labels right and left, i.e., min and max x rot_adjuster = angle_fixed(pi/2) # set fixed angle of 90 degrees ) ) grid.newpage() grid.draw(g) ``` The label placer `label_placer_none()` doesn't place any labels. ```{r} g <- isolines_grob( lines, breaks = 20*(5:10), gp = gpar( lwd = c(1, 2, 1, 1), col = c("grey50", "grey20", "grey50", "grey50") ), label_placer = label_placer_none() ) grid.newpage() grid.draw(g) ``` We can also place labels entirely manually by using `label_placer_manual()`. This label placer takes as arguments the breaks that should be labeled and the corresponding coordinates and label angles. Breaks for which no coordinates are specified are ignored. If multiple coordinates are supplied for the same break then multiple labels are placed for that break. ```{r} g <- isolines_grob( lines, breaks = 20*(5:10), gp = gpar( fontsize = 12, lwd = c(1, 2, 1, 1), col = c("grey50", "grey20", "grey50", "grey50") ), label_col = "red", label_placer = label_placer_manual( breaks = c("120", "160", "160"), x = c(0.15, 0.5, 0.6), y = c(0.19, 0.51, 0.87), theta = 0 ) ) grid.newpage() grid.draw(g) ``` Because isolines are cropped around the labels, the labeling strategy works even if the isolines are drawn on top of a colored background. For example, we could draw filled isobands using `isobands_grob()` and then draw labeled lines on top. ```{r} viridis_pal <- colorRampPalette( c("#440154", "#414487", "#2A788E", "#22A884", "#7AD151", "#FDE725"), space = "Lab" ) bands <- isobands(x, y, volcano, 5*(18:38), 5*(19:39)) b <- isobands_grob( bands, gp = gpar(col = NA, fill = viridis_pal(21), alpha = 0.4) ) l <- isolines_grob( lines, breaks = 20*(5:10), gp = gpar( fontsize = 10, lwd = c(1, 2, 1, 1), col = c("grey50", "grey20", "grey50", "grey50") ) ) grid.newpage() grid.draw(b) grid.draw(l) ``` isoband/vignettes/isoband1.Rmd0000644000176200001440000001114515114544775016064 0ustar liggesusers--- title: "Generating isolines and isobands" author: "Claus O. Wilke" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Generating isolines and isobands} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r} #| label: setup #| include: false knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ``` The isoband package implements fast algorithms for generating isolines (lines of equal elevation) and isobands (ranges of elevation delimited by two isolines) from a matrix of elevation data. For both cases, the package employs the marching squares algorithms as described on [Wikipedia.](https://en.wikipedia.org/wiki/Marching_squares) Marching squares algorithms break down the elevation matrix into blocks of 2x2 elevation values. For each block, they then determine the appropriate isolines/isobands from a lookup table of all possible arrangements of isolines or isobands within a 2x2 block. There are 16 distinct possibilities for isolines and 81 for isobands. The implementation in the isoband package goes beyond the algorithm described on Wikipedia in that it merges the isolines or isobands from separate blocks into extended line traces or polygons. The package is meant as a low-level package with minimal required dependencies. Therefore, many of the functions provided may not immediately be useful to endusers, but they will enable developers of other packages to integrate isolines and isobands into their feature set. The two main functions of the package are called `isolines()` and `isobands()`, and they have similar user interfaces and return values. Both take a vector `x` specifying the x values corresponding to the columns of the elevation matrix, a vector `y` specifying the y values corresponding to the rows of the elevation matrix, and an elevation matrix `z`. The two functions differ in that `isolines()` takes a single argument `levels` specifying the elevation levels for which isolines should be calculated, whereas `isobands()` takes two arguments, `levels_low` and `levels_high`, specifying the lower and upper bounds for each isoband. The return value in both cases is a list of lists. The outer list contains one list element for each specified isolevel. The inner lists hold line or polygon data in the form `x`, `y`, `id` as used by `grid::polylineGrob()` or `grid::pathGrob()`. The format has been chosen for easy drawing of the resulting values via these two grid functions. ```{r} library(isoband) library(grid) m <- matrix( c(0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 1, 2, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0), 5, 5, byrow = TRUE ) lines <- isolines(x = 1:ncol(m)/6, y = nrow(m):1/6, z = m, levels = 0.5) lines grid.newpage() grid.draw(polylineGrob(lines[[1]]$x, lines[[1]]$y, lines[[1]]$id)) bands <- isobands(x = 1:ncol(m)/6, y = nrow(m):1/6, z = m, levels_low = 0.5, levels_high = 1.5) bands grid.newpage() grid.draw(pathGrob(bands[[1]]$x, bands[[1]]$y, bands[[1]]$id, gp = gpar(fill = "cornsilk"))) ``` A convenience function `plot_iso()` can be used to inspect a single isoband and corresponding isolines for an elevation matrix. This function is mostly meant for debugging and illustration purposes. It draws a grid of matrix points colored by whether each point is below, within, or above the isoband, as well as the isoband itself and the enclosing isolines. ```{r} plot_iso(m, 0.5, 1.5) ``` The isoband package handles `NA` values in the matrix by simply ignoring the respective grid points. ```{r} m <- matrix( c(NA, NA, NA, 0, 0, 0, NA, NA, NA, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0), 6, 6, byrow = TRUE ) plot_iso(m, 0.5, 1.5) ``` Isobands can contain holes, as shown above, and they can also consist of multiple disconnected pieces. ```{r} m <- matrix( c(0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0.8, 0), 4, 4, byrow = TRUE ) plot_iso(m, 0.5, 1.5) ``` # Performance The code is written in C++ and performance is generally good. Isolining is about as fast as `grDevices::contourLines()`, isobanding is approximately 2.5 times slower. ```{r} # contouring with contourLines() from grDevices fn_contourLines <- function() { grDevices::contourLines(1:ncol(volcano), 1:nrow(volcano), volcano, levels = 10*(10:18)) } # contouring with isolines() fn_isolines <- function() { isolines(1:ncol(volcano), 1:nrow(volcano), volcano, 10*(10:18)) } # contouring with isobands() fn_isobands <- function() { isobands(1:ncol(volcano), 1:nrow(volcano), volcano, 10*(9:17), 10*(10:18)) } bench::mark(fn_contourLines(), fn_isolines(), fn_isobands(), check = FALSE) ``` isoband/src/0000755000176200001440000000000015114552567012473 5ustar liggesusersisoband/src/clip-lines.cpp0000644000176200001440000003103215114543213015221 0ustar liggesusers#include "cpp11/doubles.hpp" #include "cpp11/integers.hpp" #include "cpp11/list.hpp" #define R_NO_REMAP #include #include // for size_t using namespace std; #include "clip-lines.h" using namespace cpp11::literals; // calculates the intersection point of a line segment and // the unit box, assuming p1 is outside and p2 is inside. // if the assumption isn't true, results are not reliable. point entry_intersection(const point &p1, const point &p2) { // p1 is to the left of box if (p1.x <= 0) { // intersection with left boundary double t = p1.x/(p1.x - p2.x); double yint = p1.y + t*(p2.y - p1.y); double xint = 0; if (yint < 0) { // actually need intersection with lower boundary t = p1.y/(p1.y - p2.y); xint = p1.x + t*(p2.x - p1.x); yint = 0; } else if (yint > 1) { // actually need intersection with upper boundary t = (1-p1.y)/(p2.y - p1.y); xint = p1.x + t*(p2.x - p1.x); yint = 1; } return point(xint, yint); } // p1 is to the right of box if (p1.x >= 1) { // intersection with right boundary double t = (1 - p1.x)/(p2.x - p1.x); double yint = p1.y + t*(p2.y - p1.y); double xint = 1; if (yint < 0) { // actually need intersection with lower boundary t = p1.y/(p1.y - p2.y); xint = p1.x + t*(p2.x - p1.x); yint = 0; } else if (yint > 1) { // actually need intersection with upper boundary t = (1-p1.y)/(p2.y - p1.y); xint = p1.x + t*(p2.x - p1.x); yint = 1; } return point(xint, yint); } // directly below if (p1.y <= 0) { // intersection with lower boundary double t = p1.y/(p1.y - p2.y); double xint = p1.x + t*(p2.x - p1.x); double yint = 0; return point(xint, yint); } // intersection with upper boundary double t = (1-p1.y)/(p2.y - p1.y); double xint = p1.x + t*(p2.x - p1.x); double yint = 1; return point(xint, yint); } // calculates the two intersection points ip1 and ip2 (if they exist) of a // line segment from p1 to p2 and the unit box, assuming both p1 and p2 // are outside the box. if the assumption isn't true, results are not reliable. // returns false if no intersection exists. bool double_intersection(const point &p1, const point &p2, point &ip1, point &ip2) { double dx = p2.x - p1.x; double dy = p2.y - p1.y; if (dx == 0) { if (dy == 0) return false; // degenerate case, should never get here // vertical line // trivial cases have been excluded by calling function, therefore this is easy ip1.x = p1.x; ip2.x = p1.x; if (p1.y >= 1) { ip1.y = 1; ip2.y = 0; } else { ip1.y = 0; ip2.y = 1; } return true; } else if (dy == 0) { // horizontal line // trivial cases have been exlcuded by calling function, therefore this is easy ip1.y = p1.y; ip2.y = p1.y; if (p1.x >= 1) { ip1.x = 1; ip2.x = 0; } else { ip1.x = 0; ip2.x = 1; } return true; } else { // in the general case, we need to calculate the intersection points with all four edges // we start at the top and go around clockwise, top, right, bottom, left double t[4]; // linear parameters defining intersection points int b[4]; // integer to keep track of boundaries t[0] = (1 - p1.y)/dy; // top b[0] = 0; t[1] = (1 - p1.x)/dx; // right b[1] = 1; t[2] = -1*p1.y/dy; // bottom b[2] = 2; t[3] = -1*p1.x/dx; // left b[3] = 3; // now we need to sort the t values, we don't need // a complex algorithm here since it's so few cases for (int i = 1; i < 4; i++) { // find minimum if (t[0] > t[i]) { double temp = t[0]; t[0] = t[i]; t[i] = temp; int btemp = b[0]; b[0] = b[i]; b[i] = btemp; } } for (int i = 2; i < 4; i++) { // find next larger value if (t[1] > t[i]) { double temp = t[1]; t[1] = t[i]; t[i] = temp; int btemp = b[1]; b[1] = b[i]; b[i] = btemp; } } for (int i = 3; i < 4; i++) { // find next larger value if (t[2] > t[i]) { double temp = t[1]; t[2] = t[i]; t[i] = temp; int btemp = b[2]; b[2] = b[i]; b[i] = btemp; } } // t[1] and t[2] are the two inner-most intersections, which // define the two clipping points bool result = true; switch(b[1]) { case 0: // top ip1 = point(p1.x + t[1]*dx, 1); if (ip1.x < -1e-10 || ip1.x > 1+1e-10) result = false; break; case 1: // right ip1 = point(1, p1.y + t[1]*dy); if (ip1.y < -1e-10 || ip1.y > 1+1e-10) result = false; break; case 2: // bottom ip1 = point(p1.x + t[1]*dx, 0); if (ip1.x < -1e-10 || ip1.x > 1+1e-10) result = false; break; case 3: // left ip1 = point(0, p1.y + t[1]*dy); if (ip1.y < -1e-10 || ip1.y > 1+1e-10) result = false; break; default: // should never go here result = false; } switch(b[2]) { case 0: // top ip2 = point(p1.x + t[2]*dx, 1); if (ip2.x < -1e-10 || ip2.x > 1+1e-10) result = false; break; case 1: // right ip2 = point(1, p1.y + t[2]*dy); if (ip2.y < -1e-10 || ip2.y > 1+1e-10) result = false; break; case 2: // bottom ip2 = point(p1.x + t[2]*dx, 0); if (ip2.x < -1e-10 || ip2.x > 1+1e-10) result = false; break; case 3: // left ip2 = point(0, p1.y + t[2]*dy); if (ip2.y < -1e-10 || ip2.y > 1+1e-10) result = false; break; default: // should never go here result = false; } return result; } } segment_crop_type crop_to_unit_box(const point &p1, const point &p2, point &crop1, point &crop2) { // trivial case 1: line segment trivially outside box if ((p1.x <= 0 && p2.x <= 0) || (p1.x >= 1 && p2.x >= 1) || (p1.y <= 0 && p2.y <= 0) || (p1.y >= 1 && p2.y >= 1)) { return none; } bool p1_inside = p1.x > 0 && p1.x < 1 && p1.y > 0 && p1.y < 1; bool p2_inside = p2.x > 0 && p2.x < 1 && p2.y > 0 && p2.y < 1; if (p1_inside) { // trivial case 2: line segment fully inside box if (p2_inside) { return complete; } // otherwise, simple case 1: crop at beginning crop1 = entry_intersection(p2, p1); return at_beginning; } if (p2_inside) { // simple case 2: crop at end crop1 = entry_intersection(p1, p2); return at_end; } // final case is double intersection in middle or no intersection at all bool crop = double_intersection(p1, p2, crop1, crop2); if (crop) return in_middle; return none; } // helper function for crop_lines(); checks whether a single point is inside the unit box bool in_unit_box(const point &p) { if (p.x > 0 && p.x < 1 && p.y > 0 && p.y < 1) return true; return false; } // helper function for crop_lines() void record_points(cpp11::writable::doubles &x_out, cpp11::writable::doubles &y_out, cpp11::writable::integers &id_out, const point &p1, const point &p2, int &cur_id_out, bool &p1_recorded, bool &p2_recorded, bool &new_line_segment) { if (new_line_segment) { // start a new line segment, but defer if nothing to record if (!p1_recorded || !p2_recorded) { cur_id_out++; new_line_segment = false; } } if (!p1_recorded) { x_out.push_back(p1.x); y_out.push_back(p1.y); id_out.push_back(cur_id_out); p1_recorded = true; } if (!p2_recorded) { x_out.push_back(p2.x); y_out.push_back(p2.y); id_out.push_back(cur_id_out); p2_recorded = true; } } // Clip lines to the outside of a box // // Clip lines to the outside of a box. The box is specified via midpoint, width, // height, and a rotation angle in radians. This is used to create space within // isolines for text labels or other annotations. // // @param x Numeric vector of x coordinates // @param y Numeric vector of y coordinates // @param id Integer vector of id numbers indicating which lines are connected // @param p_mid_x,p_mid_y Numeric values specifying the x and y position of the box midpoint // @param width Box width // @param height Box height // @param theta Box angle, in radians // @param asp Aspect ratio (width/height) of the target canvas. This is used to convert widths // to heights and vice versa for rotated boxes // @export [[cpp11::register]] cpp11::writable::list clip_lines_impl( cpp11::doubles x, cpp11::doubles y, cpp11::integers id, double p_mid_x, double p_mid_y, double width, double height, double theta, double asp ) { // input int n = x.size(); double* x_p = REAL(x); double* y_p = REAL(y); int* id_p = INTEGER(id); // output variable //SEXP res = PROTECT(Rf_allocVector(VECSXP, 3)); //SEXP names = PROTECT(Rf_allocVector(STRSXP, 3)); //SET_STRING_ELT(names, 0, Rf_mkChar("x")); //SET_STRING_ELT(names, 1, Rf_mkChar("y")); //SET_STRING_ELT(names, 2, Rf_mkChar("id")); //Rf_setAttrib(res, Rf_install("names"), names); cpp11::writable::doubles x_out, y_out; cpp11::writable::integers id_out; // input checks if (n != y.size()) { cpp11::stop("Number of x and y coordinates must match."); } if (n != id.size()) { cpp11::stop("Number of x coordinates and id values must match."); } if (n == 0) { // empty input, return empty output return cpp11::writable::list({ "x"_nm = x_out, "y"_nm = y_out, "id"_nm = id_out }); } // set up transformation // lower left point of cropping rectangle point ll(p_mid_x - width*cos(theta)/2 + (height/asp)*sin(theta)/2, p_mid_y - asp*width*sin(theta)/2 - height*cos(theta)/2); // lower right point point lr(ll.x + width*cos(theta), ll.y + asp*width*sin(theta)); // upper left point point ul(ll.x - (height/asp)*sin(theta), ll.y + height*cos(theta)); unitbox_transformer t(ll, lr, ul); // crop int cur_id = id_p[0]; int cur_id_out = 0; // first output id - 1 point p1, p2, p1t, p2t; point crop1, crop2; p1 = point(x_p[0], y_p[0]); p1t = t.transform(p1); bool p1_recorded = in_unit_box(p1t); // record only if not in unit box, catches singlets bool p2_recorded = true; // when we first enter the loop, have only p1 unrecorded bool new_line_segment = true; int i = 1; while(i < n) { if (cur_id != id_p[i]) { // id mismatch means we are starting a new line segment // first record any points that haven't been recorded yet. catches singlets record_points(x_out, y_out, id_out, p1, p2, cur_id_out, p1_recorded, p2_recorded, new_line_segment); // now set up next line segment p1 = point(x_p[i], y_p[i]); p1t = t.transform(p1); cur_id = id_p[i]; p1_recorded = in_unit_box(p1t); // record only if not in unit box, catches singlets new_line_segment = true; i++; continue; } p2 = point(x_p[i], y_p[i]); p2t = t.transform(p2); p2_recorded = false; segment_crop_type result = crop_to_unit_box(p1t, p2t, crop1, crop2); switch(result) { case complete: // skip recording for this line segment p1_recorded = true; p2_recorded = true; // start new line segment with next point new_line_segment = true; break; case at_beginning: p1t = crop1; p1 = t.inv_transform(p1t); p1_recorded = false; new_line_segment = true; break; case at_end: p2_recorded = false; record_points(x_out, y_out, id_out, p1, t.inv_transform(crop1), cur_id_out, p1_recorded, p2_recorded, new_line_segment); new_line_segment = true; break; case in_middle: p2_recorded = false; record_points(x_out, y_out, id_out, p1, t.inv_transform(crop1), cur_id_out, p1_recorded, p2_recorded, new_line_segment); p1t = crop2; p1 = t.inv_transform(p1t); p1_recorded = false; p2_recorded = false; new_line_segment = true; break; default: // nothing to be done, record and move on break; } record_points(x_out, y_out, id_out, p1, p2, cur_id_out, p1_recorded, p2_recorded, new_line_segment); p1 = p2; p1t = p2t; i++; } // record any remaining points; catches singlets record_points(x_out, y_out, id_out, p1, p2, cur_id_out, p1_recorded, p2_recorded, new_line_segment); return cpp11::writable::list({ "x"_nm = x_out, "y"_nm = y_out, "id"_nm = id_out }); } /*** R x <- c(0, 0, 1, 1, 0, 2, 3, 2.5, 2) y <- c(0, 1, 1, 0, 0, 2, 2, 3, 2) id <- c(1, 1, 1, 1, 1, 2, 2, 2, 2) out <- clip_lines_impl(x, y, id, 1.5, 1.5, 2.5, 1, pi/4) grid.newpage() grid.polyline(x = out$x/5, y = out$y/5, id = out$id) */ isoband/src/test-clip-lines.cpp0000644000176200001440000003340515114477620016214 0ustar liggesusers// Commented out to remove compile-time dependency on testthat /* #include #include "polygon.h" #include "clip-lines.h" #include bool near_equal(double x1, double x2) { return (std::fabs(x1 - x2) < 1e-9); } context("Crop to unit box") { test_that("Both points inside") { point crop1, crop2; segment_crop_type result; result = crop_to_unit_box(point(.2, .3), point(.7, .6), crop1, crop2); expect_true(result == complete); result = crop_to_unit_box(point(.7, .6), point(.2, .3), crop1, crop2); expect_true(result == complete); } test_that("Both points trivially outside") { point crop1, crop2; segment_crop_type result; // to the left result = crop_to_unit_box(point(-.2, .3), point(-.5, 1.6), crop1, crop2); expect_true(result == none); result = crop_to_unit_box(point(-.2, .3), point(-.5, .6), crop1, crop2); expect_true(result == none); result = crop_to_unit_box(point(-.5, 1.6), point(-.2, -.3), crop1, crop2); expect_true(result == none); // to the right result = crop_to_unit_box(point(1.2, .3), point(1.5, 1.6), crop1, crop2); expect_true(result == none); result = crop_to_unit_box(point(1.2, .3), point(1.5, .6), crop1, crop2); expect_true(result == none); result = crop_to_unit_box(point(1.5, 1.6), point(1.2, -.3), crop1, crop2); expect_true(result == none); // above result = crop_to_unit_box(point(.3, 1.2), point(1.6, 1.5), crop1, crop2); expect_true(result == none); result = crop_to_unit_box(point(.3, 1.2), point(.6, 1.5), crop1, crop2); expect_true(result == none); result = crop_to_unit_box(point(1.6, 1.5), point(-.3, 1.2), crop1, crop2); expect_true(result == none); // below result = crop_to_unit_box(point(.3, -.2), point(1.6, -.5), crop1, crop2); expect_true(result == none); result = crop_to_unit_box(point(.3, -.2), point(.6, -.5), crop1, crop2); expect_true(result == none); result = crop_to_unit_box(point(1.6, -.5), point(-.3, -.2), crop1, crop2); expect_true(result == none); } test_that("One point inside") { point crop1, crop2; segment_crop_type result; // horizontal lines result = crop_to_unit_box(point(-.2, .5), point(.5, .5), crop1, crop2); expect_true(result == at_end); expect_true(near_equal(crop1.x, 0)); expect_true(near_equal(crop1.y, .5)); result = crop_to_unit_box(point(1.2, .5), point(.5, .5), crop1, crop2); expect_true(result == at_end); expect_true(near_equal(crop1.x, 1)); expect_true(near_equal(crop1.y, .5)); // vertical lines result = crop_to_unit_box(point(.5, .5), point(.5, -.2), crop1, crop2); expect_true(result == at_beginning); expect_true(near_equal(crop1.x, .5)); expect_true(near_equal(crop1.y, 0)); result = crop_to_unit_box(point(.5, .5), point(.5, 1.2), crop1, crop2); expect_true(result == at_beginning); expect_true(near_equal(crop1.x, .5)); expect_true(near_equal(crop1.y, 1)); // diagonal lines through corners result = crop_to_unit_box(point(.5, .5), point(1.2, 1.2), crop1, crop2); expect_true(result == at_beginning); expect_true(near_equal(crop1.x, 1)); expect_true(near_equal(crop1.y, 1)); result = crop_to_unit_box(point(.5, .5), point(-.2, 1.2), crop1, crop2); expect_true(result == at_beginning); expect_true(near_equal(crop1.x, 0)); expect_true(near_equal(crop1.y, 1)); result = crop_to_unit_box(point(-.2, -.2), point(.5, .5), crop1, crop2); expect_true(result == at_end); expect_true(near_equal(crop1.x, 0)); expect_true(near_equal(crop1.y, 0)); result = crop_to_unit_box(point(1.2, -.2), point(.5, .5), crop1, crop2); expect_true(result == at_end); expect_true(near_equal(crop1.x, 1)); expect_true(near_equal(crop1.y, 0)); // top result = crop_to_unit_box(point(.2, .8), point(.5, 1.4), crop1, crop2); expect_true(result == at_beginning); expect_true(near_equal(crop1.x, .3)); expect_true(near_equal(crop1.y, 1)); // top right result = crop_to_unit_box(point(.8, .8), point(1.1, 1.4), crop1, crop2); expect_true(result == at_beginning); expect_true(near_equal(crop1.x, .9)); expect_true(near_equal(crop1.y, 1)); result = crop_to_unit_box(point(.8, .8), point(1.4, 1.1), crop1, crop2); expect_true(result == at_beginning); expect_true(near_equal(crop1.x, 1)); expect_true(near_equal(crop1.y, .9)); // right result = crop_to_unit_box(point(1.4, .5), point(.8, .2), crop1, crop2); expect_true(result == at_end); expect_true(near_equal(crop1.x, 1)); expect_true(near_equal(crop1.y, .3)); // bottom right result = crop_to_unit_box(point(1.4, -.1), point(.8, .2), crop1, crop2); expect_true(result == at_end); expect_true(near_equal(crop1.x, 1)); expect_true(near_equal(crop1.y, .1)); result = crop_to_unit_box(point(1.4, -.35), point(.8, .05), crop1, crop2); expect_true(result == at_end); expect_true(near_equal(crop1.x, .875)); expect_true(near_equal(crop1.y, 0)); // bottom result = crop_to_unit_box(point(.2, .2), point(.5, -.4), crop1, crop2); expect_true(result == at_beginning); expect_true(near_equal(crop1.x, .3)); expect_true(near_equal(crop1.y, 0)); // bottom left result = crop_to_unit_box(point(.2, .2), point(-.4, -.1), crop1, crop2); expect_true(result == at_beginning); expect_true(near_equal(crop1.x, 0)); expect_true(near_equal(crop1.y, .1)); result = crop_to_unit_box(point(.2, .05), point(-.4, -.35), crop1, crop2); expect_true(result == at_beginning); expect_true(near_equal(crop1.x, .125)); expect_true(near_equal(crop1.y, 0)); // left result = crop_to_unit_box(point(-.4, .5), point(.2, .2), crop1, crop2); expect_true(result == at_end); expect_true(near_equal(crop1.x, 0)); expect_true(near_equal(crop1.y, .3)); // top left result = crop_to_unit_box(point(.2, .8), point(-.1, 1.4), crop1, crop2); expect_true(result == at_beginning); expect_true(near_equal(crop1.x, .1)); expect_true(near_equal(crop1.y, 1)); result = crop_to_unit_box(point(.2, .8), point(-.4, 1.1), crop1, crop2); expect_true(result == at_beginning); expect_true(near_equal(crop1.x, 0)); expect_true(near_equal(crop1.y, .9)); } test_that("Double intersections") { point crop1, crop2; segment_crop_type result; // horizontal lines result = crop_to_unit_box(point(-1, .5), point(2, .5), crop1, crop2); expect_true(result == in_middle); expect_true(near_equal(crop1.x, 0)); expect_true(near_equal(crop1.y, .5)); expect_true(near_equal(crop2.x, 1)); expect_true(near_equal(crop2.y, .5)); result = crop_to_unit_box(point(2, .5), point(-1, .5), crop1, crop2); expect_true(result == in_middle); expect_true(near_equal(crop1.x, 1)); expect_true(near_equal(crop1.y, .5)); expect_true(near_equal(crop2.x, 0)); expect_true(near_equal(crop2.y, .5)); // vertical lines result = crop_to_unit_box(point(.5, -1), point(.5, 2), crop1, crop2); expect_true(result == in_middle); expect_true(near_equal(crop1.x, .5)); expect_true(near_equal(crop1.y, 0)); expect_true(near_equal(crop2.x, .5)); expect_true(near_equal(crop2.y, 1)); result = crop_to_unit_box(point(.5, 2), point(.5, -1), crop1, crop2); expect_true(result == in_middle); expect_true(near_equal(crop1.x, .5)); expect_true(near_equal(crop1.y, 1)); expect_true(near_equal(crop2.x, .5)); expect_true(near_equal(crop2.y, 0)); // diagonals through corner points result = crop_to_unit_box(point(-3, -3), point(2, 2), crop1, crop2); expect_true(result == in_middle); expect_true(near_equal(crop1.x, 0)); expect_true(near_equal(crop1.y, 0)); expect_true(near_equal(crop2.x, 1)); expect_true(near_equal(crop2.y, 1)); result = crop_to_unit_box(point(-1, 2), point(3, -2), crop1, crop2); expect_true(result == in_middle); expect_true(near_equal(crop1.x, 0)); expect_true(near_equal(crop1.y, 1)); expect_true(near_equal(crop2.x, 1)); expect_true(near_equal(crop2.y, 0)); // top left corner result = crop_to_unit_box(point(-.4, .4), point(.4, 1.2), crop1, crop2); expect_true(result == in_middle); expect_true(near_equal(crop1.x, 0)); expect_true(near_equal(crop1.y, .8)); expect_true(near_equal(crop2.x, .2)); expect_true(near_equal(crop2.y, 1)); result = crop_to_unit_box(point(.4, 1.2), point(-.4, .4), crop1, crop2); expect_true(result == in_middle); expect_true(near_equal(crop1.x, .2)); expect_true(near_equal(crop1.y, 1)); expect_true(near_equal(crop2.x, 0)); expect_true(near_equal(crop2.y, .8)); // top right corner result = crop_to_unit_box(point(1.4, .4), point(.6, 1.2), crop1, crop2); expect_true(result == in_middle); expect_true(near_equal(crop1.x, 1)); expect_true(near_equal(crop1.y, .8)); expect_true(near_equal(crop2.x, .8)); expect_true(near_equal(crop2.y, 1)); result = crop_to_unit_box(point(.6, 1.2), point(1.4, .4), crop1, crop2); expect_true(result == in_middle); expect_true(near_equal(crop1.x, .8)); expect_true(near_equal(crop1.y, 1)); expect_true(near_equal(crop2.x, 1)); expect_true(near_equal(crop2.y, .8)); // bottom left corner result = crop_to_unit_box(point(-.4, .6), point(.4, -.2), crop1, crop2); expect_true(result == in_middle); expect_true(near_equal(crop1.x, 0)); expect_true(near_equal(crop1.y, .2)); expect_true(near_equal(crop2.x, .2)); expect_true(near_equal(crop2.y, 0)); result = crop_to_unit_box(point(.4, -.2), point(-.4, .6), crop1, crop2); expect_true(result == in_middle); expect_true(near_equal(crop1.x, .2)); expect_true(near_equal(crop1.y, 0)); expect_true(near_equal(crop2.x, 0)); expect_true(near_equal(crop2.y, .2)); // bottom right corner result = crop_to_unit_box(point(.4, -.4), point(1.2, .4), crop1, crop2); expect_true(result == in_middle); expect_true(near_equal(crop1.x, .8)); expect_true(near_equal(crop1.y, 0)); expect_true(near_equal(crop2.x, 1)); expect_true(near_equal(crop2.y, .2)); result = crop_to_unit_box(point(1.2, .4), point(.4, -.4), crop1, crop2); expect_true(result == in_middle); expect_true(near_equal(crop1.x, 1)); expect_true(near_equal(crop1.y, .2)); expect_true(near_equal(crop2.x, .8)); expect_true(near_equal(crop2.y, 0)); // horizontally across result = crop_to_unit_box(point(-1, -.2), point(3, 1.4), crop1, crop2); expect_true(result == in_middle); expect_true(near_equal(crop1.x, 0)); expect_true(near_equal(crop1.y, .2)); expect_true(near_equal(crop2.x, 1)); expect_true(near_equal(crop2.y, .6)); result = crop_to_unit_box(point(3, 1.4), point(-1, -.2), crop1, crop2); expect_true(result == in_middle); expect_true(near_equal(crop1.x, 1)); expect_true(near_equal(crop1.y, .6)); expect_true(near_equal(crop2.x, 0)); expect_true(near_equal(crop2.y, .2)); // vertically across result = crop_to_unit_box(point(-.2, -1), point(1.4, 3), crop1, crop2); expect_true(result == in_middle); expect_true(near_equal(crop1.x, .2)); expect_true(near_equal(crop1.y, 0)); expect_true(near_equal(crop2.x, .6)); expect_true(near_equal(crop2.y, 1)); result = crop_to_unit_box(point(1.4, 3), point(-.2, -1), crop1, crop2); expect_true(result == in_middle); expect_true(near_equal(crop1.x, .6)); expect_true(near_equal(crop1.y, 1)); expect_true(near_equal(crop2.x, .2)); expect_true(near_equal(crop2.y, 0)); } test_that("Points non-trivially outside") { point crop1, crop2; segment_crop_type result; result = crop_to_unit_box(point(-.2, .9), point(.1, 1.2), crop1, crop2); expect_true(result == none); result = crop_to_unit_box(point(1.2, .9), point(.9, 1.2), crop1, crop2); expect_true(result == none); result = crop_to_unit_box(point(-.2, .1), point(.1, -.2), crop1, crop2); expect_true(result == none); result = crop_to_unit_box(point(1.2, .1), point(.9, -.2), crop1, crop2); expect_true(result == none); } } context("Transform to unit box") { test_that("Simple transformations work") { unitbox_transformer t(point(1, 1), point(2, 2), point(0, 2)); point p = t.transform(point(1, 2)); point p2 = t.inv_transform(p); expect_true(near_equal(p.x, .5)); expect_true(near_equal(p.y, .5)); expect_true(near_equal(p2.x, 1)); expect_true(near_equal(p2.y, 2)); p = t.transform(point(1, 3)); p2 = t.inv_transform(p); expect_true(near_equal(p.x, 1)); expect_true(near_equal(p.y, 1)); expect_true(near_equal(p2.x, 1)); expect_true(near_equal(p2.y, 3)); } test_that("Transformations from/to rhomboid work") { unitbox_transformer t(point(1, 1), point(2, 1), point(2, 2)); point p = t.transform(point(2, 2)); point p2 = t.inv_transform(p); expect_true(near_equal(p.x, 0)); expect_true(near_equal(p.y, 1)); expect_true(near_equal(p2.x, 2)); expect_true(near_equal(p2.y, 2)); p = t.transform(point(3, 2)); p2 = t.inv_transform(p); expect_true(near_equal(p.x, 1)); expect_true(near_equal(p.y, 1)); expect_true(near_equal(p2.x, 3)); expect_true(near_equal(p2.y, 2)); } // the following tests don't work properly, because `expect_error()` // doesn't catch calls to Rf_error(), it only catches exceptions. // test_that("Singular transformations are caught") { // expect_error( // // box without width // unitbox_transformer(point(1, 1), point(1, 1), point(0, 2)) // ); // // expect_error( // // box without height // unitbox_transformer(point(1, 1), point(2, 2), point(1, 1)) // ); // // expect_error( // // singular inverse transform // unitbox_transformer(point(1, 1), point(2, 2), point(2, 2)) // ); // } } */ isoband/src/isoband.cpp0000644000176200001440000015614015114541237014615 0ustar liggesusers// This file implements the 2D isoline and isoband algorithms described // here: https://en.wikipedia.org/wiki/Marching_squares // Includes merging of line segments and polygons. // Written by Claus O. Wilke #include "cpp11/data_frame.hpp" #include "cpp11/doubles.hpp" #include "cpp11/integers.hpp" #include "cpp11/list.hpp" #include "cpp11/matrix.hpp" #include "cpp11/protect.hpp" #define R_NO_REMAP #include #include #include using namespace std; using namespace cpp11::literals; #include "polygon.h" // for point // point in abstract grid space enum point_type { grid, // point on the original data grid hintersect_lo, // intersection with horizontal edge, low value hintersect_hi, // intersection with horizontal edge, high value vintersect_lo, // intersection with vertical edge, low value vintersect_hi // intersection with vertical edge, high value }; struct grid_point { int r, c; // row and column point_type type; // point type // default constructor; negative values indicate non-existing point off grid grid_point(double r_in = -1, double c_in = -1, point_type type_in = grid) : r(r_in), c(c_in), type(type_in) {} // copy constructor grid_point(const grid_point &p) : r(p.r), c(p.c), type(p.type) {} }; // hash function for grid_point struct grid_point_hasher { size_t operator()(const grid_point& p) const { // this should work up to about 100,000,000 rows/columns return hash()( (static_cast(p.r) << 30) ^ (static_cast(p.c) << 3) ^ static_cast(p.type)); } }; bool operator==(const grid_point &p1, const grid_point &p2) { return (p1.r == p2.r) && (p1.c == p2.c) && (p1.type == p2.type); } ostream & operator<<(ostream &out, const grid_point &p) { out << "(" << p.c << ", " << p.r << ", " << p.type << ")"; return out; } // connection between points in grid space struct point_connect { grid_point prev, next; // previous and next points in polygon grid_point prev2, next2; // alternative previous and next, when two separate polygons have vertices on the same grid point bool altpoint; // does this connection hold an alternative point? bool collected, collected2; // has this connection been collected into a final polygon? point_connect() : altpoint(false), collected(false), collected2(false) {}; }; ostream & operator<<(ostream &out, const point_connect &pc) { out << "prev: " << pc.prev << "; next: " << pc.next << " "; if (pc.altpoint) { out << "AP prev: " << pc.prev2 << "; next2: " << pc.next2 << " "; } return out; } class isobander { protected: int nrow, ncol; // numbers of rows and columns cpp11::doubles grid_x, grid_y; cpp11::doubles_matrix<> grid_z; double *grid_x_p, *grid_y_p, *grid_z_p; double vlo, vhi; // low and high cutoff values grid_point tmp_poly[8]; // temp storage for elementary polygons; none has more than 8 vertices point_connect tmp_point_connect[8]; int tmp_poly_size; // current number of elements in tmp_poly typedef unordered_map gridmap; gridmap polygon_grid; bool interrupted; void reset_grid() { polygon_grid.clear(); for (int i=0; i<8; i++) { tmp_point_connect[i] = point_connect(); } } // internal member functions double central_value(int r, int c) {// calculates the central value of a given cell return (grid_z_p[r + c * nrow] + grid_z_p[r + (c + 1) * nrow] + grid_z_p[r + 1 + c * nrow] + grid_z_p[r + 1 + (c + 1) * nrow])/4; } void poly_start(int r, int c, point_type type) { // start a new elementary polygon tmp_poly[0].r = r; tmp_poly[0].c = c; tmp_poly[0].type = type; tmp_poly_size = 1; } void poly_add(int r, int c, point_type type) { // add point to elementary polygon tmp_poly[tmp_poly_size].r = r; tmp_poly[tmp_poly_size].c = c; tmp_poly[tmp_poly_size].type = type; tmp_poly_size++; } void poly_merge() { // merge current elementary polygon to prior polygons //cout << "before merging:" << endl; bool to_delete[] = {false, false, false, false, false, false, false, false}; // first, we figure out the right connections for current polygon for (int i = 0; i < tmp_poly_size; i++) { // create defined state in tmp_point_connect[] // for each point, find previous and next point in polygon tmp_point_connect[i].altpoint = false; tmp_point_connect[i].next = tmp_poly[(i+1=0) ? i-1 : tmp_poly_size-1]; //cout << tmp_poly[i] << ": " << tmp_point_connect[i] << endl; // now merge with existing polygons if needed const grid_point &p = tmp_poly[i]; if (polygon_grid.count(p) > 0) { // point has been used before, need to merge polygons if (!polygon_grid[p].altpoint) { // basic scenario, no alternative point at this location int score = 2 * (tmp_point_connect[i].next == polygon_grid[p].prev) + (tmp_point_connect[i].prev == polygon_grid[p].next); switch (score) { case 3: // 11 // both prev and next cancel, point can be deleted to_delete[i] = true; break; case 2: // 10 // merge in "next" direction tmp_point_connect[i].next = polygon_grid[p].next; break; case 1: // 01 // merge in "prev" direction tmp_point_connect[i].prev = polygon_grid[p].prev; break; default: // 00 // if we get here, we have two polygon vertices sharing the same grid location // in an unmergable configuration; need to store both tmp_point_connect[i].prev2 = polygon_grid[p].prev; tmp_point_connect[i].next2 = polygon_grid[p].next; tmp_point_connect[i].altpoint = true; } } else { // case with alternative point at this location int score = 8 * (tmp_point_connect[i].next == polygon_grid[p].prev2) + 4 * (tmp_point_connect[i].prev == polygon_grid[p].next2) + 2 * (tmp_point_connect[i].next == polygon_grid[p].prev) + (tmp_point_connect[i].prev == polygon_grid[p].next); switch (score) { case 9: // 1001 // three-way merge tmp_point_connect[i].next = polygon_grid[p].next2; tmp_point_connect[i].prev = polygon_grid[p].prev; break; case 6: // 0110 // three-way merge tmp_point_connect[i].next = polygon_grid[p].next; tmp_point_connect[i].prev = polygon_grid[p].prev2; break; case 8: // 1000 // two-way merge with alt point only // set up merged alt point tmp_point_connect[i].next2 = polygon_grid[p].next2; tmp_point_connect[i].prev2 = tmp_point_connect[i].prev; // copy over existing point as is tmp_point_connect[i].prev = polygon_grid[p].prev; tmp_point_connect[i].next = polygon_grid[p].next; tmp_point_connect[i].altpoint = true; break; case 4: // 0100 // two-way merge with alt point only // set up merged alt point tmp_point_connect[i].prev2 = polygon_grid[p].prev2; tmp_point_connect[i].next2 = tmp_point_connect[i].next; // copy over existing point as is tmp_point_connect[i].prev = polygon_grid[p].prev; tmp_point_connect[i].next = polygon_grid[p].next; tmp_point_connect[i].altpoint = true; break; case 2: // 0010 // two-way merge with original point only // merge point tmp_point_connect[i].next = polygon_grid[p].next; // copy over existing alt point as is tmp_point_connect[i].prev2 = polygon_grid[p].prev2; tmp_point_connect[i].next2 = polygon_grid[p].next2; tmp_point_connect[i].altpoint = true; break; case 1: // 0100 // two-way merge with original point only // merge point tmp_point_connect[i].prev = polygon_grid[p].prev; // copy over existing alt point as is tmp_point_connect[i].prev2 = polygon_grid[p].prev2; tmp_point_connect[i].next2 = polygon_grid[p].next2; tmp_point_connect[i].altpoint = true; break; default: cpp11::stop("undefined merging configuration: %i\n", score); } } } } //cout << "after merging:" << endl; // then we copy the connections into the polygon matrix for (int i = 0; i < tmp_poly_size; i++) { const grid_point &p = tmp_poly[i]; if (to_delete[i]) { // delete point if needed polygon_grid.erase(p); } else { // otherwise, copy polygon_grid[p] = tmp_point_connect[i]; } //cout << p << ": " << tmp_point_connect[i] << endl; } //cout << "new grid:" << endl; //print_polygons_state(); } void print_polygons_state() { for (auto it = polygon_grid.begin(); it != polygon_grid.end(); it++) { cout << it->first << ": " << it->second << endl; } cout << endl; } // linear interpolation of boundary intersections double interpolate(double x0, double x1, double z0, double z1, double value) { double d = (value - z0) / (z1 - z0); double x = x0 + d * (x1 - x0); return x; } // calculate output coordinates for a given grid point point calc_point_coords(const grid_point &p) { switch(p.type) { case grid: return point(grid_x_p[p.c], grid_y_p[p.r]); case hintersect_lo: // intersection with horizontal edge, low value return point(interpolate(grid_x_p[p.c], grid_x_p[p.c+1], grid_z_p[p.r + p.c * nrow], grid_z_p[p.r + (p.c + 1) * nrow], vlo), grid_y_p[p.r]); case hintersect_hi: // intersection with horizontal edge, high value return point(interpolate(grid_x_p[p.c], grid_x_p[p.c+1], grid_z_p[p.r + p.c * nrow], grid_z_p[p.r + (p.c + 1) * nrow], vhi), grid_y_p[p.r]); case vintersect_lo: // intersection with vertical edge, low value return point(grid_x_p[p.c], interpolate(grid_y_p[p.r], grid_y_p[p.r+1], grid_z_p[p.r + p.c * nrow], grid_z_p[p.r + 1 + p.c * nrow], vlo)); case vintersect_hi: // intersection with vertical edge, high value return point(grid_x_p[p.c], interpolate(grid_y_p[p.r], grid_y_p[p.r+1], grid_z_p[p.r + p.c * nrow], grid_z_p[p.r + 1 + p.c * nrow], vhi)); default: return point(0, 0); // should never get here } } public: isobander(cpp11::doubles x, cpp11::doubles y, cpp11::doubles_matrix<> z, double value_low = 0, double value_high = 0) : grid_x(x), grid_y(y), grid_z(z), grid_x_p(REAL(x)), grid_y_p(REAL(y)), grid_z_p(REAL(z)), vlo(value_low), vhi(value_high), interrupted(false) { nrow = grid_z.nrow(); ncol = grid_z.ncol(); if (grid_x.size() != ncol) {cpp11::stop("Number of x coordinates must match number of columns in density matrix.");} if (grid_y.size() != nrow) {cpp11::stop("Number of y coordinates must match number of rows in density matrix.");} } virtual ~isobander() {} bool was_interrupted() {return interrupted;} void set_value(double value_low, double value_high) { vlo = value_low; vhi = value_high; } virtual void calculate_contour() { // clear polygon grid and associated internal variables reset_grid(); // setup matrix of ternarized cell representations vector ternarized(nrow*ncol); vector::iterator iv = ternarized.begin(); for (int i = 0; i < nrow * ncol; ++i) { *iv = (grid_z_p[i] >= vlo && grid_z_p[i] < vhi) + 2*(grid_z_p[i] >= vhi); iv++; } vector cells((nrow - 1) * (ncol - 1)); for (int r = 0; r < nrow-1; r++) { for (int c = 0; c < ncol-1; c++) { int index; if (!R_finite(grid_z_p[r + c * nrow]) || !R_finite(grid_z_p[r + (c + 1) * nrow]) || !R_finite(grid_z_p[r + 1 + c * nrow]) || !R_finite(grid_z_p[r + 1 + (c + 1) * nrow])) { // we don't draw any contours if at least one of the corners is NA index = 0; } else { index = 27*ternarized[r + c * nrow] + 9*ternarized[r + (c + 1) * nrow] + 3*ternarized[r + 1 + (c + 1) * nrow] + ternarized[r + 1 + c * nrow]; } cells[r + c * (nrow - 1)] = index; //cout << index << " "; } //cout << endl; } cpp11::check_user_interrupt(); // all polygons must be drawn clockwise for proper merging for (int r = 0; r < nrow-1; r++) { for (int c = 0; c < ncol-1; c++) { //cout << r << " " << c << " " << cells(r, c) << endl; switch(cells[r + c * (nrow - 1)]) { // doing cases out of order, sorted by type, is easier to keep track of // no contour case 0: break; case 80: break; // single triangle case 1: // 0001 poly_start(r, c, vintersect_lo); poly_add(r+1, c, hintersect_lo); poly_add(r+1, c, grid); poly_merge(); break; case 3: // 0010 poly_start(r, c+1, vintersect_lo); poly_add(r+1, c+1, grid); poly_add(r+1, c, hintersect_lo); poly_merge(); break; case 9: // 0100 poly_start(r, c, hintersect_lo); poly_add(r, c+1, grid); poly_add(r, c+1, vintersect_lo); poly_merge(); break; case 27: // 1000 poly_start(r, c, vintersect_lo); poly_add(r, c, grid); poly_add(r, c, hintersect_lo); poly_merge(); break; case 79: // 2221 poly_start(r, c, vintersect_hi); poly_add(r+1, c, hintersect_hi); poly_add(r+1, c, grid); poly_merge(); break; case 77: // 2212 poly_start(r, c+1, vintersect_hi); poly_add(r+1, c+1, grid); poly_add(r+1, c, hintersect_hi); poly_merge(); break; case 71: // 2122 poly_start(r, c, hintersect_hi); poly_add(r, c+1, grid); poly_add(r, c+1, vintersect_hi); poly_merge(); break; case 53: // 1222 poly_start(r, c, vintersect_hi); poly_add(r, c, grid); poly_add(r, c, hintersect_hi); poly_merge(); break; // single trapezoid case 78: // 2220 poly_start(r, c, vintersect_hi); poly_add(r+1, c, hintersect_hi); poly_add(r+1, c, hintersect_lo); poly_add(r, c, vintersect_lo); poly_merge(); break; case 74: // 2202 poly_start(r+1, c, hintersect_hi); poly_add(r, c+1, vintersect_hi); poly_add(r, c+1, vintersect_lo); poly_add(r+1, c, hintersect_lo); poly_merge(); break; case 62: // 2022 poly_start(r, c+1, vintersect_hi); poly_add(r, c, hintersect_hi); poly_add(r, c, hintersect_lo); poly_add(r, c+1, vintersect_lo); poly_merge(); break; case 26: // 0222 poly_start(r, c, hintersect_hi); poly_add(r, c, vintersect_hi); poly_add(r, c, vintersect_lo); poly_add(r, c, hintersect_lo); poly_merge(); break; case 2: // 0002 poly_start(r, c, vintersect_lo); poly_add(r+1, c, hintersect_lo); poly_add(r+1, c, hintersect_hi); poly_add(r, c, vintersect_hi); poly_merge(); break; case 6: // 0020 poly_start(r+1, c, hintersect_lo); poly_add(r, c+1, vintersect_lo); poly_add(r, c+1, vintersect_hi); poly_add(r+1, c, hintersect_hi); poly_merge(); break; case 18: // 0200 poly_start(r, c+1, vintersect_lo); poly_add(r, c, hintersect_lo); poly_add(r, c, hintersect_hi); poly_add(r, c+1, vintersect_hi); poly_merge(); break; case 54: // 2000 poly_start(r, c, hintersect_lo); poly_add(r, c, vintersect_lo); poly_add(r, c, vintersect_hi); poly_add(r, c, hintersect_hi); poly_merge(); break; // single rectangle case 4: // 0011 poly_start(r, c, vintersect_lo); poly_add(r, c+1, vintersect_lo); poly_add(r+1, c+1, grid); poly_add(r+1, c, grid); poly_merge(); break; case 12: // 0110 poly_start(r, c, hintersect_lo); poly_add(r, c+1, grid); poly_add(r+1, c+1, grid); poly_add(r+1, c, hintersect_lo); poly_merge(); break; case 36: // 1100 poly_start(r, c, grid); poly_add(r, c+1, grid); poly_add(r, c+1, vintersect_lo); poly_add(r, c, vintersect_lo); poly_merge(); break; case 28: // 1001 poly_start(r, c, hintersect_lo); poly_add(r+1, c, hintersect_lo); poly_add(r+1, c, grid); poly_add(r, c, grid); poly_merge(); break; case 76: // 2211 poly_start(r, c, vintersect_hi); poly_add(r, c+1, vintersect_hi); poly_add(r+1, c+1, grid); poly_add(r+1, c, grid); poly_merge(); break; case 68: // 2112 poly_start(r, c, hintersect_hi); poly_add(r, c+1, grid); poly_add(r+1, c+1, grid); poly_add(r+1, c, hintersect_hi); poly_merge(); break; case 44: // 1122 poly_start(r, c, grid); poly_add(r, c+1, grid); poly_add(r, c+1, vintersect_hi); poly_add(r, c, vintersect_hi); poly_merge(); break; case 52: // 1221 poly_start(r, c, hintersect_hi); poly_add(r+1, c, hintersect_hi); poly_add(r+1, c, grid); poly_add(r, c, grid); poly_merge(); break; case 72: // 2200 poly_start(r, c, vintersect_hi); poly_add(r, c+1, vintersect_hi); poly_add(r, c+1, vintersect_lo); poly_add(r, c, vintersect_lo); poly_merge(); break; case 56: // 2002 poly_start(r, c, hintersect_hi); poly_add(r, c, hintersect_lo); poly_add(r+1, c, hintersect_lo); poly_add(r+1, c, hintersect_hi); poly_merge(); break; case 8: // 0022 poly_start(r, c, vintersect_lo); poly_add(r, c+1, vintersect_lo); poly_add(r, c+1, vintersect_hi); poly_add(r, c, vintersect_hi); poly_merge(); break; case 24: // 0220 poly_start(r, c, hintersect_lo); poly_add(r, c, hintersect_hi); poly_add(r+1, c, hintersect_hi); poly_add(r+1, c, hintersect_lo); poly_merge(); break; // single square case 40: // 1111 poly_start(r, c, grid); poly_add(r, c+1, grid); poly_add(r+1, c+1, grid); poly_add(r+1, c, grid); poly_merge(); break; // single pentagon case 49: // 1211 poly_start(r, c, grid); poly_add(r, c, hintersect_hi); poly_add(r, c+1, vintersect_hi); poly_add(r+1, c+1, grid); poly_add(r+1, c, grid); poly_merge(); break; case 67: // 2111 poly_start(r+1, c, grid); poly_add(r, c, vintersect_hi); poly_add(r, c, hintersect_hi); poly_add(r, c+1, grid); poly_add(r+1, c+1, grid); poly_merge(); break; case 41: // 1112 poly_start(r, c, grid); poly_add(r, c+1, grid); poly_add(r+1, c+1, grid); poly_add(r+1, c, hintersect_hi); poly_add(r, c, vintersect_hi); poly_merge(); break; case 43: // 1121 poly_start(r, c, grid); poly_add(r, c+1, grid); poly_add(r, c+1, vintersect_hi); poly_add(r+1, c, hintersect_hi); poly_add(r+1, c, grid); poly_merge(); break; case 31: // 1011 poly_start(r, c, grid); poly_add(r, c, hintersect_lo); poly_add(r, c+1, vintersect_lo); poly_add(r+1, c+1, grid); poly_add(r+1, c, grid); poly_merge(); break; case 13: // 0111 poly_start(r+1, c, grid); poly_add(r, c, vintersect_lo); poly_add(r, c, hintersect_lo); poly_add(r, c+1, grid); poly_add(r+1, c+1, grid); poly_merge(); break; case 39: // 1110 poly_start(r, c, grid); poly_add(r, c+1, grid); poly_add(r+1, c+1, grid); poly_add(r+1, c, hintersect_lo); poly_add(r, c, vintersect_lo); poly_merge(); break; case 37: // 1101 poly_start(r, c, grid); poly_add(r, c+1, grid); poly_add(r, c+1, vintersect_lo); poly_add(r+1, c, hintersect_lo); poly_add(r+1, c, grid); poly_merge(); break; case 45: // 1200 poly_start(r, c, grid); poly_add(r, c, hintersect_hi); poly_add(r, c+1, vintersect_hi); poly_add(r, c+1, vintersect_lo); poly_add(r, c, vintersect_lo); poly_merge(); break; case 15: // 0120 poly_start(r, c+1, grid); poly_add(r, c+1, vintersect_hi); poly_add(r+1, c, hintersect_hi); poly_add(r+1, c, hintersect_lo); poly_add(r, c, hintersect_lo); poly_merge(); break; case 5: // 0012 poly_start(r, c, vintersect_lo); poly_add(r, c+1, vintersect_lo); poly_add(r+1, c+1, grid); poly_add(r+1, c, hintersect_hi); poly_add(r, c, vintersect_hi); poly_merge(); break; case 55: // 2001 poly_start(r+1, c, grid); poly_add(r, c, vintersect_hi); poly_add(r, c, hintersect_hi); poly_add(r, c, hintersect_lo); poly_add(r+1, c, hintersect_lo); poly_merge(); break; case 35: // 1022 poly_start(r, c, grid); poly_add(r, c, hintersect_lo); poly_add(r, c+1, vintersect_lo); poly_add(r, c+1, vintersect_hi); poly_add(r, c, vintersect_hi); poly_merge(); break; case 65: // 2102 poly_start(r, c+1, grid); poly_add(r, c+1, vintersect_lo); poly_add(r+1, c, hintersect_lo); poly_add(r+1, c, hintersect_hi); poly_add(r, c, hintersect_hi); poly_merge(); break; case 75: // 2210 poly_start(r, c, vintersect_hi); poly_add(r, c+1, vintersect_hi); poly_add(r+1, c+1, grid); poly_add(r+1, c, hintersect_lo); poly_add(r, c, vintersect_lo); poly_merge(); break; case 25: // 0221 poly_start(r+1, c, grid); poly_add(r, c, vintersect_lo); poly_add(r, c, hintersect_lo); poly_add(r, c, hintersect_hi); poly_add(r+1, c, hintersect_hi); poly_merge(); break; case 29: // 1002 poly_start(r, c, grid); poly_add(r, c, hintersect_lo); poly_add(r+1, c, hintersect_lo); poly_add(r+1, c, hintersect_hi); poly_add(r, c, vintersect_hi); poly_merge(); break; case 63: // 2100 poly_start(r, c+1, grid); poly_add(r, c+1, vintersect_lo); poly_add(r, c, vintersect_lo); poly_add(r, c, vintersect_hi); poly_add(r, c, hintersect_hi); poly_merge(); break; case 21: // 0210 poly_start(r+1, c+1, grid); poly_add(r+1, c, hintersect_lo); poly_add(r, c, hintersect_lo); poly_add(r, c, hintersect_hi); poly_add(r, c+1, vintersect_hi); poly_merge(); break; case 7: // 0021 poly_start(r+1, c, grid); poly_add(r, c, vintersect_lo); poly_add(r, c+1, vintersect_lo); poly_add(r, c+1, vintersect_hi); poly_add(r+1, c, hintersect_hi); poly_merge(); break; case 51: // 1220 poly_start(r, c, grid); poly_add(r, c, hintersect_hi); poly_add(r+1, c, hintersect_hi); poly_add(r+1, c, hintersect_lo); poly_add(r, c, vintersect_lo); poly_merge(); break; case 17: // 0122 poly_start(r, c+1, grid); poly_add(r, c+1, vintersect_hi); poly_add(r, c, vintersect_hi); poly_add(r, c, vintersect_lo); poly_add(r, c, hintersect_lo); poly_merge(); break; case 59: // 2012 poly_start(r+1, c+1, grid); poly_add(r+1, c, hintersect_hi); poly_add(r, c, hintersect_hi); poly_add(r, c, hintersect_lo); poly_add(r, c+1, vintersect_lo); poly_merge(); break; case 73: // 2201 poly_start(r+1, c, grid); poly_add(r, c, vintersect_hi); poly_add(r, c+1, vintersect_hi); poly_add(r, c+1, vintersect_lo); poly_add(r+1, c, hintersect_lo); poly_merge(); break; // single hexagon case 22: // 0211 poly_start(r+1, c, grid); poly_add(r, c, vintersect_lo); poly_add(r, c, hintersect_lo); poly_add(r, c, hintersect_hi); poly_add(r, c+1, vintersect_hi); poly_add(r+1, c+1, grid); poly_merge(); break; case 66: // 2110 poly_start(r, c+1, grid); poly_add(r+1, c+1, grid); poly_add(r+1, c, hintersect_lo); poly_add(r, c, vintersect_lo); poly_add(r, c, vintersect_hi); poly_add(r, c, hintersect_hi); poly_merge(); break; case 38: // 1102 poly_start(r, c, grid); poly_add(r, c+1, grid); poly_add(r, c+1, vintersect_lo); poly_add(r+1, c, hintersect_lo); poly_add(r+1, c, hintersect_hi); poly_add(r, c, vintersect_hi); poly_merge(); break; case 34: // 1021 poly_start(r, c, grid); poly_add(r, c, hintersect_lo); poly_add(r, c+1, vintersect_lo); poly_add(r, c+1, vintersect_hi); poly_add(r+1, c, hintersect_hi); poly_add(r+1, c, grid); poly_merge(); break; case 58: // 2011 poly_start(r+1, c, grid); poly_add(r, c, vintersect_hi); poly_add(r, c, hintersect_hi); poly_add(r, c, hintersect_lo); poly_add(r, c+1, vintersect_lo); poly_add(r+1, c+1, grid); poly_merge(); break; case 14: // 0112 poly_start(r, c+1, grid); poly_add(r+1, c+1, grid); poly_add(r+1, c, hintersect_hi); poly_add(r, c, vintersect_hi); poly_add(r, c, vintersect_lo); poly_add(r, c, hintersect_lo); poly_merge(); break; case 42: // 1120 poly_start(r, c, grid); poly_add(r, c+1, grid); poly_add(r, c+1, vintersect_hi); poly_add(r+1, c, hintersect_hi); poly_add(r+1, c, hintersect_lo); poly_add(r, c, vintersect_lo); poly_merge(); break; case 46: // 1201 poly_start(r, c, grid); poly_add(r, c, hintersect_hi); poly_add(r, c+1, vintersect_hi); poly_add(r, c+1, vintersect_lo); poly_add(r+1, c, hintersect_lo); poly_add(r+1, c, grid); poly_merge(); break; case 64: // 2101 poly_start(r+1, c, grid); poly_add(r, c, vintersect_hi); poly_add(r, c, hintersect_hi); poly_add(r, c+1, grid); poly_add(r, c+1, vintersect_lo); poly_add(r+1, c, hintersect_lo); poly_merge(); break; case 16: // 0121 poly_start(r, c+1, grid); poly_add(r, c+1, vintersect_hi); poly_add(r+1, c, hintersect_hi); poly_add(r+1, c, grid); poly_add(r, c, vintersect_lo); poly_add(r, c, hintersect_lo); poly_merge(); break; case 32: // 1012 poly_start(r, c, grid); poly_add(r, c, hintersect_lo); poly_add(r, c+1, vintersect_lo); poly_add(r+1, c+1, grid); poly_add(r+1, c, hintersect_hi); poly_add(r, c, vintersect_hi); poly_merge(); break; case 48: // 1210 poly_start(r, c, grid); poly_add(r, c, hintersect_hi); poly_add(r, c+1, vintersect_hi); poly_add(r+1, c+1, grid); poly_add(r+1, c, hintersect_lo); poly_add(r, c, vintersect_lo); poly_merge(); break; // 6-sided saddle case 10: // 0101 { double vc = central_value(r, c); if (vc < vlo) { poly_start(r+1, c, grid); poly_add(r, c, vintersect_lo); poly_add(r+1, c, hintersect_lo); poly_merge(); poly_start(r, c+1, grid); poly_add(r, c+1, vintersect_lo); poly_add(r, c, hintersect_lo); poly_merge(); } else { poly_start(r+1, c, grid); poly_add(r, c, vintersect_lo); poly_add(r, c, hintersect_lo); poly_add(r, c+1, grid); poly_add(r, c+1, vintersect_lo); poly_add(r+1, c, hintersect_lo); poly_merge(); } } break; case 30: // 1010 { double vc = central_value(r, c); if (vc < vlo) { poly_start(r, c, grid); poly_add(r, c, hintersect_lo); poly_add(r, c, vintersect_lo); poly_merge(); poly_start(r+1, c+1, grid); poly_add(r+1, c, hintersect_lo); poly_add(r, c+1, vintersect_lo); poly_merge(); } else { poly_start(r, c, grid); poly_add(r, c, hintersect_lo); poly_add(r, c+1, vintersect_lo); poly_add(r+1, c+1, grid); poly_add(r+1, c, hintersect_lo); poly_add(r, c, vintersect_lo); poly_merge(); } } break; case 70: // 2121 { double vc = central_value(r, c); if (vc >= vhi) { poly_start(r+1, c, grid); poly_add(r, c, vintersect_hi); poly_add(r+1, c, hintersect_hi); poly_merge(); poly_start(r, c+1, grid); poly_add(r, c+1, vintersect_hi); poly_add(r, c, hintersect_hi); poly_merge(); } else { poly_start(r+1, c, grid); poly_add(r, c, vintersect_hi); poly_add(r, c, hintersect_hi); poly_add(r, c+1, grid); poly_add(r, c+1, vintersect_hi); poly_add(r+1, c, hintersect_hi); poly_merge(); } } break; case 50: // 1212 { double vc = central_value(r, c); if (vc >= vhi) { poly_start(r, c, grid); poly_add(r, c, hintersect_hi); poly_add(r, c, vintersect_hi); poly_merge(); poly_start(r+1, c+1, grid); poly_add(r+1, c, hintersect_hi); poly_add(r, c+1, vintersect_hi); poly_merge(); } else { poly_start(r, c, grid); poly_add(r, c, hintersect_hi); poly_add(r, c+1, vintersect_hi); poly_add(r+1, c+1, grid); poly_add(r+1, c, hintersect_hi); poly_add(r, c, vintersect_hi); poly_merge(); } } break; // 7-sided saddle case 69: // 2120 { double vc = central_value(r, c); if (vc >= vhi) { poly_start(r, c+1, grid); poly_add(r, c+1, vintersect_hi); poly_add(r, c, hintersect_hi); poly_merge(); poly_start(r, c, vintersect_hi); poly_add(r+1, c, hintersect_hi); poly_add(r+1, c, hintersect_lo); poly_add(r, c, vintersect_lo); poly_merge(); } else { poly_start(r, c+1, grid); poly_add(r, c+1, vintersect_hi); poly_add(r+1, c, hintersect_hi); poly_add(r+1, c, hintersect_lo); poly_add(r, c, vintersect_lo); poly_add(r, c, vintersect_hi); poly_add(r, c, hintersect_hi); poly_merge(); } } break; case 61: // 2021 { double vc = central_value(r, c); if (vc >= vhi) { poly_start(r+1, c, grid); poly_add(r, c, vintersect_hi); poly_add(r+1, c, hintersect_hi); poly_merge(); poly_start(r, c+1, vintersect_hi); poly_add(r, c, hintersect_hi); poly_add(r, c, hintersect_lo); poly_add(r, c+1, vintersect_lo); poly_merge(); } else { poly_start(r+1, c, grid); poly_add(r, c, vintersect_hi); poly_add(r, c, hintersect_hi); poly_add(r, c, hintersect_lo); poly_add(r, c+1, vintersect_lo); poly_add(r, c+1, vintersect_hi); poly_add(r+1, c, hintersect_hi); poly_merge(); } } break; case 47: // 1202 { double vc = central_value(r, c); if (vc >= vhi) { poly_start(r, c, grid); poly_add(r, c, hintersect_hi); poly_add(r, c, vintersect_hi); poly_merge(); poly_start(r+1, c, hintersect_hi); poly_add(r, c+1, vintersect_hi); poly_add(r, c+1, vintersect_lo); poly_add(r+1, c, hintersect_lo); poly_merge(); } else { poly_start(r, c, grid); poly_add(r, c, hintersect_hi); poly_add(r, c+1, vintersect_hi); poly_add(r, c+1, vintersect_lo); poly_add(r+1, c, hintersect_lo); poly_add(r+1, c, hintersect_hi); poly_add(r, c, vintersect_hi); poly_merge(); } } break; case 23: // 0212 { double vc = central_value(r, c); if (vc >= vhi) { poly_start(r+1, c+1, grid); poly_add(r+1, c, hintersect_hi); poly_add(r, c+1, vintersect_hi); poly_merge(); poly_start(r, c, hintersect_hi); poly_add(r, c, vintersect_hi); poly_add(r, c, vintersect_lo); poly_add(r, c, hintersect_lo); poly_merge(); } else { poly_start(r+1, c+1, grid); poly_add(r+1, c, hintersect_hi); poly_add(r, c, vintersect_hi); poly_add(r, c, vintersect_lo); poly_add(r, c, hintersect_lo); poly_add(r, c, hintersect_hi); poly_add(r, c+1, vintersect_hi); poly_merge(); } } break; case 11: // 0102 { double vc = central_value(r, c); if (vc < vlo) { poly_start(r, c+1, grid); poly_add(r, c+1, vintersect_lo); poly_add(r, c, hintersect_lo); poly_merge(); poly_start(r, c, vintersect_lo); poly_add(r+1, c, hintersect_lo); poly_add(r+1, c, hintersect_hi); poly_add(r, c, vintersect_hi); poly_merge(); } else { poly_start(r, c+1, grid); poly_add(r, c+1, vintersect_lo); poly_add(r+1, c, hintersect_lo); poly_add(r+1, c, hintersect_hi); poly_add(r, c, vintersect_hi); poly_add(r, c, vintersect_lo); poly_add(r, c, hintersect_lo); poly_merge(); } } break; case 19: // 0201 { double vc = central_value(r, c); if (vc < vlo) { poly_start(r+1, c, grid); poly_add(r, c, vintersect_lo); poly_add(r+1, c, hintersect_lo); poly_merge(); poly_start(r, c+1, vintersect_lo); poly_add(r, c, hintersect_lo); poly_add(r, c, hintersect_hi); poly_add(r, c+1, vintersect_hi); poly_merge(); } else { poly_start(r+1, c, grid); poly_add(r, c, vintersect_lo); poly_add(r, c, hintersect_lo); poly_add(r, c, hintersect_hi); poly_add(r, c+1, vintersect_hi); poly_add(r, c+1, vintersect_lo); poly_add(r+1, c, hintersect_lo); poly_merge(); } } break; case 33: // 1020 { double vc = central_value(r, c); if (vc < vlo) { poly_start(r, c, grid); poly_add(r, c, hintersect_lo); poly_add(r, c, vintersect_lo); poly_merge(); poly_start(r+1, c, hintersect_lo); poly_add(r, c+1, vintersect_lo); poly_add(r, c+1, vintersect_hi); poly_add(r+1, c, hintersect_hi); poly_merge(); } else { poly_start(r, c, grid); poly_add(r, c, hintersect_lo); poly_add(r, c+1, vintersect_lo); poly_add(r, c+1, vintersect_hi); poly_add(r+1, c, hintersect_hi); poly_add(r+1, c, hintersect_lo); poly_add(r, c, vintersect_lo); poly_merge(); } } break; case 57: // 2010 { double vc = central_value(r, c); if (vc < vlo) { poly_start(r+1, c+1, grid); poly_add(r+1, c, hintersect_lo); poly_add(r, c+1, vintersect_lo); poly_merge(); poly_start(r, c, hintersect_lo); poly_add(r, c, vintersect_lo); poly_add(r, c, vintersect_hi); poly_add(r, c, hintersect_hi); poly_merge(); } else { poly_start(r+1, c+1, grid); poly_add(r+1, c, hintersect_lo); poly_add(r, c, vintersect_lo); poly_add(r, c, vintersect_hi); poly_add(r, c, hintersect_hi); poly_add(r, c, hintersect_lo); poly_add(r, c+1, vintersect_lo); poly_merge(); } } break; // 8-sided saddle case 60: // 2020 { double vc = central_value(r, c); if (vc < vlo) { poly_start(r, c, vintersect_hi); poly_add(r, c, hintersect_hi); poly_add(r, c, hintersect_lo); poly_add(r, c, vintersect_lo); poly_merge(); poly_start(r, c+1, vintersect_hi); poly_add(r+1, c, hintersect_hi); poly_add(r+1, c, hintersect_lo); poly_add(r, c+1, vintersect_lo); poly_merge(); } else if (vc >= vhi) { poly_start(r, c, vintersect_hi); poly_add(r+1, c, hintersect_hi); poly_add(r+1, c, hintersect_lo); poly_add(r, c, vintersect_lo); poly_merge(); poly_start(r, c+1, vintersect_hi); poly_add(r, c, hintersect_hi); poly_add(r, c, hintersect_lo); poly_add(r, c+1, vintersect_lo); poly_merge(); } else { poly_start(r, c, vintersect_hi); poly_add(r, c, hintersect_hi); poly_add(r, c, hintersect_lo); poly_add(r, c+1, vintersect_lo); poly_add(r, c+1, vintersect_hi); poly_add(r+1, c, hintersect_hi); poly_add(r+1, c, hintersect_lo); poly_add(r, c, vintersect_lo); poly_merge(); } } break; case 20: // 0202 { double vc = central_value(r, c); if (vc < vlo) { poly_start(r, c, vintersect_lo); poly_add(r+1, c, hintersect_lo); poly_add(r+1, c, hintersect_hi); poly_add(r, c, vintersect_hi); poly_merge(); poly_start(r, c+1, vintersect_lo); poly_add(r, c, hintersect_lo); poly_add(r, c, hintersect_hi); poly_add(r, c+1, vintersect_hi); poly_merge(); } else if (vc >= vhi) { poly_start(r, c, vintersect_lo); poly_add(r, c, hintersect_lo); poly_add(r, c, hintersect_hi); poly_add(r, c, vintersect_hi); poly_merge(); poly_start(r, c+1, vintersect_lo); poly_add(r+1, c, hintersect_lo); poly_add(r+1, c, hintersect_hi); poly_add(r, c+1, vintersect_hi); poly_merge(); } else { poly_start(r, c, vintersect_lo); poly_add(r, c, hintersect_lo); poly_add(r, c, hintersect_hi); poly_add(r, c+1, vintersect_hi); poly_add(r, c+1, vintersect_lo); poly_add(r+1, c, hintersect_lo); poly_add(r+1, c, hintersect_hi); poly_add(r, c, vintersect_hi); poly_merge(); } } break; } } } } virtual cpp11::writable::list collect() {// make polygons cpp11::writable::doubles x_out, y_out; cpp11::writable::integers id; // vectors holding resulting polygon paths int cur_id = 0; // id counter for the polygon lines // iterate over all locations in the polygon grid for (auto it = polygon_grid.begin(); it != polygon_grid.end(); it++) { if (((it->second).collected && !(it->second).altpoint) || ((it->second).collected && (it->second).collected2 && (it->second).altpoint)) { continue; // skip any grid points that are already fully collected } // we have found a new polygon line; process it cur_id++; grid_point start = it->first; grid_point cur = start; grid_point prev = (it->second).prev; // if this point has an alternative and it hasn't been collected yet then we start there if ((it->second).altpoint && !(it->second).collected2) prev = (it->second).prev2; int i = 0; do { point p = calc_point_coords(cur); x_out.push_back(p.x); y_out.push_back(p.y); id.push_back(cur_id); // record that we have processed this point and proceed to next if (polygon_grid[cur].altpoint && polygon_grid[cur].prev2 == prev) { // if an alternative point exists and its previous point in the polygon // corresponds to the recorded previous point, then that's the point // we're working with here // mark current point as collected and advance polygon_grid[cur].collected2 = true; grid_point newcur = polygon_grid[cur].next2; prev = cur; cur = newcur; } else { // mark current point as collected and advance polygon_grid[cur].collected = true; grid_point newcur = polygon_grid[cur].next; prev = cur; cur = newcur; } i++; if (i % 100000 == 0) { cpp11::check_user_interrupt(); } } while (!(cur == start)); // keep going until we reach the start point again } return cpp11::writable::list({ "x"_nm = x_out, "y"_nm = y_out, "id"_nm = id }); } }; class isoliner : public isobander { protected: void line_start(int r, int c, point_type type) { // start a new line segment tmp_poly[0].r = r; tmp_poly[0].c = c; tmp_poly[0].type = type; tmp_poly_size = 1; } void line_add(int r, int c, point_type type) { // add point to line tmp_poly[tmp_poly_size].r = r; tmp_poly[tmp_poly_size].c = c; tmp_poly[tmp_poly_size].type = type; tmp_poly_size++; } void line_merge() { // merge current elementary polygon to prior polygons //cout << "merging points: " << tmp_poly[0] << " " << tmp_poly[1] << endl; int score = 2*polygon_grid.count(tmp_poly[1]) + polygon_grid.count(tmp_poly[0]); switch(score) { case 0: // completely unconnected line segment polygon_grid[tmp_poly[0]].next = tmp_poly[1]; polygon_grid[tmp_poly[1]].prev = tmp_poly[0]; break; case 1: // only first point connects if (polygon_grid[tmp_poly[0]].next == grid_point()) { polygon_grid[tmp_poly[0]].next = tmp_poly[1]; polygon_grid[tmp_poly[1]].prev = tmp_poly[0]; } else if (polygon_grid[tmp_poly[0]].prev == grid_point()) { polygon_grid[tmp_poly[0]].prev = tmp_poly[1]; polygon_grid[tmp_poly[1]].next = tmp_poly[0]; } else { // should never go here cpp11::stop("cannot merge line segment at interior of existing line segment"); } break; case 2: // only second point connects if (polygon_grid[tmp_poly[1]].next == grid_point()) { polygon_grid[tmp_poly[1]].next = tmp_poly[0]; polygon_grid[tmp_poly[0]].prev = tmp_poly[1]; } else if (polygon_grid[tmp_poly[1]].prev == grid_point()) { polygon_grid[tmp_poly[1]].prev = tmp_poly[0]; polygon_grid[tmp_poly[0]].next = tmp_poly[1]; } else { // should never go here cpp11::stop("cannot merge line segment at interior of existing line segment"); } break; case 3: // two-way merge //cout << "two-way merge not implemented" << endl; //break; // two-way merge doesn't work yet { int score2 = 8*(polygon_grid[tmp_poly[0]].next == grid_point()) + 4*(polygon_grid[tmp_poly[0]].prev == grid_point()) + 2*(polygon_grid[tmp_poly[1]].next == grid_point()) + (polygon_grid[tmp_poly[1]].prev == grid_point()); switch(score2) { case 9: // 1001 polygon_grid[tmp_poly[0]].next = tmp_poly[1]; polygon_grid[tmp_poly[1]].prev = tmp_poly[0]; break; case 6: // 0110 polygon_grid[tmp_poly[0]].prev = tmp_poly[1]; polygon_grid[tmp_poly[1]].next = tmp_poly[0]; break; case 10: // 1010 { polygon_grid[tmp_poly[0]].next = tmp_poly[1]; polygon_grid[tmp_poly[1]].next = tmp_poly[0]; // need to reverse connections grid_point cur = tmp_poly[1]; int i = 0; do { grid_point tmp = polygon_grid[cur].prev; polygon_grid[cur].prev = polygon_grid[cur].next; polygon_grid[cur].next = tmp; cur = tmp; i++; if (i % 100000 == 0) { cpp11::check_user_interrupt(); } } while (!(cur == grid_point())); } break; case 5: // 0101 { polygon_grid[tmp_poly[0]].prev = tmp_poly[1]; polygon_grid[tmp_poly[1]].prev = tmp_poly[0]; // need to reverse connections grid_point cur = tmp_poly[0]; int i = 0; do { grid_point tmp = polygon_grid[cur].next; polygon_grid[cur].next = polygon_grid[cur].prev; polygon_grid[cur].prev = tmp; cur = tmp; i++; if (i % 100000 == 0) { cpp11::check_user_interrupt(); } } while (!(cur == grid_point())); } break; default: // should never go here cpp11::stop("cannot merge line segment at interior of existing line segment"); } } break; default: cpp11::stop("unknown merge state"); } //cout << "new grid:" << endl; //print_polygons_state(); } public: isoliner(cpp11::doubles x, cpp11::doubles y, cpp11::doubles_matrix<> z, double value = 0) : isobander(x, y, z, value, 0) {} void set_value(double value) { vlo = value; } virtual void calculate_contour() { // clear polygon grid and associated internal variables reset_grid(); // setup matrix of binarized cell representations vector binarized(nrow*ncol); vector::iterator iv = binarized.begin(); for (int i = 0; i < nrow * ncol; ++i) { *iv = (grid_z_p[i] >= vlo); iv++; } vector cells((nrow - 1) * (ncol - 1)); for (int r = 0; r < nrow-1; r++) { for (int c = 0; c < ncol-1; c++) { int index; if (!R_finite(grid_z_p[r + c * nrow]) || !R_finite(grid_z_p[r + (c + 1) * nrow]) || !R_finite(grid_z_p[r + 1 + c * nrow]) || !R_finite(grid_z_p[r + 1 + (c + 1) * nrow])) { // we don't draw any contours if at least one of the corners is NA index = 0; } else { index = 8*binarized[r + c * nrow] + 4*binarized[r + (c + 1) * nrow] + 2*binarized[r + 1 + (c + 1) * nrow] + 1*binarized[r + 1 + c * nrow]; } // two-segment saddles if (index == 5 && (central_value(r, c) < vlo)) { index = 10; } else if (index == 10 && (central_value(r, c) < vlo)) { index = 5; } cells[r + c * (nrow - 1)] = index; } } cpp11::check_user_interrupt(); for (int r = 0; r < nrow-1; r++) { for (int c = 0; c < ncol-1; c++) { switch(cells[r + c * (nrow - 1)]) { case 0: break; case 1: line_start(r, c, vintersect_lo); line_add(r+1, c, hintersect_lo); line_merge(); break; case 2: line_start(r, c+1, vintersect_lo); line_add(r+1, c, hintersect_lo); line_merge(); break; case 3: line_start(r, c, vintersect_lo); line_add(r, c+1, vintersect_lo); line_merge(); break; case 4: line_start(r, c, hintersect_lo); line_add(r, c+1, vintersect_lo); line_merge(); break; case 5: // like case 2 line_start(r, c+1, vintersect_lo); line_add(r+1, c, hintersect_lo); line_merge(); // like case 7 line_start(r, c, hintersect_lo); line_add(r, c, vintersect_lo); line_merge(); break; case 6: line_start(r, c, hintersect_lo); line_add(r+1, c, hintersect_lo); line_merge(); break; case 7: line_start(r, c, hintersect_lo); line_add(r, c, vintersect_lo); line_merge(); break; case 8: line_start(r, c, hintersect_lo); line_add(r, c, vintersect_lo); line_merge(); break; case 9: line_start(r, c, hintersect_lo); line_add(r+1, c, hintersect_lo); line_merge(); break; case 10: // like case 1 line_start(r, c, vintersect_lo); line_add(r+1, c, hintersect_lo); line_merge(); // like case 4 line_start(r, c, hintersect_lo); line_add(r, c+1, vintersect_lo); line_merge(); break; case 11: line_start(r, c, hintersect_lo); line_add(r, c+1, vintersect_lo); line_merge(); break; case 12: line_start(r, c, vintersect_lo); line_add(r, c+1, vintersect_lo); line_merge(); break; case 13: line_start(r, c+1, vintersect_lo); line_add(r+1, c, hintersect_lo); line_merge(); break; case 14: line_start(r, c, vintersect_lo); line_add(r+1, c, hintersect_lo); line_merge(); break; default: break; // catch everything, just in case } } } } virtual cpp11::writable::list collect() { // make line segments cpp11::writable::doubles x_out, y_out; cpp11::writable::integers id; // vectors holding resulting polygon paths int cur_id = 0; // id counter for individual line segments // iterate over all locations in the polygon grid for (auto it = polygon_grid.begin(); it != polygon_grid.end(); it++) { //cout << it->first << " " << (it->second).collected << endl; if ((it->second).collected) { continue; // skip any grid points that are already collected } // we have found a new polygon line; process it cur_id++; grid_point start = it->first; grid_point cur = start; int i = 0; if (!(polygon_grid[cur].prev == grid_point())) { // back-track until we find the beginning of the line or circle around once do { cur = polygon_grid[cur].prev; i++; if (i % 100000 == 0) { cpp11::check_user_interrupt(); } } while (!(cur == start || polygon_grid[cur].prev == grid_point())); } start = cur; // reset starting point i = 0; do { //cout << cur << endl; point p = calc_point_coords(cur); x_out.push_back(p.x); y_out.push_back(p.y); id.push_back(cur_id); // record that we have processed this point and proceed to next polygon_grid[cur].collected = true; cur = polygon_grid[cur].next; i++; if (i % 100000 == 0) { cpp11::check_user_interrupt(); } } while (!(cur == start || cur == grid_point())); // keep going until we reach the start point again // if we're back to start, need to output that point one more time if (cur == start) { point p = calc_point_coords(cur); x_out.push_back(p.x); y_out.push_back(p.y); id.push_back(cur_id); } } return cpp11::writable::list({ "x"_nm = x_out, "y"_nm = y_out, "id"_nm = id }); } }; [[cpp11::register]] cpp11::writable::list isobands_impl(cpp11::doubles x, cpp11::doubles y, cpp11::doubles_matrix<> z, cpp11::doubles value_low, cpp11::doubles value_high) { isobander ib(x, y, z); int n_bands = value_low.size(); if (n_bands != value_high.size()) { cpp11::stop("Vectors of low and high values must have the same number of elements."); } ib.calculate_contour(); cpp11::writable::list out; out.reserve(n_bands); for (int i = 0; i < n_bands; ++i) { ib.set_value(value_low[i], value_high[i]); ib.calculate_contour(); out.push_back(ib.collect()); } return out; } [[cpp11::register]] cpp11::writable::list isolines_impl(cpp11::doubles x, cpp11::doubles y, cpp11::doubles_matrix<> z, cpp11::doubles value) { isoliner il(x, y, z); int n_lines = value.size(); cpp11::writable::list out; out.reserve(n_lines); for (int i = 0; i < n_lines; ++i) { il.set_value(REAL(value)[i]); il.calculate_contour(); out.push_back(il.collect()); } return out; } isoband/src/Makevars.win0000644000176200001440000000012515114504310014740 0ustar liggesusers# Commented out to avoid compile-time testthat dependency #PKG_CPPFLAGS = -Itestthat isoband/src/test-runner.cpp0000644000176200001440000000053015114477620015457 0ustar liggesusers/* * Please do not edit this file -- it ensures that your package will export a * 'run_testthat_tests()' C routine that can be used to run the Catch unit tests * available in your package. */ // Commented out to remove compile-time dependency on testthat //#define CATCH_CONFIG_RUNNER //#define TESTTHAT_TEST_RUNNER //#include isoband/src/polygon.cpp0000644000176200001440000000077215114477620014670 0ustar liggesusers#include using namespace std; #include "polygon.h" ostream & operator<<(ostream &out, const point &p) { out << "(" << p.x << ", " << p.y << ")"; return out; } bool operator==(const point &p1, const point &p2) { return (p1.x == p2.x) && (p1.y == p2.y); } ostream & operator<<(ostream &out, const in_polygon_type &t) { switch(t) { case inside: out << "inside"; break; case outside: out << "outside"; break; default: out << "undetermined"; } return out; } isoband/src/clip-lines.h0000644000176200001440000000345015114507355014700 0ustar liggesusers#pragma once #define R_NO_REMAP #include "cpp11/protect.hpp" #include "polygon.h" enum segment_crop_type { none, // segment wasn't cropped complete, // entire segment is gone at_beginning, // beginning of segment is gone at_end, // end of segment is gone in_middle // middle of segment is gone }; // crops the line segment running from p1 to p2 to a unit box segment_crop_type crop_to_unit_box(const point &p1, const point &p2, point &crop1, point &crop2); // a class that can transform coordinates to and from a new coordinate system relative to a unit box class unitbox_transformer { protected: double m00, m01, m10, m11; // transformation matrix double mi00, mi01, mi10, mi11; // inverse transformation matrix point base; public: unitbox_transformer(const point &low_left, const point &low_right, const point &up_left) : base(low_left) { double x0 = low_right.x - low_left.x; double y0 = low_right.y - low_left.y; double x1 = up_left.x - low_left.x; double y1 = up_left.y - low_left.y; if ((x0 == 0 && y0 == 0) || (x1 == 0 && y1 == 0)) { cpp11::stop("singular transformation due to invalid box extent"); } double denominator = y0*x1 - y1*x0; if (denominator == 0) { cpp11::stop("singular transformation due to invalid box extent"); } m00 = -y1/denominator; m01 = x1/denominator; m10 = y0/denominator; m11 = -x0/denominator; mi00 = x0; mi01 = x1; mi10 = y0; mi11 = y1; } point transform(const point &p) { double x = p.x - base.x; double y = p.y - base.y; return point(m00*x + m01*y, m10*x + m11*y); } point inv_transform(const point &p) { double x = mi00*p.x + mi01*p.y; double y = mi10*p.x + mi11*p.y; return point(x + base.x, y + base.y); } }; isoband/src/cpp11.cpp0000644000176200001440000000602215114546205014113 0ustar liggesusers// Generated by cpp11: do not edit by hand // clang-format off #include "cpp11/declarations.hpp" #include // clip-lines.cpp cpp11::writable::list clip_lines_impl(cpp11::doubles x, cpp11::doubles y, cpp11::integers id, double p_mid_x, double p_mid_y, double width, double height, double theta, double asp); extern "C" SEXP _isoband_clip_lines_impl(SEXP x, SEXP y, SEXP id, SEXP p_mid_x, SEXP p_mid_y, SEXP width, SEXP height, SEXP theta, SEXP asp) { BEGIN_CPP11 return cpp11::as_sexp(clip_lines_impl(cpp11::as_cpp>(x), cpp11::as_cpp>(y), cpp11::as_cpp>(id), cpp11::as_cpp>(p_mid_x), cpp11::as_cpp>(p_mid_y), cpp11::as_cpp>(width), cpp11::as_cpp>(height), cpp11::as_cpp>(theta), cpp11::as_cpp>(asp))); END_CPP11 } // isoband.cpp cpp11::writable::list isobands_impl(cpp11::doubles x, cpp11::doubles y, cpp11::doubles_matrix<> z, cpp11::doubles value_low, cpp11::doubles value_high); extern "C" SEXP _isoband_isobands_impl(SEXP x, SEXP y, SEXP z, SEXP value_low, SEXP value_high) { BEGIN_CPP11 return cpp11::as_sexp(isobands_impl(cpp11::as_cpp>(x), cpp11::as_cpp>(y), cpp11::as_cpp>>(z), cpp11::as_cpp>(value_low), cpp11::as_cpp>(value_high))); END_CPP11 } // isoband.cpp cpp11::writable::list isolines_impl(cpp11::doubles x, cpp11::doubles y, cpp11::doubles_matrix<> z, cpp11::doubles value); extern "C" SEXP _isoband_isolines_impl(SEXP x, SEXP y, SEXP z, SEXP value) { BEGIN_CPP11 return cpp11::as_sexp(isolines_impl(cpp11::as_cpp>(x), cpp11::as_cpp>(y), cpp11::as_cpp>>(z), cpp11::as_cpp>(value))); END_CPP11 } // separate-polygons.cpp cpp11::writable::list separate_polygons(cpp11::doubles x, cpp11::doubles y, cpp11::integers id); extern "C" SEXP _isoband_separate_polygons(SEXP x, SEXP y, SEXP id) { BEGIN_CPP11 return cpp11::as_sexp(separate_polygons(cpp11::as_cpp>(x), cpp11::as_cpp>(y), cpp11::as_cpp>(id))); END_CPP11 } extern "C" { static const R_CallMethodDef CallEntries[] = { {"_isoband_clip_lines_impl", (DL_FUNC) &_isoband_clip_lines_impl, 9}, {"_isoband_isobands_impl", (DL_FUNC) &_isoband_isobands_impl, 5}, {"_isoband_isolines_impl", (DL_FUNC) &_isoband_isolines_impl, 4}, {"_isoband_separate_polygons", (DL_FUNC) &_isoband_separate_polygons, 3}, {NULL, NULL, 0} }; } extern "C" attribute_visible void R_init_isoband(DllInfo* dll){ R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); R_forceSymbols(dll, TRUE); } isoband/src/Makevars0000644000176200001440000000012515114504303014146 0ustar liggesusers# Commented out to avoid compile-time testthat dependency #PKG_CPPFLAGS = -Itestthat isoband/src/polygon.h0000644000176200001440000000101215114541247014316 0ustar liggesusers#pragma once #include #include using namespace std; // point in x-y space struct point { double x, y; // x and y coordinates point(double x_in = 0, double y_in = 0) : x(x_in), y(y_in) {} }; bool operator==(const point &p1, const point &p2); ostream & operator<<(ostream &out, const point &p); typedef vector polygon; enum in_polygon_type { inside, // point is inside a polygon outside, // point is outside a polygon undetermined // point lies right on the boundary }; isoband/src/separate-polygons.h0000644000176200001440000000216215114531020016276 0ustar liggesusers#pragma once #include "polygon.h" /* Calculate the number of times a ray extending from point P to the right * intersects with the line segment defined by p0, p1. This number is * 0 or 1. However, -1 is returned if the point lies exactly on the segment, * so intersection in indetermined. */ int ray_intersections(point P, point p0, point p1); /* Test whether a point lies inside a polygon or not. Can return one of * three values, inside, outside, or undetermined. */ in_polygon_type point_in_polygon(const point &P, const polygon &poly); /* Test whether a polygon (the query) lies fully inside another polygon * (the reference). Undetermined points are ignored. If no clear determination * can be made, returns undetermined. * * The fast option determines whether we should call the outcome based on * only the first non-ambiguous point we find or on all points. */ in_polygon_type polygon_in_polygon(const polygon &query, const polygon &reference, bool fast = true); /* Test whether a polygon represents a valid ring (at least 4 points, * not all of which are the same). */ bool is_valid_ring(const polygon &poly); isoband/src/test-separate-polygons.cpp0000644000176200001440000002421115114477620017624 0ustar liggesusers// Commented out to remove compile-time dependency on testthat /* #include #include "polygon.h" #include "separate-polygons.h" context("Point in polygon") { test_that("Simple square") { polygon poly = { point(0, 0), point(0, 1), point(1, 1), point(1, 0), point(0, 0) }; expect_true(point_in_polygon(point(0.5, 0.5), poly) == inside); expect_true(point_in_polygon(point(-0.5, 0.5), poly) == outside); expect_true(point_in_polygon(point(1.5, 0.5), poly) == outside); expect_true(point_in_polygon(point(0.5, -0.5), poly) == outside); expect_true(point_in_polygon(point(0.5, 1.5), poly) == outside); expect_true(point_in_polygon(point(-1, 1), poly) == outside); expect_true(point_in_polygon(point(2, 1), poly) == outside); expect_true(point_in_polygon(point(-1, 0), poly) == outside); expect_true(point_in_polygon(point(2, 0), poly) == outside); expect_true(point_in_polygon(point(0, 0), poly) == undetermined); expect_true(point_in_polygon(point(1, 0), poly) == undetermined); expect_true(point_in_polygon(point(0, 1), poly) == undetermined); expect_true(point_in_polygon(point(1, 1), poly) == undetermined); } test_that("Simple diamond") { polygon poly = { point(0, -.5), point(-.5, 0), point(0, .5), point(.5, 0), point(0, -.5) }; expect_true(point_in_polygon(point(0, 0), poly) == inside); expect_true(point_in_polygon(point(-1, 0), poly) == outside); expect_true(point_in_polygon(point(1, 0), poly) == outside); expect_true(point_in_polygon(point(-.3, -.3), poly) == outside); expect_true(point_in_polygon(point(-.3, .3), poly) == outside); expect_true(point_in_polygon(point(.3, .3), poly) == outside); expect_true(point_in_polygon(point(.3, -.3), poly) == outside); expect_true(point_in_polygon(point(-.2, -.2), poly) == inside); expect_true(point_in_polygon(point(-.2, .2), poly) == inside); expect_true(point_in_polygon(point(.2, .2), poly) == inside); expect_true(point_in_polygon(point(.2, -.2), poly) == inside); expect_true(point_in_polygon(point(0, -.5), poly) == undetermined); expect_true(point_in_polygon(point(-.5, 0), poly) == undetermined); expect_true(point_in_polygon(point(0, .5), poly) == undetermined); expect_true(point_in_polygon(point(.5, 0), poly) == undetermined); expect_true(point_in_polygon(point(-.25, -.25), poly) == undetermined); expect_true(point_in_polygon(point(-.25, .25), poly) == undetermined); expect_true(point_in_polygon(point(.25, .25), poly) == undetermined); expect_true(point_in_polygon(point(.25, -.25), poly) == undetermined); } test_that("Degenerate polygon: horizontal line") { polygon poly = { point(0, 0), point(1, 0), point(2, 0), point(0, 0) }; expect_true(point_in_polygon(point(-.5, 0), poly) == outside); expect_true(point_in_polygon(point(2.5, 0), poly) == outside); expect_true(point_in_polygon(point(0.5, 0), poly) == undetermined); expect_true(point_in_polygon(point(1.5, 0), poly) == undetermined); // alternative version polygon poly2 = { point(1, 0), point(2, 0), point(0, 0), point(1, 0) }; expect_true(point_in_polygon(point(-.5, 0), poly2) == outside); expect_true(point_in_polygon(point(2.5, 0), poly2) == outside); expect_true(point_in_polygon(point(0.5, 0), poly2) == undetermined); expect_true(point_in_polygon(point(1.5, 0), poly2) == undetermined); } test_that("Degenerate polygon: vertical line") { polygon poly = { point(.5, 2), point(.5, 1), point(.5, .5), point(.5, 2) }; expect_true(point_in_polygon(point(0, 2), poly) == outside); expect_true(point_in_polygon(point(0, 1.5), poly) == outside); expect_true(point_in_polygon(point(0, 1), poly) == outside); expect_true(point_in_polygon(point(0, .8), poly) == outside); expect_true(point_in_polygon(point(0, .5), poly) == outside); expect_true(point_in_polygon(point(0, .4), poly) == outside); expect_true(point_in_polygon(point(1, 1), poly) == outside); expect_true(point_in_polygon(point(.5, 2), poly) == undetermined); expect_true(point_in_polygon(point(.5, 1.5), poly) == undetermined); expect_true(point_in_polygon(point(.5, 1), poly) == undetermined); expect_true(point_in_polygon(point(.5, .5), poly) == undetermined); // alternative version polygon poly2 = { point(.5, 1), point(.5, .5), point(.5, 2), point(.5, 1) }; expect_true(point_in_polygon(point(0, 2), poly2) == outside); expect_true(point_in_polygon(point(0, 1.5), poly2) == outside); expect_true(point_in_polygon(point(0, 1), poly2) == outside); expect_true(point_in_polygon(point(0, .8), poly2) == outside); expect_true(point_in_polygon(point(0, .5), poly2) == outside); expect_true(point_in_polygon(point(0, .4), poly2) == outside); expect_true(point_in_polygon(point(1, 1), poly2) == outside); expect_true(point_in_polygon(point(.5, 2), poly2) == undetermined); expect_true(point_in_polygon(point(.5, 1.5), poly2) == undetermined); expect_true(point_in_polygon(point(.5, 1), poly2) == undetermined); expect_true(point_in_polygon(point(.5, .5), poly2) == undetermined); } test_that("Degenerate polygon: point") { polygon poly = { point(0, 0), point(0, 0) }; expect_true(point_in_polygon(point(-1, 0), poly) == outside); expect_true(point_in_polygon(point(1, 0), poly) == outside); expect_true(point_in_polygon(point(0, -1), poly) == outside); expect_true(point_in_polygon(point(0, 1), poly) == outside); expect_true(point_in_polygon(point(0.5, 0.5), poly) == outside); expect_true(point_in_polygon(point(0, 0), poly) == undetermined); } test_that("Multiple flat line segments") { polygon poly = { point(0, 2), point(1, 1), point(2, 1), point(3, 1), point(4, 1), point(4, 0), point(0, 0), point(0, 2) }; expect_true(point_in_polygon(point(-1, 1), poly) == outside); expect_true(point_in_polygon(point(5, 1), poly) == outside); expect_true(point_in_polygon(point(0.5, 1), poly) == inside); // alternative version polygon poly2 = { point(1, 1), point(2, 1), point(3, 1), point(4, 1), point(4, 0), point(0, 0), point(0, 2), point(1, 1) }; expect_true(point_in_polygon(point(-1, 1), poly2) == outside); expect_true(point_in_polygon(point(5, 1), poly2) == outside); expect_true(point_in_polygon(point(0.5, 1), poly2) == inside); // alternative version 2 polygon poly3 = { point(2, 1), point(3, 1), point(4, 1), point(4, 0), point(0, 0), point(0, 2), point(1, 1), point(2, 1) }; expect_true(point_in_polygon(point(-1, 1), poly3) == outside); expect_true(point_in_polygon(point(5, 1), poly3) == outside); expect_true(point_in_polygon(point(0.5, 1), poly3) == inside); // alternative version 3 polygon poly4 = { point(4, 1), point(4, 0), point(0, 0), point(0, 2), point(1, 1), point(2, 1), point(3, 1), point(4, 1) }; expect_true(point_in_polygon(point(-1, 1), poly4) == outside); expect_true(point_in_polygon(point(5, 1), poly4) == outside); expect_true(point_in_polygon(point(0.5, 1), poly4) == inside); } test_that("Zigzag 1") { polygon poly = { point(0, 2), point(1, 1), point(2, 1.5), point(3, 1), point(4, 1.5), point(5, 0), point(0, 0), point(0, 2) }; expect_true(point_in_polygon(point(-1, 1), poly) == outside); expect_true(point_in_polygon(point(5, 1), poly) == outside); expect_true(point_in_polygon(point(0.5, 1), poly) == inside); expect_true(point_in_polygon(point(3, 1), poly) == undetermined); } test_that("Zigzag 2") { polygon poly = { point(0, 2), point(1, 1), point(2, 1.5), point(3, 1), point(4, 1.5), point(4, 3), point(0, 3), point(0, 2) }; expect_true(point_in_polygon(point(-1, 1), poly) == outside); expect_true(point_in_polygon(point(5, 1), poly) == outside); expect_true(point_in_polygon(point(0.5, 1), poly) == outside); expect_true(point_in_polygon(point(1, 1.3), poly) == inside); expect_true(point_in_polygon(point(3, 1), poly) == undetermined); } } context("Polygon in polygon") { test_that("Basic relationships") { polygon p1 = { point(0, 0), point(0, 2), point(2, 2), point(2, 0), point(0, 0) }; polygon p2 = { point(0.5, 0.5), point(0.5, 1.5), point(1.5, 1.5), point(1.5, 0.5), point(0.5, 0.5) }; polygon p3 = { point(-1, -1), point(-1, 0), point(0, 0), point(0, -1), point(-1, -1) }; polygon p4 = { point(-1, -1), point(-1, 1), point(1, 1), point(1, -1), point(-1, -1) }; expect_true(polygon_in_polygon(p2, p1) == inside); expect_true(polygon_in_polygon(p1, p2) == outside); expect_true(polygon_in_polygon(p1, p3) == outside); expect_true(polygon_in_polygon(p3, p1) == outside); expect_true(polygon_in_polygon(p1, p4, false) == undetermined); expect_true(polygon_in_polygon(p4, p1, false) == undetermined); } test_that("Degenerate case") { polygon p1 = { point(0, 0), point(0, 2), point(2, 2), point(2, 0), point(0, 0) }; expect_true(polygon_in_polygon(p1, p1) == undetermined); } } context("is_valid_ring()") { test_that("valid ring") { point p(0, 0); polygon poly; expect_false(is_valid_ring(poly)); poly.push_back(p); expect_false(is_valid_ring(poly)); poly.push_back(p); expect_false(is_valid_ring(poly)); poly.push_back(p); expect_false(is_valid_ring(poly)); poly.push_back(p); expect_false(is_valid_ring(poly)); poly.push_back(point(1, 1)); expect_true(is_valid_ring(poly)); polygon poly2 = { point(0, 0), point(0, 2), point(2, 2), point(2, 0), point(0, 0) }; expect_true(is_valid_ring(poly2)); } } */ isoband/src/separate-polygons.cpp0000644000176200001440000002527215114546246016660 0ustar liggesusers#include "cpp11/doubles.hpp" #include "cpp11/list.hpp" #include "cpp11/matrix.hpp" #include "cpp11/protect.hpp" #define R_NO_REMAP //#include #include #include #include using namespace std; #include "polygon.h" #include "separate-polygons.h" /* Calculate the number of times a ray extending from point P to the right * intersects with the line segment defined by p0, p1. This number is * 0 or 1. However, -1 is returned if the point lies exactly on the segment, * so intersection in indetermined. */ int ray_intersections(point P, point p0, point p1) { // simple cases if (p0.y < p1.y) { if ((P.y < p0.y) || (P.y > p1.y)) return 0; } else { if ((P.y > p0.y) || (P.y < p1.y)) return 0; } if ((P.x > p0.x) && (P.x > p1.x)) return 0; double dy = p1.y-p0.y; if (dy == 0) { if (P.y == p0.y) { // point is on the same y value, but does it lie inside the x interval? if ((P.x < p0.x) && (P.x < p1.x)) return 1; else return -1; } else return 0; // should never get here; handled by simple cases above } double t = (P.y - p0.y)/dy; double xint = p0.x + t*(p1.x - p0.x); //cout << "t = " << t << "; xint = " << xint << endl; if (xint < P.x) { return 0; } else if (xint == P.x) { return -1; } else return 1; } in_polygon_type point_in_polygon(const point &P, const polygon &poly) { int intersections = 0; int n = poly.size(); int istart = 0; while (poly[istart].y == P.y) { // algorithm doesn't work if we start with a line segment that starts at P.y istart++; if (istart == n-1) { // degenerate polygon; one horizontal line // find min and max x and test if P.x is in // that interval or not double xmin = poly[0].x; double xmax = poly[0].x; for (int i = 1; i < n-1; i++) { if (poly[i].x < xmin) { xmin = poly[i].x; } if (poly[i].x > xmax) { xmax = poly[i].x; } } if (P.x >= xmin && P.x <= xmax) { return undetermined; } else { return outside; } } } int i = istart; do { int itr = ray_intersections(P, poly[i], poly[i+1]); //cout << i << " " << itr << endl; if (itr < 0) { // undetermined case, so we're done return undetermined; } if (itr > 0 && poly[i+1].y == P.y) { // special case, intersection with exact line endpoint bool from_above = poly[i].y > poly[i+1].y; // did we enter from above bool wrap_around = false; int j = i+1; do { // find next line segment where we move away from that point if (j == n-1) { j = 0; } if (j == istart) { wrap_around = true; // should never get here, due to choice of istart } if (ray_intersections(P, poly[j], poly[j+1]) < 0) { // if the point lies exactly on any of these segments the case is undetermined return undetermined; } j++; } while (poly[j].y == poly[i+1].y); //cout << from_above << " " << i+1 << " " << j << " " << poly[i+1] << " " << poly[j] << endl; if ((!from_above && poly[j].y < poly[i+1].y) || (from_above && poly[j].y > poly[i+1].y)) { // incorrect intersection //cout << "incorrect intersection" << endl; itr = 0; } i = j; // fast forward if (wrap_around || i == istart) { //cout << "have wrapped around during fast forward" << endl; //cout << "increment intersections (wa) at " << i << " " << itr << " " << intersections << endl; intersections += itr; break; } i--; // decrement by one because it'll be incremented again below } //cout << "increment intersections (el) at " << i << " " << itr << " " << intersections << endl; intersections += itr; i++; if (i == n-1) i = 0; } while(i != istart); if (intersections % 2 == 1) return inside; return outside; } in_polygon_type polygon_in_polygon(const polygon &query, const polygon &reference, bool fast) { int ins = 0, out = 0; for (unsigned int i = 0; i < query.size()-1; i++) { switch(point_in_polygon(query[i], reference)) { case inside: ins += 1; break; case outside: out += 1; break; default: break; } // shortcut for faster classification: if at least one // non-ambiguous point is found, we know whether we're inside // or outside if (fast && (ins > 0 || out > 0)) break; } if (ins > 0 && out == 0) { return inside; } if (out > 0 && ins == 0) { return outside; } return undetermined; } class polygon_hierarchy { private: // for each polygon, contains a set of exterior polygons vector> ext_polygons; vector active_polygons; public: polygon_hierarchy(int n) { ext_polygons.resize(n); active_polygons.resize(n); // initially, all polygons are active for (auto it = active_polygons.begin(); it != active_polygons.end(); it++) { *it = true; } } void print() { for (unsigned int i = 0; i < ext_polygons.size(); i++) { cout << "polygon " << i << " (active = " << active_polygons[i] << ")" << endl; cout << " enclosing: "; for (auto it = ext_polygons[i].begin(); it != ext_polygons[i].end(); it++) { cout << (*it) << " "; } cout << endl; } } void set_exterior(int poly, int exterior) { ext_polygons[poly].insert(exterior); } void remove(int poly) { for (auto it = ext_polygons.begin(); it != ext_polygons.end(); it++) { it->erase(poly); } } // returns the next top level polygon found int top_level_poly() { unsigned int i = 0; do { if (active_polygons[i] && ext_polygons[i].size() == 0) { active_polygons[i] = false; break; } i++; } while (i < ext_polygons.size()); if (i == ext_polygons.size()) { // we have run out of top-level polygons, hence we're done i = -1; } return i; } // find all holes belonging to polygon, remove them and the parent // polygon from the hierarchy, and return set collect_holes(int poly) { set holes; unsigned int i = 0; do { if (active_polygons[i] && ext_polygons[i].size() == 1 && ext_polygons[i].count(poly) == 1) { holes.insert(i); active_polygons[i] = false; } i++; } while (i < ext_polygons.size()); for (auto it = holes.begin(); it != holes.end(); it++) { remove(*it); } remove(poly); return holes; } }; bool is_valid_ring(const polygon &poly) { if (poly.size() < 4) return false; // any polygon with fewer than four points is not a valid ring const point &p1 = poly.front(); auto it = poly.begin(); for (it++; it != poly.end(); it++) { if (!(p1 == *it)) { return true; // at least one point is different; we call it a valid ring } } return false; // degenerate polygon; we ignore it } cpp11::writable::doubles_matrix<> polygon_as_matrix(polygon p, bool reverse = false) { int n = p.size(); cpp11::writable::doubles_matrix<> m(n, 2);; double* m_p = REAL(m); if (reverse) { for (int i = n; i > 0; i--) { m_p[n-i] = p[i-1].x; m_p[n-i+n] = p[i-1].y; } } else { for (int i = 0; i < n; i++) { m_p[i] = p[i].x; m_p[i+n] = p[i].y; } } return m; } [[cpp11::register]] cpp11::writable::list separate_polygons(cpp11::doubles x, cpp11::doubles y, cpp11::integers id) { cpp11::writable::list out; // final result out.reserve(1); // force list so attributes can be set out.attr("class") = {"XY", "MULTIPOLYGON", "sfg"}; int n = x.size(); if (n == 0) { return out; } if (y.size() != n || id.size() != n) { cpp11::stop("Inputs x, y, and id must be of the same length."); } double* x_p = REAL(x); double* y_p = REAL(y); int* id_p = INTEGER(id); // create polygons from input data vector polys; int cur_id = id_p[0]; int cur_poly = 0; polys.push_back(polygon()); for (int i = 0; ifront() == it->back())) { it->push_back(it->front()); } } // set up polygon hierarchy polygon_hierarchy hi(polys.size()); for (unsigned int i = 0; i < polys.size(); i++) { cpp11::check_user_interrupt(); for (unsigned int j = 0; j < polys.size(); j++ ) { if (i == j) continue; in_polygon_type result = polygon_in_polygon(polys[i], polys[j]); //cout << "polygon " << i << " is " << result << " of polygon " << j << endl; if (result == inside) { hi.set_exterior(i, j); } else if (result == undetermined){ cpp11::stop("Found polygons without undefined interior/exterior relationship."); } } } int next_poly = hi.top_level_poly(); int i = 0; while(next_poly >= 0) { if (i % 1000 == 0) { cpp11::check_user_interrupt(); } i++; // for simplicity, we collect the rings even if the polygon // is not valid; we just keep track of this and ignore it at // the end; this reduces the risk of bugs bool valid_poly = is_valid_ring(polys[next_poly]); // collect the holes, if any set holes = hi.collect_holes(next_poly); // record the polygon if valid if (valid_poly) { // collect all the rings belonging to this polygon cpp11::writable::list rings; rings.reserve(holes.size() + 1); // collect the outer ring rings.push_back(polygon_as_matrix(polys[next_poly])); for (auto it = holes.begin(); it != holes.end(); it++) { if (is_valid_ring(polys[*it])) { // we reverse holes so they run in the same direction as outer polygons rings.push_back(polygon_as_matrix(polys[*it], true)); } } out.push_back(rings); } next_poly = hi.top_level_poly(); } return(out); } // testing code /*** R m <- matrix(c(0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 2, 2, 1, 0, 0, 1, 2, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0), 6, 6, byrow = TRUE) z <- isobands(1:6, 1:6, m, 0.5, 1.5) mp1 <- separate_polygons(z[[1]]$x, z[[1]]$y, z[[1]]$id) m <- matrix(c(0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0), 6, 6, byrow = TRUE) z <- isobands(1:6, 1:6, m, 0.5, 1.5) mp2 <- separate_polygons(z[[1]]$x, z[[1]]$y, z[[1]]$id) */ isoband/NAMESPACE0000644000176200001440000000131515114504265013113 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method(iso_to_sfg,default) S3method(iso_to_sfg,isobands) S3method(iso_to_sfg,isolines) S3method(makeContent,isobands_grob) S3method(makeContent,isolines_grob) S3method(makeContext,isolines_grob) export(angle_fixed) export(angle_halfcircle_bottom) export(angle_halfcircle_right) export(angle_identity) export(clip_lines) export(iso_to_sfg) export(isobands) export(isobands_grob) export(isolines) export(isolines_grob) export(label_placer_manual) export(label_placer_middle) export(label_placer_minmax) export(label_placer_none) export(label_placer_simple) export(plot_iso) import(grid) import(rlang) importFrom(utils,modifyList) useDynLib(isoband, .registration = TRUE) isoband/LICENSE0000644000176200001440000000005515114504265012701 0ustar liggesusersYEAR: 2025 COPYRIGHT HOLDER: isoband authors isoband/NEWS.md0000644000176200001440000000300015114552364012766 0ustar liggesusers# isoband 0.3.0 - General upkeep - Rewrite implementation to use cpp11 # isoband 0.2.7 - Remove compile-time dependency on testthat. - Changed maintainer after the original author (Claus Wilke) donated codebase to r-lib. isoband 0.2.6 ---------------------------------------- - Update to the latest testthat headers for compatibility with LLVM clang 15.0.0. - Correct label angle for current aspect ratio in `isolines_grob()` (#28, @eliocamp). isoband 0.2.5 ---------------------------------------- - Add a new label placer function `label_placer_middle()` (#24, @jamarav). - The vendored testthat/catch code now uses a constant value for the stack size rather than relying on `SIGSTKSZ`. See: https://github.com/r-lib/testthat/issues/1373 isoband 0.2.4 ---------------------------------------- - Remove testthat compile-time dependency. isoband 0.2.3 ---------------------------------------- - Fix build for testthat 3.0. isoband 0.2.2 ---------------------------------------- - Remove Rcpp dependency (#11, @thomasp85). isoband 0.2.1 ---------------------------------------- - Improved clipping algorithm for `clip_lines()`, less likely to experience numerical instabilities. isoband 0.2.0 ---------------------------------------- - Added `isolines_grob()` for drawing labeled isolines via the grid graphics system. A companion function `isobands_grob()` is provided for convenience. - Numerous minor fixes and improvements. isoband 0.1.0 ---------------------------------------- First public release. isoband/inst/0000755000176200001440000000000015114552567012661 5ustar liggesusersisoband/inst/doc/0000755000176200001440000000000015114552567013426 5ustar liggesusersisoband/inst/doc/isoband3.html0000644000176200001440000221536015114552566016026 0ustar liggesusers Labeled isolines

Labeled isolines

Claus O. Wilke

2025-12-05

Labeled isolines can be drawn in the grid graphics system via the isolines_grob() function.

library(isoband)
library(grid)

x <- (0:(ncol(volcano) - 1))/(ncol(volcano) - 1)
y <- ((nrow(volcano) - 1):0)/(nrow(volcano) - 1)
lines <- isolines(x, y, volcano, 5*(19:38))

g <- isolines_grob(
  lines, breaks = 20*(5:10),
  gp = gpar(
    fontsize = 10,
    lwd = c(1, 2, 1, 1),
    col = c("grey50", "grey20", "grey50", "grey50")
  )
)

grid.newpage()
grid.draw(g)

The function places labels at the isolines specified via the breaks argument, and it crops isolines around the labels so no lines run into the labels. It is possible to leave extra space around the labels using the margin argument.

g <- isolines_grob(
  lines, breaks = 20*(5:10),
  margin = unit(c(3, 5, 3, 5), "pt"), # margin specified as top, right, bottom, left
  gp = gpar(
    fontsize = 10,
    lwd = c(1, 2, 1, 1),
    col = c("grey50", "grey20", "grey50", "grey50")
  )
)

grid.newpage()
grid.draw(g)

Where the labels are drawn can be controlled via the label_placer argument. A few different label placement strategies are provided. The default, label_placer_minmax(), places labels at the maximum and minimum y value for each isoline. However, this label placer can be further customized. For example, labels can be placed at maximum and minimum x values and at a fixed rotation angle of 90 degrees.

g <- isolines_grob(
  lines, breaks = 20*(5:10),
  gp = gpar(
    fontsize = 10,
    lwd = c(1, 2, 1, 1),
    col = c("grey50", "grey20", "grey50", "grey50")
  ),
  label_placer = label_placer_minmax(
    placement = "rl", # place labels right and left, i.e., min and max x
    rot_adjuster = angle_fixed(pi/2) # set fixed angle of 90 degrees
  )
)

grid.newpage()
grid.draw(g)

The label placer label_placer_none() doesn’t place any labels.

g <- isolines_grob(
  lines, breaks = 20*(5:10),
  gp = gpar(
    lwd = c(1, 2, 1, 1),
    col = c("grey50", "grey20", "grey50", "grey50")
  ),
  label_placer = label_placer_none()
)

grid.newpage()
grid.draw(g)

We can also place labels entirely manually by using label_placer_manual(). This label placer takes as arguments the breaks that should be labeled and the corresponding coordinates and label angles. Breaks for which no coordinates are specified are ignored. If multiple coordinates are supplied for the same break then multiple labels are placed for that break.

g <- isolines_grob(
  lines, breaks = 20*(5:10),
  gp = gpar(
    fontsize = 12,
    lwd = c(1, 2, 1, 1),
    col = c("grey50", "grey20", "grey50", "grey50")
  ),
  label_col = "red",
  label_placer = label_placer_manual(
    breaks = c("120", "160", "160"),
    x = c(0.15, 0.5, 0.6),
    y = c(0.19, 0.51, 0.87),
    theta = 0
  )
)

grid.newpage()
grid.draw(g)

Because isolines are cropped around the labels, the labeling strategy works even if the isolines are drawn on top of a colored background. For example, we could draw filled isobands using isobands_grob() and then draw labeled lines on top.

viridis_pal <- colorRampPalette(
  c("#440154", "#414487", "#2A788E", "#22A884", "#7AD151", "#FDE725"),
  space = "Lab"
)

bands <- isobands(x, y, volcano, 5*(18:38), 5*(19:39))

b <- isobands_grob(
  bands,
  gp = gpar(col = NA, fill = viridis_pal(21), alpha = 0.4)
)
l <- isolines_grob(
  lines, breaks = 20*(5:10),
  gp = gpar(
    fontsize = 10,
    lwd = c(1, 2, 1, 1),
    col = c("grey50", "grey20", "grey50", "grey50")
  )
)

grid.newpage()
grid.draw(b)
grid.draw(l)

isoband/inst/doc/isoband3.Rmd0000644000176200001440000000747215114504265015576 0ustar liggesusers--- title: "Labeled isolines" author: "Claus O. Wilke" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Labeled isolines} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r} #| label: setup #| include: false knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ``` Labeled isolines can be drawn in the grid graphics system via the `isolines_grob()` function. ```{r} library(isoband) library(grid) x <- (0:(ncol(volcano) - 1))/(ncol(volcano) - 1) y <- ((nrow(volcano) - 1):0)/(nrow(volcano) - 1) lines <- isolines(x, y, volcano, 5*(19:38)) g <- isolines_grob( lines, breaks = 20*(5:10), gp = gpar( fontsize = 10, lwd = c(1, 2, 1, 1), col = c("grey50", "grey20", "grey50", "grey50") ) ) grid.newpage() grid.draw(g) ``` The function places labels at the isolines specified via the `breaks` argument, and it crops isolines around the labels so no lines run into the labels. It is possible to leave extra space around the labels using the `margin` argument. ```{r} g <- isolines_grob( lines, breaks = 20*(5:10), margin = unit(c(3, 5, 3, 5), "pt"), # margin specified as top, right, bottom, left gp = gpar( fontsize = 10, lwd = c(1, 2, 1, 1), col = c("grey50", "grey20", "grey50", "grey50") ) ) grid.newpage() grid.draw(g) ``` Where the labels are drawn can be controlled via the `label_placer` argument. A few different label placement strategies are provided. The default, `label_placer_minmax()`, places labels at the maximum and minimum y value for each isoline. However, this label placer can be further customized. For example, labels can be placed at maximum and minimum x values and at a fixed rotation angle of 90 degrees. ```{r} g <- isolines_grob( lines, breaks = 20*(5:10), gp = gpar( fontsize = 10, lwd = c(1, 2, 1, 1), col = c("grey50", "grey20", "grey50", "grey50") ), label_placer = label_placer_minmax( placement = "rl", # place labels right and left, i.e., min and max x rot_adjuster = angle_fixed(pi/2) # set fixed angle of 90 degrees ) ) grid.newpage() grid.draw(g) ``` The label placer `label_placer_none()` doesn't place any labels. ```{r} g <- isolines_grob( lines, breaks = 20*(5:10), gp = gpar( lwd = c(1, 2, 1, 1), col = c("grey50", "grey20", "grey50", "grey50") ), label_placer = label_placer_none() ) grid.newpage() grid.draw(g) ``` We can also place labels entirely manually by using `label_placer_manual()`. This label placer takes as arguments the breaks that should be labeled and the corresponding coordinates and label angles. Breaks for which no coordinates are specified are ignored. If multiple coordinates are supplied for the same break then multiple labels are placed for that break. ```{r} g <- isolines_grob( lines, breaks = 20*(5:10), gp = gpar( fontsize = 12, lwd = c(1, 2, 1, 1), col = c("grey50", "grey20", "grey50", "grey50") ), label_col = "red", label_placer = label_placer_manual( breaks = c("120", "160", "160"), x = c(0.15, 0.5, 0.6), y = c(0.19, 0.51, 0.87), theta = 0 ) ) grid.newpage() grid.draw(g) ``` Because isolines are cropped around the labels, the labeling strategy works even if the isolines are drawn on top of a colored background. For example, we could draw filled isobands using `isobands_grob()` and then draw labeled lines on top. ```{r} viridis_pal <- colorRampPalette( c("#440154", "#414487", "#2A788E", "#22A884", "#7AD151", "#FDE725"), space = "Lab" ) bands <- isobands(x, y, volcano, 5*(18:38), 5*(19:39)) b <- isobands_grob( bands, gp = gpar(col = NA, fill = viridis_pal(21), alpha = 0.4) ) l <- isolines_grob( lines, breaks = 20*(5:10), gp = gpar( fontsize = 10, lwd = c(1, 2, 1, 1), col = c("grey50", "grey20", "grey50", "grey50") ) ) grid.newpage() grid.draw(b) grid.draw(l) ``` isoband/inst/doc/isoband3.R0000644000176200001440000000522615114552566015257 0ustar liggesusers## ----------------------------------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ## ----------------------------------------------------------------------------- library(isoband) library(grid) x <- (0:(ncol(volcano) - 1))/(ncol(volcano) - 1) y <- ((nrow(volcano) - 1):0)/(nrow(volcano) - 1) lines <- isolines(x, y, volcano, 5*(19:38)) g <- isolines_grob( lines, breaks = 20*(5:10), gp = gpar( fontsize = 10, lwd = c(1, 2, 1, 1), col = c("grey50", "grey20", "grey50", "grey50") ) ) grid.newpage() grid.draw(g) ## ----------------------------------------------------------------------------- g <- isolines_grob( lines, breaks = 20*(5:10), margin = unit(c(3, 5, 3, 5), "pt"), # margin specified as top, right, bottom, left gp = gpar( fontsize = 10, lwd = c(1, 2, 1, 1), col = c("grey50", "grey20", "grey50", "grey50") ) ) grid.newpage() grid.draw(g) ## ----------------------------------------------------------------------------- g <- isolines_grob( lines, breaks = 20*(5:10), gp = gpar( fontsize = 10, lwd = c(1, 2, 1, 1), col = c("grey50", "grey20", "grey50", "grey50") ), label_placer = label_placer_minmax( placement = "rl", # place labels right and left, i.e., min and max x rot_adjuster = angle_fixed(pi/2) # set fixed angle of 90 degrees ) ) grid.newpage() grid.draw(g) ## ----------------------------------------------------------------------------- g <- isolines_grob( lines, breaks = 20*(5:10), gp = gpar( lwd = c(1, 2, 1, 1), col = c("grey50", "grey20", "grey50", "grey50") ), label_placer = label_placer_none() ) grid.newpage() grid.draw(g) ## ----------------------------------------------------------------------------- g <- isolines_grob( lines, breaks = 20*(5:10), gp = gpar( fontsize = 12, lwd = c(1, 2, 1, 1), col = c("grey50", "grey20", "grey50", "grey50") ), label_col = "red", label_placer = label_placer_manual( breaks = c("120", "160", "160"), x = c(0.15, 0.5, 0.6), y = c(0.19, 0.51, 0.87), theta = 0 ) ) grid.newpage() grid.draw(g) ## ----------------------------------------------------------------------------- viridis_pal <- colorRampPalette( c("#440154", "#414487", "#2A788E", "#22A884", "#7AD151", "#FDE725"), space = "Lab" ) bands <- isobands(x, y, volcano, 5*(18:38), 5*(19:39)) b <- isobands_grob( bands, gp = gpar(col = NA, fill = viridis_pal(21), alpha = 0.4) ) l <- isolines_grob( lines, breaks = 20*(5:10), gp = gpar( fontsize = 10, lwd = c(1, 2, 1, 1), col = c("grey50", "grey20", "grey50", "grey50") ) ) grid.newpage() grid.draw(b) grid.draw(l) isoband/inst/doc/isoband1.R0000644000176200001440000000364615114552564015257 0ustar liggesusers## ----------------------------------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ## ----------------------------------------------------------------------------- library(isoband) library(grid) m <- matrix( c(0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 1, 2, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0), 5, 5, byrow = TRUE ) lines <- isolines(x = 1:ncol(m)/6, y = nrow(m):1/6, z = m, levels = 0.5) lines grid.newpage() grid.draw(polylineGrob(lines[[1]]$x, lines[[1]]$y, lines[[1]]$id)) bands <- isobands(x = 1:ncol(m)/6, y = nrow(m):1/6, z = m, levels_low = 0.5, levels_high = 1.5) bands grid.newpage() grid.draw(pathGrob(bands[[1]]$x, bands[[1]]$y, bands[[1]]$id, gp = gpar(fill = "cornsilk"))) ## ----------------------------------------------------------------------------- plot_iso(m, 0.5, 1.5) ## ----------------------------------------------------------------------------- m <- matrix( c(NA, NA, NA, 0, 0, 0, NA, NA, NA, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0), 6, 6, byrow = TRUE ) plot_iso(m, 0.5, 1.5) ## ----------------------------------------------------------------------------- m <- matrix( c(0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0.8, 0), 4, 4, byrow = TRUE ) plot_iso(m, 0.5, 1.5) ## ----------------------------------------------------------------------------- # contouring with contourLines() from grDevices fn_contourLines <- function() { grDevices::contourLines(1:ncol(volcano), 1:nrow(volcano), volcano, levels = 10*(10:18)) } # contouring with isolines() fn_isolines <- function() { isolines(1:ncol(volcano), 1:nrow(volcano), volcano, 10*(10:18)) } # contouring with isobands() fn_isobands <- function() { isobands(1:ncol(volcano), 1:nrow(volcano), volcano, 10*(9:17), 10*(10:18)) } bench::mark(fn_contourLines(), fn_isolines(), fn_isobands(), check = FALSE) isoband/inst/doc/isoband1.Rmd0000644000176200001440000001114515114544775015576 0ustar liggesusers--- title: "Generating isolines and isobands" author: "Claus O. Wilke" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Generating isolines and isobands} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r} #| label: setup #| include: false knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ``` The isoband package implements fast algorithms for generating isolines (lines of equal elevation) and isobands (ranges of elevation delimited by two isolines) from a matrix of elevation data. For both cases, the package employs the marching squares algorithms as described on [Wikipedia.](https://en.wikipedia.org/wiki/Marching_squares) Marching squares algorithms break down the elevation matrix into blocks of 2x2 elevation values. For each block, they then determine the appropriate isolines/isobands from a lookup table of all possible arrangements of isolines or isobands within a 2x2 block. There are 16 distinct possibilities for isolines and 81 for isobands. The implementation in the isoband package goes beyond the algorithm described on Wikipedia in that it merges the isolines or isobands from separate blocks into extended line traces or polygons. The package is meant as a low-level package with minimal required dependencies. Therefore, many of the functions provided may not immediately be useful to endusers, but they will enable developers of other packages to integrate isolines and isobands into their feature set. The two main functions of the package are called `isolines()` and `isobands()`, and they have similar user interfaces and return values. Both take a vector `x` specifying the x values corresponding to the columns of the elevation matrix, a vector `y` specifying the y values corresponding to the rows of the elevation matrix, and an elevation matrix `z`. The two functions differ in that `isolines()` takes a single argument `levels` specifying the elevation levels for which isolines should be calculated, whereas `isobands()` takes two arguments, `levels_low` and `levels_high`, specifying the lower and upper bounds for each isoband. The return value in both cases is a list of lists. The outer list contains one list element for each specified isolevel. The inner lists hold line or polygon data in the form `x`, `y`, `id` as used by `grid::polylineGrob()` or `grid::pathGrob()`. The format has been chosen for easy drawing of the resulting values via these two grid functions. ```{r} library(isoband) library(grid) m <- matrix( c(0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 1, 2, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0), 5, 5, byrow = TRUE ) lines <- isolines(x = 1:ncol(m)/6, y = nrow(m):1/6, z = m, levels = 0.5) lines grid.newpage() grid.draw(polylineGrob(lines[[1]]$x, lines[[1]]$y, lines[[1]]$id)) bands <- isobands(x = 1:ncol(m)/6, y = nrow(m):1/6, z = m, levels_low = 0.5, levels_high = 1.5) bands grid.newpage() grid.draw(pathGrob(bands[[1]]$x, bands[[1]]$y, bands[[1]]$id, gp = gpar(fill = "cornsilk"))) ``` A convenience function `plot_iso()` can be used to inspect a single isoband and corresponding isolines for an elevation matrix. This function is mostly meant for debugging and illustration purposes. It draws a grid of matrix points colored by whether each point is below, within, or above the isoband, as well as the isoband itself and the enclosing isolines. ```{r} plot_iso(m, 0.5, 1.5) ``` The isoband package handles `NA` values in the matrix by simply ignoring the respective grid points. ```{r} m <- matrix( c(NA, NA, NA, 0, 0, 0, NA, NA, NA, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0), 6, 6, byrow = TRUE ) plot_iso(m, 0.5, 1.5) ``` Isobands can contain holes, as shown above, and they can also consist of multiple disconnected pieces. ```{r} m <- matrix( c(0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0.8, 0), 4, 4, byrow = TRUE ) plot_iso(m, 0.5, 1.5) ``` # Performance The code is written in C++ and performance is generally good. Isolining is about as fast as `grDevices::contourLines()`, isobanding is approximately 2.5 times slower. ```{r} # contouring with contourLines() from grDevices fn_contourLines <- function() { grDevices::contourLines(1:ncol(volcano), 1:nrow(volcano), volcano, levels = 10*(10:18)) } # contouring with isolines() fn_isolines <- function() { isolines(1:ncol(volcano), 1:nrow(volcano), volcano, 10*(10:18)) } # contouring with isobands() fn_isobands <- function() { isobands(1:ncol(volcano), 1:nrow(volcano), volcano, 10*(9:17), 10*(10:18)) } bench::mark(fn_contourLines(), fn_isolines(), fn_isobands(), check = FALSE) ``` isoband/inst/doc/isoband1.html0000644000176200001440000024726415114552565016031 0ustar liggesusers Generating isolines and isobands

Generating isolines and isobands

Claus O. Wilke

2025-12-05

The isoband package implements fast algorithms for generating isolines (lines of equal elevation) and isobands (ranges of elevation delimited by two isolines) from a matrix of elevation data. For both cases, the package employs the marching squares algorithms as described on Wikipedia. Marching squares algorithms break down the elevation matrix into blocks of 2x2 elevation values. For each block, they then determine the appropriate isolines/isobands from a lookup table of all possible arrangements of isolines or isobands within a 2x2 block. There are 16 distinct possibilities for isolines and 81 for isobands. The implementation in the isoband package goes beyond the algorithm described on Wikipedia in that it merges the isolines or isobands from separate blocks into extended line traces or polygons. The package is meant as a low-level package with minimal required dependencies. Therefore, many of the functions provided may not immediately be useful to endusers, but they will enable developers of other packages to integrate isolines and isobands into their feature set.

The two main functions of the package are called isolines() and isobands(), and they have similar user interfaces and return values. Both take a vector x specifying the x values corresponding to the columns of the elevation matrix, a vector y specifying the y values corresponding to the rows of the elevation matrix, and an elevation matrix z. The two functions differ in that isolines() takes a single argument levels specifying the elevation levels for which isolines should be calculated, whereas isobands() takes two arguments, levels_low and levels_high, specifying the lower and upper bounds for each isoband. The return value in both cases is a list of lists. The outer list contains one list element for each specified isolevel. The inner lists hold line or polygon data in the form x, y, id as used by grid::polylineGrob() or grid::pathGrob(). The format has been chosen for easy drawing of the resulting values via these two grid functions.

library(isoband)
library(grid)

m <- matrix(
  c(0, 0, 0, 0, 0,
    0, 1, 2, 1, 0,
    0, 1, 2, 0, 0,
    0, 1, 0, 1, 0,
    0, 0, 0, 0, 0),
  5, 5, byrow = TRUE
)

lines <- isolines(x = 1:ncol(m)/6, y = nrow(m):1/6, z = m, levels = 0.5)
lines
#> $`0.5`
#> $`0.5`$x
#>  [1] 0.6666667 0.5833333 0.5000000 0.4166667 0.3333333 0.2500000 0.2500000
#>  [8] 0.2500000 0.3333333 0.5000000 0.6666667 0.7500000 0.6666667 0.6250000
#> [15] 0.6666667 0.7500000 0.6666667
#> 
#> $`0.5`$y
#>  [1] 0.2500000 0.3333333 0.3750000 0.3333333 0.2500000 0.3333333 0.5000000
#>  [8] 0.6666667 0.7500000 0.7916667 0.7500000 0.6666667 0.5833333 0.5000000
#> [15] 0.4166667 0.3333333 0.2500000
#> 
#> $`0.5`$id
#>  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
#> 
#> 
#> attr(,"class")
#> [1] "isolines" "iso"
grid.newpage()
grid.draw(polylineGrob(lines[[1]]$x, lines[[1]]$y, lines[[1]]$id))


bands <- isobands(x = 1:ncol(m)/6, y = nrow(m):1/6, z = m, levels_low = 0.5, levels_high = 1.5)
bands
#> $`0.5:1.5`
#> $`0.5:1.5`$x
#>  [1] 0.4166667 0.3333333 0.2500000 0.2500000 0.2500000 0.3333333 0.5000000
#>  [8] 0.6666667 0.7500000 0.6666667 0.6250000 0.6666667 0.7500000 0.6666667
#> [15] 0.5833333 0.5000000 0.5000000 0.5416667 0.5833333 0.5000000 0.4166667
#> [22] 0.4166667
#> 
#> $`0.5:1.5`$y
#>  [1] 0.3333333 0.2500000 0.3333333 0.5000000 0.6666667 0.7500000 0.7916667
#>  [8] 0.7500000 0.6666667 0.5833333 0.5000000 0.4166667 0.3333333 0.2500000
#> [15] 0.3333333 0.3750000 0.4583333 0.5000000 0.6666667 0.7083333 0.6666667
#> [22] 0.5000000
#> 
#> $`0.5:1.5`$id
#>  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2
#> 
#> 
#> attr(,"class")
#> [1] "isobands" "iso"
grid.newpage()
grid.draw(pathGrob(bands[[1]]$x, bands[[1]]$y, bands[[1]]$id, gp = gpar(fill = "cornsilk")))

A convenience function plot_iso() can be used to inspect a single isoband and corresponding isolines for an elevation matrix. This function is mostly meant for debugging and illustration purposes. It draws a grid of matrix points colored by whether each point is below, within, or above the isoband, as well as the isoband itself and the enclosing isolines.

plot_iso(m, 0.5, 1.5)

The isoband package handles NA values in the matrix by simply ignoring the respective grid points.

m <- matrix(
  c(NA, NA, NA, 0, 0, 0,
    NA, NA, NA, 1, 1, 0,
     0,  0,  1, 1, 1, 0,
     0,  1,  1, 0, 0, 0,
     0,  0,  0, 1, 0, 0,
     0,  0,  0, 0, 0, 0),
  6, 6, byrow = TRUE
)
plot_iso(m, 0.5, 1.5)

Isobands can contain holes, as shown above, and they can also consist of multiple disconnected pieces.

m <- matrix(
  c(0, 0, 1, 1,
    0, 1, 1, 1,
    1, 1, 0, 0,
    0, 0, 0.8, 0),
  4, 4, byrow = TRUE
)
plot_iso(m, 0.5, 1.5)

Performance

The code is written in C++ and performance is generally good. Isolining is about as fast as grDevices::contourLines(), isobanding is approximately 2.5 times slower.

# contouring with contourLines() from grDevices
fn_contourLines <- function() {
  grDevices::contourLines(1:ncol(volcano), 1:nrow(volcano), volcano, levels = 10*(10:18))
}

# contouring with isolines()
fn_isolines <- function() {
  isolines(1:ncol(volcano), 1:nrow(volcano), volcano, 10*(10:18))
}

# contouring with isobands()
fn_isobands <- function() {
  isobands(1:ncol(volcano), 1:nrow(volcano), volcano, 10*(9:17), 10*(10:18))
}

bench::mark(fn_contourLines(), fn_isolines(), fn_isobands(), check = FALSE)
#> # A tibble: 3 × 6
#>   expression             min   median `itr/sec` mem_alloc `gc/sec`
#>   <bch:expr>        <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl>
#> 1 fn_contourLines()  837.1µs 922.62µs    1076.      811KB     34.9
#> 2 fn_isolines()       3.83ms   3.86ms     258.      187KB      0  
#> 3 fn_isobands()      11.85ms  11.89ms      83.8     392KB      0
isoband/inst/extdata/0000755000176200001440000000000015114477620014307 5ustar liggesusersisoband/inst/extdata/ocean-cat.jpg0000644000176200001440000257600115114477620016656 0ustar liggesusersJFIFHHExifMM*JR(iZHH02100100ܠhttp://ns.adobe.com/xap/1.0/ Top-left 72 72 Inch Exif Version 2.1 FlashPix Version 1.0 sRGB 2988 3547 C  !"$"$C |*p0* J AX(E& $!Q$P`1 (t @1A:!`*`0%@1!R9X Y)X,C`: !BѲsQIʬRJHՄc § S%,lpTaS$`0  8TR+  rI*AeR5`#TA`0 `0 p脬(% Č-q9D5T!D:@r($'*I),h @! ]Us9X5 AH `5H "J#ӄRDd`0RVuTϞ@_^<^sנ;OKKc|;{!Q{p,I) )DTC+`@ąՈ+DpՐ\c c(!d`PJ `(:R5  ^e4G,FcW5ϚjDvϚKzb]NqDUi%Ϡ2Ӛe//);ˎsw#P9K"R!2(*p(,j!)cByRR!  JP#A@ Z"@8jX,r00yYrWO/nrzJ}ϟ;Ǵ >A5gЬ.E@kV~n }\zr |]>~uQUMr!W)X $h:PD(jJ9RIAJ`V1""d!pX Z pr @F! DJ pY0*D%yĎYÎzg_cgeUq}"xzt<;zR1YQ&G CjtIRql|Ϥ^~fQ@ URȐ $bۛdX,!ƃYZ©T6Bcc2RpK2Y Sfn)퓷ו!A咰C`LcJy} -@bW.\$"Ci2șTjoN4Uk(ynْ X@JVH!ӈY [,dk(-dE:HX  CVJ)`ru˪j蔻l]~`V"H1JThԝZk5cC5qҙ/Lsj\}_8}t0@I@2J%, `5] 8$dA D! cR* +: UsugR3D^N~#"0%(0!%#T)`01ECu9ѝש錚[z((^:[  1ȌdD5`"`Y-9X`àc$6 ԆJ$1XD圾j_k1&mRTe+Wx2  rL@1,J!FHJhM9>ܲiZF+&B>1zؚ 4( 0Y!Hc 5ĥD$5$L $S B!*#/O4Yi4O-ٵK%\u:Z` `52C` 0H5,YK'.SéήaiYI9K5W4Y CDd!cG1@Idƨ ȣPIX!8u,Q!Y&I"@H_;\(]$nY r\һ9]'?y}cSj jףl-&mcAS,'{3p[=n%T}3*/H-%Z5tUX;G>v?Ab`0`8 2cQQF0Y"Pkd1DɁ"Ș ϛrmdf&˿6%ǍP5raNnn_뇸k]2YlHnͬc{u6t=DwˊʬTKOIwZxɨXZ".ugǡ+]CC`H `80(N[ H @He"c%գP1+$N&D"D?2o./n\孹}5gKsugn[9'^)G2ĽٯO󮴾gYҹ#Vw:b#Nx]Yz4,ε+*=jgX5y{z_>?>!DC2PQB:gǽg @Hd -$Tա+$8ՠ(pIe@M\HtHDU9f1#Ƿ Ν拙s\uUͷ:ٍiδjړ_G/3۞k)NsلIؚ\k[B)B8,r(t5PRC `Ƣ4zy0 ƳS)$#Q'"DJ9f9e t ጐ$5f=ܬoΫ1B͌엣-βG;M8֩x^=^J==xGjU.f~~oyVD||{k,ok1Vo׊댖tsI˦/Zf\tcy7=[@@ 0 )R0 ADI@52@0 tCpceW dB}?l_}(T A`: CV1@G<!!8#J @5LrhSC+$1Y/_xg5 .q5<\[W7iL[rd^rfzs5}y~Uw_{{14ܷErҵIjZߝw9v4e~gMuw H!D(10"J!"" `1 (1 BY*$A$J1 1Hr! 9۳8C4>鳞5Ehκt^:眾ͬy9>zY#k۬Ǖ>z՛Yzk tһc}=aZ*kם`fZfu6kT/Ƴo7i4]]+yKefo͸Uk4l˧cnsg]dq  f"#4Db$N 1#LNY8TAdAԑW JJ aR+bF ,oxwӟy1=iԫY.zvktUˮqxymMZN=Υ_9ۗYU(K""Å^{gB\ޮm&{%7&uWߞkos/ǩ95Oh: .=!ܱ#A7}C7tfzDz𷏢"nbsm3-]=>]n\[DE$@D12B$j!! Ɂa0,.<¥+"U]"qdB$`LHBIp8)"t1C NY|:Xٍ]9ӫ][V6u_qqscKϫ/'xהuu3pk87)ezN{:|6_7a=fuo^/<'6Bf=Q5ε2l&|:n;>7_SQ"BZDDdDYa`T Q]6J=!SQ"AY2#I $XYĂ8C "r%N*-K%01_~ Xz5fs; wzx8wӮ;sչk<.sZqYsᘵzj'Cr5Y|me:s-AZcxCONq۫"EԢF@$B"D&@"$wYU[R2uIYg,Vm : enWY:i%P%$Jro-YpnNnM.5(霺N<\{^ZǬf2k*޶/j^tcX: gƼLN]oLe\-bJW5=n7Vrk67LQ5xoߏOyܗXHY9gJ,&BJD pcC+.,!ߋ"VXM`+X֌I F"rM!QV [ #Hi"JFDDd˧ƹ_/c՛徯-vɓJuLC>y]9vNKuavs.#wZrԙjfe9QԚً^%lƪY2c?R'YI:sYYU(2F:ZH҄2`@ŵ0"L 00+ ߌVHX":!"DFL *Qr*&"2c QQ"Y.+U2H"D(Q"+,t +XD*  XtK  2lMl"H,쐂() "=D bI P@ k1$KecVHb"EpPJ q!S$@yߔ5s{:.o\g׍hKiܹ5Y;,:dy~yOk{K{s٬ԶtsY=nzgX+cW+DJ=eW=hιzyܺ8GLx-ʊ((DF@ia%@["ӋKQ)-IMed߈D̉#RW)]YRC@ 8F80bQ#,-&oz|a/SJ.-UZXum,ͩxpnkIĮnSqObqiN;Xߡu)=>֧-k<^1Y:ՍytXU JG/8vyotzsвCUB%q}jC"!FHCkHTPI(A&YA{V@5TVPV@DdAn$H@MZ!) XJDunmDl%I"j2θ:xi妋9,]^-Wzβٷ7>:;|?yu&oD/`N&orފφdzswyb^ߞ^<LJOurw9dȞӗNUu2ũ;w|On~S/EΧ'ys[3=[puè^n4R4 P"X@ ZdG+a;d "6U KC@d<~Si|2j*)ZR5|isfҵq^Yˢj"%eŶYVĥ &DA+&Y,R'Vino dӍvWD9kW{^Z{'s711 gtzwNһ/sG7/۞e;y_:UƲK:/oq7u˦oEkYg2{+ͶZ.{,ߠw\$"BQ %S+đ+ZUъ'QBTHɒ"% BHud,,J VZb뎂NZlћZ,YXfzEuKJԐ$1DIYi\]<=p&_vS]~9<-O;ە"٭ּk3YtTՖN9u}i-HjxG.v-z3nme9r2)/V_/ێog|wfu8ˏCˮ?7,ױ翥\e$D" EH-%dUR.-FBUAEF|ڎn mzϞƬѝB˕e2Ժbꐳ/k\a*d2|Wsl)Td"i5vN TtK2%|1ך^w\Q]Ou?ǕdYkǯKfuH]/K)|:c^k`n4VRa3~|+7jyN:wsr:l%^VlL];SP>__syϬt7|=bNͳ˧כח{/IKITH Y$`~kͪ^7Ontgj\U}t<~۸:gӞ]bkI@z\﷍os_D(lQ0$ "FLQTfPϛ.lV"Hʤ%!P9P@=|.\ܕYenCYtۍznZ7Ϗ=n}:RtgPwYIKS/#y[wu)W=sf;qgW|YGwӟw.G\b2/[5tӛr]\Lc':_Dw|8ێv㱾~Y*e"+RUD*erϼ_^|.}2Kxu+wkLvwǝ岋.k$l5ݝ]1 sdI XLJ$Knm XˬP@XLdmArʞY4˥*QY%f fu$:iÑx_溼ݼG[MъCyD7z9|-Nխؼmjru};Ϯu$ǖ\fK9&y~Ou3XYydr姸}-թ:c-:^\w>,3jR21Y)gRͻ5gY6KL>=~'9|??uޘin=f}<_gq^R.{n{/yӗwgVb%hȴ#cA-jj1E$$+ B 1+"kƸ^~kr:L]G<[S{bvuYJ=s7<磕ԭh:\9^._O冲نİϧOFįz|7ӖDwn+k>K<噾]ٽ^VtjBYVQ:2%˝k^Xצ/wҗ^/o5Nus~yYeY :u3(\/wŵtZi%-R Hh4 H#*Չ'SIU%ɌU1`*rL9˗7\jKLL^\:a;sNuשï|ylzͦo-w>uq7L"DJ,eOYӗ+yޜYdZy׫箭ϕ*@Z}=ǟEtgǧ.nϘVїMz{zL2p=<륝9hM^՝uV{cU-O?ZE^jzͬۢՔgtπ˜B[x>_y#fΜ/ntDF.zUNOa|ce2^*]5E9Ḳ;fbB?>mŊWzPYMWf~,h`\[SrږҊ4heZ\"R:RkO(_.g>Mzgx|תX_;q~d#;I }{cm7Zsc]zg}>{VcyiM/O#߹6:yt\YlRN|;<4)eмm-ӟ&Ό緛ׇۣk,yLD JW:sQ:R9z;|3t|ՕfiVāx߬Lߢ-坿<|׵Ykn.EY-KIKM:κ$Xe\HQLt )*[VY( I`$#,9to6C~5薊~\af~/t\M1tm|xix039K%ۍzzGcjkN?yzgx?WCoK1휻{k k*縧yκxk":2jΌNm{Nף:btY f#uqӍQ~:36n}_;˶ltY Tk6i4=@5o?S50۝lq^U`Tk<ۜ?z尉)"DՒ'SDĖ$eC$`UQ` ؕ8EdI,#|ןN~vK+k͠'ۛYƱf_[sp^kO+;r<<Ks+s<:9Dzzk;s7ɼs{_1ƶ]9zcuXG+W>:?M"16Kʬa]ױ۝ѝZ]Ei"9lsϣpHj;NU@bTofQ%䰄W.\4k4:6VFĖM$@HD2HYA`0,Led! $ S UDFn{|=RF%zx'b藯][/p=q>u⾇ەE_/yxm\^Lrz~\0$ۍ.;<每&s矿箎N-c41~_N\^78s9-L2\IS]}="3oFPv`!tK|\eTD$nhiK \T{_E4NUbtXi]s]o.fRg7YN>=oیS-SfQR3X%gۊbWfI( U DT"ŒTFĊNY+L X_MϦVmu vYķb.k(i1KFUɭغ}^ޙռ,R))*jYfl$!*c-Y_7n=gxjt1{ux18kAy﯋^؎-eo/Zo~=:Fmx7γ}ze'gαtś ͚s邺ݼs{pr[\fMg8uM󱮖ui$+2|]5Nu8ogrvsYMEV[ēkLYΜ%ȜzF'Y]ku+DYN 6 cS/_xs5ԫTjg^P˄"&REI HX @$$L`J3x~^ܮ=y>9tFڝN{\wkY˼gh%oC[R{C-&Ϯ+\tŝV6gb8;sk9<X z|}\[eИu4Ѯ霺+<7Kћqtiƺ7^nY5lC7F#xǼNxu{\VWOa÷3y'c|=-Vb5tN#QH.T"LV@e[}gǏ+5#{bF2Q]RZҖ0h4-B-"gumE-$H%i*HF .$Hb RBhie;as}<ϳ.4 7c^׹W1sjE(KэPݹӅܯxqzs3ЖQ{ w[~ w0fE-vve:7G.|թڢ&~)|[n[⯁Z9tkg~q=ze:[˥.=9Tz==Sy\sϹ˯{7(Y}jscKj&TAN#TIME53Yj9|e"LVdˬ̷PEDL6gQ4lt%i/dLf~5X2%bWd5p\rbP.ΑZTF2qb-GUB4.өR1lsH/zܤq[qmy99Қzvɝs]1`隍6zs= cBэ9rFm<|gY|~V_)_z< ,kϯCͬa3߅Ij</_Eiq뫏^}s۬ǯ}ԥ)"N 3V{JlJ7WhWHb*LZ\\ūYY,LEūV_j5QynRĬ|YdLV=C5MImX%lY=+VDJ&WK4gS缼:,s).-fr78]q6Y7Fu^o=* {(K]t8neoju#E_oӲ~W:q]3YxofwY8uΛ:g7ϵ5gWg\==DNw9GY ([\_.uQ #,àFDJLD,egBgd,*QeC,,TD ќqzVH^ͪWEZT@ / Ld9 aYX!m۠icY}j&u=*.3uŇj=^oL\_?ٕĚ]ۖ1s;XYϫPYIӟgLg^oo:YOOZXٖ͎}ܝ#jeT-*_-U屚نˍr$L^lJJ"K\#V Ze+=KZBEV,!SkdZʬYhe¤-+BY-KٖgI!˧ߐf: eflڷ[a@. ~t~ok7&Ҩ}H:Bs-^wpzzߝz]y[jDg#\in˩ח5dG^+:fnμy^g*MAkSV&J,:e%Ktl.*9Q1GF*)ȵsYΗ ,Z(iIӕ=˅rfWЮ C ]"2kJ0/ʹMYjf+-y~-ζuyZ:ZnvsYqB^7I8~?'ڗ)%-J=F]4֜o~5x˜nuUQ;cN{1,LY|>]!fGMәfj\c|t:ϼgtcgY1yoLD,LrekU%6f˓QY,]LٕIhź4KjLf*bQՉm] AkYij\RDBđZ$iR"k[b#db$h' k3Y9tKιVDt7-,˯ͮ7ƻsWy_o~8%SJ'/ι9+RZ]{ʝ˵]d{OPLU̕}zTf^o.~wN]`R{:oMp[1aw;f}Lw"r씷KD&Zs&,f, `A*!H,@$j(bKVXS ui(DN+YJlr̲VibZZ&H$)T\ι>OF|iu1f6UQ.4ʫdQX /#ugk: 2KҵߛF+NluKcutk6и-zikPXKMd:70QeeuB| J5YE.e]9p^^V]u^|}yG%DqUUXȲ.BrFs"Xj,Y2kaˤ+ 6PSA2E r"ULq:QK,HItDD*Q ȉcˋ^w-y^qo=hͪ.Z v;sfv<~e5YY"4K:g[nkԻN.:Ӭg\֨ x tꤨc%uԢZFpz;t9t9uQp/r^RzG;st7НREEFfZrS̤SWHU_AU[Ndt{w7}+:c=8QUV]2 @AĚ8 VFk4V5KikD2%NŵY]4D6iȅ1Ȫq%[lήUZYDؖQ $L8EbDV|sK$a:ζbݛKs{ܵ/7l۝zN:e3ە`8[:agZǧiq3fYƸ9:[؛*Ssuz.^#ט_7Lkan޻.ǯR"A+"5"H*%E$R)5#%e[2Tc@:TN 2&b*%G:*˛Dh[e,Y*C&""HQJ%<˓7TG*4n\V v[Z1y9}sN^z;3{ zXùǯcfy]ͧ/0k;8Wr43צΩFwAh WYUlg-ķ6KgSz>~=w:͖ȡ |B ReJPȮQ,QYjR(4-l%r] 21:b+˵kZh͑bgBhjȮ%" %v2D ldl@ӛ:ry?hs%9ZsqK6[^n>cXپ\\^-iyzIqk>X>3=<^y:gn_)x,Y\t#%I=67δjЮuiAQr'9eYBUz7^ϣ5R53$nlEMdVT"Q2! =L@RuVN6%yYT%clݕP,%@$dҷ.- U%uɒvJE3Vmfն,!P.\M\8|ן>^u?y7c]n{ݍWZW~#έؽܢk9bm[筺+u);N_^^kåMǙktcp\F^VoYxYg]mR_Y"%#篓%ypMtYǷϯO7Cu5u+ˣ7T D ]Tb .k(ٔKjeCtˊZɮlk4jz=gF4d[޳H=i3Dֈp1jdlԕk2۝X2d Y0Jx<:\v[wKяxZk*aXB>NNDҝ :9՛1rtxmf]p鋯:9{t15ۗVκbUƩ :iYX㞼^gL;s:]RkV~wM3-ּ.9.{g^g/0owq$=}=w-Q1袽gZeB{{N^5nzLu=7߆Ѷ=k|a3Vl2dl"rDC":dIDJ,BʹđUAE*E;R)lL[N f[Zk],,Y霉]@.-ʺYIJDVno?^-89B4RǝWU.f w<`^F]\9Ys]f?}?Y|tƬ˭QEf؍s,gQ:^U5eZVuשˮg۞gQgˡ.+=/kXK9YgϷk\}?zwϟ^虳uzx=~mnLJ tKl%Q UU#Ɏ:dUJ"HY?>}[db*db[:wM- jzk+"Vˑ3*'f6٦5KjQ T1ws̻m0bWKSfY׳0k:u8+LѬgOKtK9Ϛ=W.\͖N&yμ=ۏ9לvN!Ssys:發7ٶ^^WNΎn wgXRu]Lu2r뿯c}.`ϠƧcT˟.o7C.(KqWB*H1+"Z^E`*IleefP!_O +.iTER]a`&MƢd Ȥj1ZE&li6B9mͫUǥ͛-R^foX٢jgIn9&mLy)}])Zwtvvyuwr:cfwƘvyvasn}MtsvżdϼhDS`Dݎq9Ӛۮyyǩ;Nt瞻*}jb%)FmDD&NRfYIY]1$*Ș4ȑ,&kXUy 3TKf %V,&iiJKtC"D^g7r|S6(Ιμc6X81Sm3qo58zaY[36=cwU_[Ժ͝yG yr~l록rs󽸋n;~<?I_NuكXVdI.oϭ]N7/LK旕mycymI]2.X ))\[3㧝_st3UBC$_)UI#LL DVM*QY.|L2de:fJ,h7= w˧:Y+J"e1n񭹸cZ/Xx| [ e?Lém>]*ß<QsdQ²r'NvfҦ<]eYu:>n^]N/Lwϯ˧J\p:x=;2E^j%ՍBoN76Q^ǵl^=N"w$zc۟qũMI7ɘK|Ufii1gY-m)B6/VzȒ-"bӗsDX諌f3 Ω^!ʌQ.gIj kYBWd}jMꚲX$ 3S[эlSlF)iNB-9αW?xsǥwLF相&t竍rIӛӞMg=oM6gMi99qx=d%={ts8vam(7՝)NYٍ%ϧOI\XrzsVjssg~|ߗ./^yALVYWJV7ssDeQ5βHJY=4h.mNM:ε:.K9f;.[ͬ|uT"DFkMC))Zeɤ+3҈ٮ^=mD J8ߏ z>{kƺ#=0w^KYb{s-s[5F'<4gVܬWE4gTjs,r祝s.n]1::O zO?~.gLjι=9˼u#^zVӬu6s$ϾpY.]rxf_Q{swg}t^uߖ=g`Tff:u3vK+"Ve0ZfZ]{_v25"6"%&;0Y!Sm+Bgԙ|Ƴ:{- u-qz2#-U2л"&J&k5ˢjPP%d|;y].ZYdZY{3Kʹ3V cvtߎ=eY:,ߍ8ݝrzn}N75,#מr龍W=n=W+9g..~,mΥ+qԽ>[ן۳kbso]εb2OGptw^Ky"CZ- .X !DX,ƹ=7]15D3 lg[ zv(uЎSM(&%eƥқ t3SPLV#\ԣ-긥sKvnj]9FtDnjg#Ӟ]HXE_w|o fk<)$D[Y6/ȑd QQ]^e KMrۛ[Vhk5Wɮ6هRvd>&0K]8Mm۝FZ\ιY6,e5̗U+6Зf5{^Q68S68t.nԌ~]v׳'\u:g:g۝vAtfα8zs˩U/nw[eǬߝmƴfƫ 9wVvg]{ۍg.9קּ&qz׎-g^tzF%Ϧ8/?n7&Qr ^wbts9mg>"JK3YrYbgZ2T.$N[13u*HKzVeSSFr8rW޾u55׻K2)%+,˯:ZlqcsrK`Zk-4Kǭ|zc[YXu'LNeƬ9z=3(%HsY.-gˣ2Sd;\exsco:|.+y5YnεKYޜ5"룝 ՝_JNu~oKso:o^uo52EuRN[ *KtDN!BZ-01\i.Q9V̺> jk;?jȘ=r{r4(Qd&*sxͲ\:& .ӣq:cWqc5td+Q$Wf}M(jF[,6gM3ZԢ}.ԣSw}^X5LYrJ&2R`"$K JS=PRITl"E$UQ!YlYGj3qﳗVe*RK NV2$+25ҹpIItFh5WK֎](c3sgY#\=<Ӳ.vY3;nXLi1u>|:[Ke՛lk6VGSsY~g[W/9=9՛j4Ks=̥Ek eQ6hͬݝ[.s7Λ:t֫9K:sW2J2Ӫ緧2ʺP))]"@ fYc~nVca I;9ǗxTϷpf[^$%iqgAzÖg>VȉYUk$V$iY-y']w^;ڰyMc罚ϘӇ/r]i^I95&Ro{=Kf\O1茶fS;=]/.fsso1X&GNxmιy.Mr٧7&Y*n7؎:FMR:)׹ϦMgz.=/˹w.vn/Ͻ^}mYf7˷6ҊfHwJĭ(eTD Jj՛t˥|zb1#hM\>{թsֳ\E&x)1Fvw8ݹy "u~nMKLds|֓lΩCǧ<^zͩ9js8c5)teh2\Ѥ!kGsΝKz8 .׋jzkL/WDLdL to={yG.%ͩ3XY[u$l,"f;ݙ>9lA8=kӝzNzzϘ΄sSOG}]jWrJ@"B$HC8bcsӁN.$ꘗZyҳTVd^]`ʈ Zh]2'-5BUR.25RHB[M9J MdL͗.]#/B]5XksҪig9u<׍l&:˥cګ.O (Uٳ>fv[nUYg,,ˮ6QlnY܁]3Zbm˵[^wNWѧO.Ngn>=SY& =gB'.j{N;1fһ$DH*P$1F,%A\:Db"Zքo>_rsւޙs%,j&jfTtKlJ;*M V6eF+9JkYu]vSf\纱o"6vy9=sS5њ3UdlMI;%I5]lk=o.kځק˭M0k;*1et{qu}B:xկ_tj(t"zZ~=7gg^LVkƎP+D$bC'NQ`!  ˨GRϤ+z8A Bf(%Y6RU .bB*t]+g\]1\9zh4$qa|/y58=9]ybzQl߄aˇY5"F)Ul̀rZ]Rθy_uW__SY1k5Yfƥ.sy9dsyKڽc|7ӟznx׻K6sOaӜdGR@,@YDH1SSDE@"+$#[FMcJN<߳JeEgYI($tYi4-@I۝X8Er'==o\n#_xs3YMyEގ};ݛ::ɼz,H7䮹zkz|طz4ڷKr̶@r91Jfߵz,y1錚:,۝ש|Վ7ϟן+3gvy5^8湛Ƃf{|_ g5k7Yӫq5Ͷ"DE@"%Ed:!-@TH`1&YkI:"GZֲ1 JX2 I!s2a\%qt )Q:oG;o׏ǵq1<o?5Ό_Aͩyצn/'O;qUfUҭٱ-kMvon7my䶦-=?ǯV<^x?N|ؔ.ճэَޏ/*~_WO^^|NNe. z+YB\͹eq2$i" Q"Jd*ViR@dIPWA8,$[O<]WB-eeIEtQ-vnC+,4J2WfКۛ\\szsY ݳg^Q{۳=y*1HͦͳU7rl&q{ףjT.Z/Ws޼kۜLG_Otp]G#9>^MR:|vyuũyr.x]M3=wNys(%Vzn})٫:Ӟ]q:)?atnYq8jB) LlZVZI1%PcUU 'J$F-42D Fl5沋"eD[Fb|n7^?ovtsߍceg7sVnzRQ[\qϹG7z88Ҵݔi/Σ]=:pt ǯWn-ƺq;ukӞmg~5ܨgoN.yz{z/7:x=_Ny[ŦƴeY^vIKHJ^:oחv숋IRLD .YCg- HB$Hb!Rp}~]痑f%[WK9edDՒ,-)/ͲWdvu6b"IRcyiY67^WLr땝q:g~ǵ9pJ-'v~mιTY"ǯ_Lϝ>ޝo<;'*uDi;˯C:tϰvٍdyoW |QMa%uN7͜j :=lf1$%T1Ee1DT҅WDeU*UQ˥ dǐyuMLB a`Y̖Df.Z\㚖y: -Ӓ$k).飞5G?.3?_{\zwyjpMOK4T=}Nϓxjg%΅3UW-`L}.{p錺I5ךuCL1|޼ކ7:w{yuLYlnV۟+{rj֍gMB瑬_>/<ݍ=&{wzrѨb[H+$DH \1"*` !+Ĉe <όԛB'-9w7ձ"k]!UF]MF9cWCY% D@CN5і|7Ws# 4s6[SX:KY^k[\>vUyytZnBJtڸrlXPrk4 Hٓy:ٛRLJjrtKn|n<-}51o+. {9tjrqvzk>.NsԸcB2% i,CY"pBQh,N++ȗ/yY[ؗ-M+%U3\[eD%-^u67NoA5םޓ1ͼƃ˦껚z8ڜ;\;͕szc׊zČHdTGGOYJXVtɼpt6gTf=LkЎƳ{}7=3I{K#׎ JRٛt]['J:}3ǧӝNWlLCJȕL%Q4@"40)@pP(MR@H@>H%}zIlclL-L\mJj,S\N-+M%ݛ7E9kAef6zqqIoNub}VsszFk]9ĎwLc*d"R/?~fszNwNn]Zhlٍ9t( ԈfŁ߅ڗI_Lq鉙ӏѬٚM]\K%EmNLz.;CKI*doK@H @pauRFߛ8a4ʉYؖV-#ԝԲd FdU`ƩoΪ`jƽ=xuÍkr׎bΞtF79tƭcۏU8vb7srͬd .sïd9}17} lͮInu1pۋ:;~vRN~wm6fQsK)]\]O:^m7=(t_*Y%cLĪ[:TNU$DEibHDj̊d|yM5,~9˔ki87um:uƕqaїg^ǏKyk?[ԕaN9zcWgs2j+%s?5ߗO_Q+0Ɖ4c|lfmI÷z:j)L͓Y6y]^ι0$MZ최zyOnj.}e\3gۍ)eJgFˣo,$H@"(-ifuX%Io ALĒeՈ` &1j=q;,[uo:VLkWfTFX, JttNYF%ːFbAd:]gy듹e8҉}M[Z[sߝYusޜn}:iv6k;soWXѼ*Q925,"&%ĈNN垦R=v.⺙Xˈ(JkLHtțlYaYn^Μ{3MkR1+%blGr\SgkU9ldt%]-krŧL\c\c^k;|dy=N=zwy*7;PH[_WԬ2 й5,k&=18csg=/Yrw>16Nqu|4Z}qn5BG>rռ׬ݛ -g&{XYdDic Tb5(HTWo>WS=w=z]r5n{7(HDA3Ӗ) DuH%5MOEE|Y׍WC-AWFnf"q!B4jwe252B羦-\V.,oTgzY32t{sr[jf-r[Ws7Dw?V9Nn:z8y:7;/=㷋nBӬ|>ԷcwRƵcR͍8[UsJuMlY׬usoz@Yum@ZH"f&fj; 1=_az,[IilZyO=іDeVc6K$ Dper*z9nK4 c+/K׏Ao<DJ]٨-PnK'gyǠxbtϋE?՟Any.dW]}B劲k8u3]ws)μϫϋ9vtt/^5MbK4{_N~kõ˵)eΞ=cYgϳǧOOX^^yzc|umfiWP,ͯRmōMȚl+:G|tk*N~WEEeEUIBigso>W};}6uae.EId_oSfMNV."LJ\el|og Xgj6:5DcUcU{(?s[KnFM<nsgVfzo=֌k2=S\mMxO?1۟sg.oTlΰu:Z9:u"U(_G;:fzN۟p^OO'RU]Xt\yu.zfVsj7N>Γ"ٔiFul\̿6%ue^vo GNwk6٪miEeF2Iegcy˞>4U aXȖKӐ e5yJ5/m5h zOg]i~y5Y^7)|6`(ts-z㞺+N^vcۊkM):3s~}[r8/':'ߖxb,1o6YCBԈ2}&;xqsVdGS5s7.0Vnr.^;$o!|,LURX3w|]cezΉ:cDD׋߼یW=M㡬dFg*)9W|SqcR[$Jl]2NJɌU"r i|^sj}ՄQe2׬B4i5kscsuμ{jg|֥Vv3në-;٭2ѬНcz.~_>{yKԽ;qn ^{]>](r.[ǖHt/usO7[-<|,u-N/^x"j-w:|Z$ZUkcrڍǽösߝ:cnOvx\y>>vBwPI]gw=$s5SVz:Ž9Iq챮2.1D,`E&E|lHUV$s,ka%ג~g^]ilfO: Ke3[˦d6mY^/ί\r7qێ*#\u׍qpfN^=-sdtQӟ9V!(PU'#Z;}?=w$//W=QKNOLzsoyW/n/r.zNI.jf_Qkֹkx'ӹ:>Ws5;yPK$"aɩzQTX2K(vƧI+ADjg;tN F^oNλbdM'|1|/\bʤ7g^SrY [o<nt 록wzӿ<=<9umk]\mFyzcS[_LFQRP$i.ޗoY&f:;>̳Ui=<:uqӟ1vVS=1g_Au^;<:YڸY\^}.fi̕t^ëKR"IyϒYؾۖ4bk: F*@@1gΌUKHb*FIaeulyjdw1Y)}.5_5ⳙ"c/;N5䷞6,5GS%3zar#<\P3\zlk|yהqҾ7_'-(6'8uy`Np @ b I-1vt\upL:c>t12JJZ:ξu=7quEWjN]nmvW֒U^f5_\ncg~8,g:1uu<榈j%L$@"!D!b 8 `$2%Mn͵oNm~usdhƦ#x( ]9#]Y|y]FC75\_75ǥF9YeI^>)?myoZϹt\9]x5u *D0$(\H^>)gz\qSn|.te kКם[H'X n{ Qjzc'EϹϦ;]rܲEq-9f{xuq{Wy+7h$%IS #NTI  c1{ř7Yi - 6ڨq.9}3f vP30-voMegԧR=j{ &QR"$C+rps6k<^>}":yxsk<{C=ǯ6ntxwёhsԓN7ɬFw&j=utcݹN٦O_^fgy}qn*:סYkrEa"j "$BB)r'R uGfP K-vr%DdZ#IJgLCy52aĪXao}.=cs9nkYV1,(4X!j"HK)Q::ϧcëolyOWV5D,gSZsy]xG֜N:z:m&7מU,:Μo\V=c~?댕oץ.IfRF=<~:g 4Kחfź#RZbjJiK|Di$uE~8dʪq #U b dM22d̤%|W.*PYMc7LѼөMd+8U!DDkj҇Q ]g]z~^o&>y/g]vJXUO-aFo_z[3F\ˮvxMMUwivw˧F٪1Ax"!ssWr {k. bUe6 ' %f(Z8)BbH#jEQ>)0H*Q2P$Q iiQ"dHe4c~?>1<ϋϡd:#ei^F *I* "Bتqƻ<:9gםh׍lƧ.mFkvP]\x]({QnZ2XTnffly?u篟Nvͽywf;,JKJ-idAQY@)>/y˩(׹ޗ-I.rN e ,aZ`@@j@IztNNw\\zmgsle3#YճٮVu¡-=^5tVVu"td,Z(銊7TRKU qpN#R)*r%N9cb+bh6QP@`Hl9e/oy==]vk*[J53nmj=Lݸr\8^>=l٬hܚgIV@$IK|LE&Gz]IueűRښXXXP^AHbF$SW F=o[+K,3b,Su#-Iuikj;6ڞuor뫝QVҤdZË˝fΉ.[[-}L.Ey"]Fȓk9bIv6,C2%zNTX@:r7^ϟ[qձiGJ }q~5lܽ#epۏ:~7-ѹ\dռ˫vj"V"DY rYTAg+>SShqUi:{6M//!gDP[""U ᘦ3FdKlWd- Q˲$-gUﳍv1%(l,[Ee5&n|4,k6YVW]k2j PR#A!Ȓ',P$iS5jV]<<ϟEUUٟp.εr;%zf}~lOOKm1)Qrә+7E9FMWeDBX,+%YK"GID 7َbZXYitY^f DTBޟ9Vɡk%/:ZeW-l4f:Խ>zۍv%\TBKbIs9ku^u\jPqofklkHP%c' RY-ZfBHTӋeadR6JV:&`ixB(狯8j_~ޟ?:>o@nw"Zι:q\.:i"T_ IbWeKjy7tHH΍f.'ƅȓX .* gԍ<ϣV[c5rrM@Eƹl4CκOgZ aAB*aqUfӎ,=VKEz5^9k Fء &2"$@IgXrU %,6Nxudq{fi3tĨM86: ɾsKsQQ]KזV]c..Ib, LD"!S<~0UR.+7us78(aHa3%j\562͌)qcYiF[3]T+>U-z[("NX)X,lZ*: jTY4Fk6ׯ{.}F]r[-vYgN (뚺ۏ,[u}ΡeыOI^N%|]9twWLkvXA%tUYFYKRe" " ˳asyzbYfȧR^Ľ85,K*i|]L ҺiXꚂq**5賯A}<娬Y 罹'XRN(Pf]UL2ͮ\ޙ:̝3'+ZD-71SR!`IbP' )ccގ.=k9+k;D 7Ua*X 咫2bғ1MWe!-x0{5FiFؙY&:-$K'b:פz:|zbz18"Kn-ذҽIΒFGY^o]7St9m,z;qc[yϩ}..,^uDysy7l"tFJ}Bku땩9$B$!U*aUvfD:KB R\P!+I-e%, Yr8VptTCygDV E%5)fWWePAV@MJ RȦķd4d U)qΔ*rY+xSLf%mz͙NkgQݍvu:stüe o-S1fmԯyͮ|W/î};^?OKZ5:<~ZYo"9N}IV^T7pq=6g[35/ TyWϷ== fge\DR]*XVMcfY3Ej%eȦSEFȕֈ9t9=ytu˦UO,XDRrIE#HF+-.UЕiQ*'-TcYe\Fw3V=eS׍a&o5YjKKѓyKyržc?L蚯W?n^{F=_7w*01Im!K:]: %ϹRzg}<ގ7=5yˬf yqtMY٬uzUf[3RJƗUBvEb k- aIMi  uWDYSʏG;ILc""p+,Ȍ]icKK\EY-)Qipy ם`>.+X5#+(Jyz>5(c>qk?ruk4,&d៦fJ=^lӻz/]VS+y[{V"(Y=,3vJ[Ȥ qԖ2%T BYSQG-2ۛVmTr:kuYYMaCS>g]863̽y}6rԥ17h͜M-߇z;y?/Q6WY:Ie*Y[L}z4F.m4fߛN:ds;,Jvy^ٍhƵdԤjuw&nn+"=\R#(ʉ "HĔYtBQ&VYRo:=>]W$!"H L@Ԋ[զ2-6 RJi%DESlKa&fq͌ML]O?N.ܳ/3heM lQUiRV*s۟ߎn~6.^Yzogw|mLdi$ G;|KUؙ͘Gy32Ԇ^Ku:ۍΥ.}HOZZk]l/0YkUD,qCRY"-+"" Q 3D-fOW̵"$.Q#"EO/XdK 4H,XI+8ҵM.Bƹxé?LK5rY5[%qrש.N{|_Wߍٽ'u<-+<ܴf7(Y#u]:9t\f7ϧǦ]-=1e*FJj_bq_D$B"H|L 8dWr5M\@d%,lU-kDB\6]t7krטٹo=ѩVJ:~5k8{dZN7{9tpuRw-Y*#NY.]>욞jV6O-Xcabo~Yw,nn]'k1j,ϸY~XYuQΜqoFu~wZ#ӷ~hu|Dd,jZQQdBȨTHRcB"Gn:~Yo$h"Q#b +D!G?Q*,*L@BFUQhB"N2]kZsiӥs͖n~{~o=0Mal͂ S^uS8Ny{ܪp׷yy:obK4+&Xѝj筼sWE:Ys[ sMscJqd;q;WV+5r}jηs[rjoNM( L)i C UEή DX@AP! BA_BX,la,TX*j$rh&"PTJѩkbt%`7|k -Qr֬jfO::g=5K|r鷇oC^`LFmIJdIVŷ˓iv5\RgybgW>>VMQRL[w<~TK:םXN53ʲDu2@$*4v䳧5T $ @U/~DXE6k\$+r&B*!UIs٩:tBW(cβsgY1c;+ɷxR۳zL}~l=9:Y_YǯKӳ=sG0ͩvYzgg??Y\|an}s8ۛTU:\:mŖdVKRr{f:fM~u-'W+ԺU:YrVEsiu)]yЕE;Q-gL0 @bInMDRȉVDR6"$!$j)>sQV"Isͭ) ѩg}-2k方x񪱬l6yԓ^|gsC5G˯׿\{j+=SAio>0ًEՋEʬrU댽1q;&N24N;e)jO6j6XIu"gB[:׬#iU˯=~0Y%bl*sHBdeu]9xR2!QY)bF# DQ N)ZWj&\JlM,#Y%5uaIq \bugYq:H$V.0upӱ朾N]z'59֨6y%K5j#=ߋ*RfL1s}vp鷞¹s%Dus]N,BS&k f6iN鞍mBg,+9~n3bD/o:efFIEZ=~Ma++F 1I !b!Q Ȥil/E]VdҚe"J%fܛaQDLB9L#DKiβM{mH "BDB,T qZH5Db"g%k۞ՌZ"Q֓iHֲ1\q3X]r:sɼƺG.z^~cZr`Νg~k.rfnͲksߞw-N5r֌0ǦƮSO=ksg^-q6rypoN-ɪӍ8rYo"%}Wcz>=n鹦E0K*t:ƞ}-Φ6SZ6.ƬY@*מzY%rUzٝ|=iI%^[ͼrݖ[-93eFʵ/̳t,:24Y$:vdcc0tOFh edR$lXX"!Ab%,PDCH\:O).uEIͫI$-U9ן9j7c^_Avˠ^bX@W+U) 9:7<[b[-w:jx[tɏ'/G9<9zcNYsӱWcp\K~nQtk3͞.zyk}37OF ,*s!\F3j_fCb덼iYū!cDyO/I.ծcĒ";Gf" HdRBP DJ#"0@0$!H2V}ߣ-+ZKVĊRg'K8]1c=sߪ i[ LԶb9k1\22Zɧ.tъr]tΧڱu}O#k_Z\NuA+˯kL-gy_2ϩ^nM76uܴhj˹5t¨k4鿞k5ٚRN7lt"[͂DcxeDHJ("$P"(V Pt:HDL-`'>+Z+gk:<ћI$MfT:]59[Qͅn69jHήzR-Ϊ*,vg|˧oνN} v7co3$O=׬/Ι9hԻ)*-KYü:We:[j]z KeM)=w jInu=N(%T@ 华 *Hؒ$@ D PS#B1AIE#s#s$7VNj"WXsgw6_.nr*.ֶ72P坔gWqIK.܀D6KۢAqͲ:Ti_->߂D^7ԚRsړx5?~?K_}?K_P>zk}c7i]jyC6tIP}-u qHzޣ/9WW302zVmy_pOZC\+蹝Sgfά]+/T9]S??k}z#__?:n/IC/⪎?O>y6v9^[V3N:v?Hiu;:/Sd^c-:F-_b}~6ߌ/l]t~r~η;.?Tꙛg-oLŷ>21bbTP#tÝC"zcu^[>'L9]>tLW~& _ڬ [s'RHs~WWꯜzi"lPoM_-\/>B"OQ5A<;z%8Է}"3짥7q3uf6%w־HًrNC'OcX p3lȣ_>X'Lzu *0~8z~z_~."Y?OAo/H:~=YΕgޙzN%w~%Ϋ:; ?aU u/L{J_Oz O _;zxuONӽnOD>:zu,<.jfcu~_RSWV/dVW:KFunVvw]郪cnBtq2NC[q1Bzgg :3Su]>:_s_S`toi:oJ}Gނ(u_Tn}BON3{,ЯӟQ??D#'x]\7b`k}>Px菣P!Kӯ?>Gjk-=uCS5?_#?P?GC55Gӯ~z_Sצu5IAk:Ǧ~y-MMMMzk?uת}d~B?}7ӏ_GkM}Ezw|z_??S_>f[^ >}|z&75Z,~zǯaA_H<}DM~G_P1.OkGp}>x5#!zL= }:5}PE$ׯ3mAנSZ]}>!?קEѿ5_FMM O(ֿۏ#)9NS9NSsbosssssss~)w'9ܜ9noXIh3_o 'pNsBrܬ"{=ȃ%b'vwDNsss疜NÐ!CL3N[~wwCt"zwv wD7o;wL3` wgvw` aϖ`rzmIjFw_=у2{ْ̩3`; pg$ʲ91r" N)reZ#&;FnnyOg5o Gnr? ٛ3%X o󿙸:XTW+"۝ÏSstŴż1r`ɞ{ ȋN~h^5Cx%f5AvW_vZevnT#`z:@,@_%XLlq]wȐ|OO@E?7;&nn7x]ۋd 779Ns%ZL{,û N<]s V7-oaF[`@79Np;;ӻ;!~1R[uŀ[Z{`@f*n8f߮nnlspU$EK縇"{rLlƌw/P2;˓cRϖ8 bnZ;mҲGGŰ-~xCt6d,g)SErY۬N'ė?"lG:ɝ '77776`3sfnoשRu^(x{*[9.0~C-S>!DZ._xlN6ƶ5?#~$E2,ՇP&Զjх!v.<ҡ=wzo"jxO2e6~ eȵ!{՟\.+%?jdv?W_9P< -iHz2jE UmaA4cSw:w b9໛}77􉹿סz,^IJ(ȱJݝq`ziGn~,&ryU6D9NvYTQcc=J!^~}_l %3rn`JRz)n=3Ȫ+K.[+Ԁ$Si}Agq']p9 \z}N@'B AiMʻIy5jqv%zUWd# RtX!ti&jnUSNZ3 c+Pdpldqk)ltLjl/(RWZdd<6e@R1~-msYUFcM M>?V 5Pm`mEr!&tR(jm)Bۏĺ<ϳ]vT%kߛ?P2\- Mn{{ԁ*fT\⬁mX6V s'X+/U }ٴ+ɹޱ򾬁m185/:Kw2ղUr6b>ϔyj `]Vql aF(3,cb=}~ow>!\Tubn&lN6lN_՘{V|hes#uɢ}]m?:r/IMg:,EL7j[F?S_S-**f!+Qbtr[YK5k6IǦ֡6*ƪ+^Xsv'fa,6ǐpj{U4ZY8 ?珣ǩǮ7}ۺhe(cx!-uFT:ş[1T+V7Uȫ kjT%fgdYwO͌7;L>"3Mv/Ŕ]oe`膬5cX+{v-qgQ6w5S)9l&@Z-YUy(֡U0N9SԏNF@q#^xHܗ5<6~bwe]"k2ՋM2̤6v2(Lҿ]+".?ZR2#u-[xDi%vS(:Ȼ>K7;X);2[ɱe ]M}`nMASǶMʲCVV%W(1_!ӚeV>xS^^޸d>X MSnE{܊ke9 f&3(Zĭ;F nKǷY&2Crz~J1 wdJfV5gWZv[}Y]fUY9bg;ZQӍխ kݬ:۩VFKz|8e{G} 8"nbXMACߦܡ<~6.heB~K{{!UĮRdwlx,"lcvwK@sE|l}C.kkU"Oi}m]70cb7g&;'csZFḤ;'G.iǭtMetu*XLkDư,W,N5®CV)iUTQ{-_>23o,,7nXB}bѮX#v~/N]_,uγ<,LltzDzOC|yFEE;aⰱS'x= {wt12)r-\ìRGQjN}`ۑ\|+>f1㉍VWLȸ/bj0Vȼ@Se,,} 2˪Q-7#T#n7f<1ez0r1"u#=z])dzZ7*bݗruSEwOoMYӪ wIf^x U2򻓑xR6m2XaeWTϯ澦Id/muꝱsݿ~x ܫg޼u&Frpzٗs9,Uz[\;f.U ~=]1ݪ60lȠbu)'Rc]#K9NS9NS9S9s;;w  '9'rs;;wgtN;;;ܝ܂ߦ7noѹMf7777*WB zn-GiAaJdc8J)<խfZ^}ʛ7*ksg')c9bs_w&˩T:wQpź+n-]ޥxy ]]@=jRƺ)U. `ռb촂41YNB*ُ]k5JxSq2KTMXr*,g79M͙6f3ssssFٞfߦ)777777773779M͟P&k:&۩j-dY6_.>:Nzu͔=tzNS[de,ZlE]Tv*QgZN4zƬDש p"D+4}x0838M}q&juw鹹9GXWqU‡+VENm8wjܤvʲ8\'UYJcy׮kSS8N0}Fh&2 P,קGq!I@<3gsp]zk&54f^7\V:6?zQې~cMQTZqy3Lz}mF"_yf^f*W=PcQ6yVƫu"ֿtp;dguVȣ*{*͕YruUKL |K/~K("}c VޒZ{mNM ~5ﭭFMɣ,Zj@l6r3CClq_K踧xSSSSSS_NF WC77k}=jjk5 zMMMM}3D%g"r񱏚jg[* ъzj*˱r36;fKrW†ZTMy)ZLwj fuS>kS[ֽTq+=Z_cvpsOnyxMbt]Oz6)n4fEX2CuƢ>Ša(6 :pW{n/MKuٗ!ϧQF9sQ]LSS^w7'͙RfMzjqס55&׮uqgo ,9# [^>]Zqu46+r3cB8OQLV3}5/62j!y`۝6=ø=k̋3;snT2?.]&zfZL)ʸ:)=QҮ=hI\45=".=3bf27hbnk^d]8Uju:j_]6-p1\Zu/"Z7)u-*32GeZKӉuU2XZry!7 M#?~S>Os9x-9NP4؜(>׮ffOfir)r(^w +s 9s@EoSdԮuX1΋GvdWa*6e٨Y]g"l~2E^n-i7-6?&هfASY^'2˔N*T}(VPw# vM_+;mp1ۨr+Qn- 88MC55Xn7}D>g)]SނӔ'pO55805Nv8N8N35vIq'iagegdNqq~pXjX:-ޢCW9'ޛjl|Js_yjƧƪu]/K-̭ɡ8Ey2=ws˟:ů rqò)k,ZG;n9K{ /` 6Q8¥-pm-lWVN׿gTzv%/ "bm$]=;&c7^[.(~- ҎkF7 ߠ3FѹMPrfkn7<FL"g*E__P9NPߧq3q`ˑ_#*V'ɛJ㓅Cׇ]T;A[w鋕ܯ&r%q:h`rSwgm2誱J>-ڋz&)s9NScrk?^KC/RiIJXɽE㣶D>b[uY͈mc]W?ReF}_+ 1-әSƻ~Me'#QSSgcq-k9qUZ8?nąädYOI^%we+KR*t.\us1wu<<[HcRMMzjjDչsYzjjqg5555Lm06g)rÿMFr3V(X3sprSF9E-ɗMc;C} {Ք qut!6>Κ+:mm][l.éSO3Bj v' siF@w4;qQf=щ3=CظQ ~{\-rWU5u`ZY1ӳv gmP^qqTXr=?Z':ڋQ1n UÁ}H% A$NSߦI8rE|zr)o4߮(^sMMMMzjMMz5멩MN3 q8qg8N+838 ~TC Tպitij&=θx=IZK+W_mE@*U+\g ^Ns }-<6BS`nmkҰ*0ZXˋ ]x*td]u]U=ۣy{llwBܺV]20Wk\F.)OfiMz~3ssSP =u583S^Ж[Z qk7+ LͼZ~EqKyΩ8S)}ȶ`p˖ nk &[qh96g'.ɑVkj2 e;{Y^UFOMew /a{mVd\10T(۱8q_3/џFel ]_/e簢L?6]MwKd9-ERZߧmy^6.K[ӨZjR kk(Z8g9S9f0<كzkSѩp}83S^>58C³SS^M[Oyڙ7 ed)ΨRYedw}dGk] ! *(2ͩD`![ڽrUpu?@" '"%JsGUgf8@/f1n+pՙW~PɟC-uc(^θ?NrUw1ʤxlց*abM>zTl#ia`cتԝGn] 3c֥rGrNSp!7;S8jhf gl*SP]A76#0nzwgr)r8((Mxߦ)NP jku>zM}SP}aYe+d\@ً6Xb/70d8{c2޵FjGr 80tUj2vqoX{dU;4Ucd>wqż:^}14W7j޿xFΧUj2sÒyeVn駞wPgRDMWKq(b)2z$ACӋe@o9ʜZb8uig}~ݲLz}A3)n=G];vߦ jk^ߦqgu驡58MA[lY}nط%fŒo~`Z_oujNj7FoZkn#";t~x6=|41kY_ CǢ+rc.25.GP.1mynRsqêìNҵs9NS 󙁧(=7h9 6>a3s9Ns9MsSsp!aAr(r8^syܝ@rs9y0;֎zjjhby}w77 3{427Xo56ފUw6^ w5}7%q ݟ^ ԅʿ"ɾ_ت9WuYWin2_^N1-wz./HipK.J~Ga`n>dP[ EUPw-`6TQ-6d:P}uQcWCkJۧՙӹqf2:J*ۦE; :n)j+NbZm Vie(A&na}@ +8MN3צk Iq'q}u5fVpg p(BDೀDМV&& N0 838Nf[4u^V] U߆fhVuXZgbձ uM2/7B7R,/qyWVf3[zy8#ـZ-RKKΧK+MX mɢE;tsW7c]UX/OsGPSӲ$_q*랗EJA{8|.uK$Qݲ,d}+Ox^F=5)XRFBw'8^) fw7}i '1;  r'(!9@f!9 x&9 MH6 #^ Q2Cb;wD7ߝ;w,܂,r9/@9NS|Y .]/0)ʺ,TUfR3ԭvpˑVBY{ڬ"Vbj{˩LN*V "=k]\nًuLnVX.ŝ.ʑi䙽Aןܺ ^Knmyl~^]? &2-[ɜ5HiSSky=2d]r,N}-] i*r,ducf**^x}tњvݩڝ;FfvL3g8N5\3 MMMzh0Mz8 8yf0v7a_ 7ӻr{e`^KWf&-~a&%Yt˕tĹim wPmXҳSs/]WoL}X6nTx='ej unUjWS uu.:FN'iVd!7KE^{]5*^MK}̖liVHsSSjƧ_Ҭ\3'+U eqJ'c\5KRIbppBR_i^E*h뮆qjz23VS7P2,W=ࢾմ]O>WӱLZ3Ph }OS]S'fr9s6n|p>BD"@%!Q=,]6HdÔ!{1o.^7^NH%㵾{މ.O2D>F@t݌]漈r@L\NNss 779SaLk5p.UVOzɨ&FG\uq^ETpgU o>VCC>0z12+n~ wl%yL{WQ 7U59; \aP+}-N329%c5J2< BU u69 k._nT&' -a~ی:]8q,GT9y|Yדq毆6/"%檪bUƑWl<777 4>Y@rVSf 4Crfe"YԒ>qhOi3&RYi16D<#x?}yQ*$D]i`dPf8W5 4V340TҪ-Shv4Ũ8N3`S!^IyC8wmTFEmXO &eUFF5*䢻+Z SȞL$`aqbE@gZ GZWU&.mCU-:m!hgR)+6׷MBp&-4Yq3*:HjxƵeRV-]p>VM84vK\7z\egKV*]j]^3Ҋйǭ+:}qgq+' &3f[3s2˚s-'!9j)dNsHf|",. +>]z6WXFFq hq~\!=l8pbD(`c Dpq p'XkQ bUJhЦ{ZM>na;s" 8OWKVg\4kl-coqPkV SdJָ7![pms*Gz,l[aNZZ86J'lzV S̭K<ګ^0:~e]G*s/TRwnYVzb=Us5񉥕HEpbԙfYMPmB]ZGoQs:}|+jߍ/!$ 6~EOx8Q&G~Iu t ^\b9Yoܽ`ՏcөSh\:8t{kgt 4x[%6xiMEP"^&n;Bv3')< S'g5555;bvYqg58~uT 2eĭ;V[ojw aCe=P㛌]S,š-7qJ!BM択܋iƱUU[YzK!%Vs Ur"'{i:f]8Z^J4g-Y9ޭoX,݌%j5i6PR_nJ5Ul>5;ڌ`Z섢hd`l'ZSm+kp0vf9Bw a9\C`hf3bswDm-u+yyԴߜ%b)'lNܿ2zY$2jYgsܜ/;0l*. "h$554f"hzgf4'8 NӘ)r)r)P%aspm*ᤝ6(8n%fY10hݬ-WFf2 ٭ZĽmcv6]=HBvּZ sn% rf*{{8ill EUz6)JQ1a0YpXx3A{\I@g%]W[5$%W0{X p6yݡv(mEXZ'sfCu{3.m.jG郴qUOqM `s+:Y ͝.qSX"Qc ecW?56!i}55BLO3sњ04fp'k55jWׄ2U9 >ڤȨlfRӣ66:(+-5N]aSbr#䢎;8c1-V30|`FT؟drSҀ$IEj*-g(9rw`x?F=u >ͧߦhl,Iт/ߦe QF.J.Sݏn%<ЎGxɕlQU,)SF[dWۯd12șM4EFўf>O&/wȫ\J*XnŻ6VAxugLWC& xv[0c}Uuu WkJj"֕^f97cpUY^lbIc0[9z=N~sع-ɇ`e>;xu 5 DƬ(Hi)t5sX5;7K//̕'^^ wwsX'vsNb+=Vscܙe4\,AEZkQq1{]Ln. ,\vcV}C2jbű(X֡R21~YFl[M`!&=.cV{nĠܫL8>WcP.k/o"f ɉHA],)IƧt manl.ݎ~S)_ݜ yKtw3gznn jewvNbAg(TmkfnZҶ-Z׈rD|7G|Nl|Q-\Փg<7dɦExyprږMh f%'Ycy܂ܝӔ7 04-d58yVTeXJʬ+(ȶSdE84ⵡ\T.ƦP: `(lգVާ[Q*Xܵ;{jrLQa'h9Pc;#:YV.VkDwEVY9Tod4v̷rwlRNJƎ5kDZYbYw!Fjۗ-ij%=b|Pm&;fwNCYb;7a0*ж[rTf0`?GΣ+03^`yu:wcV4Ks([D,6Wry؝qg`ATi!CJTJIq!v@vk'8N!Q;bvj ۂہ'DN"^x&m֗`}A{ +YZK d" [R&P:&//KUX\ ͛q5c]gY6~+7r`RRVA)͚ ieseS0^,^H<*թ N )˭6졍W;+-n\c~]׋RM&9{Y[ed>:w6n>Z!;s)YEK%Znrx {,gJkD'ؕLg@, G=>:'$ߏ@a'үp^ϢFh}Chj֥ٟ#),MJ!UXnY6P宍奬s'8,g pgjqgצLMMM}SPe^+J< l5୑`Agڒȹv6K@24mb߆[nVTRjМs j`Nz,bU 2.caٮkug!t~&AbS,h2Iue썃s-dQ0KcjM|lc>+kc%iOQWTIk/3flyeDĴ_[lśϮ9M)ܭEW"Ox%bO''3ss~j nrǧMf~}sN,޳J[a١]rB\Rl{Xx @ !e6+;7b[[dLjIm6*01sqpd~1Krl~/=y-[+mUD NCZ7Vعj3X~vƞۆzF&8\f: J[j[W:Ƨ"{YxՕXncFuD/$ 8EOc@`VLâYNU @ X:6rYx%T~۝K4SjkFDEaK2Ai$~4tt9s79mQ-s9NS9mmY mNir8,NBno &2l^ÉhʀW[‡SłT:3 w ߮pa+Ƕ0%{'mU;5^ 2̝Ou]k|bq=ALصKUl}Ȏn!B Ck ݋a ;sg)s9F3&SmHDD% nC׈*~Kb {͗R܋ɏswTZ"ineY+'LeƷ>Ж{sU6|eçOU5VI.W} 8 w/u핗kR)i`:'-ef9,nOmM"cpuW$5webgCU(y(c^P^5^7>YI(K*l"BՉH`JE(x겡ɰqhSY}1;HsD{ "2|riwrabQpb\Ɯ^5dUNxa4558q&.5Z @ EjD:1F {I f41#T'f5gjv7;!ǃ @'LNLSN;Bpg׮*L8׹])Ֆ,b /lG)dz2Kc6 9Ak˙i[zCuutޝ*U#*(W )jRzdk,ҞPpca, TZ2mٍ_—ユfsp5{5o\SbUe^5pL9~7VS|rz !ƶcZ.|`&1-^>6͹]OMùU\ے\m Wi1]Oz'P'@Ks7 8NÖYKR *4d;5a=]Ÿgn[ Fw݊cnv@H@&vf 8cAkgPFmPN3Uqgq8N3S׮N3 8 pLȯ͊ةWX.4R+V.;CY,Ò3LnƮM̔gX,\XhZ?!t&>ꔵ&[ʺrs+5U95,˭*`WϢ+"pu]Χ}ΠJԜlLUˏ'&:rMSS^'qMzkN58znrS~R&A@,gX ]&)*4kx׺`gK`WEo iޮYg%@)b6OPZ[A=SҮ_B] R.%]n[6>>18`t[P\ d)$GFu13r0H1b(G"ʴO!ԩbV eÒCŽ٩)#*J񨭭P^{jWrFIC\ޡN\yYB D cڲ%rQYWYñ;cf*3k)F5ҼH2ZA܀ ]R+6ON{go 9%%U5LİWe ׯvY^/7WUMMvٍY̠8nYWlW| g@ɴc 3'nvgdCNŪD m4!ab51D|Eq$dģc:ux-pd޲aWh]2r]D 76!08`_nnr)Q55=w'}E;A&g j؍\Su(ƦUS-y+xjS6GL܆o+'#M~Sprm$oJ.ǪVfA^Q N@|YJZ`d(Tڷ{^Xb-VdVZrR.= c4O,Lʩ@VӢV8MȯMlj1-5G7\PE,kUUu4&@yA55b3|V'5CKqc<~XUCXf]Z|!""J)WV;v{rc%4Ze_1v&ҳ+`>9}{7779jL-M#S &؛L0)em[2Yimnp5UYYWܡlU`Jm{quNJX <ΝcSwN-,]^^agF]Ҝ%Id#C o%:Uƣ}Tev.>.E4}k~/urʻƣ}W|<ԦkWgJ͗&i36'4؛s.'r'xCtk&w9 5c_!a8̱KCQeBlk6%_pb?"x~Xy^:(ḩC9NBs9r(֑ұ8WeonZqXmi@0|uǝQE*ӀhlXh"va=粋6`v7qc87; Ŭ@,YN0#Oo0S;sj0} 59N;p+inlϙi3ۙ; N!bQ3 Q;p i3`؆!vrbʨ"&*Hs]^>+ũ0Zu~Q\L j2WQ7*(>mٖe>(M5d8Q]L-eަ`eUYgjo-%r-Eū%>>s=苰8°ʨcduvUdŹIm]:^e kX4 ֮ Oj,s$〘իEu*. e/ӻd&5UvWyn8+T˻aH b8\3f،4a5q|ϋXܫr%m(oBhB Y^Ob+9N[D=paQ8DY5F 'b%v4D KX@cü/9O3XnPXdGp&*SxUeճ9j+{4{*lPM*,Ǣe;0[k!#6&7ۧ2R..bae=H?t5ڛ-ZhVlַfZQd>%+mcԴٚǴ\P!D/LJ2rQ[_`1Xƨ]-yg1oEيT6qS&jkWveli/*>/5CW3x" $=N}ݹݹUca Vu.F[*'=;'|C#sF* ;ƱlgH[.ƌ"Ut>&jT"!'Iw D. wFXg|k,;|AOg9BN9@^p4&2qBڝNę& `Nؚ 78"qY9/S[amcbƢe\auV>/U_vNBv[Vea&Z}d⤻X7Qj) %Y&.2.ظU T|N'*恇.~4Ȯ+o+#k3Y{] )` տ}T׿o# UQgTW"N8)wxû+,^34ܡ-.Tb=%`YKY\'#*_Û2Zs"-#:,h)vl*X({a)Vf˚r-gid\ԶKc91N5m8qmZv OFp Ba 9CdN'z -FWT NNɂj)-0W8N3Zp<_MV޻`JUV+xH"lfN;dYBַaٻkn䨕}bԥyեwfڥEuc#_n?E "S]Ғ굪/v"1M;Wuϸt̶X2چ9]C*8tUzׇk b:O%긬 2|{qjԝtq1ʕ'g?!c^.^E"MvfEaQ٧b{T+W#M:N[cr ڂ؂ Ye+;k>7@'lCBǬ7OX;>,'0TkIX)7]5'q1CHN-9fgB!'FvZ APS`v'555g4& '"+je79$rM~WcJj{c]UJ+Q+[+P[l6hqJ[}u ΝScGQU6Б9aNM-u{vXiZo7QrJeۀ՝Ó^=e :GNj+u}:f[&V0{YRYa{Xm)ny3XXAYcERb})ƲNF6F3_feN1  〜}g3Bq5aIp9ۛ𾌛aƞ58} щ8Ǭٍ\k+nrw'1],yD"q(eD.b1*9Mnj*@+-UQQ%6n%#d#ybWoe%o}#bTr8&IK/{ryodՕ~M6>eX>Ȫb;ba{TǶ-i=os)&ce:5ҙ9c61h=1n9g.܏ਸ7d(x%'X Y1qVCgEM55(\NsL >@XmE >*Js\ݥ͕hArc†f &;F>>I~}Ƿ._\UxV\E^EM~]]*v[3i9R*اɺܺx y}QS1?:n&"5XʭF5WPec.ŀed`,ȯd "SU>t:`٪ol8Utd&`v[ ֶIks^Mx z| ѡYq0AsP6[s~Mzh Y8A\j^w c,e`V$Tb^A`k9fUb@>cYX݈ Ej>}R՚ĭ:2Si|2_Q8^,NgΊ<޶br:N3Nj7FlMChw'8Gf Pj>19,d9yQ+q77fN& X1hTEzn,עujkp>жAl9NQws&jv4.MDŭє~_GO%xs]`iںHⷖQGOPqWBdUkNV5v[ٺm)NX:|ܕX B){ kƶw<&¼WWLK]fJwS[Y Y aj:g_Scimp+7%+I5aN*TpRLMw冮2`dadabY"o!ޥSY~íW|(CLs a/@`oCD؁%C;@ɍ#GPI.Z׍=O{AsDF1L9L 1KG,eY,3^.cJ6܋fc7ߧgSboPn:@g# }8C\㩸w#AZ|4u"v{q=C$8+3,PD;k =OkNّ̳0L|-;~=L".$]Eڔ\"0X@At,9M#d-]yݜ&F b T199ѳ1s8s{+. rg% g]AQk2 (@XaZQW@ψ +HqueUB^ÿUIZ+;%e:W=l[b1Vruek~=מj^TdCqk,2;H9 9v \./J}=49bkn^}tSӇ$-\&=s2ە/VsH.D5;b#Pq 8N،jjD 83;b=l55`YpՉqaHhS਍QI-J3%Yb Mx%ۘUwi,8f*ǃBFmKl2ׇfqxQ83 JZI\K"c"gcŕJDRgU%Xo񃊩Q8,{-YS(8+Wk;<ȱK, ajVyJ/|\tήmwӅ~Rۖ1KjsvWV8,W_7l**n2p*(5v_kUGϨTp*eUbVkjt5eՑmrn?ӹϑILxn ,ZI3ie~6Fn=#3C_u-L63 Z]]\ 5uv s+hCD)8yZpxSnoǡ33SS+4f8zVp D ؖJ 9a]; [e>yJ4 azL(e>)hp`Ý5 ҼVD\"' ,!`xa&7f.uwmh1DWnu.+oiŷ9yNcXY)q9 -c;|n7N]i]cRծ-U2tZݬJb{ocf7.O_g*'C!@PM3+C+ɗv[L'ӜBy!hWsD'qg h-S۝ALyL``h9o@'pL(Ij&hBf6nPf*޻jKv3y8٘\re-8芉cd^dPUո))+=)Jd(KrllL~JX!oOh'8.Yxq%̬è ȖT M/ޅhPwYdbz-YO!ekk<]"^a-NpԪ8\Աiɯ!]KmJ9^+ꕐB՘'X2L!guaNxr-Q- _PSj^^De [ wPӻb0igiaNj aQ==4~P+ q.cϗ3V]R9 ƺjBܺ˴-uE,Ih5seV~,MEiq5URmWd4gBQxBIj"IE(o?_JxOܟPARvfnƿqVWYgaQ];8EЄ^Ԍbee] XA=^cV[ >PɫSm߷%>CXv^԰ vy"ew5/krp;VJ.%Qdua{QΥU#5QYSCCNADoab$n5&-fv6 / v7ǩF8ŧ4fz_ oqa ?2i9&d!q3F +1,ÞcqK-U[Sm#!_*, \Lu'jp ģqjQqn&SS@S p±Hkl㧱5N*qLSb-[bᏌ]i C3vɼTSR/\GIP٤uSN5X&a:̳&ڢ-㶇XWMEf>>c|X*S_;,+=!O!V|ƿ2ORa1:tȸK+p:v)ؖRSۉcFo1l+"bZ%X{a(4ADj qq!"a"6jKA8'j!ǖc>Å4^* x0 0U2ZƲh.VF;'w8N:AL6'1 Yzjj65lZ E*N^  bEcr-+MpT$նJ<Rƿ2iLj)N$:骻0q*QU~%\ELf}°eߒl&]l+@k)UR'$mkIt:_\$ox<emNY- `(i^M֝G,,uՅՏg';#kOJ9EMt(%^skjtn51oSآeMq2JQ-Mv%4 X|jipw88N s‚ &8ʳB!h;P#c|Pcر蝳ԉDw`xr؄xwS.DuZ c7SiGQ5% f3BqyTԱkrrfm-m0cZjY7PYcZ=U@tkFȍ`cŧNȴ,-Խx%q@2u+QVϦyZy&-8պueZL̵mVR)%5ߊOkbk{h&f>wuyynR櫞'l,Jv5)s9gS~wNPʸ7so3G_C{BZE![`="ģe r/=2=y Af5VX WCSV]6ژAb'56Nbs<&4xX154mo-5ȭzNYr F%Nr0q&@74bs圌5Xet.4lcHZYAe5Lq dn$^ vXK4*R78<Jk+j^2 Gͽ ^QGm1)X e5<ɉ_9^<: y՚3UU+LjI>uQ4FfFKf"*oy5[J- mAcی+'fMH\cJm6aȳIJG?X ~]((rƒ Vv{򱵚6͋2yq |~P*J8; 13m鸆ݡa9,^؁|XsTjK!SMh' هOjË=@kih+xxf=@D}p+*&[jLqd3Q LᕅbHvh\y?8j),>Iwf6Y,3Pg邝deh1ɃxAA crX]kBRU<+3.fcbpDϹ=ۋז_dt|!IVfE*,{t̾ 27ȩ$qh"e!If.xiF1Ǻ#rr,w'TܡYl~3+61-]5]?.m@6pW9a*v Bota?eN5Ѫ'r،l1^͵Pg8WԭqFjUh"0>aMс ;pW8@5&vcSgn5 p'k+ rz{kݞ!ՐjDŲ[mF1>{кux|h]D6,k5Fh*v|F}CkFk <+&{c knqQ'e]cXӎI,gv%j]/ܨ?!2ǡC=Ϳ#vު.˚ũU{^+_ kUɑCV=H¶V lҥ\4 CA:ٮm v[ߑV ɻn3E 2rV>(T+]I1a[j0wxi 7;sF5Qmo1j~a^%5~F»f%a`XhM mfǦA9 r kO"r Np<7 M4Jl1jQ< P<9NS9 g0Acp;,|2bD4 ܶYmܲn|rzuϙ} r;[lE67LQ5ܝ 7Zi@w6&)v)L@!ihڝD9 3zh<)N*'s"S h,w)vzG.<%s#٨Mַmm;([ۻ&QZ"%+\7@җQK"Xtrl&3x_bP;: *k dnUP+4ުsAǖ-*ͧ"$Ja_BvSO#J!kJ𜸜1K+Od 2e4)G2+dwj%ЭQ~u\#Dv|+`Ia*9nnnoLnw'wSYtו\omy~]C5-g7jIG;L{Xį:} ?V`Hv"V<օ ;J\xpP'\ 5ЫJ߻+# _$fNQ3m7l~I$bG)"wo/;"e~s,R6N/r_Hҫu*ȥyFLC0uc zpŏKy%z 7q3;5X6Ҳex@~څg1T4t`HƝw+cc5IEawՠܹr[fəc9+EPF`k~bJE,ȨdW|mq`!f>0$|LRwf=8.O۳e1ܗɳo@} u J~s,j \w+ٜ|$>r*d-&xGnut{d"o!Hj~j,]rfF6E[kbCJPCf>03 :>=u5A@ 0.2z'K[zONI.Jdj6ĩ.Ĭcӱ?e,TF+ Y;~E-@@5w,ZUP 9O;s'uc<.wXee1 _iM̎7mjx?,KmS+ SUDĔ]23@ؕ=6_`58\[<gGW._ |̛KiRZul|+ecט6۷ǁ>>UX@ĩRcYcUWΥZpU Uܚ*]F,S,S*h%1?Zl~Uν%=ms'8l &^vAlީ'N-y5n2ia*&P{KXvMiH1).ݞJb-TƫU&+Ѥ|%\+kOV9wm.[9QcuUPejIK* VJړhYӍbdabYն'-MzFAL7߮9-".D='hԑ PT!N҈MB ;'zXLnlg@qb9wLal̙"'kqqܳ(sci1ʽxh*q^PmbeE*dhñק$^ޕL읥#8dUsUڙ4(S!O Jjn;~n52,%o R+^OPT's:A*LO]kx e\(6&2Zi.JY&4 hfZ-3iton7+ .(jX^ٳ/+ae>Puj앎Ȭp?lJf1 XYz˟t[^ty?1r r𲿕x2^6_QkLÛ7Tl^Pk :p|OkL/MCo{R6O&}L~^nnM¾~Ht&jb?G66qok1n"ۂLǧ+^S`]|Zsa >lc ߃s>; ܮ0/_#QNmE1qGi3ĸo賐̏hVMeNޓB+W3 dӱ6Y]sk/-Z#6=-s?=ň e+U`= ,cjc$4#/.Ĉ`>>z]5fa\2WB&VAZnwɞ(쬚qC%Yf.t1ۚQyX8ء_Yx <3P#@Ewz'Q;t;xm>'Mj;ν8 k¿'d䷲iRze|6bXqktt?2-JV{\} $㽨^ XT}égGZPb8U @~0GwR'5 B5xpYEdNQ'qyFEEVzjy.Qw~}f=&p7@_7 m6Հ'5mGq@ 1qr׋gm1и]uk,/8.s-r,׷&H*ieѕ[< |$ܓQ8j5KGrxqE[Xa핻i]V+qxLu8DkT5BC_ v%gNæV)dzF3Uq~9cz׶q[f=x5WӔJ SʂŒ<_+-ͪGm>kT⽡8,ERws5>Sp*4#a|. 4ד| )2-@ͯ]z bsB*ZllidCsH~Mܱ`!6=>S>;g&h~܍gVIT 0r3^JMq?qfsaRDa'(sI[c^szck#[Y^5cn,7pw@*VUH캮cvFI zRࠍzjq3g/]@21Yݥ3%(ԯӻOkpbר*XwhAK3VWp51"N^aߧ.omDZV=fq+BfЫk,\όv!ͱf6vtLGvWLAڏm} 4KtcuUn;h0}g1$#s{b0,YofR8T=P3֖+v܆ dl{hElVyQSђ3(l溬7ŘY8U".Q{P1Ua,рy' kXcb=<겵yZ U_@ ZE aYPUzj5`>Fe U7 >bmY _?`а0faMƧqqOg1)^jm}-MhoN"g!CRŽflCl=ݐvNU$:5B+ wUڠ_&v,=zYR9= @w= lU;*^4vcj!6r"<dVia"&c}QUޔTwU|o:'N7P_h]Ua1Sm[ɫd'u:*h.*x-<4,#P~xgA+ܛMOqyp> 4xA[Hl#A*b9-=?}YCj,O"fe+][bl7 MrD"{>駼a2﬇9u۬vf&қGb]oeS(Op9BXͨ^t*}S.s\z, _.ʽsڼ5OO㶱L>S^ˆwy&5~E?w>#6fpD7e`^.5+){_YR-[m +KΫoqqhvg{fF#hWhs֐-%z1՛z-\kN::⎈ϊmDerV&xhN 9Wp!jd 0>9U8z2>;e '2^]E{9yс"vem=2-3guXo3q>}67_LuUAzPU6-`B6!qY>GڗA|@bk+FlnZ,ߍVNF#@u3+b xؿkvLn|Lt3?qPlYH^gאn)e[٧޵)ٯS]^=)e(ь=8c}{\c+zPpj{2iqaZoH /yYP']'KⶔXO IW~jeh+ 8qԱE;DFsBjqXО&`#B8Es6b@c&S1QU$K`Vmʺ*2jhuײWG)UŬK+mŮ7Om;MCq:@T)MHS' ?FըCO2־S[71U錱u}Ϣ89N N (=!/ƶqN&;vCQ+1<!'o ͔0SiXbc,{}Jk!c`7 kº]ڝ6kF|>AbVU315ڢ[%kH|G~LohL!eu)xZq*Hesra׫lz'TQB.8:YMuTw 1#g5vqv/=Ƿx'g8=mp.U ֈ 6" SQ ȧ w?Z_]e=q]"^ȼmt#y/xB&WX/Y?gX1<{)TT˒ft>[Xc7z.L6&p^@-FoMnn Ki[ JLUAպu\u+>^` H>= tljqjJ"Lk+3bV-ʏҰ+EOίeңEj- (Q;1Q멎'IJоKEdC̰j ư1SZ# /)PճZ-W ůa\17b~Kzfg :DZ»%ITF4߼z\Vt+lEȳVXN ;dn+fG)MWoTd5weuUv#ӝ31MI_MnȔ4^ V .^1+Hg%gHb}泜USu[9]4Bќl# Oi9WYáseܼ?t}6Xl5܄LއҲ^^l"QmI`4WȮ#+ރ<ss~7b2u]a,ZNr;ղ۪tFNf~6F9&W*7V[;1M9 ʘyꧨe]QW%95LzZAi9r(6uWVugY132+FP$L[ޯ`9{ɥJ_.NQwi& [XGjPr̰fH s'A*FfQf9=h D cV |UlU#QM`7WtMtݒW\Z~kƑ۪Q|V˴zElCeiuUV3>!.MUFD 0 /wàIUknYWeܮ, }uUMU]ug=Ch3ñ-RɷIX{S/`cęn̼q?u+?@Rqߢg l;s1l eOSMz~Tn0ڕ_&?h ltR̍mn ,q#)Kev,H/%}VWW"ʫ?)ӲYW+JzY4K3j^eW+}?1z k3ˢ*{z^E_N5ʲ-cߑ\v-AKUbeHeϾKl_c}EV|~k6jf/˷?HnTȮKvY/~J .!] Y7*M Ա9}No{&Sߙ{RYEB»y4FOTo:6/fdzLEOխ֙g&^ug/gfI3x N~^qVskٚg('VݖѲuk4kVڬ/o[.5\ 'ŌQ!CX2m5 f܌1?+'D+VbJֿp}~sW1l_Hyaߏ'^ӯ(8}-%b2l+mYe(ZqE[CҖX*Z0Kz>)^F}緇W|;{c;12ںfEJ4ٍFu=nINNR3 {`TW/f,z{ΟXXGPtoC&=tǵ'M4wZ7+WåbՉ kd:[kW_n-[6 ke2r~QP>3JlKX ZSCn&JǹE-2qwnY]}쮡2n\:ZnV_)S#ҟ3ٕiQr턷Y`z!ntH(b Յ`'zrN>LqT[R!{(*#7,fF,.ʱ'c̟J%W[s oF>(`.Ul '\( x>:WT'}6c|Oo|ZMnä"MySq/TN*gc6%|urJlBb*2Z2{;SkkdV1@Lr-~z^P>kX>d)k42dՋm=_ke3RV=?LK)L~>H\y12!FٸYs+!՘6)ʵyP]5vqdo::&8-g&cC}3OkaC9]g&U]2cdrij:ſµ'M%n-T;wj\UǼ9`bi!)U3:@Coͧk@]A8?6p`XuxEmw4Ҩ|u͠>8`Zܺ8u ə=K?Tɲbj-٧Ə<|G7-ŢLO,pP]-˪eŮced?sO]+a/iR|=[5V>$,N.`\a$ Z̼9Ww =(lZ jt 겛Eˍmw3acnqr[ԥzFd֛Ool;T :Mz q3K?..mrK[ gp(ox׃Eu5Ԭ"[֢k*ˋ,,+gP&gYoWt{mi3[k1}j\s^=O)NCԱ7enoǙl%vd3:IɟX#?b LQ \ꘘ-rye!Yh@vEe3>e2m5uZ{I*T&P{V=b@5\o7+.t̼uh]?eP֬{&oW4w11,b^0ѫ"2ⶻ!y#;h<*Q46\O_kaeQXhk]OIBՄư/M^툎r:7[ {n6󶫑*罡#2+KsR̜Jq ܲY'ʬ6NNfγC[݇u7K"{,-E-HiyFnl3 3{9zoQDrC@bhhw8Ӹ(.Usa_}Ui+=3.vm9uX|&8vF7DzJ*n=ssgx5VTCet̥g̞ef)rqż-b)OS/ WB:6YM^?Qdu?#7"&E4S-heVkV—Uܯ#[{J -ϿO3[JgO|['%#Mudd=FnlxUiqi@{ϑ̰[B, Si{6.SbtEJzVFA^ZdS6"$/x9Vn(Ii2 l8bw J*iPkaΣK &f_aޡm3+jQULĔ'#$|s!7[Y{-]n Y_ObX?(>ߦ_cKR^5~i.xƟMrfG`EjC"]6 ^^#t=: z .2= -N@Sɷ,ϾV.&1% vwȂK1-**n/imS,ư0B)ok6c),+!q2U\Tgp4=R~b> ooGc"(2q2W,GZ|\27'tx&2 Q':w,̅qn-Vڒ~*Ҕב׌;:8yr`t5~Fp;J_N:j/}f#4R?1sAͳVpݶ܎l-ۨ6ֻ+uvyNQ,;6Șuab*!͵KXĻ?3FXvk[nrZfKrg [ztl:Ejy;lkΦ^&&\6&n>fvW:հܫcx`rN[)rާ]Y"h 6YzBB3_I>=ML]#>_)D*l6-0^;F.NT=S$g'.J<~ğMO>}@k0}lNLc3v=1y%.wx[-GxO~ '1o'9 ~b'#UlT *^l?*:jV"Bw+3)o6­d鴬vIcK"czFB^U_. t@ xa:HwC0"! uKŦ79@ہu`nZf| AgtY{>QC,vـ Ͽ6@3sVDNN@&jO>}<Ϩ"xO'C<(~&&2+bZDܮұnӥ|\k8ۍ 4;UТ4ddXW0ŋuث=ݥmkؓ²DU1J]\`ҹ=S7!%t򞘓!sah JVn)%W#*`գK#G^SVt@dW^H;KL<"ߎ(EMCQEC)r ( i[51n+q`ߠsũ-V33O<{/-GN!WtQ}8 C-8=ka-|pS***d!؞SRrrA5tN%fhc܀}>:Ա< pUaߧ>0x}L|vb"3 @f&?SLS{?@$fU-1osӹ]xW5e.2nog}3fjq3^5M^n0@ mCxsΙvX 曦g@-bZi^Ve&I:\O%0> '0 $+|ϓsX6K '[M 55?##<7qر@|C?i[-,t!b ƆW]5='2WGE8CgX7 n<Dw5n,n@FD~ ~_@<@w 3x?G:uc`|HצAyyMO[v~Қ,KWWhEw=ڙ N3؜Ԛ-rirXYS*ȵݖbZ ŪS82/5yT"-N^+/.3y G *0 U լfN;܈;}p j7ޛ2?e-Ug%a&M]G؇cq9A \qJA-ZqPyyX´!0c2Mŧ%ƕ[l`Av ?&QNU:N?W9R\&ԒVhj9k/9aUqÈiHe)ZA@65SF3[F>Dw75ᓗ++z윧/?6,/RiNGq2OiFNVw@jȾ_RIMX6'rd9@{3`@L>: a7.+5 &b754g5f6]kŮ w#;Y=բkDoN@6~i`ZĮ-;|W 1+Mx!_O=5,`@cyaY6س<l]\"zq&x< ×p7.(Wuj!~RU)0nXs-Na!*U!l{ [xתRU{,?s7+.=Uh}-SQt5]VڗHc.熬Qh]ZVVsň|)`.t䡸]wP^vU X O]aǍ`HPOT,vF5VcӰY2#t: T %MYy 1x/Q\NS19\WNFrIQ0L, e5YdӔ=3@ʹ PVd6L4#kW=GG®AS4;ب,Wkp zj< PMj<! `[ vd9,QU&ûi Q! [O@<=.<a"l;7&$l&U"\ 3)gnp"ōVO%~*k Vq(+1?r1f:ܮ}M֎O QQ>[NLFUW ! PUΆj4;_5]oW7qT4``jU9)! ω ߗUx$->[("QCEv.{_>:U-8|Uu&oWNɴұ*,H&C!m #g'.?+/+8'/6@IcYY#ve;[̧"-@N[ܺ͝yxvܲnB+LrQqRv+8) {⬌L9ԛo-L܂fqB.G0 kmCaZ 31j+&""Q]r+X59 xl#E[΀YL"Q+م`Zt 2|nQ- 8>֤z`vMuTS¢Ɯ>ڲЕUn+W[Ԥze4{tѓ>6YeP]ٕRRZoMXO WŒ ۰vymC9ߧ-ع FưW[W>fVݍJkl`6M?&ȝ7JTVc%EXBdW;;C|7śXXR!ʽ,+rdӆB-Rqmy-wH," Z]">2[a\· 'SM`W+Q5X5g/1N^cj  j O[婳9y'@c+Z{@&nMzooڨ!ŷd-X,յ|Dkbophq-qb\umO>`h&HZ?<}tAei Zp[mBEHM } sV\ eFOykKߴ;,E GB:ҮHj[_7mȳ E[^cɰ)_(E`:;?zͽW"۞UuQMjVMq|l6Z25ec{lUm1^j<__w\bT.8uJQ.-E?8֥|.oſ hlg9=m-vV3bmp|WDm* -XeV$N% "bN*1qxq76?-9`-C6Vǫdc+>]}eK *8"̬kZ+)\V1A/:CW]+ԨgudfVc]βmeӃ#e12ϐֿ_ 'Eվ bx=Q2gb]Ztb,J * Yv=lnC ԒQKlt?.rl"Ym\1_dK6:]Y]|}tP YSVNOKWOGW]X~`q^BrE=ȉw%eڰ)VF XأzH TDҮ\`xcekjXnwY0k]SIV5c/طWn=;W#LaֹVA;| r j>=Gj8fY[P@ɋ}揧iDRX֩_$"1Q 3-x1;_$13ț޵3"SCY^&5a/m<~J9‰YBNٔ.(+v嬊nˮ~uYk^Cp%u*8ڮ9f|7lϝuUן qӐu[Pu mC WREeT#u-ȕ0+F--[Ĥg>ao1E+΄nmA=D l)o:9[EjחtXWv;";Y2uҜmv)vl00ZP :s0@xhoB|:&ljI鹹>ΌׂsOmlݻkN374' "m5RB=9iP|@VtRD$UTw5EMۍR&)`hZ5LDA 0M\yj":ݑUf̖ʫ!jN>7y'P*[j8Rc2f^J\*EPcD#(MB;;s%TG:oZ*K)7,&fyle0_GPZGZlo6k[[_: 7b #Za"&Eg*(91͖"vq5 Q+`]DˬjڗT2:幎Ѭf1QWcEYU 5[GcȅLV0U:dQ8m2(W?hr+=/\%Xڲ5ŵ5 U򲈩[.BW^˛kȭ HG$i=$tZG۪ī`U't:Vn !n VZ |y~ JР'տz'w,/=2@o^gbXNDtXW!j* l/[b)W[{pݸO Sy ;v;R#_c:oTV8" H^k n"rّ,:rPcԽ9}H>Z̩;UٌyUu*tw8"+wZoŹ*E&B^dUؕ7@NK6YX+[c'ml_ւ>+a;UT<["򆛵+K2ȥvڬl5Q5f]E5[nVeؔRo5XN*ɹUU2oMK{`yw1*B^wƫ9ܗRv@ǴxkA-ݪm6V)eo+¬hju)q,.B dfh=i6|qjne9 ;*+"Ye*6)9MMN]6g!S CV+o.dwe~~}|~>1q+[gЩ#@BV(aa5̖3l#63s6 6@i":qJچ\S]Mɇ0VXԯ5Ǚgx6䧧tsU`WW[ԋZ=jqs+,D6vI >f1ަȕ[hv-J'mZ1}%VYXΓU9*{wumP #KQJKE?\Z-eg |VM"2QtWdgRl(_qnJ9-ECMYŴzLbajF )@!M[ Lq"S}̬^3lY+1~80*JAߏA'sFv$&  q,k'"c0h>NQWhU'afnm g&̲%.&[f%' W@MXҫacin}Ybq^DiYVAkkCp,+PZR%P̜SɨcU'2@>G;g1߄kS}m.03e].-|VVD6=kA~[@ձDeQGC+l2%*sGJX׎_N榾[6&H=ƛ1q \Z"nrL9|IYݥ ;ph UM^j&Ԃڜ?{/%N/v4{'#1zWPʘ_ic`.lؗ+7t/Ĕ592l <+sREkW[-uکCWc㢭7ж2ZT+Y)ȱ&>g krXZ!Fk1z9ߊ,Xr]Z1`Wr,%w8 =z5wl[1Xˌ@@'m* E4#ڱ~'@°P-jQzc{2,0 Ymk;:0bwLde,YT]؜݈O>ס0~ѯz4ZlrDU}<ɍf<9n>"ZҚ͍nBRܩF#K,.Ϫ|EX>1? "l,\j8JnM>;/6P΁[SU!Jܖ,,03TRo~=~xp\0'w} {Ռۜ&g(3 v4. D=C"s|?6GMƁŷKrVCfUPV@ ʫ9ިȳf+7{[ aȅśR%IJ6 ,|~ߏ~!C#.[|q +T5E="ejſmq ) 9^ʭpƗrZ\nRZn%Ez~VQ!y,ܶ܄ s\Fھs)eyx@Ѫ{P#ֺGeYW0uu-@P6#o&@"yك0{#'=K]tmMz,ֵ73F*e Xwf^ؙMw\qXX0lAŠX~@ }|rӴ!hkmG"puN9Nj [j*plMKrX-kU}Gmb#Tm0 Y4q^d&gk,XcѓWV+͙KsȟUmz4ع;v~@h0lxc~>|N XئC'|Ip6"[*e.%CΩAA]'aT{,?AjSl61E6ra9hڕ;ާlYrΥ[_Y+NÏsm\:5Ҭܨ$]DҰa"ְg˃NEn .Hc']6[~f! g]K_"t [-? E@köycŮnZԈ"t*|Zͭr<^NJ{U|gj:jŞ'sNiU -,`m6,$ XJ*Rl:)L<9(B 7"ȠnVܸG_a4 Cy&CG.lj28KkG J|ְTXqx\ ̤ @gt VҠo!#5>᡻RBZ eX T Zdd# ፃZc1%[sFJXWʺkf0#SNL(eG C۟\10/?lFYO.f=#75r%nQʭyZ>.,&T 4 qߧ#9"r=[2Qc5EmY&w$Qah x% W*6$z+PFg5 ؎Ɩ|75|-4x__f)nZ6%fŵ?*[Q)ǹ<*NUwʬfR;r8rjߟ;׿CG/ !10@AQP`a"2qpBR?{5zu]נ5XΰBزz(!nxxYBڲW͗/ Ҳ~^W}~״3^zj/G^⿗Wkׯնk45v_=(((QEQE(a_ߥ^zV+W%b#eYe^,,QEW/U5xc_oYeY{k5쬿iE+ߨh1 /)(eEVN[XvqJ+(+d׶XH/qBKҗk.e.%~A+# \XOFDJ+Z,GXf$i!T&7(4QEQXWEQEW+*%~+4I E<,w袊(Q_[䍏ZHƆX؄/՗袿DGGgy 5^ _xlf[k+by1&4㾏p (iH"UڲŊoK3@[FI5BV+!m"&ŝaذ['+ ,5#PXebl(aDwk61[hd.oQeᗱ2x{"1cBDJ;|#Ue1H$rT<-xe eWsbfQe㣳x"<ͯ#ŋ}":[E+,bcڎ؟gIEѨ>ON47Ĥ5r+ME}ke%gce涢GPY!,L"Qgf'ő%!k?'X[,#ڶ#+"r΋lm%_f/d"#KʳX,yb&>F"7a fVˡ1//Ж[V$пQXk\ R8QR'([~p;~GGCgXHDe%țxuT.03Mt'x)S-SXhjRc9.U|-<,>6)ؚC4$pU_b4Wl7]b/-}Y>GQǏGx+(15QhrP #EbM{PbYj"#%|lH'p%}1B+4bK~N&4E5 /h^ZG"LX,D,K+xB/|YCVP2C?T!5Haȳ;UK ,Hw󅱏(]b]b=Bc/2b#Ƅv2.?F&,2k/:|2YR%IR"Ig 8b?l I/i bee؇Dżf2Kɼu| qMYm Ci E_hHF,ЛG,g94eCo".G8BBpBr2ʙi4JQEW[4QBՊHt] .ǗץX6ZJ%j"vJ5K%-DυEJ]/,Y~Vv8FBR8E/QVh,aLc… "]",&!% lb57UlPō+$-?+LMIHrla/ԞO;dU!5888ŗ(Qi(V(4QEb(g%PQXhVF3[55XfQFhE2/\IoD,(g4,6^(Pp$6Yec▖-&?9hYQ:!ƨōh\i4 'ZeSYơ,YxX;Ж/ea) " -pTN B+S$\Hxe)/j8uHxEXc~V+V+E#T2By\Qbh4ȩݑgŚ,c(5 p5fƆ|teXN1.OiCv4R#4$8b8Wa:+#zK_rYeTQ^&.vElʼnʺV5%eXbYXש^YLn(В&KQE,QfXBVt7 6(4id r(b%ОW"_n"# ?e_(HXj,Zal/J(>0+Q\J,q"YlXx^ʎxL{{/e/ӣIYeZ^^+nb,>N.J;bwP%IУ|"v(r4Ux5GڏC>Eq%\3hKԲeYeYe^~QEV,B1XU^^,#XbdMyb,!M炨EY|q]}㞊Ge!|c8"$5ȭ:d$?mEQE{eYfվQEVlFPqxNxH+6,bĝC!5_, CgUrjw()1| L.JpEЩ2EaTMpKmnQ^ʽlH];P"ElHefBe٤B/BC:;" '%(eP5ظ":3E>2C'Eo[,YIYeYe좊(HVǚ.)BxqdMjF;8đd!Hb<_[z㙦βНv76N5z+uQE,՚ej,"lǶ(Y|c$'#y(LF141vtqE4"aK _L+՝1"p6]4'c/ X/Y~tY_B,,Xňlb8OKğ%p..I dxbUE&#C/ 䬲ti+g8N+VtX,l!2ggH|P1!$XF!"h%I}lv^S͋b;"8c$G/սWlQpYj EpP%8$4Վ]c](|m&[!1g"bиy죲Q({lY{/6Ye&j5-eb^fH$XLX>vXtG%кb%Db*%xRBc9VˡC+~l~x^k/}lH[e6iILI#^PBl.E+ r}W8ruBdxv1#IbTt7v5gK/N9/Ab)E#2ƽDn*9P%<}$XMblL9e &I#t$r(e#YB(qKҬБEzV_EQX[/m{kŗV[-#UQ )BET:4HoXĺ"<",| " "!/x".gॆ,$o^ν_b˒/ggFiYiQХDo !H,jXE HćH_RF\EC_G%|cI1Qk-2KYV5PQEmW2) 3QEձl\,Yu_#-,XrK6Ybv][/X4C^u-_EVlQXXXoc*:ãPdz8Kb/bd| #,N|ⰰc5=~M"G(KWIEQ^{&e[9+ӳQ{4Ui4I&?53\t[%?A,G6! / eሾ1VE2)G"v2Qu,j/в:+7 e +آHqGc Փ]T7bi,b| befC+evh"Pj"y[/mQ{+ЯZGsb+%FV% ^CE^5cL f ;{bF"5%32DY~+eoH/VIfC|l\Bʡ2ʲ[ŗ΄Bc(X6QdG DJƜ3~+ecߧexY{hEzQQx E_f^LlGeQpɼ#{"#b=ѦE8Bgce?S +_B.6V8(oI ޮjXC1dUذ V{,(c#G_"\!(b썬Ki/Yeڈ 1XeJG"dV/ApG9#ؐ!HYxe |CDXݓ1tP3e]M s^XVXK5Y‚*b4hE&B$ |1 :>pE5erFpQEX'_'"u• CN= bd9x~ {$٢D(53ҍ| P$ Bb|Dz+XyDe_qfY>G_X9 "tj4Vk׼"%Cp%4Z%"'$bxy#XU)^;F!rJ(V#!ō+ӊ-Ezk؆^85}ЋE"ӄ%@xcxXOtX&AG4:<\D,vQ|E6ik/K^fʲ(cE lI $pi|ռv# RGEpCS1F>,m ?x奐54aQ. 4?c!]E!TR i2^atr6{#.uGGdDbh<;%,Yؑf]pAEBཟ9YXE1YO< E!! 5V EiaL,\$h4Ѡ~7\Ld"[,QK DcT]6w8{Mb!Ŀ4Q^nfxl(HD~V;ˑfȩ5dx."b/hė#XH| -PXb!O+բEzBviDՉQc,O|ӃbWɧ% G?סLt5E̸%[4'XxI;/mj/&sƑ7-a|x(~D`-(аj?Vi(v62/Wxg"PschM1ѤVy2,L";/ TieQ1,y~bWT^#8ʼUy\d5RƲdWxHӔ8cBkBX,58GdrЎNW8r+P$ИƸ_XgSE !ؙĄ·ȣe6j-QEi4Oe %2e8ą,&^)Z,e j= /fhCO&6IG#@$g qC49e;8)QYYfYxCFAV,8^.ȣQtjB4JǶuC$&Xr>D!+ %YCB.im EʼQcXUzTV/&54民[,vPŅG4<ŏerd=VĨ$Z;al ;.$'}Kb覐 >HIM'r%:Ea!Ƒ6XLJmEHz+٬!Vo5+f(eڱxBK:.D>GC2GK}GBGFVj#D!R4ĎJQ5c!xn+.S.&mE_{Жƶ(Ebǚeelqp5c ^+ff2W"VDT;\ʸd8eع i(jT)Ң2F&yFdPb 5#QLGEc_GB%d'*%D?Ȋ?ygi4i(YCoFXeS;BYIea )YLmD~4&^X^u;(<}ppsDapW9/E7$VXeiŗ^lX{-a (#,ckbh\+SYĨ]Bol%WF)E,Ѩn)IYiuq.^ nLfj/GB](cBD%56u>qCÕ ||C ri"mP࿢r,(,q{u#QR_LeH{.e=jǵ13Ģ,X3Wx{;<>! 3Hvi4UĎ 61.;D[;Ɩitj٤qި~Sl^6(QlR5,ob$^z-DX8Y}Ȟh64Hp4j,,R9YJeP~ۥF"HDykeL2G?U|NLL ,1C[4Qx )Ѩr%HS943J^e>GącX*DbDŊ|yQxtv7D Qec%%羍M>6HԤiۨ:X(P |.;(%FI2R5p<&&)fՕ;4r%GjHp·%䔰G%q+ebe#YemCw3?EncXc~ -2>$Kp 璊/4Q/;E(6G^%%;c7\S4_/u^,ӛ,Y,Hkml\#t7eWxVEdO((u蓢_CC%.wG55E߷UYx䲊K4@QlQXkEm{,|m=rj-4X*IJdx ?G/>y( ~J4e{xJMcR)2sEa"E DLEQVYؑȘ٭.~$ڋbJD?NE8tj/ce4^,E{[4I^l% ea+Ь%xԼj_.?9"~^FK[9tG>,K-b_G[z//Bi+۬YL4粇yVb79_˕?\!Q/*?uXrO>KiC#;CXl9EE⽽nM{Cr^,tF[DZ!>MV5b $#HBؑD?!dIMcr_,_9HoXOֿoOm⽿^p#dž_eUa9(CtQ*GZQE2*J]Ldv9W(MDԅG1l&+COvQLڽ1E(lҽ+)e䰊*ecNr6iD|OᑊC&ȾMXerc*.y˲>6O%Qd]H2P E ,wG(lsDWYH/E#hYCe2E"m~,Qec_9]B'甆Ql/x"+˲^N4)^$x\cT^l WjD #Y!'HQ(cX~V:D~%,e.V*%E\&Hc@pCc EQ ,D/0##xKc]] -&T9r.sKP'rO\&&jF(cx~DlȬ"˳N:LU d`(DbE!E#";ibK L^)uPQ裼4uM4j5ʡV8$KSB,RVQV|+?JiX;9eI5F-h,p*E8;:fKDQ&[#gG{+c1*J#Ic՚J;5,J6eIX_~9K^{mF] GƑhC{oE؆#'cx>H:;{ E٩DZS$)*Qgyce[-VSZ/z|eO)?M{~^ǣUʇcxQoxȼt!DC'gIOEVR .E>ѨR:/68}ʱĤC;9BثZo5DHEG%~H~=P/e{+Cfj"(H| 6/$d9Qh~=GVdX4>AGr)yp.ƚНiV5M1:;)GEL<>G(lQCcOJWeKҼ7G!b#Ebbt'F%fĨi>rd^5ʳIE,u5&Hi5ɪj;:,oWXF<>khk^ƋMBx׵4X?2DYq_kҲGm? TҐ՚%rQDlfB,BxMCB䟎$[T^g"D|&UXZhQeV( YФX5v)Il ZG[ԍcΆ/٥ m]4aHQX+ELğvHXhhT8%X>Ek bv2C\$9%Q.Bg%w[엖(l?J+կQ$'H^"*)MV!#x|Er5b?(Ɗ$:|R[Jj=O}+eJW"1eמ)⬢dy<#vFu٪/쌑x. "l\5E]b*ƳX5IG?#x/Ӳ_VorHϡɼ(r״hef5dcT&]e.ĨlLCEY;g9۩{(Ƥ1XRxxbxhP&Y/QYN/RxB{y4!1 A0Q"@Pa2`qBRp#br?;/?E^^Vkuܰ =kMvW_^7w_ؿEqiK_ke`//[5_ޯѿ6?ڿB;z=7EJ3eYE/,,,YfQ,jȿ,N,/(+j,Ii(i(((,,Q_`}} {Z bdbШJ4i46Y~4UzERsh#eYe+[jHEݖ),P5EYu+_wTQۼ%GBPm*쳓ȑ] bhܻ^HJj5}z0eV+Sb3z* bŊF^/k L8D܏T_nx".QYj5\g(o*4yCGNm-D0KJrPej,a:FQeYeYeVj5FQ%2cmcYJT|]Sy/M}XXYQfQY~j5mE^HǑo7&Ql|mYؤj5ByvQyǾ>)XcV,i=^R}s)bHV+ͮOFWr5-٤Ka[}v/l'Bn6G"x좍&IEQ]F"HE2]=By/l6!,2}2 #զUeCYbD$?圡D"Qk,]8 #4D$UX6^7cY̞ 좰m2GPB#_ݦTΔ5K(E BQDYXUDebl"H)P:G_:鋺FnnK$&EM%)k9ĩ#;e?,YB7vD$";% 1;c'Dx[ex(MfhMDWS>EWY((]QEf+QEQEQEb((g:XnM8'Љ~h!E ;"'%- 5bXF6X< FIecO$ttdEQEQEQEb(+QEQEQEz4QEbQEQXQEQEb(((((QEQEQY(hYv"5!HaJ Hvp1T.rƒh aT-(㶆>#[E$-(+| b4͊F]:1śj8(Oз{n%{1WjEEӡ Y|d#RG#č,Q}钋>}H_ݤO İCYT6)WoȢ-=/|8G$bG#Ŏ. VhX|;~2=hض=ΦJxbk/п%șMqv7JRļqMrj7璟r^ģq:kEl,V4Dw]pvşe5eS4R-yx&3 ;w.pLbq5Ĺ?>ƧG56%$:MR3c.(_b'C&l!iN;w=5"bgCkɩ. Zb{Hn~o;?ĆY]:G;⇊/4y8CU*1!2 ^/,GS>O'N^ (\|N%ؿeEmU!Lk#ؙyI˱*] bEQCtiFe_1$#2%hho/cPE'QԿӛ:rӰثa&%{'Dcܡ1;{c8e7'; d,!viijGdrKEYe Q BQ~Qj>ưlF~_n&?"^J#DF#Xo#$x8*(cip}RfaE=HO:{N1ԧܝrn~!{Q(7aan,4,u% )[9cئIТ3o!tr5()QEvPHc~ rkg(BtU{E9p5[j9+1i?lqvE.Of,X|GG}I$Ă^w."/V(Elɪ{ %tM.b5hksib({9BV͍xDW *+j5V$!#Ÿ,^+rؒ-EfH%C]oŹq+F>v#!=VFWڶ^j b͒EH\/~M8-&:GQK~ÍR2>bIGqݐJdD[L| mC,^%YTd9ĸc߁e:]sDK/"[tUJ;n_A{пO I/AJKamɤbn8{ei+{+o x$ObgV^q%p>,s T(7eTvd-8m+[ 3z+&.l:ّTl- ]u"Kas!,K#UnE~877ɡY&Z]Y!u[˾&6i4r'I=OZƂFLbn8pO8{+/RBř-řpp!cȳh=Lfqɲ1B%6S†jߧ^؏JƯ su U ,r;CZv4n1-q/b(:r+Xe̘ōS,Jxe3vDZղlU-X}QuI2M "Y杊W^D&Z-{x6jI~0#Y1'c4GĶ%*zF(O>u˲DNlQ+QY&$;6jܲ(HUrP<|'Oed,ybCg/bn;O69CfWʳKM!{ ƈĆKOݖ&Am-L苷o^xչ Kl1S4B#TJI"? Bd =-bƄcJ:ocIBn4I%2RGt6Ya| fQe6Yef^,qU"eX&|ƍGO[YFA&A$V~F&],U昡̲5T97F^YeYlv)&&jx]̢(ƒQ(YQذ,3q٨<b*a3]1ɶy} VƦ-Ж^ćlO| + 1UYeYfj5(U abFEi4iF#PB|,Q&Kq"eYcxŒf9.; #=dqW, Vhi$fD7690}b=a;[P(i4 BR4Є2I K#J1[u mh!2)iQ $POR*Ub .Շ7K;mj :FIqhShUE(΢SXYv.sQk#$C~xa>FOG~;<-.؝V2ǖCFFH/F ,NE#| *#٠pc"9CR\H-ǞjCf&#r'f#Xnectk+ a3S|ċ.Ef]DV,ҙ%\i-&h"nWqLqJulN.qJ.(x9$K]cQ(Y(Qe>3Gɱt%CPT0Τpj좊C9YO|0k5j5Ѭ,,E".f&&)ôEuWbcOBx/%ԑѭ1gX\^HΚ4!Xr0"erLmB{HIEvMZ%ft+{VK>Պ4TYfQfIl2g~~YxٰiH2Ź$LS'&QX6F+7/ 14f92&t•M{!b%(Q] N%eDX"BF,)c74@4 >Yi4M&AP++袊(Z(Q4h{rI<;%ǖ-COH[F^\LR5a&+%.)$%QsQ'9 bݐ,|y+ "p,i(bFK4J+#t>;=LEa^lHHB苤v8J'iDB5aг8"l~&'gҊ܏$Xx/xB]b)+S$H~a VCHزFIV+#~4LHCۂI4N(jXTlNGN263"8If!:9#AiO LTYfP?brGXYO)rDj~Y}9(D%~yv+dbЊd"vuXi+4QXJ+LHk%9{8.r,XQF-c^0DD쨛E6|Ut9Xi&l6rl"G),)cEQEbKѲ졢EvWeѤWuf»+dO1% 4M6(КE54k֙(|D})&Ƣ6UxK}%ER]CzUP?a 7xz P2;Wm(2/F*ή*Ⱥ!8J(5|JB~HhXxLs]f&jbt !b 5?&JFd-)] {А}^(jDZdvl,,BŖ_]_eVu2d1Ȓ(ybTQ-iLpf82oƢ,.MP'F) b!Й*5 nIW(j$Ʃ®D!fBe aaS9)]eYeYe,F2}. -"-PB D)P#H}OѪQ1tϗghx8)(ch5{Dei"-(Xƫ<%1Qȅ#8,ZMLHMrD#$9#Im1*R)BLjCص}>Z=(ccb⏖i(hbmik9,܌ؑذHd] bRq!A _HIh43C43AiE"FAi4J&IvjP;Xjl HEr>`P֏DMn}HtmPlЦ{CMf( Lv DpX<,ȢPd=:((+֢l/Ye#nBo6Yee7!;ڏ&/(?#C 6j؞\"x'fT)M%g"^ƹ>u#E[[I{t:lk"$,3IhEKQej5/ѼߥeYcX(QFD4Mi++:$41Ò5h8-E-YCVN6+ 41t%M&/| /$:Q +D_Ci#IB%QCcܬ2 _|QEe"(f^QEVh$<48b+HgH{ eXL4#B>j^-nPŹ$.謸Y)LBYBb "4+QEQEQi+:M&HEQ]+ӬQEi4(Ę핆I晶2ҷ#EY{ )#s|4ĨkFk5Ԋ%J?au٤=DDimVbzWY~TVkҲF,Y}yr,^{ei!նGdY_lpqg#$B,o r,P4:,q/sBc#hlMb%BcXyb[ !b^eYe_eYx*+,EeT7xChxm2j؇W]K7e$.Ds%d`|3CMbZF^EfYQCÃ!kVYFߡf/ԲԲ/蛼D Xn$3BJ\d$&^,5eWH9 ?&&)EQ^%Wu<1mC~r(^Y}/+oWeQFkeHfSc&MGI/E&5$&''Iܱ%nV+ܫƜQC^w.6r1B\vB[NFQekŗ7Be3tEHxℇ8#%2l"irO|_XxBUq_G#bd$-V-6(NEdKl7$pIV,>HD97DyUM}X3ΧVב?bp io?!~2;xߔ.vlQB~e1SFdn&'H:֊b(+fM%zUei(,٨T1X4Cث(b+ܑVVS vuQ;!p~'l{헾^{X}.w)_]lYX͡sEb4J((Q^ WH?C/4Vh}QXЮQXbEv4(%c 4j4k;$Jp4#'?Hػe~sCܬ=O,G|Yw;%t/f2'榸5eo͖Ye,B4},Ii(kR74g,,CdpntUUFRfcgO~K&E2<+lC$JO(ѷ8"ΠПQ'~2Bؔ|%I9o8i/(HvKr/Y~%zлc,}A·+Ñf4j#*%Ҷ.Pƫ䔝/IHw=B݈xXl*Qy؃Kb2^GSܚb9e5(l^,E$Q]Yy3UIŕc4&'$dB',Qݟ3Wt(}Kq,$=B#Kq#,<Xwnn5y:ѩٍQb*!+} ŖY}Yf(5xQIEWlH,~ae,49%G?I3dF-%v%l'bbc:rb2bQ'S{ ^P(RhIW}*&ݲr(k6<#l/*Ȣ,"?٥G-&x#FEQ vtОd{ k=6mI_Tk"LGsEQ_QE+ճQyWe^Y6^jV:G9JKaGآ1$1pqoal7| G,l[El21;"78EvPhcŖ6DH,b9nEYe:^,MCfw&:B\D#eyiee<:V ۓ*nYJGX%'" {?P~rWsD$pr8cvYy8bi(QX&CV(ハ_9[ؕxGFgˢEY4]/^,/4We$1(xxQkEpy>lCÿ$UŸ[3RF4.׊K/dPѷTSl'DI2c|(&E Vxx~.dIŚ/r^qhi2qcL,&FBIEzvYaYy;CQ_uXą!XF,#f!4I1} lؕwWV*e##=5dzbE8TR(V,jƙfa"/kWe_e} ,x,Q]lJĎMZW68A6HP]<[,mOr/,6pK1Xhkb+~FEp"Rwv5{S4%ay4{ԳQj5/7+(,좱E~J_c$oa%]m+d|n+r=kT8ߒ)aa^ELӆICDw#Ip" "Y^- uCCp*1vuYe_+ )bRFI^zv^kxQbX y%;#x>k|hi=XPI_bB+r(eeWcϞe d MI>Gt؟QWc]t9W~z +,懏&T9#b&I1^-9 ˢ[g;Fq;q}/ []$Y{ƎD4{8YԱO[W_ڲC/en(]) 6F2EȏOP5O{>Q/Ab#dIJȣXHq3+q<x^VJ% I!%R EXﹱ},KbXlyk O=#I/qLqB{I л$.n CLva!{V,<=bxhO *^UhR>h%!^,/ԢuXOhr_t>.(4']Y#q#8~ʤx6BWr89 OXg,1rΘH+{# 8jģd}#(ˑx/R,j+7ƻHw"{ŴC]qCu<89bwhCxG;#+{%M]a{EH1HxI!py8ܒ?|)ZƊ|Dc ~㢿ש~{$9VƯqn(ɷEDzeH>aȡ4#K"[vWkND8+ș^FXC{bv2J ƙ;V]S\BXi 5Bĉa~?Ч"ul.kr.ƽȴR]4qLR/|  ș b+Օ[3}J[rَ!BHLha &4hԞߡ]Yxd4Y^7DGqRBN^ m =K[7ÎB^8XK'%ؑTFШGjƍT) >DL/:ԉG VI%,% 5)bQeLei.Oq:9C hJc4a"/K5fx",_Ŝc-+^7ɶ+2M6|gM!t{ oDXL$gL'b4MY~&=(tVdaHM#cR HV!<26#:"4jHY$YeV==D֗B{"ԎQDH<1;(8qBěQt}Wd$Qec:XzأKb%$jسK/ z2(h){cSkp5!쬍>Mhk|uEQ)ؔ"BT&U "㒼6YHi% o^/ԲE^,VCeo}ȸ*f I{ -DY{3d]([w&"nU DLr!f–S^$%bDv,ȱ퍑&'/סEػ,/7EYlLQJHM.5JC[ Bll/NhaP?bܺLLsVkS>jl}H="2'؞X, Kk3e,OӢ좍%걒VU XtFE*YibeD+XALPNZ5!m Yej4Zs5oѰC(ȉbj#qt^(B+hYe+4QFHEIXQy"ȼtƎ,[vh*3d&:ro6)3CozjSQoaDD"[b#"DDUjsrJ[lBB5z6^lo/,cD  V <4$]AuHDGGv_VĨqR>]{lpKbQBbM^,K5LE$y4y(elr55 CE}V_k%/c.*-ΫB#g&{3[>iX}~xReF*[iIn46-D-H|VȔֻEf5WeE+c1Q,,he]6U+Nk:6:./ g)أo਌߃F$%$ڊBٚ؄mLlif-XO) ͱ{Q5uYXhjko1ᕘdDv55QViH^Y[%*l"Y1%zhWdJ2T?#RNDJ#4SHN%whRif.5b7bLF]Y^M/PXsH?vFs4]1;'c. 4зh6C,ccNCCXkLm9SضKTϥ};#cO zDirLY茄VN4LAUk 6(jO-&h8/ xOhg}ٸGH}ILQ PׁEӡGBD#DƜpDpE\0ҩM#VVǸѹP~K4ؐ4&QlQbe%$l)♥R+*ϖ.z)WkM,_e}A8"V!$E t!=Cޭȯ-.)8DeF٥7$5Fn*\|o \b}UC9^IM4,R|xO;%cBfņh4m#N['/>R7B"1-1B>q:q#|C8_6&P{Iٱئ~ʻ/쨢E fsx,ؘ[o ėĶ[{l[ܼjE,:G" RCD%xUvX-ZJH]Eq~w4QLEcQx+Dj>`}  v%bHッBkZ+QSiˁA}iQE" /^EN1I|D#E CDVWnSM1n[F̧+KRPscoe=*F1b+vQB.W$+Ide6PHmObܹ,]>h^1:3'gM~N}RfoC6g/v_m^l7xV1ů14";,{QLF"e-4t]KOˑ#e4)BX/Ԩ I2~a_oԏj5Xٱo䳞ՋŔ=>v%/K]n|ur})l&hM,qF򽏓叡D:JR)<\E=L_4&Vz-u=͟vRft9X"O|<,ܫkR]X_g1,X/ۛ#7{;h^ri'="61C;>[ĤpK⠶DCj {l%^1v)Ybu=Sz:E9!N,Ye!{| oVb9e bhV/x.(&&R\#ɣ)QRpBCe$z|bnFw7(iGUpWW&Ѻܽȿf%%'b+ԯxV5xM%MPr6)11\!,];Wg8N>< pjjK8]<#Up)c߁tg>G;bi^WF:=g ϜDWcfSЙI67ńYy)#'Wffk>`_kx}"BCD{=Oz#Qp>D)rF-.(WN)Ĵ95xoVDt..=DV1^/fwoVK25Xٍ<$>]ܢBbkj+)&eS)E.#4" Ppr.MHb߳Yo^/:DB(ՔlQ -/*|2*>|+{cO!u~HQ sUtNFFÊg4з+|&V(Wu2yt_lada2U5 4fatYeb.#Q]r+=7[ l(Ҳ[!ȿrOgK&GWAGK!e7 >Yx"t-=yEKsKBI- _RUaw]^}ExbdzBU^7FHy6DebО":EYHlԓ-Մy'oR QK͏.IFHSfz8CQ^EK$/ou>M _ĔE/R|Д?#iJw!׋졡GhXe6.mX4ѭRkj4TE!a!~8FFT'ԍr|Qd[͇$ش%k_, "N2_Qz9"-F*\E)'pq>&-n-ѤO.btj/ zwQUF_ܷ4"/sYdq bZ#mNS>S{E,b$f|{{)ON_ĹMױ܏R2Q̟$R!-8Oz8C)=ЖM #٫snQ /c7LjDHhF4.mX~v<_Y7~ݍYLMG"%^ C>p..hS MQ+{Gk5Q(, H5|~t !ьJ]~ygW}%e)Ez%CĒp#758.%\R->H#g(M#TYu/Ǧ^Y}כɼ(b<E(oqȥDGr54/qb6\q|'R_ȇ%c?$.s卧?O6>:}Gu"\5Fh'F4$eGHԙ?e'Ⱥuuoh/ HOstm#_Ԣ0lFub68{ xI-ut]MCAFCi#Dr)#rB_ ԑx,Y@Mx|J2"f^Gb,*ԫ $}K[44- ,LlKTEREo'_ć_ρ%~âE=qF+1'EQr>W'l"7D(ɏW߂ȒlHԙ74)p1."O_Ig=|CLWxrRNKs95mBU;DL툊~ .<e#E6NTG,R|; :b-F~|}VC(%<УiLґ)x$ȖTlFV|fIqlG)$:%$:/}E2^E:5k i(܌:ա-BiKd)EN*ͦi|-=iv4|YhOrOa\wE?ܯJd`/]+e$7FS*OK)aXݢ–Ž2Jd:|#܇M44=j^K3Z1*T?n:P+Dw?MHH+)x\bIѦʬk=oEFXҎE$W!tE6,G'Kbǡr~P#zu>ؽ5/$5PہOTiI-*ي/&hjrk$5QDMtTm'=VhDY5x:s"ᖍUE(˓EvɊ^k!?qԍ^bZ@HO4iPEI i"|7)jΟ^1+$))&qO7ԋUUYt]XHv&",Ϥ4.CCA#lMGi+^J4.#HPKc)×_[)S!58dV4QksU Pѧ䇹R?,It2=OqB)&Y؍H.E3&*V:l ,%)XT4)BEc+_u RB&QXFCb~*+ߩeXBK/NOPoʼn1ŋb;$*'cj^Pݫ!uh{-Y%i?q8 #>IHq48i#/k7F[1LD([>OG&1hN)VÅ&ْX%2~QH,jpwPB'EeE=&G_o:b_R(] c{ %Bcf4GW(fI7\[>rGoXiqtq+Q\Qg1I>I·B8]kF茷׆[6(4-¦&~Ɨ #&kq]*k1a+52ծ+b]+) BY}H]oaɾ{Z#Ս^Œ?؊$$\2!=Xip׹EĬg*q{"$Д:Eה)8EƩ5!5.M)ٛ7hwؽaq_䭨KNo]Hd$hE~1^ݶ^[HQEm}k*ǾOQ5{)$ݢ4b"^hF3Oؤu:~v[do&=2]:HpVYV $"q#=EonMxF{j++bXW\X_/6.%$QWc5⭉5VR+DثREϙhqcRu<2Ƃ<:dd;:Y4o E#$Ւ[Q*eCܡDd_OI'frUvGzI/ tC]F1alr4RKe&*C4;\yBtt"Z5XJfabLdhDQN؏Q5٤[6/#5b=Jt&uGa1T*#xM?/Jc$.縞8*q$3FWL$6fH_QtXhhtVQn/W#N;[ hZ\p:bhhc!XM]jڍH9"t7lJ5XM>#r5rF #}-=4~aEᢆtn ȭNTY?M'jR$NqJ^bcىj'li WHkc->q68LCT^ŗ*0r! _w6.Qok~oܣk7L،SFc݊7#!/P5qQ)QV8 EZ6gٰFDiƔ- cr{_r8wtbYmkb]eblb94%qDŽΔGM(hh{1%BfDZ?q6^ǁb%EDBvrUEܬE6pE$FO#kz>/ Y?X!1"AQ2aq#BR b03r$@PCS`cs4dp%D5T?#OĚ5ڍfKjكSQ\KjتFDH'm}G#~IχTY<49em4=잋dw!؞0 S{ݝm~I;_6:{:$~mٶ=[BFGEeF5- =Jg-#Lf,OB}ڍ8)ugpAM7<Pk'WgsĊT[VǶ>3|EZ6.Mֶ\W;]Mc{{jjݯOu'K9UVڪmO$ݯkSh汆S۪ou4'jhEhfN㢦.cB^vVh&3g_rl_w[C*.Yj-1}66 ubldUvnMWu}hvv:)MsK*j9*{Aڪ9*\KuWjQ?gqۨGhnQVDh-`빷F\Sn&mj>)#~څsB6 ӳ۲۪Rچꄗ903cjaD?z)ssAOgүê}c2h'ⶭhWu'?5SheMckzlNdMեRWfYͿٶ]05Ϋ\1 yG[E=֞jn΂oNU*56:F(lj67EWzNii/wh=d'RJ>T@TTJ}Qh[+iRXyd~jJ}0ϢCO,'/v"Z?3Z)9 }bv^I9~ϢsjcvFѳU,|ߑ_EٵڄH٨tpm:ժuP^jmߐ_HW5":FoݵWҿ7/kjXWN]\ 0KE[Jm-yie7 g/vUMCT1M 1cX)su~Ho6V4_rhܝwz f6t+^kSe/Qd{uj;]![[b]&S6j HwzMLCZ ͗kr {[7*t۫t+e]ft;*RCwvJT٩?GRͶv>]D[5Z)Ƨnmu6]7w۟t hG};ei'lCe0zf}9Uy GV.qԕTo7ﻻ]}nշUWeU-mXq6{_}?b.`m_]n;~}ʞߴm) tce nvE}^ӵC{n6q\㫊6Z-U*F2isWͱf4J.$ -1❴1kU".#1܊VE{Ol-?ܳzxMSMa2NJƟ:VUn^Vڭ~޿kU-P~=?aP5\tN@ĀLgVVvH"VK:|{ƀ-X>\Z9| { qgcUkٯj^{5Zߚ98ϒuVF?k҂*mvC92/4##{[@\ӠS#zEI%^he]R[K UcXmѻASiS;[>ORw9GKC vD*Uf͹61\MJ@:>>otc]jzUwFsHAZh N#f 42t ?V_k٪<맽;f?< lr&}Wn \#W-7hr,Orhb6Inqw(^޹lb8P;+YW5B-"^ۃB[ý ٯ^QS"׻ժ!3q m$F +r%k曩z+d s*T{|<*0H^Mo[S7^;kH@6|ׂ]^%FH pK[C_+.eW{(A'5Y+3k4RAN98x恋yX<E3:N|u3f?޹Mk} .ta6L65$n]h\圱']O\*H+XAϚ.{hOc**ZNI9P㪓0C̕Lf**l4%Ol+ D R805]RLUcmZ&;g>_habg?B*_$3@t_%di'\}`*lg1ni>\'j| ʒJJݴZQqqaq>܃\~ә8UWw@55/%YuR\Ö*'?5Hk'i;g%I?uzIu9<4i8F)@ >4u>e |W%C82/cF7ܮ}W$|4P , e}5)s#W\[Q+uݧJc5P5JF$GOXG*I?ٛ$ tw1qQmLQ{ yq<>^1l{P+A,J|VtGQ܀ת 0›Kjrs]k /ЄkReG^-;|UF|GCg(<g⩵οkp.E#HhPYMzY9\-a$=F+Q%1_2L\<5Lk ^VN 13ר$4=K+>/!g*[t<}G{n:*8&kKV[ssd;(1( Pj!Thr o]Ug8n=ӝS{c 6)^%wն:fRmVSOe` p iƻЮ g=k)Aܚ8l0c#7><9Z}MgӢI|#<0yG(2]lG a9w R#ejI M#2 ,o BPw %D08,A}5#AƤptǽnJeFN ILNxk\O;5t<_}KAoi$1dN2eS/|Zd'so}*wwiVScyjT:;0o9 ^Y9|p׷[jrYz).rҦr0rV0t{ g@Qw//?JOǒ& =i+7{< -NJ[LJrT 'F%9Ťi?z;o`-F_TfpӟyNu7DZ]ZH\8*x0@VCzs]x?$#P)틈S`@UlqH> UKoOꛐZOYQS.O2](b%cz&sNcbq lGUoy x6GD\ 'W /8r)\^֒gPQ Jm6Lǥ!ILMs޾zmE% Y⡍" T 6L$E7aYw$`!|QHr-thǴEq$OTȔi9͘wQg,' #@ > _0udUt4D:昄O;@'P\݌yBd"ܕ8QE;Qaj酞r =0Ћ:1[egIPɩ~%^ZnpT!|Wk <ۅhJmoeXXwo˙KX~]fed<aZʸGI\GtSky4_Si9ɗ|m]Cׂ;Tߖ8kp!Q.y3@ AҸ,"Rc_K5_Mh+wo+oi:eTq [꨹l}R#VtS4@ #~y"Grp1)N&$iNus7l#U`.-J&Y< 2t5ui$ctC H9V+v BH69tN/t`A$62<3i<1R51mzεC0rdݣhԧntBĎw7jC}-\ަ txahPQmA P?N"i햞a1BjS~qc5֌3 NYD:{u[6WyZf|\?5}]ݠ( HUZ6Զc?uC>벝Wh]YJ{ *=,\/H\ohл׫q7Tr)cY?Co!i2Hz7P& s!8asPAMk;Kc傷̀GzX鑯#ڑd6ɿ aU{0x`.-Nhk`1lZP׺g\,B]OA%vKXvѵcCJ;$*97.).J%yD.&{+5뉕~h~j]5S66ny*71z,խR\ގjʹ5pEtT}׏ew0MŠxf+1.k $*{3gқOHLmc`p|ٯf5~ U#B$wC=ܮuNyw/O*v SMLw/? 1]@m?w-1yaU繜Ee;sJjTY-- g{ϳr|q0|nZ YMi^>% QeٻRq-nePa5Q$wshT鑖26\#՞Fn֝ۻϢցZZt[tGkG>(gh :pȷO>ɐ%L']B!Ԫƴ.US k\i ƗBHD,:wc.GtG?(b?Po!S|Qsj3ztg\.EuXʮ>Cv[1DgfA vꛚ{H,ZTvU?񾪭69@g Hp@9o[RXݪ֓>s+>֏t7P m}"$ABOZ>8>m!${7MX:|${`V0ɿj425*-%J3->]r09U iR%_4t'AȉUJm<}7TpjRp ˏ w2ʯl0+:9vaRE0Sk=ѐzT\\P(2[U.eiAlG2Fbqc$g?>Zi(6yH@'mQU?()vQ.ңi2>D}\QsNCO:A]Q{h5sRC0/'=pgX)6pB\S{Te7pV0{ crs[E2e׹Q<X xX Bg3 摀_J3>ZU y94Ve?ITf :&ӧPZ"GcԂ=an??2l"=FI.:3PW>"4i!5gX: Ҹ1uI ngP:_0>+TĢ(EGV&s h!P常PMsxSin>ՠyߚv|4R;Y3ODNv4pBBmKMz֊{d8GEQ=p̪ӨƅlSڭaFDr-,B*Z5M]woǑ )zX)4V;wȵ5膑ݫDR> ΌcE˵s;`)/}P+wppyhf[37e]JhϡX'n+4.F.u۞&}[ q'O:t'j4|v@J.UjPoOFlML $b {yWP sPZiTb|]ݦб'<"0uc.tOܺi7ި:^F3V6b4\ AO^d9ԛ]6zG8h;'ڂjRGL>jS Jq~URݫ gO'/1T^ !qիMM~z)6iW?wȫGkkcծ*oAΡAR/lG;B F vo)Out[3a0֍H=P3$ Qu/KIx" OW]BIndP6\V[g}KR^wokOhlVZC MG WSm -:.?V<=cTZ3Tk.+8FC>UIol9m7Fѳ&S#M޳+v/sqCm{@1 م*7yF埂vϳ2jpF8ؔZjҦ?O-5:ӞU*<9ϲTN9A;O=irg J݇SRcip8h"2Z$Ap_XKhz~As5VS!0SRnGJ}:p6cw澕V8:Xn7-gI)s"BIϐ?TmH )dwZ@+"a: ta2@nn|9 h޸5U1sm >Hi+3V[{>hO U-S*h6`u+:nH5 4+\v7;pT}vt;i6jt~k}wB:B_Nl^GߒRnOM7?iZh:ҧe:o<4+OAm$QI}*[!Ft^ImY{p =]L;ζe@zAA{xiT ڍ履 [, O~?qTtRkKjTrǁVip[fl[Sfex9)l,ٛJ'4}6$#F|ൿ%3 rhĕDR~Un7 pfY:Gxg 0~0cѧE*K)QAA;vg?BaO">[䝳Xh[߽[ NlnǂnNV'jif`YSճ#т< vCNYS6@w}bYSc*G_hs1@-e1V|JQHx3s0U> Ck c T'I{ 5()A̫ ǿ\pDNSvsi?+O=Sd,um:ߠ \wut4U}*M4y>Nj^>WqVGj֓Ɯ2SXʀdoR;')to!\O'!KvQv]՚Q3Vm Lx!7;CPo>~돜 n<74' ݗg&'lk_%'kVӪ~Aڵo׶3MU6|,h:KyC B΍cM7MpOD*QGǒo{zhC:QfꙈMpwN>m|R:gU 85AJa4Up/x]lq^3N]N_-c[P9OM닿D"uMӒ4qOT|O!ݵ8U⭨~Us=- us|G"Ъ>\>هR~rsT7kdG>qwPu:$m{H[͆o_/>!8L*VfP^aG?%CfK}f*CpJc4Ӣx>l"FENa8L{SxRsIy{&|"}цH AL~IK?Pf2UFZWʢ݆}QugmIѣUfGfh+QL~h 9omX|a_%xaERA@Qa YO<Өllcn%;~5SF1\y w&^}ZHx~[ʕ釗Q_-gVqa3 AuQAh4m.]#/ &nK]N [m9iUziZ-LG׈q5gQ uYjknDvgisU(Vx)nk8?O_S{L=})SorԈJ?X_$ݞ+6=n9 :8ys_F,etUHݚϫ&> hc?y R=FN[8~ |nk]R~Z\VӨ1Y 7͓ ސ涝{vOaM5@Ҷ[K_H;I^kIx]F Ϩ&}4NE6#%SV]CyP8>:qjAQoI)K&cN/r\+o]9`w)}?DZM{ R}':MQ[yo8eS`(#[NN`!u$ LtcG6_*PZs/ |¾C 0[=Ug"5jŦt{Nc ڎhJ?uA"Fj3iS1S6rdV{zNeXke*9E5PUӘ$uS$9-9)q|9'iP(hwNg̪UhliI+:Yoz'*ӝh":3]PYg 68gWI[q9U>ûQCg vۖ?e2/ LvM {tTi:cOr/\పl -l {棶tQki!ſ.m#x2J}6w-njQ}19?ʼ-) fHl.׉PNPa sNtJhM|1JCƉձy?0`-|#oy 5Ͻg5#Ni>l85תy/>e*ba8Q&ki@kL5onΉhM] q K"`WhAhOUo0{wMIt*Z!ک|z.{DRvͲӟL;srt:-;0avyp6<=X^oSFۅe_|K _4mm0s(KGjx5}cx-\BTf0UTȂ|Q'Oy ]Gyx 4q:3V`7{N{^omd4,oDiyI3p@[V5Z`]CXHSZ?EU{FIoywg^NNzUEhn?ׯkݲs kxVuziC?0ײyqm{X+ u[gS  _Fu^"\Ԙ{R%DŽzePSt} "x)A~rW}')\+:z^UW|ꨗ;-pxqTc ϱ9T:wP/?D>,[m*eLݘ2uWo\|?[]OTov~BL2wB>~t8\BsFnIŢm\pSSͳL+E n\MN_vƌl4xx6tM5:5=Tu}wGؤ}_ {nIGlK~,vfyB6f4v2V~|eY/[c-D9kWf?=G\m%-0h>.g[w`GWMꁷLQ2瀶xwy*v>($~).+Uo?LgEJx\ݟhSkVϨԩhL|{x~8F4TqffVܥi3FfiYajWHNUV=Aj0o:?jTݒŦthOe _Vjm{EJL=@|Zˮ<9͔ P3g'שk2Sam& PkKr~ApA5>OGʵOh /5?2)6uQC*6]yve ͨo6vw7R>mO~6OϷRs^27^ke[ YX6^θeb Sn6c ] Z.m `u*gkwi?>ϊmc\R9xO xOq-k0UJ $#JJ[NFNY%s0`q5FvJ*S-%hOKlcJ7FC&5ӧ =fۃ gcig8*;rFKmwTqaFppt}6*&ت>q~kܩl\\b]k텠R֪;ϴTa/ui>dGh;]Wܚ )`ӤU6v5֛O:^F:{yN&?{#<-fmPRFѠ<&KT99B]¬jCF)_X緽l_aG=yЌiɡHnƯpTWkUt V$!&k[ӧL;O#=QI1C9C]Q@J\]p t& q @k]n2d-?xžu Tu# /(>zߪ@ݩIMzkكKizy+M]t *m0z:խZ[tfUJu7x惾u4[=GmwsUak=5_Yv͊bӴyTOeS<p?:2<6j/P\;Oب(Hǚˋq%2=)4S8ڑ'58)6zr͕ZϟV5+[lu_fh sO.?560cMv cJ8;K?S{uGh 5ri<[Z r9E0Ƙ"J(s bLFC|^!gy?٨}Rm̞ 3k|Q5RH{UhnOBjپ/NRSk1y\pSY#Paĕ[hhaNC}bl*kܟv%E7OuJ809@eOT1QuZ#NϑD&[Qm'Ĩ5 TYMFdi!'Eժ|U'iT)n4cm*ԋchlaP6rll[^/k]HLg4V;`VM*s>񏊬udQ>5#}WJ:Ҫ6trR'W_N[Mtnx[gup궪T%ӫl6gIg\8? E917|v˴u )ގ6\zpS(ǀ-i'P"XG涖Z=v:澓ꖹͥF,ڴw?M/rsB{hQ9^B)%UV;C LdL?P@>gN| m|09xc}>(;%ݍ$8{TU[*2줊}3 A[gYv5Ϩ[݂֩qmEԅ^qgܫ>uV{]~kcS9{eGU6vȇlu)08B~YTzSb}^_L7B^0IqBHM.;geclT{{/9e -fVxpj`r.Kg}{.>߰| ^KMryk}[3h{|'C-i n=u=Ц>*[H?jN[N,g=z95|q9Խ^?i Fe7iTiHIi;%?:y3iژsmOKo#ϫ8&#gjWkm[-7˧?ckG;FӴԍAq!hk[jpl=ǘ!X\u/-o?iQ7{&nݲT{K4QOjf{ӃЦN ܝʡ”ԡ2{E/O+۲ϡR@FOͪ(S0rm2џ5EW:v'<91OOɨONƵOsfm|UBs.!!R\wRsUiz!e6}zW:_Gh&ͣm-"y>ח@H tCgQytDl;Z~';qi1DӳѦ _HmmZm,&G6nuv:5J"3~KipЮfos9M`/y?%'&tDrPְEM6ZAtʷa*tXfCU}>*}pQg.pQoX&. kѮIwg2!Eթ7׆> Y31xi95h4U?ټlZײH+w86W֙Uq,G\r]36#i;mvG.⶝^X]IˀS-DqO{8i m݊uG#LbNFb~ Yk>Wq3rT$1֏('+kDս04a7MmWo_Mi"}cnA=Тg)Z$_% ޫwx)[_XkDYMxwR^}|\!؎ɨ~6j7@ +* [ր@^4 rO/5n8eVŃ(l΁:ZTzRL3Z|5_^ʥ\SiMZZ;-못iYVQ Shn{˿Z֚h54m5yA~mkV|cksݲۆԬ FmP"h^xzJ iORw.j״FQ@P8 U΢ްGqխMwW3o|uL5&@CTٶC*CA~rC1=Q+Q5vGBfNd4k;L.NRK\wu_LqgӒ[5zV~?К~0;6!`@ [-kbNvne^r"GBU/f3-='T{w ֲUZ%e8}Xv~@QE86}E֪G S?tiz*9-xV&<Qlo^ *#AF#'_H\^i  vw ><Ц: [F4eWy%}gZ $o{K쎁6`ͣY殪xA!K)VZ\@k_ W7wxϺJ6kH(3fi9:L+vƘe&A6Y^y@޸*7g..of#2q!eN : GV7s}G#8m8+*#W]]{U&Zpuȩ?ZX!Y=c,Pe:.>}Vt "U{D̞z[Jb}\iSls|%oim4K'1om a6YӫLL&;. |>Bo HT~p:Zz*yA9?fy0OQ6>M=v|WTquiOl; 0v9Dk?݆@C:-D\ IwB-^HJ4`-L @?5X^}pʸsشT8g+l^nݳx.I+:=kM-J<6hS5v} ٱǘ?\Xvo~Qt{E<(bAkNRlo굶ovGzTUwOh5yF wB ~{p))ջeB5k@nS(AY'v6Kjm`tV(0+78`vpN6'mBG5,+Zh]Y%>UiUQQ>Jlvl;>H 'P3K@Nݚ*wY54DS̛\(loiUcHq!i/##Dthx5R4~]NGZ>|8֫kgG#]|"χeو!HOQ{uB[UOUJeϔuT<݀Y$5j WJ}v<3UwSln:Uph:'wyW)BnLC<2gvrKc*_Tɾ%Eu{Xn)+wJս޳du7j(sW 1ZѣPڨ5>B1s9^UjLD\;u2>iN}* yI^Pf|lq%hkAT6 S8^l\u ~޿ZIV˂>W$+^޸7zF:5B :<<(vg j~kԸz-wGfhdEՃ`nmȷEZuǒwmgtSp |ٝ#)vuaw( ղF#׃Q"ڦ}|i}$91#ٍܷjP' M->k;뺓YS<;Vwnfk=նnPjBQV3=3xӾC3cq;zEϲӢ{*ݏfÏKcLM=,&Gf|TJ fKVqkV 4s?yT1(Щ]ǬvW;\<WSXM6 ЎjA{Ri. jyi-9'ʆ |mj޳Ϳ?YTY8'T,S @QN4R(KfN?CCҸ^I1L/Fװ-! y:i[FaZ4M[KԯIuNzxi#KRI1(= XH%#OZxjnGxe:6 wh,rkLnt^6g[,|پ<~*ylseJCq mi̵ֆ zMW9?W}ih$=K}kit|oIύNA?cx~ki:uwˊUg=:*4*x9VguFm$$)SO[`6>N)ǡލiDG܁5)qg':0cUU lj-UX9-i,kwhfI^$"]84gOX^cێO-u DjGͫhKZycZ$ pNJQ\׈Vŷyׇ. y¯Yѵc\}ci߂~};SәSSyˀZM 9ۂ~2mo)*T TǮ`[7 @6N1q}[Z:Cfu:t?L)fn 9 -eXm|N4_Ot%c\G0`\]>$o& u&?f|v5dj!x!^7L 5 >Z̭jZVUk:Eѓ"L({WOsKT6Sk^߽(#hdrIe=ŭ{g!?3skQm 5 ѬaO|kʀ|42Slr1s4> <?֤t\U$\fd 64Nwvήۋ~VԡB\}#+=*z+R.SjQ>3{BZczt#>ɶѮII3>L#U. D쵵8A+:i;ž&5mo&tVكvzM}eMxx0|R9faS$>MDR~ͽsH0jnʻ'G\Icjr-lk?=jƖO.>-55Ѱճl1?Mk@ {1Ѻ&.|jgEqЯqm(>d?|5Z~ΣUrg׷O,݁+$5w~KeT%)j87ބ-\5MַXFŠ-l<[(:ss(\t-J}gVeE q:yhy8Y?ïSqoTQvڞ #4\xi'ݗ"m62~V˄~jiyGcjtO>p>$U]}gkĕ'hcsUV|ӸÍ1.F.)s=ZkS#6 ;hla3O bT'UZU{ MNP sSeT]#8k cǬjWĔѼD?,.yY6`$1 e_PuMFI=7PsW5uN8Vyt+Ú1S55C^7X6gXx2]iVmtVAD"5zgPr}ll>8*j@v1/ݴQ2[WT,$!94 8IO\w!}%C__GnٟrZhvrXg/h#IY-gPxˉBhTp1)ͨ^umժ@;A^dqE-g6*~yc6zw\-iw#s}? ̍4^jGuM{<\Wzժj;|BTwTzvkzs;]t[Q쾠2=DlG]Ikrע,quU܃«Z;| }/V5U^|뢥Q6Ŏ+dj;QU"6[ֿ<ʘiz"iuqrJ,.k]vN씠iQp? AlԋgnTh?$Oo5 5Њ{J3Uk\Ofϒ5ÕłtNtD^V 1m wSMZMD7E)dhnPZcZ DO|# mb4io]MهDy*mi>:*ժV4o,y&m[iʏ`-_V.k̳୥B(4Ĕ iuP[s&mNheIv%c)fCB~?lУ '?%0~|lHF [̟4G N=n䨓es# uH/RPҦI&5%TBB S^w\L>uo~H3 kU{YuhE D|[#D *l #N)r*͞n#T\NJl( 5o7'd=s0WҧO[tjjQiSZ4I^ 9~Zkmp*GX9XӷUai4k.ZrVxC୵<Bv~joG?"5(8oFGfP 8HgB4"/kuW{zHx޵?V:>_Wp0)dO68j#NͮL} d.{MG]0<1 [lퟪ5C\Y;YM@h .&MF31AsV-o2ҩP駐N'T8CÏp痻LYi3X/<7t:_Fьշ-洲1QHWtqW/q_i-ͼLjQP9xkTmz*Nu cNmȴ c {<0=Ykeī8X⢘!AZ9—Te*~n]1"䦛u@9`O(\LUK+? S:+jZ5 ='+|Vj.> i%OfZE/h٢hi٧ {2J۵v n=BԄ$ѩ! gSwO9Yuf Z##s\"B;c?[7g05&\NcܜIaӢ޲^Ɯ?Qhk}4T(E-}oi 9s)MĢItT6}J\ˀ, Sr\0STL4xv6'[;bU6[> . ÝUjH71b:R[Jȓq[hhSkzPGmM?#\nǣCwѡʩYm}fk:ё'U٫\ݐH)&$31IwZe\EЭoZR}B}0~F-:.:t6 LIq*Z tNn]#q6SF >sX])Tn4l yOcke) dkҌ0 /+K3Y ,Lų0NsI7t_%aYS(&<;tON O64gUi|v͛e vҥQθ3XOg8 i(nVxEWvhԽ6Zl m*.N&O:6Lss/n7;[^GjiK:rֻS_G- ۟' x{%0tM~?`paZ Zi> s$@B>5!g $'2f@. -H7' ~->޿ZTиtZ-;'E "FOP!dk .tYyx.Cҭ50NxҢw仭H0+GyxtM;fz"\U2\`~2tԬ<̦y/ژ8Minci;c-}pK"ݯc}Vm͕{;4We[ +{d,!Voi}YÈR>+Src<,c4e[cUuŮԝI*-5j?ٶZe]kU;pujqbH"gJ2):1?26@{0?5otUX #gـ8R`kTӋlB6Tv`)\M- לBODp6fBԪUG/szB+V;e9p8u8}(<&Hw\-Vo2."09i*#% r8*Sz&-CsM H% 'l#a4D<'-Cp7 @15:BsH{> ;xm.*PeJj,qō1]a  mpTC $AoGIMFwd;N-3V_ 4o tLdLN5#F˵T`>*׊8N ࡭5\j8k\5Yzv<*m7]> 8܏*ΘA,]ЦSڪCdOxS2Fp$%R\2w 򕱼 :RA[C.UȪAah'PV{U 8p' ۟=R`uɵkt/=p椱za] ؅0:4.m7W+?,9JU:~׋EkvJiԕ޵(~..<>p,A78Е`ȉpW]ѱdi6׸aOQPD"*=WZ])#ef2y.ҮMp%:1Z>*M̮H){.kL 5b tnUIt)U$fD3AB[.UK/M ~>rlTm$A>c 1Qu]%KRB]+X-%CƒM GD\ĸ)[˰4aCL1i]sJcK_)OxhFZ3<EQ 5%}\ vf^|/몯L7^(N%T籅0l*G%wwat'PY}Yʼn'ihuFcgk2uDϊt1sR{z."xKJ`\{"F`^׷}QDԬƱ U]){Khp2e[d8]"p-Vc^Ӕ~࠻1Z>]\FP;$ On`쎝 _jYcElrC\U~ǒ:MOw[W~+XYreYk ioDԢ<*EH/@sPЧ gx#M"m&}vA@:ʛ\u\4<4%Ksȹb:uACWeI9>x*P ry]Ah/m[혃I*b4\C+.9,4 Ь!DۻTE= @V=S]o6ƞ.~iP~SMWQ؆۲CCL+{AGy j]p#T[>DNOV ٻX)*TΎV5=V4W mīg^H<axjZAT7c$ We}psq^צ[H\qk)g8TB}*t7op &S*Qhf'бQ2cO(gۻ.*)Г}9Ym,^ׇ=˅Ha~:ݚtf .;<+POKICţTK(u+7U\1LkܮpE:m3Ъ5 ? (>=k49wLH\wm%'䝴VpZ #oI^Zю=]c@ A 1D燽Eu8.{tsCukPKPo\(4h[U֫e1TTI.eXZda::tjzE㮨:\/x"ȇwҨ$ܚ5ֺ#fǷhG}X٭Gk0t_Əe*]>Z5xj>L`J6s_jT>2"|{fp^Ɵ'Q@P=ϬC(T^7AMԓ*Dx,I?VMe7ã.' ~gjh'*!b@:V9+,>)\o$;Upp񥣫eawDo]]oLtinٴUt x*RqP4)y dEsم;y Q4lv]ɰdmnTc=';LkɖRi+pGf%ahw-BC0P:CGtrNw1 co3R*bnt|R&<9.}Bb.).]N!lgeͩUٷJTyeME .'&Q,,Phy{OA@mĥֶ=A񎋋O kQ$IY`wF) *෴ w6d!Rʽ FQ5F?TI'0k'ǒß~J(m={ ;Jӂ:`J۲Ͷ[wQkn޿}'K"1.*8Xw[ w[[O"!S.͚ȑ|nv9w^JCih\ # tǝ=hBs=絨1qsjހ\\G$Z U6w~׊ xQTF\ GujIW룺*k(a9wf+ODFvx[ lCgk]UXUM7.?$U\cvvqWХL. ^̬.ς4{5ZEd5WUj~_k\/HZ,X.T;UzQ>n֌W{M˔bC lw-hUjC[͛fyw-\IR1qSݏiG3mJ)n+J^dpE@=8WG{ǣPχM  }:ܡ߼Ui5ҠR\epl3푔 FSզQкwNvsDTk}B?Nֹ%I.;!m=DP&dGtҚLB._Nݹ &*5mNWqO: kO qU3ɡ6`"Z!Np{2W ޚA4;Pv]|^[qRh wq\%\2'(@k\[_VJ4|[rܐKtx3sWFz .Ni1A_8_*ʔ7NZ ]ՖtXj.)ecZ.K_nv.k=z}E^+P|{uVcimu[hwZٶ:46{ [UH2tT]O(ioGd#_B9(:Udw*O[* uWt/>ݝƍm]fҤH Xs23\m$:<, Z0zʍiZZAc ]"'-:;OQ^V6}Ѓ*SStI;%n͠hTTX HGVӢZ/n׺f$! u& F~% ˜P6s3jnMߺ F!NUi=+UEF8 vZcPyVg#Ҥ^Qޝ_4(v6x-pvY.u6(ejM>`hcJ״}V;>}NOp认g\W 8úvgcNvggur-7"j0j~%z䥴SܥޏUmqΟIHPB e7=vʋV5_>Dh>J] ?3(ơ8Dz%sP 랧rBD+*Oq)'zMzQD;F(ӫD~=ijeQrAPGpԜkMr >ǟYwg*]Cv`U= ` ŹF |̫qM[{]췈JO~]3"ݞc_ޮ4jm2  wi?$]JJ=b$VGz>I$M[^u' -{~@? W}l`ghpi<ϬBxFy *Q;54?Fr\uE&Z)xyC5uD4v1K㋢g Bs_p䬫]dX}jUSÓ* 1*mr 6n&uv~;j2:ĨvB95mAD:]Uױ.G:Jq-Uk%8Gg{z0ڏsͺzO&÷EGQ|I)͢4#;s)[taO],)k v\U2ᜦ6 sLK8M*"B$'VB5(u,k]e$`6H Q㭼?o*"V moʾlwW ٩! !nQdHvŲ_mL?!6@{-s,vK+Gɣ_XZMOn6f4-}Sw4Q9$NuJcԟ,c:*03Ҫij5K-y0xa=V^qRdwG#y-x\ܭ/p Apq9acC FySr&z8}gVxݵ(A͢^%7qI2lch[DTpnH ^*5]\ދM|,wۢhI׳s*IY*%A˳@Y\8ZQuG2g mS/{C; Gg* .рfj@ EZU^&zKScgBԨʳ<(:ΣL4猬Q; yy#p聪&EwF2ykDz.h~.'2cxfzfU1\$g8qÄVs`#!k!$[v)| +IѦ%z79 4yUJͥj~'j쒴+N {4ZxjZBnU׷U-{yvٯgYXHVP E1 zDzpQlV*eUNNܥ*g+hm/ݏ֧Eo6_YO_y)6.T`;.Ql *=.pz:}-BagV6 >gVfDZc Fzo3. GM6'Ggԝjk&ʭ?Uh+zPkW~|ת{1QҠq`()0scY-tz #ܮPd4nYd7`yBox%D]N4= LęNk-<]{s)(#S&qrUwg4Sw@$D(׀Je Ӓ#8o+x*O @,cAA6%zC> S@LkOy]a\1(EyhoMX+`w5$xp?㭟!8=MWef  KtWT@PB*¹%IaP#V@}vS͜,ψV$A2sq:&x}^78H:j#aw4Vm']]]()iMhF1|,*0<Sc]а֏ 4\[;Ok|QiVYae`cEf٧nifOnEళۀVg+E]Q EJaOBiێ//s.9VE*loR.2Y`x.S1c{a(WtLE JlR3BS6qEenDD7 cLch 7mkS6zդ˜_ Ry$碱^6]Opz7K&UaϫTɦ} :HYKVT~aN2j=uߢjN%ܸt,^kKg䈣UcF} nw]u&Ԏށ܉/] O}#Dj {Bƪlib 5 mWt 1MuREoqi(5Z<`,r7*"97(({ iK~jjS}9Tr€eqKx<SO;WTLH<8*VoU׳#OjVjZ..VE4vIwW$Z.zPQuB\zB-Knqy.LdGN uFhwz$ehXFzax-I=IP0T5W.J2wɣfR0%ZͳJ~SWkkTgrQGR{'FP-4@ ]yu@>{֫vfF2Z#ބ2) 9qPi۶Npp ;N.@K*Uiy6!Z-smqMЍQjBvZ_Zh_ȫKdHYo)XW'y;ykӳh]Ҵ\֋CitZz.iṊ;4Z};4ӳEBy\Q<Y*a%[~=cGU} w!0yR-IMkSe10My( Ec=x^Gzmg'K?iSo{>Dz4?JMGg/c}PA](?ﵧh+UW{M>ٛPe*o~g_=ػ40gZQoƃ*Kd#*h?6/oU1N|Ԗom>v|<ԍ#,W? -/n(n=0WWtuv>|Wnҗ#_{Gj:1 hL|7ȞhS {.hS ֏X=hH$Qr2[ì4vw"\֠ HV^.)}TEY|sMT^ٺ1/X5K}.kI¸E;d{ѧV?H5榳EAjoU@FVv~=QQ9iӳ N>ސX EZ~EZrZ-"aF4G۟$1jVCDr t\ެ[LJ+ghZ+OĔwyġq `)ӧ惦|V2W첍7TwF_vv= 7F; pτ\5$h@V\~K9qԯISuAG Wx/rE!ϮmuJ6\VVwTsF鹹uzO29 anV`_k;l2B<_zh,;dl:OFE-uOH9ģGg7IFO 4Z*WwP<]ǺAiwvS,J IYYVB/Uaa Ȫ"^ݍ,\D0>r=QU{!6-Ѯ;b|{sm}aޞv&Lh 8+}Jv=֎OY"}o^?;4iۧ8¡?(^>JOݨx+lm!RVH V7<_8~HzΌ6Vr.[:usO_X껻w旱[Ih<ݴ.lbVV@4G뵍ji7~۱Oa؆[7Y3w~ߢ.w,LRz! h9(lgMeo>ef<HX͋giw&6gBV7<˰Ф. u=?'f5~Yznq$ˌzɽPNMM։$M& {kO:Oycm7$r`Rj.l-Oz* &L*0&NNYDBb.jmv8Je7]ɾ8@i⎋kQ>ZeZ OD03DU o ?]ꎨmXXQ-=/N^}.=ONvc;6$(tVy<^a=~9F ^ <4>?a1u8 yždOFw| ^<%waNC.pS^^}J ,0h}ghmG4&sjw06v[sFJTT4)[w辩R`Rʍi4#^F EkEk%Zԏ8Bws\ PYSZgCcuk5?yIϪ y#Qv<-??U36Ӥ6k|] f0]s> ꔜMK. oR6:T *ԃc?i ;FE'&)[5sg4oxU3=+'KuD[KDY1n91j xh|ӋMc٬qx"|a *t=ZǠ{< L$parKKX6i{zUF+l?S=B'zNvx3n`7~\r'ǒ uz;VKy:>GB~k =ghHLqSʐaq{ :(a东xpꦥқ jyٻkE-LSnyE}GN:sTZ;M!^)fTr 4;=0=&n:d&(c9l|P鋝py0-)#s4Ǵ]JHǿToGy=JÒ(ASnxsw&q'V uwbanzxUف7ɾ I͕ ΧAԦQiJh+{A6z>ԧySOd&SH[]'[D]ӞZX RT(/C bc.oH[]Ϝ&kVEoE@NJEY h3jOϵcŽlys5h{A7ibStϟ5k;MO)Χ:wω(e/Lw+lHmGo&4Gbm}Z9tݹ?#ޮ= Nɰfy@Gg)O.oQuA}3LAo.oi>͖t5ݻgl`Zc_peǯf7?k_lԢ~ lS:ߤqvFlv^Bl;^O=V4i4?cr++^Jڂ ?oO/$dkԴ8.DZWK9 9t^ꐐzj-v6OmKwp0=J~:٩P{W8iX_TF Nj$Qvzv'+iTSj=1WmsM )իVϊDp܃{M۪maTf:ktQS@mM Ojme5'N)f.]Dǹ28s=[sC'4omQE*qjRa6NpL*3Mw> h.hq~eSqkMi\}I6{dpUgqW,,9x\8a Cc>*9Ϫ39lw?k}?>gTte?el[.PP <@vmߟuZ?Ti⛱S.몫0Mھ&bt=<'/,(ի"sK#^]vpܒZ+yowgdFA<]Rm*>촏_lUWtCB4[ܞ)) ȣs<ʵpKc4 rg%ƨר0toQڟSmܦ8>nrf7<ٶgr3]{϶ Z g.kbKzEkϢDp'Tjj1P uJB\i[>ٳhmO}{cuinY-h֛/iȃ|rOW1H'Z^ݮ<<ƝֹԞFe;d{p!aNJ5+踱!qX^_碵fE-NgN;2;tS N;sUjZ~ƽ{5c +(c<:JBU%pi)w\d7o+>A~8 H9T -yh ф\z?W\R@ҥ4bO^EMgamUGLuEKpԃ?̅ϳSBºܯݠ#ޣWZ|щƆ<Hg6Hy04S s F@ՒQU廣M{<ЫU`<44@hJhnv:V7K:%k.'4j8ˌR:ii6 Uɱ=hy0cT| v([L5 )~6Ɲ|SXر3 qkKvՖjyFJeTI5v\/h;!?i{e!}g&[C]RLkqf׳Q9 ˒3n!bH嗸7z}h*XIam3qinT^}ni9??.oiN6q4PU?fn9*:s[VVcBbmQeOUoTk+Ei?a+ -+E׷U}v%fZvi٤gO+[Y"s{TGiC.TBl{ӟ$n3S9[CNٟ#? 25)m}9VvykEpOΙ_V3]uq4UoN-hyeZ>ayhfrB -rB:-?4k٪Z,VcUsd0G%1#0骹_C3Dﺷnz#<oO5kLyqt ysN7xH:1ހMs(z4i[N[A]YNL4quƒZ;A^O[qӪI>Scj2B=q~j.w7*Fm ip.3 A>.N>h$x@R^Qꑏ\L=}yb[_. *$'w]8@OA!5cqoz)G0Mkm2anSU]1\ ̫):>)}]]UԦyS-N5sFTYJl6x"HBԈ9Ftu&<ΐXAhSBn<;9 #V9&pTG`j-L9oq tkY= -էWR8Q09JNu-Ɗ淇%"?/M]s@@s䩺pC+ x!O # 3VGV=ɷ5}R;|By;uۢfpjci>xk%ccgPc%JHVaZHTq4y,jZc]ﵢhꂂ+Yd-{moIp,sE.ak iuMd*wJxmkLS%o"tZh!5R䷓B4+(>0ށ]75ѳ%UD+B/~&NJfp ^I̧WTkwLK]lL|d<$婖w,sr4 y(!i!\8JjFsVG5Ǫ? ]o": ׶AUMiI%iGi\ٖT״ڛ^(=$H(dvd*!5i?E<̖n[rNܿ{Gǹ5{wp![Mΰ4΅4U:뗣3`s~w0KJ jsWx.ZB׷Un^ajZ{9~E5ZEeGnO4Z-;4Z}v۞م/v:+h@,*쀮{hJ rFy :c.h7dOm{s!o2 i.?%Tr%A `BS!eQ" [@.\PKNAdZSe6ee6Z$e y*|GWs(kcQt w6i=PACy8*綬Lg)rV30or_J{Bm`\MǎFZAsVU"D09,:C{?UogjT=%Io(Vh.4 [S;o6z iDŽ(aowcA$v{%*|~5+WyjS%s]嬩}V Zg\З-gzjZhW?fVVb|%6xYz E[Tz.&(6eorZ| oW:6>!"ֿwW\XR-SH9)gکci٧f>΋N;p?a2T8`ci١\eqXjYYGwLgNZ~sQ,eO5Ԯ*¥Һ_% ‰Eeۏ5u&7´sV"Jx֓A(sV4qs9-z\=Fg 4)iw2G^爋rMuNyGV'UUF q6.=õ uB_q:iqOʛ~*cOC*Fʭ>J%uUS.&ƀkqB3-[(TǴbZU|LAFQkA ؎yZv^Z, +H.黡^% W5Va%d2 X.eك~J5jYUknoIRZfEӷE0Z- cEnVVEfEqr!~j]؏is+0*W<Š-!\|{!@ol:j!xu%vPfϲyAˠpUhV86LrV8-=2{5Zc=,-V>vI9P[3"a['>(I]{wn.w(Ac0Al(G`x o5|ek'7st[o˒7cs2a-<ù(%NcsC8x`D *T k:uAt~9)3V Zۜ:@8MO)q&%̐zjL.L`D]M6dRd140j"{VDJa2,ӢG$mv#vk-`r+*EF)Qj~7M(m^Z^_έef~z+r% >?aE0W5> ]@8 kUf%i jcۧgug3-A@u)Iܕ2ve[KuV#@6 熃ԕ kG!4(Uk94Uݎ  lDJ緡CJTBݲl=MP Vgp9+c8UB-/5`q,&0> $}1s$@d*{%9+E:UtYA8$%2rOleU9^SK 7Tr0o_48 N5RqI%q+UWOdsf{Lj8),Smp](ǂh!7F eoMJR?2ֽ->֝TnU>J3#Lyƶ|ʒx$wa,an/iH굅I~%sԭ\h,}`vsZ->Vm^-M淵AXnUVhWyH].珈P8HU֞F1N H0VUԟH000 ΠFVfOsL&?v#GO" G{MD]I`uΊJ'@qT&V)58BLSZ5:DqtJt ("= qK SSԅMU6Ԙ8H$ʕB8TT-W۪i٬IDXaeA:s (3=T_A0D>cP9 'vpp{EÚ k|}~ dqµ%5|D~q\Rrj⛇$]Nco!E5 xh6hk eL-g^;2ۢ;8l@QOz!R,BLyq"K;){AoPUqyA M_v g]=RIl/O9#V-w7{yjQsH>o][grcbrmD@Rp"q⋣Tڟw />]>%qe [J/wx _Mq9sMm!>P)N]-5 ޏTj6{SDFg%5%iPr AXMSpQ+->ҵIUsq׶aLao6x+a(Eܮ(E&AW۸|B 7TXwWaXkf82 \ms|;4Xr⡮+9HגײeGhLj~^{pfaW>Zvep{'SणHh*Z^+ZF%NMlw䷔ c XB64E3R#R==t-y%fZt$˾ ˮtO]6j>êOZ(j,)ͼ4l\/;%-M2IL&vp4u]8#ޞAiQf$EO:J:vO NJJAW )^K_%cF G`w欷hy&٨TjgUn҉p5{âl曾eß"o(T4\EgY0Bb^V V0y5~JpOfKA i G5݂ʌBw{׳Uϳ2=f~ӳW h+BlpU)U9j8"mX' I;e[cu'~g#Mev]FcG%iQS .!#딿t*Jg_+uS#Y$Xc Ԭ^ƐRݻ )6sķ32满٪ egRg=SX=Lӳ̭;40{q5 h"n[:uA~j"W"|4_r8c˼GE2kar%4^7Uң"WMt@&:+nv~ yZՠ~H-w[ b wUU*y=;yW4 28ֆ1n(֪DS2dN`ךXUd֠9(\a]OE64"@x.)SB*UsZП%?ge[Vp\ 4҉ٶRsEFKnQLG湭hGfg?gEkX?‰.j|yJNUQqTrfXާD+:XnjIkzTMjH3pRӎ4T6;i4Mr*ҫMTH#`۶ hZ$FV]V9>.4ݬzu_3FOm{]ݨÄ*l'[yOnS;x,G? ">cy\t\.!pVEiۀzw{9~;0;/nhy@4%Aւ;[j `n돫}!.JGmZP{A6a6 8T/zG"amDQ6 ~YXXy_z0(n GQnMĀ!6ʵ#XI]L"t=PZvcws'Bcv잎uamAөnK!oD5ǼU,pۉB_vsZ}BS19hGؐ"uXˌkӳ+!aݸ:مY?o_iycYW< ǏpjVy,?'i'AQ{M'Bt i4U|鬕^.syٙϚ/kN8n|.y_N5A$O%]@t"v]KWe7#%->{ *z·J0yً|SX N nNJWN8  ƀr t׽!Ө˧%Dq'ިZri0DV$ o/k yL Y5ą{4*ZOEA Z8Ou4e OĐIrX?c 8%hgNkn>vii`<)A>h 4K]^(h }W)K*և0lnJ2v<( /CENS;g-nukha5)NHׇqw.#;$bS^SSi N{"]!$.]P(\ 7OD5eЛJ;gGу0?;}# p)?;ƹ9x%XVZDOwku0L nBГV;G`Jo<9<->~XpUƝ:Qa{' >jg=SAptZC;߰L}E6*X+gc.M! Ußz⹧vQ̇;Լ1KLz-f (g- [F5bn~+5vl j%^g-;  %1V=H=rг5VJ%_|t绛Qװs\Oy'8vAz!w Z.Yrn=t5O$eBגYsh@ 3rJhav2eic\:ji=B<휪/v8j٘! UFkpNq*p{r*ڮ[#E1NtAςܼ<#Sླ߬EBa9S*֐p\"X9sW3it]{#!c:&k^vaJi:-aw.j] U^> rB{etZ P<, {%Of2dOB>Ɲeku׳U׳!b~ν¸tO%+V궟GaZrMށҦ Uا:pzW7˒.qpHԩe'0/I7W!9vp Y`?% !j%t\ YV[ Is%< W 8J-to9*8T|/24.iy(g7_HtN.ۛV 55 {gn@Ap #L*O&d|\t2R'VOnmm^PM?qFJt tLݣǗ{}dڮh5qV_x^;Qt.&ջq%-*\|Bu;cjVx^^\Ӆ ΋G_ \vqgol.vOROE2nٜb "O ԟKa6'0 Hk稜s]r0#L%wkEw.ryxvBήrsE4-S8M4g)l:.[LFuD=TP݇C|@`e.aTҵ ]pk+tY a3N3s86/9[V׍(]Rqͪݝ=趠5ꎨ\sG]!9%2U:~';fy9Wx\?4ʍHm3k``'X)ˈESvg<sӲgG%E]h[> !Gk,jiZ໥ךGCq cV( @%fN Zzv .w؉Rڮgָuo謽{*Z-lBiٟ`"B,բnV;#OlpQB>x\vE]a):4+xJqT6Ou-W\mzu> ۠my]G౯g%flLORpZHk>Kќ.6+C?c1hqjjx<) qh%\/gkݸgkۢf*>j^`,W9(NϪyoKj\w5z:p渘@[i\+e8{i귴a?OUtr(0}1 uE:Z]UAٯh%9*C<#VHOy"UrU[eǒsiM!9n`#7Î71| 醉rݰ4RL8>NvOG"͚Kr u( Y[<,.@HIW!"4Ew-tҩݕ.'⋱hi `+(*ׂ42~AP`裳\-;9L+t接[8WShSi>KH}G\x'="wp#RNqjq*ihɤu%I Pnc$[LJau,qtw`H? V6qbŠ]/8ltYQoviwP-0\~*OXh>5H\V G(KL39".r < >+h#'˗^ܔi*( ; 50; d(&{8'z*ˎVAp(ɻU"Heq1pTic xKkm^t8=uiNcK|>*NX-ZV%i~{43۪ tQ̒R;2h @hrg9w\<3,wν5(]J)[ ׳G|*S %EwH| # ͧ?%ʴN]$VC{J'k;!p++drC_|({\{0+`vx=(0c[ ʶ~k.ax<)496IpP|x+\qĠCJ$8î=)A9ڕ{||;"s٩. ʖ s *0.N݃SQsfQ9icў1*6W?̽' G`<39N;V~UwU*0b:uAIMnu2#Z5%1]JNpư6=Llp@x'I/+saTk W߬5ċ)PiŚ~iR}}`]( XZh ;]y..% .IR絽.RN_$ !N,zK!g'5O0G=;-}Oo$ͶX:76PsGW;ڦ vR֎R1jexgBԚǘ'梖ǎww 3i 4@'WhZ>Z[gNz1+%ZakvWUw!y`Z*\*6.οci-k`'T ӈ,Ѧ緜a&TE'Rtv9+Z|B`r,,-É6hi37FTiE`wϒt)/sQpۿ %%sjn^kH TJ6|zmoL~z#UĹveBٕLP&#EW QA[aN.ע2-@P1엘 Z!][j/hDҦ'z,jw=m[/ _Umg{![B)7AZ %4cvf3P᪚ͭ{[f';+$?XӨvW7p%nev WGGmsG FpUΤG8ʆ/rOqth 5zJ7n ,JNB֊e}roƢڛ5\.=[[@:%ټ>-[͏i ir)]8*X3\GvZy B|e7{Q9[<AM=nEsgV^'eYTS躭I_yhcی+Cǹ`_)G[L{)>Qw@JӒԎ<-\i+0 @N-YH>ی,ZגwU̮5'N2?4Js ȏ$FtqBֳUL(Eф|OU/u/WW{VNoL:vkԳ s=d?HGx3E6 'CubJm-@p)Y.~ezfYߢo۽Vom@-xMVeEZoviI΄MͫPXTX hc-<)\e5 sZjtN09!ɪX³Q'0fqjFVu@liK}],i=KI:(Tsl-7;2^x3\=IمIXsKK͸AO0UuH:}s}NOLk=ܵ%MF3goZE՟Wkp{S鰸]ِGg1 GPec+_#S;޴iN=/Y}kQ@7nsj1,A)u@?%sX"<׷D.hUƿ8: YQ=\Ac/И?NScXxV6q5MyTmj„Y F=HNd[ 斞Jh}W/N'sVҦ> D^kxWۋ0WMmzy>"l;v}n%]DeTԙNWsÇ28T(]= `#5Z} Nhh茾 _>*ehktP>J~|P 0PqI)_zqu StN|z FQiGMM|fte&- \gjA8ݎK%9̤;<0SqcdBOlZX\&aW{gHU_FTujӯ;pNlDA9CtP"띒\HS{1ʔ.2^Rn w\ns7VS/]v:dXRw[klJC<<}Gxi_ ShQ;CJ[o|46"a1M#GrSܛW{ k椺S<rNcp@;OΫk\Q{ROДmvrcҪ2uŸ⸃@-#Kȇ7exqnJOt9KiQEk;z&Rѕs3c媚SwE1C8{)^wO蹩@WÎ.jy.MpϹTJYP纋p>iԱ0΅x-ʹ1 HsGC"ڍ53%{BtqҳjNNUB4i;u)55V{Z AXRZE>YWzܑ6j.4KfKW\*Mk0T-OezmqRڎ8t[7qkjӲ59ST9a6q% CqGwY2(ʳnD{NjuO](ҭMx_>KNt8r W>cG.=^hq3v>j<ԏ.rYD;+> I3A EVLUabp»4oˋ0rc \PڛPպ! :GZ S]N4UIkl$LFle76iO]J"9mI]sic_ ^ˠWҥ] #Ȫw[%|G{e7^˪z.pٳ>:cH-',ͼkIauUik;c ٟLqť4kv OW0T\L괽/% -paK\Wt[€ X&&V ` E+z"j {cRI1 bB֓(YaqrW.Yy +tQǓhGPezJ(٨1%\ix1KIWSe?njvFmPejai*>%UJqeF<7[r cdc/3oyQ/{CA!M:rЎ_'X^ju vp炷ftmaaH =˼K5ejgԩj(gN< c]sWZu[y;56o>N;Uh4釷eƳP#5%!z?\Hl\ n:;^lt_٪H\.>*dXrvw`*ݺ-w늁Brc\& ֛LjRHjd1tEWkQ#-rꯪpBnXL'ո lQI.taTu. yiQi4j:(6cyp煱 >J^o:Sg  ;Lřkl)a]PՓv>k#x‹GM#ψ@nuo4dM'4c"^DlFX]Ix!Q.*si\ѼuBܴrdrDTw wNA)G$| }}X#ߢX](kԥV)t{.t!kϳ؅uJ .=(^bpmTHnM-ia\_ n3$s Ǵ\c?c+k٩VC+yug뜅"ݹ_Iluh~Wls^};>K|,om~kR6s2>,sj2kj*Tk[KHP֕ ӜͤM6yP_ DYv5+M?h\ ,uij5*Q5QIW߻Beч8\Z'OOgx܃_Z"\\~z{hП^L֨6-G2Ϝ煍egGoDS?c59ZcXikm~hέi!ͺjlf8h jlohmVTS:rE. gۙ!z*u-[R6~XVmVoGUԷ+ aY3'_qUJRְmak5mX{k^ߌ\_z"~ H* 0T{B-ڛ9fT} B¥8+u^kr4F&ؕ!9Y[*)o }AG[B#NiЀΐ[8JfAYV8&sW4"2FZOsRW? 7Uv=@E W91 'K2g^W;{ljRN"cKa^;6w4hm <^kunurWII(Hk\<jL]GE:aQa)q*ewBtm۟z7o s{Dޱh@TCZZƞ!Dc_P,vM s 'UdžRh KIP'1f9!"q"N e`!e࣊SSm547M~ek{+79wn&[xSB`O=҅,Q=,WZcHS?4X%qp>v@eYCb5O_+9s }k{1]TbEh""20Alvq|V5YkЎVT:|0G)q3CCR,XsO"$"NϸwDOIKS`}h?Ui.Pt* +l4`nVLZ¹4΄jmMQg[ly1ܲ;"$^uz[kn<ˑ; (6-VJzM>+yM0&͘(T$AUׂ<#;$,sz.99h8䥥A)`[$-rhztX1a ]TN$yG#vkutAj$S_+Usְaipk;DB;K7tƪZ]>%m`-M.Tr'хv's*&[>^OٌkNg Xp&pm][mM:odǟ11mnJ|\qFap@EKGt];uk X*ZWvw;&SVez!jEi ]ϷJ};BXQM2&Z5("R-w#ơ^t-'e{LYV9s'iP`jCii{5iTFQgEɶz4EE]SNDWȧM[lT@@Vڮw;L/sspj901Mh# kS@@D9uѪٞSNIaCp6\59yAvj`V-p|B;GWuC9ī |L.!tQ<;p. Ͷ@- ;w?g[>c{D֒灤WF.0Nŏ%OgOnc+T<&yٶtNvHJ7ő䡓 8iy1-E0C۴UT=- 0LS10ps3#+:dJiѻ~]t*ի.M ZZaQڇ s#E 0 qG>r#/gWLmRF_r߼Q1= u()\=֒\rϻ2?k 8"T9c@5N[xhSl[@sնڃI|plڣ) rԩ7+-+_|TCkoKH =v(m ޒ"G#E#\j7O/$qςM>`g䯠 _C_BY5XZ̝EKqlr4 s\d 0Gg??l*Z>J2`jVw+ \'?n-M=$knFߺ jZ[!vУdGg Q/^Qu+i"7"W+Qy.QKFo[Za>ꖁ*o>prGq.H9'$*` ǗD[r:Hٷ')<8"O,'9Vi 52ikpncy$I P\ya)/%܃P}* h&oS3.DHc31"z(limA>"}t &m0]a3"M۸ЋjvSVlT)l9E]ht7M}zͦӠ+"eCeU_ad(ԦN'_FIR83v:ߪf}?Gް4T纃;Ook+T jbKɃDnTeÞTS$tgN@Q|44ZtXj1 <9 :Crۯ]vsTʳ`iG\m5*xJ1 :wⷛ&aԁ/EQTS^'GDWٜԄ4þ~;s;akIϪ;ڥ)Lo{1B2v]BAE&VoQRp ƝŐ4~#\.ig.kÆ]p&;Y^bc\oe>Pp umL8VJ0 ? uVl}]Bk+Oh' D.Qĩ=pP^*<•39\Eg*r&y-ٍ6D~eM=ZG棠_ԻR<2!wH?{}ߒ6 q.eg*'^,#1ٯ׳ N\>Ɲ<86+Iss18w$^` Wk& =*=496"@hAш}jٜ;cۮӍs5Sr:@!4\\>]2$tVCsӴSx HOQu{)ŭvrhS]&L! :uMNq5W<ژ>`oē^s;v鹞p-t50O?ê1 =B|,>hФ p@jU>aڍ'k[5F,`SFTm;;_7n]|{aCtQ+\qo<YI=⦵:L7㏚./,iOih88>*[JTM6mno [tZ~lB2F=Ȑ97Xcm74'#$9p}ܾa`X^:;9>ԝV8]X>\Dx-/>*Q:5]@:X׳'UkJ.%Ҹ~ -{ w+s| 9k_otm 5*l%[YV)ьp'#$%4荒棠j ';_r,<ּiW.,m=E( %lxkh=Q 9!I:Mg9<1Ɖ̚E:jBmaϒ~@4ͧEquyyw.3D7F䤋$ܑcm/i{nFȏGU/qqJy@}G*ScEu |Z)ka4U$itթ e(ϯF}Do,s}5egXe0ZE˺t=5`'\<8s՝TlOOs9M1kP[H+*k<3:(){ڽvGpYS-<.cCEۤ?]s8o>;C]KLU~9x|u7Zt>Z˛!_I茒?kֻ\Y?5-qQCt!AzJocH {x'~Z$5Ǽρ2tTJxi[Qpl|a\sRϪWYwt1(ҩIG1"iT16úvAq#Ek^ބEػ>58=A.GYD :T0ԆAZ|Ēh4y{,p,]P}&.†Kc܉apD[)L;+6Ol)Od7oryk:> YZUVV/q6B:5"PݸL)+gS> s}}rd5˲'( 5y= uX쏚JΫ'UI\;3:[Ty1bu$%hlhj|bOQfGBzkd=p'r@Wlj| JJ \RN+$uXDco]cDϻVJL@ZBʑt.TT׳+ >Qc¶6%ʛ;y@f1 's^컪͸kE",$y)?P"d#p;ʱe6 {&y uGt8 @G%3GQ9`WO9͇\N&y)wvt!p;B :.K Eq 0+tܜA.|w C7ϧ]hW (Yޕ-,va3W6ʄn4;ƣ]Vl;ͧZ1 <VYš~3[O޲#ٕ49EEZAè@U'Sd5q$tw޶q\Z;u&?Usy/g4WS'k$~ady,#V;3޽v\'hq@wDx*^_DNt@POTI󓘎x/>&T4W+Gg仲gVg ]Z]& mu'K\BJkyo 2]J)˒|D.K>*^S`SdhW)pp>(|4.:hjTN (eDdN%ivxy)c]Vez69Ahxޚ-窲CAΎg !@ˏ."ܨ[ڸiXY49H4dyhH G94=,oP7B;R{AqoC7Ȕ ({p|2+||!|TN"&\$}R5QQc "ׁ4)9iVT`~9\4(Aǟfa^LNC426;TM»ODS3sE*|jݪƒ"g.ŧgtJU#޿ms8\ڤVtL}V\dHॅXQ٪DbVuX'i OzB{m^oq,z_\ǚPBⰵ沴AW Cp.p@:+OV%fQ"< SPMb#䬣E T.RDBt\ rk!C-@qtQS ާO\ػU%!UmZ4DFMY6](\L.:<֧8\ ŽWjUy7Q$RL+7[+> hvy)&V ̞wêp"U.h17bLqJGz&:7Kd0o{Xav-eai琕4 ^ .aGL8~hq7PZ q"pn:^L+lUq%)i7##T [F?zkiYM8$ʑRcAMyw jIY@D uW!-טy"sQ@ '' GT-w UiE}:oveI*հ~tm\ܼݟrIu{Ix,7B*qqGzSq,WxZD::1k|O5iSnPJT-Ϛ}FxQAnZʁ?W J#ŹךZ߼O_||G~46!AS9*EnzZcUnEF 8]mfߨ_ڶr\ uX t Ec\ǚ/g{"3j׶%E-zjkSoTI/bvgAwEÏ5aBvI#0瀚U7TCĈls]s]ZQv> h :VPIXhO5.!,.s5Y#$Li{qtI@lp߮׎i!]Wݣ%n[h9J8tb-z.$ю׏UlPk6`N5m9qD;F1F&鬑 _Zٸ5hl}j=IO68qLu2']UjyeF+eF59y;部O B!?Tr??vQֳ@?}ʖ8ui-ꦃ.=,?!_S8*uU1,!j}9!(* 4cGvOϒ^eEwIp}=_sGwORl DZUgsॶ)n:…Ю!]пU˨ʆU6zmRD nO\=Cr;<[4׬ nKaEHT=嬯CԨ=MZ>^y\@+hFӳsG |JGU FL,,@L-mƍ3$+h&by&VX@T9$%pж†FA`h,X)/p Uj R:H>KcI+xn'9+ (p`%c)S*bBV T!xk+乫@s jE:r8e, ,8`+`PdR8@-&c]GYϹLr.>H;Mi1 zypS=f|R+<(DR>j%Rh=TQlJa>汗u+$zBwMϹ@i]%qh#;aPas!X±.LWi) '桍m_k vv q'MY[5GiZCWÒUGsA)ϒ3wϪ\m+ 8PcPdbNM5E7?Q䠀ydOd:ΈϻQc˟vy..c"ʖsQk\j_P?B&:ÄZ6`fþ!d|n4w70Q{-z(?Yk˳1`H,#^JAm{=:I";nw[?06nm%袣ZE;{5pWS5Qy9Aqw&ݝVF<ն\Z %k9~VHcC|Lk4 xdRa 7 {ް.c|0N1=q# 8@_q9f"Wp㟒2] 4u )v:^ K*[yH -9΄\2JBv0GYz6t:`"Z} y+5| ^̮hY\?3"jQ ~<@A\W6HPwKcG̕˩026h|IR ~.? !>06er.BҀϵU>\YP jYR in`= (T~0*:ڮg2 -%Ylpi׈-Fby&\ =U9sTp>nQ(j{ AQtJNLQ LI9ZzH-Nh.zk#\r׷i1T4Ez`)9-Eέsk\D{7*8axy;HC%} (wz`'z˗5ŷ0+_C:hR7<̄:<ʚj0cͧD[:Jr-byȏ VCOPuEΖGP$gEׯ?DK gpÕƅjg |ekٯxv~h_%Ž Ui1N +]9[9[|cm#E溄EsݰUh[ .#99cd'_- w \)-kOTл\$52s ҵ@5ΞgRdM`92](r)rkN5c)_f5\k)zX]$~/zg%}CP);sK|4Z%bmrTliMj$4 h䰎P%w-'iT6&〧h;8p.(z*]!Jd݅p1 {< m\J:aw~+NzðnMLN"-wkTx~1 p%Cq\mdIP[g%(Lj Ȟk8xJNlVgp2?0 $)'G  F|kyo Dnoj4X{7[9HCH+9Bj s=~V>~j r-!p>)yi< +?0B-0v菭M Z^K{>!O|ych/ia6sdvnBe@[AC{K]%qhშ?!cht7"JV%dxHEև]5W5isGOS|[uM&P^KKam*TS1zCHY\JZ㎪ ws?5n_}? X9sj0Y?/t'ٻ~5ųΛ# BB4ncO;j..] ŇHך :u5W ,':u-ʐU]*u+B.k.֫ A-6:70 ,""\u\-`hR]r.'ON}ꏌڦt,kvIQUO: Za]s\<VA+nlUÌ }"W1C8Q(#ޜj=4.\7G.Vz U$?E\p>Z-)s/O%y KMԔä\nk. .7sMd\!] HAeWvD\sP{ȸį[L}4)StHpG.v]ÈO亃ok.PVK#ֵ4hs4wԪJm-w4pG^m` G vNkǘ8Ґ:j> {YtFC0"G 2Ӵ=_ ԓmQFPas^Ы*⋶Z-ܽ׶ِfc$Îh>a,G :"i]KeQp @QC:|WxqhN ͯg-anj6W߁֦{,%sT1g>(i4{.k.pk8k.{tJ-U\Ȉ>_Eg+aF?12U/J,{ZNoh>*u跀i_P(vz7Iʚ%8nEvc( &18NsOW6R$/Pǁ-!,({)Y%jiee߆~p>{žG" N~ 8 '춫IܯĩGQyvd~}C\n!^ޚ)'ܟT;- e#P-.JuBj e.g@D.%rZ"Ꮂ9&۴kU4.rhɅ3*udưpTf:B{jWum;P}}7g{QQh\$rgL8Bw5yd( B~1k>GT`[iM7=VNpzo+ TګXtQD\|kN,E&Bhx$Hx9?*0։͎|1eANO긭xoEkg&4s)k1rk(^dnP-$Oqk]n%5v{Fj7˽%uAL]՞rDpTzB<ݞn-XyCyh?w! )Si;; ;*SneckUp} R i=d/IE#|Q3pD;q ʒ_G%;S |-久[soE-}!qW O#gQ7T7~i`cUydz- ^W7p1O._=EKpVEߚZC*gD^r\oѠFp-iƍU"faZJ!LUT3wkΪڃx:r@`B#O%a3 v ])^ʖm曼ӪQݳګ­6T뺦 |Wzr2S-&俲2}C݃>%@(V@<#x3M"u3<0<Զ%;KQze RS]Z&t <5s8-vϾG c)X'NiUz<¦i-]껠B\y"/a7^qwTjSX-QP+o΅q[Vu_٪q(ͮw9Jtߞjڼ.@Xšo @ 0L(-> Xx8&bUyU5 v5.)W,<<7 B$x@\+dωEH)) }M[-{NARa ;%,wԫBi]T. a~n.h_:i=éTQn3̃0V<8\'8 ǿUeXpve|sHQϷ`dJ-V .Ӣ[VIADntr`ti gx{6`R!(*#uַeh]**Vvy7 \Q+٪dAwD)ts }nxx!AsrQhV܀cYI_Rt-BK+hh"'THNk*)`0jBN53@wwI.(FD\޹XX6liʐ.2<ˣ tkm@a-mFVh:WS p\\NE3炅c(9Ȯ<7o8:"M#!ҹ( !& fJ$3\cE!p#?%tGm:_^4E-`f l6oA@ij8t`kyx-ۈ\| ξˤuj"̇YzGөd*fv ޚV;la2]B 4\Px89W0Y% n&%Au0y'ĕ w}j4k 蟼AKcq%y aoKWUn_IAPY T7NJ\bT5Z'% ' Zj6 MeܹI Tr \=15\GkGs Dd꿴g:SOgqJhytZ'VarF[(-Fq]΃+ԮeEf$| k=e'e`LVU"O'#$M:p]M耾ɇv 0hkyzrnǸYYzgs[[#Zgv5D`o Tۉ몆z \Ct*ʖ C$r b}m HI- w!(CI:!ׅ onpHrlririgV7dz78=3uP>{+421Aͤ ݑ*lI5fϽDeEvuơˋeaM%kyLB <9(GY@FNuڹ\׹7(֖Vfr]aR-oyJ=~)3)sdzR踬s\N !ks pVB[]ȍ"Z|V00tL4Ϥ-*2-:An9߯fK(.p[ugF7~ ֤o*):-n]s xx8~V,9O媴.j$(.kzFyhT!`ǂ^hΓ0 Vqh%MT#9 !`'u桟%wef? &{$^\u ?h NCeC(nT1^.4yqrQ20T# %I#QݴZ5TӡLiO\ H1s+=E[BhV2G5}Wya{^!gĢwRUϨN( iT=59*EyЯw" sD ͟yEAіN}a8i\\M9ijGs΁$#9KкW '06wr0 Qr;Zmת-i9MdEӯ4.ڈyLwW9U<: g:+G2D> _L:wDu2GVB1weY^u.G{=ި w;#ESl\NJBK5ֿ ݶk7E:?ߏ'Sp;{LȨOD KI0m;aj+/[<{ xΏ9h Th+:R{-? c-sm% :N+34m-&X,,qޣ{U {Ԝ{E2[ *${Pc*Ɓ|0FtXȕ8YP]∭C' nar^)Z@Y 1P2 kp'z:MoB꼑Sp8h@SM5k@[Ds愾kr1]G+PGȜ,2W(|5|t@`u~m'DS:Fk*>{4#NJѧL`qKrȢcUH@m8wpW3t(O'-olj5h|bk^/gW >ʑ> fG8~ `FZ9z&+R8]".: ᷪO!l+5 1SjRljs|SL :]>H ʶI A;˃-is)+7E7ڢ|@MtB q8 {c]i5ԥSyLsYsW3ĎGXg⃘O:#GkEG7{Vmx+%]a&V4PuYv` qOWG.KXSqcO$+Lx+nZ{$\gV\S ÇெQnp6>5?nzjOEx gEU0^2Σ+= +ksa` ꤒ!>0VSFz(Ģk|$p=i(B7 o/U/%\ԘH42|QZ\qEpQEk&>-w{X[ON֎)ͦlrnY&":C}~|.cyx,ӚW`UOYP]ЯF$W[85t.<psFJ&mj;ncP*^B7Y O>J2>/`tYy5drC(inF_$.tM{o)a.'*yW<@Bu\Úy1gG'ܮ]')0Bkۻs$ofj+ŠZc,HVf+nv󏊷h ÈZ~H] Q{'HVAw(AV XTu;xh Z pR:EH9!{iՍ/l>G1AR,vM.>D@,iA :{IG8 -<q6̻+#r ՂrZeq,VH@Ӣޮ T]Nn\%i>k,2|еʙJ=܋ WN2Z:I5ka"k{4M!kqo= BBU;XAͳi &FaSE<`;\^TJy\ey'u;Ì(Cۇe [G9\]5:iӍdd#cYE}U@Cߵ dTL*{.)-?l8Q44|29E:s?0|Vybf\4F a70FBy'5 ֨{ /HQPINKpߙRRINh|o IY\eP-2Lx+:(rW`lG:em= odW>vϡsyyXIoVhBc qjtMwy8db18 я5ksIRp%pX\NbyQUu85 5k!-gD7Ɗٹw+*P:+w{aO0U$t@L5] i P8ʴ'JsR L%G+ӟ#khK~:_-waiنf Fq1m4R2b}ⱧֲO"٪Ys5>N>قA\NCY:A)k'ײ Gd :+H|{ݕVP1+DE#(^-k)Y'<Jlf%n˂j{< .+O \΋FI*p8 g渪|2Qu$d)U:TgފVGL(.l+QUA7uGuSvSs3% \׎ h^@#lx"@#(r'nEF!: xi.Dn-8%%[ͮIZ pCy$yNԸXpݼ1F (V > $%8O]r##泑ౕ38H(n\ V*S6R3u~By*K_VhUёkiݟWȯ8ɡQw({N9+x=-~u_./]A=G)Ɖ^칞ĭ{9vjN0Qs웯{ KmU J),:VP*2\${3BHCF ֻy=tIC)YQII Q渜M'~ [TCg,ZN7Q$σpa2ewtBA3P = S/ꦠ:c(M-&eéN47gɕǽweȟ5Z@[YIqx1^8jU& *N "5a<$`)TZOTúlH8K,'MN*W4+ڇ\Rt~+.p"1Ш?@80ZO8Rb'Āk\#6IW+֟pX djZUtF:.歕 8BQp?I9V5jOv 4 G0E>2enBʌ>=]k k9WI' YĘZ\< ·>W V4>$/L֎ )40x}ajCO59YTbT~ӹ [Y6* MJiZêyjeLqi3+: ?5U): hNRQ/~Qkgpz3WҪPn1A}r|8 jʡOkZfVA]EœĚ*]Pz O\3&[Bk|^bWNC>iPJiU$qON.ZBvmDpO @Z'Zz ޿Hi:`+j7Y]SGQ|ֵZẇ] dZQVmeVJ)צݸSNk x)]o0\GkynӳUS&TbUKZ;Ckp:]V Q@\6i=pꢝ"^{fWʆ ;;^'ƙ—< xFXq*ԑ$"T5yYiO1Ԭஹx TKrP5[ʍRTM]8TҊTmh&y}kj6V( A(< €Y&ߠ +_\ LvF'=]o<~pBT8-P1sM IL⬐Zt4uOTZO$\$A\A[L495#N &TZ 'J [5-=%qB1?RE'1qv12&0:TDKd2\Z[R5rSKQ{8LJ, ZعZFD؋k A0S9s\$9pGD)+cyw{uC-HϲD)mu<s}kzؑ䷇xOts\ŢW>*DЈr*3W $hTJ>=腏#^R?E{` v΃UmZ?:!/Iۇ"{ - YV?Ԣ>hsWQ7k- hq #!W"a[Eu-C<6L2@vis@uE;Qtx'X ڰGRsDiuS0aEƛ,iu @͠e梆˽Aĸ0tԢӚVE̕2 Dx5U}C9'(zӯ`I]S+o(A9Gx Z<,\!g1=:4դAvZ=! ȹd\kˢV\sjP4M6#20$aT;RȂ8NϣsE.x 3ϱƛt|4Y1­trS.u.De 8&~޹D7c!䷴:2'tktQӚT:\pzJNk\V{zʃ yAYi y(F+@Q#P!imxs{t+r],3' .g% ZZXWZ|,ęst//oGT|Eވr~1` 7oREݸg:ϰU]Q1%G{EshT'Wǹcް=q<ςae˚g?mrS_Q:|"qZY sMJ, 0H\)#Z]NJ,8N %BD8BӓD@>UmbNBޱ9T tW2xPaF [->< )"{ 1p'CqWqW6 0q7䌨sADE*9UͨȄjPo0pTVAϪ'M3(`r F*^ >a6yď[ែ? DC-':> {ęϫ(ON[o'SB}S2."]FtB:~hftDaQ*U$xuE=9\\MU1ȅmZLt';d.Z1 w6N=ȴÑ ^资;#ԣ{,J;kcFN8AsrZ_vjJd]]z"mj{cܸ)vL,𬟊0MVyY—ɒVEoyAKAJ C+[gwu2}Ȃ": q{r9.%crmwOwq309]1U1R $xHa:?1<phr :]M)#9] q,c::&p4NxC@'*uD0y8Q.n#Bg (pZV0 g*jp[O,|ȸ ʸv:[K9a]87EZ({5*lTa SPhoW\eiq\Þh7)-r>zDKLW tplZ!D -Maq"u[փy".^*^Ղ"y"~e9qTjaKUӦuY:iF$JhˡwS'T2:yJ2ֺz p1D-HZ# ӯTܮR_zk fAuRHp3N  |X h~jd@8DyX1:,HP -I$1iW7??UkK_r"ԥIR1 gE3z4m\?mROS˚4 sp'r4C#TL\RNʺ z9wFiA9(4šFfޤs@f|f PkͥYpuW+Ǐ"!F% wJ"J=3R[ #xקO+SC+7\µ=9] nW#Dr蟍uV$VU ѩL 97FSEr!FVǚ!-?@QPg=T>ӧЧüԈwT4 Y>J5PԮ=QR!ѓ8ACP8S4EQ_!1\;Spg"?Uc 4D!\q;ySu8*᪆꦳ʡ*- B,&%E*:$4GV`yW ,1N5.xnEIX[@BʘA.VF2>| 85j.] "V9tP>i쩇/$s}U aG2䍮F= q=Ja36]*~ u)>p2KA'Q !Ǡ1Ku!VOz|I[O!cNEVsc uâq:h$gmT J p+=Y {㒐QdJ vIvŮiAچ]0P .#Bwȵ Cg4ۀ+2 é`hZ&UkPlirFcȮ7p\. -8x-4?gQhYhSs2,v)Φg1Do,=SFA;mÛy+Ў^kݑ|P%hkYD-`% ]uAӒײZg]^gc|]5j- ;;oWꤝ;>XFDwEo:ĕ {#QgBi!d!eƈE\ N|a6U^9&Uh U?8䖅 9怒994U "p!4]q`H6wLYu+Vl=*|xK]"{>TZv٤n%rzu"qh ^L^C0F^J|24+I/:Ve<^,(Yv7Yat.ebYYMhAA&|b,ؤo30<F;ªUzǣ'QR5u,xi'KWI3FWJN%)!, jm/9}&KNjT.W_uXE~&zJ鞰+sEsS%vJJ{J;t9~8$dhU=htHr١OhPiɖ'Z_cYCYҦ@k?6x6 PXg1kzinDjM^>g-ς`/|# xm B{u1-~5k79it j:X6BYzY/]؊_$,q:H^! j +5p9̴'p:38+r *#-P[eNF]w7~-٢F`oKT=]tz`N{J& Lx;ˮ%OJ%v= 3zH0-ba)N9>{%^)@fw&E_@='ϭޡgֽ+&=*'iԬ%*TJP> v =KdUY! G x߼[w,8XMv'Yٽ7C{z)No_/j0*c2Pҗc/O73 5ثxJhӲ@p8Rx4[cp>Cu @+jG1)^,c+k+oH9{dޗNZ`2ϸ=SKz[nwz2:{^w(f- f25M1(vAMM7y~8+utq㤡Cs5ўs{tpCx0aUb$ٯULދz љ )f4FTO/Q>2}+0!v%OIU,* I_AB-솓Y^}=+]Ky3Q KPY:OCzgҽ+{zץq]='bgew:&a~Y uS ja(f/l?Wy]+ӟB71^Ҡܪ _V+Ϋվ3<=q(~:~23RT+hNFb[OQ-x^-z#2n?Y"R3%==*qJ*W̯J RxzaΥҽs MJ*q ԩᘋ2#OiqZKU"J-BTԂ}N==97Uz礩OWї7dW?̸~_4 }eWN+ҽ=J2 sCҠCTҧL>*ƾf?JJrDJ%ϭzcŒ =cp\ 7*}3 @,z&I׎:^ҹL= zWC+IRM7*='xMJ9Ӛܬz_J^>F&Wy3._ʅfXB]E et3+ f$V7P§iU83<T1.}TDsSĬ[W+k{J#R%s+z1OڮWFSħz:J|Cԥs(!_}*SnyOYX.nSkD 3l Tg/V.zt+3)}<{JO3ӹQSVfTށӳRL@zzo]h3>牞Z=Bs qSr&zOoC! Dp~= %ws\Wx`1-# Uu{Jr=:LKRRFR\=Cҥ>^18J&z?MGlUzHS2:J7)*ϩ}?O2uJZSuP. (\ꧯ^!D*UC0*W/pkҽhHxؕqLzl^DHQRUO9'~:OinQlgEjQP*fW觤RISW @~zO$OG *UܤG?]_ Vu Y@zr~S_O=jWi]=~1пT](%b)3rCWy2=$ ;OoQf213T#*Qsֶ|J2)8Q'&o^0a:LtKwq.;Ϩz{LyS0JeN&z^bi1*S*#g8>ތ{N?]2JjJJJ́^p3erMlaL!D?U2%zWJS~EJ1{J%b/,q3XF@8n[P}*^E~=]Y?_> B=JW2L kۏu*t]ByW^J:ץbuR 7zԣy؞{Lau3 2ʕ+?EvzJPr}L2@zcǧ1=LJ?EJzJz9=(1}BcYUTS^K=>c%z@*S_߯>!P<2pߦ?+ӷzV.W>2`J&&SPuOh .WY]ץf;C|R`t?JEcĬs̶bϟL>PG5SGF%NgjD?MJ%22+J3+֯{z3Uzb[*B;2D@z5+/"BLyDRT?VV}N2NeLL9sܤNWJ2a&zz?*S*qx ~zjW' Uܧ3[tJ=10bJ7WԻɕzܮޙaU[smf"3įՙ^S_*2S_JϦ;WUSz2TWOVQ^n+$=)=zpnWiF{O3Gϯ5*WUHx!WgS{W?~?K+Օ3*Txy_U+֥{P3xz_Co׎F:2/|1eRN}<=+>RJ_2*SRΓ)}|N=@?J53Q%~q%J=k kJqϩ^R~ AX뉋TRj[чL7ңA^J=(*T_u=?FT{~^E@SǦ:NeJWRJX o3Y1= =?S7(*~ҡr#:?Yy@y=*skҌ ]_驏V?MzJjRq PmFMzT>WJw3=jW?K~*WJ$2˪꛼ʄ?g7yJ;!+T3D R+LC_z_*SW)Q16$a*kSqľ=fOޓp=/ `W_EHuOo^ї|wfz㼯RRUz+ҥR}AhuD8}<j{z㿥yT]x'i]|}+sߦ%I9ԯLϘbs5*TzOJeKaҿ%~?F!uLI*)|̳P˘oS?=b|4T?@J%#ԩ~qOJ?G}UϦMʄ%OTBmsfY@U>+Д\gRAJgiP?:5ī+JƿV~ʕ~w+әRWz_hkQ+}kץ~=jJ1*qCq?JΥ7r̩^KsDW^+fWՙRO3P%z{~j׭J|*/w^%yznTS'2K3UzT?Y*WGֿx7?AϨzz&k=)SlJ~=.>G?/x9*cҥ@5 ^^wo~dTMJzڿ Cp9Jh15_%JQ\+rQ?ץJeJ? T̿JLzTRJ*bQ(O32BUʔJ/:J}5 ^k#wꙁ+ZR%zWϥw*WG2ѩJlT+mo#ʩj~{/*9wژ)x#ٝ <" @j=0Mم%K?ijg=yee2ޱYG0zWm-~t*ؑh~`Emc1+&9Bh)~No-_\>Z:2h14R:EגI)q+'-fX ->+PesShRGS(Ath-uc(\&Ꮘ Z"w y"-c36S& G=}`^E9x`:u))))\pSYYYIIEQ;\[r 4?>/AC/R` gG02b:&-NN:a$L`=OxN Gs2|b>ߡrF5AVb\K\R{^=NJ` T LUתzvvvGc c~R%l_Q[m[1lEUv4j?jS2\` $dgfS6h:27j{bG[yG 5߬BO;W.JθulåVdA\74o̿L˞e!fFw}"*AH72b^|y{u bw361KS@aBRwY؃*CP P,ω$2~f8QR}gӚTkEG$-,?t Օ'|SW B ̿"K,e!Jyj^ &߆3fuW%{[VNzpLX|(_QA}؋}A̹cv#.\L7~nq9.qaUs+]W>R>eq3C:\GvK@0gLux]s-3 o^vPry.Za_2+Ͽ;XdRwh|P)կWS,ݻT6#~s`lYu,*}`}Vi?ʠ كh<L],;J3:/8{/_B8d-)-_9,*ۜ._N=_FqzY̸ĬJ]r_0'b߯`u=j{Ѫߧz38@0.(Gmέf&\ K.\R޾nyo+KO Kx @v58L,x=O!hAIG(_ݖ =<%Ѹn"}S1)_qRb ^բ\r෹,LIrY_s5o/F35Mw›ĥU5a3t7SF;P D5%mr:rub]t+C|W7)U&e&RWu"_@R+,\*{1pi>VepI1/5֏{b)37Ÿc HECj'C(R W8>YR[/7As߶O4_9r`1:[ fZ-3m7KVP蘃\=vz*!uYm*֘ѯRXK}}.b,Cϡ~~?M%\{JOx 3mrlw&f9;[ԾC^Bs Nf/srr "5b057mJVռJ@}ir˰;á;?*k:sCWiET"Rk+$Sv=X|u|, 4wY8aTnW&K |Û{@Mg}pы@ O7S x'&[6، Urq`^T~O4-؆0" 7chVg X6~9 `q*O߅΍:nH,f'd.nׯ0a Xoq}5.[0aK%e AiNwbh$$пLGQW_[v:\ =||qҬU޼5GڿP@Keˬ~L]7M"-&HCNmg<楸VGFSxB.̵`b' aegk\GZ꿘W-8sg &z{ޒ6*10GGdPP=HEs*L/h}NmIe.˿vwԙA\+-eyfN]Gb6:GvL-|w\%n2Fֵj jق06{ת=F r^''ǃKӞ7$8J&P|ƃwx^8cgb}Z^&-/]u)j~ؽZ1UK?I]@y po6ax!w8OyGqT]˶W%/0˺|w.u~_ .}GX bhE}XW赺_J-E* ӞmS'2x/(Մ=|Ŭ1{ZnU`pS*V$*ŷX,D\5}b) =MEdg <]໿ X,mx;^}R?Ա3W isLFQ~[MZ"kt=\V(`=a HR! ǰxoaR< 7T{P V={h٫C,oͽ潠)׀(G!^zq~]oC r;}lUy^aT`rW\q;=*b ~`11OaJy;.h7la fS=>ysȾ(!ɷXeLdt)T d>9XxFzUyp׉Sgr`~b`C2׎垡 ܶoఈ(7^ơbWk|_mԦSy+̨L@C:zeܩQ7Zҡʜ*T0Ne8z!L¥wp|D^Vq6f5k-ۚ{XǼ!nxFC5uǼ/dkoT2?B*BEOLg< yчSA~@WhZV1DoQhu[&8䅄'hXhZ4 rҾ.عx[d0->i&hX~ju-`S,R8Ԡ.qJvޔ1(Z*rf۽C-ҜIGabS ߙ̢` l%p[j5Pn-Vw͞'njV:\PdP,W_< +1C>Tx*+m ƺQo?fd=z)]>&b1ٖL1 P㘅2#n[)uZptpӜigv qe)l-wiA.7*+~ԩGYR_ץ' 93yzD%a%*_)Bzק1WW1s_yl\Y1,B\Pq,SV;q\LUr~6Pq.[PX<IϚ{##AgOt"av̭]@̪ ωOŮ^&n=ᾱB!p FU95rRd$uپ}r^/3 /"w#[oX32ԫo5+!iAÜz>pյW+k㼔t[LU x"Ve!p|$tܸBTƅ)gmY)hd_Ќ~B7 \3m$u >Ѳc s+om`Xо /.}=\0㚰W쎐Z*snj- -)¿?n:sBs\ M~"EVbcS)jPb^X -U(LgMtkrV*Je90m Ep@SWBq [-T`U5{gnʢ^yz+#Y)y++SY^ޝfwcWG$ŸpވҰuejWX1NMoS0fff}335<-pe/.˗a-/s徹|#yO/NZ^[=2H$HC `(L>-rn ZL>뀐TR<жNbWzoOWx^byܱKR0գ娅 &UUi\yFA_v"Ќ]t3]ܣ,r%qC_c L A@|Ta]ꪧ3;50.ddWyܺV<9Al`/n K5^gˣ1 Lc RҽrJAO)\p{]zܢy( ^KRo (T(=D|VX3o0]\`W5踦d% ͼWHx}햇.UӍI|I-hX(:2S̟xY7We8FY*TBW-AZw'ztXn޳2ܖR_Ty9y~e<-+>u|_A^zupxp9 ]e*Moҳ~ĩD|m* +0LCǠJ@&zԧSM2fbTfhn6(k8Y~&|gbVd(<~!95xZ|3D U,~f:e}ߴ:9w!!P$?}`ӊۊUhZb_S/aW'MWW mdeS@;yh*.fE)2Ju= oR;'<{,7Bum_7}m5@\Q_(j+S#qfj\2r<#é#baC!8nК_4Q}օj%7z:m`bޱA {'\*4vU;T1X0boH:~o"IwoY}px~!rBpqL{Sڶ*E6,:0˄}S> 6 i2WVg%~fmu/.IT,@!iM%,mJ7&فpN̾qTZf=bF22eMǪm`+3u_ЫI< Mz|e|ʖ_YP+>*WJW(WoMJ^߂U{Ek.İ^Yqjm'bR:6}d= ۩hG$=`'dEM/\`Յ~ڥO$⡾T/-ݕkW6T,ƛF~zݴcbnٷO]q r7mUA<ژ>.ƣqugF҂H޳pl`~qBaʱ.pѸU5akSq_J;`BьvY; Z"`e` ]? dixdj\̲-R`MS,2ǹgH c^kN;t5Uo~xUv8:s<ըᶨ=aikks˼ާY{y~eKA>ՋU~bMMou b(hy]VTLw TIS*>"w&a@]u(uOE;/N~ 1d8AD))xTǣ\% +1^\¹J:JJC zSҥ@!Ss K_r\Y,V[mQ1DFL1 vœA`X[Pz<}Nf|8#l\brw;UUf=% c{$`k9+` /#ASU/GI6 {c ljj\85OpA@KsOwzeGg@-N<,3hmc0++&K@>T%KXHaPTCXP߈e$Ygsk!WUI~kQ?tJ(آYfhۃy 71$h)Obrz9 S;g Ow{ T-EYnb+[gH5 ʼs0:9,T1U2e׎+ 0 g*TV*ſo<5̸-ZiW6{FT{g2"؇Ĥ *T7(Ǿv.Y=Tϡz: +QB1P`vXA=+IX SiMjf={goJna~!RІtkXgШ=z+ѕs//:D.P8"S3BoF&T<Kz+IB̰ѻQ[E1vfv"iuϴ1naew a'qM*}[@_R?ҶbGj,5b+&T~8pQ*x V(y|8x{y*Q>#,Vg[g<$#R+R@vs )+T=RdDǦ#Q+#^z(L˲J"=akL̦PbWL=:*Tq]ȝ.mך)f7+c42Q.yae)ШYV+!ƾSޥEt#ñE/cAqeb7Ư.ifxf^}/Hc3 D|qmBo= M+/84b^lac J%7/|ٯ 9k%⌥C(%fz}s/((`yc5^N} *TQt`Zf!e\N* F_z> *oL\eʕ62<^mdRhY.!Ցhjfb׾Vn fo Fr9Z_u c]2D-7P >Q kzAPmVLV2[EԠֿx+/ElQ{l`|J3ڕI)vh蟴": m" }T^Xm^J 5CuVS|Qқ+I"e"Vb&#FԯA}*fD\ 3ƛnYu5ph)C'q3n/ϧE> O8ܹTUJD#=ATW}/\IDw)LˬR;A59HSxi—Ǭˍ4;sFm*U} )Nޅ"CC dtq9;+#lFY>nt$b}mX^t?0Հ1[kc\3}o0k T]Le0MA=}{cސK̲{D!ʛyrf?ܳ/t5o"YRl:;P] ℺UuMJx ?pl5pT}Ul"-eC5ټO{"I!PZP*JeDNKXDyv_Փ5O&Y[/> gUn=Ҿ`ƛ$yit"j'݇CFa00">/;+},TntyFxVLruSģu:p=0";SbvуQ'zA H:w' ܰ]V|LpBmiffm{Rv[?2HSVc)ڟr avF(m+ |܍&.u {N1M(y{=1AovNw {nحhU=egDOO>ʙa{ ޟtfS˕Ѐ%K{UNx{@>B%$Aǭz#$\jf&73^o<%#IV2"=:F9/xZQ> _8XeXIJaȒ8LQԽK.Έ(SRwV@fu߇FSA]_§b՟h8^E3S p7X|=6.L/z ĭV'2Bn"8~_wwʀ3Ey\-̓/v¯G%^j9Cl#6z @*ˊ&T=W.?! c֫0WG*0Pꗋ״j\110k=/ʺHϴ uWᑊ"رBРdVM̓7ѻSy"Y"?` J _ATwnW~Pjߠlf"ehl*ztN3+YtF.V _AA-;ĮlY;O>w `HwT5>@iXY7*,;`v`toc<SZTciD[^n,fwҎb-faIyKc|..[f{=- yKRƖ n#8Zo$b[C7f4[.w0~!׏z+/qM<[ ]jXVǘlU(ڿr`"H^޴u_!%VyG>xR548~{7kcؗ,q ]!h44^ S 88󂦴l^qq lj'9\KnZ,?)u$b/W^(- 2t`+ nz*V}{#~G6Ι^Vw4xvF/2 [a[}( =L->%VelEK|N'7z_ ?o `|JAx) ^Yub:Ep dC]s<"M&ۆzUv"Snba@u3=Vkl<8,JAvH>LPdt`UVG`NK P=f֝*ƹq^ ~kt+7TnfϚ +Ļì=+һI z1=;̧Ieete@.Q89w@zLz{OW y@̩w_2`z(u$.\Pf#fɪ"gy8e߲!)ª(eX?1[ſ>Qp>LK&*9T5Iq0XVI_⦙. >!Q+kL7E_-3ǗiEC*WX<#v wsQobA\X@Ҧq+f4G\8/(Uhb4kz6֪u5,!Q;%G< 0x/M9w:/uk7ݨٔ  K[#1]ey*yE6ISV+nfYl%wq9+_mO1T(ֱ77](-%٣Չ֮]N#(A3}|tw œW=Z?%.bnezKb EzM,EIx\yA Jg ĥ.>+Pw>ugdL< *xЮ} DZ No !*b9Wm+ϠΧB\5 Er}0^F>bO L<.2}g1j+4 ZQ1T{{l@_ųY+j4v9nf cEZn bh5u} y#q_8 [p yh,}IVA:*-S0BtqmiecV„{[g;wXY^ ӵծZ;5EѿUÈo U  [lE@1L_q[C d4 k L|D$WeJcYWBW:C(KV'dXP! 4(yC4Q 0>|+|M2ll?wZw (1WtO0u;UBr+-3/@!p>ɮFBzJ؛E&b*L.,=^}ecugjUjĢT؎O?P@CFh;#J`agxy)Q^5k_q1lWUj)pGN,j}WzyY0C۬6QFlJ~; ciDnF{U7|y { 9vG0-|J8 DOFx`LB.0L.̳c :aM ʲVe7So>_Gy+ ,4-z׈1s[EL&c-.Iˆ zn]g];[rsAK+{1r2Hoe@1pjo\ZGk濰 +X>X)|.<-{fzG})UxPLl*{"0TCJ:yuߩ ˫f [ς0EpG}ʿbSS,LC0K3Ce_ʿ&r݌G2]cyq~(gc;"[AG7:nEͥj,Ti8:ΰzp%ˀegӻB"znY :HӲvҽH%{DJt'WA:j1R P^)ij[hMŴN@X=*Hr=zJѹ^"_wB qRVyfc,!bǀ_ Er-My,\+WByF(T*-lO"~UOO\F3+H| _T ]W!6\rǜl-r%2yf&Ev U* QV;M+ƀu{ho؁eÎ% z/nf﷗㜄ɟtiWMi^~|~q}VG`~&;:JumnW)0s_KTEp`"#8gDc̐)U.F %KTz u}5-*^0pAP{ƻJ:vP%* B0O( D` >-׹RβҪq-8,i_,KĽ@eAt<92$%źLj4p^!%!|ެlQin%21|`V0b+Uycշ@ҕn%][wot8˜k.*0\W4'oywJ.xn[\nt#ivEЇtb&pk`\.#X_*KlE ;t ,Ylutkq G倛Ey_T:@g::|L`fK],8!虿 f8pi(T1%(竱/ՂaJ=CReEMD'5,w\v\AlB Wjaukm=jrWMU^*p緧#["%z*2p]Ιa3A] y\W7 C-b|1gZ8f@e×B+Einu*}bPWa$ C9&): ZVg]X4L}293Uq+bX*dK1tz4&})ue^3=gBW}R"Uz+ʿP(*˃-tPj~eH n*? 56`]UH9MlC؊.C9=s@vv:t7s܁= oũ,a84V^Ъ6?0,+Yf3"R/HbH0~R2GenQk1+S]hew@nxi6룇JbrtPGPbհq2xo(<,GЧ I[k %?0Ē.vblgPK(Tvag.'FJpjhg0a _?2 V?7%>TaI'[NOK&J)eAռ&ݞMmt/Dto@4|uye7Z+7HTha;eH:B5NXW#~TnyVeqc,ӼúAB J%TmQ~8P>:S,6HĪ#XKJ=:%@v%kuGYY^2)q*])k@V&) QBmIS69_A}IFރ A`D!X+z*i-SF"z .jS9]9utWLǠn=/=9K& ɇljnmLY,:4hlx'zMv_{CXҮ71-B* )̤B=Dh]A~٘[֚;J'H|zd,紭8(R R яes%НfȧU,ǹ1Niqiw@}/;A܄͛|ƳTKWJ1OW 04GE=xJ%0Dv CNC%2\GLy:@Mu+1bD9%F=)'Eq-[\ 1N1FWءȉ(As|rN9hK)jw#VE4k M} k,bد9p2qϼSHQҞ$ 5*r-[q1TB2A{] uvrb0S~4][)wx(dj)Aq+w|?jT pFD)C8֍k;u63%kK ˒o1 +N_Gf۲8sޓ0Rxh/'84e b{(̂ !;2f`׾ePY,.O0T}Gt{9ÙBQ*@)<؂ y%vrIX/ɚ<<$ٔ`*'{1Zbgylzw[{Rugid%KN$S2IPݍOA~jcaGK{o!'Wëlp+=hߘ?R'ܠc}m(+}¸i L .l /Ĵμ0z̅)|[;B{^fqY PZ x+ i:]Kcjo TĻ19#[;)r ߗ}ӽg[g:i5 "GV?̊[tRX(5#|e7Πs:Z,4ܳfZEI3 1:'U3}n5>@s7>fԷ#OJl&\h򛡷q^ |rt; /OshO렳|۪tq?&pC5y0K0ۂd6GGiat sH`?"5qn51Vop|͹ehzX.- 2j&/Iu%kp*6D܉ƒ:г|B3DNw^;鎐 ;lU-.ɋpozFQPS0'·_`@zʙX ɤO3#y*ig`Y:_ EJq+Xb m+8AX ŊHNlQ@"ީ=uX#w}i81]"-)8S0sZU+F}yup fmc0@;k @'"M*HJJZ״Nc}L<*,f+_/{Tş9[qB+D:WS7Q /?/w9bQRf0v,> *zEA56Ibx;w U/(^2,>#81*V-yU5TTGhYwt`Mt;F\@)ruJ`^ZnR8;Qfog"*yF™{2dA\qt4j ]s*S&%p9niJó=`wASgWcf;ғ;,JIT;'yeb[Ũ@w4]뼘Ct'= 6`"9lVv>|R Xʲjo&5s ^w~x{ǦZ;(˲fUFݯRkk fA)xbcbYEt^߷hsK[1>f#27ƬSp Ӧ 1칽޴|ܱ@_%@ݼ]-߁ Ťh  ,U nU }*t.g=ޓK!JFZN;;EA#'# (V{C*5)%GGlzvvE&= mt/WıJyR=4c/ҠyH0^q.q<5Z4C.1Wh]]\e;i`E1 jBSpjgl#Qmbmĥ=~ei #' x X 1;u#.-#ρ|Ck Ԍ~(^qR)1LF4yҎ-Rqd5k̹,Be2;9`4OJ)h)v:u\865 '&Rq"zWgr,sTs*F%g'&ߗW@jpg9R^ t t@?0h>q3)-;kb =J05yA<iLq^de;rQ00{V-uŬTĢO<B#0Xp%wRKݿJ']SكpQف iܠy`%kO7-9 K"ڒ$9mE2+_1q-UDUQVN_LME{֦aj&c} #UIR$X2ݥ CIsIFĚ2-_RpXÿс;k؏9x)5&oߙ:-Xk&Ɍa[i:u |i!{Rߦtxx~elNqsURܿ$R*TPX Q}J˻LwxI߇q %=T8 ycĥ`#rq hqTY-E9TeuFAg_4Թ :uR0;^`ρuVTf_x)V[yrU)< w]Cc2R{v%9A(G: c2bO@%0@/@R_!Cx8^-LiK@dZ.bb^>}4Q:pkYbg҈|G"M8%VHopu+:sC2;>w:|@pl_# UCBRuLxf(4mKg|h_KE%JpΓ}u+Y\,Zޢt6_^5W0vc+e9q xX!33Ʌ`202`l8 G "߈.{(VapQ}Hz\_3!: &)MTkwx.3.z?Xիs3sVұ,%}%,H-rwÐl{oǚ2SǢV,*]n/ gZ 'ȳY XcqTYջz@U\9|8GX9p=FFmOq.] 8 NΞ Y>kU2ŽhgWb^XG2jHq=df\PU,-J 4H [@/F9Srp7.G, ҳy[ݦ/S<#51 YiXjQQ1,O4G*g%up>-JpVl9t!l :s$:%b=qG\n0. 87̺:KmqwaP.p)x̱&1d=ʨLDT1Q`tJ֗+Dķ(]R1<[ÄY ZU'(Kt%!@:z)*qL0vtj!3^}EyF2Ít9WT?x^pF_ C:6fl[;Wk&9+ 1aT+7]#קfAPZ y:G% }Pqs*G| k*RT)|aUk~bnAzEktn ωN*` Pd/*r&{t|M+[A,Pt,N-rW08JTtC8eXUV] uv5jP)eueCE] LVBSQ4nJY)~QyE~tMVj\MzHX2vGe)YZBl`t $D:mW>NA%t0bs_)zt@!WdupH5̤Kf\xTa0We@76$Px*#:g|ï5-8A`QݞDL.w:8+vX!,p'b`lV#)&ܺR&PG"KMExk͝X:U&x 剶IuCs%bYrixȻɸms;OlBDƛ@-bnLe ;J9,K%P"TPS L HԸϠ9p!kM<}f,F%ʉ\ʾa aԢ^p. mɟ ԛ5 KkE_2ix f.WYd vM#˖5Bc\9 S  k)n-p#IQ5 ]CV0ÖYzC7Z!8B S]SQZjn$)@T~֔K#DZ9 W>NKՔcBL㘇j$WT_!^b*V  TIN-bX՟1:q NX`tLz* LJRB"YT2ЙGN+)75@PƊb 2SJR `X l_Lh\* ,1:-]]aɟw⢶7;~a SUc;NW)akT>"C]}J0XG #a3!|ήm N%"喭4 zg;/b.џ \嚻'tx%Esz/.jau=N+f!߽1uX.f+XÇV'' B*]js?f al#4 >R4x0A kCOnCdI{2 ZWgΐz&%,\+d!H fhi\TN2 mEmK`t-FH$#.A/$8G:EaK!]b|/b. вn+6Dkl=(ͿÛW`F!rŗLfݘ&K;g'dYZT FKct.P2YNݱ+c9x+1oh'3&&UB46KȚ+PT=ˑe#}ʮ)Ѱ  ' +|Wg/uNk_ljd:Rve%qwJ JX(X{pcC[%g,4!A 61ve E=TaWNe_|' R\%80T_0pbx!,Nm}ŔDJ= Ӈ70nqPr!2]=bb'g.sl_-\b<ږj_Io]¼L>#:ݸ[N J@9f7.t>e.b']Kv%&ǗH{u'xs ۹vn=~f%]$Xneo!fRdGRY|KPuň@ q)!; FF.,Cx ) m8e&G$g Kue/A_cV({{s 09z-%@6O |R/fa5P-J#LKTӽucܗA3z.9sS7rSf3/)K["_,ߓ_!oLhy\ŵ^\P e֊{gT5ն?P6.*.ZrW=f ~ 4{G!$EV&heno=w.μ@³+u r 4̅\b(;@ to2jgqE5 H 4ؙ̬:$yN5bSqM):As4(V/u/Љ6GKK=y)®CI_yVjWWS7>,:c#r:XA协CzbSϖ"GTTKƎfYLW\`Kjy&KqHCf8^ rϲJD8k1ͬ (#N715jˀp$YZ Q;ZfbZXc0y1Plk[UCihhpn M #W:UNYT6MiƇ2n7jwX֑N;rAo,ٔg MIH0f ~DK!5>mє}ƫfhvvc= #v^ 9As;5U̺eU7Py~eWJ837n +zd&Ɗ xq/]eמ:Տf s:h_/"C 0Gmi5: J\r=+~bI~5O4t 1Y0~G>\;KʻRDmm# &[.9X4 +AK*kl5Z _07 R@@c!]//X5$gή:.K|lKbse]v,FWA8:áXa8.C/Qŭ 7F=iTlFNveh\ŵ{óy״6|rc3W.+;WQBl7]ޱ`HO _s\B:Wy1m:xzEQ,Wє ZYvP|Ipu.*/OFb])_Q -Xl/C #Y;J:\z_*Q/^YZ|TvKBݔV;EQ'O~ީCǯb[xYCAP)ZCMkkҙw&e`kkf wt>hz9-!vVYs<}JވF)a9|jVgt|v>V0vie0{t(2c? ME199C{ppcqeq.  .G*Pj 1.i "FzkKUBT}:˖Fwwv+(ωan< Ho^_)X${q*=e]ѯ_SpyUrT{lA/4שfu](F <ܥ-55QxJvY]~u{SmNsѴlK"ŇǿS6ljC4MBhqeUspg^ XŸՍ\\x~@Ǒş@X2DӁ.݉HD9-de?Tٷ7GQ9-yrgU+Kᅵ%QkU݌V篚N ǘUzM,v]fnA_KU$|@W]uh3a帬 fx*f,w@~<>SO3->` bLLFր3% :Y( E3Bhv vGC↣"׳rUye~C[ `3c{# JjP>o,וePpxmJKM(eJzBUeJ3*f{seƽ*+1 rxbΡE/u.[rήE XXmo o2cOe)f +aS7n9y`^ҡ=sQuj]~"kW&aԿ@&0Qirc UuzK̋ mf0 {] :rAn\gd w^e-}zi{t'_gyԪ]csV3pF]/pFp# htzup_܃vMAi 1g^.}$J2 1rpeǭX~"' nrީf&dTG1.fׁ׳{t^.ļ҃5_xGs|Dkp:OdS,˃J%٬8+8_jQ?/rŜzq̤T8Ui/g-\xA umI+ȘSQy%L;sDj8.gI.]Mƣ4[4΄ /?1KӾe&/T3`i'X%z !Dd|9 :dRWY'BY<} X!+%x0$9̗{zYg %5и{k}4&:cj<4ZηT»~v|Ze=Z,/=m͋bP=K8D USU}cv8I`QHd&zFW>t+̶8^_0i`b?K ]V`{Y  ԫGud5ܨV(E8]cZ\̜) 3u-M,eoU4hZ3>KY"j;p g:{rN 7$Ee`UvP,]f'[̾"S#^ n5Y[uL` |/lWⓔr܍e@ǩ4&"sx#VS~rɷiCi#CT*ɸ\㚗3(BG5W%s+W`'[z sf! ׼3KGo[DF2Wu^y_G\ϴ\[UuH¥RuZyw3OGx^%cPbK="Ue6*d/55~}GmE⣿#N诹pv?2i^%#^]t5oDuƙ}=,VcFF(HWE\{`FU0 {,#*0WcFAP mqXtpֽд 3؆l&YÐF8QnS%Kʗ`l2#[Eur]me~8M , 忨ж~z}BMEK P)s 8 #d[ߘ'A :2IO\'"F)i 2uy|S-~K`MEVu PAgx⦩=1טb@zf5,\z`M0\84כ\._G5A.gXqpS0G&{2.HŐҥTYɂ 1An\Q`B \nQxq t1X nJ@hvTF5:b>-&C3Uyaq=/ׂ^ Ηz.Ow1񸉠CR.29WQ [W]nZ0O L繨9%4ÉȪo-i5`S-|1؋M!oT!Ams ) (]716wnW(M߼Vs{Cs+PQz^0F91cR՞ C0,;&-nq=e̚@pZ7ٹ癛ȣXAFZu.ZɱPg}dc(JɤxpW?*8AmmE!fhA?w:ц<&R 21YݙvYdd dU?Q_6s.WW&=̥OL "G;h9S9?gsI}e^<NjԱ.w"񊗬X՗j)&*PIcmU6{LFfd<F-Te sC`P^/L1v^Ҵ:Pm|Xd:ԈUK-:;/&f%*<p?b.fFLIz*%i*qNRb."ʃbm٢Lǯ;I/i' Ĭ!fJNR8GĭįHHxCPZxCDOI_Ax+@$:DFFyJvhTeo9{Þ)(CZZB5僮{h,B k/gL_ O݊H? {ĊRb̷Ss 'Ei8"d>eصaJa/M^_4g$ N{mJ''KZ' .B^u1iҚP>bP̦l.g2\1zţÉp1IݝjY@pL1tty~b+䜓 ^ϋSsȵƠyC*e9pTDR<Dq*KӴh/68uWљD֚+bA ‚Sr59mXi y82;~ `q*8.LqbsʚaܜmLjvE}LCюܒ-#Qex]ޓ,(h׊U ~!9ςYebgW9f)=`g-iVpS3u.kbAV`7+VTK﨎4U{h,C"uWUOwSI&f`$M1>%VogVAFPߙCp`W)CgҥZ:ًZ|p@*=Z%՞8a)fd/u*F$ssi8(A=,yN-;t6eF"u}TPsYW#1d9w]u^S  > 1@hRgBC°G1 m4^"Rī˫`*WYwDXJE !_ PNQݤŒrqVgp+%_>Һ`Wh'Z%2?$sOY+Y%;/3VPZp/{*TQ+C:~D;T50^o?~/:gae_:qeDN*Co쥸sʆFi#`k(X3gvٰVqqe@cusp5|M^`pHP,RZxA}-6qҠMLB b{#鐽"`'bQ1,BsP:nJ:&n*۳\*33ZPx䗬f/Z3kpbxD1jNWazBTԺr#o:vc1ʠZ-k+Xe| m5!8W89O^VGuin˶qݟrˡXo_*2q=ٙ ^N(chw+np~xܾRaǓؔ -j],L\as/Fєc I-? ɼ/kP&Li_$.~jتjnG6WN<=kߪ-J9̉{;x+97D]:d0JP+ޯ;.2Z_Cb]ae&Pv w:DK*bf;"lg4p;#z:gXS,! F۷X}7oz9 izO@25%%] `m\Բj3 8 p`u s%}";jX߲ʵqg"PЎir< %ҏu%U>4cJF#J2\)eMIJ.p0S(JUad>QM@'Eɖߢ״t(6H*N,uA4_lbT'pͷ?CuY]̠֏ D2}Eexx؎C쳩2dn+G]|Bvs_|A:j¡jRZl<9uPV3>`,2#tx-7}$|/ߙx䏸SH==TFw_]+3K0a˰W=A9e؇ Y1-znuG+cʁ={fާfJ`tfצ'YP|fƕ楴 e\UQ@0`3&,;;`:\WJT^G uÙMMh| 8K\M^C5U_glh8>eٮ Գt%9T&.ӟBڈZ74ʍ9;kafa]rK 7\A(3XY~]o9sfCɑpyf1Ne+7 0(G'tfπK!L7FXtnDu<NظhZ(n1hۂڢ7eQAh8 ѫdF]*-)0b ķ\>f, .W K >cFϙH)p9NcTv,OWP8҇!Iy(^?0Zq^W))V2ꦕ031_}>~3@a/x/;~ ,~*rqG\* +,DA=~ q-jDVWdZ{0c׆.Tp`|+HfCrE>!vUvF0~z4Hұ+1cArUOZ _c8W'>Gz?ETjjX`tQ^;ʌѵ?ҡTѪ_c—{@n߼:6sk8)k5!XPqW,t?y+8̵ f"٘-&+w̠ܬd.pstt :88r؜`SKO^in'EL(EP\D0k\usPTػN?ype+oiCc5|O~))UliyeJtbVQ,VVagw슚0*XcPwUK_QecoAYdL:Q_4T?3Ox ·(Jpܩ_eKv7*8h&K@ Z]#҃9fR1KXEfh}vtK_T4G77 wlK, ڀ6p9[(IJ0|C,wh]Ŕu>`"cfꟍv/uc?%nQwEBR[q!Ļ` \S[/n ҁnozd5Ź-Knc]qw0Z.;8*4X|K>йBX}@˳G/xyqcH6Z"K< M)(ybTCYJ;JRSRL,D-RLj-mm5de$tTJ@T9& BtB%=63 kywmo|ƙYy[&9 B^#oY1C:CfC GF7 EDvp3K?а9F&Rlb"YQVәҾF:e\ndUfynha)-ZS2SmVbՙm1[r;^ Úe슔:q CڽnJUU鷩1Q3F*dޱheqbVKz[j1\`99|u?9VŶ↲!23lbG?tqvXnǖ}!aUu^;8}D $=%h5\]4mb~ߔa>N CL\6BvjԀrn_`kqV|ǣTiY"|2qu~&ڶm׉k D4c 1 $W;#yq>xEqFWD:j ͢YV!iovxf3{@WNK0JG>pTK h1|T| kjT[)m۾vuvGm7#c_2,]kB-exnmd G ? CDj6:D#5t䁤}ZItjc`ehp/ղ?gK]Աq/3.5#l0A,e1)-:DJwqmK(hXL<|ND* 9NxG+WB4W*qg`K̥E֋{jjt5,dpNZ9`Flʾ yL i0Sǔ,5E))&O\d=n^.`*?}` cIafuXp5%[Di[,NjeQz%Lp&qfy3+ͻGL1=:8ߗ5#trcn45 MUMpT(Xj^b866OoCPJ5C]fAz?d3_Ԭ̰gr*G}`Da \Sq0UMC1,ܯTx1Etx⏸-qIC@#{\yBR,IPV(]Ӥ!NOg$ i<@NM偉ѯCCs$P:#!$Q܅.@1hEş`m>|TR̹d8~"[mL'#Waz* >IOs3X]!&{5-Aɘ[Vn{>&0KžEfYNiI~Xtr1u5fR?'%0+Eh`\Öp[N|3B$W,f mxձKyWDh+s e.x]L3rq?{K DVݷ.Ke%*UN̠ԧ]q3h'T ķE4 UmWW ND"\Oa|0e;9{b8ċ!"!J'[{MzQ!Z%Zx013fm<X7Fц۽FupaA:G}lj?gd/Lam#]k^D/֎wND>E0j`yZpN7*6vųsIY8la.j8ephZaP,WyS{|>n4&/GFAӟM#j0x;Io`8.oDZW6ف=?i m-w !پiO7mԸZ~rIN~`8x^S"i&. 1Bق`9DUMFs8/:[X{2~׈EZg~s)kX86+A~Hk =`cCuP;GWIB(61T⅏='.dz"A Dv2MMoV P@LJ9٤u)2Y˔#_Դ]>#qp k+UGl%-KZAq,0J+iF@Q64KWq(̴E-f3\3R&pvE[4 ( (37tE+ 4ȷ!ORIiX2r)f^([`遼#3)et(wp*݄;>8KY/V7bc5Wh!\'%BjCl$0JF50.b>0CpbYL.v\ |ݣ3f;0.P%pK^{ rB7Vהc2,;ZFfJA äDGq:C$Լ8:jgd >rܱJbA.qhj zޞ{-T)C!akn×.#JXCsSm![W@rӎCq 7bx(eVpUvNcduF"(o|cpgh)l4EQcj),;VfZ59 }+IѽK* h>8C+;pj{gNHh4cn1˾b\l/; N P˞5Da'x;rzU2 q.*\Gb`ڍ،%^@>6JVe&uˌ ,7tN,jU,q,bg@#0xAzQ-rUmEb]i`PIq`/mNW%PM=1q/ n 0\?k!Eimo+Pm=!5c> <=U>`" cw%lr3{߰ 9}}@DtLuG[m[smv ʣq{)1{c[Ke/ɦkp.8R??l&D8H gGn}GGNJ^/5-?.] U+ffCIl/a4=q,!Y6K5hݝj#(+x.eU%j16boa11u+ц L\% J1,Ⱦ}zK\ 7I{慝̾LD*ePLi,ܤ!E00 \b=Ft4m)?-a2ZZ _AZ! 9@=J: ޗsj[)lh`xU RUMQ=|bUop2QԼ#[%}iF#b%cP}e*ԞHQKjwF &38F`,z! ?3(5 -8v 56:h<±E4>b0 8aSkU4=h8N?OO5ˆg{ĥ@Qr~__b3"ޥUQ.HY7nGZ8;eCxXbsʱlFʙ! jJpA_nvbHN";xHoi QO`un_BKWXq%4:GڛuµYJfmtՆٻRʖDuVhdڱGG] I*/:C3d9qjHc1OO85MU{}j;#B-dwWD3;8댄_e 9! yԾD1J4{վIcBUoUw1)0B +z鰭)6TXQ1@Zwʽ૑O/{-j!8t7ί3T3(\P-q*{کin"&hIBk%'[yyJ6+AV5!lLl_$dI}ǺAӓ5U;WUuڀy1*߮P~~!yL>22[r1a1nS [wùk7 o--uR;bwHERdRS=x\KbJ3z֞%|^z{1J)s[!q<^% @]6д<3\Li!a3(y@-;WQ+YkϷ\j{Z7 eiK?~zp{j߳ jO^Хeu(qU06M<ō=ޓ"*bD{ͳ2lwq2E*-Ѐj'%wvpCK^[Q[,'k5hCs !9)gL3g eai~R)dkqcd8/1F]S ]KS8[ZatX&юK矞c1_i s -\gR1ݢ+al˾r0 d20vW ߙf*udseD,nZцzju.(W ߘ%:zJUԲu2--s=|)pɁ>3e6K9PZ#k] i@V]&@R*}J( &4s6;Cεx:ܱ8YzUBg)VtV9 < m{6h6Q`$BzOy,q@^XA*,s+r0D 5k,qTn6!B% @͠uGK~ {GDk9-J$jx EiuƔ?!q0@\9}'8\Y9O0vLLUjAuXLUUm/;B'h+^V&t7g1c+0t$UYɦ@*Uk$?A/VB6@́4h/2S n3QE7 Lzz G;i©Z;SJŧ~L:^9j>5oz*'DNBfd; @fpr~fY51g7*{Ar/Wҡu͑lx~P3%nGòEvtżLƼ.I[RPZ O%,evewqhTC,c-UI0)?f[*mbneD3[g/-߯A &aruems*zp.{ƱTv6 +)NzźWuU` A쒻n/?PQ0Wf9i+ӱ <=DʧB[aapWTx%wZ\(! ]^* 8px:/b[g,at7JcnaqWe4:~a\~i_Ie R7ojk꽻Lv6=S0G!8 s ]'[m3/z}(BrdjPF)<"B2sz#ІUR;!VMAǡ2HѢd2M'F!=1e&&-rT&m7%ҕGLju McpU_LG '$5D5+3Ig3zNarctJVр8i-d #/.+iu9( R@8& I8&fwn1r $]vS^eK2s,hiolدil~]U!v>qs:.`]Aܻ*aw-g+ڲYh~uHWe}3*8" Ȱ-ۏjB[KnW~wz>g9 r~~QT(s~%vUĂ*T< &!GOK Xt UcxfjxjE;(Y]5+3-<@Dl.V H@o&TDto8ąx0չVb ³c(Rܟ@V2 =iN` C@{sw KYz[ @c7zp#ׅv"?ӵ2%R,ɕnQ6\(akClg FjA!K8H#CRr[ KBxA8B8X*Oh$,KEYC1h<L]uؚkjNc#\ȅ߼c>e)XHըvI/. \)8t8 TߠW+F1uE/+و+eNLwF rfEne~7r 81*N| _Cyl=LJ2zLlE7CEk{h[~`/a`8t ~Ӊ[ {$ 1Rʍ0C7V#f ]H5aN. ;0)ᅫfRU#*2PZiΥe=_x g]r⡛wU24Mf&VEgxwyAw-T{n:Ѡ4MV"teig=^lu/k+,De,@j1@ĥK8`FuGG,qglF)Jg'o5X]ʛ&Ңא.QX7ó9QRcٗJ/4 u>Y{{s-wvYNLο], v>um0`+4FS۬X`=J'7Y1<7>;1MiݖUL,YceneT?0? ̻dF3=fR3M!.fK]871#iXosO4 ucvgMn_2 6 Z:StuW9ng[pz̸^zfkQ1z+^%JR#`ԭNgeTjVv_09?Ԁ`CRCLT;8`U:HKpVA $fI"t 37Ox>V:A]qb+Xd]!|?iutbb HQB]5HCPpjgY%5N I_AX5'~7W6 I`] X.!r`38ۭLE3̳XT+N;|,_?ʥ4?:1re57]k׉բ~qA (0U"JNSfq1-:^& >[k9G̯0~Ṵc22+ݘ.?6ާb|%$6~_ E#f1w3ıΦ+Tܷc3\FD@[=;2Π2b f[u;}&6wD4nUN,[Y:/iQ,8HxX6FbiʵHhtUge"QpZL&ϟ:_.\=%j÷T{Msu1Osʶq-DΪp%%eShԼa=X.j& [@1#,:/ f~G [}+ϴ3 \>!e*rEecz.8w*9M,EC@6 RS"&7 F{;Í,JtG@*?+bUopUk~fŞiVF`s㚁Kfۊ | h+h H.jα^˃:U:3Èu]ZX[vo:!B}fOaL8iwM'6ṈEsJa7;VwM)wU#F7In,gU jѫ|DC9ĹUCtY*/5u># SA#l) .Ն>"%05.+\ʵ cźܴi!-i&+ sb ,nc(>tפAUžج?ʱApq1s]a'}̕_Py}k^zgMrndKT63y,D:%Vm8*G2Q wS5P u(1b ̠,_Y3x`:bіSMG 756PNN7HY_"3qtB SƗ\\'yەcYI c<<0hw:`/hRC pN^̴U[̼;ҷ)`45NṇMr U:jWrj׌q)iDj2L̤Pą{+1X?pJ5-s- ST!t% `X%Z .^u /}"(LYLD"cp\K-lP3KW%561|kY]*|2r-h]ܨiiyu+dQ*EA7byFɞgĢLEY3X$0$d\XkT3 3.-W +c+mJV}\S lE>X gE*ޏ(!.XKfnc`7+q'M#3Oo;YviR[ "hfCsz׶y-hÌx%Vg`P6/!b)w0-kUܣPLYγ0ef"he&,ٍTeq29ausMfqk#7-YC.FXAUCy -x).rQ޻ÑXµ TrS*pt:=SX.+& B{r1;@"l?0a0_+\ĞZCTv#a`Y _,u@·G榐rbq{=<(bg[`MLAa=vT=k|".p:l1|KjXk93W2NW#{AQ!1CD'Btן,fQL1 m6[%_Vd2%جAl=ȭ8t0Wmj͑t9w/ΙR4֫Dͪr% 7 .,.[X.j8ô=c|؀X6b,j6JVEfbخ&_tZ"0ZǙY5jo0OM1 TaR0sAz"5c~`>4=vy+ c/H hxe R +.L{Uh;J)LzBjQx 3DHqE!& +W,p7/5ZfuHpk-&mɺ)+{ | ;HI5{aAtsf8;b2E\f".07Aןhb&YfVx\|lPhQjP;5ҷj ruU)|}+^fnkw7T; Lq For"~\,V3ʰṗW&hs)FU, e!^ɞC@[DGLuNxAyz./9`F&r LTMaUY4yZ:ł{5 QFzQ!"BKe)]L Ήۋa2b6o S6xvVv x&Z~qx1%3K- D ClT \^j1Ph&)RGlDNV_ ^ە`LMٺP]kt°(8}B:Oc-CF,yUoeZ,b;֢B9$[]tդg+HU~D& %*1(`,k04b:s<DSC2WWm)= vXu* 1cq'݌JT'l*Cq1x 3MrZ/7!`!_!97RQ1\ c}VAXD(zwڇ|E泙,0/aH9;%DxhEUuWxZj!A}69R|і̱t/W y^ff.eVE6~gC g#R~QKD-XR/0Ae{J`-{pNwy* L_N0P0G5|HXIU.(TB} %2O҈DHa#3n1y1*/46n O!ɮU?> iv,$yi@UkL' eݘ1 m.!؄aJ-Y4D3AGgWRrƛ|~gL~"V"t;DP(Ks*8u> cAg2 /w,P'W.&rƅnD$\dGi[5YIaAPf,嚞Xu0bZzNY =N/ҡ&sLɖ]8>t_sgg(MbCiwC$㴽9=ˁqe0]D! MtHI|c<=ef-ޕ;eS/BPb蠲ȎlwK[k]Gʏo_?1VJTJu6 aѾE)Z+6QlP;F?2R' Jۥ&gxtBr:dx|3ۖ(g?H_!#0sZ%I{l#( +؜yP;BH3 FqE̻DXɜ.eѥ} ygmP~cLcr>$Q7IocfnʰNd`a3zAr cN08?r  Q@ cɉx0D Mi5^mLLt&#x p-պf$°jvMܲ.Cm8 ]n1DfU>˽̵2{kK4$nmR8Bq]5y%LJ;j5XfbR9{ApwX:h6=*ffsB/L]l H]Qf(cXu+0Fa]]csHeUqBiuѝ#VRT(h6Bq%7Zvle=rߴ].e_a@&'RK-[X8bl|Hyynw0,&lQ=0V.˶ۗXLs:3rpZP&Ѡ ~tcR#q|3F({#6ZKX\LKb!Gme+XE.6bϖ|q˶f>E%ML".mobbRP30$!iKV-fo973V,޷1r]žeeSq3:q {`zq{mPfWp56+`o nSA*fYKh|ĶqczUUקx sQڴni̷5n-=s cXg/夀"^20CEn ƻˠ[D&ѱ_LVeTyWX7Ccˬ_+DTv&0͑¥]fWx6SW4t9y}$l AC]IKdW=Ь@` orY*` X z0mp@x !vR!,XHgY[gn<&fȣ M;fcƥ5mƋp&]No\_$^LT nXy"q־!.%trLb_Yy`/ u&l %w,MNL@Bݠn.!Lwx>Li'Ys N*,vcRJ/]`x%3VxRu( 8c`8^qgAF\ ̛e3Pڃ7-w} m3C5GHu6iPUWLRƱ 9ܭ/P|ALl#k-[B}{V5jSy"k#(CS \NHc4pGiGIk3ObVSIWGX7hq\U]ŘbL )o_ ۮ:e*9F;;bb0^=Z_z.ͦv*NyJI[h|HfuWh0^2P<&˶[NZ=9{@Y`G_ErJP#|J8 2˃Xr{KCW2.~)>Ircçjb$S!:{-Lōʍ-?ǫ65X:m~bQw|_t,S:J6DPo\飬ΥvFd<ʾkAG'( `1رUb\;K/Z[\qLs16$LmM›UV"Oq#Rv۔V0ǻ %_$o;94K%rY K r;6ru/ q]XF+D$9;čxZa!JHl!]`1q3bJD/0īg%/5}* !Or` ܶbfA\@Ci"c#1?xMJyKq\s*O4,18:tI= !mO8vVԯ,y!Mb!ic^+$>&cވ~!xf=% u Os?02st&wJXٲft4̬O愪j x9l,5ܦUDs Tݗehn, Ê%z-[?ay[_M&{4=@,^c*Rp'⒮,we޼~eC&@h1De Oi1&=GxC\rU4SqmTk ,}ѻig[aDv)efj&F4AZ4 Bu҄WQ>2rYkc]XY_2,|Ah+ѡh]gږUu-:k#c]a%*dk:7R o6[ˏE1S|q5GM*4P*):|éӬ`WK#+&3Cb%# E-3q$f/e{*ꃓU1s j˝u\*97jYo"9ΰ܀wY2u(jp LGEbQS+dVIWgc]triL.<z3.OM\Pfv)cE䔵e^ A`Y;LW q.~X̫Ks oJ `@X]gO1.QTR45YnQQŒb@ߦy]1Yv9>V?4_b]NfmQkݖծfo PxhwI\z^Gn!Uõ} Fe'J^aejUC y#R{}?KcK5s]80x05 .g8iA/l\,Ȕg1ut.xirU{RF@=܏%򳭝NaE ȃXz(Pfk1eqӀ~ my#`{/cܿhW M&Gvwz Q:1Fvi>u/+ o909S)kMCw50^:̆{Q{An(Lbb,`-7nDjgv5[ ڜ͵y+R]NיPa9xPq i0*q; +Q fQe<0KTmݭ{A0ۇ/'kr| 2/z.CE^iM:tp6ZG 5o$1"ba:i,7uvN!{3v~H7 y}ҹ&pne{C WJψNarxZ[L|L;BJΡNxatO7#Q (WjcI8$X&W#@nRKU^c`تYC[L 9!4Q^b C>dJ` Q|rONi4[ڼ V˂vnet? 1ھw(+TcWқI0^G/e3a!X0E0A=)ѷ[ )*0,Щ7KEA{̈́+ٖ`YJ8煦wS /g:A̠ڸ!,br=701Pe,N_r㗙OOk`Zcȭ`y,69NC ̽%TCU %E"1= 1pq5ѾM+)]9#NF 12B\1+p/ 5[3-]%K&l06#WޜMo1Z40mWykj^O@د6Z%-jԭg`ߴaiѫl,xuݘX7S3W/1mxwvbyhF.lp*a]"t\3kAExzb2XUΏ r|ũ v͝y3£+0B 1Goro]+?q4's/Sg(Q/#|s R3pNO˙m$P%Ne:L:n,;N8QA$P Bgߖ)o#(r''h1!+Ŋmw6/L Q;ju^fdgv`{l9D+_Ep9e`rėbah]n ,99sļ_f ssx5,x5c_WYQ* Waf&+~qשNht/rCdq ë/s Kz g]08#:^| -njˌ(q0Kd54 K)\brtBjYR[/U`LWLE%[31I\AB;XMԤ8q6f1/Om5GWl( йYD cpn!;N#j<l: UVpqA"bxZNM ߈:3L"u/ BOTp@\k,z5x^a@@sЄ@-y2#Xc6P,f$8r^~ʹ s}cߒhX1d"9"3&aC-n >ep%$ch'vY ax3!Q}C, LUS[z#eV"bϩ f?IP ї`f8:RkHnIp5b8)˙[׵"Ewn'Yy-Fb%_Ԥs%TkU?1% XnQw^& & Tʕg ܉kud"aϡo S%y7wU&ڿX+Dڽ]/[}gCҭQ``u 0:ꕸ^"^Ɇr+'a:%gk1a_~")= oi%bv)~- `TLGx{˖;Ԣ^KYnuqGwm{Qᄴ!8gBD Kd7,w/Se}0Cy]#d0 ,-\x^%*OAag}:4~&^"5OϖR\Pi7Dpfq{bo||D/hXl/%7 ڀqi`qal fPU^u%0_E!46x#b|TLr?҅ CWv@%r+( )p90@ a2!K:QY!XthC7P(94rkC<+F=<̪{W{W3r:Zd~&Ni{qx4HVRr G 7v¢d.{Z[2G:dH@D!+w0+~fZ˯dG;Jꤣ?a +CpU2ł88S~ہV ;t -ZܾE$utkh6#1s]l%ŐrМg8Jn(X@rL,,8"P!}n dsϳ0/_ ع/sJpsXR#i.b<z{F#pyW+v55G!n?u 7l%&\1 #|ޥ k9xi^Kbvf ݤn>Y_s6nƆ 0s\ */s>kEfǿLchf0JS=9u؅LM\Y V2j'XKwҎ6&]<"CFpm( «71 ֽvpqQ5p=,;F3o*/r )r[:߶GAl A30rϠ+Vg ̓,`̺ܱĹ˖m޺D<9v{ru"anjw%*yol<%KV:dKTONn"=tzZ4n@:Tޚy_2ۭCk_3{3INW8᮹o>,K^)LjI.gF1H7*rEڬDy:LmɁ<,|R%C+Z~Ή%\f_ /,4$pPZ%*u+cB}tr+pP@&B6b`,^pQP.,2* [ƕ:=siw]K|]xؖSbW67^:::#]a\ӽU&SpDvW{,*=B~H1c'>3dX*6,uxg\3(q_yjD`euf f*:Gq4<̡ 5NcPŕU\7:y=zLEQC;=!h[Mg=eBuL޹~X?s0do,~oRaNrl2;g 6J*,3yx$"H?71P=ni >bbp f8>bZǞ.2,g0cX%_/ s*d7W&TK6ٲ,MW5)\Cl g\f#xyu+wk<ϹJSRŇzV`K2ж]ژ\3qNxYLl[a@ZdcIŽ+qm+Q6WVQ|AaQ܇ٴ__CbZWX6kywwC pY|# aQjEu\"37t^~?|WV+UΈ#!N]CRxWwa͔5GC2AQֿIJE+%[*24]shyҸXx6/nsTHgr`Q l*b\M¢mqx KY~e҄4V?X2 ,CmE أL Q l;Olcyw +6XSaX}l`vvM}~QDXewA˴Nr YJY/2=_Vd٥~cY`-mhq1(vKue==PnZ trŊ3UP1|ݧ]ex\ ' * oy1mf̗^.ft&<5e:TLPn۔77tR)?6250EHiǝ3]fEªt*d嗬oˈUXD =[߉p, G0&[Kx*85@-E:CˈG |5 XD5@l&n=b͸p2k$r p_0+gIa +;m; t%B55enD\++aC#c)Τ7" ;xB͞j/o N0>#\3fs^Džpt`>n:T ap GG Ub 8{T9&p-Z w,ZVPjZJņVP i_f \_br/`RV0{[Ǘirm+4# ]F~(;E}+&CWn>")1õ&VGظh^;^!Ů|gN϶ "We˙P7.ɸ;ʴ6E/ d:B=IWôI.u*芹ͦq y{vf%5 LQﯖ"T|,XJ\D@" }"M:&Bܵ(=1CTe4Ytc>t2]s8s'^7yA V~ 61ȔYַu\̜KVUa^O >cx@> 4We1,G*b 0`[ԗ A7D-DK3{cu~Т3=*&~CU3 m[r26pC"`99usuw)\L@QM#}gY\H.".3y:2A2W7GeeDX2jO\0VM"PwO>a#-~`T-VȠ_0ꛈ:fS"49uE),zj~]#,6ldSg:undlc\Xj1Kc&-w V]a!h4Tn7PSa\)\۞sR1/Y)bQH:+([|DJ@8@n% ګWFժ7Ayl =Ãr%MpcIZ[jPX30M5x™RhWNPA~ºTu*JRŎ- \hV,>#5EglZhV&](^{Gi/^ fZ0UwtZ:Zjph3e+S,2qK6CE@="]Njec#H#M=?ac0_LP]pŽF5&qQ+, 1ZG`ib8-d|GlX. |KzAi%YeP9 nq,/pOĻpxW1 쀘' /u9wRPaesN9}@e6fecD6~Dq7F {b:T~mH[멓ĮhZ t }֕P޽Dypm|C6.q5jru"`"W/> 6_6B^q4^ ' lHq*M|p`(f(ui3,1ڣ+B/,YF[ Ǻ(‚=:rVj-pw*Ih*f9~V_l6s1\NLL UsUKJ%<> />A\\jb3 b<Ł@n .F f-:C8#{4K 䔂鑑ZfG,)nC@UC4VY{Jޱ*xS%up޹BL&,ɯAzx:ҩcEw%. (9PM9]KUuEľ/KqMoDtV*eA^X&r+0‡K/!7|eG#>&csor2WcUUyUuruxn/F;\<5:[ĸ[ZCc֓fnl,PS#fG+ TdS~y5q t~o0p(]Y?h%źRS[Xi܅os}@!@@xLK:\R}00Խ0~Dv0ՕY/W Xo,s"zy 'S./ӂv?ea ^ɹu,R.UBEd< o RR%?Pʄni5/N79q(FS#S9"9ؾez4ʘ'Jh- ݣoôMֳ:g|t4)P<'* S3!f؋rLJg\Ͷе2*V\sR8CK* ϴMԷ8 c6#!{cb[;nRϊ v5jݯ7ZZ5y6fk? (\BW=FN" i=+?uߴdx ]%0Qyt#ˣV F\Ư^Llmΰrh2i*_(1P: E[@E }^ooք@^2XZJ]]P˕yĻ;mZ/BNԲp2ɩ:sn;{i ]NbĴt n1@qNw }XgLefYޠhuL@SL>ҕ0}mMERpj;\@ Eg/N=&o=oާ˺s294+Y*1 rEDG Ĝ_>"״2j_NBS6 쿨\E ouY z3+f Bt̠Z/~(9cm]9RRZ[~׾t:@5|8!{zpX+iTZ̔Q)f[S 6 3n auDfr˙Ƣ&34t|Oɘ*. ѻ2?T{^=n P13f[N+\-,|Ί|v곫MQZEߘV(ysgiߒ>aqA,,fbvxJTJs)Uӿ+5@N݀z[5`:"i&YO%e3snhEtLܼ&F%eoA{〴+_/mc/X@6ėΎŇ t[y|61` 3W3R ;:ts{h|%rTj^e15sq:[U*T$]ua\ctE~j<0Dlqg(no>e6LEq/ Cc]x0͝][dl̬PRP1Gq31#JeI@`Gdh׫/|JV 9WhP^jb=B yku;a7(/;FaB]s-\"U^%ƌO||c>" ij# QtĽ.˲ (-7upc2U.t`0{]2h88;p߸U,(RC +%Nx7V~X. _p~RKJ@-9BVV ~wKE6 lfPuUiO :Yg պqA}1Po,Y|a-w2s2ǽWIl0`rpiTar 3 _*eAr~AWs>^_suZ[i}  Y~0f?Yr%8'upPlc;_ Ŋ)&kw lXz VWcYU2i\'EXO~\CIP$;lAT/b?qzqX:{p:?I]pR[jTN\:ܲ$W3 7Wc5lg!yW(jBCZqM@&e TIxuҸAɿkSd⫦b)Ae*국DqMS[C{*ÏܬZ{Gd/%$7a]nGH;n\39d\eg3@^ie*Z|*LV| [s"uMK4^/ n /eݾ" qsvYbnOqU_&˹k3u varU- i=u-<1A)YG=r)^J=6^֘cd&4ma,g0#/P-P[I`J/=WF]dqt#U__b{:? {5-ubRDQU~ g@7>R4=cIn[ί!@|b!쁫Z`d-ѦfODpc1W-L"N\[62A)EsYUFr^VFnW? 6Gȫ ~t1oyʯwvy;-(@1myc|ֺC1jl no]sSl<(#L5e0QtK{/mzLoKOߴ|2GOblѪRS1iLiX{*/"AVR . k~7,Pe壑~73Kf@=Zy{Rȧvw 7f4S>ecȏeBD>t~ 0`S*ja<>彦u=OEJU P,141F.A麭 *p,efLN/􊲶?wy2ѥ⨅w^e L7|w !OI\cL^pڋ`p T{Mc 1=a@&nicߗx!Q\Θr1sz1K84_VnJ0ݏ+t2QBh@ atkI|V[:@3 pqfYm ޖSPO ~>esU܌,6K*nd$<ɪ!cyĮҽ\g7ChZFh\eV:TsUՈr^6DU6j^`'yuE|J2>Y=/#k.E @?p?z񄢪V /KyK z } | 7oE=( D%øuJtF+^=_hVT\W) %7)1o_,kw݊]ɑFaR]+'"k t@M)niLuopǯ E9b]Kd7369:_4f=)܊ZUP/9ݣV|{sL5pty~SH:' _l=al%tX 'LUB J:E\ >j/ v1ۅK/mec5sWΘXL:=X%[Q jn)RO ]Y+ƫc͂3F+},0n4VeѢе0(([sg3YPUkPQ ^p:cyī,$_#w.{8˖Y-p.aa¿ cA[=kmx6@9٬1PI#?vhˠA5Fs8/SOp.R_pyv0-_DH|!%:d Jjk$0oۇkUthz]_?1\z ]jxR1B-&ШnlR!Ri]PMVd;&޵|A)KY/T>wIV/0h?\ DtWhh@-YV%:XXHXXZ4{#@9i5T[t ̄ZԹz:̚n&1m^C-9A.z^k3c)xx)XO|' ;!wwql;a1iUE@ ғcm+Uk543B\ɍ4akz$JZuRWPO^rު,09Ty,~*#CR|yuv?kz!B=m<_Sr_ij=J2/+}{{kp ,eg\4.*/N79:uz,f24`izPiϸad (6]V?8kOjL6<dFBc eF ,p5- c[0BĶ^sCcpϴ1K:%LwY$9A|'F:X _turaDKs9tM*3{Vo8%8fq6/39u4v̸ek0E%)IRwRiC'5D*K-]>vc6JEkWyhQ>K:ag<?1栈X%ȕGTqu[:Mah^x W\ L\?Y +0RR8߫ Ȇ P1hSxGhp]s/U t ΝKTߋICDs:̭!p뛩[2(Zf%MNu|@kDZ?i؞7AvTqwhe`Հ[](kǑ|ߚT1s+t8fD2C. Ʈik3l1f/,1K?)?PNPt)Ok \uDa1>В^X+dȝ:t^X>uᡟ^wAWY?N˽)p8AL4jzZ|r^_<ĽT)L~ȷs mL7 rf<JX3Q6yWhx|bq3b}a`%*nhPxbY{"2;,qUhǨZ4XM/$ԩ1?l̑6s A[9 0щytx`Kd;(/$̰k+hZq*?v `ukP_ܢ2 ̇SfpcPȚ;mF9e&lrt tgk+w[PPf$v$;ԳLp]ΰҩ^WYxx0*xK#LȢVf 'U%GMe1s ׻dǟCYʆb+WNꄃ˳ 0Ž綔 Xo0(dҽ!1 Q\a+P\R)Vi%_o6Į)]T @wj۪z4WcJ7헯xrA_fRQ!BΣ]bkzg6\졏q~2o P"iY/,۬ (W`aZ<|^.VYzMuK0uHrTjtМ:.&_2뉭\aٮsRω#+maL#|AM*$}]jݿ=ƸbdW9Y(g?p!wbd: HVbsujX09VNLY4NDCWx%X-{gɣ1"PiixIDtOHaq[-TV}ۖV ٱ{ѵ)RXS;/ĩ鐕XiUo |@T; ]o={au40&\t,שk}WE6Aͬk2ݏ<@SU0Jxpi5ql1- ,r{9L̾彷d,5&8W2"֦E%״7c Ɯ+sQXtBYel* uM3md4\LLuV JH&0LJHT%rgўԆ{t\b)dy!ܭǺ R[i)"+ZD Mp_-/84Џ4cc=S\+6ޜK-Ne]"?n*$Z53VL&8yTȗ\3e{L=hi+iZJݫpkV^XXjeTZrkD.3!X?v/GtWg`0PK'iqFC ]#BىqQ`wKhy/( @Lk89i66`nI!NLw*EuAbX>3ךSwMۀDEi'z:LrN L5]XVO3 Kc7"^jvه#@`l u!Mb|U*[uX= r]YYJ+hsna(n[0~&2-mP#S*XU0qfkXrUUq{" 5=g WV_-<1:7ϙbasfsg\ zHXRӈ/뿴ܠ`oxP)^%d]ZQbXِ#J=8/@ @~a)n >2yKhO_.~naR7Yx>wc-L%_ Qw/kt#X}Ȍ5X,=@ Kdu4a;tMnq*eb u7_iOvZrVf@Yj0(n#df`#7ұ,A)Ϻ+b1XY~)}v^ӳ,g%or)q(_yw)oḥRq q|@fo n<،/pK.ݓ v[kΌ9+8Ļئ/Ym0Uec+ ;JF)(=حZ訉pl+;׿ :vrY;uRw]yaS{rGbV3-W?goe|>!])7|bD;+W5+%7u>!וt.GU8%HqVbcskO-ZKdM0b#1ϴNŅp4ʢi].:l" BTEkr0:#\F Čb,R,N i^fpOԥFAۗ٭gߊc3ӚyjЫ+Bw,AH.̲c?-ON4MTV!Fz.s e[լ[QX" :EZԺ2ASI.XqTEwR(Gl_Wfb)Q(B e8k,%TnfKD ީNlH u wĠlF;K:5z;;BBbҼ̍݅PYQKQ*V&ܴ>v.{TY"@8x8J}E4^ok gSRN0=W~U.vJ`< HW>H my+c:o.QX@G1Bj!,wEvDy]n2"Nǘ0u!bvS ڣx/] (U`E8"K;8cᄬU:E->b*|ݕUxR,/b.{=;_18OQ)m}oh1qx-xyB`\y ]Vw> yϢݟ)nPϊu;X\9]c? -_fd + qALws0djR;#Cgc_U %rLK?WTGb35K4?SXkw(`r {DM_X8R%˜Y+C*f+%LK:0X BXG1Y"hsY]D3bTZryx~cbaeĪ`vgWe2U}o䥽b?:VYXvmrbQb 6;1 ff͋QvPl!\ZͺS1Y<-D2%>u_XO3I +Y[wN!JƆ1(GAJEZfN5eB[wyp+/-1+oEnWVf-Y, mh/E܁A9`R׍%`Į jψnpҗ#mG& .[6J\Jr֨x5~vxzxTOޣ Z?V1.W[qK)Yʳ] ȱMZMB\kL!_w*2ٷNu?(84x&V4-H!.rJ:9-C.4%i7o_LLvJ,}N++,qԫАUP}Taχ޹^8[HvJ%4%/7ˆ:IDKf$;TO?%FM^)^?$Š1W,8`gO_y)G:fL+%~;K ?/?SlelIX{tS Dkm|lѕi@&x-ЇXCm:ՕƩ8ZC8^U)ڞp@>D"R1Ҝe vEJaωBڡ{nc ԯVkX̸A:΅;U<ß5%_.V:JG5u]}=Ib: aۘ1u}q+fsJUp]c}vxk2ܺNVbKzIfx?*lu}ë?Sz+u wU@n8F]muR_:Or㟱88I,ψ.W؄?ѣ(wzz s=DQ|8ՌtV{Zf1]cc}0t)8Qp-v8 &R Seu,=У#`A/yXSDn:Ȃ:þ$F&ՈV2+C/7$2_yOe~Wi9{'w9;ZY-FG=F' Fy#UeN4μ̑k~ߘ%v U LJ;Ʒ0 9[r@,J';Փ do& E,8Z7t8Z ; OgzG uVA4F[ ]f,w?+Y"[k8dR-X <= gQSc7ZQ;8,6_^4ֲK"0)f0tA ^$Q,| >cOc*fQ.֘Y~~&ѮZlbҜJ,( Y+pU*||Ww?DQs*%SaOLjW-X{x}]=0{9*U{ֽy/t.pFkVQ:a{pc{ NBD# d9;p*7,woPU}{L_97N#-\?G%XѬߘ4pnh5L6%9oڈWe?᱈Bay^S3mmƀwf(ÈZwv˱|JiLXe˙*r ی`nKA[ qNxg4enڨRe#<j~QU_}SeTU*՘o"B zcFgClDtN2NZz-LtMVj:y"eTfȊ%ѡؕ2D&ͽ-Ļmsķ {˷jmiUR^%#:,7W [c^'ˤqUs!wJr𬹂ө]|*L b`(.w/[Н%3UX ýV+1efV{JD<ѓ E@F5 @iIμMNTEZieRg]mu:!F:-0k% n-BuToG*Ӎ/xtlBґ0h9a+JKrGX_, {xL[Q\0Zs`p߉V;=2bpҾ+̺ (^{/XK;'aR5^:&̷.Gs~@QCy19'KԈlBXouOToV7yYO$n[UX6kS(Mray]GIF\xjLIpS>ÇK6TJw2Le{9W06rJͭ츿(FÅ/ty~Ptzuhsxp"9`p',EK{R͌FlN1]!KI<|_?p(ԡE=^Z^Veێ1t~+cpMg3H}2]c|1-5KЅ*L[e!z~%K'E}DiThWb˩Krp* >)Ku68xLDP&٩~?s)uS]i~{gp`03U0eNh %ۗ-_cSR[1,kiJmGdiRȳ3g>/C/Jzÿ G/Z&F0eA8κdʥPنâyo8~ W-QMxb;j_Hː:̠NqW(MעdU',z^s=r/F6b_)Ja;+Y5V\i9ӱ Z $&~Zڿ7лRW#ۤ6euϱqO"k,/a帪cܸel}lIuY3P[Ѻ$Bí$P+Z(0.X QЌ qfhs\9V2o9+5Rt7ƛ`{jE^4 \[J+܄۶A4 7?hWT9Uyfe+];~%j[ [F?c aZ=tOhW̕d]Wp&\:[\g "~ ,X%&`/%I3&^7E[V0_Onm)XjQ-l[DFrR=w2Aٳ %e8 8.jwa5ޫ%4e.S@-"W[-SMn6 td94ʣGe֥F~Qy[\ +SkQx1@ 5|Mbj񏉥2L]s.3~h%̧dҵa9bd'FÈIQwūa k'p8ޑ1. ]L++'䖺ngÛkr!rB՛ӅgL/}Z8"uŽ|Tr!)O7ħy^T’Fjd_Lgc/6u>YEVA<` yxMQLUu* `.ݹZm7,/+6+F/&q|8k10ZMewkS#\gRMhgH ;]eoc/S-fo1`νuAm/2m釗/uUӈMYnO$g}vJ[=kWl^=]}O$`2&P {@g!a CYBir uA{s_dkbqq6@ևSs 5}@<F򛓀Z?4k-,iWU+e~@f`\=Sm/k^-R`&Wd0컆¯)kiVۤT`XUŒ_Z3h}`W7.<֣˨ehBq0A5G`&8]W/LH@6:t>%rj5,o ̳s WD1c%^X ͯLFb Xg.t`d/q1:06KƠpԪvdv]h+D2AMlcbx"</5Ro-Du;.Y3{o bmXVEnw U|g¤TᅑC+-586.07Yh*COsyѯ87[ܽ&7<7e#NW2Q K;ANX4K @ Lr{śaT@5RsU*-qa`U*0UNH`")LE1Wg25c1ͼ4:)aeԵ)8~!YX6@;j=HYw%HƗ)N^^%] h;Bmc@v4Z1zs_mYop\yrv_Q/@TQPw cmXDP|pKnS˛>' bfFt*,D'֮O`w<]c I#Tn|Gh.BqЄ*OD)&r# z)S-8<\ hDY\"q>`9 ШT&-Du1&|:~=*c j͐7CKU[=qm c x]K|𒝝a- A̝_.C}Hp6Ljj*/\FH/SOi+~.b #?Psa eC ^^ФjaNA:*z[2lC ŃCКHud޷!e^f?`ՙg=TR(uh1u jYځ G Ew_`" #wm(܅e)Ì-.d]aW̢VauEc 3<+ܥDpV cyĥF M@xP=S͙Z#LIJj_Htx@l%bx&y5c0U"ڎmĩ߈T`{LnlbωLj}Z8Z6V7PᩂU7E+nsc2>("káEģKtb\@w QxDk+x/;;Qp{UU"D= j8+6j$xo= J4WCp_ c P#j _+Sİ+c8! kV%|J\j5Ң+/[0Cx7BhN3X5\7m߅s9UPjpz߼SHFsY>_gheq y/maW0-uEoYl9Fy0J w7-Utu5K3*=pI @ 7gԧ#|]S[vEo OGXw>b9^,Yk~ϼVba}˻z w^?\tٕگĻ%gݘ[n3c VH XÈx;rVkQ6LXM 2̔_yJ8 >eÚw2Wq^fRܴ Sr\{/nv̼Go[N/iF3Mr91N_FxK/\:K;{:ĹY,e™ĺ1nLkޔl5uxr{3OwzսPenX څ4OW̆9 Ke%4ԣa)-=}ֹmiAN\*e. Iz0~"SԫgH?bX2-i  `Llw qj"%ECMݬV ,1Q, d6 аt_ IճK76KkdQw܌V=ܸ^yX&'R?2)hoL^In3})Eg2JRXE Yb;VTc"ԠX}uļO1-C=Qj29τفĶݷuE]P=+ SO_RYTdZ,RJ"md?̪+#_Y@)Z]`j:zR1aǙ.-dDU[H]Ed+z:D- *HwqPXSTo{EsQy)(H] cy.\1o{ZeF8tvwxJv6NXkK31¿T W?2W/r9^?,R95y_x9H=~.9(aQw|/ 7}aT5 /%Įq+>RT`)ݗ 7(;'C Wz>ƿc KQEN935i >/baoĺ 188{E]R"B5VKb0m9߉QV);03hV Ni |F0Z4;#.Ɯב&q>!S$\a;MВBQe3?{CGBюG C*Pk%ʹa1ĸS*KV4n^.-czBxmF_8Q> b:%yJs@&ݡ5]M]A|^Xtm̵̪>l:%ꕌ nrC{@d;&..Pp7Q/.=F(Q{Ae{tTWc Ph^`53Xayv/;Փ٘zy. _ICeU4+S 5#ڈ2C 4q x)<،<\nqB%Ukd=dNl -{5%H 欩^&6c0bZ)B~ ^QN廏CC6:1$w ($,.4Ȩ ehmxn"{Jewf#-#.(bl--pU3mXaՋj1tN ,]ft{ w¡{=-\j+Ob /Tx9'kx ²*AfRR#F "9r6/fivvg9sJ+d_fP<9< S46c0/\0>gQƍ%2ޏ{ߣ̵cwKEX(pqsb:f]45 9qaE}շǹ|,* ;5pP"Yy3iNdJ^P:\̺n\ MSUvl5bWrmBPY{wW= UlT<j9Ӆ qhp<5̵*vE4Vr)*U\U-yW寍JP/P~n"ҁxyT%l3$ `% : ALq ̥ܲtICcxI-35:DS-!Av#ϙʷ)/Ih Ͽ •á)ʔ1e8V*trH^ [$I+0XG%6[8*#!= 4upM$L"\9:D]ߵs.6CwBr"(@`Pَ dW8h: n i՝ JPǐn,v=Cu)b,/8b739{;"/n* XƋ4YG DŽLo,jϼX#,ًMaּVPM@HTc@q'i 88fY9ΗպI`1\~ sghK:=UE.n%oKkl822 _~x `~#+=9{VUi`n„ Q,Ld>A(dGN8̊6ܐM{?P42T&rd2y4kt_C=l9:oޱo؃^˸eڃGJWlJz 1|L5 "arݟ+s-ꌿrYF`?i`XM1Lq9ٲbuc/dT y=A#{$,L;ߌK%'( ۉa,uYJ {njֵS̾XOj$盷b!4*-]yJIMa(Jicc4ihL۸^_$ˡ#8` 4#C,ݓTm0R`7)UVwgQ8KRJ_=+ޛ4k*("`|KBeAjV&'KZ{td?A^}0s9A A{!6~S x~ew_ hx%VH 6MɴW*3J`^[.qYe;}S`׺QEv_lLRLU^(F)zEGJ`@3%]8gRH5< b-uxCy4O"ȅ'ZYFlqQ11y@yCIWdAT_o0=ۼڥf3U>Pkm|tj1MVNڙe2Aƒzgh,b?c1+{ޚ+z#{KL'=t_dp'JwSOŊ>ɟ^x@.xqL`o]Gilh&$vauspݑEtmYwXRU?SbR\EmX_Gavw;69΋"2"$)}F ꫙t^SZ~Vq[%`d͋ن/SR%ΥK]]Y=`r-]rՕ6Vq!(f*ll:Dܡh׾̬oÇ f^6~!K~2:+E1}.!z'7çqn./K_qֶn:NFj~w%݇J=I[E-F]/*qEͷdW[ovQv_쓹gpG4>n)N"añ|=hyy`.J0:B`3*hC]oo }{(|pFl 7/6˖MX-L 7C`5C&pBǽu)?1c*3efPk2(31ܼLyݭxZ=?ÅrO01Gt̪[p䶼RAiRc0yGع#pZѽb#\X桽9[SݘzNw .`W;/J8+C'-}%GS%MQؖ(G̥hH[xqc"WݔCK%e|~Z7Jhki/=bdҿ#(%WZ:GP_L҇FN=%1o1HmM1-4^DZH^AuVq ]Uuj8!yN!AF9K+o6:ʀ& Ĵpq76fr+` r z `+"4|zROfGv7{5C9ˍ" Pr[CJ7b_p45oG KWYZ 5XcA^!#wv%]n/h ?y!޸Ƶ52y1>&SKE wK&փ|3&TqScd0ȠPQ7F<(wLPh I,C{؞.\Gg-a# +ttyD]Hᆻ%p([v?dفղAvI@ND#w=֒J" *1Wr&vf#,m[ Pu:-/yB 38{!BOȷY%7P'VMXYPKqj;MPwU(~yiur~ T),A9dl/5[[Ci 4cjbK]t;]mbt_"g/Hh-ײ׉ug{?£eo*J*K # <,bO*(6Aұ3$Ub|K.x.t+g7m{}dPfV  Czk{Eԣ_(h潙X첯[!ϻKMQ܋L.YXUyu-Ƃ [骗|YQZو9JoA2)q#Mdv ZeZ|]㧴=qH.xۧʋC%hnv\JJ ј&A\ۋcA厄iu_n5G;*oqAJt2ԧЦ 37y|Cj+A :wĹ_%7 f6)z3wotx'qDV W.sf\.ҳ(G&/itr߄u;F/ۮV@d b0[34_Up a\к ]&]uժX^IH:D .ҋ&jއ_ A]69(tg=IhT4;h0pJH\*MCUeF:*Tӥ6V]<͇B>1S8dPrzϣk$]jQ>u.3ǷXx +5v$9p 8a[;Fdd_IF.j/BV_L" G̊b*8T?vZm@ƯpĵLMd :9+}!uao: hU$hbcMg1`{@dU;1NݧѪ}wEuk˰YV?uܕO䚄.L?0]c.t:~e +:WUw&n(zdD&pp^`h415>-o |J 58 6%l8U%L=τ^U5&Ѿ=e%Rt;lZ-̳dcj@f.ֳ; Rͅ LVY\.Yzs2guD)xS{kʢw NYN5/ قoBle"/l cv矸5.ʥMG}%Yșn‧LI^;7`3Փ F' ~" :l6NbwJ.&{ !)}UꝚ/w׈W5o.+)2_\B(չ- YfP$Y8[`>2u֨o- Z ëQ6!%%x#Lb G#1lYGjCH< /1YGWw ,}`Ff֜Mw WzjanQ5so6Ni`j l7k6^~/삩yʀs?1k /=} z]Axe},g͵0)X)0޺'yHE>z|Vqڬ&"Y)EUyF& e\;p^u%|ZN .^Lg/%5wڼoS.QP}J:_c>k-(8hኴ. ]kGl Y)E!B =K*+Zfll)i ́Vȝ #syW PfP읠K7.VlGAstOecQ[+ ժS/3` ;2f4yP5n:jac`] ӣ]' K|^25h/`h7VK&lfY PSGX+ڕ1ep_ؼT:T}q=1_ D~eg^&R1ŃZ]gRV78rd`pJwkR(F ah:t/vs8/W c9VncjP3PmMXw=+(+F^6`.7Ӓ2AǓWC!~"O^JMֿi_eR- ! ? %1UG7F+'-"9uS|2*Ν~b \~x+_ o77Td6ZlܜߟhWZ )FfF+>֎h(3ffL8E(sj] ~S5O5NԹ⤟"w>w昸Zd/I[O az8)]Mrҗe\?:8v=\B6cDǺ30,e^VIxRįcrW&f^֟iskf xn:~+g8=»g]1߱|*]F ',nV ~`V;הP'O K ݻIfs~5>|$|~7aXG" ۡL]W%-vKSþFuC?̺k5+ݵ,ox#Q+a\u 8!A\"SQA}ŏ!򾌽`mZ^e]p'*e)BBqxt.'`\f*ig;j9H1FX-o2 ݼƻos"¡+5,~bF}2q3-DiTzR56P0r&eG}]#dc]Ap&.0"VN`ݔ,&acy~oT]k&J[5ЬQr eǴ@bS5.&Ya+ٱ"b 4U2VAɷiJӅ59[tdWh6S鋂Xau{ >4gI_Qrw:@&b>bT:{XW5Gzho.^XEq2JXbf8PŚ\yT "HʬVպzaKCĢ(AZ*V<^5-f?م)tCNcӼ6890kz4@~3|u"!8}+:hnX;4!Ѝ )=#W P{GAvЗ%RM\H.q#-ReLoW[ UB,k*кF:-e.ۇOP}~3olHc3ZiyVnY%"׳Z~{Ũ5`2KV/( #\amWX]t%)4+T \="D\<ouwbZਸ਼ htJȈʠ-UM}F>8n\I;gfWP;e@#aKMf>;D {)(b}B0l!`R-Grٝ\f7Q~jl ݏ8$p_5ZE%k~*`.sbCߤ!M ̌-.a]x->$ˆ:²پ㳆:v`E(fp:Qm缴 lp)FQW }U!7o$(#0#B-q&kQU޷җ`AQN`NXh8K܎δF#G O"u4 oyD5|m;1g=3wڭ>73=ՐoIfTbҚ@i?ru)/ U?\AYz\8+&~ tJ[8cm7)C ZY Ks<'sk.@/ٕ B] EQ]K'l@SLfm^3F;*i аcli21w.&JTv(FGr1n-Exwz&fSx엡Ph8(؍_XU @Bo̲G.Hɭzs-k״FG@7xHG?yY_>qhzv4SN_VK3 .F=BR 3Z+܌b3у e YoFSg;{p<M/U+*B KB'>)p(y]UqG9f͕߲mZ˯Y|@c _&:}=𱩈Wz5r܃%5Zw^9]y\VNZY hP.cۆ 6L=aF{sr!z,f1aPYǶ.%yb! L.{Erߎ79_>6oiloejwR Eȧ >8:uXIK4=d,>N SyEA3^t|+i6j}عwmMU"٦t`Zݑ9<1'XЎr[auS/]ǟ]#/)by!ĢSuOdǬ qq #!WWKcTV>OmWXqU%ojU_YLA`(9pc]%] )RJLѾ"*{EyP ʇ$6E]^őnȖ]@\ h)UpՄ:/}F hQKΡ\rh4;KQJR,׈J7|02dDCJ%Tԥ>jgd6w˕m>*T^ eRd V̾#M+u9ZJtq;=@qZ%JD|&0YC߈Ut؎szPSf= v7D0g+ܷ { vͽ.C~er3ӻKN%y8Q \23o08H"ǫĪ4?NuEe̷Em<\]32h82x0 v9cS,2]O{dDM1n=TUO OO&iljU.-86ŗ !S pWlVWhrD[dO4w3nnGm`x]I@k16kM"`e4^[ClfPW~5Aۆb|(Pㇶ`cE&?c+6Z^:(P(ʼNe;2r2̹] ;eU=бe}aqF ӂ+*c؊-uߴ:N 4qNŊ"d?s[ۗ}ŭ,N/P,D5LYjH5G5X܋&X-Ӄ$ l<xa! `3ND-J%hL{,Tٌ(]\'\ZOgt LL_:c3@#l&7F! xKrx^1LD7E<_h!xm\U8k*43]*7ƥ[b]5/-u܎3[W4k7ek+`AWQ[Z p@]G?%p&ַ%}-`"kZeg1TTWUo XUb`{:`V58Ad0b4lYܟŎ:E᭑\ӣ\@ X/B L,F &)sfG$D4x)_ LqT-u*I"{QSgijj[P]auUrU`7Izd ~-W!K'sd:3dW WA W#>ePP& \}¼NSZF:YcVY6T6A,4AKY dXV1OfDZv#M:Fe|!@)ixBIԻ0;Lw[v"`缸g5t9ϴC\>v\CR]s6-Ʒ"' kDb.k1YP^J>?PHD us?n8ѬXq0Ƴ%0u;J .N(B錄߭-hpx-(3N\:/?\5c%._S4~Tb{_32 Tb{~n{s`5Uݓj4/بQb>bw*p=03̢XgۛxW N0 DH0]h`: 6Ck,,:hJ> C6[tam]ߧQxFX>#u%чoS3r*>ތu-/2ޮRj" h 2لZ aTvJ&an@#e:trų% J3Eu~mkcumf▷v5-{Ugų70#|X&oz?d:Uf+UFSx^6l|U|@, r,y(BuPo[N& :ra~At|OL=s_VDJ,S8]@N I:;f#3BQz0(^~$|_#0OeE>0e}.Fg0#FኼxN߬6(6Y! Mc5_'~2>755e/l{˱op#kfpk}Qq?ܹdθ:|~dkvu1u9Ec2jtR4j(3z9@Yu@ŷq˜aT{7|D)3Fea\34+] ZF^gUGf~2 s K;j0LbXFCȫ,K8%]d)-4QF3+aKb+>`$x&[S^h8PMAnue`ɛ+=D8"N֢%y:s,a ƁMdtSGZ{ߴEq+HD ieG D+yp-w5.(M f|b?q&B$y kk 5`:N9:@Y:ϒ+ȮC^Z T8lMs7#toF*\0`V<]S=1% = 7e0V آ߉`NG]:2gC2iCZSGeZKl/ [VIN85+6 ="ܹkƣlVg''&XB7y+᪸ƻJӥV}Ljo//X 4.͗^#"^↹V,Y XrgxgpPw"x%>O@yp;=_x40ykYȔEoe=: վe(դN1k`x '*c}%LwP[Z= *PNjsqFѳ{İǶ[wJ:zU%Q{'%(ͰϿIY=;LjyrQ#SgKUEkL8ZĶʑ;~M Lt ;Y-[~n p`?wt!X4L*Z3&U1kx3 #f;p2EN`Gލe[qn*sjZvs R,Afl`E*OqV6E7{s+Zck-˺c7h_/JS̻c@/Et#w 6ϗ}ˎ-Mx)sZYP<: y@TApk,z!Ɉ=^% lVD-2FAVM$Əޘ.XϔHHN蕋"b[aQ 3|q yh^cU4(tPw&y {d 1j3oqWJgз 8qRk]H\`w>jK,e|A[;2KWeP! ^f"CnzĀ [Qz3Bnѧgn`Bl M㳩1ԕ/F+cRwo0z)CQ2怺X nu/A)w`ҽ"ڮ`kINM%7dRĹ̲\1mMCa]'Js2`JD-vcFZ=koX CngĿX.h>emᦝtGu qc'.@bvah374mb:,_yyߠ`H{Ծ%Z.;m>]g18Œ{ AS+Y0}ܾPG6k0]:GG36*WN3vUL(}^Q6;"uҪZNFr[H$N=z.HTԯ_daU/\J#R\ A7JL[w9Vٻ1v3&r=dS_ƻV~eX5]&X70/q\+b5HiATV;y_r.ie+&R. '_̯ ]-b:~Ԡ ]2f@ D+0mQV\ Q]Rr$c@P rk@6᳤$)E4ʧ}7yHiZ/+-Bkſjdl*&. XuzT!rgnua l1Lه:\BN7vo3*TTP&oqGzzB ^or[p/Qb 㙑dЦK>GIu&K/`әH.\L\K1%0>т #϶>ޔnf(ihjR=3N )/Y[7K,}[f:4eFWbv>w6 Qʌf;f7* .mmVca `,)vFos3fv!k&-fMj/lJCQCדys@wb`t):2TۙwDf[{pQ/יtí*a._ymz[/ļ]7suM[!3xۉm1`.oݻ]r2f7E&Z]P[4h[Fg 4A/ T_6䬰? Cc+'+.*m<ۓ:71rg9(u܍\W]@dv [mUh!$*1SkRm?l64cf.&Wrlxr|ܨi ̅`S[ܷhȲ,5j2>bM?~t.uG ]Gf\88y}¡Av?se20=51uֈ!lY۩Q>Bh~SU:cܥp`tLete*2,7ջneO;:dJez,U]0e3>ٟtjZ/зR j-Ǥ\Է,f#FjfeEsRYU3gO[ >c}1(-ߘQPp=K㛢X.1V| 1b\ˑ 4[?ļ<8!H >[ ^+0-JYq8TdPJ״Zժ!faxhJfZ̉ 5E{DIؼ 0d-{-ŴSHXJw]Ρ)w,ڔѻddf:8tiSGtbtY덱<{%P RV뗙+a^^#،0,ns9wť0k;1_`|qR[1/zה,Akˋ mx?RՏM@ƐZvm1Y(4c+g>!5xäa"اŅ3y?⣨\`Ac3Unr3dJ9ֽ1>p\*0Ye.q,m:ʑ&&dXZVqq Fvg7dj5֙BMGu\K3XsNA|!m)y~~;`vrHj\66rw*ۚ*|ܻ\Ʀdީ0P&}R]kۈ8^뀾cV=E[2NKKV8cY /!xn-C=*Q3{T.Cel^/i4| hs.-(t@Xe: O `^zF@tz3#wtf}/ KD:܍^ì6=9t4uά%Qbv@ij޺7)u10]@9-Epbx2qBS=V,Tӿ)y3V\ db4d% ? -aRˤCJD4NHWrʮpm?E,Y|A͌97kI/pKm[x0/Um ǐ'auv**VP F[}7O%jëh:Mty3 G q/hWS 5ob*bs"(ļft Vڵ-(znPaP^'qmlg?mz,~"9g2WC%Pm\қQl/Iwx+)b|)e^\Vx"60hƴ\3|ac:D+ ?/$1^v֦[[K tj[cse\wR=W|[pJn.$:qS0.ge6.~TkA []SN՞!(f7߾aslFk,+{t%;ek!Mc.wm棛дT6r]ʡ 8q4q<>=^J;4,O(y\w ĩXC8vġf\KNBۭM ubܠ8 L-l+[; nN.Z|}j_-'^ʊ.z^< t^5#}ojHhbo 2{!+\dVL$)e2G91emq vGn0 Hkn\?Cc5-̇ldsQG'OrV vZq2rZDbxW~e:-T^HL⹗AkG(yPTvPe"")zw,u_Jx:o1/[ZRe3Szyk|M2sBƽXq;rXgYfi)V\nxM H•iHT/l{5 '0ZpLBVɆFMܬO!<[nUJS5,5ȧ,0}B?iO@)d0.dn«YPÛk2 _YE+y]z&*naR7l^lGC "_݀~&U`Jh tey%+ 5UU3T4jy`9Ea,\RitYEqu_14I]T`pPgew_ha*DZ)cH oEDEt){!i? ]93n^ OMJ-59Up{\u;5'RYS2ʻylZVhuOYx.h{k1ꕟh0s oﻈx>L ,8Ai\pkaae5U[RV\şةɚ˘8ǼrF[݄Bs&_yoGdcJnyW%"?`'R]NOwqXTsqDDP:,f]K*=wSIu*W1UaGdɞ}*rUL\Xghŗe{'`՗|%s{6D-JAf Q0%9dUZ|b0 ɝ \3fLkh"qҰ18P،L=uQm/8J»iw[T^6*{/Xy_6R⁙mзC:=.fڢ יV]bg#>ӘCT*:SRJE1PLǾRϸ)#m p'SDtt$&Pա ƥgrIC 퉖+q3(A\4e:K P^oK <`81oCn 5 Wbztu]/yUqlj 9/Uy)U6<˘b vR[ܸ EDuA]e~uGL\6uD#!m`S |=Myyp7 ceNpq"1/lJWۮFOah T^B/]qPWnZ#(/7t?+e0G]|MJ>|ewi!* [(I=Ra'OVUs16,Hծ}1!GlsѓP_pc[!1+lQ2s3(nMtWI=u Oaقl5CD$~(Y4wcŨUs7ܳa…qyw)WN,/cG.[CE_ tk[@ |J|K[ Vs k2+.MwyhWHpV-*919T1 隖 Cy=协esLt{""c&1çn)@4W` 4Él% T+xEMMՏ{M&Yט eT92Bm,!8E@,+`cSeKrLf]d عXt?bSjpB-Yv,ڔ^Nuyy@ \fV0 ng-ʧ*iI\ސ׿$U2hY$YV)2U[_yk[e0GXށtXGu`}Bd@ `5zd @T`*TW/}Hf6 +RwM*N35Y,Y"tWTAq&.Y?XU0ͲmϪD5P{_oIdm{/hEBKCqbw56 $lUe&h)*+"rui_-IT&i*KC eЫ^'mb< HBHfQiUX4֜dI}Dvdav!);kD5$hM~YaVĴk C4)o9#Y`ͬy| ߃oOR mQ+&$3:-_ɢ ~g NyAaukd7iY@c\|#PH xw2p2=vN3v'*Xl$Ia\FD o)Y؀9|oyoꙥbN]8 ɉ%^fR(ϲy*Va aזiEɥqgi]knz& UHI W`G QnT-PJh[M$Iu[=_y(%d#@7S^{dE$l Y'M"q(Klvg}]y [}LH\Yf SMPlD0B4T-*nlmtIw6]t xLA 6 [Vח]w d0ݩ޾%em7Km|Q7if/(%ZH@,m_6Ee@ n4 AIy$ o;M&I/mi425^% i H 4P+S&z?%4I^(C%NdKZK-m,y4gr 6C[t " `d i&dl' 8I"I j# 2 'd Y@4 u c^V `$oDeEBMM(I$i P4 (0RI M),66%bVCb.ܖY+M_K=iCh4mdI$eGX q6 A )"L$hH,{h41ԗlL-6\d4mI$Hi -A$R ;]\NR܆96mVtO`O6@$IO;DA$>hAK48&YVBY ;|_˼^۪*u-$ m ŋmq&#XK-<-@J@H2U}XAK,kHH߲l$I%%@H:LWLkO9piR$FؗNYeaQK$2Z@ 2 B $IIQIA.ty5g)S^4i^MH29[Ԁ[da%@}I $\ ah[,iY57$ ($KE:Ʌ,T%IHf@-H2I o+P- A#k~ j23;XD *Ŷ`$%_$lg}뉤J (Yj"4Cp*1%jddTwR ܋/ V7r_.@@ p)slG>:KqCIg`I2`}5 X)m 7͐YHWn9vCi,#Y0!T nWZ&0(:$2dBWNxH 3| ( 8:/ER+hm+#@PjVh7  + A X S A&K@7)HtKuôd:&{Q`J @IIA2d %'e&A& 'ݶO_sMuBZZvA Β )I$A0MfړIa4aW(],8eJ7h &D(I@"$UK bm4e` "f ѝqGsiwDQg0LjU4A  (+  U M}M:` =00ܥc%HQ$gܐJ#&ɬI,XN˚WIPsc rz#UID" nM $6O&&"N>,|'QG^$mRXgpD!MsI!CH&)Јq6y.91 @XYk{ fk.u758%$(H &?<H$Dif 6DAs_HщؽmX]bNXM \x$䴖u$Po $5f[30Qd\%y.L-Ń jX2k-]\\$cmHXޭ)m`#,RIRgeXӵOn-9M[#0fxa•n{*vKvm}Y˸u̢  "±8[z,3Kݢv\DIi%jB_kw:#lV.&kt:njcx&߯8k%Q$T8[MI ANY g:<7x*%iFvʧ^6 T%E1c2>$]c̄v)6iz4.L XX;kKIcF,{,!I,I0Km}*iMq4_?jqF!ߚ2[0ɶ-ml6e~ߵY2~SD‚JK0!`V&Q)Q%,$l[dIgDA@ZL~m)z3o?lMi`7[nM.#z)඙$h,%I@oi%g~wa eo~3 7' O~ R&4Jd,H MASTDçjPv]FӖYV:.M6;1yG`([4r pd;F'Dzu%e$m2&eeX|}&,kb-)ELnnL`݉2_UE4e$0@?e(ާD0o7i" lސ-v>:y'w^2gS?g3K/Ѐ(lBTMqd֛N4T|V)$%{y1oS"cnȰ$l )pYZRm4[Yeh&Yem/rS"4Mɼ dIЂY5$C_c͞E7rY>XE$B. J1jK mўSKBQCV)4Iez &0I_dH e}T&"-;+pF0$f4ш/ .ǎ+3#mt={wcTIaү4+X-M-|,;),adtf; ".nd-y~"^\ޟ"6? #:Ĕl+ `2G}4h@cpR۔(D C3?>rQWu4a/I@ H@mYMca9NW.DFҎE.8?[4x[@i1xm`p-GDR*n$q}1Q͢X<'k5v8~_7,gX'Ӟ!E\qd&m K~,9ȋe`iq ^"=; LH bۖ'UHk 6͈Ũd5 ఌT] Ki];nN=D-Жڞ0䔚A4*5~֥I-b,Ju94c833ЖĈlF9+Il R4Oƕ̹nq[!oE\A{>$?ǡ&(wlnH~[8|fk]P!(6[DoA}P8AKY~'e5tP) tPJs{|<UI?<HT2ETpeQQ He.[!-}qU b Z>[d|۲(0$>]a|`Q45PլGm0mLA"v\(q)+djaStpDQ7%b0м+AS$z\ 8N&p0㈂. cd"\+yvכF\ܸv gaѶ,%ҨyG-25DK݆HM%&&cOrAĴI "iЫ՚v/g$i " e,h;wkН#T&'v\ e=l̺Zc "$X]Q5[ Z9a8&BFe1R 9NyaY4ǒMɅɥ‡Wavש&Iw<*UqB|1T-$Ff#"J?g-o72sP a L0ʽ^|RF*M.b8ij=1h7Y Q:DN"J>WR`pg)OK^pKݹpK>)?2r$u8%}oNb2q\p<9ˬs:=ޔpJ㱠0~2H MT,WxFY0Ha, ,ytY{#[̑"uQ 3H7 `6@l@3e%cO ]1ki.SpmQ=sX v//}z=<JyHI!$%m@6B$o2R!>wb <Ꝿ'%!齾j"ñAmDYL}YPNn`-ދiѹR"?GJe+Ϡ48$KFTNZS I[6Y%#.~ N;e4kSCY5:;/5Vrw\ d *E3k f}Ue ԽwI2,ɛW&*OhP7XYC=0PA 3Ko-˓.l#&?A&&OdkۛZۑYh857vA L* [Π:YZn yV%My:cX4.!/|Kh k9~CfƦd@~oެSAbboܪ| ^Y)% B*;@1KG2 օSm {MTƐWeOI7@HQi'Hk D 'iY ESV$鰸zX nv w>ߐ ;dRW iU._}agiBg|ߥKmuۻaO="4$DLDD&XVN4\B> tkx°˺wH^jH!)RͼEiUnuhHaQ:x4v;^f`h")/)aXW?k.-|d{rp?u09J'w4z94Fl$-LQٗxГ4)9 [~Aop|U-Ֆsc$s|p'C+Dq;*XP4 V̔Hhy ]a,4-ƃg-@ihy\(W],s62{ m9~sGC5Ev}#P_0$*_g 4糫o?3@M3EϮv s7yfuYH^J<.h;4MjIQo1s|Gsq'fQtnBb] 3n0xNBp )-^YC }ȺJlc6?^zmt7t*%}П%9z8MXrVu'!H]ƸPf)=UX=%?niv)LsU'  (lE P(eZ-On~60d#6k)>R]8VF?^~%#@~?5ʽ%@ 9DoLŏGpe* FXvwC cW}le“e(ۙs᫵cޥK2z'ޣB~{ n!cHר^回XpQKs!7kl0&^4)eo]RٔK뛞0Flt8L+a,)|u Saʈ/':bmy x0G2/dd6FqJ>-"g`NIbMw1Y®;ÈET@1G]DzFW"ZQ3?|a6ëkއ_(sGwC6UQXl!$[.YֻZHĜ#:W/fT kR,ϺA7nd}% xayS@M~(+YUk#giRpS$U gLȠ8TC!3F::2Bh2ml"tgθl<07V,miq%7^c\ YfVcKMdYd4e(u(+kUBϜJL̳f%Ĉ*78E7^5-4ʒUH%&m1j{_Fr#tet#ѣ?BE}m<.5N91$Z!"+B? 9Qp%>q64)MN8,ҩ5\/LII\9Q9ے-IdmKU8W6v !آb{#wbNȎFIK\AFjKOU*z=ғi ʥQN85Ckբ!GVuݷ-YHa,mS|]b E3x p ^A\*dT&B h TUDQ0|DsglAc6d΢: U\$7Q™ENbe&euZA$ |ѸVNb]6ᐗ e=R֣$@I@$ddӊd?X Cgý0C i ][uwb0.#jĀHh]I݆L'C>"UtU]>*qO}ϯAͷG]-(LىV#([l ͛- PD7@̬˄**?N5&k޶)|H3nm6{z)47!`DhhT4.o<f l_vw݉Ubӱ`PǏ 6@rh>[hj,z`h $;l&Ч+ GxF>+W ҁꡛj< "$"bI~fxd1 VaN?8o>i (Uӧ`5>tЕr)-*`>!N&Ft#=ps? 1q'SQhU9)>k{o[= &%wEZ7|GxKD o!f49j5;Hf-c+>`|lІ8kqCDOk)k컔oK{¬WY Rz'n1z(T٣(ŐV,KL,Cv(Ĭʔcػw3Ya\C>Aa/cH3 #B"Op5jDiyKQ"=Qe1[:EːWYy3h0@u80OV&8i& !-A~Z- u{;TbK/mxXN:OR1hߴRI$t#2l)DAMad oyl4X(+T3>|hc "A)ZF8ө2HD 6-k DEE"%a}V_sV}a13pmfs!m0-ey'$#)&ŰO&L.mT\} Vb*!L AE܅nhE+7NM8y[vĴ$K+XyGes~!(a&s[0?MNK2o>U'ipHauց\-«ȑ}uzNϜ077~JqD"}\PGQ\7r3 8[1o]!2\@Ұy-_Tw`3]ТO)L:6M<&>5Vձj.޾v{~-ÕLxT 0wᮯ{k2X5ry-{:HyMeyBԫĖw/`ٍW5oؿ,פ|]!Q¬sk| -x}Rm ΑOi\Jy@VܑrLY=ǝ?j 2,#XtSk 55 Cs)-/agE>i,@ak1b!w(w48:OR@IF,XI$ym*LL̐'%DG}d)զ-rKR1+{oٖwE֗T`y6}gep?aGU"Ԉ '73RX1nwe9ʑF8HlB@?u~tw%_Oe$K-p ie i#bĐP{⺂_LI(fK=YrIn p(FYf4Y_ ܛY&6 v#b?@p4@M;V +a7~9s=AIT!,WgbZ2 RD̺ y}ŃN,h.wQ[v=Ia H}6qc!DXrfK|a/XK՟Op'E48O5~PTpԫruiyPy#YƿTsg҃XvE/6H&Tit0$۬8"K`Z]GRAS'nXKأV}{y@'} l I],SpX _1%aÍ1((Բ>MU%?Tv1z"(oI$eJ-쬃 mBWɰLhmmca'o7 v);o _N〲3w{eǼg..R7>=e,~,s,~3ORK[c?-$a,m7q/9|DcYgۼ+pOqer=e[eo'cφY3.mKɑl-x`8ܞ~om&u9g]84,ޠ|p{dYu6{o3߆~E{5K9[wcSHK2zoۍadL3.~Y3rp69H3,G7MAeC~9g8','?żg#ټLu,$A8ω3,<0ngżdd!Aÿ-o8qOpIfq 9߀~ 9xώ}g9?deY3x,1Y6iyf{e>9'w넷~ oG;n3glYe?w-?6Npm>> y6,929co&'/SngC96ټd$f$,qe|2ώYqg>e|&A6&: 9>ɜlIyx`>ɂYdO8//`m99wg8l8?,>;fq|Xs,9`>6lYg6q,crφYg,ɲ3uegI'y /8,g_͂N/뜳el,2s,?fo9dNYe2˩"',,m x,y#?A|rxxoqY|r329xv2~\p~LOlp|2ͳ3useYxſ TdN2ӄwy|3g6[Id,Ǯm;? wdr,3Y8ß93㿋,eϙL rϑ2ϖ圜ov~ 989K&{'Ƀ$,g9Y<}|67 0p^? g9g?s ~Gy,|6~\,o+,/0}|ed~ 6>LYsg,Iy>9qYIgQ2ቷ6Yeg&;3r8@8m88lK<f%oMZݖqe<2͂͏_|e .Y3g?{6_58d8'?~K oK;8y>>Ƕm{a:eb i7ܟxy&?|,rɜ ,彎;,~gg'2g9qɟodmݖ6p1cYYeYe01er?,eYYeIuueޡYyo~m,,.,.ՒYe8 6ťՅweYeYag 2,LYv:"/Y x^8㭬06>`eY% M89,7K~Z,, 僻Qo}g7M+e2Y%<,G_G;f{v,,˹s2ɖ18Ͼ #~l66m, ,(p|2בխ_e=2x3Ye,YЛQ>9>!66x~yg;k+=sx߀z0~;4oϛmY,8^r5kx|pǻѿۿ\m66I˗WVpqt-~f7WGl7'KO~>$fK, ?.sWT埾sd9'yߚq]Iz؋ϻC*ˣ8!3+l[mm2c1\?vߎp~ a-Yd^~ 8HbYn9[P/Ps܉(6뜳mytX!L:|x / VmXڱ,'=Ֆ>|umYeYݿW[dA[~u9cŰw&?c}~a? ů##YS .seIeH}Ya< ǂ 2 Ln~/7 ,9KuǷ!xK.{~| ݖB[/}Aa6XO?lMw9rɲ,v60ai?O  u 4@О&=3'nwnp-gl:gsvG7g?ϯ'?1? ,$_'w},6\ԣC,w-$Pö$1{/G}CA%xv&-%lTߎw2yEyl6|8b/PZS>X׏lmIQ9;6z@;ˡ,>ݜ]?rM7ȀoV1vF[gCƏna?hrS_ CFFtD,9#oLy$պru)vˬ GWpp}B=C`wa#>Gy?|ȋ9)&K`Vr@l,vƋtp^cpܲ;[wgsGgh㻻5I ;k3g~!{Ym s՟1>- x|A8ww}G/DȒli(XD92ne"Kգܾx=]غ^ lv<9ߞ1wloț zIb^Iϖoj,Bb;}_q yMy #Իթvlp{B8I-/r?`&vacto# ]g,,42~gl{u={Z_rc=K>B~6MuY6,bS"{o^K\P^+-n$R wۧZ:n_;/`ǮY.2{'l{<~%;$qݷWVm]f7|98 սO?r;m}#3l;lK LB͘0%v{l lv~#S y+܈PrʟIdG?՜wlCg.wPՁi-kwk #=~îڏF|lܜ]CgeֱvN؞]]}g=6oR[wfavSr[iS:M -e%_n̴`@>COķuχvg#/^NK~iiim ڛFȉԟVRqJ=;<acvae ۴ޣ DlKHFtqAJLoDdb-ϫRl1tm`> , l6immmmmmmmm6ض j[\5u|9?uu}zc^c׶P'v̙aՇVy=pyb1< ^,^3gCA.' ;،w}~m2[KKaimmwo}/ xm\6_c wSMp&G%r1?fGv]=1ڣc~`;6&61>쵆~Hz^Pϲ{vdZCm]}ݲf1/zXKigm[amnxcmmmmmma[[[mmmZ۶v mlW:M B>DK;wfz?n^lM/!^]ܷWn>j.Ka7I՟ :cY D8,,lx$eq9>8Bgg=, >a֖,M`O0@3.Zԃ .bgz?-%4Mczm]XvPPFlqzqqel>GfB7۳[w|mae)g Ydq9$p#gհY'>M|Kyx~-l^噌2̓ՇYԗ᷎! cs7^Kxݫc{mx&3nAZVXl 6jZ;#=ǩl,2LBceYpfgyo',gϞrw˼ ly ,^1G9K ԺY{ ;u&p}ڶOVG錍8@ Y=?%{>Bn2%)ar: MYiILӨN fÿ%de,1)eng8Դ2,/vd8 vRH:u/?I|6սy8W{\v%MIf+քwuʽBX/ N| Oşg,, K,,,[o8n8xcsu:Cڎ%qd<2='^-aOm~/c}R'nwx=mc*\/;1گV2Omxl98\9H 9,3'Yeq8 CÚ!H$i/L;,zlx~pXɚAa v{g !.$>?iu><9WQ8X-9eElgAi geYeq&Ƀ ] |K>B=[yuc|χbػ[lL':z!wOmz;YRV;IS$$wۿj2O0:` Q/=x;պK%Kp> '"P孟<~c5]9xNmem5_r0]wl~V%;xm+:Q%ov#dO8;k 0$ e ve/#u[vsMnݶcvw񱋾#N am~~A8,-msuul r6ΦGe'nтσLPά廫z7B~`YK>@ 7n̲I1aR Nd< Cِ^h n}qX}iO`g83՟m~9g~'o| $:n~mPho}B̿9;1AH'q3v%#/}Cxtc}rK_qc[vD~,d1lz.ZLm6mgg~Ag9 >g&YeYY՛eY%YYݖIdyeꎥN>J{Bc?io4ձ}>}<6 |3؈IAX:OBZd0 /z'&<[ƶoGFmJ凶3g,,|3|se|r3[82ُvM}OJIY۷>}!=Z{|CK myO[8C€|]DvaO]zpaݻ`;`F>ޮO'PIY9˶|~|6? ϙs,gm#%Km:aQs峔 >u oF ,'IwjF@X8_dɅݖwg, e'HXEN.ϹIOρee>;-g_ß g28>a 7~ZCW?}X]gC.riaZK ǒlZ~Qԋcf0AnjKl]<͢y QGEPILo[#{ad'8[/8?kko9 A3K$2meYId}F F>${>/KY5gZ &l區eەy?I~aſ :|C[_ww2,lq"/l, ,9,mʜ`w3/DJeX;dR1 96~'V~-u=5/KDΣl3+Y$?V-mH~巌^q3 󅅖Y7kңw38K&-aNv-e0vdmA0>[q:,\7㯾Ig˨Oe#9-fvm͙,ZunwmՇOm>;opr =qD@z%kC$z{vQ!F{"묃; Kub{{m{x-%D. }͓,9rlYe>Z?կ\l7fNFuoVxs;l[ylZ/SoK|m% a @Yէ݇Sǫ6eu(&]O|`%>Ϲ˂ vhuݰ`0 3cMĴl YeTvKI`w3 =M}Y8Ⱥbθ_@y"5dèIӬH7sa ckl<{/Wߒ?OtKldW[CC9N ";reDm9ỲL3Vs>Y{;߆/<Y%9, ,_zCd Č</x;v23egrW]xlq<}Z RM䗲;HT:m˲ f;m!dq#4=cR[o fC5& tHw.{'?k9 k2r~{o dz6$mtKt6wٕ3%ݤ޴}B͒vC:a%[xgBz zo^fDJw,0/VA $uԟ#'Lx8Ig֔ L .w!g[QZsRڕ5N{+!>9veYeYs,82φ0xKuۮ *!XB@=YIgt#W%CO` ,&dOAv=N:6 zK,K } Nr|sX!Nk ]=ѐ`3Gs.Igre$q#0zX퐐 Ճ tK 6'7OwϞI %IxymQ-g8!FnE7'|p9#$, k݆Ifկ!c %KcdnξAD+vsMڿ,2?pwx[Y7哩f > A4+,v՟{/{!y!(B30ƍf8xtt!ѳBx2,}>8,uq]d?/c!pˬ,<]#,co,Q;!ՃսPؙ,0&ٰJy]\y xN2lK68, .QSbleeamXH;G,'zlg|N:{y#,~C]HM-0نX C=l:,o 鱁 KW?t'|XǴ}j+cY{b4xĝNw&ߤ2 37NZIL,+ś,[^|ٛbemmmaaC^ݬgջ E^=f] w!0s}w~<.zYnz;ӫ+u6V;7JCXˡx [0}{c":w=Wc`ez8x,8MawA9=-g,  31KĀè$s6Vmmmm'[k,g\KI2Cxiiacr~t䌻ߩe GswGL,e7-gq1)oVn[kǹwownIl13~3sgrKOd k-34 rC,Hv8& M)`}nX,Nm ~LG˰m%ۯv-g"G@]]Džu#ki/$۵_he@=]YݞmۤpŃՏY&KlgVoD<&[OsmGԇs_a;m- q|7Yx{:̀qEjW{,=0/>YeYg92o~' ;-~0Ox|cv˶Dѻ"ib[&GmY'r=Hy\:K//Б41ίNnC1z<f!zΒ']6By :X,Or=?,[m\_K̲D9φqAeYelN$φ|r D#Zó =6-==}pCe^vJg}a䧖VBoSO$: ga_HpO~B` gFXycƍORX"ex^{?V9ݒmOar\(ve#Oq:mp32͙;فgRϋf  I|rH3|CqLu,v~-@: KKc~赅w0:vH|e}O_AjV@5:eڝ1!DjԍS!cQc2 Ll_u:g$I݃@AaY8m, e}]|3B&5Qݳ-a;pl7Q-N;wv/mFxm[I2`EOC^ϹIGP\{jV'b/ߢB_s}H:NgI&g _ׂYՄcp1˒{ؽcu@XKH vgf,-ܭm |1$H2:Ye 1cq6o?P>mexmmmm~[՗E>qtie,~+^h?M"3W :Li`eܐw^Cc6d.E:5gbT;cXĕ]^]:_w%wgP &9v!:a8%9~mٓmelbͲ Yx8I܄6amm9{ƶ{'Cm|"2uynڶ7HoYoq pI@]×R[O}$^St?vKajN#MzMr ܷz| j7?%;Zg2PAc,e daLXHllcv x qlymr2, y,{. dS>>J,a} E ۹!cG{X}*Wlufa$б26oGS.n/@m~f)tt~|:D܌gS3K0Ӗ`,Y# Ս9te^2\|^smD]}Xm?PeWs=sCΛ/;"| B\3c{n?& v,رĞ ]%6ǵx㧁g!:^G!@0pge8lk٧[ ۫'} F#>X{ndPCۍܷwOs0w7u۶/.]Nyi;Xq\Zڶ"ɶ]N!vym%~oo96Xm[ Qm[Yccjae8;dk6A@O@;b̉eE &o O`[lׂ|~G/ MGM$rR\e2wKzIxdne-wj6Xo_Psvb%r j9foXp ,Y&pݖs lmOr, a8uzw{j5?pqz, d87ՏAw=4,oi+`k%!#2f'og"cI.6ίVư=xde "covl덋,T.5Pe1X_bݘC'[]h?Qn-ߖ_]!܁jN;6eWЌu0:͟,-~ ͛32φdY'!o8am ,^[o9Yg&Ye?R, ͹efvN{A$;m]7)N2ߣ#V}~]YvpMAwC={jBK> p{rA|dR{A@8 89/$ m,,?LYdDK!l~8l 9ߒpqx g}B _K,S#݋gۻ >a♽0h{ݯ?We| ,7G\f,zaz[o/Wu/Wwvm-ϐ9,>eYodL,&Aݛ57$ԁm ~$aaj['E yn=b ! $!mm6X${fe6lYc#,߻]/$:qwOcσ²իvcchn]RBt:;`-ԳH۲C{g$8':j(y)݃^FK -lfx6ut ՄK.cFP0kimR^5!KK,&2DeQڝ1 ,Rw.`0vq>Ye>_VYe<&'g[YŻ6g-!m]qAr;׻X$˒p3ѶAіa-lKwYDK&=oa܀ (͚Ekg@[:]6a}%=G{`f=Y$ݵdOww(m.NԆ>$=].p&YgYe>g,%e[YgPY'.c 6 {c2Jfb)\ە,=lp]֒b&d 6-ؐ2?d}.66o,rzO2id% ,0{0gk6 -zxȦK:7SHb0|y>i$x1Sj ~w}ݹ~ "׹AdYedYe~lg/!eXؙgJMD0~,],m>Ev]X &K$OQisxI_P&&GݴgBK݀ K,"rpel v[&w=%oX=oŀ=0vIn ~>/zZB>q=EYg-A? MYem/0/Yg INNԈ~w_Ջ6:N]+;`΄;G]^Ԃ wi)tZ!}3KD2c/t)nkvQyBRx x{,Q2GuaamώYga/76mYƖwglw$|% !AYq˷ b"tճwgطgoq`uvzڮN;=-N55M\/|iUt@/k7gH]KtǩRV׶X ݗ-a,.,,?s$eaeY'wY9m-[26,ya#v^g_1L2ɜx^B~3_DD`1iB |wmx4}D-,1>ctwwiB)HݴNPܪN$ߐGr]dY|PIOL瓣BElKr[xбm 3E*C4Izl3,0-/|9W p͖yۣ˦%t _n>G~,;n$ eމy!=oºu X=(]B< Yk臂Fcc_ةL0lYϢN>ə}#Mݽ_']B,'ߒnsSY0:pqcr99-ېMm䭨Nsm,ropd[gG[ 8='zN_ri#K忨aT']oDF]ݡ;an#pb:7,f,C!:d0';])3v/P`5Ń/z:Z}-_tA`>B{`#NpD-[S8a~ am7PyYX;, 7[jl$Ɉouc2k;f0]=@+m p`vS57Ht]!zlBl) &Iqm5Yg MŲD 82ݼ ZHwf !QdrW$ݝV}w;,tuif<1ڸ%uCmϹ0|ed`۝-6O! oL6G2.{ q.kԇ}/=;VOݻ1}!}:c8plٳ`,89^ y6Zǯ Z˯. f[m^AdeE6,3B[(@ _#,RsKF wԅ{lqlْ$3>m1d_:-oq'5^Տv;o {lkrWD۾˹x> g ahl:7Na :w RIYeYdYAe, 8,9es䰐}[@m3-VX,,d^69lwսpز] ۧOm untH޲, XՃԎϦHK`xb܃[w qèME@JLKM][ d3^IDڒ\V-=V1]^d} !e~domEe`5 il^[AmrVg@yo:dc b{moXs`t 'rtذ{٘a1mmm ,vlZp9vN26]p&f %8,n98 svFL !6C3ei2=]~xGdH?Vr{w-gkKT5xZe8K-3Kt:DL螑I,zOdho ߦr[etrogX߱jKg#s&\ l'3<m8`Zpj+D{dqe-A0An䌱w>ߑ魣%_o_{78vV {:fe08wd7GeODqv8ɷ$d s.ِ'Ocgn,I>u;L 埃ՇeђWN$A$L^; v{ |]pɱ%YvOgY S֗Vx=$n:!ޠta ܟ{{m,g=-qlǨ['[v=_E\D'NKLձn!7&}IBQoԅܩ tq[]dBG mfXI meb\;Rwfz~/mHt$Q'M0R8}˼5#uaԺzmL:{[t.w}e C5M2CHn_tFq>C&'So3o՛nH{(KnvǓ0`}&m̓r^N㍶[9k{0Gԙ~|bY4d=H8a3&hc{mݚؐ@a#e"JvXFJ;h^G[yJ`w='8|nż%Mm5l ,-m-ݵr ywm.AOuN;L^N/wW|V%qdGCɒwq">Ndenx"gDl1cwDa SO},])6P;&^]OTɟɿmgYe#X-!ᇄ[Vݰl|-x]ޣvVia\tk `=b8J~%\/#8_; Y:άttY؎ Lyg^0f^&ZOa?P+DǫF2oRo"I>y,m~6q:Xwx3]@6YVeՈo9 6I e#qO9huhu/atbtzJe/|g$Kݷ}e^RD!wh tZ] X ,^D贛J!Y+h:cR6I<-Sly/һoSo H߁b_Y8D2%X?˧t }2G[Q/;ofwpkv9,]"uOݽ%llBŷغ^s&. ҄ \nGedf2C%fr'| 1;f/i :_^{t&MӸt堘Awݓ'-Kv gq|gp}Sn2ٱƖ0^}qX?<B$%50#q>eb!m5li:qf{$Nzi` i?~&_ լ +\D6"\/ 7c|4`>{:7LLt 8} A ͐:ab^%L%gl2>n~M13S|o%W|6Lw®3eYgVA| $;.Ӷ>csŏ}~d gLoVH~F56/d>,UBC;Zodo%p RGiQĆtC]2!@͛6ώ>}r$lrGY V- -dDݗ"jr"KnN[ȋ{`5;>HOFOdnaZdݧ1adcBsK˽$x<;x'v/遑 `20g]gdYab'^>[r;f/emaqXx66>DD*Z$3`qc?{#9 3#caul{~֘p7.Kԋ$beY3lwcNuB^7}Y`~ݡӀMf鶟`ժIgMQV,$]YdۖmgcaFcve$-˵bHԫcp]-~[;uoP9c-c7Χ]'^wX(iů$ldlC\wut( lWreHwײ">#0]feV^Jl.m8.~;fl4&NrܖYrgYdE9^{缶[fE8ߚq5S?nݍqeB'|ABیgfK:$vb/#R˫mia8a;.eabKtwR&n"#,}, \"!2={?E/[b{4yoYhwmLx5uL<^dû+Z~gJli]N<:XgwO1Uh_w:ch2)Ol ~-s%"YIflqiuYEL|_If7cVZH<}8v,R4-_ly$f8Y$qa:l6=Dp6YgpJ[իßyWPx[ Wdc<N@ye#a4BGA=VCj쾖2;[<@\tiu}Itu'׃iWi2vׂW6%xڞ?/2m[z v$%m3fZڶg N`ۿy#Sz gsؽon0G.w'#$a>u%D$Km߉}綛S z$Tu/3 '@%zta6o L v7|kCz-ө5[elX0-EӀPV^r>;'+Pmϗ|<6_v->IzOv/L:"si}+ nö6l]/LY{'N`wx}%˫O$}$4U#.:d}_.20Ipھk嵝RC`w# o;IlNJ׶ab7>f0SuC>Wu2߷qddIKola& 坷߆ƗGLb6 k%{$Yoe<Ёf vԵ 6 w_m}6i#dHVӸKsV!N]OGۉSv^6%y :w$ly`,݈=ezmsa jX{>y!;S,떘NF$Mk}râ$ |9d~̡77 d -_:BWGmАxƻ/hZ m2q xo{lKp$x ^J^Xcuhʼեݤ;I՗5w>X}-Iu<0^dj]X'O C>ٶI{D? lԽpV/gD ׂwwzE6$[<gVnYu YޤGtm^BD5y\`]wV}@]=_m_m7sy[=-,[䥧ԡtNgVg)rߖ߆u>BÐm2so蔊j<vFt؞JHW<ײoYib}D 'aezJ{4>uƬ6֣nĒ= Cޘ9khy~Ƕ hi'_>HFvF'32z\ .DfO=q?ɭ8~D:l`y/˳mo0죆A#8,]om,lgb .r.ujjK#n<Di-{,F3gcHvm'1 6 M 32}$]ۧ M`w27ʾ! } f -C f߉o9x.-Z]~Cm[5a=RP$[uWe0w|gnrg ios}eKd̀:gsf d/~Uc~`I{bkc|~CTAܽi &ɎF] b7֗8{K.H2Y|7m]/x-9o^:9 }Y 61pf~3m.b>8>9I݇28w;$`] lשǻX:>Ls(h}:VF6)_pQ]]w[<.O 7q9hm-,94(߆}|>]pY{ż_vhnɛe?d-ݕ zv 8 6~: ? 8ͺ'c/br1Ӭ-6.׸7/Xv[]NޒIDGcӻA,=vnājzc/,cϵ,'W񥥵;BKsɞ <}Ax&pib;86@ nKkHJZ%lu؟my6d}p{˰䇗~]:N=w }ND?W{BIlS5^'xDT Vp6nw]ovgpoPLtgm㯿Yß-L)n1 d6ڒ.B/n~y6×M!c4\pܺ !8M5k&f`BwYVom$yd#g,˷w6'7~{ݞ:'ٳWUXսcyx 6$}}l[,6m:W-Lr5ȼ-o-7=pƲڰX~덷xox885 ^:O3}Oc`y7.˻Z9n]lAۄ~,lP2H,=ږv>⫶/śa|_/sHtwM-لX穂so)l g^x' m}$xf|ZdOu/Cb=eˮ7o`>ZCN8>d|}ly}L׶~N>\]OfX]=G9:z}߫2Oai}o#pw6O[P!&)6a?[5!YcI/Qlg#<6،zyG]H,$c$ώO㻿pYAgB|՘%awu 2HKԬ:u $G wp͝Ko䖬- 'ݷ.]XgvlsO$c#2qHA Mu=vB!u쓫F❒ \ (dz#Ixqe|k+ߣ3l^/.yӇ>2:#D>Z,Z&Yf~o5߀B d8?p $%egW7mc, um_$rY =eb{s ] dzuR`c7Gݓs`$/6f}+ :##Hd` X,zӖ ;śF a`z] rm!8 ߻OŇ-x8Ü/'eܶlt(vy 1x'vImo!Ɩ,',YdavxȺ;.=H;ɻӳX4>XM1`l@2ROX]Bql>wX].Xw%>t@ECAԏPWEz`!}>'ݦ$;R2nN;%dwkmn{a!a|_eGg",,ObS?qR^"qR׸AݿahOG݅ӻt}lC7v~o`dAY}]f-Z:2ӫ38J]c݌B}y.ehLFcc:]'"[ܫ"K%-$9ev[mmn2~ ae3nYg )fyqay$ٶq'̆x!cM tɦ]re>]`Lz'O'V{{,KR&m9%AëaԢjΠ}@L8D>;*j]Aԝ-?]YctK'+/)v.,f,;e + [puv>GRev-]oP2Ft6}WP'5`Eש*kvDcvwa6Q\ aOV0Eڌk_o&?HjihC=YKZ۱`b=%܊.z˿|σdgF;woFGGHGLcNCXsgH6̾e"ԻgY ׸oI:"e+(u!tX=dV_ uЏt}:$"wanеLoRip6dΠ}I;|oVBސvuQ/H7ձ윲qxۧMmpvUp~%l3oVx"F8v5t]ug^6wmOI;d6DEO-gρ `|x㷜 >#lw[V ӿg}&;a=w/g `m跸}Yk;͈`Q3ػ.7f9m]]ҼoU!x2A`Zai|ujbt'y =!OmS|>=Zv] WTȟ]5ۧLt}&66_LjX'xߞvsD8uxlʱovb쵋3 m8ey7\{dNsmM|1Gл[.!lʼ{#~tYwGRg^Ejo}蟺GWxǩ 2NIں<{369m1,C VRz/a>$~ÞFZȜd:qs;xwZ^=ym y;vKld|gC0Ilul,@~hFn6RNlu:;owr.~ؿRձcvӨ~WbąӰ&YI/ vFu=X,Θy]x<2YD{_Rp&{#'N&1$C>drw=s؜$}{gˢ9~-ݿNsyOl2ݷ sv;w1'Z[WXX#%Md$m /e;Б޻w l :{#lh^vM8Elq|v ,7R~g0y?HkeK|zZS~YNza 'K}nǨy<,ygeC}&q|oo7kϏ|>Z[s,w,pvG u{7yC!LGo'ޭ>N&O~=7{{Gfi}v%zɱ%9 &3ru!bTv]U @;O{ #>nԓAuԈ̵vu:>Sˤ='lX.}/:^_RO|Zeφs~;Y g-`㫣XBI|? u@L?H|_ pYA::H^K7dkP2HvyE#~ߛm ^git:a_^%I-;(ʶțbal/!!oM5/y+=; ;]OdԖ,SVp)ώv^Cۣ{~Ζ߷oWkvespSKxȻ}{yr8lX峉#K6v]HM,=C>Occ^)0N Mǖ}]|/Vbo`wo%ݾ}%ޡ-`yj:.#3|ϭ!x`: u'N˪>&HW.Ʋ,H0Osx?ܞt-8ߎYqef[orXxupxT-xb8L7KVtrH.Nݶ@hk]}[YR~Y;;>sa& ĺ]NLtۍq:ϒgvIWQ׫F;͘mI#n3`@tweX7""7{9y:.F-W`f,_!7]2oxؿtm<>0mo ^+OؙG:g"F;E(:ubA { {ժun,uEixFO#OigDǫ7N2m~/ݝܼlўn=gpC^[aIdc^38/l˶WÞ8ρٌw%. Xg @z%{Q6[>iɌc;gp 2``X7HqR_#ېufFΞ@oMQv2y=lOFdՙcHp>úr ԙc,~BI>H ϓg vY{+_Sz,#vIe E|o#dw:8l=_Շ7lrm<I~Yĉux&@Ydgrgg:@[2}U_r/rtR_;=Д~~8G3p=~6'MP({wŗ;KoӬPgpd %kz'N[} '{O,}CeI:SX{ex߆շc|<#qg25f2w e{׀╔fp6Gx/&*kwy6u^{$m=Ok:5_O8,x?ݯ:۱F;]шPV0kg'P=/d4oYH_KgoTV]7<$J;()cܿIDyA$]^/m屋c =[8̶6߀L9͖sO/͙8=e@q0,#n0ԭ'l.+r`Yv=hƞgELB7&-mR, i,$O-"nR"}u 'V| %:[I};/vgcܽç6j1:c$7׹LMCX6`ݜc0Hݜیxmԣ˥Hدo&8\Ze;]8Moy-ӓe-cȿ82,7Fav^ [ԙegA `xyk?PR&l[.NtK(oѭIF ]Ytsxu,gG?Wi/SIى>\ns&Gkϖ3|F{>e%me䏧w@>]3oce>ut{k6wg n386FCdy6]LէKx^\Opln_rIh"ԑ.g6dwtz=z;GmltO{Ct~#Ŧy"_}cL wf{an^2#{$>A-z'zxI{Bf ײ6l=1@侥Z8ýx$֒5_Q]Y3zdfnK[w{>ﱇkP:dptjuo; '\'|.eh{lY=l0ed=NN`79:x(Gvv){F=Na4:;0\d!ԷgVl0; "tIF({uz:?S ܵHN$&+w~Pyϸ_oPF䟫^˼|ۥchxg9&p^35{X6%`KdMK:W{io+g|Yx`-ol $]onK8m3ʷx<h.&CMnQY>{y-[mwz̝v@{g܃lmn0#/Ck2rլp?Vou>B`_${#xBoc=Iz8, Rݽ΋=GL{%hK_b迩A] 5u$O-wk;Dc0{~%: ad_8ui۰FY.ZAK[7 dH!I俨vAG峎Ig8K/!,ƶlٖYuOS,]`yu Y}+6s7]ő{3ݏ#%2/{۶}N# ̳azle I= I3oвGܺ)VttfyB\ tKvu8q2ө12ģ7ufkru@Zۜ1;,_K|6o\=jdCVgd rφ|s~{g|XKRvW{+dI{ϱvFY}@mq]Yy1B6$M ߨ5oK]a_a_Axῤ;fB~>Qo8{&{bHZm"mCۨ<)Yf2#Y_R__p1sExu#pYrl>:Wܞ#n1lv| 7EpG\7k;<>";az`2KuׁW-6}]wqzKft trz,ߵhe哳zs-fp1 4hwZ-:t:[eٳvJC{iFm]59Д'{7{[Raٿ"ru; .F3ݻ=^8#O*!1 A0Qa@qP`?I8 2HἍd[,2m=[=RQܷmٺ,m$:8K,Id/n߆W?m^v^ /^`[i+w,=[eOǗ_Ip̒u-29s6;23?v\+Bn>]a6yemyp{l>[pԙߖYmwmfA/%x mO7X'~;eLu{KwnRN9 wmosaKݧm{ooo+Ǘ[O9Xo!zhv_sݹ0ݍ7It^0ym[ Kz奶Yomߋly^?ŷE{n~g~_|emgrVopL˞^y߃ ρ%8sg6.]˼/cg-eovfOä߇qS;fmF<=mowwmx߃--ms-὞vc~,g-m,ofqMОb^ymo~Y|3m? ' xm$ŷo+߆As=[mg~ ?2 e폆LK63~9xxyvg~KӍymgq;-Ye6n[m\Owx7 ,Oo;xWZp-ݍ)<[l69? ٶmx˩a4%|7xK?˶6I#,Pog dgmFwi^YX^ܓ:Gɟ,D<ͧ~/"$ᅖ<1 ͳa'!! yui8wďEh켏cg;Mtmea:ij+;;аum}>YAş,ſK$&8,9m!l}k@Y͘-.=]Zlgŷ'>86me"g,l:'}ZtsL;mm?qȶr,l/,l|85}ٙ{܋>郷Fa\9Z,,>9gC>;nr[QZmn% z?տmI%~ [cmaYwfd`^>AE~sb{d𱃍Hr|Rv[g>gMy뜳!'K?lBnomgQxv9t{(>/ ,xDuwՙ䚟 8pߨGaYf͛<bѺ~ csf b|Ky͔e|6m*{vm/PXza-]3u >vv6 I]|z'd]-X$ݢe[X[P?nSwvsf(2grww|8K Y$?+8xV_,a0'[Vvl dwltl>YYwe~6uc]r=>  |mimw!we.,bKLC۶DIR!uug>YgfMk.džVHu=>/ba>K.e ?l3៏3O97 oV_s S룫NpBF`)ܱ>DNjśP;0vrR}Iuxk):6*:=/X;Ӓ WSu?>9˸?s$9~Wlko8KNm/->CW mMn1DD6Y_cb ٨{t::w8--ݩӲ&]O,.w ,|w7Vp}Yv@C#?i߹?W׶p}-O..H3Xw3en9w=×Op鑌?9BRޯgWdddkS;'"& &'N|uKx-1gyσ|r$?haߝCw$xv6mړ:GIf88_=a< 3~hwy2Zp? wh匏wJ*m[:;o=^.D6x[~3e|uxvX V_m$v[_rǮND1`v;8NY.C,< ǩa9`;:xH S3mg/g8ْ?!ߞm~m<f5 $l8&6O&]667{N'y{Ϭ=6'O'z./J%Ր+6v89߇-w0춄-PCIԎͤb[?_cAF^9Mx9ϖ~=1ռ?$? :Ϗq22rß #-D7Z>O9Jx>ax$Dt6ZXQ.o ~%t}cgCKѶټ}Evq?!';g{]^a|m,ܼ6#N4lT~ g'7w le,&w͏Ę|2K !&PVe~oA?"ע{'qޭ/r`m,#4=aWMp6K!{DۧV޶v\6Y#vYwlw/ztsvG^pv?ClxcfY\eY%p>`jծ,Yj իVgӐadALt_a;ū,vsw%5?:w{1=>Nwwa.tN7XZ`@|ud;hro .ӲLk^Ynڐ?N.džIg իVj5vmZ*&Y ԫVj&eYeY0ńA_nq -p~#~`NA^,ne!X]olDd?h=p}>k.e_y܇^":zXc=yɞaI=b"O"uKܻcKu:a_ؽ݇$aGE3683,,, l,,댲,,,YeYe $qAaW\eeYcdY,s$%yj=l@n{fu=GO`O2Wo k]a{`*gn6;L OIw~VuD?R./^̀ :}JԬӹ0Bz)7yw->#Y˟߇~}xr/8ٷ mxƝdޢ['BbYYܙڟuHuY{+zb m5:9 5햟Pp8,4F#`/"7[;^G]tR{L&+m/̴u|@>Jσߎolg^۷ ~}q-j͉F! {]M?":)uv+ 2=kD2lZ 'C-,iɝd/pg2! u쥟P{,gܓY9uk'_y_po[[mݥm[mx$mxw6mzcF9hKkXb7$8.j2yX=sclXeI\2)|Kޯ|@C&!= )sP'aRMՀ{IJ#ܿ]0,_w{6c[6g-o/>;my!ն6}E]a0X610w=H=wvȴyJuNAE, p>ROa兯)>^[&F]Okk^UYnr0Xaz[]xZr7M#ݱk/O? 8v߆Ygmm=5cw;6$N1^z}%%L"|z֦@hK#G|sERtL>ί6^?o Yj[wV7%Gb˸p3aY߷-KKώ,,e?I|7=8xߎ1հo&[ajȐI~ж{u<0c30cᾬ2S0k2?s yalAf?sLJH͎B4N pƯE\0vfLqw/^F;r87|mpesgg96pfweu!0{y{$}X:t?Vϥ1/YK\>}q'Bq.XZ&uVvJ޸|`r0RlI<@RSܶmn~"K? ,$23Yg9mkɰ'PvVV姧/b=]Š ӟp~أ^C.$vûpT;Z^qI6~- P0t{{;{}WP\as&m'6zH 26,' '[_7HcNz0;?K`>W9(EDz6fN _p gIf9y?L X;bS^4ĮJT0񷽮gg,t@]κ`,6.%p]䛷R],&dmxm"[m~;/mom:.uc;4=~am!.otn',g?>Yߖxmc6[m QWu?HuUeBͩ+^Hv0:Nʧ#w<,6pCfwfun~1GCd7wh\i˫eKt{kOOl݈~Ԕ'N`ݷL| spYYeA%1 XLPѼ?@f{2~}v!yld#1dz=G%1fB,c~qZy#2u_ԖF-WdR欗b^o%g,eRzm$,D-mm~?xaX~om׌v&%d;v jKmѧ,Oݣ-=0 Y<ɬKVVåAw~ԍ$#Hz6{;'S̋KIg:RKYݘNC^;)uZ !e{|w᷶l [[_oĘm) 6ۿ3y\.|M^=Wĸ\GSh{ﴏNL<2@n#}8{wun;}׵v+ȸsZBSXTz6fũE3_]ڽAa=a{ܶ&-m~cmol.m?w~i6稓2Z[{"V}dyle>/x$@ȟi`=18lk ClAZGIY%fqcY߹r&]. tx'6ӇZ9yÝammmdZ &=;-]ԚcnH'i~NلrCщ/U;~#_6^rttyjKgy _\8 CnluaPLh{z^7dw;I+G->/;aymexlĜmbc؞=&,[kn[ln9c,^ ̄]'{듡!h^df }A>i3@7xQ|7'S7kXxqҋkؔ%WLwkL$A_:=6gf]Z}m03i6dz}":]Xq5?=,,<#Y>9solkmfo 8YƭBkkO&}eט";,߫vOJfr2p{ow?_u$%AWp7Z<Q۩m2ˢԩoCoqlqImm#b[Yv[e[l Ol[q66foaٓba.9t}L;Z=EB{oZ00 ro{&J>W0N3cy 8gpuiMmvYvX;-AQlc1%!Y蔳e>'? oyσSs6$.,NV{`2lԉiK'O׆) Ao;kzr-Āޒ}˻`-.g'0lN,}Y 鑜Ff]<^a5S[wg1L=V};}EcgV}].` lO #zǤ[sի{5h.6;kp˴pZù,)V(6XλH{9, ዒ[@[vYx Y[lz'yeIǀ'n#e/7h쯄E#4/vcS o.pczˮSdL$~S$ᶝW2 ,8S3+wa:C8 K<1[vpOH _,Kwj?xfA 'O.doSՈ 1cc$wmH[ i;'@ S0 Ֆi!!0w:l,2<vH-pdԎ '1 'Y : mޭnݭ/url,d|%BO_rF(]d?HA!^-ɰ]ue9erYd,AIep簅V[VGmO Ub5nL^ ܐv30cMqaG۴iè;.'(Y+q/[􃍰^Ǿ[y}_'ttE/}y[m۴o oj薽Z^dWWhqzAcpõ&O9g)Ye|^295mm'ȏH 埤N˿W 8%@ϣ&M}ǶN7d0/L ?]VrM{Ӆ˦,ԶNɪ_Vfo%eEӂ߻f2 _glqqd&ɒ lo@ˆϔRmB&]I u !;] N$̿%d|g ,'dv{=:JD=%X'SKCaop1ݎq ȶh}]]pFV|}DO`y%ߩkax%'X@i߾cd܊G@v=]- {8^g^e@k$.m8VBh6#@ ;(7pB22(v 3->{x6vxw,:ɖy,> Quy-utj(FpX1}gGgaYC{?W~&_E%s߆|)u|,= 6Y?_Q-{Y.HLuvc}sD|]`~OյY^ Q;I q nv^2 ݻ0dAiCrH2>۾GH8-o?Fg|!K'!w,vLwY r5f91m^K~@.*WpmiΥMjܻ\6a~YmD/}ˡո9.N >}ZeLz,- Oߧ'OYx[$ ^_[7>D,9{I3/ߐsVwF{OLzW0c>!gpy-D72 Cum3a8 o8#{DQH?VM \:BAFx6lx,N&dYe=893-?vFF$}Ze:`B=@xγCk?}6%/D: (?Vo 3;u&VGVm~vp $wȗsvSǑ0s,6_ߨ;d#(4@0e-ym;Ap-l G^Vےxm{Y(6^$OK~b,,,ώYYgYdd 8φ,6 -z&/ .Q["ަ퓅=莹:mWڥ䋩I ^2{<]Io oܰ mHwDAif:A6Aј{!&%b+ ee2B],<03lȵlG"-b1f2d2Ov2s, mWě}Ze;ڃ5.ԗ(v -r{.d[/:ůR~.Jy0Q=QEu;tj=-G N,-c ߢ,H[vLA:2NͲ -͖-'{Jfw{ eAg Sy8m,V*D&'9$݂Pnu {lSwYN]Yh ]*9:jhz1/iVu{܆Ij2 ܁^} NF >{fd].ר垬 Y'#,덃$_]Re.],{'N3['xlرdpI=y7KebL(XO͞&?0{-8XFP#</ zzvp6$4O س!OH`>dF%MoK_o페n`~6~`u7ܰNK;?P`tlG. ͛Z,c{&)g >l[l.LŤד{-Z%S[%1\MmmuZ\#m` &!;eAw࿃)a{1]B7ש;/#CbCIųm!OՃEgݣ 6$>w ]m!e󌓩nvGYM-x!IsLGv6N lrm$I |YLfaަ[eܿvKZ8waKf1>8/,;,-JqϸDtnoG`@tϨ@GWFLvݑwuLވb޳О$P$};'b%^wvig\vR,e@6zt:HeZ;EѰ ް>DYNX^peCg#2x8&Km-jq%?vY d[/\g Yek,a|rφr,eIeYge߳e[-1_St7rްdOlm/щwoW'S@Hؗ`Fv|"Cr^vgwd, ;˵˷k}Dk$NS=lNҰ*;Pm-,rdeݥxKrM=M daCbѲ>loax z^z_b&uxgr)rz$w@ҕ6{_b w}Ia :eOL/औlUp'~Hv߾uʖc\ buO?\Nn8-eB+m!ja7g^-y8m8 9-{;,[×Sۥݺz.lcs;OϮg%!&L?sKx}]w%Mr6e,rg+A]c mC3vGml6^LK ż|`<.Fm^S䳏!99 fg,|v^Kp#XHLwt&i;vZDZ,D&~q }vKF|7ؾvw-hN/GS^˧Kqދ^ߓ x1c`qFNϑ,$ ?AZL^3!ugrugvqx8; 22&&L/|k-}!]u$K=:r{:[f.u2_jXn>vyiXyh^oxAMЙx-.ÿ.x % NR#mnGl]+(oRo{w̎fL>/Gef^KYfWvś7 c UlL1l``90^G6m[o HSYia#-4ȼs7ڄ&YOgʾtGk`nB+O!#ȗ*5$>g>8'͇ RGV^JC]-M쾠aԖoop6'r #GlGYC gI/ܽ)˲< kO@ 莖s ؿVFe1~$Gv߲̕g $y-nX^*Hޡ`Y݋$J8 k;T2 jQ95KVZYjL[e]NB[{,A{37YAG;K8ׁlΥƽ %tBwѶGyuzɽYqIui2 okz8}k=hRܫ=.ő՗1ɉշȫ'Lp?-xmVH߰'Sݼ񗑍fae CM1 iuڶ #'8sKl%YYfm mċ ݩwoeVd MmFJh_^X;%zEv-lv_FgsԎv|dv`FgPO&ia,N-m{ 7&nq_\9 춴e%ublqHK ݒ#Iը\,umڵ iiovdg/[ c^˵6իmmy 8VC7ru%r~$-ll=P=>rWü%z-P}1^f- `qjcWA| :E!܈jVGVa 6ųn|em,^q m-fmڄl-gmg;YYYdj l)VaQmD@=ep/l<$q.d Q{mf [RGp|fM#Չ~%Xxm}3nIݿrNC5Ѱߊ^[=- 8d3o^m 3vɟ^Cycm[rpwoՍaf?r=m7K\b'=^6 gqugq_l7CtK32=ԏ!-f|G!6Ŗ3zxl%M]kQ ٛݜmae",Z!B5,pM|!Ydt[mm6ZAlՅoxܵ~;x3xb|2 ~) C`^iDAοp"emgu<Żn݃HlgVL"~>]6>0dVak$Or^O#Xg-ml6rc%;{>Am>Cmeqme~|3e~km,+2NLc7,`1ԛ>K dC,.j[7.&-f?툚kv+kڇiL0,ܘ]GIM.{GQՌRJ;'qE`wQK:>|IggA Clwmm6x6mj1 2XY>g8ȷ6#qʶ]C3ۻRuЂsЀΎ21fIk4^_I /V !odV=c -}{|!zb]xV Ӄ p"==߻wG~ÜpIy s L Ice2K>$532 $ >-#j+\X9,mI fb\ō|v`}Il͖\wy?.y[mKdgW K=ڇ oo*~$ e7"2ru+C.SzuvwK)9 B=-2e?3= !d.]k:t=J|Wdl鲋DlHt/K ~IFX㤘-Zp IۥePfKu:&]O.'u%:Sf{.mԐn >ۭe%G찶,rYfl)l9d;c'8 K eͼ<%Ј՛ xVl-IՏ.c]dtc0_[Iz;{et%уM_RLVwc:2*]&%ڝ/Jؘno`2N#gcNdw6d|CjsIsm`[eon7xRӇ{oemm@,fOVvNpGml r+vj߃1eI» t{,{g%e,O!vPUq}zۻ`gN-/Qv 2wcR4I|^w{ M{Zu=Y$~Ї8ђ,F} L m7axxnaݥݲ)<6Cvuw^[<6'Rei.KOp nc]J"=,=-V.Ƀմ_Yh-R7NB:YbZ{+ε:nw&j]Zl :WZ6Nvߐ0%Wcb엍^6f~G~{m,lgp8! ŞZ``8mnf[ S$#&Fp<a/v wUX٬_K ìGJ% a-?y#1w2-ᶦ1unc5#t8-BZ@ݑ܇WR|mpWCaDwzՖO ,$xmmՑ1gm88N2R|ծrI,s_6e$[ iY>Ļl]qu d3 0H^!>=(#Gߨ`/,Xka #=8Ib6`:&0{,nF;݃=dbYG;;Z;ʹwi?Lgϼ!>!'lXaȶ-,Om [my%Ys,Ŭ,dK-,޿1 fH]:I@jyB~́ݛOQׯ~OS_V l0w$ɭ>- Yr12l;C*=N8+rNnxw!8 `@cf΢ pU>,YFufa7?yX2W^K`XAaXvLXWQԪ,>>/^ yy;:ct]mfveO=Iv]ĥc&{]=D<רs;L6lװBMdqyo0lnzi !8,B 'PY$Ȟw,ȷfNv6 P{r{ga w{QսWs^AؘWoa-pn̓`aYFw5y,WcKY-gvDHC^qy cӅztߣ { z?i X~g[u,cd½eeEEe6;g9YuuQ<KkcleqYg,,n쾬xɳ.ldv`W80 zCo^݃{} 2Y2&ZF=J寜}G]lHcYvO 'y.;5vk_m퇒2ӂ=,lYt2,nb`wwocwr0ntGĕC&pa bd .-욓"]8kq̳w"7{F3CF% OՃGNJv,eYc,Y&,xQe$I1Ξp]/ef7C9dNZ mvn[y,8gruC.H/Bg&gBuD/ }Ì~tz^#q_mAz/c蘻;f[B:cng/S]v m{& `e [m|Oo;o%m`l̓E!Yu@ډڲ8X%eűVL.yn=X^tˣdcZGR kM#-E`vi6grWo!˾]X2!>V~,n͟aci:ZC [[lq=]ؾƖ&v$=ҒSmme߂|ۥd~ir\奃$,%.,"bXKN [Yo/ANuެOE7`$NǦ胎_2n.ܹ{h--C g,6:^]q[a6A=.}ߤ~ų:= wvkm{rcû[FAoG\o l`fx> -zNR7K4CISDNS{gg=wxɓz`'T w{ed/˖lzN .^ I'QoiZ8`V'Nn܈-_R-, ÖgzpAtݖlF}X 3c/[6n3VXY,̐ :n`Bެ=d=,d_eAdgd݂ɋ?K>ަ:޼<ԝ(szaCC"Tw!m l=!M,F 9vdyo- xL#:n۽tjF[x=:2g{q6 ^ˈWOnLt;- MI;EܮͧeQk˜VAC,Fz8mrjɁt/]Kx-_FdӸ o\eW]M~>cYvLa" ggl;%.GQs8~qmdY&e [jծL2 ˩ሷ6^ LۺPxV!Mwk_A$XnXqnY}X},zAܐˎ]wpԖ>YeGl1.a=H d!ޯՐ䎉;[wV]nb,k?T^cN0 OCD.öɏqe cv7,mնط)d6,/l'ET#ݏװ|%q#i7H`3nc]Hͻw'Yn WLl6 QF|esp 'K/k<6I=ԍ4{?Q-6Wq3IG܃v5wclMsǜ8ț,ܳΰM#G\fp\q%J-F, #FT ԧq ;:KC%ޯY/GC Ҟ5a mf0I=FnY&J /L3u_ڢݞG0]'˧$81߻3˼gBC9wo,aY<#~ ob/9Ódpry'8xua=Elw7ٯO[[=NݽYa+ݬ>;XXBd H}n?wgfЏztɇ}wtޯiԣK][o?S˓m$߃<ݒAua?&gp9m,#si`q,,r}yd׽'FM}MYAC pǖηc:0v}`ɉՐ I n'f}ERG%IķdO.Nߴ sHz1/Hϻ%>#_%هvgm -Epx w9ѶYbo_׆Bxrgפb|â LH߻06_UymX{#$;YDճ͓ ˲ uJAPGbXYOE=:^;Il%Nw1t^ܜ!}#c c6pYu8ss3-lb1R?Spr6>g#d(l&R=7-zі $`>wϸ:,:ȶ%aQw!A.;PBN,cKlGn cm!X{ K;t;-<7o#&[ |:[8ߖO;>[6y]bKlIVڂ2.ӈ'\?I2,#pDz_}-e2v=,=npRե<5۾Ccw`د쓜ϻOCir`=tO%_l.>$N,doq3qmpA7Yclռۜo  wo-2|XF 4vd\il_E2WOwKB  u?vg˷lXAgm݋7!:gx-$7!m,aMnؐ{gv_v1 ɚmMcmwlkݦ߾ %a-K r|cwlqrU!t9=}1P/ G#{aO&;!zɳW.F=˗ J`^|7NM1`ٍDvo]]`5kͳ/x]}~{/f^BlgY86͜F/y ?&7OQ@m$e0Gvsq>[sk6 ԟnZ}m]Xь/wc엀.@Z:lզ/MucdfGH=ǩ[1kH 1۸ݻQ!ݺɵua7,lp~,mg\lk!}u=#Cc &٧Vd<'i&`PϨ_#e|40p ^w峖6Gèdn1ݺ=GbXƞ6hda:Æ+N -MtE6"lǦ~u7lzu;33aWGs`ؔts˳$i7{A~o]s۳c=!}-.$R;pm:30 [y[Ƽne'w|w[>XI2]䧈F/taPK.smBE5j7YΡ;Ml͗]2H Y~8 pgܨG ޷dS,}=FV1,xc , %M~#"$<*4~˻C7Rˤaя[~&oH!',~.vǬz+亻pm_IމNvuշx ]$`ʝL@t;##m8&pϑlֳ_/ӥko,r6 aitXI}XՌo!au&eޖpǑ'\ǩt@u8yuݻ ;-sv2r{$HQ;5`^83$4vgloh{g~B;FPQG{䳿le$gԗf 90ODW vlht~AY1g{X^-#w>N׾&Q:F<$-7~ѼuA>h|'{d2*2X2K0zICloz{,cs?nOi~`R]q)V~^l8}Y#..]{rݣ 4ol ]B?Hl= >Hzr8@v!$}]=n#!!1Ȥ񺌗vvs^0MOxGNVvq _a?fk#ɮ+zeubwԧ_4?侍Ooc/g偷=lw!~@  -[.l6!7' 7ŏMiz}?vp඲g>݌ݓ|}FOi@tG$C!ZC=wbyv8,2ͷ,>wu oPfeԄ[I^c>Ֆ+bF@݀ yݼGb>A> Wk;_e:yvz%.gmciukAeǃ:07Nmʻd~'v:X_lrlX7K67I^8 aϓeC2w;ȇa$F<]skk=[|ZqhZaw+:; a0r.>\Gs=qg=Xf˝ݥ^Ñ].@]efA:bdnKF1|촞/2B(ԏ^ {@ +Kt:k&q }LH}yaN{y? =YvIb̒B,:'98,L !|=Lcܘ.#O-L }_>!); vƐ% Gy`|8ykH51yv6[x}ۤKYݽŔ~deGGHvK&;pug׌ >L} g -Ᵹx;ʝ \}{.⭱_/ X[-:,}qL%߫8g>mVg8$8cFNr2geIVoKAPdR0-8r=-?P [4~ =uuߎL6=7sGV^A' KacNN ;.AØbNdt2~G`F |ðmͲ={t8͋u/5+lY{a'e:KB z,-88YeՙnNK3o>qlgl`lK~0]GٳdAlh,r̶`ʭ ./B 8QWyc{pg0noRLX;vC\zmBŏ,;' X161ϻ#ʼnbL|~%ncy#fJ $da@l6 Ζkds{a;'3dK[-hdu_z[+m'\'rp C 1Dwd>^Aٍ3NYt]sYy3G;1$ձ1m:8<%ZEө/TFoc F{tu!$ǹ?۫3;.\D_qv.^y\ K!I4ݟΣٴ\;G;ه<6R^M J vdMY%wtw:aZMH@^du忻[wumc67wg_plql>ɛdC1t,G^pVʹ{tnf &;?+ezr] lfp){ ptahXl6v{uز@ab]%}^_=i d43[:5 BwsD.ᬿl?fehBē]r9k[g H`ؐ?ԇdOg`w=6[h[o!g "#dl!-ܗR%r˸8$;?_o3Rׁtv~aՏ_qmYRz-'Im8/ou ro2~!]8oCqXF2ZaհO1}^KK..>܂è,y;HnbYON;-FK}q0Y-1,%xKaaϼ{kyVDh{n@p4BՄ:q5vzn|vՒ^qm~]l]EEwsJޗ!/~av}ݦrev:ILh`{D^+?rݭuϰ6,kP l 8؝K8xWrul$섁[kucvXՏ#'nH_QVݺe:or4oŻky.v8L Ե ݽ]>^6eދ^z(nwiv׫ ^CdC=՛fa=zjEl ]C:V#:/z7NDt@mG'SܟϏVL,X-=ſN-mٶAp;gSId/ݎݲ>읝MI6}G͆g6s [ܗrzͰ8v|Rc0-XncGSFmElfW>rtO$%>\}kk}8;c a}=@t1+pC =CgL1̰][6$>KqwW 2G}0E?n:=va `KL0ZvGoNGĞܝr}=%oCt1X~CH/?Guwo|xb%8f6i̝HyIV}g9Erl^Yy2r_1q'&( ܳ'DzGeԱ^{`K߲GmvHSZk(}Ks3$v;D/8׸HLgXy=7~f%F_ۏ j}7\ [:3ՇՇM~]γl7;M#Avi3pr5фGqӷ\-pL3 ~1m ,a<ѐ}$jDbu,쁙X'yw3lq(^xx v&Ggwd #[vh0D~?;VO͉ùL<ܻA e 5d0!-e}CO"`}, UĶw%X1P?Ὃ'6X=S`u=RXK%eDCK !ݤp`w`>f?두yo9t]qn{ov?xy,h|":1.E^Ր}l+r*"Ŏ)Gp2|7Btwj!Gl`}JX knk.eg-@? wm.X]Aav?I g9e/:/#;auy.;~%t Gӧ.]oˏZ^)c;6X1[(!Gn6l!쥿`@ Z/3%äȝݼvu0y$x3jogK?˯ hu&.{7f&[9cccիPtzftu5l[Ba% C K0(}2ns tp6~|': ,8,ڳlɉ`Kg᭬/ܠ|9I0vaZ]Zf>Zv-aOr=JPф,05vܪDy'fMѴcУF}Pp eՐ;Wkc-͓+Զu1kstAջlX =䬿lEάN?ID$EGj6GYabΝI@ gH!̶;>ȓv˫~8"} s?/չjY;uv88uo 읗.lIx'fuum Oai?E4T[tl3{òIeo:]6AnܦtDXA܃,N]GZ6v'Vfݼ;vzbSW|K`%uOV6w_䃠^#[+N^ e[2-/ !z-wܯEa1[kϾ:uvtO2O_o u߶dIleH}$I ={h_L:^KclQKqն:x˻^8m"xS?v nCg;E?wŜ\6&J'#4Dijw HÿXs~\@3ԋ'%w+;i+`<Z,S۝XoCܽ]@/2kn3O F FzNIJcl#HׯqqW^~I糝Fwu;Q0w-][8 ȇ%I9r߯~zF냻-h m85# o}~ 9X۲zda ,H / k 釡kz$NyC731g܁mm ;N5~H^] V?v{t܁۝bH>^nR>nI {F3^ 4` @#hp.L#caFB#iH%ǻ.>{-f[o9g9lm/RFLL7+ [ݟN>[v'$'Gݞz<҆naMedt`$F#mu}ڥ5 iŗ;r4]6nG3 Q2F 7o}4#},6~$CnpX綒:a:y8@4C&m/QCau!,0@.܎uv|=$ukw mԹ 軧Xxϙ߁'"ğAhyφ &Y!9ٞz,@72g ]cFOc`t0Qȝ=IIXJ{+cz|.Z9^˥ d6BSerI݇ר.;6%x . IO}XwzF ̇d,}]h4[|nClg\g6X:ee9,8ɛ&݋qt]-0͟-Ael%e,;'CYD[w͍ $>f2gV>TSg}ϒkOUv L`t#߲OI72GNul@IQb^I˶Kp w=47~%zl;ON…'L3ɘdD;LvǶgp~-v[?323bK/8 1lIHMmmG`;{uHk3qil_K^10mrdn6ǻwlNH" mv^> TXC]W*2y-݄(ݥj_9o>Ctu#Ա6[f;?Rlј;v>e GNeJϲ˸1$'wGbYdursm'_||-Nu䷍φĹu+{[K,-}=<-YdmIqO{|͌Un@årl#>Ҥو:F.€NHKZ=E,N1;`1;uc:λZ޺"/ I3;dO.]cĄ{;#Cw> u>nmrj0>.H)2A/aKYwY#+vs->9g%8̋m&'`8Cղ/ ˥)3xvTBwzu\ax:^#;t =In`6OI%/ ‡Jy쓸;>em~?z4LߒZ`a{N`]@ggXYwaKt\CNG%8^ɛ{#zs?޿ű|y' z_˘3 u E >9ZF3`}V<glse?v IrʢW^xY8K) lܯd7-^m!mps:) 􌁉`2t6+6tMF$ դ?sؗa"kW?6L_WJv)z9mԼ'ȘK^$YA\`K?{ p=]XGGqOԧ" ݺzLI,V<CO>%9sKyN#>ym㤻Ǒ˼ul>%KQ,{o:m$X'I;c|QLcW{N&e#ez{vS0w.meewwڿfOKxa-r}QHWè!KKWnEH:y:{qx>F:^c/!GHĒ^$%6Y3prY@K3w۱1}9[a\#-`>mou[͋Rët"u+Xr۵,;h^Eg~촑ՙ<_o<mZw$vl>dWW&3 N>׹~y,uӨ=pwov+}}-/*噬g[?^Z;i/9m_@.uF糶e,I/!`1]F1'՜oþ
    6?&^Bݙ퐑-tp'q7܈#4 ,oݜf uݷeam>- ȹo\KD^{{- ]}qfzd#^Wmck!׳gC䦸&&Iu;n6@N9i”v`P⚎#wRvzw7l4Ruϫ!xoC _]oϓkz l Uubwݙ7wN"X=Fumqegɶ:f6N3p|K#6v&7e%{6ὖxE'e%덡ԬOٺvF8r6;zd,=dIToǝCfYVvC|q@zwe9 ~ {}'O=)]OXW!k3uFVOc':,X%ܿ~_ϫrc^Ξ^'w>:}|7Yx%ϘYm\f,3ËbPR}Xao '<+^KnE>6r0ɉo݀b$bz'p]#@Ǥ@l7[h"5 ܡ}E艇Q}Xiw ?qΡ":ԧLFq u 1B o P !FpߋO6Gc7NB:o/G $Izq/ɝ޷wL C!yS{y 8y8f~K[1iXZ9;{wG/}}|H̅c#b6:->pg՗㤽{@gա@GB##!2mw4F0ysM w l `wYelKO>;#"=ő NǒNl b`e:Kb1t_Kowlll3T(wÎE@`-<{0tl 8 O˯6~lm!c_pʰŀ ^L^8dߴ6˾ @> 3Vd_hΤߤg-r:6@rq)tD"}K%:v>e u)m2AF#b:GF^t e 8gm&]2פbdCN1 .G%MBhXeg~Sg;)!1AQaq 0@?JR܆)blyZbh.0x.to 6h_O#t9Gw P6)7#fy_+a.z6ସ!ڮD ->crDR䁔.X%FXZӚ VA&= 9'Y@ Fx2X^:b MOHxCyf b=pP} (f˜'yu}fUOخz]etcnrffihf멮2PMEnVwV"rL Wf7u' #$ &q8'q^XZ|_yhDQ.r}S&Y1oO?>޿ IS8W8q>6 7L=O`q&{<$x1kHyc$!`ozw"nZy@M:IƧ.C^O#g"<^Y˝yƍ LfD 5׭a>~f2Ksm^p ; nSGx3!&p:XQM`/E2ofEְ_c-.GXi SD0T;`4Zz~S8:/W4) Ç|eV~p8|0g[b?x>qZjwFΛH7d31F8"L d,{X7 s#+N{ȯ:usN?l|爡5OR ɲ9übX8xa5T׌t>Xb)}oRrkt\mx;qQJw1لcκPy)yЄ`#cf5+y60f7ː8!tqrɧÙ4\_yɾ-F| z#oykAb)1 l)M:W^e {CXp 3<∅Г6 '3F 2ߜ8iE 8nN16Va] 8lW-R[ƋUN9 &WT|L2xc4a9yB>5I Q`8>HQ_sd-Y5D.9k!P v¸=+!Vfq";9hV9]c@!QcY)țKlKN/?v lup iӔHCs8gG%4׌4<ޝ)?ޅ {4~9ҫPN&|A>Smx+cB@ZB9!˜I8?$ȞI 1@P" ~ zWԢ$n 9yOG<=59>*.!MqYyq~wqGe`wt.߼XkD2jX') |* usk)RW a.fX,(9ɣWXnXc^s5wAyjylOY顇 ņWne0Y;(SQ'nM ><,x~pwpOy6z1]cɧd1k& `.p&01bڙŸM&HhYKJel* bws&7 2txX$bq`h-(oe^? ~&0bްPHƜ7 R۵*E{AxҼŤp(9}1JLP⏥9(W,7Ti-0'jQiQnBJaz%u )lWI׌FnDIEh uRl(QMF:iЛ~/,X =+eBp-OF8&p% {ri QPd CVXD.k nRk 'h^{DzɝbM; Qӧ9HVEPn EE4 Dܨ=:A1=l>p  4 d5;tqrhsH^rtB|xµAJzB v4*%AG] LxdsjPB@< N2a"€P|X*ǹD&T^bJuBT9MHGXTy}d}~0K(矜!L!zdz>048J8ؿ"6549#ό)Qް.¿6`8 nfpq'f~4 "3٬Nu,=?\WXhć~ m0apK"t}gt?8A qwa.< s^ +-K&AY4~0(#LL q44SDT0[w3V.Uٸ/&I县Xxɬb :j^nJs:0h1+7oloŬկK1/ʪk%LX63շ't/0Soo^F%2I5/O LKrʰoRT5±ۉyhG_\}aRW?FY׉|@] 鰎a^$'vh{jgfJvJ0Hu,V<H+ a"X4hjU05zP 5]hl oZd i;v Q6pݤW̏p!?3hk$[D F)H66Auq/mxpJLdH7&!ZyŒ{~`(=5U}7$Zˈ8V>M "QRcLDndep{a:|xm}p:*>Z־nFG9",b$2M9N>0_NCJ?X.9686yC)jd2g8U4~D=<񝩼l(ǵEWNh9}dw FQfX>7fxM9򾲪q\.E03zsA~ucD7yAlA$_Dr \MS =?YO4}GTp})Nspl|2 0R\ֹBpϯ9/ypk x['8 E|LrL|bcP[Ov/džÏys4[]AjV1ІZ=EHSu 'h W UEh+ UmXpթ_ 8okohY҃~mbE7PC^q#Irr5m ;[ZV&:Z.̠tND J0*eHQN G$/ˌG~ݥZMm\ίAC|_H"P5&H U[@ma8etח8qJ͋ӓ23.#R}'vXY}`)J']C`@KA2CZ|qHӋC.zm!WNU@MAkH%l"0Æ^a[?@@bgY_ *SCZd4)'x5N}3q&9n`^"ᣇĎ?y>dd]Z;/³u^p&.߬!0!q7f IP>f+^,*TfMS ZI޿9y0?Y0xRiO9'VeM[&dֲ&}eg,Yf^q!8ܸ–1'ƀ3j߬l?8ĸ8&ٚYi77?9+M\OftÌ12.85b*3yS9ݯc|{2}]9]8 C&a%<7L0~Sp. B} f"xm uIiYP4wqOxBbLf-4 İsbVQ r}015fߌH wi婣7ė)WN.b+aRb塞Lpq=g8_7x{θt9dqMpzZ8#A9Wbq0nwACNaK8zū:0=c7[f `kX)J!qLX#斘񎋛ۇ 9|dόLscOذ9U@Í٧iHo3utƎnW'9^.9ǚgWX^X0V`Czr}bbq:o:#>y.|yp|csa{t>qlx?8 *q>.Gu=*xW^Z[m.qoGaOz1Azyr1 z74gXpɛr7}<OaJ%ra =lihx$~A.'`o uC&mL¹Oxl.+!3Ծum`-n7$#*DBgXJ[۶v7,#!:,\c=YX6LRo}{M:Fxɳg ^Oyw8jS"uMoE0C97w0ciX;\k[ipBjsp5țȸ@ޜo!]g7񁆞 fbq\[W"ŘZON1awfɍ¼$ɹ?X'?X,q7pιsu0)3G8s}ً:u|LhĆyɉy5 W5O:C4 %1ѭ=c 6Lg`I{[`}15O/VCF83šې+.MwoZ٬ N69p2t ?F fYǜ{:٩!7?YG&a`^o(o *u9_+ˑ4Szp!\bYgY }\dxq<4-ð?yZ:$WW|ƁMMK)95}>/YSkxu{ƚ/!8g|Y<# x`h:e3ov'rh4=03xnSvK^&Mixq` ̚5>2@xf7&Cq^pZuM>S]BPQ8{ eqLF;H<+rp#c K> bC'JE6X_8 +6Y2?0A& q+KWA.HI`=`kNj{p9o?Ʈ|f0d͙74\n 7usMc k.v 6xӈq fE嵂Lgb#oFvY Ug#h^0M;Y3 6`bwk &]̇+T"&n]`p8 >G%nw0Q4.3/&s+8O&O!Ykn5|g{xNyOL9 1]`TkNxQ/wMlSePl`k;lLәo(;9fa$\`!9 DכmGlW`]>2>NJmvb=q9oxwPxW}<1c!xtnR{\vpC-^*q1mva \/xSn>Ip!x:ʢ8Gp.hP7x>3>?<8yf`lE=0+.;08(޲77x> fγKs^n?8{ΰ.r>;oYeuN\roZ-3IC=d(A%ϼ(5|E5pL0ͦ˼oXn1+<8D>r/4gea#3Cu5qUixύ+>sPLY͋&3SSh1,|aۼ hH-À{)dqykb8 hp\slW `nwKXhRΰ6D$xa^ />i^׬'DdWdMk.>ee`\ 2]3@d8p:ȹ'Yx&:p p7$gOXsƱD kpP∓ F8|7`Yy Ü6m5;dXq.0W"W}fyWK}]~X"K1+<)!96fxZe;ԯb3>']fSL(MwH9+!nKÂt8'fYQ9!PͿxRny F=3LYz^'f3b ֲ%Mf5 p&T"CUpcqv?XC>0n"&ӼzÖg|`k"qق7!фoYɯx'8Yn'J LtLxyu\'g+]dx.x߼HLokӈMx'.6dWo\cA5 i06-Z)Xz˖)_G0#=hepGB|w=9Rg~/y2c =fR`H[*GsLMS=@b Ƃ 8_S(„U6d O!dƅ㜔5=Ɋ+28]Cw1Ü$|d\'z4+rA+M~p6xshW>SP 5`6q;gͬU4#Ɂs9xȼq/)X`ڼ9L|.$pnM}@>3q[L]NHy!`CH L$+ό [Mȕ _Y!ٚ.i`༸NGzg<KY,"[N3nGqp8`E]. W >p&ib.o|%M9 ~3N.+7SSW"K7$rG`xp뉕 Yfo&"2LȴQf8Gl*r8fsƑN+pm;N/!չ)rUG;p]B-ln -qd{qƳi@_Y䘙{f7>%aWf\?QT&~0}7x@IdȮ)4r >r|-q?W 5#~1ѻ0ː&#q13Y~XɆ3󏫒 }k'y]&?NSr9 Wq~r<exόp&I r<m\GY3Ly 0j2/O.G%~sdS3v`q5y?qa;1Μt zG>4F%uP6f_#W%KO.in8`xb‘ q522^0U;0#ade-52ˈucɌ Qu#pCNi0?ŝ|aLuR\!єco7pDWF:?8~'X|ZbAn:\r/oÝgq c3> -u\V&,hNCOyR4֦C\̧NWn ư#I:zs.EN5Z.NIlq5ްa3ysxo\`Y1JF=lβ g?ɭ>ÌBcy5<0<{8)Ү'7<<>u{9 ļk-6\Xpǜxap:0v;ºZ5!X/Ϸ64rcO |G:>|R%7 #z0oV{{n6C7-6G ^M`97|3Y0ό zBO7$fi_OoN7.k6d񻎿;ϛ(u^1<`h=x&C),gs̓Y:13 0ca)6Mb1~hX6BaSfUǎ#\&mnF强g?"̘kq+,\=dqwX3#pz5q~-~e=0&(߼Ecdi~|fr3eo6#͝c0fC%߼jS#YnL{gbN[$AVc ,8:Ⱦr^ i>Cb'1x|br@['/D8 ¥~q{iy&o8&pWX/xw0Aph͚ڸ߆lio͹`C`xd0\>6Np1ywr+͢mu5pUsDd%F'9w=y^OYxy'Y0Ma\,BpWyuMhy7IsXI}r\r73f] )⇼#'7njk0I/N q5+R(:ǫל%ۉ= <"bvᬀ{y}G7qo75~s y'0@&#Iq'NqOpoFa㼓_rNx1V5uuYVF\1ϑ2{0XiN0<كq p~P5ۄM-Ȟw8vci4X\¹L4:*vy:8ۼE _ Va!w]VhX^;02oa/&>lJA^0ivI,/8 \ C!C;|dS IM=i:_DxM͛ΰϼ 7`GxsxeԙFk>L p۲d\ְ: 0 sOW,NĹST)SÌ3nQ2P93gj̧LZ'Q~g|biz0Nry&fslٔ6fŸϜx0s u!hMi/p(scqa%x/GB>ryo3; xm#&DϬxkT )39k_d A5N3OdsN5FDzğ w=`'qyy~p1 8L;ÌIS o9r#;yO7AXNzGk0?ƳXBXz_X` uNv`p';Y?\co$^sN\ q T\S`Ml?8 tcnqq<uL@>3s\i~1YbwS.7/[2X -=.7сhzZr/8f^ekMu FHv\`7r^2\c [ٽaɚ\{g~q&}88o dʃ( GN (0w18a54bt Yp=bznr>0pddr&Nr83wɀG/>LR 3YDC ^ *l2G/чېf㌅Ӆg9Xq&?8;qXvߌ2dI8?9OSsW78վk6ݏYDyC2f+Xoi2 x of0r%Y2z/5~q0߬O.q<{X-`ngX'9LO_oN|9@TL\gXǬ OzygGXOX1/;Xەf`NC|̦cx305&29, d:O۝$1_Nxrs[ x3eHo17L ;ߌrkN=}d_Y^r ]$.5s@"-hLoMCAI.@*ߜK@xϬ" < YɚrbFB{]aq&Vˀ4VdW)f89q3*nEv Xʞ_;\Dt}y(l_wGJ'kǜMaɩ@loO1x bCrYb|`z6{y7CzLg.r2fdr0?0ɬNq&F`<9w#qw6|U:|~p@@ 2>x\d;+2s3~;⪵WN&off#0ZzNqXY pÏzɞ35 YƓ!8`}`7uĸqyrdn_b`0_zpun~ǬkO]L.|`50]Df|F?#؁ː8mƟx`wp`n'SYhbVaxll X}p\acwL W2oSS".8v`?X@.9p/Ʀa :7W71Gx?x<`dks7fL?Y'xnFss?!M`8badn!?8L&a{/OYӔM1" >OR_F VÑ8[v]["dsR{NɱZw2>0=`z8rnWfOw22n<oG'1;Y."dr p%{;Ǔ+_|pɅ r`_?xRD:\%y2C9-"xuA6;B\?/XjZ `Go0;Kg|=`7n]cpk#x&53 LnLL&~r. >_C:qB$㶰Ym~1 9#ƏIe 8 f|dk0NG\Im0sHsXs?wb`ypPӌ'Ӈy7½|gY>o3w\mSVnP ~_v.48~p#hb956x.W{.6s;?]/X[bd'ϧo%'zďJ?YlH $].ˎbp3^2dqis8pwLĚkpY0#5d ys?9;:r^"\ nCG{L?Ï?'#J:Ìq _c|˃:bkYu8<w`lNp1qfm(n:8p}b%ڸ86a.XEn& lp(69Zfny=.iל EZ;3r`M!B&ۉ[f@7&w9ʘmk[X|=. #wq6dL)< pz_ߟquX65nC s8;pbLnox!Ɏeb'8Ǐ >.s׼6[rMO|uÆKM36cZMsxɸ=[×#q!78yYlrL gn^EPnac&>!Iwr>qֲ,ioso :wrfkSܘ^l{a83w,{8d²BSYO2hɌ3w}gx'{t\\37'=`{M 3c١a^0p 6dz5f28kY{]`G8=\Xv9`7WsʎZ]aY2`)nF|'G.G rnr'.BiG(c'YWdLG w7`nGp!yzx6` S%% fC.*U04g1=p royMp ;k­6TWwy5Ƨy]I\ v}aC'LÜϜ +8 ɼ'\rf6挸o>G75n8>0&784bL7MadޮG9 ?/&LfW6d:0[:\ 2??x,`kXpӛu__! C.{q4p xÞ9ڻ[^03C/83lL/y? 89\XsKz_7sfdpIwę)ɏYs:ɽ`/ĿgxuX[w'<#kOs0Ș7lۓ=o%"bqId\ZG򷆴8Y׼>3J0/}b.#)SqݽaLɝd?L?˼g|ya3YaLr>0=r<`=܁8%xɓ7b7 qyqI'nC!wٟs&}r^O8h.q6s!sk7s6N2aϯTfW"97kX h7yGY~0\6%3N&G&L8w:;nя9rY05s?8ka{~0Uxz 5;զAb/9 FvŹ:ɑ܏/njd9Gɚr.= `;>iwT>ZÍx<ېuCXy'y8̞qNqّ&yǞrǜK`^roOagk :o\x0Uo  !y͹<1ɧcPz`x8W c4\9Գ'fLxɓX?3';8X"uM8{ǜiunV:uWɆp9nC0K ׎?Xsspt/9!qw|<. SX 6ϼz6_FyS9hT xS/ÄӅܸru9yw{k$5 &͎Hܕbq`aAz9(θn yx)<D/. mo?Yb|+'=Ta-C0Vͥ ؄0, "߼Ӂ0o뉁R +9VPwr5e ܳ>Iy L 7^sLf`|[Xcfo. .?9 m=., h rp !,% u> r 4C5*aNrVl=^u+Νg9ֿw?|c?ư5FR 4[1m͒O'R[5NgggmhKSPg#W]ʒsWaiy˞hk.y_9Wdo nJ).7Z&ix\~psR{.T>Lۃ>ѻ(ie`]|by:͠*cV<|C* f &Ga g>w\p%vn))) 6~xXV=hV$Hy=#2y q^ f缹Euk]gh)vÀ.l ;o U/Y8jɍ9#S!Xgf ᴹ9r/g@ g2_Q7ASr׃!qMmNҡP45çI:FddT*Jzu0 @y*SAv_,'3~ ό?9c!(js6^] Gf`/X+y͘3^?ʣ i}LY0M9s7b 7xJ!Zk:Z)xbfEXZ ۷x+*o ΰxo#9GgT9rcZ 9g_1ۥ2m|Yό9w=L k/֦ ?h7=O9[k<"fO -GB@B lKjDFa Mf0E4h0 )}=h4(Rci3gy&C?߷(O-Pל@m[5a_'0] (`3EwpzϜƼx i3YC&sn1m9<ٳ1?IV",{a}}p $JNu@n Nśq@k [汐xoub`(#l8I!LdY13y'*x#4lg0/-wsA;3F4`K}aA'b{ɼMqo\3CxhiA&puJ0D.)׌0<qyP{É\d`".%\9p5deXXeEPZP81eo#\̯_F-1(iF%#} ,ofhApD{gM X&-6@MB#x "w6X7'V^ jތd"wyև<ʱw=ID1YJ`%)Ĵ-`Wvs/xx LGp=927ypsL a˭23ga',a3L-{1G\2Wc ChLwpsNr,xD0T4)wڍbBum =8 fv/90Pof[mM$L:J٧oui x[}ΰڬ')qjEإSA`G`ws2kfb1 yCSN}9䍝`cX C5K 7(-a-$8aS(~"Wu g{0#b@&9?dp POK!H5ߌggx yf8!5UiӐ("7kEK?X)-Хnokq9Ӟ㝘W~0X2@9:p@$ToC= 3n@1cFk=z~1xPI_r'|pbiVʒ$ q5F< 5<)&Uxգ&xuXfvhxD8 q7ε, d;9=]فߌ@ hg!;18q\alxWa)?X`wCJ]⼧ÊaN2]PKCOJ yE4x$ y8,ȸA;:/MYf [Z>?&|Su82N[yTy=D9tf%!F篼`lO9xgJٸnA:uԶ!AZ!ibXXI®j ki ԛ3##yV`EoDA·Nዴ"S^Uv<`7DWeDF wqe׎2/11ƵX|85X)3U?X8.xʼtV4(臼%-BOѶ9Ol˾D{آ˜~|NX_>1V~p!\{0XPt7~߶0<|ǩ{(AlxlZvھp9_xy44]wW 1eyLB|F+֝yq:z{45l O&/Fiy|&o D̮Bh y~YHqZ}bk}?]dXhK{{95q.:?\N\>x2.m~1]d=8NK!$[y1;C 7 547/&X@'L84CME%>Fo#T;sN^(p5 1/dm8YmA' gc[y$0҈|dhUk*J"1g_8"i4޴㵣E-.(kW00Ms P/LYY;0#c&Kq[L=<Ը+N~099dLj^y(ѵYoSbu0o s |3E-yKcm|/8w([_Rپn=emu8$X xO 95ο6wu0"}:eSk y`X)o἖؏#|-,~s@ź 'p(ᘃcO%]T@*CS +D  ۔p fOdePGj0,Muù_h7ƌP:U˦<0MYi{`,)BPErZ'H@\s`*ZT6 ߬y2=<&s:lݣFB\Jۓ!NpțLXˬMqwX]z8ƒEp7!!p5p_cg g`{]uqPD J&LjJjCw >2<쏜Db0;NnPRDB=g dEyM]0^4 AX7=Ba oڎ(uWDŠ路f(bO9hzi5 &lj w*x/{O "]/c {G~.r9vbm ٌwx9e(5L$rc `M'OʹOh{72kd_s>L(5Ǵ&()I~ҭMM ְMnnvp:OY_nݴch ʆ5v>q9~?YΩ{'pSff0f+w c_*j2x$텘$^MocHLow1ik ؿeI,٬tywTq KzG{ZGݿVGnt^- u`pmťMDѠ 4_ !6aSR1)(bÃ&XIL4ôTr$ -٪Ek6^zHtܼ4/xQ[WQm',<-L!*D#ic}Aی3΅ΰ& /xzu˂a]w4`XR8aJ۔J:iኯ7 #d=1WjxHb<`=9/X7h5A) / j C_3[Ao@/diOx +ညmUFi"n9UI)4q ij^GJQ}`pm.7vm n NpIlT<vw E!m5=7W-x[]61nq]dlX:6!4z3&2{w7εp8!p& #+#Xsf88f9qq@fuߌQ^sdtU/֮jyqg|c tuCF]Oxuγs\y zĒX4oXsJ;NT#oTFтbC+̏[ѥ !|`7ECܳP|?xO>1QP͍Nw58sW|ɚ54ag_LfِJY ÚUz $unH,h;UHًWPQNP]~pl|x4ߨVXp)UւǬ9:v$^}d5@ڄf.) w"tdiDw :<T0#KA /'8-EЌ *HBƊ2]bE0[6I1GLMbVE$ N&vXG#w d^_9=9N/?y3 A?8T۳?,Y 蹝mX׆nH'T5 '\ mwEpH>B:!|&pÂ)`ٶRkpC܀Euӥic>WKI(`4x7Ɓ U<=&Ɔ&Ū$ʅMx!mhu?^<_bj|tV~qY .?|oJێO9&q,τ %52`՞2f i&jo|L[usmަU#s"N!SYP 5'/;z^aX(w sg,kyxcͻC-zH/pe3KyЧpŹ|b~02>iLF0u;=:z9^6Lb rc,ˬ[cs@~3aJwy 5K!}`|;Ćb5`kf%781]91U}k!3bޭX'(yr8o>2b }QkO[m+Z|-DT3(g]fO+ҍOp| F;-ل8'B&5]x\K#ad ĥ}{" "SlCaxDqEֈw+qEǢdoO .pygYHi4x۫i9kT;1fr#`izَ%}dsX˿kn'^&e,'x>\Z4W .yrWK>1ZFx5|Nqj'X5z\6t]8W]r:k}a*s>CQFA ;O/8  /ulޱ]MJ88t> {W*7co.~\Z^aeIv:pNe/NMɄ`Я4l[yK~0KZA4Wxoˏsdw A g41wW#^#wu' bDHwγgZXz\@=(Uvzx8zf0ݡ@~y=g7F; ̎h {Ԫ;1d qHsJ A#wnQGzB)B "Jw+o?_9o+;øsssKK ~@qtaǼ"Rk7dݝ@N.E$;:u#c-qƦ,1vu^ބi~Q`2| vwZi)I jQ݂u%k\jrYG|íIkw.Q&ndzÊU!7У1iJ֚ZP Tlyv`' M-4ʚ(JSWˁ8bM82U,r~c`qzhvDv}umyM7 @3p4nntÙWpEcu<ޚ:rH=/&1tJod{s rHQQ5Bۄ▹8DF]_tDaRq1r/-p5ZTToY3O {Xk RJ &.z24s5oa.' Fix=e `C-UcSv~บO[M1)%GfR,j-5G¬գ$l㼨.o>  6oRYQ#A8N/+SWt2%]y*:PqDi8h|aˍHx 'Kf H (ğN!qB7TwDU0Ms/v;WB5#""P<.m|P?WJj5TBBPL+fE scջ %=#{ʆTԺM8oGvmZmAi~pO`8+E*tkwWpt]lxTZu5;" ^UV:N5h"R /8eDZ9.0.nm^2an$*;J--`P@k'kU-t#/GW\b. 7hS*9z. /G{0^rx M_k88F#ކq dxu:ɞNٯ\a(མJ&}a>S}a?XmZY>!V.@5|\JroʻYfT t`%aTa/pqVǞsDUNx_ST1*\{793ƻqF"@PYnt޾ aHS|We82ikD 5)jA u` |oʾmG 3KLoqwiӛ;-P ?7"[ai}7!E WsC>bZ 9nw@$cp*c.`L^Wуۑia !/FX\"MVkHMs"x*8Z5Jׇb*z+K${8%]vپwo/~h:ъ[\be Vb!@)˨m5D >0 !r 5`m  G4h@DR&_lΒlpsw]]94)yz˃֍\w<ޚc(Mۣ9je+Ї8C}GII(:RZm"phj:tIRq!HtRo~`{'zv?<|o*v;$% ýxZZrCФ4vfv#e:Gxs[u'@.8\[8+AWS&iPbyNrӸ SOv3B C:S/!yzn"Yl:on~S"7ajVpAP2Shk {` v|'&~#oUQ8 f%, \IPjDhi"6ssarRQO8.#0*.:Y?#'X zNnI3W2{pwq & "eE q LUae&g6L$r?Yoo:˜W63`oHxѓm0y\fj9aM;`I:&/S'zDE X6oSԡ>gk'MNüLHۄ-eq!8vdp`o1mÏD]~r}Ntz]xx~ubIsvAuwS2g0VXL-p ñ`)/cN0FsNPLjO1w Ή+B 8/4j!ǠFxmĕy G~zWua^ҭ u6 ҍ6z(T; t ]4B*LS@UΨ8>mU7f/ 8 šNİvQa!R2T/^B송S:yx~288bu(jGm,4WE /7Ōت4҇7Q#g!oj4\mb~C R@&ijdJwSS_O `|yvO^\vbayt| J[a즔5ÓFdi5.47K bzwaͭyko"ʼno B܉Oh`Ma)Fddv.87*D\a ﹄U;4n1ըAyO&l60UlqqNچ nخo0!y)(G!. a1^[:V5x5S/7^H+WRk|(JnW٢ksWG6(E7眫j4k!IwD39#]F[TİعB^KZwFcHxcY79r~s[19vVm͊Uyp?hbylM` _Da9M59g(7 α"LO/zއ"LߜYK.wsdw`Z 6Fư.M= wѯ?}`f w;1qd7^\ٰvqbqBe}9Q<O2`)Y^pe^^pxߎ}c&9 \:XdGKi`C|-Cgkfp)( WvL wX{do/`Ewn(H:]y@j@ݯ'SxRlqDVXEz aЀmy*"1^IIWZ}`T&hj]sSe]"9φkϪg~cÀϐdSpL=6 Oyбȁψ@2fBK(yhTZ%6` 8(8 7x;n2r]+̬V.;,N q!_gAY&:y.dwvvēa0 좔71.@Нpg&dμ2 ާ/W e#IݴMa`Uy]7u[rqz{ ` Fk@``EC>9O`do07߿\H7=sYۑfn)T=MR4A(#r#WBǏpT}d}{R4&b* OXxɁwΰ )ɈKs| փˀ:2g9v3s  ;oM#7ß'nopӞɬ(iG.ed|}Xdrk4?2/2,^|sDZ*o過oBNXJX]1l#1#=^8(+9sv:e yIc@ W!-M`  -43H~MpL[LᒊfPx9h?wqSo,6#M'`A2Ù;'Yrɯ37:ΰ$2? :>V.|C﫝 9"hp@*V^J4 |w6"X7k亥AHg]T.Hӫj4j%xbx L dɗjXK6:zqG$<*mXsZ\4q~p8ĄoDR 7/rM M߼"7tb|cB`wWv[:ANv gj.Xyj i`4j{7G44S*m"@xž?=.E"֩#{kZ5E%.chڒ{qf2w /w` 낛U\FƪO1-rGm`5OW0E嚸_)GO9x !fV;b.i;͘S[ 4G1Zbg:B tțT̜.w@9n]c ׳wXs~U 6F0J AW~qpLJmؤ}05eEvu xp}m s3co<ZPfcG{x}^-4sබ'(@u5mI*02$?p4'7! ]ۄ>5C:# }zsoTbw\̸i [kfPjxo"=H~2K2UoMbE~Np޼Sv!Ǚkfӽ:ve]X7SoyFLH&>@bDtrنM]B<و[C/o#o Oc8W3b|eT~yM~PT &Iiri8(>$l8^{SXc,P {Jqb gG3g+ WuD1\h5 sHz"ˀy^wTPTm*kXP ٶ :qHix/ FVx'(X@[b,e*pM,YŽZ>6=K5588hj F63(+^jGji6r_N*TmnןE'<9^H&hGޫiE'|cTH9AӉd_g%wow k#΋=⩢@(Ҏw"k{VN$3ȆuF?g)ZTq$:C}y:V0z.H(d=OayuJ?byx(-0(2RA~wR ȕոp ֹ0N{F7\'rE(sNC@Ӂ1zXWΛksq1D/fTF۴nĝ,J/7 2 ijzEqٳ]&azX;1ȧx32gNr4o+uKw0?'끹%9rUc=`+1` >2 șo ZaA3W>qnzq[L(? RkA'#:XiZQRxS4Hy~2K k isְWO8xI{aֱi/4kC8Mra 7dE5)ɁD_xly۾0 2+قx2Xx]L8w KՀxY0vk7{¶MJtL~rYÂe0()/F̫n hUS5%J^Mᱮ^=J$.ZƔ.P.#h׎.{9\Iɉ{8w\e0;u)4_s@S hxvBju:8 Ǫk hz[tvzʠu7q9 pwC}dyJIVSnj]0DGw{_4&"uɔok9ofbSZL!]5ޱ 措r6<Ep]u&isAn_]8#Ð㿌gI445W>O?&kל(hi=s_|Tj ?4z\- D$zQ9&?`,:~a)U8?SE qmP &u8A/eaIGWVi֪'rord؁Nz&uji+h'(8.c\TKhat ?8KzJTJl3r4:?*"j9i;vxG X2^0Pvp7dPS`?L XY6. Ͱ(*pf6}Hm܈TK`^vEރY|*?8* Mٮ8D=wz3 :s>h%clB| I.qF{aj;9@@ )(P;m:2+THGeR#|PF0ɦ hjp9ڦ;+PߓQŒxMLӸ|IsS! F Yf1cq3\ϼN) ɓ|3]cƖv.fy~7p> qLiϼ+ӄ pۦ)p|#dk |I㻊 :K t(j[2#N( p+7ͱ]bDT]/ق[&޴r/(?X{z4Zykp>L ~6k׭GDz&@͏JB,ֽa-QA6([p ʔ.ԨcDVNd8hʩˆ:Nb[N^qh,6QiaT}6߼\g+')VeEBqv,l>f$pm[ҽ!`v+>]Y4T^Z$XF|v};D ER4 )|;s!wp0Hqi~G?X:Ę77\woh-@Ķqb}\ ݊2Y]IaX0MtYx?a(/6x_zfbX"}bwﯜӠ\+(Exe8o#L^k96s٬nιQG7Wi1u+b`w5ŧ0ao{,c=a-(&_qwbZ/ %we߬SRች ]q06%>2Y}L]oD E#hWyw參e:_sՀwl(-J_bqBH}>`‘^scFX<=eZegK@@ltVזΖHB!p;ž8]0HZp&ST7wyZi ''0iIJQo\Yv!SRՈri'5Jh:q2#P;P܇wvhV HMƸd9"`aq8IpQl!t9f3l 3ic1uCc) 9ŸMy<@*..CoN޼p~1x!׆';.|5 vLsml7Vl'3\p6"k*oƺA"|NA<)^qk*hCS{0ėEd6B?XDT(*^iқrS $9Y _SxdZ5g8^"!G7FSxi6g仐DU({Z1- Hx%e@&ݒF]gPMgU o(yz]K|e^Kw&션aXh OnO3kNTMus/ ;5D@: lDRv/%$BVv7ʳ5 )<̩Pel)T>MV x;~#]8㩋x2߬`6}ar |jgTް&E]s߼5D_o[)q܀ˆ`qz缜ZS$nӼkCis(8a$t~Lb]FEyu3m p96.POY(L~<>F'&LJ"݀|õmX" m`:';$I+1F, T=4z1+0y >ÙC,jhy(X9LRM5*9j fƔ`ގsSv]qkNѴ7|rl{䞻)u"``ΐ Yf $5·rx},R?:5R%"&cX\zF$ÇRk[]Ʌxa#p.=[2?>t3R3|m!] /mjmaRt)~w^1 PYnsz T6$zC;$  ͝+ηd#8 {NIfs8)(rT=L/K;[x5PF]Tɑk4*Wy~(~iJ[$ξ1皙|/$+S'URִchUmURzz648qؤ"2pԻp9c$_pxċA !n0 ! hƅ^GwMƏ CN4 w 00kqqx&L "@lekr`jzےnl\ EPCS?x!@1=0"/c?%mX :29{L4H[&4xTۋ:[rppV 9 rO(Y9'W&bsE0ŻһśXcMqȋOY+鬚,p9{k@V`nqrvr/\6=<0/) @r^!שׂE!Ð"Ua>3׋9|g34r S7q^fr;8r穿8gXǖN[7XTg Q 1 w猏[{/C_& ;Q>2? Q+sTl('7x 7 +kflfu{>. Vp+ל nJhcfz'NH\/)hM8w6*s`^LWz&簍vߋ3 @7큷i$,pҶ:WeJl3h_fXbjgC5+TAED T@D*(Ӕ;sz9HրfTIv^r(<R˿\uV/O r#5ӟ{J"uZ~CYz@-OG< ]+e&n' i{sQQ΋xdX!hcW ܳ܄er|EK֏}+pr->1AV 0 "`etb‹< &T\C6비բ>Dxp>dZTQWICZUrjIl'+j#I" iew/h]Q@PC\|,vc7x${H1z7Jb'˸P]\lik.\R@ Kɱe`~;,Ô-.*0ucaӄ',}e5yʈ)$A\>ifo[o4x0b(IdE5@yk*{P[FFa xOa?FSE:s_{dM%[{M_ܳ^p?sXey^:uF naF0z20'LAC{ k? V8Smp:h.n;:= *>5($sp~. njPـe+3s" ŶbPwe9ln(؋61q?ξ0w5[BB7S@PY@)Mo0}0"c4sэ_T1-p&xAl4E# 5E~:1N(6 ~ywH0NAÇцQ+~C{JSdZøJQ(D,tx,%CDJ%7 "ޕQ*e°T8xRњ74hBKJ1#U؞hvv$NY |Zh`b)x*08>=ARy ~q 9HPEi٭!Ia`'G褠& y.Dz@H0ZDŽxf!0G)M #XʸpVA 㾝]q`.#]\ seu(x=\H9~dBZ<@Gѽ'|BֽSc{rƶǭx"oxZrӬ &LHφ*_G\Өu- Be{+kZ;DL6(k^Ls&,R8:ʩ6#/IQ<"1#3OyBx1S:%|! 5mę(G AG"S4wr )$pqwcDVNrm|uԙC,.0L X`;']ѧ)ɿ!5 }g0Z0#?S.Xor83dMX;O}[w͇_-㥉|h ^G j/qMm%i󕭴cf0  9<=ԴY6(2N/0xЭs|`4Ac̉[7SlgGY5qkj#J+ȎVpywL/Ynq缾yLtM c>FX\O_14?x׬ ٚ9.y=$ Gm0y(p t|n ōk6<<8Y'Xef[oo Kbv͜2 fɁz̫7ytN)gp>1x C$1|¦]#v |L q޼卖z3 A C?fރAX+' Py!x-WhwowhJ"!pQArDRÚvXl 1ap(Z ?c\{1^ Cyp녁nB&À=*A@"%`(Q%VJ(&`.GRh _a_,9L7(i"`4I[!X74=)Ёn3Vy4h&HĬ,#U4Z5o4"'*"sl<`Hk\~I,LIG+zpS=2ㆰc9Y1Sӕ{.] Uʒ@=c]@[* /1*~!P9~p C nqpDLP:AEw< _x2W'0]%މT}k 3xvE^&A,$|m19 "Z;GG5A**RI͑#BK lVM\M.UZt" !0\"%SC|̀"AU908KxrU·D#wF닀аbh kY1b|0h)fr*]&0853T8_ w{d4с*,(0@+6"DI Yn w93U۬.,1oAl !NL~~%޲&|b=bT\ـ05c?Yf|pW?0(hI`6f!>2F-y'Ӟ!Far9Ga]o'#l“)|189s?g;#/ Xd?IK= tiʺ_3Y6:Q)kε~/իk<1k!;fAtNܕ]7aG pB<'AG!T07)';Oq 9ް @j z d0"0#uOU)lEQ4Z׊M&x'Rb ܋mMx$h:2 Y!QR0 Ko(@-]FR=]cU" eINJ]XoHPIۡ+hdEI';׀*KOEKF<$؅kɪ^*I]5\h0|0yŎgMP4) e8d, ji`Ma %i ȢkS GOe--][]JM57\uu 4U= _fZ>;Wrcv?ن}!/c ;4c#tAqtUh{bFcx{(q}W9 -A @yw*"]"w^fBиkBEd "b6 vaCCBHhxM~5-M*Vjo_ tCˇO<\b1#e/bj\NEcρF7HX1ͪB6vxmw4V$/#T @@ GƑ9Al`fItY8t4 h)u3Vc^E<89?R|1tx9Ggưe`cn"''xnII`J`+p. rai>ޫ7}dUfVd6 93E^&@}ay0>XI Fuй"2T<ݟYwwm6A:q+bm :zp+>21Vzb!Cw]y1&9^b 4o,V΁LPo݂r<*%0$u!ۄ"F;~1\X qYr1Fό~f vGiMfOx=8ٚbg `@{rn68Iihױʒ)FM􎔍cJ<%i[.3?qr_8w TAp4G m- FWIþ3N~a`ZIx6:aauX6JЍMQ8@`&@͠!5"6jz^.Hr9 ZdV_U|aiX2 Sgq1>ZAx[ hz)/.|xM7Dm#5:+X@Ӱj\ӇѩFWp:'Ah(/ma BY@dAQ s@ u#Ƃ73s5M3yk %"\km¹"5pOa8xʚ㻌&ic9x"2M{ɮ-WGq+_xp}GYirXz![2% 78i&\PW~pnL28T({uq~YN"uH_8+#10"xxI>seN<|e{t{=1_naL uXQ˜=dq YK{sge‹^//ۻ urLx&~l3w/X.8(< Ʊ]86=4xu΀Ms(㍫.dJoO8n]8,Xƾ/z3'V{7,(OӲc!3}U 4X(ڇ"R!i1Zbt5HŠj]j!(cZl>6!䏔`:1(lMRlWkNg N&:|G ĭL>0Ca"48,f:j|eN`l0ְs 7rx b)z`K0PD~sM[=`(3a:_y6¥nrٿX`j~LpbY%ܡNX35`usBK -l0~1 1'?yJ)SqYlsἣ! "9B$"5~0f4;(b41 T>1#`"<=`%ȏe}u| lQ vcD0Jk;i͐ĸwƤ̾4&Iυ11Ǎw?Ӌi04IS{~<ȼ65SqY\"0ZPnpە v6XMq(ࣟсlp6ie YW6ZN"C:7 I#)W[` !u1ZB(х4vלp['l| #rZP8IaCi!հ=xwI FKόW#D L܂Qn 9LSPXiT"̺&\pet G-gJ'uC`E-yTfb%XBᱡk,JBؗ G1VSۆz䦰mzriDt]7>壣wyWZxXTk%<MS@xۼg&i`b^}7c :Nep]C%Sc#gMs0fF!*1)# =`CxL#@(^#yb:4Ph {̣k8CX侯5)C|@ס$If޺.ѱ!;@<&iXk QsGj7+\IJ0J8a (Sr#Mp$&M>`[UT6=h(y(;r21cƵ-)In`X%!0 )kk]5%: N?f_L@'dOκ_"g#MPf5";1O̓nĺ_tr=[''5/nX> ߜy9 `L^_QL~). mLK㶟Š_h>Ae}nfK89G1C]˾u} :ɋ7 q\/6:ݚUOwx΁N /*NkS>vhH\۬sىi!.*x^XRMSPPrFh%bFImh{ e5PleQ`83FMb]*7@qxk5Nx$ ]ۦnpiRLr/]O5Xjp һ!:gpuoy *Qxl^XQ(Bg7hs[@]5noy'x;fGV$3* h!C"ah=0w〛Y{hBW]|`7Cm;{XbGK]&Ghk;9v%窖צCǥ¶cE)C‘),|iY ݚY|q0#PimcQ0,.c&0 r@+0SZł1l* ]! d'3 ѻ $AAt؈ z#PTqoZiE!xt~$ĄBgZaOp_Gh% 3%k f5 %Qi&MʽMf3b0)g;F9ZZZP 8] ֳ[@GӅl⍾L 0 q2&Ҁ{h˥G-eپu× Nɬ%E6qǎ:"~#Qcxx #Eb)PU>D#AJkk$5[hQtc(瘟4%H7k2cAɂ4;W8=o6aq9W`9amYőÓۊ4K&En.Ĉ]'tع<`YO{̊ol-*O#Oe}]chb#^gƌ fxǶEI\\n`!*gwC6k(dY Af(8q[&A3󃱬WXoq&'aL f)rcNMLP]⸈7b{iUbwVkA #fXōkn $F:=~NG 5T#c6/&s\M@lُ^琢{ ڶ#FUE?5&CyhmY^)PnX{69 )a`0\.hɇK@XATM\Wg8ӱٓkDkIӑZCPh #xQ0t)A  DP([ս=DQLhP EF8jPg6w$CNNn0bAygCgM6m/5 B6ܮYj˔x&A޸7~bv -Z&{ 3%HhUs@c vB!ɡTMP G(RDΆ,i ~ !Q:Z@.R9캧]ݏ|^{obd2o޲aK:ߍa9rL1N؂Kӆ=(E[,ZDv;4QBSD<8@)cנea >hfX;<Ѝ)Wvr >"\,v-hp(H?DqxWvvqf8B,ֳnvfROC͡J_C`" aȒCySHSk]ᕒvJѮ-\"0`B<wÒCєs߼Lѿk0Oߌѷɜ7sh_9@fjx5֜}44%8 m|b70[wseA '7b#aOxxg792æ`p7_۔oW!q5"kQ9\a%4aׅ#rOyOxFx"U<5o\5 :xkɬ.㙂ۜ7Oicvxo4 ӊۙe5~?n@S^p܏-׽c]sx.?#9nӬWG&wy|1<'SXAˏ-M*Š$8={˦RB4RkPHklH PR[g+vLG@qd}hkqXyl#nNMHA8$8N0riUYfסҹS9,&8rrjm!'4NQYA@QX+jO:Hy3ӻOF=dzߎ( llq w$fxK4hj{\Vchmqa`_Qxf9:KBT4r~TCQxeR·X:kHW⼄A%_j]_rwZZ) h$ʄ#Fh=455W"*G@t,?+nj4=E #ALw=.6 5uDb=Vbx^(gߌ`Z0$ @+i5O2 v$r#@jP i1!UN=]1MxZ o61e@ꜺHb,%)űqb96nѰ5Nhd1}hN_%-:jy&HI! \uo.@AZ.h,vr h!S` Y;="v0k8@-p[HDP}!2M;Pb=rMS󖚷ч3h90\EkA07S9Mx_8s)jVE\ 6s9›ƛ[023Y1;us`3 _8Y9oόH̦}I?SqFox'qT2u 5׌'8B飔M\Ok뛯X+P)D㜛yEv;~8 }o9I&kơw1kY6t:ugoX>LscOf-YOX|τv> 1t"<],{ tzi~LC%[ 8]ců-reT(˚EY\|ap:1)M+zrwzX[һ.=&rX9̓] U9}4G[a9;ĕHWs HkT=G: yk@ v'<=9'%nvlhMإ~8<#(l7׶.=Lqxkx;3ړD 4'-kLX: #TS. eάnnFĮ $m iwT '6Xq# YPN!?D^Gp½׳ vʦ^3|b!dM Y,K\ 5Ca4KtECupޅ)͓b8^r 8_7ƙ,pe*O`\n&*촩nr `@M?N9V[VkX͒/<$EOCuMyI{C =W 6ht CDKןYgܠpØ/e m pb6\*-{(ܔ leٕޫwq@Ҡv:iqЉ#QK \1.P%7U"NtQ@-BGlXT֤&a Fɽ-h RϪ.@v #{3nҴaOH4@IhGmw0^=~ PaTӈ64?,,6&^MA rbCdŸ%flO3U8X lsh?;CY2k$Կ9_Er1, H&pj}g([|Qۈ; b&1)W -LjkPf4s|ܡ֌}w++}eJNYo9N\C)ؿE4>r µN˛;q.ro 4H!K | !QS \Ldt *)䄘B~nTj"$D"аwY“K&U"$AZ EaNA81D`W%F.`g@Rc)K[&ӇkNXoB$wT %] ڲ[cNjkCҁ0hsFTr7'o5*$CMͅ޸*Ѥ9!9V}p( ". BHH#PSH<&~,-^YXE{tm;8uB&X>[E@r»sDJD7Zkv[.kEe(6!+RG&AhrZR ~ TqD+sTE:Cz@&FxHB}C!fY6& G@d  u/q!ʭv@ 5 Q(vޱ9cWa0T ih,T~f+"o B h+X,}jW^ЀhVa:nSj^X %Z %~.&lit;åhy0u/hk_*!C([X >qfQ?@֜qw 5.x(ʼnxurfݺqyE'wn%6^-u v0'yFx 0#g0i0h:jzx&&b٩b 'W߄Q 8ӬŚ7­;tڜcԇ#c?8Xe ƙuf+f1nc/^C80R-@)1$_(71mroP`MpKp6*k4{ę],xD@VbJѓ-j!ɂ^O(u& ȘgUl?\N"4?8|I g@= H׺my㼿i]GhPHDr?8lP~y֑QFvi(^&YoM1̋AjJ4kA9ۺNqyHUMT'Sb5V)ymi:}\6 ؈'RN03V4NʇCE S8Oר1HNQF; Jl3Oc&9 lg$d-$FJO 'ppF0s6\\f*zc6{g4e$k &b^+xc"5 ,kPCËG|HUxPޘIVwGO> ׮LIA=&&Z# dkF8]DuiIy8but)C|mԂUCv`EE(* 58l]N-PC^PGE"Y Dx@N/fW%Ҹ/a8()ÍwRpK'YD-W(jna<{2(ڏJ`sscaث"5hvuIRV(d;dŏs7f iDۄ0Me1P}޷dS[ 8&s& _9xBi>q>? rͧ% uRHQhQ\f9?Ys~Lh2+d`e\ Dr ؏y-r}be%=y_'xyhjaa>19c.T9frˏ؝d k!%8@ :bNcCoXP;Er9O5q<. q[QNyhB/kF=nkDSTN")2׌BHg@8rQ!YN2P):'9 T޸6X.0b HA#3 !Un1& UvM#Dh(;,C kb*hHg4LF(AMB :FӄE-/Z+`cR < ZOAPkD8kSBs ])pBg=1!,B'aPq$#Cc;8O?nyや ,Dv&Z4]bT&oo@_7i,!G\\Yi\18RkEijP3MGk QhJ&w;KSofHLK߶u$֔C8ybMT2SdK7 &)ո?UhYd^tPuybYH(J('X $6@WP!Tv`s*τd Zk%)kFAC_񱉾l T8bpҋ$oC^MZZaϣ\Aq Mc@ &Ǝ5tqp^fsA$@ߗx7N@I1IdlgCuϴ 0OX h ۾cZq1rxujYx˛1pV+lzˢĺF` 1v?]Y0;w2EF`5+usV1/1 -zõ%0Ҟ3OY>p * <{&6c7r)ړ`7*CDom Ƀ >{y;zM +al5kPe sf@)Όb>{8)PpSt\I q;ѬckS?y{xxgU>qJ8407دyWWI4cL[T~0~ vgl,p}co*'d|QN YaTu"r%lO4e՝#<͕%r9/?hq N=3 d? !Gh)ZӜ%GmR4u丿ZMVhS&z߼M5u.!$"r#Tƞp&:ylI*&Ij8T; IH'l䯭lc˜B1XQ%UhpFhϐ7rs7*ʕ$06Ѿfťlb^ ){Q3+ bu6ݭ.`2Xo"рu&Y):x٥H/ ষ6_ :T wu@28Bq5-!W},V=|`Js3Iɠab+J't달si(c Қ9y` phf }yKDf:.U`mJuMT6E 2"tKDÐppn6K:7uXP`Ee>wD6E.\GpE4*[p+e݈/0J,@E]ϗah3nЊjI|1u:yӾwgDI6tp^v6lwn@ 5_Y  ܁POyܡb*(C  j4SXC x.0P*ȁBkgQǧ'guzG-8ifȧp _A~pϑ%8q7COVvo,YV:$0Q"ט `z!!~`&O/b'х3rfX U\Cلv'b=0;6(7AZRz0 A(ۼn2}d]v`;N<9kЃL1ºفt)>pw觼MvzB.xlJ+}JNvA<c@V-z 8tNɂ.z&АiE 2 ðh7`{/ʫi b)S6"N~ѣ Jt ؤXĬYIW6v6PuF_  PmhL i5s4| E؟6)Yf9 Pp{[ ɬ"--&3:,4: ) ;R}djNR` 4:7~A A6^M ;dp'gA');υhxoHhwfZImI$:4h5k5)* ,xoPvr{ZOM=p?(ai ث'}E?b9∬N_<WbhT'{?11) [tw}k]e`Emb8P;EV6NbǶؼ1?P)]JK]-o$%@m`tz @Ʌ{'Ck󛖊40:=Yn%QHխ.!t1@g4sG2Xy-V 7ϓƍP6h\Sҍ —b%0q@֖qLv%lLu@w %1;s޽ۺuԟ2)~ y?8ȚGqzͧ*ZXx |s" &rvtό1ph{ $}Ca_d2{ZȵGnusnrz ^m ql' ~1{~L=oM6'om{sC->Mb6'lQyjЮj߼X'!fn9;ɉ=~ף7$QYg*}bhL 8M8 L|g] qp^rˀ)i9'Phف1c;5VL}J8ˇ<<ѡRiw%mL-uq-8d?kk'%`!k-6f( hQj0d<Ao&C :92hRk^2Td`2]˿9"DqZ zZV*)QexYŸDއzxɚ.{yi4J {'%Ã8yP\M]l.'䪖́FHa$̀ XP2s%p,\6{mx@0V!JJ@r#)HXCKqIDeR }D 6 ] g8M`|p,l9:IC]mZ6Ae 7]#rf,a'$u( t7DM(7Mx)a6ý ڭ^c< wݑB/>r /j 5W:t]RE K뼣]ݾ+*r ܺFko#y1+6Tov!@Ht'8Q kg#sE -s$}LZ񕷔nNQ :oNAM+No/ssx*m(6u)@p#8g0@^RL&TnM]wG>*=ܽCP FٜE؝t "fy/*r`4%NhT6H)3fMvf\b:/F2NQPFN*O׃ ( I> #( G`խ5 010QX4x2 (P7y\F \>pQSve H~LwÌȻD's*z~'+?sg1r \0wr{kf CL`K!$b!z\yIT3:51|$DXF>sygN hrlCMs ce,7p8P[exY>)oe TS-eD=gд ~{ a5& ͡t*f@IpBWD 4D4w8ͦnSq[0VAoL;fF@C@l9wAL*TSV;ʿ+P[W4[SMG|xd=+fdR$UȨ D49 B 8joJĕ 8rN :3 A"Byp|BjTܸCxt}7D 6SBnFcZk*̗-*:1ThoK`@%<wxI0HÍt!]Fi&̝Z9MD¥Aִj\ ecQ յ vg/HozBZ X,I}=Qwim;Qs #@ 1+ˬx 5Ao@q@U7Ct[ 8i$I>qŏ#@2VBqNB R=QdUgq %xU9f3gEVh,'Jp9"XMsWɆ(f,{LA+24~f7M8y7 { -lʿV nekqAyVXέN`-b EsQږx*~r{Ctxa?xn\Q>1 Eo>q &8?8rC0a͓`2q(.; !R~3_{zM`O7όZooiyIh/9';f=-x\W˱7 *mw>iہ=!㌵/rtQ8<WYI0^~3zY^d6>qHUݸ?xΞf cdgh=!/ Y?d੏y*pu`l5|&[Ҏ;U!Sؗ|8$ JCX<%$ (٧nvr`fMPжu|`M ;/&XN;6 &E׫'k1AIbRrď쎈2&%%(e)Xa|QvZ+S,K2;.dˎK17h6xCA  kJlgXQvqwq&)6!WD\_ `=%MmxfEED]T0]Q^PTyjz[Ƴ` 6sZueKA0LUK "lbEmjoR)O/ AAB0z1H8u݊u&tBH^514dd:!@ZWb2&w lēcTՋ §Lr ϑ;5HXh]ȵB%zp/:MǩVOHYhZ7w\>1K v5gS8ObEޮB<=>RE0?]1c#fHϬb*/_)!2k\zn[pVfo7^.ޱz2k,}cEt`Bq%ӛ8e@&=o0,<_Ǯ Co ;'F&1JnMshX4]q%}]:M !鯡9?? eMNIe~(汵 aNn{)=#.WM1t: `/xѰX _'ƴx2を<{fk+SbQ;[+ ?8ظ $\Qw(#h<x Q#A&9?s%SX3a߼xpG> 1ꟜwWȹ5K8<5!\, Ağ209np(97+L#>r-!üBԘg%A`!ΰܚ 2)O9'O~2mAqrϜꮦ(پ3dT] LϒAh\w,o-GqK=CyQ+7+t"[gDD6yܘ8gĝUM$\bd]eZG&%7COYu *H?cTikOcޅHh2ac5.?٦w)Ė.J>_#^T`/by#h>2'ћթx~ (ҿ7aذ7 4Ȧ8.GS! z>zn!iPЕ Ћ%n{pȖ>5x7HݨZ3@>&ϗ 9Ũx968)@~#2">?_zY#z@34T$L ,jc_V*zfuaMV(!R}bz s^'tx&z]k8*zcGNtV3f|`QNQii xDqD1<0+UnA֝޲= ~f3(Jt~wJt+k@94֔.9Ie.R89a/jrMNO|ᡋBJ< Yhjy1`q`D6$"CA#TZӉ! 逊C+(r$Q[4G88 H-HR$m D+QQTL [HbmPH#{(V7!AŦ@9Aeg9X%nLfƸ IJ|xTU5%q0+Td,cmADrpg+&yyk3A5 n0Hci^nzW/nҗݻmIpo&H< tG7?WEƽu9ħ{p"H_Y!WlGHS LRLfq/@2 ^3PfD)}0;e|M>my)|6|thÈ 9Clj8 ^G.Ͳ}ecS~Ds۫ wL M}1pѡHar[cO;d}3'bH.Q{X|?ƊD2 VnyAQшsr4֯b;o-[`uDވ~wQ??$VNi~eYnv_f|y"@024*Y-zʰ< t1mȜF '\\ `'NAϚ VV3ѿPO7mt f\jk缵[|f'\:}3j#㌧ QRxp3\eUmɏ>1qJK=,BvU{$L0!;"yRVI1܋8hBt'8QQr]}Ž' #fmoa AjH[4Y,VYi4 ~$U|:Hmp/xk84 <(lC!q&1cǬu&فtǯ8[Ldh'8%8v 1wMAzq;v̒So#}~~<nzip]y~8Bqv|b>γV~2$m&]£aP6rrN("}usO6\.(C3 Lv^.> ֝9u!,NlEJ 5~2םb, o%Auy8og1)hr0pVsϜF 蝵}gkFvGx>yI~u8SI #IINr7 l:,<5 ]k9&4" xFS_ RB!`2s"9ڐx #0 iCuτe<`]a]7'0x@F5|He.Qѷ>1UO&QyspsRkjմB{u_,/yQCWCG+8%EiĝZOH省5 q3K"?)y)VQsƍ(S 79S "V\nj i"ػUBZmz `+ZvR#{ѐ @݃NOd8uri4>Qُƈ}׌}Ȟ>8P BS6(恽NU߃7dͼA/Ymf ;fs榄gfV W_CF@<ØWxc*( 2r΀^_n\Y^ :0n`^E<1ҳxܦ F:8 y<|s"E󄆭ԑ>0<~lfBA~v +Poڠt"K ._B* Zj p1r$9'Sg.C+8v8PQox\Z NLhO8MXӿH6?8:7}|~xIT+Y0aF:ܼnا=9Y'kf ]J3sLޚCʋVWvHZ*0ңw=z\up\ږQ0f񅀤TFќ lu4ù ?qG Tk1ԛpP:ؠG7Ӆ:mrY5t[SxW,%(WѮlh>*rي};7z2Le FnlUræhYsMz:}2Xy=m27hx v Lmm#S m8N2Pz8?0({MaPai[1Z1rgvFh|~P:5r3 ϜÕ')~sm:XqوVz4`qpePx ȩ6cƸʧۑbξ鋭 vbOwn ?(ZLV t151Hk xaXe3O6 5h6/X^*W^{ _`=K3c#I7M#{8ZG@0H$cۖ"~w~/S%VzxH9w5Co$x4p1z`YwqkY?x=\C8w-`*)!@>0@0ɨ,x EB89|kk1u\pЏ ϼ%`:˂ .#m?'ƱXaN x%0ױ<s^\$ARD|Ɛ:,Б/\` AC 6E1٤Q :%a72.&j34ipC(J "lb<3T^t;4Vw*P(ӣrHnT=L`*1w)<|PB2'ǜn$]N;"I7f@3K)7mTT|S@P7/YVƳ}N&X]͡6d#xf#bqg6n\61ND&NIW9"({="E;ֱ/; gfj _;‘;2* M\6jGl9Z't}   % H}`kq/bEQz$ [YTRNXGxE?-Û |DHe@<ݜ8nWY cq@,V|όA@4VBAwf̥lOXp\W842 "h77883)?L(L()aQl󊻇!S\q$53x :q$uSă ۯ8mMuX79f!dJas5.h# P ''*~r&wSQ r#r9Yys߿0f~Lک5rx(2;;)lx`GDT}+D f{u$(98cB:N^j|.]:g|b[BIYoY#M<7`4{ؘ"]E6wI*nY D ooщ;b)|O>qrb͓ Ihh_XjZw H 65DRw(,_%shClwH 8]EqQʀ_!۽Y77j GR1.w&]q]٣+8/c@ Nɔ*9(0M<xu:1܃ݬƱsbRvlDZ@NT4z>ѽFsyټ(u[U4sI:A|'g1H$#VkX%Q8LqLCS4\ew@8$(B1͖C )6s9ul21U{H6C^X'2xpK=KR)/S 9G~1z8u!7z?8} 8_8 ?(%LZa 4@O;MpP1͞HnGr `=,RX9*"1L`=5>r> ĸ7Sͮ;s6C=&`vx3UtyO Gq/Fpȧ5h>z?x7FrC85&Ml ˌO01 7kd- *vL ;/`}8tT.^E8BS'>UV-C.:SN4bhA i5v9xDl;ٿ_Xĭw,m"ΚŕD2696c#+V^5t~:x 5#tR4`k5ÂivQ8D'76L`EI6n᫦;{DzDŽIx$Ti) c]"1&Jrt5^1#w=0j! r!q8<0eWK|ƀo>005vM7o;:v^(8@aY,]R2NyN/ִ^ ʱ'+1-HWs@ i!1-y.X [Hui!@yfGjPM/E#@J5՜,2yHTB ]U⏺7lh#\x!^V񔨅~3aHSF ɨkcz_b"$Ew-C`֪MiN AؠoxK\ub {e@ c@˳b!L-7CkN[]+`i4Amq6Q۠e .x?9 ,,Qtc.)8j+6ppGsc!Zy aq*;vL A_ү@X A@0Uz2!QDjT|"m7%4H@R_ư 7Nw7vnv`D)Gx<zHY@m4~\6:DW)P(\xt^ PL7?Jnzqx 9th"A< ݎm }|5 i}b8RwDoP ݟBI>S9%tkqM~g 52A_^@01\E4Y7-!~D'qĝRE'ч1hO m'X8G"?RLryLH=cm`mB:1|b8qYW& ư |s(o J3^:1př@@dI#RuB7z. K2I)qx XAM6kLA 4vo$ph:9A8h-, DY(1/DKck`9q*MePCM21C9sHx}!?{ ը{ BMUf8OW )sxG8EWEm#'yEJMcyؼM:ʨxg}#]nwi +šn[b^|̈́r6 :q4Wpĉ0y nC_~q|tOa, j$p+ FbvG~9šBGA1 C|ҠQrD(_~4v#X+ѭT/9@D4LN7DŽjэ2Yk 1i74DLCo5'[ <z(#x\bR.oэ. ]rȻvAӳ_4ªқl.{DMS2RblcYX*Sj59 \Rp=h#b+&ߜlE0Rw2DY˧WHs?=aB`mz| U<{X+#G. l uŹ@޶ 9$bnht;ٯ`dۆ!iwPi|4&4so޾1E#ƨ`#ф@g,'9_I~YlIFQCoXC(7y4}`kh8R b)x8K8O/"/Eq?lcrK;bNSHjL y5)X P\**G4D6PۊIQRT8fG*/"AфQ、P)fa2.D;ibdijŚKtS1QTGzA5$Kńgk YLpm <\i`ytLE$[GFώ]JFէo,6TrÀ;=*dUG2nU5 `cNLH<S !oWO^U""ޣ3BsΗ":o972Ҏ6WOF!@M؎uQ˹j= 1Lh}/{]E&B/0W 8SU4*[妪`)elIIVa 3hMإF5j˪b64pDaR U0Hlyqy+}paׂ؇hYX( , eѥSg$z[6p≨kWPZ:ËMV9*9WqFيձx|'bp , c7V#7:?b`c֞'7nYb*;ex7qP's*'[9PGYj+:,O@zq>VqcP8ksd %$Hd4m9GczȠ ?*j_P9Gv=y sD}ǐyN0+\ ϠƒM9 6es֞W!Ԙӂ4{W 8d7)xkq"7b:`E;ばi Ը^^5mHC- >"xD3ʡ&>E.&08~q"z/l.J}.[]${ȑR2Tw0 MO ﻮ{yU0O.N5(wcၣz 5⽣jzM Ô Dۣ G{Ig2hsF%5gZ^sP a]5 {7\s'ǀ&ᚅbb"wn-qp#+oR(~sFP:pK O``jX)ǚkkt)qS ir{ %gY ZEα\ ~3uPF3_ /FTW]WK yn9rRR&ZĮ0^o]D*vw;ZJ@8=R;ϮEhޛ ύRA,A<̦ z,ƯF &E8O$X{[6Ɲ9va{J"G '觷$1l2[g8.Nv Cq4Jptd4E%TٻAVedy#)ax=D<<yQ7`!d/'#d:{CQ4 j37ɣa8,t6_cGm/E6SyĚBaox a+c^?0%9&P/~3RZXXrh`l8' }5|[[ |[Mx780tf3(aZ_2;&||+3Y{xOx6x&Tb:?8ZSk >p:q.|x;[78.G=ct4/|\M`Y_]1bC,"ocPC:@Qx=u6qmqV4*Iig^_Gf(Ѐp $-%# .>%Fͩ>Sq(]q8iI'w lD &/xdfK]CF#aI|`%8ї@u"7SzT6`z XmScPÛ.T|{g*rX TA] 1-4nHQ#ZNTx\FԒ!-V? Ni+854 e1=0+=](NSbM6ve\+,T߅Uyc@B5@pPb(̈́8g6W*h/*pgq"L[ 6*uqRs6(mvepyn4Ƞ 6U\dYJrU3YA7=^#<H=*<@ڄ [%wwNf0.ߌ,61c Y*sν-&dh 6Ӱxeq?Nȡ|NTP:ԩX7]Y"4l Q& PE{k$04/e)Xlߜ l!Z`4L]iW5!tn>#vk Q;<]`gtI42;:[1ǐhYy3G[H'S&4^T^YcJ/kZ2xEx{8tkhNƿ=6DR,s$TW\b}d6 BO9!^:,pH=S"jᰠM`S0 'o wt Ùz%_4t$2j. `rodJ]98%z4. <"CT\РlG'b?g0FQ&.[xU{@!ڗpPD$ӈ^Z眹H5:3qch6ܸBp81NBzMTkXHBI?n5%i\Oq N0[7"5\enxNW\qb DYųqD y+"#ʅTv l }qU2nWE;!0. ]it[URÆT'í{mR%"w.p,B ?Ok()$cѿRota.4Z{Ǩ@]ik7\FxFć}QAVS̔A@jap- ax5bУ*Wׯ8B>\h.I?;ŒDvQAt%.CtqV1N+}3r +{#AO5E5o*u5[v:#xsEDVwԱIx.^l 6?ZH`$4 mQOx_ &m!y,(EA<t:T;P?8b}?|o qUxBnŴ$\+Ǚ*îgMq; 0OzքzK+R m|aY*hlt#!h8 UxXt oF;+\CCvxYMqmv,*2=ch\wU1[q|Y^qzѼjH>mA6nu pq1=SaO8f8кRun\\:1cM̴swH3l KˑhXFs9B$UO Sw~4G#^Y7ljw;H`҂AbS}չeK6cN2f W';'`REWR5h-@lܧpr8zG9f;4Oc='O`CaB.K{I$2l7_x=d\' (.81 .[LX.}'$1xX9(9^QN,-co M`kq4Р>9. ׼h &&sはܦ a/i]4X\ bdix 8❛G> lE1TX`}G)&vpaPد_vpWM Yx%sG:d"[ˌN|, 4Od?,wmk dj)tM GAׅ݇eV.Gl2f.㩖 ud  Mx0ox݉u# W\{o T!4rX%!E+굋DuHIU= w:x$O9lVkk;-$.wU>.\FMaEͶ7MCea J /-:e4g5S q]9yt h߬cD *(AVWo ܅ɔP#yST!AdHyWHB]A. -#[׌iT,G0oD P5hoxaQ\_QUyśګ”1;XO{`n4هqT !"3Tʫ!6<>]Nnrgp,b98o^$@H|`ŧB_Xs4닚:>޼8 nbq$x1-bR;ٖAO#f炘 jeLxS4%{,?90H759wrza]NrHdžlzqip#(W\_9;1&0l6`Fx͑K! Vb 8)9ɴy{êD] :`sK*8)y; ߞqm/XH7g_xn"?Dն q KqltI;_?7fYop3 ί_8лPoZ:!+mfP6H.1֣P(o&5D?6Zƛ.m+cyl}a,$NT߰.T aE2!Pϫ$^~p0TexN 618U.һ+P`;[ZMҐS9w*CNG3| 7.۝'Yj*v6|pkʦ\QzNK k*C_xi P WhYX-]M" Vi1nzN"^+QQiXcǓo&PXm U:x$,eh _Mj[Q kC+ UwiAYƱR"_r1KdGT9i(,7PE׼B ͷXQGu*n$mu5dt\`7,-ql@Ey.0P3 8顬ҢڱaQ*`[Qu.=z-D9$KriKjmqL@'x ޓSB}D/{ ;"xZlVnj1wgWy?K{OJ>B;ōeoDJPzy~tNOUƱsˇ/y+|axt3<]r%XiQqټ"Ai3@TuJr䗎3x!/8! A~U(黾xX;~q\B_>2m9t`FC~q]b:$Ko񐎅*fI _{x]IQgp-?RiCv䡑kPA?}\epv Wk@pm.&#K ]a; \}E/b zv[q;ԞAT9i j[4;>q};jri5 s߼C*RvT*;[`?<n\EeN'?xZ#^;2" <#>0kZiTW(vw.}bE*x)ͮYTy߉ir ;7{01O_ܬ|-\Bsg2^7,D P_tIҶQY<"䜿3 {&65wʱDԷh~ *,+kܦK2. S bL]+:}4*k?##l]}atO 4#PwX9RĚe"EE) pmVJ  OĎi a[KnW)F7 ck$ݑZH(K]p~`Rj~$H|dz-ҫ)nc- (X-|7y{hp-rk"A C?"ih [l",s(0uw[ =>p2jYnz˰BSP [EWJԂ*@?X|Tpuvv9f"A4pV/EcN9%يfX2 7$Mo1A6ٵo "Xd&d]s.TiDh$z AãVaP,#jkLg&հCu5,d jWn\ t]GCq]r3S# ιFЅ/N!H}I;AnuGzζ UkrIiUNI:M&!,ār,B A냬;ڪ,؉_ZC**؜΢3⡭Y[t@"#p;gGdx`&{.jb<B2bנ =|+!TsW wuVx\ް1'4dz,J/L Bxh c|ĤVS9 RyDIߍcnqxp!@pFC7u1: Zj8'WS])Pe場y&v:#pNmm-rU Z< jNh9` *:iba 9t'X^KD58 5SHw+Ӏng!7}d<EywJ4|E]W;g2>Q[8{,tʹsUNxwB<$:p/GXMPDkeUf5%FϷy,kpΒok44 ]i;7D/>19Lk5s~=2pgswj;Csƿ!kJlSk6*_rRMsVK~]{[Yj(n3''5NfVGE~,F-2 'R5jeg{y>a:'i}Ex2r xSxeR2oRNƼe]xqV8-I^FLK΍ /{-!θc7P)@kP՜|1&q'sXw2cU?(YXPWF4UI{Dk]P8NC,(ɬ֛~!ԦS{$򭱡<`A 1Rhd*)MG?Xi_@Gߌ%-CAU~oRQ~Z.= Gh=fywׇ/di1^_x1*$ dz%f4@_2M_9_y3L4 JaMQ|?\ehq՛LVǔs(wwʝk {q@;v Zk?yV l{!nT!_ף啍OAV׏xQݐ%[~ʽ~XyޜDŽ^n +k}u ANx_/')U:,Ox 5Fam|J8ɛ?Y#5x- GfF8/s2d?$И `[psUFy^}ap~b [ŚjJ @``>rIߜ08O#^lX]Hd  TᎎQlHt_y#8s~:i|vɀӤ3LAÄZuK/߅ !Bx¢k=t^3_IUV<&?mvy/io~ ЊVq`O?]p&f0X=xN8Myr@.; PYBfoXAMs|- ԭ!G4k,E' {1 r2-*Ƿ\B6yd(FN`ZSi-y|!@MwGωFmG-],4ۿk Jٽw*/6aVy$޸vPm+ȺR`PJcEݶ(lʴZhS{ {@X!-h-rbWe:T47l;2e/hmzP=8`&F8'cj>A^dk`ߝc%]ye &5 q^ xxN؇]^ aUGr`&8B*2)_L:Ɖ-gqݜV *@ 2Pޱg@@$S??XTf;P6c15;7/.H>{ Y+?DG58ߧOT*x_g8$ɛ yAƜ`{?8P~e:V^ì!`~ 0#(ny)~=➇YTT~\)rf0tn" SGXAX(MiJ[e , L74 ]뎲[>! KX#CJݷF8hގ~uܵ-e_C>ymaf5e?40.Q-Pt&g=KQs\}R*aYI]Mw¯A;NXY.WOqؼ9*F6s>nJۑi:uz@Aǜ!eC"*p{u#l.T%O;񏑬RI.k; to C{2?X]s4s%"r 3:#'Hk*u  co8-2q`1([j(0rE'WnH }1'2dXzˍi? *Yq&ۼxfǜ݋',^YFd;2=_Y8&Q5.3K}?9km[OWb1y(5q+}m88=8oǼSzC%4hu{ƁC9t*wV*~`vd8Vr9NjJj . |:/~Bky 4T^"ߞ34NK/l1ϵ Cl>n $˨=ƲDJNgA{or<2T$rvY@K`i=r.7Hqx}@D'POc'; o 7s@jc_JA~\`;{O H| p9@At&>&KtvA{eO5nXIĤ*9N)ofV 5/ JpKK2ISDunZD6 䁻9%z]MR kԠHx x| ђMprr&  w_,ھUpI(-Zr:ig3&ـ٧ k߇qXE4>z~8He`H ICKüX *ppPNQajf`8Tw5 ~pe,Eq"PnK>pR<ޗAVysp_}| ї C_cWUǞFȼxY)Qf3LI u)(k!n^`,"w)0*3(7qT4_Ga$x_ܘPoya]d,N=9W.~u=.P>7QlMeEb]tmmU}dNKkc~0f)܀Mة)րjHG|$Mlc@?N#L2 x3Uvd*( f(hڦ$Qz^̎tq6x Z#1tPmvu"TJ?1b \cX،Dotn<@$\ ۭch"rhHZP$&E(>G(ccd#T'z.Jń"m vrߜH b]6wp)'V'rn|;>OF #gfmېG?Cl̳@YW{rba#xsoF08kY82ו,:LS A_jwϯ8UA:`tPkŇ|=&T}?ƕ`+wIH:ps>Ϊąi0 8+8 "tGr|6uZYLJ^1N;~ji?UxAG ;nc[r|¸;'(c #mǜ=~1;ʽ'X2wyS?O8_鼬 /[0ªxcg<ĵ9Ń u&&9AR'3DD;3V*xc`G15g@yy?ix491A7l~,1UH"<7{?ִ3J^ /F/(nk3[1GܦT-kZQOEɀqټXLg JRb*_nyQ=׌#BTkiY u0]j* H;_*7%j 2e5mV=NIP//VHuV돾y`2v@Ydf`=Uw>KYdAVʀ61)d^EU6R7Ԧ}R:[1@[bM;_#B6 @NY3tM nj:ty]{$IjP :))ٱӊsl ̠baѿ[tX h:{4QyZ†Ր@_x^msZbh|DFtZ tkY*Rf /1mX5Njz^`dLJtzgM=F .9# )^;5"C ), XoҒw !C4ywtFØ;CsS6#`]:A5QN |KE5)_'NzT;=&Ed[MP5x`-pq(bAwu8p4U{|fFZ4?xe݇%{D8Kw`Z:/iE(4&7>̄*,wM~I,^uJ0H V&]9埘r|yss @߶7WKg9*_dnqS5(_NO.RXa,y@ Dslw>$NϬ5(!` p`cEn3WZb6"$Bzm tx%8[7To# C›xP|&|tN٢:0T({j89Ŋ\tfAPq#l&ww^ |5Opp0!pIPYF!V !qS'lGۃcxv{Ik?]<7(Vu ڥbґׁr^YUF|]o/A.yᅩ tô#p(2J`D#UuGLsͲʹ -G'/:7_y zqmKj7jh$y}03[J \Oȅd0@I2*l^ys7b^P1KlXW1CũV/2x6yy08u>?~9-gHqKҚjtxV5Sr?;mTJo㨀$|/pO~- 0R*-;pR8׌GE6XUYj&N1܂@B0Aҍ@`bQP?\f fR4kʰ|X@DI,70dbnk[Nm({ oW'n Lo0X5Iqcb (KՁ4^ ל1<`HK9e4_W_y!G@C!iPAJJ#n A"MSX "/i]ң: i/ QNpG,14҃jq_xj'g5@ Mk|D+ ;.n-tXP@6O-/|/~xʅ Լj%skn3Ў!.gFHXys~gOfq]}c+Mwq'8!X?Ma"[Lj`wy68%sH)`6\H[>pt-ZHplX@)9R4tY[E>7xqUr67y|>՞탮;\(lEw{ w?KXeMkBā 9-n8|,u8uǡL݄K̋LR8aB#. ،@+j9aBӇqFoyV6Sx.9qsqn*kN󯇌HsO [Z#@۟+PXXǼMmՇUkd!:Xf>x"&Xjf9ʦuk8WV+E:FIA$u{rpL/:gw~'ISaC_a"cJ<^n>GZ?m4>p#Cʚ~05K?a! ; ηڔ8+h^2Dh,WD;tWkBBkGX}= cxQяf pc |\!(l9x]%y`xDJv(I*ܸmi,jh}AzBs|A;} JyCڳE{3DkD?8x%*9a67yE~G"g(_Rth}=K &XRvlMjB}}E8M `4Oc"q@ȢDдx,U雝yWb% ޷l+{xDi]|b 0Evq=?Cwn#9RPrk{SQ ]3rީmMtbS>4}0m-n#|VT全'ӗ ZVgK%PA >\F<'Jx Lx٥WGBD H4=w"ơ2awfIϠH*=K3-fҚ? \LꯑZ-^T+^.V݄vu.܉V `c{みi`!9FJN ]chJߧ ]3X捶 @GBvj#BzGyΡ62rrpUO"PNt9(Hz'$w9糬Orא,b5qL,ݺ'Mrp߇*uv&te;Mprߜׇ X_j+8 08Euμ֒8># =o ~5Hj:27> Td Kw;j?W{n-6K~B|Liwe/ulm8I댹yrx*oˏB<6PS񃄓Vqob}ڕr>3Gs4 D75Y6zYqdt? `B9 sN 2_8}G&;@C(͇re\q5q t۴c?46UтX`x#޿xKpn&X>`8s͏;XIX M(|q%5v7Tp4mGϼb=GK Ki.ZhNBcl;PiT84:JIPS~1.i7@n|L A55=? o,Sv~tx?0yZO{ĨYz  iMHu׃xȼRk/^(dONmsf٪1O:|^<{Lͧ )"e&xF0fćMg9k17 .$$9xK\ 8bdL_D wp{5iAzIJ:Xeuw1W}CE66",Ng˿]S:!vh^]kW*R/W{ݐjOwvJkaS@ a.` 1bZi^p 8GfjPZV+zG6UP,B!GHxG/|N +^/!F;|;*U"[-I]~v7͜~*3@O]bxv}|D/0G޲>4@\jYYqM${ Gˆv_6pY͸/LJ\YFM.{, C=WHj3X8<2Hk{w>4֌5@@3]kAeM Yä;)͸ r$QOqf;͟XjMCQw)6oI$@Ujp;[HZwS2eh\]bF&qQ^9[ZH@!Fя ,08čA14n<`M5'jP~piYÅ@AF\|qS9CTncI.X )j isjই,6'gY@`oBtp˃)rP%(|ɟ9$x2-^2ʡkqA|K?0##-ytwa6UB"8Gf (yT_Mf>LQ:8$LޅOxN'|d=IO Xukh d'R.X]*fp-%q8! 2 $bt=N&nküv|YQ,:ʗB{'聉|.W ;Q=]bIu]Jb0YmdBDypԠ VgzuUJ- S SzB4D'pc*Ĝ 2خRhnTvI\`Q|V~f&`bl6E8&:& ׬"OxZOawFB.u;U<2j)v8"V8a8. txG&3"hRlq雉5ȎYGAH˶Da٣ 7J8Zѯǜ1 'Oqu,.*z·O/  VmLL $XAGw$nț' fsY64 Q9VM]Hs kd 'IY0EW#2$W26u(B x`:+&<@\etu0qE+ˀ{,)CDyȟxn{`k6qJ <6:r;3rMW\h{x,ݮȦyB}`-i6nfmqH<"|+ێsY,;V`"]umrV,{?"p\vfhY@_'˄`Q25Cxet2+ 7mM\@6bh)n~hlKC"3S$Fr0bCX&HUBmq>6"(8H/ThT8/bZUHQ - Z1#A_H!d7k!@K( zʤMU0Zq!8YbN~2`ER`;J8aղ}}}qre<x;u/b 0Y˝aıK`pN2WS@6mxBTȣRkZ-&m+22hWkHBwnmc"3uۅQ'vi2g^?xv  6EP܀(pAZ#uaJvtNQ{mw55p~mXЈj2h`x);˳3zS)NI;<C9(/7 <\Zo!.޸Ϊ$f\blFQx7w0L&,ƥ4^ nD?:@~3v8z̯gQp@2[<`l#N.Uo6c1ayWcl͍\ٱ9#kca(Q@ b4S?F>p#CLJ˶DGx}5 iLƱ p>O S K1̖8^4w/pX*dZ,RQ?A8] dp_Y1gaU81=xVc}1rqDZѐG3o;q'c/1>0 }B׌.u(?w(qXBHX|\*#o93YrmN '1T֍k#q)P^EΒp\*ӕWpJ/6eW`( ^+ǞL Xz~NOFL*lwf8T! >EgL)}ج bΡ;Y` ~ArÓ)q.q#6ET N3N=t5y Oμ'UyB#@޿12PWXA16Cˬ@JmA9#% ET4bt*5ۘ685PTɖx0z cFk!J2콸5)|gj֙?]&U5;ZB H̢鼮!'۔ߺ6j>_6l"%%38Հ֕k{/+qp(`_KX(LK=^nNBoK_PȕZ`kGd׍񯿻Z)z]hJh2>)G],W]s$~R  B67\BdC.Zenqַiux:83@|I,!nFTQiب *j i;$-j+iavʨks*ZV.== Ӂtж58^m%oj2Q5Ilj=&MuxH0uk iQϜ/\ tx4kN(S䲱y[o9֚i\}f9 *<1٫*׿-B*<⬝r~|*(ys !kk[XN4kX@xKH6nFs#8c:I[кmt0X¹}ЅTMӐvE^82%Ԫvl4-o9`;9nT2/}rR4"ۿh/S#hJ*BW )u!KB׼ןe_yu_ؑ% (4s U*Ʃ8lp,|rМad([T/(T0Rl%8'}h/C$'K\M'ӌ5$ha6\YXX(3PBSgVnva AˤЩ^ ņmHxQhJJ\Qcae[flؘ(:"- iE΃*MpmK5BmHYôR4-h0Ƣ'o'md O++0N(Ck__x x |}BU<& 7 Mا9bekCqzEPA,60i&^]:av(ڍ5nzșN*>=Ea6^JlP]r L|Zk'<༈PRk|2ēA ƭE9bN=awS apeӏ@[O $o$ 98fo1C.#AKu^D~0ҹ1q{ A`yE[cU)^Z $!]@W<On<@X[%"59B24w \@Vh?(( `j0 J;uuǩ<5c@!]nZ&5*A@H HTAWg2eboxZ(PO}uMyՇe -K=cY)ZSOmb" sw6Jc{dSRv5E@orVH :8AR",t@G%Z@w߬Gvg,N Up f3U$T%T^}a9ȅ=!-"0knMZk]! 8Z9 [cKÖNblуz@JgW)N կa(dēfs'5D+Crv&Y5^D5J5@d^ղyY3wc[@Ӿ?;!LL_ˊbq.ba u9ʡrl5o98XܒPD zD"40L/ hcDr:\N/" \lx,R6pu'/T::)h8J3QBap2gu0,\8p{L8G,wHMbTu=ANt@3@Lauz!{2΃x>YM.-&h8NLm8ҡ=7xÎ1J))xuUӉ+1@ǫA~pxFhq{.W]a#T]6.YXҘyfT1fA#!uQtCQVxJ G\q nЛ7|q|Q1RH)K<'}bk"UW(월LIH {DD8d H^^VF*[~ !K,ޏ"@\@-xIR`GF5n$ 98f>n]s@{yA4kca'S|@W^uԀoꫵ`z! J8+ނ|U55G*q4\(1K))6J:0K mOxAp*F om3s(/5w!AyFZsi$xot+BqQjYvHOUt-7(`96;CVK.g^\XQa7hi~su?y"I J5Shޓ#6(_=_怵.Ay7:hUNw&k<(E';<`/IZYsZia?;w#K/{y.Bwք ~ N^w7OazwpurSJXJwX:|&e[ȁ*Dn>ly͕A}T4([p`d,t$M`{kq|@piNG0\Ijs86&@lijnAhlGyg>|tHEf5UɅB8\I9TYйkc9z,博<Jxîc($]o*ً7xupNMG5V?y$rbl VagjְvM̈ rvWc:創 ~dM?r +~?`^q4IYFH1vU> ;و9~aVflՎl>]?I1 ՞ph>sR&yp pKS9Ý|`.Dv ^9Ƈ_ =攻n ,P8͂4pxse]{Cyφg3X`wJh x&̆J&z7VB>{CI ħug%n}]Fez*e[\@9pŶn|P-$r0ڗY˃F(&$dƕP%](:.:~@^oCNu\:{]۷(D1l$COަK&&F"V$;6fW"w]sk 6\`/XuJ"9x%<\5 ׌\BRu3HňUd+`GxD'PR1pL1&W7^wG]G8ʸv( K^:74M<;ʐhk0QGjikH"e+$X ,rwqUƱ1` ˟#A)6G cƁnd5OO SezHF1ZpSqˉHFxۍAZ%4=kFW>-vwBi5p^ Gm^@@Z-B6C݅ \1o-Qj]3ABY6ImEvZ@ mdHr3%|JR&i"to 﫞A(){ J#N]XY}<&fWIOmLx8C0ߜuGf u_IZ͑~\A?`K5_Ęu/EyNX^ϼYeb*{8vca meb T7@`)su^1/t99w|bW98ZiXvΤ!o:p n]~B?/XTHy4iЊQь TOJρb~$ywDMThۈ ry|Xb(cSneg!h+ ZLു} 35tyZ;Wz?8| &y[hTq66AX'R>yNnRGx6<R? cAg(mNXF84?YW*3&NmfQ!Mxa4'Ϯ>ឫw Aį8JoFՑVyq#v뵻m-JRxƑS iJ;{Xi<٭'\$D$2hO\,ƿ9'C):םlX|Ysp;MD'_vE`_ה)hqcf_l|hrb74zS;B`4 2å0b,ZaBL7+u @p)}V}F[1F8KYjӮ`۝Gӗj,g5C@.s+#b(ssH\W`T΢4х+OT5xTR) |eζU: jp~nh,JןxHZ!6p7V~QLqW=+pY_-} S)}c m[yߊ6&56 '/F~1"wBzaR}X!D ;0ٚ'yӬJg6ᆷsW[T'ƈֿ(Ɋܐ]:ĉ$@-2уV9לQ q\ZϤMՔ ̅asO[5/JAjaXVQuz:{D>L4}9ŞCUJuΝax({:ԍ6cGa.hvC>9'LZZn4q DRՑA m4@uaѾ23Nspko]5ɺiҸ#KC~,{jⲠsmT):5Rʊy ?S (7oql)T&p!]T m&7'-ܤ@P pWN \?Sβ|$ 8*(*Dޅ>&!"͟"xP ~WwUX'f%rIgVRomw|FLRRa>Ś@ocʂیK6]22,EHum] w"P@E9?(UkΙxQht(F]G/&<oF9aa.M|cu\@OxW =Gy979 L⑟X4GGugvY&0>=bPop"*fqveK\s 7&gBm:-o<ЂEZJ .V]a%}0] srS?= ޓ?zš!I#r:s}sMqvq!2 q)!F'ݔ 'w.@;@ :ekzp!/#w1!^HBPn{~ȃFzI "!]D#PMsC7u`x۠ƹ|:3ejStBs aiy"c:9_o-F/8o]wHoź*f󿎰R@ %mr)45XQB/gaYOb`Xx_8Z"Er{R7H ʓf:z&L ۻuJ)  WŽ̆ҴN?U"&gcx^g# zǥ eJ0~R̨J"kFΦ%۠F#@k@tdծD}dF8<6 'y,:VIWŴ@N+RXEX$ )"i7_"VGG0 TUtMB(W<{J J]o9n]5kV=)QR9 ޙ] Dm 0HgK(~]lJN;;O:$,|)/E!y4E솿p#Naj\ x ;p7ÜIxp_Ex;\X(u91 W5ַV󆔏n5_`AMn@ jw^w4'8S{@ܙoH5nרl 8='|fMe^BA5OϽe/(Uп_Jν.=Vֲ(ls3׋ ߮2\Y*5cO9ٓbnܗ2 T{!+뇜VwW= huQ R ҈!q< [8H d5$:uI~HUjI@97St,u2hу ]` Tb7rHʱ{ңn6ܸog'.Őj.u6"PI`i!U&M/3FaK{s|e#&z۠,iV@!Q6\R)N )vO,#Pd pIJP^[LYS^0}C.{9+#ygwAfzn3{n[_Kc Ϝ ip4w AHzE!cDWk!Mxז~0 2]|`͂<'9/䱧 [wӢ,qǼ$hOBA #66.a6?xZp̈́}Id iygY1 4Fe5U'8U^:vs:M308֧E^A&ũZ+a<$B]?[Gž c2=eL:~)F7w:Đ9~qIwLXsp82=<-c9sV; x7GX?,GI 'v$p xaS`Xs :Nk췣1ƉM3Xí<&ū0ܜaNPw.(Q֞imL4!C\X&Ḑb5$jb 7pIE92îwWzƄeXN9,!AS6~f+-y1ʝ&mY@:d*Y Xw*to8B&8ާt_ء1h#֟Z[n\~l@ r[=/c}܋*|0TPMcpGT-Rv#~pI;4<:Ҕt>9 <d)R>GCrXƅ> {DU*ҟh ˗>==o rFVÿAQZ_-Xv$s O`lwjl,1HDJB!Se#;` oqOL*8>HF]@!i/wF >rZ*]w@ eM;!Phg {余ϻK}„itһ5Q]yz8>MsjBG 1߿0)XD<SҺ o1Ϩxƣ  Xߙe]1t +HyLdABS;}>q %6V)(rxnE ؉Z|҄l ג!*DB󇷅vU4`ec YDw6FFk,5D޼` FG4+]?r&:!:>r)qe9o5ىs pYD?@p))1oo: )bֳ`B_܌9^w8$n@mIzG$ARx%;f LX|xFn&R*=~\Kz޳NruL߷]g+Lph\#gA~=s  mp`joL`眂]rZ ۗGaM Ko45sv<1+)rϿ.]zu);U{kyf? _>0Z4ʑH$50P`mKdx N02:a8Xw8a7-SSwIpH?")*ׯ遀V1f»w]o%m'Uȕ} oؠ!u/vHtn\jxw5.)cnbmFz6mv7ts؀r!MD&ο}>Gj{bZtJƹxB GGތ}$n_8B '@ObMߌda(hઠAeT$It*ְBH7o["i+i9-ttP*u۞GihUy6{񁣫IAw9uCޒ^MEWAֱBQL!0%wtoR?HG.HWFӎhw߷~p@rv*}[Mwa!NWdū*w@(!'0pмz*G&Wy)^~QfwgKQq4 j`{@x ^k>N6Z`F3B";yNC}'Y%|1ǁ w9+_l&|` ;{2(2ϭ^4uMPp` p r9Mb@,)Z"}k4{E.WM<%BG>g7t!4c9q]|gƌ9N.n"a`R=Tv?`",T)Iܾ "9'K'{|`EnX+H:֪[^Tw5 9J5y 3mS(~.;Ƹ `w^C  G15kڕH):&4fYR,ٺsˑ ¥cYhO=ި+v|KChRÉN0*}L|{K+C'`VVJNZ1GF4t, |ƶPq$G gwCnU(X?F3jSoj't=ް*|cM@^F3׬ՓuЦ_0Geo"zyP#P|_F vr_"6%=kV:T$7 ; -KJ=dQc`Hi91xOOPVW@ח6v˯sj{+A܀\otENsaJ7tpU CV ՟Xȭٮ<8ۼֲY$ݼ7?Ɨ% ߜuqʠ e{,I|zyӧip[:矌 5M`muy~4_1*<8s mـ^TO#Ӌc'$wk&9ee\85qX 83d=u RǟXr&6 #jv8hܥQ)Bb0_DӇ*(γJɋyONRˀu<&*=/d'c QDĔˈ><j-rUDDb5 sҾHJBVEĪ5-xJf뎍QÁRo┞U^Wb߼SqqHw>cj0Fuh]|--54qf@0щOz3p"xud50hyt(1,*:۟\cFB[>4=?%F _뙍s*9ɡx>Uy`B_g !XDdauί۵ӎg^]DX/3G_ ȜݹXlk $hNگd^3Z:x9q*<6&f$i%񃻶pbM7Xpih?>xL|vF]x1ԼU] D4Fi(V8k:91, ]!+O搵AG`̋u/.yp<f*;/.%tz# ls8-JN{wqF n''n5}%sWpS 2 Po& 3bHy536xR|wZQG^D*[vs,тǫ{GP$G}]CM焚jt^ѡ]ɕݎ(Igq@|p NXMȊoQ,Ǒ2}qBhC"#i}oW@ej#n7}cKV9s2]]upG5o1cSl7I$'" ަ 3 !"L\z%w?3HRG vhDXwAAT]h&;$6՛7] M);{ZR`E0Ji EɅϫeo\ᯪ:Az,<)}ۉ{1vJ.4';kJٜ9c[s/e' 8EflXri_ ч n v=8Z=ey:Op4k@ Z0Dx=b L^pT9#qyNX"Q )Ž& XG&S8P mzrv/@ueKvo~/:{x!pŏHكRLu V=eW#1p R}M&_# IA83q%m^އr~&vX,ɷ퉥kwŧ#?)|@l;Ĕ88X\OY3A ^?;{.6׃3dF( Ի?yd76g4P\dPp 7[ Sfr|Q .+}exRߞ0{.+[G#FLuч>>rᆴ}f|rc3 Kd± w2 :%ka 6JB]1 w}`;7HeNvdl?ea Y ^2{x~Ьt,ű{6;7iMb)S'T%J}ЛAu5X Ҹ ?9˘hrDhcͱ]R׉Qt⨗}?pk gE턫' = ]k6t?"^`c-Eq5wWn@$*\VpVB$itK :FE'0j!akx6uՈ_ylͼ;1H5t ,lѫD";,:'gˬ`@l0_d,)6k֎7Xkna3bvBNah{+2T˸D(Uf 7LdbM151%H-M5.`*=t]qhCDt]3cf~x}xŜ9Dg{=sRq'\W)5D{g{qjFwcԦ]nZAʏk(at&:Zw+]O7 Ӎkjy!:^U72<tSr4R%.]z3QRӊcc/Nh@4֛w7~Ύybʄ{&-SbaM\hl`F CS{~ptI% cXEC*uACv~JkPs> bAaU TEwO=&0=U E mN qEmll{ tn<8+]#N'1XhD\Hy|=qcU#_Uk`L0_yB֮q \Ym:Q.㌕*׏YlDƎWu0Ѫ ]踊[OMW eHPE.YWۖβ )+?k!N8CH'/]P~^߼kXNuy\hbo(\;DY xŀP>&ߠMLXgz3VA8$+ ֿXǥ\O(F qBSL(H$f<ˊԝt9:w`k^7+9޳T y  ,<-9@l;D_9F59gY]BAaۇ"~}p0p7]`\j2yWqSr,Ăg=5qx"ˋ(QGZϢ}rn_\Z ,߭Lȶ|m.4m)md {_~  #V_ww"*<7kAO8ϱĺP+a'jR"m҆<t(l^')ԶM<C ;Co}]p// r|ShxAMUUBgNXMhz6[9./YޯU?E=w (J)l]~pRH޼ߜBTT_׼x* _Y2&b GU2NJ>7'fs" @4>󈵫կF\^Ge5LjK츧z Rh/Y4Qx˃@ɇ(Tp /Ts9S8ގu0%6Y%HJr,jwcYEeچ? A-{ļ4|"NN18,4q88f |N N);PsyߩzWP"]n:hW{}S/Yt}`)RJsXbi篍YC N]OI0iW3S$s1iu1'$a?&]Ɔq5n}`/ NpbAww>pR}d(^ xa?9}>n\N;kYoF8/bn?88~ aAÃі+L> f+C\pFܹ{Qe|s)o80~sa+֥׃#a$ o5\_.[mh>Xrv4ˆZ4hпW9Jv8&igyے4|@Az19w؟Mō߻ >m#? pWHt -qw)[w!Hңj 4G=!MƈX< +$}blj4V I6u&eu?8 Gmx vUYˈЭPAdiZFEYCZuŷ 7_45; h T۲p 6e˳0H11}*3gu5ʑ l/ASzCN|xyp 5ؠ|ep5Ï6X6M1t{ҳsC~ZĭXT;#3Z wJ-f4T)'7k(o(V%6y5Mج> c}X`0Po\5/{ `oa߇PerM֭oo7z̀u.K1#'o lD hmmW7x,ݼIC{p]KNxIpPpl.qQؑQ!%T:x]p`e]yHٹ !(& t֛Wxqn ĺټv켱]`c>x#Ble>J ٖZ]J&01\'lz C,U߇uB{"aw<J'2 LT@4pa4= )c5Fʨ-|∓t#;,?Wqi@l Xw1 pgÓi=ɀ(2Xh^)8PvA`;/ANQ,1rqI$xg'U ҹ5<[Eؑ&p9 i߹HԜ*i̯yElt,m9PwCQ^5 mMo!eƚx{K⫭~2x0pqZq4rm)? G1 vhC*~õz48̪mQ!-0aN?lo -S5u8Ʉe,aΡޔBO\i \@WC6-ѣ tg q㒪E]Iv(8CȢkxi#E A} QlD>'":ό,]i$ן9j*oЀ#îqge` ۈ(v٣&y#DGL#[l:=s=V K B:cVd9*֔z40~]\Xh=.c>ܪ5Դ~0OPpn]^d6zD Q,Dj1[vJLtG,F|b=3~-'r[ֈJ'`QHHQXAK{kƢMl+`Bz'K,A)QXMp46xWfΏ*4gDy5& IJfK66|'2 a%r`4W(ޛ7x#]X )r;{D ??I Sc}=!'S˹3tC6W"|؇/ @0Ei}cXj? Z Xt<ڃY#I0l_vsζ}a 86`V 1]F\eTg;<yx"mxO7K7]RE=Rfһ98I#nP֋$^93\ .Rjo"I&:nq&Tle9O"UӌOR|-d:t u +q *uqKUU#L\L6❞H흓Y{*kAÓ%hswX,AKP9^ҒαHtaRrO?8$x$b X1;t2Jkn1ɣ:he3$mw֓sXE1,+CqucII*ړо+uPN !Dy<ߌ8"[pW|?OE*z`4o`&| JA7GkQzstnj5*>_Y)P΃%9}OjhAG&ַ׬(lFjHx݅M76)N>W]~^g'B,*|kH5ҥQ[5WzAab^rE*>Ayb2tgQLگ]^`V0 mW^o*!?$klvM!ұ^@S=N~CBJTPCG`z,BBO_tzM$*ÅΡ{oNżYv /0$QTGD͂ G+' :mHH":w߬bѽhNGAH)Ua\94l%iՎߌo+hq ̡P㍵Wܙ"&2ɾf@rX MfkVC^C\DD0poຽ_ I}]V3kB';ĉF)hjp;2hݗk8;ƖdWo88 5), vhl%+HWY9]CQ44{E{T&:#٬oIS>AH}q[\&JFl .i eތ!v:`^OTOc>&];'#@q|Ev5~0kXҚrN8Pm0A"1H2;FwH5(xfn<p1siwa:93:u'-n ]AD_HͿ`I6<hN*ݛgV^o27"*DaޓX"isi *9T x,Ij8._;KkFIQXźxqiz`;j)i/ ,Sn[g a*ͼ-i4~`PnDX^ NV=7^ܥh4;Z E<6#D]WS ~>fFBZ4)qε4ZSdsaΆQC߂G9u`deiuyQD=! [_T?c%fI=)^X'as>0 <3_X5?870Q{mp ~F!Q/&6G{h`irvE9bUF.; 0J7׃_[  /v撱LŵMHDhE~F0TvY_7.BP/i&" 4k0(h0$54+^1Y" }shC"4#Çy|r-n\ܳ$jFkX"$ 2zG ]M#wB_+-pH7DRz$tMXe' 03azբ;*>Ypotw[rẍ́o6}?Ep8v8a<G᜔~CnjfS?G׼C/H`Տ4K(|xOF˺͊xO= ߲P r>r NaY%ӼP2 8@h+>Fq5&5}PrD=mі49i9hQJ(˽XڗW>,θbt.̉ xp9g'_߬s;c&o /Hzɡ}|Z*3+YX޳ghT3d{+ x;5~H]NR:n4a:0p[޼L} JM #4m7dǣ5.{ly)QM> 4?H (tyRQwxc ν2r tqJ|VDTӌ6HuEOfY O8~b JǕFMpk5~1(L(q#R'it]Wn,.+,q(|s8QkmOO;b ~-I55Jg%ktZHr" ZOU " ' n`D4*5aʆ{^=\@Py0YI#T),+{J }Ύ9 9C~0i $[:Ģbd*:ͻeBfD6_өL*nDNlT%e!:´'e[iN܄ㆼVb)dëCUC[91^Y<6K;JZth@ %Цw˛(l5s1|^=ph.3qyU< 7eJe*Ya**V| _j^L_(8t%8J䇧68dV`R(1{sZ&[gPO. fe `p@x `chHv?Iyzv^ v^uozcӓ * ~ C~|aCZsͫ~I׭xɅz(Iwy.SqBo\^2֨2ʐxۏ'E6/4_LSM}*r|⸵XN]|~qDGc䬡N X!x"g,Cf@cdgj=Vx;o7maX܀ݏ~l-oG)[fXK}M}eNi^7`P?xtM%Vj6 hN5wҏpЖ~6΂*xяA9Te>r0yYǑ]S_xrl\T^0J_X*pjD=w-IƛuϮ2鑾 9rHP+x&Mѝc#앧_8(U"qoH|cU|õ3l!ұ*T@60M*hh7#vy>|"ީA|#@Um[pbA]ކ(!=rgraDøpt%yܼ:7чvxW}t˴Bͬ?*Ա_ iܑyF*N8S-QpEl;ĉ5O.Ir}jP%e17&Wn٣f %G'Go!OH)ߛ^M[cq~/ όBęTNW8Q/N\Q b9$ =-z:˺f{}h'W-aqC HaģqUe:ŋx ֱ#\;ft pI Lq2/AXk,muWrI"|Hcg;3TמŅҡXGΰGmsoxQd{|@| :Gj֞̌J[n0ߦsaŷ50A[֞g2kÜ'd虠Hy2q5I s5AѮrcEy7BZb[6ǏD9†һrX|u~1p6 ӖmTp B;x| Gn1`/xpzlg 'NVp؛WL\_ vy 66f98+p$fr #Fc nu W' 879M<mq7Fp0ŤBC6>D5-&mGevLZQM3^PMq8_6}eU\؞P~ <ޱ_yíc' !픽nEdt9i\%UOK;GGy:(>y1䫰vҳɀ|=Sj/)C@P=} TuI{upakes a5aD. %  p4 F%1c{^">ɾ]h笄=9*ӑu{ |Ó֣L736xXFro)ch=ІG -فZb;^r=OSSz0x ;bU7ŜᅱdH(hƾ0Wɧ~f"M󄨔ϟT`j[w_6Ln1}Rs3 1 a/ P`8ӎ0(o6s~'ɷ l,<` ̼# ax4F׬j!/=A) }k\byEʢb ɏ !WF>_V(g=sl^t"a^p/XyG{6#lobi@U|J 2'TTWh6^2^U]@oSRl_]stssQmh8]k֔''sy;Ew,x,8M6[("(Q^CБSh73Q8{%0sG Re51-T *;!| |c$"N]Ye^GO8d˨3+@Ȫ:^zƆ؀% h$# 8,tLˑV5qpWh.xjIy9߼Y8B,я;}f@#dJyrgbmczy98~~0Gx<2 ]/>2=dM?xvҗf/Ԫ [|$}6*w6OXZI~0#2d9lǝBWzR/9w5O1hRo9 lߜ"\<H8AoE[@suǠ|ԏnbP[ 1{Lfq+)pzdQluO'C)xyu%M>IŢWaw6d)^ AdOs ~KTO7lJ2}WQ*~5M@~Dn@\vH!k=d/8>UpgXFHy(xa޳/pL z1P i1 ѡ6dx3XM{\pjgaqkտ7r w*__XI-N S!:nkTD4ygCi᭠U|kŇ{4o:~<5 } 'W2ʃqڨ*F"qGEU$< Z.B: }g w5~uJ }4.KdžUYdAK['&8+Hx}2yE(;o(V"譁.-QG4I2AӚ#=|dȈ-_4C+E"m~;{T4j> )*27_ <9ԡsq""Ʃ [{S^3M<+QWy.l:FhN< 9Ktz.PO%pCMcUD.6k[~ykBBg&}`u1@pO>g>cx@`ow͗"mڅ8C]cOױ 5H?zHTtAlP |˄ y8 &81 _ 7>DB\;"=tXGÃcY֛0l~7BzŪq4lۭϳJVCM QoD'r H{Bak󎘔^׌nY^Zנ-q0DbDl82L)LUpXJnWar6]KQ}[Y4bל`=5xX+zd.h)=L0l:1ǜ;2=\Foό t(IyrpB7VGIQ<Uo6)̂]pPŮr~-K/WtW8wʰ>:DVJK&ֿx~m{;wfvY IDϜi]<ڤK?);ybg\F &ȳȆ)cQ~of;Q+ƛX Sg)Q] TTU`=#15SH@$oaRnknGNBd-2+pT#(?P/2]Q;(fU-xw? njK L.\1Ukr!j\Ƚ8|9h7r^+g;0E|z׍}%֍JXr/p!qA0Bc.@>o2H0EJT8yz}b@ М|q" ]xX 鹯$%ެY\ _hdٯ -<hq`M]޾1׆"-p) VCC o8tDy@EگO\U&kYo{ȸAGyj rj}ʍFnR8ٯmZXx` ت[ѳw+򦋒i78/xxӭx'&:Bv=XNj@ (Nj8dxY6'p w&|ǷC+;X8\'.|\ray0$&ư׃o0)?H_(8fK8_ǼH~JMZ#=bʟa@{Zx4};H#f\HUA55~"J('AjoV+BV-9Ev{vYg:\d^~e#o8i{yN1Cp!l]b};4q# t) —*wb[mֲ tz4n!=ɱKPiqb=Lq}Z\ yS1T T|\5]S2<.@*qy$(18LINm³%ϔ UA2Aü.~җ xKl~CGȠmRE b❰eER0  a:SSo F}hJEK0[^N+P["wwz)i5ϟXj<-iZĘߧ+]u2E&{mb;`_^  :0]û/ooYd7vc2ky7D5\ps:07{\"!~o\ow.@l'"ٌ7I $rI룏"9뮾(:p <Cn:tm6χQL;wttwZ~O/\7%f;|o7ÉjӦs5:3M@x2h6ċuXJ*{6!DSs.xN5W)Fww>>iCkE_+DXm ث|e/d*p3vo/V[%`nx-"+b糣Jtk ܟN| -(*C^)A"g#DSu0 +!=NPR8zh&GVz5m쓺(֭0dzIeD7n$Z*bu^8ٜ8qZ=\[3GpD3+=qp"<8nt9@yB#NUF t:63J;8 m;{={+'hỻ^y*Qo5wPFoH$p!rhCvOc*509 pvO l)p{Y&QD9tF9@6uQOc8s͒)JfROOdQ{*#6ؿ1|bQ2&iuk>O߳Fp!ۇH¨(*hh7LP;4.]eO˖2O ލx dE]dp| o ~' |~Ln% E-Ǭq^N i˛GpRէW&+u ~7Z-D_!u:J~ل$)ϜiP :S~8q2~ egNGk0'RW0O8OORvaa"w|a|O0OL_k}84G9Gλ_ƚ e /˕t))-hC']1< luɽhft:JB/1#OPpT䠗!1FX8#!MaP.29@jE[LDPXգzSy `|H7<%W**$"WP5׳%46 ΂7/- y6ߜivy-\OX@MO{%.`MqDx ?n \BPn&#S7vgG @ZIOD@Η0hux(nePTӉ@@iY{%yYUݳhkJKAyMylFĐPB0i ̌(KuAl<3wdV*ֆg|A1BJ޸N|} s&^mu48<B"bHB]΂!^ O&?6/fq.,kѕ8M!h 7tOø,kxp#yXJqFho&SI٬iߊv)5H)7K" iF=*Pr 9hoFLh"7INWL18_X@ivQq9 0! ,b,Іxw|nai?2-t9t!BqSes3:kAO5qK bo%hG0<0t{r -^{0ʄbEi yȍPNnDyw.#w GjfHk*Fnq+yy |aSk厥|eYX h$/PݭC]#hNJ-r_'d_o\=/N' o7#\O"y>wV҂b X9vE|^V󐝺7YӞxz; b)B㡘Yx^06_sN0F`1V*!;VȻ5*j&SBAvNn4XMrȊlJY#M?9'J]LwIm@Aw' XK^؇X;k]0M.MMh1oÇ@ 1^7~+sX> n>Ex*;\D>DGr-O<~/ ? w)5S'] SWjW>ʸ**] UcA=I j: %&{)(T#\j1#d-X>^qlsCTuRiǸ^ %$7J0%rү3 DtK(-kke`c#M4gVѐ^}` ]̄I޲RvTGᴫOa/9 2#2EE#^&npFiȞL5B/-݆^^wZUr!@Ck=:6CS|GE-W&&w0טGd1!ވ_HQ 40Қӑ]Yp 24˚ J֛HR%tuqxHG -u_o [*hG?l@i`R?@0Ā;qTPR'DWF n0Zu5xm.dRT<&Jpşs1䢈v|焓5(ۛ3pzZk?@7 ?x C}8Jm򔣯Y~;/8xE*+7Wh cb8߬e7JpRU{h5㞙`%&_T6`deT+6gdn9}WCI#cNr W;6oӐ)>&e(LB :Ѡ _ 4r>ySw&zð?D8/n:"K ?f1ENBR=ڼfŅy~21pEŀ =BIۮH0Mw`ἨV/Bu(֟g eɏ?o3{-O傶 <;3wA$0k$"7*k.^pﶷȇz(GjĐ_XMh|q +!ԎQ@&(b@Mp=Je)>?,w_y7ۅ Sj\ AQw8Lij!%y;&АJ Kzj7My19$FxgJ%;}fPl=U%!uX0-ؾ5nD:4h*^58PkT׼[`Bz;tû15>-0Y@ÛKv6%5Njr8f.|y S ,%z6YPOܸdaA٣6ECf宀\6kZ׿i4A}5+4tQBGθ SW,=wIIQk3%+恢oىpg _2qqv߃$p)b@p\yFᗋ͏#ljCᕯ[ ^ZQ0 8 R%\Ds,J*a ȬCϜLڟ=%z 7s$N $xŨbjN|[LODO4F|D*&SByy>3Ȑ'\Rv#p1?'h{s_qz-/b8@'XkF#uߢiz[2eфO<;ʀvY0LAu0.ć^=ćo)'D)ad0إojxpN~sp7󁲎kS^:llqYJb@PWB5$ݯfkX*IY]ߧX8 r#L7X$Qc BWC#.{f!2# l_;хhGU-aM m'/mRxWYEKWЮ\;7 x!*Q R5VcƱ5FNV&r_.rvkJ@Ce)mSa !p8.<'> 9f-fr$7iMu` c=*(Qy¬!{$DnrQ99ƶfњwk!{wEvq,]6/bH!^ˮo-#Z__ KZ@;@OhpᣩPE *qrT)$D66񣼖6%~0ޡ>qt-k<}ci(d=|V e#ԱaP;E e/ FnBJS C4M6 IvadKJ3IHht.Jӓ'^8;qB\QaNurCJ*k0j3Rѽn.@H_z N76aS1طuZ`KQ $]W&WS3]+n aw#AHu o!wi&`^nNK>Hf+hk~$]O)|DCsH2q: _Y#D8b՚?#!xG{#ƅJ\-ڡ|1n.79L`: W"$;؃w%;p9 'HUVPW^? ;Ma"h鼊.e`KJX9:j0mڌ!;ƪz3A)@z kpZf` *IJAI<[ǞK)JX렋xӈ4k0Dj(?|W.Araф @mí_SfuP7Qpew41D&k;A'Ju|F r焣y ' 8JmTŝ7*.5xI;89n$,|`lw]dp>JlWN1ЃN?& S=9ŤM{q՚[\)A Whr"a5U?p4Nm$8@ktvw*% W ?/S|y !0E컫0h>%A\;?[yp lebP}.''8+l |)QZpE^2* ws@"?3M)Fp4aLIkPxM2M;I[=< }XW&vE>>rA_)v˅Cbtrkac%4^uO%}=L-B$.(D!(ڌ.5cqƻZlA>1T}etogcX/KC{%@dUăe+&lT@wy뮼޳|e8uuOXT6L,f2E'F,v ;{ {񍀖 M&ba4Gf*e,zp]ƥGxǜBcpxl!u:avw T7γ`Nģ7} _ }~àUWq5ɺi:އEB6`vُX7ѤY!A>JqK /׌+A3j+eC G 0)p6 XVǚm]d;5{^1'LXm1C:Ww׷گ+7O )^2:ɭwËX:0(58Wb_"r0#/1/@UCrp$qNڒ_ vx{^/&U#3o5xz`Ktz^64BomʲWN-?{@Lۥ/k WѮe1u6d2;h7njhFz1}\SEP U;j) 3(tRVxRC3zhK% y^ZhMR1ZJu!JEBO\uxV ]4@XHtl~;rip=a)Vٮ7SF:b6FCcM5z_Pn&8aT (# Ykd$e=}(#޷5~ΜF4x#DS K:bkǼ" N1$h)3j Ԩz<@^k ~rvlJjA+i?ʊ}c"r=̊ cNG_xm(>y@(_vʂ^.J=㏠4C4#mb+J8~^1mD/zIcj iNŒVɐQԨ o,"7R7+K5#5  {7k@z 9zs9AQG%W r5:OdaA9y8* S;;;#}zӾ[ m8}g"9;z1i_?K\\.ߜz kN_$ӄA:!PxQ`'.wK3)]AqW: 8a%99Z:\ukԧ߬ (!d(+M' pBMrW03m?bͥSE@8@ wTF2p 0:TZ. *li-* Wu[> 6V d xR1TW`?ް΀Ju"cTu-)PaD6d>|Zlï) quU8Fss鍛-i7}-tkNGimFEPWyD @ZP (yloY@ TO. wǷH#%!}óDwJ҆CQrvZ@f G)=7O .PAӃvLuk^GilvSl18g<ݠ(7,p3t#h"*48]!DAJ Ґ::LZA&sv-iGs@](9i&9^ƯZ^ɂ"Vpی [ټQCb5%Ʌ0i+fLWcGX(bbQb7:D&85pF4$r *X v#{,QRxwxZIo(ZOhSez90ږ|xӑp rl/9؄ O3dotkz D|XF(A7qJqQ5/8pԿ')*78b7杘< ˵c3hXw[ƚvA{Gq.t!X)aWmX_&(6!>x^4g?Y[s!{:Xmn^=c:qrޞ7 iIR[ߌeK5w)|?#]J]vy ly92xv8; hߌ|o+,*uhm(ž#Sc˫MOh9?IROìnNȹXx`j9m`kl;~PG\ FGNyLgs?$ DBirP A"N'!4ɼanoW5v ˧pܶ(ן͉#bH.67phmqapj:IwD;U*Ջ$CK<$¯[Tl8x?_v7W_455zlm[xʩ]L>у 5Ng~yZu]h-6y:ڤJг*j+V(b!xs^\4W}5 pc 4SAH4rTH׾c@%\TSIWޑ CȢXd C޵Sl7:K`Vgl.wܶ[7T D_n31h([C6oR ,d+IGF(Pvoӈ o):, 3j|@ทys@gN*֦tkx-oЋt́BTo~.gh$H(lE*j=ҕg)6" y pjP UWK#4X:H  ?uؓHg 6*qZGyZ-F< CNqw[6Pz"1ׁY\/jfv/Fq]{n# F=]X%<`h0{CX],RHT ::IRV| ~sҊ OYv Z%/BGxa>,iGz㾸1Nbˋ IN|n*zUTx3Lo00"8FzL0V4dF:GTdbi|O9j8P[@tq87qx - 2lKO:p@=^y (ᄚs廢<#.aR貼܉6Mb^r(wppwc kTSraRl:A-|B =F^4!u4\Ѯ [07.K _2sCbasWx%Ƨd& c|@^DU P8X0C/4w J[WU;6hQF vy~ c&&HxXX3Id72z.8MpTMI/bGl+'xKGDm䣂?Tl]]ƥ<`l/<+q/$GP2/rIJ^@1j Dt;7jήJv4nilN!?s^ȃfn7??|<-|]`1%6Ewx6@K(1ܳfWAv%3(aӒipjU>̪qI:ӷ<5@S :5ː-rw?i8BzJ!r@P,!ҡ;:dC?{?,9h iCn4j.Ǽ gRIsySڊwμZm~1L lۢL(Ѡw6*N0UF*EqɁ0CSGUdR5:=ˣGcNx (mfcxn0t04K0\_%bbpQD8^9UE }cM;u93ۄi׬(8 pO)x{0ha8 .LybeN +8n&xjakʥi˯8&0b=\Hz+~=`r`\M 8]ù]qiʅDpDMa"Bɋ<0B4<) ˈ yXSk6z)OycO "wG~𣄐׿"x4#i;bm-c|rcYq_pȴc}`@]8N-Μ2rߌ8s'e5KN΂Npa]Л }p.HqeRP_>.>`;77~ !h<UX"QU?m6xQg[<-DbW}U'uڟ}1kΛIG'˻UɄNۛXzM"OXO뙒T_aBV&:mm9%5>0v_sG=fz5E ߃-īDIUy]ꅸQRiJTxޫ&mT&d <8 uF-fߜ*xA@=hp,ga/ARw}"hޛŠ]bkM;'#}`7޲z'@bقA P7͍h,0['ܮZ!$a@>}By!;lB_ }xqUf{IR_x@ :E;T' !-2bHvןp&X6!D- j߬PE{ÙDvJ޳e2<8v!L򭇜yV:C 1pS5OfΑJHP8,eM':T*m?pv; ^ 7dL4yR·E߬ԀtM9C]cψ]W逰"[75H: &"tVrf*FةGh;9 70 {4jM}a4S  g\'0nAI"Ժ| ^ )b,'לh>obi(!s)"A£(#FbXeWe0YaCh .:4z3mxhnTǤnϯiR}f$_hL&W] D*$ y:u?-r46N`,/XoIE/謡L44ڿ8N@*@gZ/ W:" px#Xu٦/;o =,W~^*Jm>:0@Kdq. sM%e:ʅ;g;wnCNs2H=1ESn̢Z;RZlQ~yo4mo8&DXɒCOjJNrİ!k]o,Q}[']2ȕ7I0&??)!C@s|~C@M$,o8ל0SD! @xp-ut[/8r lȜyƖ&_rhhfƉfdC)6tP˕1XFnl#wA]5!Tf@xxcKjH.ӝ,w$˹%fRɀɾ#W;${qs%NPm dF‚Ky:ծ{%J:QrҎj oA+j4o8M쎁Pnq][%oG{ہ; 'yxpˎNqXpǔ^1t5zdž/PBP`63e|xipM;=JW5=uCa8P%}_YDNSn҃[z98S81;Άt57^<U A4d "hl(>g<})$!4 &~=UtywP5wt l'xH$YR8G~9 $70afE:]o$P'ubOhd&-nwzY<F0-}f#+`?<9`@M&Xt|bVS^M(@B@j`cmڄ/;z+$Vo$>pU=zE-cz]|u@X rS"TAIl#Z*Y[X{/0 [& sB ;-[}O(GJn[\Iw mkd+TЎb|4Tlg*Ar{'&UwbbR^H!i# k8KZT4uϳh#JayC{7=q%8g)0:S)SJ_dcLZRjMcc!ľsUPB%9܇ p=0cBYoO |o|+Gzv4S|Rź@"iKtp0[JxʔYpN* \$Bg; ~W h`3w5&Lky;Ž-_gEGTU]3o_Q3=~14 S*I~Kho<8a"“wy Ӆm^3RY$ @B~:C璥pQ41޴(8bٵyBخ5_±,g@>|(Q4T*! {с{Dӈ.C~/dBY% Wq)]{J~WkY7PlC|Cȱ`%4٭ah4S8j[俜@Rmg}U %<|(q ;W˴/.ctAv^#f$H@x!IFoN(m~3X*"b' ᳽o*${hHyg3t;ﯼMA8K@+D<yǁ0_q9{PлlL0b*AYZ*z%]hLWj&>NW; 1fX>fA']:}3x=Wk^47 0h.=lhHb[bR6-]x0E3J'OTuEmGmMQ_A:}d. E]Ԓ 1p`pC)Ԟ¥i} iĐ?8K~Du1aLz"~ߌ]˧ZG4r+Ɉu˄0N7dh t>\Q=Nu(*HœG`u =ˆ!zLE8RR=;ǧ=Ʃ:л ڮ{{$ ;g|{5 jUosDoRQറں`# ߍt'0 'htqfZ WzzN}CR~+Vϓr/Wx+:6jRC=f-j={ p}T\b-Z-t_ X=Ξo6S_tԚRA$q" )pjpd}_x3;h87^`OTK^VQ1˰]x_tޡs(_+#ȵpqpf)SL>xI@p>pU3D sCP"F3-8FmfA@<T#)NMқ_8`RhD UNG> ;tyپ^3OczM; wY5DCowbh;5F]?CU;Gzێ! BpyǞATcAThuw0#^7)QwWBhdMC텠4}.LjR/#@VTdE<-p0@iO^U>#i7, ZQ󮝴lo0,Srtx<8ĥxĝ^}/TUMaՃgtF R| LAH%DZ>~`lSgk(@Pphf(Ø` c vم:2@[;]^nA8%؝ Ws!411'$IG(6]ow4̧t/iR =Ql'3Ӵ&FcC.%9V(\Y Ad NJ?cSӡ; xLQg:wq.&P#N@VϬBMw?L Ewc!(Dpt* uFӿ8c: =A:*4a1g=:zvUjl)zqc/ *.ǫDVD5Ϝ[k>\)Ѕ IM"ࠨ2~`.=z\zBWE;^qoTtF*[{îSXxL`N(m VG+üahufژZPxqɒ5akGB;!qsCwUۻ#PNa_@l? G!ւpH6[0 Yr^>x6-E<ٸR OHm1Ǐ\*DuG"MW=0p@cL9!f.Mxu.-FT ##$Bv\7rqt)#tPT(%cNQK(sAw B<EP{ӝV$X9a͸˻a"G[/23bt8iNc6]|z 0RwxC2<)󴈝cPO :Qh_F6|6xѻgZ^:d\=Sȃw^C h71 yanNDSJܙ՝6/MN^=[J \9*I $;}8 \n1j9щ3ZaP+?X=KFf腧*4W~xͶT7:epVw|bWOu@: !?yzQ@˄($M o:[I9G7\I/f *)\ |@2ґ$#ɊCD102YGA9LZ"*ib6"v;MyBiQBy|M>)hN t"W`t)4ZƝx= Edyc Bg%!|dsJ/8Ӣo?jһ͹+Fþ{yǗH]j["A=#,4q4 ,zňko JwƄ9rmv|OqR͡l[oߌ.z\џӚ_6N4H'<\R$,]RW]<~7 "zsxbtbN3ȺÝ/u[t@_EЂ7LP4AaA|~1f ruM̟X!׼&ˬw󅚛i^mz_|^['gqw].9W7syPA؊n1#2 ؂$"C~g)Gw|*Pg)SIsJ]M ̘i^>Du5`=@yg8:|GilQYOcQ| 0z>x*Mvg=oо2]QV\ {7b*Z<01 9g _D) CtP$i+аnaٰ3E"yoȚ*&`]U L鷱 &HB+ .0+L6,!s)>f4 ;/mc\xXʝ {KBC96mwݷʆVѸ 58c{/*4jNVl뒕X^fNuxA.D7% -S 5v $ ![:O5RGYf6 @~&QF\(n-@%έo0 (9 sצZr;FF@. )nufn[EQrB,Y8xAAZ1\erJ6t6>bsRwÀ!B %@K2A6IH ;us_q-W@eUbJp0Lz[4H`@rfPbX(N4z7@:Za Ʋ3@Qʮo? ~8 W,e%vZ> Ua0($;t:%\ ;3{r.(AVJ ^7TʿRazG2TM<6%|(گ@pGp&=h:o@̂^ƟHnvs.+x7bIjDN5); MAfi׌nQο#5`T,ꊠ:mMY4Ʃ1 3B4=D`A8.*MYp$dt\+,jk]haԱFg_m˽j I`SȿېEhy Q[aK7U/9*f[J]"B傽'!k މ&D`qAGm F~ԺGOofVGu_Ggu$F?C**]/xJ2[Awy&wYeEkz̠S4x$e<ߟ3YӑϑýqEXrưX\MTccMc!ExeOP.u_H(AT` k X5ټ_ SH1lgPB6!lОj-K@%RiumԁS_`‰C:t \x" z5FצB-Ox=^G*Y^%x2~xN{A<#6Z0"ZYVZ-@qq0q #Hq%r.&RD&"biC+te-[i i@ϼ<ג(ۃ ,x˦7/XL l'IPX`/Yv`U r9B_KtS(0@ػ1x"?p'.9B|!/%*d z0hlKg$)N zn sѠd=иA"ԥ%T0( A$'< B;u5X`yԜ!q7vq{8\ ;JkR5aq)Q&V* i.@s[R.p^E]ZԔUtQ@jpʢ [Siwu8'NgeTI@!taXG[|M^0oUL~~ zuῇ4_gy^90J ręO0r\Ym;^7˖BXp&msM\.sX彞/ ^ufctD=*V -w=7xgO ˂ i4+LD 0UF گ:L)4lpy9 n祇g`l5l .€^#h.( N7;7#`aUuu1aYwjkl WZiMVIל Jy( "3F@3\vOCC`q3jh^^)Oc #o7TqW,ɀ4(@V|nÀl=vr7$@ 4dur; ;]ib% X?,@ ^N97iەݩ{. #h4nq{VPaJG]%yx`F-4q!/9`K MuWTNE~miiֲ &NF`U(wj[97)VnRQ6:S*HfG!6x*=JЄ<n+ԪT`dJHlzpeæMO}i ' \1,KZYww+4# 'ֿx<`f)"* 4LbwpFxpUXVKM8N wx[[{ n80zq.7b~1.~Jk=`6 eg~0T`-߼wEyd*,R"0d+DZE*Arsg,5@Nu~17'-߻L ;sF4Ϝܸ!: o4zW^NZX6CpD~h( }( "T:8zv?YS RxxplsnD ѿ58;M{1TF&zoZwTNޱJO kze|&p6q5W+T [}Q BDn\ R8pp i}fSc"_fH[z\%4mL  G<IZe_{r%1x5\q'Q 5 N%ڔ/0tQqF:Z48gC"lahB7e:ZUmָvķ1>ѶI\i놞Ҽ\Axc^<߳Xߚ窹O)sE^ =n6yc) mxQioq O&ͪj"(6b7J׼nx"α$i^_)HC7&@*! .k#s6)jȜ:^7\4<y:jNʔ M,NJw)wC7p{o0Mplo^[ji7κt8%^QK*Jrđǧxt)$׹lfHR+jd4CmLZ[C{ɯ!)CRS[^d/>{!-#@- 2ӣM[_6y(H4wf]Lr ԧSθf#·g}{ϒk1R˿4>f4Y(."++/ 7x˭zd8Dً@NHϜm)ex1,+A)P"ЎxcCJ`,KAI7htPE:aVm::Pu`jOŠ"`vD,U!ŖW( H[=p ܐrQ9rۇa\8>э5::>zD4pUqX)%9PƆZJ`VXFv=xԷN[=eEQqE+OdEnJF)-a qsq<+ѫ~LM_(OM'j~ = U ʠGIkRz⮤y}w󶄦M7 آxd@> F_06׎fPSضNlB}u(α)b czmbp*^Z"^t iEսWE]P˃Pl%'+"8Yڔ\98w '` 1"a @B~9wi NGKA- 45nuR4teO܄ߌH =6,v x,.DŽ]ytX"ל(L5wfF~۟qGIH.|XDNQHhcsur>EO Z ־yuK*P#}{ܲ(R*+;S e{&uGN1v];SQxR8\v;R2!tn.p?>qW1w|8oo/j#d]b)E IP o1W< hN&QgiҢ3{b Sq@#̼G^\Ǭ`SOϼMi.q "x~> R*u_G Rl#k&ĩGM"B d1W&2CƤ\iyeCc;=aMy|- bݻa.f߬)tit j|?!pN9xۻo@52A,:IKg.X-" ]i SɅx"uMi9[uϣrZhq4тE6<_ UЋEx4.ţFt4 tvS%4(k߬"֢5}ɹj i+U|pnb  @^Zbixׇ$.  JGZJh q]'ˏ`G-)q'bh MtNv,.t)Nox!Nu6  <[I/'(AlMWo@*J ~/!"lGbvc' oLYM8N7 N9=&^`]_LT1;~0rµQ0l%ކZ!Su\ N,ẋDwY3ĘGF jD&*bX6\dz x~;j^$ZܳP1$< H'C$br7&9phy;+MuJEBqu2jAx)QjY]Pa:5"MSH&ʈ/ @ OT;hguG$wA(T_yA=v43zfUtw*]3hK0y~GiAHs SO"w`РsC`#A7tC.?uu8*9tP#hi6He 'E6 4͙S!E_bZ!Q)Ьh䭸V X¶tu;ѽ[+)XMVZR6: Z9+E(i%bt`k) )}`Bx91ՔQL iEI abM yGnX+ygZ$o/8 ]P433H*y~ 4Pr* Vk VK˸a(~)|XPOA2O +N,+ѻVB!9]ɉ'ؾ?@mvW_,ݸZb##ަ 'aw 6`lp*moL g0:e>%=dJTs_هt$ޥ?iއ= z Sh|_بh|"Г%=34|227~_8 <@VvXov}W4: IvA&(v= sRp!]_' >x٤R8V8 tch'[r^'S V;^"}_\L$g3 .k$PkB;q/Gu:k(4sY2UDPgm9BFؠnYNMwуf۩S%yl?0+AxcS7 ; siVU;$qv7&W3M`z=a|1e&G" E&H7( 9/AWAZ`HB8; @9hv@Q?zA4-G"M{#dו\G+@>`* v {N \H֕3oHyE; `:v19SyXk#VE""uDU ;e42s *|`[>0KpwL`phi LlAPAݩ^,pv%OO$`[рGHj^8: on.X*+ ve❜AIwj0(<& Ni]ԁ4UWN(P $VϏh8@@8E "*>V!%0RnG֍b(5"z͐YH(Tmާ8Myy#&6=a9ix(oo0gy!GE0= SG3Twt>+ybUj!Vp{MX/3 9Op+.0fioL݈,ʹP+z*z1- # (t4w m6=T~#\SNEEww8'z[ Snٶs^v Cuu 9h$}k;/m^l j4>mY-4y?oP$瓓#u(~$@='-@fDDӅw])N)KCb(ES&-LRF 3CN8sAY!!)ϼpG.9d 7ytU]>p%݅9#imj HYYJ ixX7Quǧ+zRN8~.AFW9ɯ+㜊;_8ДM>VD \A;Ĥ,u((D~3ȅ!{; UqKwQ~ƄADɜ=  U ":;nFdd:&`3@b0&T>< hh! em#J_yqTn7rN1Hv Y=h:սSjn%Lc>N8] 6y=|0%~u8H?ߌuu|cGSgOXHS_/~? TS}FA@RFنB pR(|SP&O<`U]1RD˙n-D!}ؚ<Vm6e8Vu+ˎ]C=dZ!OƽLB CI)FW,KFٌ.mNJyvޗqS-6rYGú&& /7 RCDf4K;f ? lfDKx͐pRrԙe ,Cш|sҔYLTӈB;yJ/EA?;H?Szb`0:6sX_N_[H-j_Dx%^]hZz,9zgx ?[#BN@_2@R)zmٽX6-z1NQk}\X~~P45,o[Э@Fl.=XTaMts7`G#]SX H͝S+vM-DE+B_^9SV!Q}>4v t]Í\ vJmS[4x?Bx 4BrQ)h8^oY4RNh* O[qq/$s8b"D eJ﷞i Jֵ79Ń8\6xtP>N~sh[\8`U Jq+'|)і2*^dO#>pW2k+M$EN9V4XZEX A*tv<"6(M8E6ygX`Ѐ*\cSo-ZCӬKȥ|wV YrO86|x9Cu.|?r{xћҊeL!(i?rIMX* 1lsr<6*JGи@{UdK`9~pP:9oGe B(;x:6T8;ҵC,֒|q7R*7o$ h2Ç ;C×E|/V1 yۯB 8N{VA SƐ+808;j2~- рx D# 9.LVl+u%h;7CE0TaPƊ? wqpclpg [Z\=:+q4 }q`MКwJ(Mt_ȭŽ; MVowtP7_{1D3E\.ڠ襞LM&<{DEOቨ y9ibԶv]ѯ] %"nLd{<™IƿLAt:̋3! &=oYSOsUrHBA_rB*x;z<;Ȯ' }X Nu ^p SfaeӭA֍blGbEUY]_]ۻܮ21)Oia+9(tߏ99:ڠ^vajx& 6RVkRQ x4B'X T`] Aj !S7_=tAmo,z~ok¼Gַ_J`  zzr9^ u-%Jw5ʎB;A4CP(shҦr9e(Pt\uv`@ioX1FZIR3J1"öI؟T UQ@i?C(ty@(0Irb yٓB@}4+iXnyjml^&W qY0 q\' <G7 Ij p]٧1Av 뎲Љ~p ܸ+D}5S3T8v}YhBDw˨7MAۅ)Fdd48GN1肔vBy91yˢ0!L=C#=bcLR|hOcak{ַ`pM@ rxp w_0I;y!vMuۀ ȍCd$޿4G}1 SGrD$h5a]8V3.is~OQ٤7H!Ŝrm>@m.cmZ]0jv^Yƽք@'/ayk?8$jAKKz>q֢ ;$P 9إ)-(;iBӁ ɶp!$^a >EWoXvMV`1GK٣ww6y;4s6xK!47X[N>up&\u[Ȑ umֵeJR7W AW mPx4xC#Pr|䩡G@h^ ޘȐ4oY0CA4Ml\ҿf/YeTЫ}/A4 []'8nl|I;°.  EYw"aE+G{ɱ !hZkIqѫcBEQvP<ػO+Thm;Wn3ig`0&z5@`n7Z$4v`&-4nF޳Y[UMb۬P'#NWoa32qqF2.sjFj $٦kQ3b{[kK:m᝿v<9X=$i%م5j4lXCHXۍeMlw2 v^x 7Z/:EἦI$ [!HY{?Ձ*4M\Zx3g0z @:@PMwf^~ BǝW^z0޹TR3޶.x\bZ'B׎C`<|oē6s0i"敚 |;[)A*(ebu*(5)93ր* 1m2KH5!) m7qYқ%V7<brˤ.V#)6ݾpmq#{E7`X'Dy,Bp`ɥ9QN_#ۃ 044lA,Oi")$dbjEiuζ&'証 4šoϳ&߯Ckgq)6c!Vy/?іAD}K+bh}sQ}aбP:BXN1 37#hX4SK99ٱy0+ĵι=DR][.ܒlŻf Ҋo) .rw3 yn5tF++ %|p'h6 LNutp8!jLJXV4aA),9w0#_EJ]cEr;X.N !0g&z5@۶4RӮx>z~7xm8m}ML 8׾;/05jz]7pgp~t:@貴&ƔI3rNA(jG\$/; 4-ɑip-\vq)P} t/B1מ M`tK[t 7[ÍՠVD,*@*D CW ;Ɒαuc% mq%%Uz߬} 빈"1mw׿0$Y@Zr2B3T@u|b3z"k+АZЏ"eĝ(<3srcB`I)t Jюҗ4АDlx y!T Wk3*L[ 2$pR,7XPv-Qr8PXF/7[t j/ccś )RmuEb1SA*Ң{sP*񉸍Iё솿w=66r8 j{A?y#}YE untm~J~1) k񫊅\? Z+- h%=y-q1~_P8yqӌ̊/ֹPLG.ϒO*}3FlAg~7IE/\H.y&j\?H?.MFw178F=% a )Sw!VM@쮦XK{ !:fNp綐8x75A]GVIM^?/xjqjh~<2b3U_xu +"tɠbucH tC]#lu ư\C}= @TӾ*. !pmj@P2/`aIWnwnoiSG>qhiNOˏd)P3tۚ xҨdpnI X7Xw\b!v~1bqBwІ%>mX"%f1r;b/'oRwv˿7fDw?$RC9?87=k~2Yֽh!KTKY¥ pA RK8 zZq(x W&&R]a1]:NSJ(UȑO$^PYxCV9>9#,^+mTEv$Hל$ 3i/O\c(MT7]ɏh# 9y ])^B%|8M%;;-PD%-qh7 U&[R[}aS-pb!ŃDbUSDR_Ne@Å9X0$Ƽj͞QB+UhyqrPmtQh- ^Xw{Š=&:yFT$s_ⴲH;ۅH: +K-9bPhΌAۈ֖*4k •y^1buҊ] ܬ5CK@op(7Q;4 >!i]ean0l!CqUM5;/@!,X1&϶9 4QLAx.+ 鮡pVc0=MYfc2Pk}}Z;ŨsI~eXF'~VO>Y:x`&O_ BK?>%yg3=4@qFb_m"! *%-po*Rq1@%cnpKȅ>75ۦlǜ45M{([W.U0Mmz)v}HA|dW<Sv'bhJ)Ϛ6hAɱMhZ|DU0-k$ts!B ?I qqfwΦ="O)i3y po< {^XH1$J}b1 h؟Vix*>2)D.d3"/"Xv]CGn&"i3:U/%x`e0_$ۅ ,+  Dbiq0#b\.DpktVbU$(Iym~[@* l+޼MLMO/O?piL+]t!N\LXR$wCZ2B4Sѫȑ \jꚖMcsE&„ЖB>Xrtge!X^jlNf:g"2fo (@Qom@@}ᤚ&{! fi<ξ20Ui!bgMu7]GZ眀:HuN^H<.Vr-ے 9]tVQd/rKȋ+z.QCWPPs[U\0DƧJ_!axymM=f΢MA~q+A[ָsɈ.v$8PG\ JpLC41`߭7 u +Xzkqq@iβη.!]A,[( ت[=E=:1 H'U@rD#q HNh[ [jWmhGBC`M'* lKd0 +</0<v%>@h;ZFO&$ov7XL`CQOo `"|2S`?JY%6x7 V'e\_b%65A9_8h9Mtq#Vn\9C!" ɮOmACA-(pd.%G֘bI=Fz-r>H,|؟` Zǿ< ('tv; R77V]E+(gXcj7^lG-wCv+hx#vP̲ZuU6X Yd)Q 'dIx5k_H|= ]嚕6ޖX;bhgg(1hZEcM".\!.Q&#9 k-?K1;%8XUM /#o { dwF."h0&x ,C$XUt!P.ZBիAhӎxPdD]k7d.]N#X9Lh+)v:bvs118S lWw`r9:2E_&>SRP+IMƨ(*/Dw(Xj 1sνb yU6|>ym^&n-G#%`fwX0ŕ rݻdSm_%ĨFU"ڢze k/zHύ,D!^[ķI.'= r`wQrZ*s_2h+xKα F-KѮf\-*lYL [Pj൚Pw|1sj o+kQ|Ut:,b'Y!\q+wPjMpy#JM[X.G}%g"R*9N M WG/Z96kU;J An6mw;ٕ \c'K|M6PbXNϬ`NTD5"< < :-z|)E}|7 rD۩mگKjq<w ~wFy҃{a": 4gLIǂC`f1W\ַ?0H[۹Nf^1POZǥ:/'%ѮO@Q xYN~:SP=\nB :8=iH:vX1D|kz)Kw"V#c,0 .nսPŏnU'7ha괺Aֹ QZ?.V '[Yp(I:7ѠFppbfoBb<Exo5MN+^l{f2;4o~mYn8GTv[ka [o rʲ%k߬]0BYf<*]C U&3ghPnґ/x)54sлGk=L6BEExzmQ8Tg\mö譧[αSx7u"i{»$uyM nDwPS<up@ huW8xWHM :#Zr/9M Pg01vr=\sPz̡U[]4Nɬ C‰Lp'l^_A+_s|WEa3C?E|((`B] :'3%h!Rw#A|a+µ s*X ޾QL 2YV wzÓIIBXu5Neѹiv{L[W]1#29=Xvi~Hg/ KG$gRFvQX4@Z6^[)0 ZEgtW缚Y?8wT$*C %w$)^nI&IÁZHp{}c@<:tJVu-me۬}-8ml$TZ\Cӭ *'#{wcCFt~q~Euh uLDmTx9ČW~ U@yYY2uUr!I8 O*%( H\V"&8ŨMMk_ ~ $*^"~y|ySzˇz΃1bU M7!yº͝ṓy~3fh) 7ӝN|omEk\5η WJOMxMA)T^r #~t~#U/LsYMJlCrg\,k]ӳ x'))+ L$#-7<n!-R ߎ8p !G&Kᇼ!ltӾްRlhfe|ȜWSҨoy>4]/_ AJ6ZDr-PI4%!un$&N{/p =pq6Y73&:ۋzHT`܌SJtC4}&t WPFq GT`bZ-)-bkZ(֤TwAxHEO"lZ18yO@a9,z,U}[5<"UoO!&b!_£cP #q hx QHf3ܒzEb4h7b(ǟk-IaXw1#M}~6U׶Z"2]*ƝqU_z  bK.h|Pl:٥Y.By(zR7` *e SasS$q`A15KGܚYv^:s(rG9.Uh{]ܴe!/(v_$1l;_;WHzVǗﮑWi'l`(?Ɨ IRs~<4EDOdDu6~2p`ڒx G*DŽ6O7njׁACzɎ(9V뎲jh?>k;JbYJ y[+_F@40(~p u}G(?96η4+(Rq3Cm TK:!I,$t*zdkfOpGDTS*Ρzxf%KB4MLv W{t>aPHڗdpyhTѰ{ߐ!R-39N 84&\68[Z802ywo$kg?/"sqW6S>jەk hu'Y}bOe{Xzs7kȘa$[hlj^)3c(J|Y$ )Nz2/ spM3Mp]1 ӄN!嵇PA+vq{H `% 7RH! ^*P,[uTn>{\:m p> $%w+^T㫑*;0[lfr/WP4ACW^sO|ݦB “4fK"m56vqRz H m]|2 H7u L;^%4qz2,Zbqx[F)p4u'Fo%GmA؄G5a]њ>.(WaoS!Q[b nYI04sL A]sc(x/\/"gj V~!\ I;x?fsp!p*i:NknqiHl⿰(HN8{ RlL:\&ʿ)|o Fqy@{Ţ 5}' rST<.Fvjָ9*.km+v,YC۫ n.=F8 F[<|?՗k / zyOP缽z(+(F0+(S;*\Roa,KF:Xa-|oed~%qLz_HcOW9RA8%Ʀw+mj}2&E)KvHr'o tri-cp^}"Gl҂ j=|{zqݧ a$(6\|(uGDl~Ic8?8$5 :NJ굱oϜMdaxA Ixݜ+k8s]SDMe7I:zj~rQ]]yhPu^w yțRzx&M7W)W)楅BNPYl7\$(@Ml<Z @8 C*@q5 sPѾM Zt{?Õ*3O@ɧN/&"] أ9y "TZQi0=B_qq4I+s~qdix޼I폽 =58\:4@8,p>AsHSaQt0SZ5QAkCPx x ;|Bk`IE#@/q3o1ҡ8!}6c7,NSS!p\09[\ˣ|*<ЈtEQ]2~bn[:WUNe`(U^`¥UU葁ޔ'E|NO!zk~y;Ҕ8Ca$8M.!%h]s0X 3H?뢸u;4Hg6)͆6Oc(7^g3L94M`>\M`=c.LѾ%Mc(q󋥸I)H6ݩQk]Dߣ-gezl`l@z8U7NęQWP8&s2 zBQwd{5R$T*ph :R:]$-eF%fQӜ;G3䇇*Jh";!޴I4CZ!BRBýuL@ p`JBPm wqjBxM,4@. < H,:{q&{.EwFxNJSmyDL:༐L: Sl(Bl>lW`F1j6\em)HlkdG1Kp_ʶAmF6C ByBÜFNT7iN!gsSp0 $UZef(t5P X 10v\^e_O(x]VvE/Ρ@yi'KlÝ-!oMZ89pX(]Ȅ]=7PT}Qpq˂: gxQAJ4t ;c1rB8r*3rr=lPw'01ӯ;Kfb3s}cFZQ;I/qP0źC%dPB!!@OuPiNbEU眲fi~} @Z;6 k2@"Bt8R@ ƺ05`x! sY*^8JʾrA{<[C%l%`=qʆwěM&:3U9;ޮ.TC5"X71q@Sh( k2l./#vw[j|a5JYsi)di75 V9xjP/:r>֕EM2#ᅈzY)= yu=kͼ.' oBTc\˴ zl2d`6n}`4hWhֱ9y0HJg!Մ yAe[<|$Ԏ8m%9Cό7AwCK1#?6Onއ$ BZ|l~H5=]-Q^ ?I /^v},!ҵdyP@qÁ?^L!yQP=rDKx`[^ciΪDxqQ<.29ĩGtӠD"1,-Jv EF| ުAcaykp:FPpk3 h> rroB>͍P:;;p lBt,"ʶxy1:nA}&)$GԚzɚ' kPmA;̂szܐ-\CfXer{֦4kvg {u多\4BJ w>p:*{qNQз+P)U*"Ixo* eQӥβ $`.2h 蓿6:fC+bońΈg0R^1H 3#Hia54𴤁wB- po B/fhBa)Ѫ4MMxH 2誀p ɅHѦ(bJqt#Bm(@ݰJG|0]=ֆS;FN.{6jSKg&fIJB½G{l. T jƈG'8We>sI KazH"M@vl֨a+w_ mS) C|~8Jp%,91>~0: / }OL<}!!"׫2Dl6^JE zT VbƱ(ꗋ񌝭7=oigxGф54ďHOl:%T^0!j02WhD{6АE7f=pδrcǟnlpafQhB?(Mu) >pӡ=gwUk4}a&*'z&xqbBDQ[8>U515IqqX] 0Y@OU$c@f$k]bCD\_ vx*(#LB@0~Hv;;Y b'hMiƉ4Pvn5(0<<BM,=*MCr' u&YO3y%FTȫ@t&gev4w?X˰w F#y8gIݲo 76/>Pͅx\P"@7HB.PwN\$X!$ٮὖ4ܓh#O62Z&\yfB>`+}``C_MV Kv|sF5YS]| U5Tۋ@tWZ@<y#sLkps˃lDo#7m$'q59}=!hK7Mk_S m|`bKSCdv}㔚NMr@ͫ0%i{i[ZR@3&(Jڠwى%X ְB126VC?5v 8J-q fڽu,<;4 @Ow!!@NՇ myQI-4,!_-xc‹(*]3dfU[_ȜGc%GiXm]0"`~,rGBNK*k1LEfHzzmُJoABX?9ܘn?lRce,;&GFn^1f'Pǔ 75>6UچIu0};NJdMLvDK+;vLM\IF?8Hth7tuCD,ɧ8;<1G A t`vϼT+owh`~]h H񛣊tf7D&m\<8Ʉ|@(HKIYv4+}onPZwm7u* ]-!oY/::WTq5PQv2nPc/+vr,}z" 70hShW)ƟǗ>1NN/ CSfu4!c#;_*%=c^VZ 1gP@ҦyqyqEH^xРȅ4Fz$8LHVYӋ ER0H!rQFGfr<মQX*˾-ھeg?xN]coSE3'{_mǪY ؍;5c|,{ްc/PjPe8vFF7q҄ 3(M߼d&4[S{µC, ?x4a,L`J؞{rr؉r[N52Vw#F\<E/RwQ`%/) nuN"~ɜHƉq< X4|N=( 4tkgr!x}.BM|;$4p4'-+P['rw(]O[U[Y >:IpcI7mi*.?LloМ'\a@ZhD1lӭ;k+:r[ȑ@Hkn+@S|񝑌q[ N@R<|!6o.ΕisMkS‡ |=89 BuQd<B&$V`bXO" 5Q$̳a]!m5.m-knImWQ ,zJ'fnװM!cf "%l+9¢t 5kGfSkQBi\c cn*ҁ!waA(E<Ñ h_^h.se6t#7qE]R7+<H\qk}rh & %qLSÌ2iMʜVo[wXTh`ę7 5PoJʗp @v ]|tA燨 :Ml_8FF1c͌ 55fZrk{q9f.89JX]L ֫yf1hTl36y4pr<{4\A /|s Uĕ?%H6Mۉ3p2 *u/D()|uP۾m/m&n8 P_<y$oP=lv1~tЫ_gTyrQ D-(l4z(`={?8HN'>$kXx5p/WN_;3du{|劸r77*M5;}EETf3vo[,Eq4u/(<>;M(X?x<ā@] :q Н3Y6.х:HWߦŪ!^kjN`ȏ6w!`gS݊4 {BU8׼_ B$:n;0E6 j"iP@ 6j>P5XuC)N+gr(KT] on Sٰǵk sgv|]{] wq;r %_ĩJ:tی0gߓ5C>PdÛd#n{yoUm-SRGo;X-|_Xsł Օ+6uޭGegƒ֜OǬ3O _sSuKΩmHNonz:1vtw0uqȻk4Uƃl8JaX WrFv.Q& Zσ fgW`6ՍreT (iHs t=sL nQ~=B&_] i;! =ۀ%b:oɵcDcϗQ`4ap:29Ecԝ &#PEx\#{E]]i쀤 :; ԯ.M"m~<(:l=mDZy$\C̿xpe܋qZލdoJ$ yɇdQͿU>mjlZ9'.{'i+N&ze, kt&G6<W Ў\* j ;DԢ8@ no,Utq/ꙷu\ 8 7>bml_0h@jb,IhMVt]6 (b-%>:5>I_֯]y+a>$lkM]…$w-m$͸ ʑ H R»:`ddZl'ҖгJE[ێJ1`o!< yo`U"';ƹ:6]% vD%R&cNFBl0 ;T4ZGj&Ẃ y`$։ށ%(t`$U~Sٻ\eRc7ƾ8 P&v6D \deLm iP樅:*ylxY[Ot [+/u{,Q9&!Ha'ɱ"@A$гz î__Xhr*ۥBltM<˸@y;[[3)*p(=XyuUxT,DP Ůd|cx<w@>I xm7Mug є_c1el*-Of\fvFv7ɤ&b+f'HyRg']%~`ja,Db rd)S0Z,7 Ʀ~h× {Z†Kn uyAۃĂVz66!olw t;* K𗎲]c>W$QwZA掹E(~4`58K)]߁iv,"kQىCIJz[p9:vͰC6}$ /H}~: b1g#77)~$,! TƇh^*OqOͩ ⟋@]pA! Y%D p6/ _J7M6u(E)#N:_HO8UY"dL͊P:2I uQG(JqOU#ҨN?xjl).QgZz%\p\x-8RN 4־Ikw&"bsďqʆOkA$4x;&[7θJQi'r2Ga[gHmԆ>4y5=}ykã`/5ˎ"-NQ_.,-z; /'Sni0_,64|f"rJY7z}q(lhlyͩ^E]8S7 eO_}a⚦R"zWa˿PDŽ}YԸrnթynjyA"<"_rVJ\XN p;^8$UBl WBej[ ^Fą@!.>񻧣BBP> Ry5ó714PURVFi<>zCW9I.dž(tl2),㝏6.k4I̒{qI@+/_@, 4&kDl֞p,UH{Ds}Mb)#SN/¯ ՅԊYcU3b_%p dI9Kޖ΍T7lf2PDN!c-sn:mrd Nʏ㉅i{o}]aVA5OsbjCw߄H6Iۣ'!510QgRrd(cFfF3ɦnc$  $0ӶQF7>jH6%t5?Ɯif<6npdAܛ2X\yȧ}T<2fိM}bUZnwpD(E\ @ >{Ф(X" 3PhY\k$*iSc0kxgu˒1nD66< [.򤨓ua 6ki>~B9eFn]Gfz@5c2QPuv`v!d&ܺڨ jZx8U@9Etױ>;45W[wӕ>uϹ< { ۽:0ȃ.iyhqX]MI *XhCg|,+arnZcTskUTj%,TzrpQՅHHV: 1#6On1X@~[z@ rR#̼n'7yY<6]nU!1tx:8-N iJI'ZAl7߷4' |s8Spr(凪eR:xYnj7Jsc m9 &TX(E~MxXB"_fHh|96TkP_ IX 6 t Ӛ@y["A86+kUhbj7U ף$,B<ۉv6]57zO"TEFQQ֟w tW*XpBH i}\ Vv [;'dahjvb|*mq6W=0=r1\Mpt@xO-2vh'/)1["K)gzhQ8?.WN[㷂I4<*6k-^JZ0]i~* E |wCm곕k"8Dz,|OA%Do#& 5- o7Biz}fu[yd8H(ō?ˍ[+&$@ i9 xcWg2k&.Xu`ӥ֞=ҤΆ/qS|M'0nvA6aiH G((Q<~̝'|4l;Xbxy1H*@6,M@Gwl7ly Р|q%Ro1MDkt0 R;rh`|]b6@?6BO6MC6\yH<3AOݚZڟR @Ӆ&nCJ,8Pn5@t'Q@ Þ80%n~TX+P72AvճpdPt,w>?-"R<*6]l^̆;`4t8,bph Zu;4@*?8Ȏ [KЁ|lů&U]8%xA@@Iؚ5zqNmvH䁹/>ԪeNAy'wb?']Їtt>qP~[ڿEQ6&P = H5u=]#t܉`4O+Jb%kŠA=d[֩Sj'bX C[W΀Cs`q-ٛMjQWl8 ʼni8Ay<[JS_x ءk: jv֋Ǿ 5@(^G})"53M,N_<-1nQaǏ]⪻L:&Sx1n >g w:M%ld*.&@*?DJUTq V-fm'PXFw戔pӷ $#NH=dPʄg3pC%^>5XKiv@z=c~$(KxDqmvkf\/}~3X+ʄ/"fk"SWLKW\AIk ֊c$^]Rû 3Bhk(Am1ё 9*;WyxƆ%o|뾷0mx1NŋtNtHu=-e;9|ݶÇ. @x;zmu#` m:Tm"ֱI@vxTr8`B1b :h@)э&*ۚ9 siMobPr#9D瞖| '4"7)|EuyB iݢh16AmbZ͈D_;Բ""&W 7 #e[*6&FDQA{V  ^1VA htz;Ǩ 4/CјtBPfRN[P;!bs{HTrWGo~@Q~"mδx[.;KEf <c6_1Կ,P:@jК_xds"'P5z%B>ƒ(Lއm "}W6Tt߳am; 1t"ni۝6>V⊌g<nj.-xS%㟌D,U֌kvY 0")~1[. o׮0($MTDa+ =9YK‚Y fn1R,/!J;kR PBqLwbfT {J@]o]ԟ^Ex|aPoG}^2C7vTznpxj|Fe`'3hUO5⭔6-&0@=:JF  \GNVEq͆ g8-+2[gz"%3 ~  jݡ(< }N?>CEM9s>p9 IM=@,9zleA֨h﹂ )RZ2u0U|~:hY|b/dnUtkɠh8ِ;)81"NMcgu l x+[x4 :|hɨCg<.&|`{-i$vgfR%Ai8KnTg)-c&$p&]RP,"tqWho@'| Ƣ "bkzŮ$A0kTDK fɣ߬)YeU:2P^NMlpݕc4H6޸p"!/tbsDm6{rLDBU}`P9W/'lR4n字6UIuv0{oDDk^[9Mk~:] FO`ì$xVi=aw8ShI8J(FxM'b/4@qb)DwQJCN!0_,9Ɔ9P4;"_xkA*6i׋w,tҮ-zǥB;9'%jPlQ.: '+[igyݵŬ"}BĔM8PT8f )1EyCт6'8Hp#ry|DKw[TCM.7zzď_HqRHq^S)eL{v;+҈z r{͎7˛#=-9 [=(|7 lzbGNZdͯkK*,O j 킓G26?G Am$iJN83\p}l5 Ǐ#Q;;hlw QxC`'XCx(Z{ 7bȼ5 mi5#{"⑙]O$i3xW\0gXsy=x3`{xX wHSx(#N4Y,,&v% AF}`8יAB! $u6*hw-ЍsKߠmE&vbB 3Q97oKoΠnSr>0J^>NQ[vzāzpJvmC ֯5yaDe'wV#bNj')i}^EԞrbGgh)5˲Tvm_\ ]Y>0P's!!vs{r&{ |zbX؂/Oso hQ,!mˑH?yh?3 < .9vXPKްkjaRi[ {Pw{#h)˯XxCl_W<4|8^Nnlr&5}oyJLtQ] 23 iMdvh17^plTXHf4 rzɈ<@jRSWo !.ކ(x1Mqå9so>{I5A$xxC?8pGNmw^׉:aK}( un^Csx 7BPk!bGz&r:D\xh؁MDix[SU!|߮;=ӭ $'D7qUڂ|ﷸeX |6nӌsA8$,B[FD@5._咧8!IH *nӟbI,yqIƍJ Oh)H9S BP ̿x%&Íb +Eθp1A?ye"We˿ybě\Qy|bčoKs~1 :w9Dih*{00Ǩ^^<$޳AG/_UJ9!V$6n ɛH#0KC%y޴lZU޷0L WQo R4޲(Rid &Қ4:i\rr$ [6 颤ZzscXuQ%"}cNp}lnv*r5ڣ^ E1Q^4`k1S=34iݠ^°5rh8m:mGe6?D'l7(f,[3PD[][6]~ tHwvփ +>fmT|:X]8[-xX*D4"Ҷ$ؑ﻽>$SbC\Q%S}S`nmОx84gx-U[X!.6^Jݯ̛.&'/{7bF "9|튅ȹ3 T*g%vЀjZF\AJCާ͏!Eq:v"Ɗjyȷ #[2b56xA(Åh[Y, +cr_'C{Y"$*/% xX!z +E} GsC6-o_(w/KqT'v+8:G;sZɭ4a kjkoIo-5RS~v>)G9v7(#kM80q;Fu͐Nβu@x0{0).hN5Z;& |l:'ٜbߌa(i7'Cl<#^ULMs xLVY3GgᒌűG̓(|a(Zx QrŐ`%aˬMD e_X`Uph:oG X[>kPkBstP?4SW%=$:bgxc-.ln'a%s24z!^wMױz8m-̙/s1ߗ'X.St|ui~y)E!;{Br3\臇AP8#3z⹀A_"OE2 /A1B-Ξo#A{3/N%:K_ɒ@hO^@@T '& yJRw_#h :s.4FX,ƶ<6I ;Vn]֩/;q j(r"ZwkˏtV5 0UVNUWW%d:!KK y$nH{o$ߡǰM, ۈqlNp)ȩ ~IE֘ȁÐӬ6S{cRrCzezʍm0y ^XP>nU/mM +~mӊ;ՉZI>7^\Zzg!r>]7$2cA7x sc=&И?x B|\ezC ԯb|R F^f'ްf>IR#`Ɣ0'`;?7*^Yc٫j4KjҥFD~ p'X W{[E@$+ĺrIE䭎hJZ"CH0Mx |uޜ+p{_5-Phs^|߂>T4,r2L6;|8%-D{2PԢgǜq-& pn:C65%EWAޱgNKך"@G()ik@m%An ^Uŝ~^6W*wWv*5"CJݵ;@$BJ?;͜~U+׼.Hè]8#ho0.|$gUtW)n5v'ɹu8[^RmrpL&8+X-O hd >AםWʂ&wKoZ1v6p_'mۀ?yb}“R)Z?86>0P7D!ikk)SOwXl*x)6&Ge.߃Y:+)*I޳fu !""5>g+C8pu&7JpUH$ؒ-yzۮGEnlֵGzj]1 [&qD_y5E#Qx ua t%\:wWy^4hwvpsw#mq%j?85IrTn8?z1؃rM P*6 +QxeP·~:9ҁGO:l0bh%psVFlqG`UJ@[bA|qV MyW6%] t5S v ɷcrl`#[]Iu\ONA!WS`]aqHs->,^99͇-%o7yɗE/OcXٷYZRlc j{#$%StD}x' Bׁf̒h֛-KPx2! НPN/|y@Rh^M>p@O* ܌R(,'A8VV.eB t iF fwpՠ,zG˸(4PZ~ *(&^b -|ݍ,d< 7-=AU;71wnPܰ/CS:-;`L+DVx *V)Y%vq (46q&g('E:![L&#X7MXGol<8!;a(DD.EJaXB_8)w4rI(6pDRׇ#Pb!ԎǖNDiTDg5t$p%oWWFCٯXXhl]?F"'ǯ9*#`Һ iWGS(8}i3H@!@ jVкWyP9ɪGt]±¹H;ÛX.w[lf74.CqMU׾.I7yZpjD5 ]+4Lv4MA0뇡޺õyɡK;8'Eq5>t`F㶍;xx~}CK6\] MxQ}c4Tzk2z4UE^[BhD7rr3֟{ U+ٱ>3^&Ìl*Z|⑷w:0QAW1iRߌ)1E(O/yAPooJb0R̜kԋϕ2EpwKGB^|`yE]u!2;7actXvXnڻ7/F]뭟{@kq=¤xa~ lX26 @(NYY 89neѡ$\8懗kpu}o)&xjpAYiZ,@9;]養 {0$(Sࠎ˼{ٸ2웯FAF:>\4_N @_`طj+(W28xy!(ݮU$ QE7?x]Ao1WHi^x繚@]=ـA#w8xBT{$W<;q@&x`l@zrv(b TXp"n_c)@g$4h[Ӈškmn>ΆUYeF4TPтAb2&u;yLи&QǛ@P`ZU;SG OЎ,J;9f5r N'i@l9oy$09'-a {%<{C h,DC񉀃ZgO *h{$?CN.N]XQ]83n=eְ{̝fst*8p &K吓]r :o U8+^\ H]R 3"1Mo.|el7mLRyW̢*&8L}9)v1| <Tz(%%Uf5Mm*F ]]LqTkP 硵V'&x}\do>p0@ne 2O~~qMex mr}lB6.ʧ\ӽ!u5砋0|h-^G"PtM9!uJyy0(8|߬w s28v-^Cl`KN9^^]JpWzK鷬:~&5:­w] t!3 .hWU穹)Eu 1T ][1ggɂ|e;/G+ŁDѼ֣l_ydia ΦxGΊ *#b2v.AнOXv}hU9Dj@yxT//n0Ƹ{F E _/*&]KM( yQH>vDM8MfϜO(~7F}f !'-& 6ι0CtB#*>Y7d#6a, fktEq1rjGxpz: ⅦT(4"%o :Ť~99`$#Q$^S|W s7Ðݵ}~yej:Y55;ØPmN˪`mX}c*"УpVRzP>OErThA`(Zg]Bsmb vy(CW{ a9bq5-C/H4.u'Z  [0] >NJ ۢޱay@(u( BD8ă޷ Ӏr8DF/tgw \R:#>XX@MkFjQKoR%˯kYH!y#UOY:n.UH}&64;J{󼕏ADouw<8~+|e3JӣXF%FǍ|quN Tۍnf|4]NqCM.2yk+DZ7xcƓ\8h!4ӓoj4M&A:73K" է*q@ ߅4s*`\,i(X`x oiK) }Ν :0CBi yUvq.YSTḋc.ͺk0R5!'bg7#(NK86AT0T*i )dF00 r:5aИ ;EǛRh:j x=-Zxi5LHZi@'U<7(Dt$Z)P4]fE]-#l )F˧/u#hNF|2l(ނc-fy*IjWnZP:r N wg,ǽj+ȑLf>pX!s4rZ 'pfC§ "`ԀU8oFǠ؋ (@cmRr [C91c W(J](D@_)15H35c 0tg]q`l6^5a6q1K ڜmO?':xY9Ҕl|A.RHv{OfnUx+X}o(kI ~uz5LĎY }^Ik'XH4'< Ɩ +a* kNd)/ )|愊m( 8ћAy͠~5 [d%&}񀼽V Rpl5{B@䂎$I{8 ް@!Du5@Hy[N nkMNw@!@/:޹%# [V*_8#KXB-']oT(朐NWP|;IR^Z:HZB7I ]tC}o7 7nҼ! j CZ3iyq *Mn%9Ϭ6@oQ:4\&6mtm=` JOo~@Ț~pDZrUǢb ÅFlVPV%TWz>\P*rWFgUwϗ+(+I {mZzY"`h%iqql Dee א!GOM;3ό]:C.ۢm^%{iC%]~wo)6< TG{dŴ8TbR'wQ׉/2 v7ӲuΈ'5+Dv@wzd&ϴ~9(@^cY {k'@v*qOITGoPinUm{n~ qJ.g "eyfO匴#wdҔMe vnÔ6AcE^˷ŰWf?zeQ&́R| (t |cա~!]tB!SB1q `weFUD7T_:.!JF~.0& Ɛ]؟Sy ^W>_*& B]f9w;#x:ˀ@X|eRI8s|X5uƹbaYNgc Hufl_Y<*'m]^ x@V|Evi~pUW%@962d{mُg8Rk1Wt:(ق2@oi蹧$ PM84oWwi?۽?Yu)o6QɉrS Rp(#;-:< 9B0X ߙ: x%*?L(:ʨvь54ЪwO [6&C9H菫Dp׌:Gzttr]#Eڡgz8b$lI9l2ѬHyшm@h/ӜFC^*vsa瘛x4ak`2 pēBG`1DxWezrm 4cJAgVO]`4ke:*4b f48x_8%|ȱeӱ}7JkP]Uy,=V,_FW_|U5և"^=u24!AZ"ޑc`kt 1.dK٣`qZa_2% ~ (Rs`l k|pf_'8m׼x3H_fq׮>x5㽺< " ,鴅C8sZv23Bأ +&$?T֕/d: RLR\ߣ[ q8A A-|_\ j2t5 (t,߯7 GM;4"1G5€v>k)S" =`kL)ku,ޱK^zva J,"%H f s/X( BG{ Raن ZZ<ɎiG4:C;))w:VdЅiǣlqIӶ 9JT 4o}8$yb:.ﻳRHv`m[ח8aJ.;m*zV 02O1#Ud޵q&DcƬ Ow( vuJ;ps[6-uRus,9x+Hr*JXviaJyԌΞ0naȧØa֨kTv~XzqMжqaE?ݷm}ԎR~qr QMOhՀfqۗy_EoM_4ypRx:[HT,u[GoCM0@]S x,x{(]a5\M>'".8c]a%`2K^rP HhmwQ*wC*p(^S*g[ZKSpxYf\#6o?D_BwXN:Il[h&U ͅC\s|$ ??8`myXͪ~2 ЬZ̆ɉ0)׍阗Tv`hqJ} dX לAEFi(|͋o`VC%!:sgL ]l*Gz E ck4EBpoMV(HK;rNn ݮ;Wr6g:!4>rPDvN8 .Zӧ@4H,W)cmG[^M#`x@$qD 7\t" ]&,ۥ/! pUPfgyHfd婚s<y$kdB*Н;ɱ[缑h'gLHL&RDu@8M {I'v4 C[9VRZQvF4k'º䇼 hu!45PJJGl.lЋ) ]qOF2MoX$J.x܋5%nℐ]"]mEWáÂۇD'd*2( ئ}MJP@97Ӡ:i4O8ܕF笤D]};9 odBNx^گiwK?r#m!`vܠyFN_8^30$(5"ыC\`0z9F`t<'490splx ,y=_lm#njP r㈮c,ȩ1Z }e.ǻ">U 4M2{#e% -Z{!;8:zq#_1SI6y}uA~}6vr2=B^q7 y0#^_ZwMrXE!QFD| кE Q%lèOf=7M~o˱|_?9QpmW1܉GK $6QۋH3 cj뎣AD㤺ogz^N*Ź;k[eɻĬy4e(.RQ{ +[|`D4 yM w>tػ_%&a.a 3*s~(%jַX@#4}b)AN o,2+\i0H!+[Eiy ({A^o!a&: 9%Bu{bn`Z@&37E`A߃<o^0ï%ښm< !pq0?7!J eaXq4KY[IE=akP7뛨G%ž(?K(Cxy4pkg'^2fR &¾ DP46 3P5;1B36L? ~sdc`I7:q W!d1VѧW 8# N:O^ /%KH&ƊӼ1)] 9BPiww.MVMq;LcPG1ɗI$Ǟ$ETn] B< S$/Zp=Ě 6HlԘ|R(/-F>!%hzRǣ7%ulX)H"}!>.RnT]9 >hAABm;9M )/((|&6FqYbL佃v,&\`"H5~v3CBk?xzĥigh+ytRTIXZ7<۪(<`[(!Zi;$hnӽHX$'?xz1$phN"FZoD* 9:M[1˥\ jwg5UāF*WfsZb5}!}AAd˸]/ΰBN_՝}snFBM =?$vV2.!,h[iuNxUQI5 Ie94GL]Wr4ɝu4ؘsHuo _n{r}iqVX@ꜵͅ|4(x#ǪUvQZPjN <)9`Ktt0x[*P!\ *h8@@= rExG o/r! +/lDӣ"*;VK+ ʯE<S*#ju4 }:sX^3 ;Šch|oat '|M~>Hm<3TڛOz)D343D*Bɳy Qacas iғ9:QԌCc`U;E†|JP??,ҭL*A 랆1<psx1[7(x&)}pkd[% `*vu`-GoێD.یj_yM[fOLHN}xX y] iw@z6Kw 8UhΜi"l#%E-H3@-x*#ETӔA9q*?j0.t07< v7EJJVQrIvawY5İ8+Xk*تt^~zqAMSy!@6UMM1%ɴpMNpw?Y4ԃ|%7.ƇnrI]n``]<~]P\DpAG#5dĞϜA"&x2'f; x뼸:^M@ЖK鸸U0ym$xq=Us\bPEPAq6<<sXdZT^,/*05C-]cv &.)38N!!;u*wXy|8jMAbocG*BEmXqAyVƁc9"꾻QtJy5?*ct;\ 9k,ߌaCTﯿ5:%B_ F }S?~P8~)Tt2!Nۭ NL+?%r*(ּ71-w )d |1`!;Dލg%ymX|´`6 wl:Sty6P%64uDbt)N8-D3~*TR-!r4YBWZ-xUD^/#j|7>\0aXU$w,؀|摢"'w͡׼wr=raqA&ZmFfsGƳbM $ G WvQE(Tj]~v0*O"&?uyԐy`*n<-ڎRd1MaWAZSچP1eV!w?6+yoY)˯hH(Bmkʫ5ό:ACnKG-#笨NP cöP44ד'6?63h^Ti\b7G؄wv^8vs ֪,OQ+z" F ى@d"Uu.Y.v fN()G\1Q=%b_!7Cn(6"U܃h"!+FN|Ȥ`M=FZW|蝜.+> MS'p (g;^>qvB1$/'~u Xl=QG8 NBk6+嫻 !^Wgs,Y|Ouj&fDAW:Zqy@#vf`v9a1M.GP(/$1[wֻ.:G߅ى77z|{1v|,>0|kRB:%k&=AH~TLxpour\ҌɏsZN0[H:G(򈛐>C6:*_PAi1B^ЄXu?Xe %i{(RAyGHShnוknj]+ H,:JXfr R'u5tN nK<|;.yF[nNݵfRVZ+|܆kqfTa zms73N upwWNQЂcm㛛 $٨$58Cw~V=ס[$pfn[NB9D:ǭ!&000B(:` =dt1 xzA(]7GN-!!nZ}샽Uk `i~qyhQ:Hj^ٯYljx9› l .0 ƜOaQ"j@hI'W3 4WEtU; 3xb.UT:yy/5(LٕⰃEjˢ!p4=dAZx(uH]m< @0FC?isoband/README.md0000644000176200001440000000720415114545150013154 0ustar liggesusers # isoband [![CRAN status](https://www.r-pkg.org/badges/version/isoband)](https://CRAN.R-project.org/package=isoband) [![R-CMD-check](https://github.com/r-lib/isoband/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/r-lib/isoband/actions/workflows/R-CMD-check.yaml) [![Codecov test coverage](https://codecov.io/gh/r-lib/isoband/graph/badge.svg)](https://app.codecov.io/gh/r-lib/isoband) Generate contour lines (isolines) and contour polygons (isobands) from regularly spaced grids containing elevation data. Package originally written by Claus Wilke and donated to r-lib in 2022. ## Installation Install the latest official release from CRAN via: ``` r install.packages("isoband") ``` Install the current development from github via: ``` r # install.packages("pak") pak::pak("r-lib/isoband") ``` ## Examples The two main workhorses of the package are the functions `isolines()` and `isobands()`, respectively. They return a list of isolines/isobands for each isolevel specified. Each isoline/isoband consists of vectors of x and y coordinates, as well as a vector of ids specifying which sets of coordinates should be connected. This format can be handed directly to `grid.polyline()`/`grid.path()` for drawing. However, we can also convert the output to spatial features and draw with ggplot2 (see below). ``` r library(isoband) m <- matrix(c(0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 1, 2, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0), 5, 5, byrow = TRUE) isolines(1:ncol(m), 1:nrow(m), m, 0.5) #> $`0.5` #> $`0.5`$x #> [1] 4.00 3.50 3.00 2.50 2.00 1.50 1.50 1.50 2.00 3.00 4.00 4.50 4.00 3.75 4.00 #> [16] 4.50 4.00 #> #> $`0.5`$y #> [1] 4.50 4.00 3.75 4.00 4.50 4.00 3.00 2.00 1.50 1.25 1.50 2.00 2.50 3.00 3.50 #> [16] 4.00 4.50 #> #> $`0.5`$id #> [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 #> #> #> attr(,"class") #> [1] "isolines" "iso" isobands(1:ncol(m), 1:nrow(m), m, 0.5, 1.5) #> $`0.5:1.5` #> $`0.5:1.5`$x #> [1] 2.50 2.00 1.50 1.50 1.50 2.00 3.00 4.00 4.50 4.00 3.75 4.00 4.50 4.00 3.50 #> [16] 3.00 3.00 3.25 3.50 3.00 2.50 2.50 #> #> $`0.5:1.5`$y #> [1] 4.00 4.50 4.00 3.00 2.00 1.50 1.25 1.50 2.00 2.50 3.00 3.50 4.00 4.50 4.00 #> [16] 3.75 3.25 3.00 2.00 1.75 2.00 3.00 #> #> $`0.5:1.5`$id #> [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 #> #> #> attr(,"class") #> [1] "isobands" "iso" ``` The function `plot_iso()` is a convenience function for debugging and testing. ``` r plot_iso(m, 0.5, 1.5) ``` The isolining and isobanding algorithms have no problem with larger datasets. Let’s calculate isolines and isobands for the volcano dataset, convert to sf, and plot with ggplot2. ``` r library(ggplot2) suppressWarnings(library(sf)) #> Linking to GEOS 3.13.0, GDAL 3.8.5, PROJ 9.5.1; sf_use_s2() is TRUE m <- volcano b <- isobands((1:ncol(m))/(ncol(m)+1), (nrow(m):1)/(nrow(m)+1), m, 10*(9:19), 10*(10:20)) l <- isolines((1:ncol(m))/(ncol(m)+1), (nrow(m):1)/(nrow(m)+1), m, 10*(10:19)) bands <- iso_to_sfg(b) data_bands <- st_sf( level = 1:length(bands), geometry = st_sfc(bands) ) lines <- iso_to_sfg(l) data_lines <- st_sf( level = 2:(length(lines)+1), geometry = st_sfc(lines) ) ggplot() + geom_sf(data = data_bands, aes(fill = level), color = NA, alpha = 0.7) + geom_sf(data = data_lines, color = "black") + scale_fill_viridis_c(guide = "none") + coord_sf(expand = FALSE) ``` isoband/build/0000755000176200001440000000000015114552567013003 5ustar liggesusersisoband/build/vignette.rds0000644000176200001440000000034615114552567015345 0ustar liggesusersuK 0ӇU Dq65Tڂ䭣MZpy|3B\zXzߢdy&v?0Go)u `GQu_u/ܡd G^`?<4-Gl?^mGgJŗ籫 hisoband/man/0000755000176200001440000000000015114504265012447 5ustar liggesusersisoband/man/plot_iso.Rd0000644000176200001440000000250615114477620014575 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot-iso.R \name{plot_iso} \alias{plot_iso} \title{Visualize a single isoband} \usage{ plot_iso( m, vlo, vhi, fill_lo = "gray95", fill_mid = "gray50", fill_hi = "black", fill_band = "cornsilk", col_lo = "black", col_hi = "black", newpage = TRUE ) } \arguments{ \item{m}{input matrix} \item{vlo}{lower cutoff for isobanding} \item{vhi}{higher cutoff for isobanding} \item{fill_lo}{fill color for points below the lower cutoff} \item{fill_mid}{fill color for points between the two cutoffs} \item{fill_hi}{fill color for points above the higher cutoff} \item{fill_band}{fill color for the isoband} \item{col_lo}{line color for lower cutoff} \item{col_hi}{line color for higher cutoff} \item{newpage}{boolean, indicating whether \code{grid.newpage()} should be called or not} } \description{ This function visualizes a single isoband calculated from a matrix. It is mainly useful for debugging and visualizing the isobanding algorithm. See \code{\link[=isobands]{isobands()}} for more examples. } \examples{ m <- matrix(c(0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0), 6, 6, byrow = TRUE) plot_iso(m, 0.5, 1.5) } isoband/man/iso_to_sfg.Rd0000644000176200001440000000576715114477620015114 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/iso-to-sfg.R \name{iso_to_sfg} \alias{iso_to_sfg} \title{Convert isolines or isobands to sfg object} \usage{ iso_to_sfg(x) } \arguments{ \item{x}{The object to convert.} } \description{ Convert isolines or isobands to an sf geometry collection (\code{sfg}) object. Further downstream processing needs to happen via the sf package. } \details{ The function \code{iso_to_sfg()} is a generic that takes an object created by either \code{\link[=isolines]{isolines()}} or \code{\link[=isobands]{isobands()}} and turns it into a simple features (sf) geometry collection. Importantly, the isobanding algorithm can produce polygons that do not represent valid simple features. This happens usually when the lower limit of an isoband is exactly equal to some data values (see examples for a demonstration). This can be worked around either by slightly shifting the data or band limits (e.g., round all data values and then shift them by a value smaller than the rounding error) or by fixing the geometries using the function \code{st_make_valid()}. } \examples{ if (requireNamespace("sf", quietly = TRUE)) { library(sf) library(ggplot2) # Example 1: simple 5x5 matrix m <- matrix(c(0, 2, 2, 2, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0), 5, 5, byrow = TRUE) z <- isolines(1:ncol(m), nrow(m):1, m, c(0.5, 1.5)) lines <- iso_to_sfg(z) x <- st_sf(level = names(lines), geometry = st_sfc(lines)) ggplot(x) + geom_sf(aes(color = level)) # Example 2: volcano dataset m <- volcano b <- isobands((1:ncol(m))/(ncol(m)+1), (nrow(m):1)/(nrow(m)+1), m, 10*9:19, 10*10:20) bands <- iso_to_sfg(b) x <- st_sf(level = as.numeric(sub(":.*", "", names(bands))), geometry = st_sfc(bands)) ggplot(x) + geom_sf(aes(color = level, fill = level)) # Example 3: invalid simple features m <- matrix(c(1.5, 1.5, 1.5, 1.5, 0.6, 0.5, 1.5, 1.5, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0.7, 0, 0.9, 1.3, 1.8, 1.4, 0.4), 5, 5, byrow = TRUE) raw <- isobands(1:5, 5:1, m, levels_low = 0:1, levels_high = 1:2) bands <- iso_to_sfg(raw) iso <- st_sf( id = factor(1:length(bands)), geometry = st_sfc(bands) ) # the geometries are not valid st_is_valid(iso, reason = TRUE) # this doesn't prevent us from plotting them ggplot(iso, aes(fill = id)) + geom_sf() # make all geometries valid, requires GEOS >= 3.8.0 if (sf_extSoftVersion()["GEOS"] >= "3.8.0") { iso2 <- st_make_valid(iso) st_is_valid(iso2, reason=TRUE) # the plot should be unchanged ggplot(iso2, aes(fill = id)) + geom_sf() } # alternatively, if we shift all data values by a tiny # amount (here, 1e-10) so they don't coincide with the band # limits, no invalid geometries are generated. raw <- isobands(1:5, 5:1, m + 1e-10, levels_low = 0:1, levels_high = 1:2) bands <- iso_to_sfg(raw) iso <- st_sf(id = factor(1:length(bands)), geometry = st_sfc(bands)) st_is_valid(iso, reason = TRUE) } } isoband/man/isobands_grob.Rd0000644000176200001440000000215415114477620015557 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/isobands-grob.R \name{isobands_grob} \alias{isobands_grob} \title{Render isobands} \usage{ isobands_grob(bands, gp = gpar(), units = "npc") } \arguments{ \item{bands}{Isobands, as produced by the \code{\link[=isobands]{isobands()}} function.} \item{gp}{Grid graphical parameters. Parameters are recycled among the total number of bands drawn.} \item{units}{A character string specifying the units in which to interpret the isobands coordinates. Defaults to \code{"npc"}.} } \description{ This function generates a grid grob that represents isobands. } \examples{ library(grid) viridis_pal <- colorRampPalette( c("#440154", "#414487", "#2A788E", "#22A884", "#7AD151", "#FDE725"), space = "Lab" ) x <- (1:ncol(volcano))/(ncol(volcano)+1) y <- (nrow(volcano):1)/(nrow(volcano)+1) bands <- isobands(x, y, volcano, 5*(18:38), 5*(19:39)) b <- isobands_grob( bands, gp = gpar(col = "black", fill = viridis_pal(21), alpha = 0.5) ) grid.newpage() grid.draw(b) } \seealso{ See \code{\link[=isolines_grob]{isolines_grob()}} for drawing of isolines. } isoband/man/figures/0000755000176200001440000000000015114545150014111 5ustar liggesusersisoband/man/figures/README-basic-example-plot-1.png0000644000176200001440000012261515114545147021413 0ustar liggesusersPNG  IHDR_iCCPkCGColorSpaceGenericRGB8U]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*i8 @IDATx mUy' \F1H D%XDOư:RŌX6ҲE&hDć% bhEф;sþ{jfc=g[s3w< @ @- @ @@ @4& hh@ @ @=@ @4& hh@ @ @=@ @4& hh@ @ @=@ @4& hh@ @ @=@ @4& hh@ @ @=@ @4& hh@ @ @=@ @4& hh@ @ @=@ @4& hh@ @ @=@ @4& hh@ @ @=@ @4& hh@ @ @=@ @4& hh@ @ @=@ @4& hh@ @ @=@ @4& hh@ @ @=@ @4& hh@ @ @=@ @4& hh@ @ @=@ @4& hh@ @ @=@ @4& hh@ @ @=@ @4& hh@ @ @=@ @4& hh@ @ @=@ @4& hh@ @ @=@ @4& hh@ @ @=@ @4& hh@ @ @=@ @4&PDpW}h}33~ @ -o9o zԣ;<9 .HP 0?>N; ?y @ZƯklZƯ%Pϰ[ܹH|j/;,W p@c=_ B3<3x hZA=C·?<< 7pC8M7N8Ah J\wqGxsN=԰aÆ=nppG~aݺus`x^~o .|'<nōJ\5 uh? Gnl???? /֍4> Ћ@49믿>uQs ԧS򔍯~^W-/~qxk^fA!v[xwxOJFOO}j8蠃{ް;n|N /zы׾[l|t/PϰY #7:14d.1l7I1 @?38#<PrG)o9# :kp衇SN9eu<~6? ;c_) Ŀnm?zo2K.*C.I up5 dشq?{6% @_u]v|35>'0;8;9kƎfC5J Ŀï㎉5!3n8_Xy Я@z--d9A@ïÿ*6a뭷=kx 54~-Ї>4'?y˞#@CZ~:h]>!~u" @_6yc^wu"}ʽMo% Ѓ@e/{Y8묳_ibkAeI?3~ _KMkn;~ ~|L@ Nۢ wE 9o{ִqn!wyᦛn 'pB;z пw1\SO,~7(G1u_ ^>xavwG<"|sb}B ~>hJo~%2d#p7N:)|c ?я;do^W}7BUB@;'>w;\tE}'s1Yz! Ab= ys±nĪUJ[  @ @@:YѐJ @ @( hp @ @ 4 @ hp @ @ 4 @ hp @ @ 4 @ hp @ @ 4 @ hp @ @ 4 @ hp @ @ 4 @ hp @ @ 4 @ hp @ @ 4 @ hp @ @ 4 @ hp @ @ 4 @ hp @ @ 4 @ hp @ @ 4 @ hp @ @ 4 @ hp @ @ 4 @ hp @ @ 4 @ hp @ @ 4 @ hp @ @ 4 @ hp @ @ 4 @ hp @ @ 4 @ hp @ @ 4 @ hp @ @ 4 @ hp @ @ 4 @ hp @ @ 4 @ hp @ @ 4 @ hp @ @ 4 @ hp @SA&n^'@O~=ܻ/~ƒ~AOxB8蠃{X @s1/ @ ]M}A>z`py_Nj-6\Pa @`nAdN @ ,pa֯ >n] 뗄:61   P244! @ ul  @6iiB^'@e  @@%} ӈӄN4O!@JR@0M @ oACS=T"s0EiB^'@y j  @i- }6U n aA8 @CAC.E@o# xhըXF@аs  0A@0KhI@a  0a, @``a ЏwW%@nAC7{,,T$ x e J@PUMe 9i 싪[@АwTO@q MD6FYd% hȪ]%@MB&@@AC}=7c bsV@ؐmNwAC-P H @ aC$P! K9d/ lȾ&@sAC.H !C>R)hS@Ц ' h(fD!C#!@ih]@: O@Ȑ_TL6t4C3 ШQN @ ŵԄ4. hhԀ2; @. ]j LZ2jP P֚ K@B{h @aCI }AC=R!V / l(&H`nAdN P^ S@ЧkHO@А^OTD!C'.B6Tj%0U@02S3"@)R/ h* ЩSn#@ k X# hXC   @ )uC-4toz2 @ZaC7qA& P&"HP@ؐ`SDAC.AO!CM4s3H@PQM$, lH9J#ЂTCHA@ȐB@  C (_@P~ͰB!CM7e !&)@ A %!CJP  Z@ذZ4S3X@PqMd$ lȨYJ%a4HQ@ȐbWD6< !Q@ؐcL`a#$- dH=#@y@ dC!PŸ @@†vk kM/G @uY/ hȿfPBnA }w L4L7r Q3 r˭p㡇 ?y @OaCM`w<2-l|a»{j8mW]}]38‹. nW sam3c  ШW\:+Y8#@`1+ssF r%+ס᥯<>lppgo^x\|-cN%@`i+&4Vhhՠf2nH;찑'?ް#y }&&!кub @`@V ]&!ЪU^ 0FaeE|N@†.]ZAZhM@ #u j Е+i!V@а3Z2jP0.KZt! lB545  1 89m 6>&!ШQN 0F au">'@MaC&V@а324Fi 0a hK@Жq 45 F 01 %pX-s6jLk kM'@IaC"V@а32,LD0f89M 4&!a!6' 0Fa5a hB@Є145  s9110w?-pU6o  ӄN`a I@0ƃ)|@@† A`A&>$0a^1 Z@Zdy9†6^!0a^1[@V @`2zk85  7sQQ*#0E@00iC#!P|C S^)& MjNK06 Y (9B kxCF#PnkEW֚V .]3uACR_B։]@,ڔLdZIh"4$ t/ d & `H#y#pȫ_%ЦM]c& hȭcmL@d) `Ȳm-pH5 #ЩSnKX@Аps֞=[#H]@zOwTO aC]@А{?an2'(B@PD!V)@+†VX !f)uy!F !U~ y h94ACi5B4^ Pȶf;)CS8 K99cACSB٭I wC,~C5; T#<2yMj4z4o~eWV>ik=vyNQ@ؐbWag>3|_nme]5\-a vZmݚ3؛7/|N=߸t0]Aa%+ v#Y v]:HS@f_&Uu'o[n_a뭷oË^I{GC=]G]{¿+bؕO֭jK_@ؐ~aaϽ!.pLJ.l/.yחz<Σ !C}4d3=PƛISk~$UF  xׇÃ:4ǯ:837/pl HBp8c!C,( Z<#M3߹w/I54~-u2c{#s?놝3(Cawo!G=Xo!~tIeܕBȐ ]baL7Ew~G8쯎zs 2l%o^Lø")#OTuax?j58~-G@ؐO橴ao&<~F| j\qOiIf6* )wg9_b]}fxL<#}C=Z5߿"KGkڵkWϰY ?#ȉwC|G?cu]7X2%d? \,/- x|"Q#Y*qCi~k_& Æ[?o*(Pϰ68}{nab{^b?7lʗ?_Ȑv&Vw;J-OLL~O}j8/V#Y*q1px3pu[e`Z=T~tz(%8gC/V hj6 x`8¸T/>/})<W V+>ߎ#oy~P{eV?~s̃:֥W^uU8Gwr=iG ~͌_;=#?q{kSw+嘆V=$.Sq-?f47tS8ꨣVvٽ|?Mq+G=twZ>h~b^!@`Y=aiO{Ŀqv<&둧;(\АgUǿkGF:~-K 9O_YM^PZ~zܾN8𲗽,< }s{.я~4? 'xby Я@Չ;ɨ>oa]b_3kLFi-D9 lAO88]=*׾6| ~ßɟ `?A ?[׿3Kν(ۿ]!C ]6y 9 2jR2d2w$ he @}؟u׬A@PCqQAâr#@d `  ٵL :w9 @@WgJuj2ms]T@а @ ؟!)/;!Cv-SpO] ж6~MBm t> @ Q3$ee' dȮe Y@s\ ІP5fBn t> @ A3$%e' dȮe ND@АH#AhR MjF!C]7 MI jR2d2'& hH!!@,+`e_{S$CHD 4B k4$e @?ârΫY@PsͽiACӢ#@,` k4$  @? }62 e, @PP33!)@D, @^3>g.dSߵ % h(fC ` 5L4$  @u ؟~0[!C ]P el @ϐy3+_ȐYÔK AC&R& Ps 25(S@Pf_͊T 6. 5L24d0 @ ؟ަ43!CJP 2 eլ @ ϐa2+YȐYÔK SACS6 PiJ32 ([@Pv͎H 5+R 5L24d@ @e؟>8 !C]Q e @LϐI2+SȐYÔKAC!4  @ o3ݿ25C@PG͒H\ 7( 5L 4P!@?C~=K~5ǽ3<)O ~zfmR.Wm( h(D%`rrkx_B6 +|~GH^ ɷ(SUW_+B '`ECy=5# @ 33dְDˍgpa%ZA@PC͑HV ɶ&†^qծ`4O!@2?Cf K\mT*`Jo @@gHW1\f @@V4'@?CodV34h44i( @<gG˱0Nt- hZ @w ؟ :6І1  @3؟a$Lf7D&/ б  @`(`?a4<@IDAT5 Ѕ e @?*-0\`o@@ O%`Q*UjYG@hC5  @P-p5bt2- Xa  @0Ikf5R45 @U ؟v7>j{34Nk@44i @gUqfX-sRGC]Q Pnof7C'@`I+t: @`^3+(`5\ tJ @@g(Lb (sr( @`Y3,+XV3w&=r휺  @,ϐez/z B `E H!@4%`$jzzmJ4I @?C-Jj{3$E 0B@0S @6ІjcZPv͎@h(E$'`Z|A fHU $@`+6! @M3[V3S3"PN' Ыz fȲ}&P< Е.:V3G P=jy @ ؟S/6\`o[iʶ4 еzV3; p@hY -6p5 kH@PQMG xUr욚 X-`">'@4,`A n 7T `ECM6E @_3խfȥS$@`a  @K؟a Nf7Ce7]  l) @؟!^\ )wGm+`yOC s`U|p5* L@AV4LS!@?Cz=I"RzXV@а  @c0ӛ W3؛a3 !)H[ i'fH j @i{44-j< @gp+Lf74)  9uK @@VgȪ]k5C.H@G]K u{W3؛a= !V ٶ­fEI =, Pﲳf7ò'@ E+R슚 @ϐ} [ D 4B @@9g(md m )tA  @@Qg(NjF9 F@hH1"@?Ckj{3-m|O}&@?Cm]zRV3,Mh24d(e @y؟!>Qp5wM4tZ @@g( Mj؜D@hȴq&@?C}黪j{3 '@ +Pv  @3T'j5T$@AC!4  @3߃+f7CQmP5& PlI[0Nj*`BkZ @@g<+W3؛!N&hhRX @@gk&o5O PF& Юqj{3=5 a= @?[aS61 أ/ ЊZavj{3dB  K9 0?PŸV3]@P` @gXPT[M9 s`9 0J T|j:nl.`=|F[ s{p5m 0 3 9 0I tyjzzmL4L* @`&Tp5j 0B@0S @Y0TYPv͎0  @ ؟a3j?f7C  ` 0+x a9?g @ ؟o2j{3lC4T~'@?2zek5C}4 GCF#@*?CE3j{34U XPeMhB M(; N+ hh @@g(sLk s9* U$  @дh^Y͐WTK@h @BPH#p5tE XPt{MhK mɦ? H+ h  @ ϐa,y  Ed @.Ѕrװ!;ѐV?TCd ` R fh ذ!`ECm4  @K3tεfH*!@ mACQ kH W3؛Ct"@ KACmS4 ЗV3%`Z @g3܀.?\`od%`ECVR, з@׷{sW$@ oACS= С:NR fH)J!@ iACQ RF7XЍ P= @- ؟EDf7C RI Xѐd[E(`^MV3gkd4_#@?CC 3\`oT4$E @ ؟!5[ zPW͖XP ezp52m U^]E tj:fX- hfO ` :d 5TT@) @9 ؟!Ǯ-V 9 أaS  @F؟aJO W3؛X  @9 ؟!^ [9 tFT/`znj{3s3%@AC;F%@ ?C!2 ysأa, @ ؟W3؛~% XЮ  @ϐyg(jB9 s`9K u{ u, h_@о+ @ ؟!Q s`93 أaF( @ ؟W3؛^! XН+ @ ؟!Y s93 fr Pp5 Э[oW#@2?C&ZLsfG H!@?C=f7C}6;wW%@?C Z<s*f4̀ @.3j{3g#@?b~uk sNÆ İ;';g2lavy{~_~ᢋ.>?leVa\j}{_rÞ{9xk, Pϰ wqGxk^N >y~[7GG~޾ 'z |;U?<|C fϗJsf(mo뮻./g}fq'?yy П@ ?f}sÛp衇:+\r%?io? buwni"UA>2^KL>>?>cJ}؟ΖEx>φ%K_R)vupGO>̦ j6SO /~!oX~J&P/npڙ_8]pg>/ о@u!~n1^_}|n۟!^p5Ci{3 ?G>pqDž;< O?p V^qc9Vj6=y`?_ûQ/{~XVn?V?s:{2_"1g(wͧ zk?g'=Ikۆp0C 3lACܘ*.fmF-pyN~za-zW6~98-//yӮRu9ϱ㮗'ö =fJSi᪫ fk7'< cuk.xt'PϰY D ~o|#;bU7Q Oӎ |ncE_Ɠ'7&;/ ~9w!C_rw}2d™'7|^^8yr ]vY8cva[\Ʒ{ַN:(@5 }pw'xmw[o=สaݺuç!æM(w 6Eq6xׇK_y|83aM ^pgov;8>y{fj6ax{\{sD|K'>awό 7oL鷭gr_E{>hװ;9% j|w[]bүU2;+rTua}oo {{}I %-&hHQKf=F %CJݨ!C]^=RW5  З]u  @FV&*dHsQG`(FFx8t]Մ 5wGW@Я @&M0|ظqҬ!) 7HyQ@Pc۝]G!Ǯ\ tJP@Pa[BF k @`ag2*UqV5w&@}ACƮ@ d!C%^rV5, t4@- pH?)T'dH y`UC}R%y j  @`&>( dHjaQ@0# @ ]C2!Ce\Ϫ2h# hH*!@%Kf~!\U =7 (J@PT;M@P_ϛU M 5w  P==!C}bV5t hHBr{̬jC5 (Q@PbW͉F Fd!%]U IGqd" hȤQ$@Y5/kUC=6C4o  !L)K0K Xհ4\@P ` ]*r 9u+Zjȷw*'@ AC}P$ `CMPaqR Pf*& pͩˣ ]jV}@ 9 8`!C} j9 Є Ec @@+dޕjp @`QAâr#@ݶ\Эag  0I@0Ik @`aJO 5jXΉT, hN wa/y%@ WACS7$# phB,ԜU Y: u,  @rBݮU  el @ M2onj[@АwTO fka6'G/`UC=Py*  @ c x%=뉊HS@Аf_TE 6oas!`UC}R% wuP@)[PH#MV 5p2'U yI' hޕ  @@A/Ah) hhS @`!7C!) =4%Pb di,`UCS;m 6>XPAȰ jHE $@'ACO.Kf9p2e(`UC]S3]Pv  Ѐ@n"yo A@K @er tع9 XՐSJ@W]4,j dhцK^[@:4t r @i!C5^V5%5 ХKm"@- 8Zl!) bBAEg]#eRZ@е @  5e!) A KAWW]7ER슚C@Їk @ =4%!)  HIAȐRGՒU )uC-% hKu  @@B XՐ|H@ OR'p2M `UC ]P} wm AȐPU ɷH( hh @ GQx@x[˳>jf X  w<KI6 \za ο/go| ЍE_Ǜv~߅ ݰJrkx^ y 0 99T+W8+ &U 9" E$ @RWC]Qm 6> @@V5Tz'P< @@V5-l|R4 @%`UCQ4f4̀ @Xհs M@А[K U ٵL,! hXϩ @faV) ! @ h" h@@! @"`U,J!@ wACT? @@6V5d* a < @WyO@n:^ @jȺ}'@`A H!@ ФU Mj uD= @ XP|M@o @} XЗ жma @!`UO P6 @@V555 0M@0M @Z%X ЫW~'@]'P @@FV5d, 0a&& @hOlL@] @fV5l24d@ @!`UC}4 B4  @$ `UCMPa4 @jX/ h* @ 0@@ h @XPL+M@j[o @) XՐbWD<yK @:@v Z4Fk` @ XհHC@АFTA @`36  2jR  @^) u| @V Ud  @r!na(O @ XՐ`SDDAD/ @W~] 9 @@V5tb,) hX @ma ФIMc @hI` K@I H @y75"q5* @jhԀ hhՐ @ Uc дiQ @hQq M@#F B @qv4,nL @X  0aF( @HET:F Fx @@V5$ X@PqM @ _ . h(G PU Ŷd- hȺ}'@Yo4 @*`UT" бcp#@ ФU Mj& M( @@V54! @jȫ_%P @@V5Tf$!6) @d&x Y @V^ׅnk dia;^ ( @6kdy @@†feY @X# lXC :4t @6%4{3'@D@PIM@"D  @m 56 61 @ 7$$ hHJ!@ жma hp @L@PYM@] @@ †e Y @* lJ4, @JyHG@АN/TB @aC/.JXAC51 @ fr$ }J @aC56Q Z58 @ yKR45 @Q@#K(@@P@M @@†EGAC=6S @s r0w   @6c c`sno4$]#@ maCku4VM @ aC20*a  @fӖ@Za6 @z+ lm-cr @, lȹzN`@ @@R†a24LM @u ?  @ 3iJEAC&@ @`ia>HQ@АbỦ @a;4dQ&$@ oaCoy  @譀 t  @Y@[{.2Q$@xg߮[nv&bTlaC~EaUaW-b^ жw4] @Db_qh5mqΆ6M`iA> @ l0焕+_x?n8`I İp 7 ٰ~$iR& h[ŭ0|G=A0f8?~8u† H`a= @ 1t8xL@~M}c( & @^L0FE<&@MaC&0, ht^`րaH0*1m ڒ7.aAðG @U PQ hC@І1 =<"@;`8xL@†ōG`X@0@(aTc64m,a @@m Q hJ@Дq =<"@ 0B FE<&@ aC 0, hd'z0 *p u a# @n(aTc6ԩoa @@ Q K@P~ =<"@ t-`8xL@†:TI`X@0HN(aTc6T-?a @@2} F" PJM}4 {xDZ{0ZèT% lJR?  @ K r†rnZXJ@а} @tM†A`A4Z%@ f85†a" hEO[ PB@Pm&%p"@`*aT\&0V@0 PZ" PF@PFMa @@IP$L l!4,cE@0m@ }* hUP{ 0" `i@†g Z78tI@v5i* lH2敲!d! `ȢL 8,PC† F`@J J%LH!L@&†L eI(I @@N\9 g 99COCku6T%. \]k#@J 0fӉ!R( 8AC&2Mh^@мyJ# RHO@ؐ^M(AC:0HD@H!!B Ŕ4$Q @ )T!9ҭhS@ЦS4Z"@ Qwb C'h*6Tʩ:PDK @rrnZm88T@ذ}4 ~P@â׸dC&!nmhuL RH#pV=@YaCY9$ hR50,bcM`uK #aCF2Z R0PA[9( lpY@[;:* `ha3]!™6   "KACe3iXL@mRyhV@Ь4Q @ 3iڸqrh]@z LaAC#@ YyCF$ЦM}c7- hhZx 0afB$$ pHBfaCOF@АL)L0,'dg&6Ln|  CoJms _㾯P3  !Zډ @UaCY@P3  @`zfZtW@ZasVֺ !ârcƨ DQaCkH@a @`a=F"_@ؐ `X@04( `hP8tsaCO-SAã>v#@ m=y'^xᅴ'kv *'g}6?[Zl55^[56^k6U*fװcO7pC'>ナZ^~6wя~c?.O^x_?sÆͯxp{h{±tO  py3<ÿ{pƙgί{Eկ'?pezj:guVvm_dWկ~5{ ^y [n֒^}pmu͛]RV? +wnPg Ϲ$~Eሹ2k:lk샆 /0za]w w\mC=# . r)ܱ + y𧏅~ %o f0N!ʌ~'ᨣ z׻^{mxWj|'* phc7_9ƍ/<#{ua ҭͬ3kج+W\qE2rLJo=|; .g& hȬ`c߅3]Ne]e( `Ȱh|Gnip}}=k졇}' pH&U~݂lzOIx/w ,ʌSkج? [mUKBX:|ǹ Юwνs%&5ny3.}-tIa4d+xL<-mv}f]fkRxx-vKg6UIfۗװY wqG;hMwqx s.?-Œ6᷿D?jNV1HZ!>xa^-`ȧlk-a\c |IolpovSgufaZ<ɱIM op뭷kצ6=B/a^ׇ{wɲؙ@k~ǟ g†5vva~%"۽bl?v+_|zCZvfoK]c.˙1p ɖjɉm+&z`n h?3ws緲~θ/a=5k,zq<-o>Xؐw ÿ{ km)R~Nts=7<3ⶸ/uW ~e^dC3[}y u?j= 'xbK~?Gqn n)m0v N% dȫ^vŊ~ -_u[@ؐwW54^KmB|j5L6믷}GêU_a'/Kweijnp׮zᶛ^Z xsχ|3w4W8D8񽠕!Cu*;ˋ/8zs׽~p}kl|az }k@깟Νu!~[>p7]bC¯,Ɛ6%,32tk샆x 9}7|SW;l^tD yWw|sV; 2+X>/ܳ{p '̅-٣f) Rs2~D %ay2Tװ+S6\s뺀> \}ko[@v_@֟P~ yͬ2_C+ lXJ> s͍XBL]@@0Ct@@Ё"ZBVBe&@rH†cv2tVB`a$J!0avC=' hH&fTB@PMSr( :TLKIR@ȐdYLACHC@ؐF̢{BԊL# lF˱&2Ln ̌6,cBh蠀EV ACȆhV@ЬѺ+ dnm@aC5m E[' h^MhN@4 0a6? tU@ZWSBӶ 6aCm:<3 fԼBޖ 4Y?j 8@ ]U- dZT R, lP=2ЖI"aCE鼀%E =aCjjE Ri,+ d(+]+h &r` =+X@P1:# dL)-& 򭝙# dU& l[ŭw9!rBw]@ [_A@P B޲ $ l V + hU ү+ dW* lk{^@0/ ~x†K2|5 j}BdKcb-Z@7d:†tja&q6 ~oB܊4,co =(% N64m6 m;UAC1F r!C $@ ]2tWV@PVN :WR ( dp* ЦM}c) dSW߹ rW* lSg () ΁ :WR X@P16_C+ dp& w6T sE@0}49a*.'( dH(Dw682d_B hH@a6W33 dp& w6\s[J@Ȱ} 6 qx!""N@Ȑ]LeAC0|†kd rΆ ]/' h(U =+x2dX4S&@; / &* hH0!!3!u{Bn4 :V,GЁ"ZHN@Ȑ\IL(3ACf3 6 tI;Tͼ"dȻ~f!:Ef† :XTK"@; Z/ tD@БBZF†͍A@L @ꦽ6 IDAT!C1 yl6$VLGЃ"["h\@8;. hx-~aCF dp& 'lS]]wS@ͺZU†{8Ed9PvbT@[v†MA@L @׻v!Czﷀ .$\@P9 8< 0avC=l28 w6hlB&0a%R@0% B B u@`"ADL"0az3-6 / mYZ@Ȱ4T/#†2,Kxgs`j!dI@06,o Bg&Άɭ~g! hhCݘ6S/X05Be@AC-:%P6Ml dp& @w6zK!C+l}) RuN@йμ !̄: @w68 B 44m0!By  @`vlݰ+=RIY@Аs=[aClB(uDaEoz[z OL@АXAL?†ztBQ  P:z2V1յ ɗ *'! †I7:_b L@АYL{†t܊ dl'@@†MSQȐje̫>Wړ6$S&"dV+ lKәBΔB:& hXA-'_aC[nB'@@}†lYvO`a=64N^Bډ @e ew!p =+/ lHFP0 P~F24%m $P6:24Fm L, l* ɖ 8< !ZL;!ôb'@@s†欫IP' hVf6LxB H S@z LTLyaCeG2ӎ 7/;v4god &j@!Ck&@@iaCi 6J r@}†lgY0hO@Оr# @tkcf †I  0af;2TNC 6 VՃ*I @}aC5a^4[;3ﱀ گ @jaCբ'dL ) R9@@0RMj-6W!C{F&PjQhP@ ơ ͛M Aм ) hSW64q!CsF"@@†* dhH44%m5 jص~c# @ 5aC2olmP7& 5nRP  3 mW*6T+!Cz$@@n†+&dTR4T s!Pč]r6TWA!Cuz"!ʘ 3ml*dP蚀a f7 9T 6@DPNKt]@PBvZM@А[̗†)6*dL M@0}Ņ ӛiA gAC3w&@xar+G @†!V$ACW*i6,qay#G @acGBTl#}ACkl†'a= aa=. hz&†M062Ml!@ E/!C}4J`N@i dx=M@𢟐E U@[w !zx" lAP˩S + FasH/ Ps d(諀ns}  N}[aJ4U/%P@!C姏  @`@!Øf=4N`^aa&@6:C /AC^2[ t9l2vr dXv豀ŷt]  Ub dh,2 yl .ХAPbPKaa¢;@ =.'ЅA0 @@[] m=%!z-r &"@)r Sz, hq-r9 Bj?-c dh1> yl 4.S dh0 )l2,fz, hq-9 BI8HE AȐb4U/%К@a 0@aajN L+b d'@R  %C /AC^2[ 6Z?L*H)l2TTT豀ŷteR e*B dH0/y HFͰAȐi`" P@ab@ =.UA0kմ'@ G /AC^2[ 46+  @@MM B[=4N*&!CU"D dl0Oy HVΰAȐlMj3l2\<豀ŷtU 6 @ 7:!CngK@АW̖@U Bm А@a@ =.KAPWuK T6ryK@АW̖@6 Bll а,ab@ =.[L d*'@ʄ Bܫn4U/%4a!0$0M dhH%cACo$l24U  @@W&  ]uK@АW̖@K Blj вRa@6{a[: r-# ^c//u3/ G~xXs!FL'~zժp 7<9:7 |;nzo}k:\{aSG P@C xӛ򖷄k׆;#< Sxqꪰrʰ~ ysL+o>U&@ /0via{7<a= 7|se]\L%ЇװY EK|W2\qo~B?>׿w"3wz.zymp/sv>OO~zb-Y~}8묳E]1sN;4* 7pC8#.Ұ;,[fM8f-s6!zDA'&B K 8I1u#@=k&ZjCPa"O= ~aDhLg?Yu]á.E=M7y䑰N;-z4#!_2 a뭷. z%ꫯy{ m @93|_X,dJǔ׍vp- bQ|}U@rK~ cnM&@ qJ7xc 34$ 5lAO<1LM 7z?~fC]R7םwyθkchO`98\l&\cӱ@s<_cH 5t1q׬fǥnq+73<3v"x _7矓d~c _3矓mkج7%g1,v~,mθ?~͖h tPxK_u}x '`oz:C>MwO@ O=puׅ38#oq[A2&О@vkhkꦷx͍ٷ탯t4/ЗװYD<-͟F$P@C9$vpw~:!~ nbKGD pHYs\F\FCAtIME93 IDATxw|TUƿ铞B'f)JfAw,kb];J/{!M["%LBq$a99=oy^I!O$)6"bCaLvs{1"4m[weYTz<QNuha ))fu}E|T~JڬHA$c14jj Z1Lp2gR^{SV܄nECiC#(v=J/˗g9 IX,c~_>}s߃n4JO f1h0t3|>n"8Z$I\6zt1D\#61p"`7d+n!^S!4JO.f1s>F=i73b%:M5]s\4r Z7 z14t0qnZ/oZ-}=/DBb\lbD>l*̘;ڬrB )ԋ+ΰ ΉMF1D;'0cB֮AV$E9. eJ)w뺎l!}/ѩKvlrbDP>+Vnb2Վ⠑ 1fv-1r w{e̜=H1ηXJdY[~CbGD6'YOj5GdkNBv-Q\u݈ؤňCMcN^}fZUaB`$%꤉ՄM dEYXL&9"AJj]oc#z G׾&SPXj&!@iFqsZHR{=-INJxWYl;N36!,yCEzXv]1ig/[sizD *4,=lXd WA=d]<ɤ`f"~]\kdx!&ԴDns4XM1l۰y_f.CHEaNF <>z,gtŠEEż|$VНɤ&9={C|pW>~@3D%uIdY̦rp:|a^'y`D^.- gmɏFzWSyw((.u 2b⚌xz%ф5 ߽Кwyg Y#욦ϭw涻F[1zU.ʢ%Z͵ @\FصQ4T3:qKcNJѿ)--/̏aݻ2:vj#O}q:#)@J^n>o8>l2":MOp,+ΘNhyݥd~J-%֭]ϾȤ_ԏ?zfK't]UX·_L՗>։)Uc%\O'= r+>,$%2S|)7l^ '$v[57\L6M1c21$p%'^\x6Y"jbp̒Z@68hUyxO4~9[vYMK-4-Z6-O\+cD,[/?3ml6KDIbPmw!0*w]C.Ed&c,[゙7_Nċau8Nj$2`po\u>Cb1G+⃷ ٸnHRD*/A!`eH+f_A}`o~:e6w w }=M#JЄ ŤpyxYɰB Obtm$uxB޽!cD#<osr*.t=2x~ZncHIMP5a2*7mr9poۍA$$l}!Ba tII> ͯAjQl'CPEyٺ1!PL2KcARr̜=gm.:$hŦp㞫l ajh/yxwÛ_!B2r7NjP5b-=g,v gWlMґ 嘓a/yOyBqU'ɤ[#'feeBwE{Կk]_~pWHOB xW_0):},Ynׂ^+# E`<~ ΣU'Q6Y<-tIwXb%EVY9 \}^5όTq{:i.=wE@RJW]w>}&bJ _|-/#\E^t݈XUV N;wjn{,q?Bퟂ^r08nC*On<ϻh۾u ^xm|>1C}m6g`؅F$# ?Hnn%"G"fkq_8 ƾ 7gaux4M!`0T_ĒdIͦPńl6LH&b_i)g.W?c岭XMV,2(\\:t۶`vbD)^c6V''MQ*W\5{6q:1m)[ ֝xv硖ch:BCpJ:_5 ) r⎢4$Iޯ#I$v;>}XT㫂 \jci:gs/ϙ:'zH >xJoJi޲1xVF^64I6{ψǀ "7? #:B4Mg5w8#A!x2q/Co D6`,Ǖ]}@bRBlE_NXN`$ _V܏."ki:vrYe'}Vl}Ȭ_cX":ūN ãOAMc+1@Oh)"jwo *S[}0Ү]Kz i?9 lø~~$TZ-\aCyߕ\|ت3V )1?F]NwpyP Q.[i:σDN-^s^O/ʮ]y9#SPUZv挼<*l6[lE9{u ̾ QK VwY,`$JP8nIU($q:r\s4o$Q%zb/\{o|yK;" q@ж}K>;w*ZickUI~+L' ý¿;ՋUU'Ϭ;U. 't Ƶ$O9ZB@Fb7TueRȑW5oAڴkΝ^Υik1Bt˲k|4t#twJsO綻ҫOS!]'/dHEyQ=dӎⰣج(v+Ղl [̡/Ŷ$S"U܀0F*O 9DB_>LJUrqX$,3fon2N ZnЃoE=pSg/[If'?Q\Tnh1Aqv>t.<\}Q, +kolyms -ɘⰦ`IIĒ9)kJ$,)0'awbs8Q~h/ZZ^A `i9R2lIÜ.U2K*lфT N$&%pɨA3sM*boټ)W?n6kĂ|\2>PQ]a~ڴmΥs.Wf2 ^:vlͨC1r NcgƧNdjxAIIMbvķoeM|WM-;(_5dj5fIB +|,(Q׾`FU5 ̞q F_9̬!?o3ץWF)񓒖ecpɨ;gLd4)FxN@nQu:Zl~DIaپq-¹K^HE( 6x/P+sB 8;}ΥW a5`uFD_F>GfXL^n,#G"P`gqoP/c꣍ҕXkԻȃj !sx۷Ɩvʏq;q&s [GPe@%GnޅHE Q"y=֭rSWDZ̷ i~4SAi JkH7%^fxYfZg7cĥk&D_h /CVHeI"qRu$F\ڟ{٬16۽\gSƧa!0 0w^MQC1 73Ƨ>"U3 v5&U2rVNvqX.3D/*,OÔszUԥOn+F@E{U M70mﻁ=d[(hR32EZ"Cx=zu'o3BrVab|cx<^4-)]ӉKpc7ríW`Zb@ɲ`=`h*ٷ_E.mظI׳qoQJTi.xFB,K'8Ws߃ׅqwlϥ]7"cune{nH kzV=P$􀟬ϣH~$u@bvhDT5 <*q6Y5 )ɂ}ؖ z 9׽G;^~!uD%}?!z$j$vnGKb9aixH&VM19Rğ̣R_J Z?U,bBh&zi(/=> h|`@2}5j) 2G$~4#XRF/^I^?na`IMjVV18OÎ%aZ i;dyT%Yo#%fNT#' IDAT(—W{^m.M@Ls{+ ){U=J4 bhzuO H&%e:fHr gXH޲&@!/6iA-$] hׇU WղEUDOՇ"4PfV̈<˾l$kt ׫=([u[ܲ<E%!?)\8#!SGZr!#& /<\<*9V:q!}^L]z֐\CYeQsTjK' ѵJ,pBJWn@s{OSIT$KKǖѨ~LꔸDx\%k)_AqTס™ U [,({I'Cw)VrA6([)is%z1WOD߽a֊#ŧ#=˳c cDQhtn͛`mR}PjJkʹވnnEsIkwFP%ĵlJԣn>y/(Yy醆i\7TbS,aURhs=s#2bi;ǍG_j8!/bsR˂z}/% [q0"7^0Y1wsauz)_M"P@'ҡQ%y]*7op&#(]C }BfJsWCZ z$$]cS<SFօ ?AB6RzWԃ*{z?춪/Co/y;X_8Lc}%M!q0@1a9D]yl~u"AIB/sbQ]e@!ج19PN fAXi'HFPyJtjzW%KVi{dR?4YAJ~N`W;j/ǔ]wVa ,+8&&^6ާ+DABgMSLe KrbW& lak5-kjR7J/t/ƗW͵3@qYu+`g$ gso:?mbN hy'_(/VzJkyhvpc_B GrVo9aPyΖY2aINt"[LȺ =e] ]V%f}fM[F8[6%Ms۵"{:Mгk/3Q49r04ֱ#bII'bTݑ[/aNid-# G&xv쉨\y}XRHz&h%5 sB- D<^J7j@ νbB7j}ɬv<<;PrM3g5٪]چ:ģup-]MٚMxFBRۦړܖш6_I~'dfTVgڭ;M#G2*zz< ? &3ŹgJ33TÖ;gWjA4|8 My%9)W?*R~+e7RfșQWқ$aٙ{n\KWc5Kr"ִd͛lGLlӰ$4JU/\*7odzcB@j8[dH;6**˩!CUI>S{#D[3[7"ՏЃaa#l*]f0Y,v:PZyJFz}^jtַ݂!㢴!909g5&s[R:=Drlµx%֠Vs脬 % I 7 jVLN;݆bzәj !B U^ۋV72\ع-mNa4^_I8[7PU}HpDDžU^_.?\ځ4AЇV5˿Ci K08^;ԭ%: F0HYHк^q$~|dZ^I)ekн>pyp)CZT(-?d)^ oz+)CȒToam2(މzF`zFEڞU]ǣT*tC{K"j}{VF.(jb`IM,a,)xJMG`$):f$5l q]WKOyk~̉r~?UMFf! 0\{p^:XBAJOp M'Nt|RYHsٷ$? (n`II%gד )*D}55}FEA=*ږx?ckѳF<^cBqjJrI~8ǚbRnIi}I3) N|CH؛N-d ^j)Q4Dts(p r\ cC 7BKj2nMd"ܣ =}YLP1SB9Y*+Ihn/FP\a愼PQYn:+(&*ARb[qv\4& ěsyn( *swӯsi8/@"d˒Is8o8*f{>?.(C߳iu/qoJ:h8hIW}.[Csq-@Zvx$ցۯ:d)O#%eBEP6yL/ݫ5nV'9hb5= )Yl wz 1Q (rZ]1a&vH`:d qdyM07{v#g7Q0k13Q~ /Tʇ"fRDĮZłbإͯQc \SqAd2ʊ͍rPBU./a$pc_c7Ȋ ?76ID-s&)FHT ha!WYXB~m wX83޶PPhԯsB2zCA(^עTnގZKsAQ±vI *֔${tEkӼ?ϨfG|DFɼ#L鵊Ԃ@P|Wg"CטTQx/pE蘬o5а[Λٴ:|_R>v@9=ފ ks-j#rؐCxy F̯KTm13:ԭCIH?a`ێ!gO.F-ڵ~0C9^1&Kl؝GueJkѶV0I(( ՌMQp %d/Ib$p^.Բ 4/(V 8I3EوcKu9Yk3Ξѹ=9$R7( 8gvQӱOO!* lBNkܴN ݔR腨NķkEˆ :A T~ jlP\DNeLuD֝ר̝ax# ~GБcva^FsmOq znmqgSWddBa=MhҨ} K rrV:pF1anw.R=( b[AJ}Fl8 {FF(tB+P\CT=}0*l. LY]nFA Ⱦɳ@6_cIKtqމ3މW7E6)C[:ɴßU6˦>ijkoԞ~K6HD]T#BWQ2:`rJB1|F[x4MF&Sv11w?w'cLdZB` p*ܞ rZ([Ͼggn>\6Xޅ7},!Gr:"q/4;n)B;4SC ɲ̈H>k(%TB)DÝLͬ}:>EӤdv|%h~!f*F60Yds(pB 7j߭_wy)]4 zd JG :IY:`J÷}MC1IPy'k|ַɅ7dLBiK7G۵`+H4)1S31w)lfDEMwPkCPUILDBi}y?h^+3SRd|yl}S*77UϷ;raT+H3Vpm5W%[<-QkL!>P} [ZlGNL{#,%_n>zy%he!k%%kF#iXj@pb* '2b$2ZzHP6H/&tlq#Ekٺe',:#clPLȹl$jy%{'B$wlMٲ5V\30@$R +N+ɍSIЋǒx7&=-P"ܥ]B媍UxW :BDxL:ghp_R>WW>-/_}6 V~ݶE$Mԓ!bEOhfN_Ț՛Yz+neR%vأ9;2gRvtlMnۂ`W,u"&MuؗWT6voGݸx@ZnݝϏ¼ٹ=׏$IAY݅W_H!jVYl}􍳪D$/cޜ塉 ? Snq6H ˪T{OD TMۘ|l{h~]C'(*,eb r߮F`_ʋXf+a&d$QXP,K|$22ӸxeG:'Oכ`POxة53~ϋQUgR~KF^>Gq y7uB4MG 8e]?#;ҢuSu ;D4`@ށ*~8ld\^9Z ֐dwyeP ǖѨFޱ{Kվ2vǰ@gO@%Pera]2fNOM'Ѽ %KV7Ò\ë~|s:J/GK]8Bt]^dc4Ψria=.?|3޻D5sڙ3OgJ.5`P=b9"fϾo};Y}3U?e/Zn~wn x0ÐX+f/jNVamho9J7= Xfܚl|գԗ-_̇*D^UJ۰`qI/SwO~įa7{%*k޻k^y-~[f#o|:bfu2cat8V &'xl L_XH!AAUsixc_2G4Y,ědŕC 7ͯofGgxmZVc!_GMYK` vhqx<v￞8&ӏpG{iXjaIt{U]Se,?rF~?j@Qz܉.n_GI>*<_WOa)>7Vi Kut5jw1~G P5~3/g`u X$DY"MHU$e ,1aAΖڡ?0,X8vVya/G~( 0 iyD`<͌|0NWq 5~ 2e,ZguYr]INI$ic6ol!w>RXvnZR5J÷?7붡#c q׈ IDATmׂ=8֯9ܞ:M1ub| Ol}5ӃI R -lf-E $9(U *r)d'deP4GY\$ϴ[&;(aiL2*uqX߂ B7f%q-3c׃bsg-~Ȳ%k(V3<[ܛ[ q4j;2^#Oۯ~qؽlauʏ@'Ul҈{ᅱoqk4~\ťG®yB{o~u4Fqq1wlÜ*ɖMT-MَwwB7{'S4H1+wXhgtxocc̝c{;mX#$x4  a$>hgVDgc^3Wru$XPB7;E#5F\:A$?% ff{y{ ٴs;Ug㪮ۧLF]{c$J%@H\r@HЋinq"]r8 43u]؅?M6'NO\3(gs|nCAgMvanŠ5j&$0*c =[~:8 @MiZ\ɒno2($3;-ό?˯:OO ul7W]v?3'2hH?aƉ8QN8V_0l@Up)l$m?'iZ̜=C?Ϝ{IbϼpMbq k+@vNW_wn o{!] vxF倰!A\H%%35FXcT-\B!3ș1nU뷰-jH,#%s3ΛP=7`\|m(es /*woG;3&ezɽ߮M8d[E[Jغ*ƙ[nƆH@q'yYde)k^[FuK h DZ\k\sGZPշdNEx6,[K"/WNn+MVC~N雟U0 #1e-w%YcGsp#qA"WnhsbҔ;뺻57!a{9iz8N.tmLu]5eU7&HI2i L2>Yڃ !8e4eUmj3dPb"NO_c_ctǔt?3fYKIݷh\rKR-O**j iv-nFoj¨#HWj-cۥqIS.Kä 2> k{S35bz6x̠1Bmu='nؚ0զ%4ׯ+JK钝ɠ!q~ۀ.:>$,*LRfY gA@cRóBb+&13NzZ ,M иf#v4NƭDٲ k~RB;u W|YF$VP(@~yI{Iy6Qf((k]^ymTVP_ׄeY8ҬnsrLUTMkớ|kn?l\_fŢgf jd֡)Z?GoK8rq$/!CwsEF2-Wwr>h ii9ᵬFMMQ};s-񵔘n5 [dsQHt(޸'9ƞ{‡-"Z=)%dn>(zraJNNfrk]M-bb8/>\1M3Yp"K_m9Qʦ2ɬeKQPU/;)]ΰ_B$~=)hEy57^g~c!ini(隂'Qruz+)=B؇_JN>mF$3")iެPvZk!h)<48.qMhAtkHD=:d<"od* EK{Ϯy! MV&ےA]CWIzz3sCɒ7W0zP 4EuU|ͻSc4jH"ci'/K&–eFJWy]65E۴ v;(ុ棩jBhp8a#1xH"E{h$f'.RLJg;KuB'eCL[=ȩ;P(TKcܕlYrLM!g'I6 N%ǗYUu^Y xjxDO0538o9SI}>rs36b i);Iއ(Vjeab4L֮{\ɸbd_)c G\gqu{g̿͞=IjZeMy $@Mi'ŧe'Î8pd$3ڴb2t@itm45F[Ce8NL?"a2Xr^}6?wߟ\W;.<uX[Ri9J`tGm%9ϮՕTڶ,j%Ǣ]GKණBV8\ r_?`g˱-$E<hM˶z|=MUl`1mg4-jj Z )%o17]gJw?.Z5"jGJuƧ6qS[k)1mئqx/۳)o*BFՐ1*|r/oV\AyY6/rj.{U*E(PZNB!@]~߬1B$#x=)x]Xly#>If2?ÒuV,_W3Y-v7x'wV.A*#>3'ɾ!+?m6…ޜ)/޿=EIqyfww=;3"`U 80`p@Gc&k&U*%xYHr,2"${u]cg˘w7,6P0n&>}:F6T9Wr摑F"Yb.X5^#L`rFH$No$T?%xhFFf:u u[1%'D2˽znSYQb!to^gNMu<f}J,,{Yplv[*+YPm @.Ӹ c @Hh o6SUU[w޷ [nz1q3&&[UY={j^躶o;{&{ ~y1o1 M i!Ģq -#gZwۿkp ƶ]b8iN)K~|LRTE%='ns5]IqQ Q;2њIuYM8#jFtubĄ HK ]RbY^Ĥ='97dl\7tKUbzt.pXuOk%(JL˲__ܫ~@ASw tsFt| ܻDGz ҹ&3{RJBiA6Q$r33ӹᦋ8[298j !7~8}`aI~y1(Llw՟7=,LnM$mGӯ>XԶb8_͹矄H)pZ^e2+#&FsLR/m),MȜWbf?)+ |L:NU&Y˸絹A !=g*7GЗH$P]2m}Mpa4D1{ 84-+qF~,>{S{n0'nwJ厍" "zӅ7~wZMUQTu7ݻ%Ʊ b{:Df4iJ6@|̚]zGM4'3ȰM&& g&eg7yĔR>Ft&'MUjx1]!vKOKdeep oRQQϧiINv&ǟt(gD=b_]8 ч_aul˲+Nb!&PԄv)*ƌޥݴlF j={% bLN3䫕,f nhK)tHD3덊B gA?SF3cD5pƮn6tFen@o+ ?6UCiq$=+lM%KSSi kU 67GJ4OvR&˦Icqd 9oCϗa˕df3n&dΡә{t 姤qG0qH>^X՛XjەZJI`m$ 4GDzSC}ZUh?*dQD^[}M@PU*`MimʠYsu!Mws,;p8N99Ngj1VJ}s/?96d؈A 1N9j*˫LaiieycYy|c1& M^GxDFfjfϙ¸ RB~zㅘk]efu^l .Ha -]7=%W(JF׺I*=%:"vi**iK +Qhi OaHhpz+~iEwNٓnдa b/h'cGbP ET}ů?A?L9Yht j0}:C*!4ES=,UC#P4iN5 uR:67|oхq&6k^F݋J334]-e KϤ/AJ;]w״([4$~ o] .A:~d\B 4j0_vUh*k Yzwи~sBr}FU-+w7erZ^-OQUδ4qbq!"Z׾_ c7EXY;cXH%q/N:.[J P_[wEAK QRW2ⲳ{!z\nNNJ5Zj !z͠PxSr)=&]8w\^Rȱ/TjɖVWC]c{Mwszuw1V~?u߮ey5ylҔe]zA /4ivwjh pj0iz%MQFX|GVsiOT)A6bGK)>Ci]o.vN^oWwt\om\5,\d׎qQH 1oĪkJzBUj(Hl[p/M[ 뜲\w]W;n* v[s鸸&sD&&Ɵ/' _vzx=H'kxV}fmfMFufe *林1TϣؾtԼ|c/ٸL^/KuhapigHWg)*i=Jʼn 'ș5 #I:poї)shʈٴRUװÂ5wmoHitwNH'8k] Kp@[֭O QCA}v31QUQUCxIM\BK!P~>2u"~pB uTt ƵXw#4ݘz88,r$sh|vzVzV=xibʉUbTbF3yη.Qt =3쵥u>YF IDATLٙK Hc5*/qfꖯ~Z&/дN-W|:2 _}9БJϊD6neݏR|M\״F1#ɜ<=xyyh؄Dqq~ Rh׋}^y(BKU\dNEnw떯/_)IPUhm/Kl[9/=)c#wa Zʺ?F)\.i1nC/d]QD,Y7W>ةH#1}9YLf\1Zzh?[1v8SSn =+%5;Õ%+Xv|moWh56gܛ=IKJOw7{~o!P(=X|6e7N; 8;`n7E l~*B03v~}]]W[P8JQB]tCn($ >t&z-ysد-JŻຠ=}iGUIG3w<@kzBUYaTT33i=7E v$FWYϓhin:Bx`&K/{8X&nCe8۾ŭ؀[o9C2QE-:p @B3H:ã2_Rx|J^4;<,Fe c~v)̞ tUUQȢEO?uQ|:s3u_X:h-NFUb~|Hh TP@ {Xo(-_-k#|iCgO8m~`V3+ _ƬeZZ>k`o~L 'kѝh]&cq(z;IDH#fiẍ?0"Ofb-1S@"4璧"T@U0#%/.@e?gws>d}(3D6nm;՟}_~ڥ^gѝX-_aK؄6_z&wGR7V q+7b/-][iZֳBE,@:`"ڐ(cP{Nz{ ^B6YQumb.ykKh?\!]>fb?n3:HekX~_2g@U:N`/m7eHk; G#N1.0p7)vgŞ^H{#egb_`|jpǢ9unWv}*E1?)߸ҼHo^߬s=ASu-cܯd?jOqVz7o~= J'r9qM?m{J3{IΚ͋q ?Z.NJlvKIv);*TݺbeSNB|2͟bz7-BӻdExG޸O9KuOa+X P4Wg1uzkJN`ϲ~@Jk. sҘ1Saz|=B|!X=/7Lg3_'_ @nD(@t5oƭ؀oe(yp/ޯ@\2Tm/P;VRշۣNm-N٢wtԉ4EOvlOo.jȝ=Q\@x$]5XK_,xjz:\Q4ʍ߽x9ïB4ǂ M= =u%%gPݎfu!4Ͻ=B*>ܞclo>Ͻ[ҕysg0ڋi'eQTb-YSЧ@A# ed)'ƨ=zR k;l{]£;R^Hw}??o{5ǭry sA@l[A1޻gbPu+P=]-c=+&_,Ƃ{ĞL (hx3lHmԐGˈ(~;{*؄G6T}D k;eH;D-_K?{& eR)8pΊY]Yװ?bI74o1G bƬI/fݝQƂ w-~6}%cG-@TrV 4-@ ZɤK5&?vS7!-k-" 毈lmt)'9%- y 8Ҍ"#5>\$Nea:NG|:}?ϖҸ~sihξ7b54yvw"^}Cg|2.TN?0USm+gEh`Kng3 șv [+ũޜ_/,wv =3Bz!Qvՠ#uA nԇtD^!xY3!DJ1C鹠H#[S[d E*J D0GZ1ϝeBN4}g۰~3)*˛`(rsi=U_,E j NCڌ3d[z+!=;E"]R${-BώeıҰꂸqD[5)qKWlvG.BjK.uzmN葷L*?]BMBXŶ)7>=_C|)<%2lڸ_W6\[VJ4y q(>k,뛗 r-+/ 5dzwSY+@H|(!2z$Z@; "=5u$)'O9i4ӴLB8/oʛ/|w.nkhƻkI,ɴp߽^bܙ c|B=7o#Bs< :5 s0+ұjC엽_\\irPҲ柴p>"jްA HL곯yAS1tMemE-V|]Ǖy000^RU6ʆɪܬ #C> ץekdN)] I_ &L즧|MbVWuhv .>C9PD^Ĺ9ֲ+F(Fw )e ;cՄ>df?*~5@MS9"(5^jbmࠌ ebM ,2O_ PJjQt>}/ĬH˱ BA"JU苒݂k"T]1[ |hAM:AKqŰ8#r'eϑ3w׵ MKka:5vVufyx?wq,c 6|(9(<..XIn#k7"Z+^jؼVaicrF RGbMiοT~p L< _s.l|x7kxWy1&`j/3WWyL =V[DIj.ifH f7]v,6`oMz>1Ŧ읅{s )%oWGXPԴ0]⑜m;X'UמÔƒ)n@o&}8}>;ݍhN sڄ!=H}w8#]<+D_nɆKW`U=7^.-vGM>m)ý?%>UװL]/XָM#QR,ՐR3n8 =|} UW+?>ƍyo!>pQ ,rK_"ʭ1B 2%`T:'.OJfEKЉ1Ծ<}qpnMU|}lچP`a3Uxjc&iiAnŜ{givq)+_xh4b!@K p}0C.;畫qֶϚoT fY:mߵR"(jmܑ(,mֲ׼@m$ԡvws[ەPGpq0 s/kчGx+7:bBo 3gOۮb^%;-hW{XvvTz˅,MY1N@*rcuhv5t 8MZ$Lȣ։ɏri z9#~TMkZ4x.ΒҎ)%1l@~|ݹsI ygϲh@QLˁibڠ(>s[V\JKD(W;}"P)nxYy#qTP||PV;Qŗqs])ɧ7]HVvUv *k+ (+Ʋmx,pxz##L. RH{8[.,8h˒HLH뻫wyJƮYy/{o7zaK!Z-eS/dѝYx%ۓ|7׀"PS2a pdEmS%ZzH -.`Wu_ؗx{x2^ Įoiz=2 DD-|BJضCvvOul>o<.O<_~Ft]K)~w$X`r)Qb0lL 80K30kBTmΔriGpgt~Qew_?`k0,/ ;0oÙ3k9bVfr^x!1+XiH[AIA97Խ.'RD,n0q(:`.4؅j'JpۼZUSQy 1[P&7qڬXp'X5!tҽ7v(I)Q$>ϻ낼*.a99|3wZ7]E sS^݀߯Λ>'M猙Sqzu.Y׺K6ѧF蜻W%ϰDq~- *8#HEb849ny'tO&uKko+c~_jT8`I8gN59p-3_;YvQӻR"4׼g> [c||R@#aahN颫S,q]=wǝ8>{QնOEJE<45|㬙|on%Mg7_8M~0Ne`V!<}o69%jϨ [C<2GE:EMuOMF3 .9N>Rq6ϻ@J+v3\fra5: l=>̮R[(;{\2zPp@||9]3x^.'#[Z?O.KB˕hJ*) 23ÜsuL:f;~[g|=2A8)kq8_NuqǺv4Kuf66gI?t8[ʅ]XqaydBSQ>|YdNE#g'˵W{M*>y74ih"+& 'pٖ1胸1cD=]GEXt w/`0%wTkq\~\jF P{3[A=g7]i.]EsoҰzVc;CZvs< !Pc3Ț6㝗x }8oIDATHTK6WAW MDTѣ[9ncNZGz2[o--&-Ew^6#Z\tGͩܞ`T*;莅6b6EydS1yoa74ڶny?R"DT0; ch*TL,FlI'e 2~KŶrj"~_>ɑtZ)Giķe4:]/̝]7j<|o ǔ?Hڐ+&iX%x,_QcHv8ĶmN9~s 6Mz|zwVpow Ei%n㷑9]ص!Ҍ:!˪X[x}Y΅]*w`%c%ċfW8vO_zkt?ME][ɚ<&kTֲGXΧ/ca]ŒRJ!~q\rQ{1T6녺\G1q~mڈbU( .%6iW>6lV.Qa%.Px--āiCsh-ON/ ^weN;[n )+埼R ˁCrhyRVU G<㏭)|º;nuPgHp` R}ɺ{y*BTҲ r 0u}[d; ?E46@rD+8 6ʞ:.,߁oۏ; ^Q'!ȟ;)dY4cه_|E#_G,/͑"+%>ΐ!Ol7~w<'W(*.'3S&f3g2~Da  BXȽslA~xjԈ?_E D ^eZķ7ywL"Lq\t]oA.}HdwQ~w4>*OUi # BU^6T`EQ^GqqEcEYE(ۏ $V˝ ΨEAR]I}=9SwW^|5:[h&!k&v04Vu^.p+;}O\v7-:$cxrnB8kU+3E8y'55jFӽg{1mUm/tx#v}GVvbʯHqIyţq]J)+xɉBX;:-ט Ԝ{O?% kՈ+^/[-TmGdaW{\_ECB4MZ*t&mLgmx=,]Ǯp؍׿+2)L}-=Qe] 9oB벢pd%Z%P"Ix5"/ },U UQڬpcs ? ZTJ1+ |d Vg!|F ^Ftɧ{ 1˟a' THD0 Ѕאgw%Ή+9:w)6OJ:åAV#74hi:мe֝Qب2 E8F |I*DZ +Dl`p"tN͊84YI &xjXqBak אk4 /h`IHz~.I).qԧqX>ZnM~3CGBoý^~"m{YVnt..Ӵ vE\@BKvJ!V=!]Ry7;׿F,b$]r,qN a)bY8 IpvWnU)bǖݤ,]wWu0I8eh`H"Fu;GTM߯ uf50#?&]bHjϦ`W:#]zYaqqԬt  CS$v5]ǎ"?K:Vɨ۪s zډjU!n}mvdjeǸ7^clBu>M1A '=`5?:\8<甐.9|Wn k% ! DJW;j)yx=̹{b۱Ze,* hX$]OJ$\ߐ&]Iloj_1'bÊMrrp:t.QFx?uل,F|lw#WCg~j2_YPUcBz}ԥް~tj3ꑿ+b9b ,socL6v8_ x}d=7`Z4قj`$jG) nぁg^;wZIs"ѽvca#q:Mc/Q<ņ j1s[/\q8Cg>œ'$}~|A (Jߤ8wlqU8T)&sA>k>kpa18"5"lP/JcrB&${t&UQX5o=-T>v8'N\-ݶw'DSTWcGT4$IپObx~|"}w%&&iqe<|2q[AY Й90"0R?i1^߹Zf kI@S0͉D-+N`iЎ*,k!{^j/) )bV N n!5{z..Z _3̄4#i`s*_3O/`Sa; !$R瑮nI7HUks98ErrC:Q}>|717]UY8zB%l??(syq#1j:+'Q1X[Pޤ!@BWƃKHG 1t.}_2N)*aó|{(7TK'DL$໾c3΁Ym$Ino`w}q:Wo ߼C6-F-vEJ`kDV1ʁYoyǏi"[5̩T˓GPTif?;brH姕N3Hd%7ATͼW>ͻ9z<M`V!32Aedk*8vNZߗnNETZ53w=o}ȍu!bcxxZϲreEQ Z0n`n&מ.[Cr&vlO缧@+B ^]~Dunޏ,.i(;諛ԓG'$Hq}Vs\2тANv>$* MЯaҵ^;CvYHH5E]Hߝ*ڠr߹Ґ낸᷒0}||}z>$jo4cА^1v A`^yt@&|U?p i*L.uKGl@B` LCh>')rc\ΰ`@!fБ}ֳM+lŗZS.Ct@XL{n4vO?I] tFhV򴝻Ip_qi\.WX,6'#GGT3GMMS̶]$/Y ;h:NNȒuN7Tu+:8]uxh䰓?I pۣXdkX鼚ԥ & kP|&[yٹn·>fϾLlNp^,iS^DZe46F o-㓔TSz]v>nZ;} oNḟinP\:vO7[)9wa8NHĻlri;"6|1V% @ ,L4wNfp:C4A72D>?G>$yf4! nUSͪ Ξ)J}>'G'ЪMԯm{yoٛ~j{"B BkBPZ#iC{rvfh!,ἮIY=ls}v0v2A7 Zl=<5ܳ{GrהL>Ӽ&覮J<=S>?^WAxi4g\tSW23NSז=DvVmn'6OLwN4A7ukͧ[d+$΃Ԧ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*i8 @IDATxgtdy- 9hhsHNbD{³de%oeIl=R r 'w F7r9BB hdP瞳-T}ooT EA@A@A@+ j: A@A@A@A@B4ȍ    VC@A)     r   jPJE    D    `5hR        X !T$   B4=    VCj5٠'O6\Ry<==EwrEApssOsssjKs ֶf|'pɿNMWj=ӧvՁ>-j*p1[aWY ]fw' nn8p,Cg50;;_ uXWWWI{살YQ $ŹŭG_QM7X^әK2࣏w!&<  {邴`"&妦dA`cx6L4H0A@AƯ3 o`GcZSu:obϞξf?ld 6#` یT/ vidxdn(.zyyg$Ntf7~ ~_5:kpU<%Ef%d ۅ ۅ+ 6A`|b~uh>=٤=rѝA 66UW\K44>@}#tT؈i\EA@! D  04cjڠs4;mQȲt>x۸~}O~#(9M"wYd VF@ZPNA@v)\{4 >>k#W9 ::/ (z9B"l>i A:KA@GL2$'z!|^(^{oPT it k)A@D4lA9_A@l<ޫUW͜ݙmpqqEs…`dWEPFKA@p$Q  8cQRyY IxͿnu7""ow:hï>'4uT9LA`#HDFВcA@;F`nn3s3vcYF駘`/la)EX O;-ey099ϮSa?:p킀 `_`_%A@Dӧb`#=i#a8}{B;2M4311x?ɆrT5WEZB.oA@B4l >9YA@-I= ݊L$b);r8#߂#wSMx6ËWq0WB,V] {@qئ@mD@mWA@'OjP'8JNV*^ AHh,BBb ~ ?`{_dgCZ> c6m vtԠz{1B ]D8pOM)A`Ѱ^8A@A ![H*u_=b%B@O.=~S0L( D'HxiͶL/E@펍LAI#r u-ւ% &IN 5F)FM-qeA^`B8M YMQIAQ>RA@B4hi4- NZ)rkHO+B.'+ ($O|]]up0555y 9.KE:G=qGCz&A@%  VD`+TB',$^^"΋۸Rӑ@[[Jh'SPe!-ye꼨IA`Kڂ N4;UBkwXT|)Z!8z!<wwhMATǶ]*_9ѱSW 98ҋۏRSTXJH# o/ߕ+= leTA@D`nn \膞(TuNU IIyZP.XitvR^%Z+0Bvo3"^]Rx_a)ۏ@(ezߪ륟 >'%!+]t9WJwOG|J6RhNSĎ"\ceЏb|da\277 ii WCEDMcPPCd} 0#V$T]]47s4[i ̩76ICgC@gq uPm4=1ZKiΎ#q>d]EP8(uWXT0aQN@ 1ܞx~ TSDl@!)162V(ETS{[("8!0`)[GDɪfl$!I+q ].{wEQiCbfC@r rp*Dc{":͇DF& ,IQR̰IɃ1ʁiPP봬nM (4aQNTm#6@%6E|f?{iGw;M4VeƽL]C##`xϦf#X ABl˓#;p'` &8>s-SČA@9\(mql]{W|?o@:cS5srrR͕ 6GݝU8VXر!Y],"GL.6YI9EH"00iz#b|\;]6NhyaqmN!qSѷ:~o쨱~3CP2@J|` )G =( %%)ϝHC琓Vlp8C(MM-vA@cx_~7*!6,!l\~X0=3(I[G,EAYxFSEoى\irҨ52_x΄ϯ+Ram]kDR& z0b9M,!փ#, ` GuP^wS# "*%B8ܺHz6H޳1GRaP({,Z'bլ-ш)àӱC䨇pygr 3D*߸kTWT{ɆMZMC'')B4Ia-d 分1G\GUS T<,;k:Ś^?2`X`2JYW *. ij{#:}tcCKS$CDoI(SD%RtÛ k!$ !mD?<B4ȭ j"10K "H7LJ")aή`Afヅ냧ZvDR X+0p1>:0r qGDG<\Og:d8޽<);EX0 `,33F < êea+"f[MK<66@( F z...@Hx,B"bi&8A4"B4lsjAsCԔ] N TDrrEܸ6\õbtg3t!LHY ,H?A@;BԷSBsl]pP҈\HO/B@@.Y0VzJp3357P T'¢a9|dc!H@+0ێnr'YG{Z$K?AWW=\'zuS:Ccc)3,C`rl$xoqbHDuǩ**ph)H9U9G5쥴L6#> H`YP@ǨZR HD-A@Xs#^E.40KJ)ÛS#ȊCVE.'sc!).5 0/3: ,F *iiAUUQ-&CZ>Y f8,9ƅM~'~[L[!-IXD4,DV5oQ m1e6(r!>>^l u0B&5'~ @hE}HhZ =1LתM.Dŧ!-g?R2BK h|BbM5TCOGb^^TqR+kcs`uf)֭QQyUȆh:RLD ZIi !"E9-(ކxz+FIy,D4IL( + uS!$ E>0M1d5W % k__ˢkF#-Eh'(F02ԋ^|ưoS41vY@dπp5g,ݭ({5Fx1Ld7Ϟ$[4@Kk9._ 1՞l;mNDN N=yGF@G](YP*;Ju|CNQ ޹}- 33S#[Ttɩl9<@}TMC}]2 6F> DppQK-sA$X W͏T|Cp"-I3eaYXd ``ch=0L1"Zu/88ZEmrXD4LMPV=]r}PC%֏+'|5pgoާ]sp?5aX8~ѶEg1E*0з*zFo}BPzş~>G_ɦt9t@{`̮N~a~0EAPhW9Sqkc\e: TCPUW W:v N`Mbe&X!T(h!1 ~#HblG@ OE/Rؾ&˯kZp7aL~dbZ3|扇v3^H(b$fZ=?׉~+t^Fg&udvJW 5 T'B!~ygski40512@< P4Tɶ,\c BEF¡K%Q($䴊"$%CDN Rg+Lgq*!6$q;.B48JϜ!ag&ۤ":=1=M96lҶ$a&JJ>56xpށ{:ۅBOMN52>: jFoG{Z9sz3oƉ "W֨09 &`& M"RʓqN`J$> Dy}3i "谑8LMuJZ`5;ӄE]-E:0`*%‘w& lv:D40f0L~'(-BEy{P ݚMV1#[FB4ȍ 8(B48j[lA9džqL4/_( "H ] DJcۧ&H5S4KKXT"xHFDL]-i}#H85pt8r-4C4ܸ>jjoPK־N]k,G+ D fAG6ퟢE(G& r97`Qv 3֭ߠ꺂Ï$sTH/v}7"Qj˅b2UB|v>XPmpa)zL.uT(⡳Si:r_@jV`.~#w $Jo{?#DZ/n/D#+^ΝߓuVڟ{U5q!wlgN yTkw= fM֒[ w'e;f| FFzՍc/)||F]לxt Bxb*R  q>|֨AvJ4Xb\,(ځ#,YnyՏPF3.xDaGΞ JxpSm Oo'taEhd ``㷑OP$;ر  ^$$ňv ] ܿ+@vI})=d/8 ΐͶBزEWm%Z?@W@}H4ԞJ% E]jSDD$R,0ih`(X#8t" #;F@;u4E+P߰Z noXh`+ӨSBnGl7|]5KnstkqhV=4֪N {e[PxD[Y5h0.y-]y8m:o_} vqZԕoRX畗b=h`$&'ʕɨG)gd%59 B48PJGѰ{]{ 8G.pͤ/&')r!66ST÷8[%mIttssâq ^Kw4cQڷpY B4, "kn\£Wp "G7p:[jůro "5bj# &kjn0]PyŹFQ=RB4 ``3NBMaA#1!iE4uJ ̑ L0/ 1=ORV̨,,]ͯ~n#f>;v{ƶv6oe#>FVgsh%$rlJdKd;L)# D" D,%t֠lήF!̴n5<)_6Bb;EB4=HոlS{xꈌ3H'=GT;>ga9bEh0uVY8_x#}jSb.,~>le)B48K!o{Pi Sz܈ɏ٥7@Q` rXhSB]=44;;c .B.=0؛;P[`w@ &R؁%!ևS"%؈:7 'UbcCVgN))b3١pd1a2PUu]AɢבLRR!sܥN !b9rF i 6;&&IZu!ژh1SLscLYIHڕԬbSHrOءacc<?C/17OZr񗿫tɉq|@O:~qpcN4#.伾TvjQ:}Jq.hp:B4l}+\ZTaxxr{HK+$qIkXpdP;10ء<1nW^Ȣ7#>KY~*)=V}}a2rG͍~x~RV$2=e3Uz{rOin <tV$/|!DMdgL+!֋&&@6u׼hg 2C:&#=@$  Fba"T>}l\ɞ+0$R)Gŧ#|=V6.F.\j? E~oqodm-hX PI:03(a-3 }^¾—V]3 _b/9]υhp9/B4ll&qS4s;?/E+RZ ,(E004Cij'E K[y!j GDL"-D=< |Y7"0ӆ_ӝ>8ES%(%Ec" D06[ՏUeԫ𘤭Wnfŏ~U3G5pt!D#уI(rlD%́7" D㎭a7F\)3$OOWJ2 /E{ӄ޾E,ќŨ+d A pibt5lo1qa];YyNM0=hگ8Nawҳܼ0(rs}YSw >9jP8ǿ-ߓ$g%Vwc<|=%}d-qqVzѰ 05=>Vi|4G/:$h)f"Ki-\ Ȅ$G'QCJȅ k!=^#wP;c]eDr6Xb]tVP.[44Ol4Dxy?p~ Ps/㜷{xُP ֽFzp?`G826'^>¬{-ig/ZYrUIy8q;-eeh0Y~!)5>/OwL9\GM ` `,ۄw>8LpI!VرoweN"J##}D,")%boP0㈘d뿹7B4,ۺZkq0k|ב~E _Cp~E*tPBw}fG|+ z>73)Uk>yx KP#9hXߘn(&ʾ?既b=-ڣ=k?U3+Dq@\d3NW!bΈ ˏ/+UÑ@FƁOۂG# ( #X`F& ^E9BA ɈMVl1j"D(oXeqȸ:xyg_gg :~i 0׽ܶ$d#&7aI N[i1CDϙ|4o00:(M#(&iSH(H+Phn:7z El4ƻ?;TpI&Qڣ/t;Y[uqw1CƒPe \8!RW׮qrIG"JekB4IYtADF" @[a϶C"GGD' eOC"(B8Z桑q$,ayUhX9}t+<XyKd.}[[m:ۭ8., &;:_m=Yu2^Ɖ`b#d2btPĄq1Uei:_?#@[&!I ` _U9x廈MmmƱ~\_!88z :ީB4<;cc*N $ȷL,!8pUIԒ]e]#$UUlUPpV,w;zm!aں$%K+ά*)BohᾍҶ Frd^h>H$-wa0 F+cW۲,K> Fh,.nHK%b![E.$aَ^^>8-$kV9iHJWsеnm?ccw5d˺-e>Ss &OɿW wòwcycOAf,[!a_N4R]k[crM%0 MKDDi̷lo@6587B oR3 䁙Le`ЯJn "ԹsRt{OE1nQ#@Btf>MZ-3 cz>2>` T#=HYVoM΢b\0FCCc &'f8!1mR!4"~!#ͼ_ F4pDIsM)I@E'#V#Swv@յ[0.؝hC^#8abxpNz8;;Ko"71%pGzW߈) Sd]j$ 7j={SFuk= D'L8xtKL_ ̌v`m@hXiܺ!**u skH^d9BsѠ! A~%{@>?rl JF2bw#-IokWَB4:+bzzr)``616| c#jw@T$6Fd-=\54F/=u j>oI4rusChG<`MnxQ{SIԬ"|v\O z/5U#PT RS:]X kǴV`0Fe&тk#m  M8wGc{ENH\1!3.]PT04/i+"6iHٽ>v;ga"n`<؄EZF47[]K兼W_3n1qe- a=14l$j|@n>I(!vw.vApL=u%Z-wF?t{I5n̸.01>jq GqѫHHp7B4,ss@@W%7"BDb`$6# cdQy5ͥ5fl+9a1))%8,E*z?ȱ:h7]pM5o y)Rjjyr| VӇY-um#Ua)j[۠-; D5&FTXLgE/-;**żQhVV]͛! iEf>%-ssvhpq^ DJgSfrr3Ȇ#vM$IB[{=-[3DRB(;jA?6ǷTpy88'=`?U \x27[UII?4)OM`I!`/DҶ?C_c#:il8"8Hevz ?Cŕ/43ĥd6B4^ĸ;5<6+3zˡCh0*wע΍sn3I'ѠA& @iz~Xse570C6+zҋF50s:auD.4)*5"2.B73Z&8ܸ^hk(7Gp?#S3TBbn]uWpÝ?Ҏrl3VϱWa)D:Ei;Н,T} Y)6]ѰJ킀pannVE/T^ۛJ ^@VQMY#l7xanUO SSF\MLWB\JӅ%jhV`3w@R!max  >w>.Qp!KgN=x&  ;GwUt`A?hLG0)ѻ^~ԧ鬭${w1k בs@s^+sJ{}iǶ4[ Ѱn?9qIݭ)JUA[!= lV/a`T$q'CVZXRQ@;E.%zgzOB*;FWdÒSfU+DF4V'׈;^v䱊ڣb2rG8W\\uϑ&L&4#v4DB*ځR,Jǹ$]1RyBd}xǘTMIơ翉$-5L^?Q O}G Hrӓq}Vz{tH֎ͫzk5 `c'-VE$1 D-lgo)E%(]~ͩܗ_@ιBGU{hęj4޾1;5eN/ {RxPJwxI5xQxdjK>1GT;Yo&Ņh؞^? ܁FbRl _.l@4AcG``@RS D`mY1XpbkkZ*04ԵLP[SJY&ڍG4O#L5N8 ;Y ?0@}gZhąu>B+fS("_ip`{Y.!Q8pM$嚚m7|wT[||qwmlh,rkqOf38L)N]v #i )L4q-V_3Hp'rP\*BBqS䤑>U e%15[JK`)CZD4Gm wРި7b0kfE{2ǃ>Dk i_-[gG)Z(v>azҀG_~$elH4q9FiR5g`"1:6&>VW\͂#Eal*+)JԔEXXþ-ퟡήZ#@ #}l}Dl :f+ͩ/jFWC4[~TcH&)BҮz#<9 dAs[z]3&L.00=a{xj27`W}n !Vk~f"HER̎1YǟG` [Ѿn7h,o 2Ik!Z e|tWԨSHCag\<=pU'ٙU`BB@KDaJǤ 6 hWWwdڏ ){FG.t%Z_ "rv/ek)v`c`"x彞 ~!aKL1 Iizεc[p$ۚTu~(|H;zH.{-S7ӋϾD;x2k_:OQYMd?>:T<`Ba C}j>׹.2}B55oG-SߡZJu050 9ac<1fhv\"/+QG!b3ol~3?Vy( ъHP<ھ]"?<7d7.M%'me^" Dfzb'$>=&Rf(g%f/ cq3Km{CTܟ#o#=H B4lbknƍ) >psEk`uѰJ݂ ߆UWi /9>Hᗞ6DD[EUuTT^|X0,(wQ~lku&QFvlm - ?2BՅ. ѰYqJ1-le{a߯D)i4=0:?pSvSAa[no?ts5gYvW!D1H$4m0S D* 6G`!&oAmCt5C #*]16݈hl,53>IwRGu#N]D,5Vee 8a'5Q &9z 1['eJ]sҎB[_QN{k' &䁉D0 s7NG=Ed Ej+'*?_o '𞁶f=".ʗ[tSg8nwͨDkJ1o‚ 'DF~%ѽ|8r۾q!pPK#DHaW3Z09e2$تR vra )= [M&Gi:?ѫ0΅n5+bIM,`{P0  !crHI yp|I| i;~ ~HVeF: GX֦#$E>\DD2Gql8D!r7,>AjG|N'ВKˣ6U|ث;~s,ήqڽ+S +'&~"DF؆f\+1zNJb=hR )A4LS.[@")j M DtL:!::rS/ Ԉ" SMU {5kjSdoV\1 7m"!6319*ro=sg'-xn4w o/PDc;@Qu2J抄y41y:v>KD9־H7$Xr9S;(?H dy6\a{oc$b—=0CUHp}Akc<\7GP|- @}k67?+?Q8+HSxq k${E`DGkw=ƖX*rY? <ԯ棽=l%8Z`rw~+~ 3c(.Wͱ8mIѮyLB̬CWbiYKBLF:"'xWr K:?(W~y>PHP^ uV#MQ84m^GOw7,,gNAA;G`m`-[)eonۭ( 2w.ep ѰA`'Y9덖U:/ !6fX4;*ӔQN]|SaAԬ"dCPx1]ߖsnZHC5`ƍ 8֮m~EU? _FFR/ +sf \Z}wǓyܜbCӤ"J"A|(.'A* 9%XhEW\_,ȸx[dJIDDJ:Bd_כQ>E D@{ Kd A^&e|H8P aj6?u@M};TBí;1v[#:?SS]sGNc$z9CS7FiHGHbKL\EJC\n$wS 5^[^ٷ6յ8XغOho.eWsk@ϿI^dkoK8mB4heߎNJ1SRsp|k4c)k# D]"`I4Q;Ag_KhH,NSnV ՓB ;-qL\O  _2=S!(bar2c"t4 lA4[ICM`Y.RD5 NvZ.,f|MwaTO?9H Gi[9sdA!)-V$"(FxJ2S(' ),R_TLDr:NmRWYGc\`54Ri} S{"Y{^-25e*o>;WG /v|LDCU\9ůz8>>H_ %*za`puxLL߀UhGqHSu =gzCxE,L,haNagyf/zSӂcd|mM|rt p=&{cMɱx8[~9;@CM3z+0ҺLq1D!"Rmηq|W+E 1+F4ҏ 3S`ך;&Hc!6T R#"e)D%\W׮ F⼌8^e(hX%33Sc4=T © {>IA_]]PBTZDZV1v8>GwB%T&XP]G"v ,^QȅE: -a {`SQ Kۦu~m))UBWU J/z"p"v%iҶ 03G5詨@]rGXZG(ҁ ҶkuM|t} Oզn .i5£4^N,%0=9N9n  7hllPR~7FPA 7چ'`C҂v!ۤR%'F%RSرoSv].!閖G\h#d~o*;Boi |p`S}eƤ":pa L,;4ٓqX`raC ;YF|A>rl3XBGq_FX Tb¡|E.DdڍFpX*hxj$?|}~:ve|_꫋>WGk ־cQۯ~n V5+bk*0!B 'kFdXJ,܈:<uɰѰY9[~A>J))1svhkR Me`{JSy 9P9F paw/ X2?mԘF4p~~$I-1@#09>荾eJ0>oE.!&{M,۵e~d+J&-:R>^ߟGB!2:ex9qK} W0[E} :$nnvϞ/3gDD᥿Ok' ^&Qs|$١Tu,1G,E8Đ%F AK)a7k6vk8H1" D 08ګl+9QQ8w #DŽI?n{ȎznHLߣt1‘S̝_S&?xxy#I>rF9D43W8I)"`|hPM0܆p\R)i)vv#}'<11<k-%kW7O"h!b 8`"ѰI!4_-AGad79/U˝'ۖGIOfq?P#[9|MojJQv w/FD$,E Z͵_^ݺ!** tFqkH\v v:3tcd{/$߸?mR,\=<>-,|R%WB4 tzr`GSqqqEln+Le eF v;R$j1ЫS"`>2Y^: Rށ9Rq봡?=1ɱq51qjD˜޸lmZoM^ Ww7B" D20R &m|Ż+w/hf#n:Tk FlG8ö0L qsGmۨu^ o}ΖjAQȧ"\ H3dZKΓIG ^:sF_O7Ż{uY&3d k`v0Ʌ9}'(AODk.tvբO~tor\H]oE}@U%ގ}d?}U誣) Jtiba#u|6' x3y`6 ] o$ׇ:QD_aʹYR0ST.wjh?Y^ #<+LXd;f&dfv 3޾7ξݝvv838NL2Ie˒,ɒ-hnRݮ.sZx{S}'ߢT&!Z%2cr*[['įځ y;, "L&g,Rϝ{ 5ř".h0l(+btVň~Ǧ\a {zLsWֺ >qS[L hnF= .45W"@H'Wo.0}RjEcM jƧX^HXl%}Ni $01Lgm"Z@" iy&i߫CkyX`lA {[Zl`9ffI۔)ֶ0Z7IQޮ6X6h-/ٵB1pkK[vZI)\BC)o'/_,agAk2a,/F5Sawg@@Qgsk+.w\I A3[f,tpr7'{t("6607'0ՋV) rY| 4([CMLϸ 1|ɭ% 9v;-8~E*Yg 쉥N]xUefƬNú{9M.'QwĶr7bժ%qha1?4!? +?ט/#ъOǼ:lȝ[:p*M>\̖-O4D%%"V66<@HC]'f񽬂/gGMGXnDhVdAZM3jJ|c!imm~FG\W&rC9O[;8+rW%+,ʨ.AT`-;+`Ơ\T`psQR{RRb,pZm T `!*X 6N6`[zjM {j6 A)v`ƆQXNԺr?K;ߡLs2a~M ASρcFb<IO::flyZR9}'osCurdxWϠ0'T¢akv`E\L32РWѠjLZt9JR_aDGmT;&;@LHH0~Bi%}txya[3Wc8R"Ȋt"PcpX 4,3=@s+k1cŠ/nF`BC\ Pag*#CYV0@?~*%7 597@ ^CKXX p5"H<0k,d)j&A&L u+]` kbظ:S׼m,q . #[@r۔ ,Ο؇w'%vQ39>w)W1encMC`:xGкD+Fq?[, ?駧^;! ~%-b0j`v'1دd-#$CdoG@1u,$SIb1u56`gHB\([y&+v},iA嗐7IKQNcQskkc]O:T@r: K0KPCԗ(ʾC{`( X`~raPA0HVk] ~>S *A[ԥ4p:DXPꊹũp'+IVuj[7oՍ,4@N[-nApugatp##A 鵲N4}nݞ2][X2` @I@a$ƥ'bډͫ?fA3F#=\('֊wʊ@UWGɢ/jc$^ݬ>I NCޗFជKNQƫ٤%XAY||"HNUqeA=2Р$jEWq&nY݄|hQp,>!Aq,'݂mHڬsmwM8\&VqHG;0ruf<Ԁ^V` ccS, NT͉;iBjKɣK4T+6U'a\`a HSz3:U] N*P 4dC~+!=X y0IǁNt(UF."!|iN whq񀃧 fXakAoKKu^`lxqi ^+{+{8p;x:[bq]խy],V@Ȏurw04РUROCZkb|H,()Pefg3~KbƩuztdrX\',,톿+ ȩ81 AAFw\ԃ' X6<:(%>Ŏfo{)`?Ӈ٩`uxaGtHYllzVo!K,KDgWmMw t3Tƣ<_xr7UJƂGH,HA\)-M*T `=!@^L|| *Lo73]՗lG\eNRn25?0:j1J3;7{@Tp pc0`bo.v( 0O`Gm;.>“`vܿ6b6R4?3j|l3sђ_Jb 7އE}W"0Z%mY,L>gHNTd!CB[{{ V6:>N*GL,=93R6]D14k@zdA p:c (n"bÆGbKx+GG61L7#ͫ#"0Qa!$m76h觴:f,TJSs-l-Yo:Q)=Ic-(YkA5XcA^N‘@!/abl 2Q%vu)|׬yRӂƩ]U`0A X.<"}ZlLCYGE}~RK+ ۽ QM*РAr..,(b;y㼘7:\l^͍X:G۱oL@ݱ5Q 4$Av &cU5 v.Vbr1@zdA 8=RW((׶ƖO"8Xz] g_BL'/,fCȇxpP8֙rIBJP3řfנ@ZXiYؚy:~-)yp)N5h+Nq ]+ h?3CEՏ/!,b^ bpD?޷DР4\a!Wo66ڑ[!Mf?RggE 𠤵XY.mw:g_-ʽ.w:DM j#(+$@1[d5 4GXԱkRN Aw_.lK{6+#0:: EiXp5#E!ZZp4)be@CKb1,vWEduu,TvWJ1i$1݉l_Aw3-͐afe)W&+{b] lQYt4Jϑ:YqYaA3;#©$H`GkE K›ӭ Xsw%B5SW,Qw);L0Y}&2 JZ! ml@TA3("_*5 ߺ;wIsw|H$`S/J^lg^o@HpЏޕ6~6Ay^dBq9)~+VvdįڡS2e#  @:s5g h' /ˤ$5#..MO_Llh*S갬6_!s_V~W "6_-WQz=CX\)S Vzv͈| #;V^F{Ml;(SaX0*m  o-(E0LOϐoS/!,)fha2&$]o`:g|$;I`tXJCѳ4]`Muki=\OM>:"){[+6M Üģw=}xհ hPvftdEƕ3R}g0wK`dA=(2Р]k;.!vpv&k=]Jns?Rw{rB 4  = 44A?1"("iAhHEvtMYX{%5m܎ iwmkA}a. rg֤H*T9F(meh-Dgm4s6`\4PԜ 9`Ab怐5aN CXJFrB12>b=l OD&>=E&6l 89\T ..np 0@$fCi#} >Y/{iXHw(}1s.A)̱vr2AMAybiuSWWmeA=2РBnd-X[]cB69}m xҥPjkLzPHLKl{p8V2F 2 ,(5==##G7qtE4'=&LB- nQtmzp =Mcr2@26<[g>h(Wo4Dok}cW1ܫ֬q -Xhz%Gilh@rEŭ .N#@fDsoVQV䚑E`@CQEdf~1!~/6(Hrh",ʾ H pWٙ PP-ɘWT|0&t7 k+`ngC'T -~Xa-kcZH7>C{Itg|D`&AyqCK8(Rvm1ELJFxjtcʐRh90Ӂ}̭TIRs%8AXa=l:=-p" Uhmj=i1x.e'Ksq*&fLf[ *rD٦@Ţ&8.C|vrW0ԡkr+sp9jky~v+mŎk-ݰ<_u*',} ^["4S*DGmXQ;CxEKPbqƾV50 *$Ш`(8K &pQ1"qGf0Ðmo9By} h<^goR Xu4Ӽ8T#h)LIʲ| xmf0 v+{p/T4ہ}x~nHz͢ y('Cs9}Qj[PH`3Q4p?zqD (vtm͟_Eu40:6s9Necm۞w:BrMFn@=P MFsLw6P ueu$O1_7;\j}v|3HlHXp 2%UpYaJ0T`[t9SC|oI (to[*@C_S` E@b ;cF`@] &~f8+UnNJ Ӝye8jf½"xm 1b$Zº-E'NGG.$ @UyVJ*hAhDRjnE4phx AvǸI|O|/vи.SkwhPk U8s# +,BBVcaaa\~@IDAT#` h+$/@8 y}Wn25πWMmش=ZjrQ{L,~V ᡒl꬧Y[dQNr~(b k{_E4 uQyqeqǭ/ރY,!G`hP]MJ/ Cf0(*"njUn ڋP5)"hm*<_*a nxD`cѸDR+.F֠ObA6hhP 韽{/PlK&kܔ1 4Gi (Ԉ 0ۍ"<|:*rM D@hBeUrO\U7v?4Nɤ7ɦ`iW'2F=T%6?G 5SE7)K[W) k#H\hϬ7g'(@|1sY*0?NyU|٦r ;%F22s#yiE`@f/Z+[Cn7N操줞$W 7W0n/MY;9!hM2.hCHr>'ψYZaC@`B ZzFV2Ͱ՞! 3O8Ϧ#,8mAǃdA%4TTT?Vg,14n.זB@CuuI vwUH u p9# b^?(8f6|"g?IPOZX(<4~[T\L-u1vY =onW/&z,PMê?)*rlyRRdA%4 z;Vڎ/3엵z(F֭ d]ׯ+fB ]T S-ÃۨT .[wMlE0M$*w=Mu[eTkPt{tF% Qh.5ܡvڂJsMo"MA*/rff X:xG`ŔM`{`9T1-{។` "Q+bʜJA\Pue )[rzYx/ox\=WQU|U Ӂ/'˜Lrm,9alloDʄ: rMiEBOOOP46~(aʅGLLEae{w!@mƅ04AY\o|b%%l 0TTamSFx-y6-@4ffK h`)D8snݍ]cʸMu+fQ( w+]g}[~;D3Db*7k-D@A\@K?:rM Eo!/\ ,bH1*0Af)vSMLjBg?Z{ڋR<;[;{8TwTmmj\ 4h PWj44P^-]s5"<-2:zY^7%D\;~}t~Z(8zGfH>m߃vwe`k`N-_ npcGjm`At7@5Q-_ w/"}ŚnR4LoYF2Jh!}MH9Łb8͂rñ1zO3LV32ܠ'M+?@ K;{F]ڸ(~>/W>Mj@O|DwG3""-imhɟChPB045QP̈G%c'`ae#a@Cu5\8PNFOCh.=M`vzN~`OM9QufnL;0vs`P!TІm mTηXoZ:]ӨXQZ)!b} # .~-:F򢳮`n캭Ֆv s*8 ,8>t[ DwbG֨ElN*0ͣ<4\EMnHh)#är_N j@I *۫o`HPɚ^Cop.akt/L[_KFi 12a4Cߤ4Y{''hPGOԱkr"7oNʕ?Efذqŭ~S)-${()iig~S2t\/z[ED  LΉw?Y5ü u'հ6'ܼZ0)4pzJOM Pap 7 T5$:lGcއ paÁ_F"b]ai{`sz<b|dq(n"A:Lq + cotp<’-vx ' v`g &^jM\ݻEƫoP@m `+8;<7&E֭x?@o'bcbG% 4?2Р\# שӇ٩ gg4%G)糧CoL=4,mt:fm 0|+P'_'<%3]u)51گoͰoJ,;)(:y|&Z@&LfrbakI0oGEz&ͅsPW?疺8"n+ڂfJk![6fpʆ[XG$(%.ޮhMA _#Nx0'MT \Bls8͹۶`MN*>}9YY4v@lIN{9pZl9Vo:uK@x) ܾœtdx+I'l5-hPLԱkr$g ̍ӏ $mڏ!) _x ybM+Y /7emmkAQzp&>$'("XwaS`"pom<? Uk-l#tV ͱ^΂ EGyF*/9E(=<$ p! bX+:P{]zh-Հcut|ƒ(@mxVV('Y'9l+¬߽Y9;ϋOC"^4-0 xb῀mx`Q7 cx?P?v#5^"  @:rM$#04Dtȳo^!|쁴{p;&X ląiLdڥJ_{+:Jy8z{ C@r^QE =MSʾA[1 esL `L,CWe=Xq6Ps`4f _}[3'nߋU;蔦^SO `02@ ]s:+<ȕsiA`롞Q/2VTb,8T^=yfU&@+Le I+񑩬+5Iw!jsJ7^! n}z.գBjSws p#S<%VKB"RKbQF+i5Rs8y Msw#e]_^#'udy)XX]Ԡ [ʐ+Q0"Wc'amk3Te{9TFqDg[6?)@[mv} V_{hXl %Pv Us u8)Ed6N. p'z.>?bnH|^ 73q#WX:c`/8&{с!PTv:+T fm]TOb`` 94"0AdM`B/=5 &rS] *b0BQ^+b=]BdԠ]' ,P;M\{gbFgPJN1ګɭ]GOÓ Yn+1d&=647!qcZb= (>ZB'Q{Yt{A$ 4p#KNՕ"0N(OpؔfK/Uّ# >k ~^6F =fpƎVIxUT\"' mƧ~5bl5bc{oN $ȀBh[|{ˉ,d緊@عf$]E`|d iֵnCwxN.+V.#Met\[n3n@$%:T@&ܺ9?yN6 n,*_s&M #rAz95)›ֲ $'/_ht4~VPp*TpqM} z{cP쿝bGό(.@FwIQ[&Dg<6@ @__Ny UBs2&z \NH#$i~Dt?GLRҾ{.}t9FTܰcʋc)evrRO3` +{/ N}k@7֡}{Ǔ;x3.$IkZ.NWZXOoB_3 y\8t cpRv_Jѭ=;8f7@krXN}#r6ɴq1 '{`G;ݒ19@I%ddO9, LXVˋ3U9/op};t{МkGO?Do!kQ[9#*ɛ 1 ~-mhAG)BW%+-rvVAR:-@b8OՐJ5::f=<Հ v¬! /KquzL5ǵBc%lL܋Sެ}YC#!G@`' ߪup!* iR87(9+ [428sf?y ^ёs=t^wʻDU-[ҰY/ZNuklM4)mm1f!?v`zXgE2p[ﺁY}_ ,t7vv9}Ap[nb֑E/M weHrHxfSgSߜϮ,lO0 QkN~>sp6DsfJϋɍbO?.iar'.nCifh56"׷8ɟ@!\!ܒlcKK`7+@H<+KMt22`^o(FzRPCc`îanaHh`=^G,߰[|a#l=DH9< }I^'\x&+[CIٲ&%kpsbik 4|c`n[fhӈ(n,̤`mo>IO;.=.FTdf|ZnAXZޓ@rw[3űJ;{#~VZO+Qvp# jGXv o 70ҧuJ@͉q9Ԕ)1[wSgLد~V8bV9b&fz"7[f;[M-=5ߩcI?]\LX+6DwgkllFZR:L 6NVYB \"28G@@2bip#Rʳ땛I$a5GE`*.~bO_Ю d).5!ɛcg)R) 2d&ٺa- D*MS; |`?.} DnA`a;u5FG`IƜFwC\b6&iPwӇ4- Z |"9w@gg#N~bG/*aktqz?TS"zmۻ.찬D"uo8hO8r8ydٛm[+kԑoM i+b-׊mO:o" fou# . Xp,tRx;:^ՂVUP38v.*BhH},%}b] f sqh1Ɔ?F6k)%fW?ĩ~!t/p׌/יǩe_(,l(MO"`u] ic?[b;?Рe) )8lS)jY8;a$$x VҵQt~!g߅wa8 .뷇ѐ] BjJB-$Xbu6Ѭ1\I{DؚZOfg4Z*K~7~(lXչ6ۯ<`71~1ycsEVcZwu5EscTc-2`#'[8J1 i-J*@@o DoW=Į$JBc:~uȳ ^+m(9}| v^Dy`㦟_v9#l'c[`禝i%HFrc8S j@K]~ fJa+Z nX`Yd3vDhh^_A eYuS+$57J*sbtoU4c9 2)nNM."r^XUpª{i#h7f WŸaSae;v$"4pG:qϿ2!XbQzlIlh j|g'W*k1\6co[  |"06FjCYey$?v) =z~g)/4J'#r]T^o[!{߆{s ًsfL@55PY uP .:.sLȻ9R4[֘U(P#$ .ݙok! ݟrS3#o;ek謨mq Ħo= {) OQ~>CpCͭEjfѮ be@_t^%{ 4GO?1%ϱa|ڿDR+\}$MJrY|:2*l6&[ th0P˚f[*qkW Z'C "]bd_o{%Q.J{-+vqIUXͧ`bP7O ].bwMqt`Oh+_fl}QB&G@?p3נHXszqwDp}Dk@݈N)BeN5 Tw[8xnGnic{BC]j@f/ C E801>FnԠ8ȱw F,;wzW?Zb>0 sged;O7fxgzk_H@ۇtA@u@F ȡ72C`~"ҏ P|v+3J9[)/A*5 1`HB8X†^ϼX<4(ǃ5m V+٨W(c1:bϾClM U֜^X~!_Ti8MŧP332O $X+6"([8vh+}`ii3Sms 41PRM6"۞gzLL(<7/ob4g>ٻy`Nj-}Ģ<yc8n߻W+Un"|cms*f.t6vx#W={k< 䶾?  DXYdN0Q:'_xmڦ܇*f1&Aux~AMx>1wlr KԒ6߿1JVɏ>5WqnPAaݶWcsEP/:62W"\aݎG}Q}]蕟S;];_ܹdH\t$l+WэX GR7PVp 珽.Dfj3#Y7U Tfa_0z'^υ ?ٹP*^ &QY\8Z)wZk,d#:T\'5uOBB7\rZ:[I,^{G=>^(}bJ(05#[B.`Qc8V S?b^EFf8H u o%_a%I\H V,mV%|h1@^Jo'mM]1ll$"ú0xphg 4He$lOYU+ M,]8B-UۥPtTyLG?HTze| ̬35H1+ СG_OhRք aW ,HA K>KG LJ+V kNJ/BC~-[78|T۴]Y,usBqWEհv#_C9M-@"J&/EAy=f#ػADp5Aw?R(ΨAEb.dՒTO;{s$oE:,I@bMu}LENF#h9i!:P.]^h3f۱cە{[|FNyQю6:]ӈ m 6Nsp*ō'P}` "֧!iXI.Mк(jp8>C1՟nnxSD;.20߈Idh@HP""jj1>Ϋ5'㠈$Ĥ; n e~h,_ vi>+uXGh_H_!IbTtCx}~G(9r &=aG9*,z y%⒫X?'cD @@;6>`#%\9ʝ BSiv\jLDUN# `h%"bݰflGt SZb/FdEZtw*˕aw!~֟@ۿMh5";UBa|ӷ-7({wx}3UvYY+JMW|dqMn pdeG}OAșUbcG"6)q7RS5t2`tCh 4--U ͅ P]iJ3"B*Bb&, h``!wPQ8:m Wn馌?/? HzRvnڍHe*Ė'`KJK 0罦VVm.}L:3Wz ]E8YA3([Cߤ Sx4l{[{MY.Ҋ@G}C0kZh- OLi CDl􅣳u1%@wx6dqS-=,W ћIHe*@fW^:"<v`7rU2e,ڏ(NWfк>Eiҹ?a"R(R?PL >7'&_ݔe@~m ~s8">1脍1 Gqt2w:S,eH_tl!iA3i-Tݪ"O``.'xiкq_bW1{?Mbb `eb}G5vw v 6}܏Gv-:~ѿa[ C&\yud;7ܨW:΍"wB4"vp'mf\dw.T6-^"=.3]t?_vȽD"tSBSo1g`:c/̔y.icKŎvRǜ×^hkDR\BD WLH>D鍫%؄ /z!?(h~_)"vN6:[y: W&3`<܂qz AWTCž(Om] ܎+pr?{Wѵ_$ ] T-׾j -)C q#n3]JCٽWfΜ{wwyߗU%?ڹcRi SS>NIv;'E(,H'p! lh[4P_S+GXڹA[O1ٓ UEPRUøgAB' ?i +GqW [N#$nb>60F>{>{f=9kem(*E0ŔWahˣI4HHY,!r x<)|,`GBnPQ E8l5 t;ȏX݈ XquuɢNq9 (bȼ M@a2q7̱2`n6񺺒r\ްgDq.PxȒ Dm}+n;qIj m9qLkJG~Z"`| }Դ1e00\4*XUh'kj XH,lΪ􁞑9& {XFy57vk`.lm=/M/ `4{dJ^M&xSn*s~w4[x4اcsC A$*)B䧔+jE'S3_[fO2l^{SHIt2PGc0!/jhl| RKô mcʼn`ʄ(jH5} |t(AQ҉J3dqYT"4&0z+[^|".S`78WkwZ6lON ?@ ML^'Jrqh˷h:&M\ +bhm@IDAT芷h_hPqSX'O-Wj^0к$cFf0h,X:@EU%4pAq~&1G/iLua[>3{$s9'~+0yfw }Ѐ:r7RΊ ,ugac]8h졧4yWKU< d꒺;*F(@wt_ s[r }\#l`hbk>FsZZ 1Ж}+ Z<[5nmoY/!=Vֆip P"?k/u45p GOW,fXqf1Zf&܂+{#a{-=+ o }{VR>jNlm no[nF/, 9YA bAPNFZB4tntDt(XaB.=؍ΟI< Cdҝ}p'oy }ax(.mI1u{25Z[AӬGpigw:8>Xx8wERG:vo-3#"H#U-8i! L/['=%bO?hN0ax2Bׁ\0f?]a;gbõMt)bv:SZc";:x&\& PT(jn:coXz{3Sհ?pE[:z>1LKd 4Uؚ(%6"'ίC)[^Gc=18; ^zJA2'<VT HE#t-[`h3\m^bthyY+xUSHqR]&? 66vSOH Djη?@KC'b=.;492=}h*PA7eU93`HKsm@{@Vޙ?A^;msiEd!w Z^ؓGS=MЇG`1+OZMv^0.+Z^0 N)%R1CԺ](mC.3m2HW>7؃fC$>0\ot^FRǢIۋv]EPS*"3s lo7K柛8A$K%aDtMi4,E"hinB% Ƿs4. ;q54%@DTQ7x&2A]S$/Kמm Ƕ!bwW0&7$ߐM@1 IC* T#JI26־nGp(ѻ&e<.Ã9./~Gd_7ߠvU"ǵRtt_!.HzX4Ё:\< /+E+;v_dlEJ`baea{@å{}?v6O&d|a`q^ѯ21 6昴mP 0~px^4ՊjYdpR\hhD@CkK+)ubKRg۾7Sx6d2,  &9%lu]$ b?"R! 22 g:pg}>"'u+0{1YWRQ:E9l2 w; @MW1|\׀m$c~5qqℑ6–y Ef6 h@d=٤JKqaQ'i?j&|NnEG:i |JPюX6A6~x+ riaa \HL9o5SkKd?vh<۹ǘ6й{-8g*ʇ.|t;ȹoV 0iI&h44pd>$=1\ AjbD.%՝rQ}Vv" .X v}^wniBBT [ жh4 :x;* 5^~;D&9N -r',N+k*}xMF?eǚR\^Yo8 3NJdr){*lp"7No\k"zL3&݂' N$/_?Ez#()ɹ 2ST/50caE@g+ѧq۟+ۑtO2H,q2$޳Rm JJxȇ]=\!ωEqΘ"{U觞 7nܤYRdF#r2:[tUa`CcuZЄ>rIEׇ+i?eZח6z>mlٳ UH hhnKs+JnE=03 t\X0n{\'HǖCO$T! Mwk& ac`;Oafӈ0r'DWUmm| zёo?!x",=ȼW !!r[^<1xCf{lw2Р1"}&5zPTU߲_Swʃ側 2;m9 IRV k0]1iA^֥h2EP`6^W#{W,0o>õUԕ0` +晴-M¥3@BfL>AթA S``8 &]=ה^g+oZDAey#V?/& x1l|RsOcX={ ?O#rYԗV܊ Ji ~ghM7qwį@ɋphW`/K؁Ls_7 ?! n㩢^wpW3&ɖݰu{K f(2Mˡ¦KNfKKN\D՗dR*P\d7a>+Ԙ׉?NR?,4/nAގAбT6Ð}2}!\%dz$X?e]Ub xS -x^f<][B< x`!NLJ)?滑\fۃz4 )MFdNT׈/LRgCYMAO8& GcQ#o haׁ0t'@_}׶]Rj}1HSdCHݏZ ܮ!3AYN&EsY20M0D>ӭ66">$$*ۯ?=0:f ;JyYWpl%Ck{Z1~RYGv\Y;eh|q9o|) cTUK%8rc_H>cw:U}0١yz0}Mͽv"OCJDZ(LGO\'jo<%VV>/,؃*?l`|0R/&AEC6\_xQXt?ĵli1w堙4_ñGMA \瞂5Ic+ja#,AIGSI45`Cd:sظ/qOPYV[p.g24kar, +J*p8^C FtΏ^EGzȿN ޖ:urxFPєf+R԰ Uhʊ h)`y-|)|.AbEc]W57[˔|LX0@񯝄/L)e)xi^]` ASOq`?ʼBO\MC+p4JqR,@ΣH p7\>}*>8jC$e>q EX(T ؑ64a%Ĺ#l;i.ۆcCX?PϝIEE_HKD SA麄oqF&U(6~ ON $_oj"BGȈ$P_% o 2PHX8GAň3n(p),}_zן8rL AE*R,jڪ89$N¶7b'"ٮ-Ap悋;qwȻ ") Z< n'Lsܧ翢(>Ia(HK)4IysHCQwq~QBIEUn W4KN@AJN>t0BX!xoJoFk >$ʃ}d)Ϟۆs*+dI: QSqbyZmCQ+BY!lZz17eP֕a{dUax5c|h#>3Q询)oTؙf~믷4uǖOF"^^URA\9I$]-̅Ϸ!;'36Ք]G׎^<=ZؽMrZyƋӹKFTNtQO6צ KhL#'&._YX |& .$9PՑO$&YL UH=sU`ho'7&ےvmy)*=}^*{M ע6Nȸ8LLae%?'u`&V6semKM֥:KL5"++oKPYY34G91q!L,%  ؿk4WL4 {R}e:ΗyF<Z>!s9WNGCZj5`3G ѐ,#9KiFճ`2XJ+~('xlmm<>^5#BldOp407[gE<&g6fDZ.BT8@ѥ"0`ݫ* +Pq H =~w8l' i$RR4G MKȻO)?ZR,K=rѕ* )ƍV"=2bb&Qc`?c4}nnR< j+娫. CجdZR#O?rUrO4C55eHt 4U"rzz t[ޠ(Oa@J*1QhJ-ú!78р7o܄|7F߭4n6#&x LJgB39gCAj)CxXɐfQSR8շ4"yW[u5,rIk3 ^ @D~u 44 )|Ξ݊ĤȽD QKG0hT(ThX(Sn6|",y DKsc8rE7{ ;£t/!x$.&P&>Da ȿzg#Ds r1y6FI%Wz!<{(||& f']CmQ2"ij]k<~]aثhC˨-- $lh`~15RGdK)͉'T5d҇l옟<S9AK{O&kPW0|YVn)LajI/Zj[LI,]$.EX*DŊv6R'vHijtm̥Vw+M i)fGi܁ы1a |73 >, ak/"'֮Ͻف1Nf;o)|< x[ -Xe$_$sۭyk1l 2{0 0pfq 8ԑ"љpmt̕[t#!?q-2"PO/D} L]1n+$=O82r2N7p$'!xx(dfƴ tփ7o%wҧo?Z,.[D'tǏ()|&C&Sv-ԀUr(<'W5_&aljQQ&v [KT ??K7"Ug56 àaURXWی?~&58>K; ~A6b8I/GGaccn^}+kd_"g0t޽n6jkbԻKzQ? S&{$33" o_GDT{Rmܭ֟0\ 6t.HKSBe=D:ĶR^^CZ eDgnFZڥ|U9y v2S^kI8=*0sP~0"Ȫ|nt8pO"b =[|<-?6х|bI^oŎ6#="9Q8msS} "vDK}mcA9"x@%ˆЂ$XĄ >[= \&7gGLo., z SQ=Qqox`Oipz:(KFܾDH29 ka0eԕؚp G䦤HE*/(.GSa45!.2FLE qke֦АbyW+WqFDFFro<=s9\EE"<7Nzb૬<3um]#0p؂²NND"!Ь(#hz T݊ҵN:C |TaGI>֋Bw 7In20 {C" xS M!kR_ጇ񁵝d\{ܯx./cC?M"m8y8~}rQZA1{}l?PSS4*/ef񟿆affc߇\8*yw i<#T( RS%Fi"51Gv#."+PhjKY^ Er%^kWeҞЈyYxǠg}믿RB&~'899uX%({9bDإ-[ 11˗/СC;U=E M/];xW3 =qDFvۮa04[{.+,xA18{aE-Uظ:;O@sNc;=L~)^c;ʫ?y!Us\Fa`44`'JtGXg)Vl̟V>^QH7U_~P"-ve*l P(wMRKAex}J=C]e9<{+Օy'mS"֒`"w$i]j*j.#*]:vq%Y...Dpp0n݊uX /C ဃ?/2EHHHǶYՉB<ˋ:ƥmwr@C} b©(Ufgwl *nj\.z5MlE)0 "H@ɂvU:qk xeO3d#1G]1a0yrHEط4|Hr1h~:z<=oC0"]n1 ]vpESTV4u-HZMA "ӁD>ic wT!?e%\WR(QXo喢4%W2PSPBr&0#̡h ~>K`jwtx}GU@<gGXz{095 :r54~T1RqK;7"AEUIyچzڕ^y:ѭ8cǎa01gNSS8q]Cl,{`X:8 钐x w|\B 4LY ں児tT\fl^boI+tM1|椨Hu!iMk&G"Zn!WTٌQ>6!rc=0Al<͹kX^|>}=.N$@L5ñ#xAQkF\jOy=I8V/ف ?FQ tj p5-6(q0R+̏aCùY.VA]PRWŰb[OBYK*Dn܂rmjGeH %9(ĶK껍D?m*;.]h())J6l=ŋyDCG,qQ޹ڵkN:Yf˫E4W_p~L4Co GRQk@yI"¶̡( SԂ)6 >c`"F4݇ƺ8 #{;=^&mΑD9IK7?_S"EtTGg  񒰏<ѣG| *x3pΆa$K˸XZZAYΰ ;FL!pAv 恂T\>{Y)1l20gD0JwWV[J:.-ZߢdbWDB`=HqT6si,@{Z1^wqg8>«ↇGR_}'ƍ5M,}*<ԏGH:rG\ JڼeA@=ONǑɸx&":<,`$)L! &ޚajc94ï/U4$OOLz1V!ble7<]xgVcs0t[AvޫA\;?܌ykKзo1&~*wo;QU@/ܙ4} 5ݽ )x]/ނR* eC Š-d"*4@wh1剶EE)tTdll,V^ www[VV|饗{裏>m344B%QUQQ&JEeh."1"W/ج?#¹| ʋꯉ3Kums7K,9~Ce~9-Ӥp/#-M0y[ZIPp%>=LJ2Q#`ℓRG.څ<tvz2]zLA>.>R筳w@CVVIvwA4=R; ^]q#+DҶ׉S(ng d`bckkc\"E:-LmaFt\:XxN@ w'm)D,%<"CQC>b9 "! h(/':f̺$JE%z@:!NPRW,7vRT za7$3F-$b7uAbJ[g9U6|saLh=$ǗT۟&b"dϴŤ QC3"v]YTZl21.qӝ0v#,%\=s,oՎQmwl> đq'3c |_|^Z{gp[aTa"lƿ2En?]陎q ;)*š{!CIZ]_*. 38h(ɟ~E6*,\m^ {a/Ic4 1eٳ (=gC'r:/L>ZJq>t+zds[QKmms/ te\lyu dDBzԆZۛFTfX}\cl1s5t;_c%O8Wε:l۝m:$^BVj|u<|M2͉xE*=)*] 98/f-.k}<9U` K.3a6xscc;eá\֕F54O#C bbK"`X==ͼ]0C䏛s.Q" <~YӉRfd^W!lRvД8OLY;K;azF(!h!Њn]X;4TQi% … oв :qttμ1nGҕ*@Z.S(bD6j<4$(m"_:c.9`/r oFfmT'/q4(i؝ੴr"hvzxPj?WZ6ܫ^gzS4ߍT!̽l `'2Ę"]*W(☑|<80w {\_ W*9ܼz$\.⯕q;.xo{jJx9_xDcT0udF+pdJxL AiR\Ppv0g 5q.t f<={Ҹ%O$EDzeR#s.}tYޒ540)K4~gxX|9E7H;ܺp`2P!##-}a͚5|:u*&Nި亍!hp#I3va,ԁIIb?gUVSKtI&Ô|f)=7f~Ԗ!xiuR;|" Ë.#ܤ֖⦺Fj7N=֖VX`麹60П#PV!AVxQ ,dn'MhS(-C\ݜ_?>O)Pk5_-{[M؈$GbS.&~~DVGZ=`gL$"ߋ8WgJ>- Ĥ.pJRFa ~׮Ӕ$Ucj9]PH`C R k`l%GȣV$Rȸ쳗al CɌz/=;K؎ԗR8?P_#H٠չ{)J52p MM,H.mJܚ.Ϣ"|ʈ<_zJnR*ѷO?+NIO [8>qqqKR%E< <nz |Xh/^׳Ν;vZԒn,+L.cxǻ$L/|! Xى}7o!Rd M,+(jh/{ֶ|h??zYXK]meG%W3S^zmw*4zqļBf|:7dUՏ1QGjvH*oUWۂz"=M-eH*l?;VBRiQ1E ]WSoq&AEX1[Y8GO kZK7 <5!1d|#:{/ l!4Є`x>4Mdfr,E]͛ MpRY6{+lo%y/PSRJ&.-uSUǤDM|ېѳ0$2"/Sj1%a򤥰$$iGEzz"wrOj*j.mA 8B^K,((|@xcn7=&o*g,0H@=[plͨb'B]O27T|Op~hr(k(@7n!y۹ŰVR`887AMQ⡽Cf3jnhC?nAKL}A/LYQ=jkQWe>DKI0XN<4R_پ,"!1Z EжhSdA:؈#4FW^)*OcZ2|X#/琗-"<1eA<@^6vw~k,#/:uu {t|FneBjdR(ajo_{ZfF2i^f܊ /ZxcǠ1(+TUP|fR#K"eɁL;@ji0T"QnhŁ?W0740gv4H/. DgfV޵4Xq:rF`M}I) P~ b@Hn`VDrTXJp|c##1z6׻]aeOdi7+6. > u %i5uz P+9'&'nf^LG* 7]$fFtK3((lW? O*Ovb$[UQD,dEM$y'_f60"Jˀg֟M8pޟ?ocЎM͈ZGv$ʤ{PY ̠«)8w4E$Ф`6ꉥ<\NzH4(_;`(uصcͩ5fxR3NFګSJ/X' $g&&F@O~* ͢@ +<(̈́&nrwGq=`z0-%Mwv&x3R9Iy=Cқ=rvGr[#gz)v9uqlugj/D= %'B@BMUSWQ  VѦ|)Mt:ئtdd645QM˪g:ݶYEV$R!uyT_>=E@_ /?a\YaazQ0h7⮮a^1z! ktf%uMd SLBEsz,o@s-EXYb;ζh`_sSD`Tio >3L'rHe֕F)VL+\]a=@IDATTBi40u @œ" ]w=S6ZF"D#~ Vݯ G*p+od/?_x-zw xu;wA%,u){E\Sz KapȦoe"|{IhaN!4X6e*z߻`23In7##P]R%-9 9bDqA-‰nDe$~4{R9P_Kė wWLdv׽0c5HT%='nH c{rSzfx 6tf9%fb``yAj)J(t&NzfKΊkRT(NtEMY= I= 1ȉ͂ ϾVZ1XUST[SOgKkC."/ l`EZ'lꌚRT\C~JAX2\Hں|lpUEin"nZKc ;FEI>rs-]<ȪݫF8@Ksٌ;Z`nA&([%y DTUm-3ffIH6gg$ *q?h ITnEi\O"0skl;+hf? KJW@HR+pH-?|u^©_% ob!ʹ/axqLkQR""x3h`ן2}ȎڟP:* *pNvg>ei8׵ %եuI x=˫0"q퀊jJq*E1/("MIHC^uخ1w'ZTV'Q)zM^@C8{4gw{r #7nLCh`!{6܉v!-sfQZyzӀP單{zZhJu&F|X հeuh`$Qy8*}wz!7 x`BG',y }}08߂Bp Ai40S PB@CLBFJ$3*n7, 1i+lt9@XSل\OrN${-oYt3FaKGqz! _ ?JOp6R ;:u>{*Z`R,(KA})]qAM[H2,)##RNjjP@ivt烔-c/lkOYSUӄ.ELd\D$4sINhC3vNY{] dp}REKs#rQR"PЧ@"|T[O cMtSa'Uuc$9yd7ϗc& Kn܍_E8W P8Y*-15lFʙ+Kyϭ G+%J|u '7DaH+|t>&bNcY<3S*0<݁6"x@ n9b (# V&uQLtPjBo, -hl-feEr**<5RApM\>xWGٵ*bFj6 ~Aӥ 'v!60gakxL) ݽjV <ǫ&h1jO9CGNАw5 ^S&bi(H$|nei9 .MAtf~:-g;CfzH+2gr,|v ycn!E*;'q.,_2I?"hdҌ \38!,=YTX܀g_ѓ1l?ョ^U{|{}--"b^Vٛu1 ~n'&Val^aN u#y;~c,e9?*󛂁>E!iU4C ]hP#EXHUAN*/ #2E7KdehlFD4}&̀{e 4e ođ5&n0A?~]wv1g\MP'> ƌ-ˆ~Wf(fdR!-c~۾9s֗I5(@Cl|[,}q,0Ɂ^Zf# {45S Td犢 ʱ<%ݒ ?\8xS_)t _)I"MC"~<ޓ|)N1$Lu#*1䯕5ub K$'akV:榘Z)QooWj 72Lmt#paܤPS}KqI9$7I; =EXOJ3E/9 445^Ǫ±khp!ޙ#>@WIy! 'PV釥Ŭ3K엒Z| λ֙h"ZngU8E&bE{k{g~vF  ق)?|L~R^!ku=]3Qk~H>yl2CS/ɦt3>j]̀ϰݪ^hK .(zFT1rNycu 4zU vQ'q&Ą c;'xO°y88,&ANd+ ۼ[id oF䄒j\ưoV(9d/-ءp[ٴ)Xk,ܭ!#پ *."kS<^.q,ݍ:8(y(:d{Y16##˒Xן؏SY1#Mws0YYPhK`װ Ȫ0ec6ǙbN8q2IE{-441~3iOrܙ\am&w`Yp`Qy%ht, { v2` cSB՜$EnFH%覚:lJ M2H?+w5^=&3Kz6^PUTbR6f4uxW} fNϺJ'̌Im?d٫DO&Bry?N4d3 } 1Vp8trcX gB^{$$ڭ"XvL%]{40ҵ?^ DZM=_ty b{LEeM+G^v5L.MKv5E`-.)H!PT{w{=MvEe!) SH<)tLunHa`C%=x}kh6%uU#r+(I R:b3M 9Q1hBc`֞-/AeA sS&,kȕ.*(/BAA*jj`c]x{JBPJ "`g""Ҕ${;3 m}ݻ;;s'3zs@Co@uEyK0"p)hrc;#tL>:#<)a5 28c}>U@CPeuIo]1᱇$JΖF[4A3Xc[~}'67GO8 KzyΗ8U9`l+2?v,r(qkS'k(>Ld`]6~9bfꝘ9^8u^ t8y0eu:ʚ+@.&90[fy~5B>,]Lnzjkw;4fJh6)!epl!&+[GLc"5&+jy.&0r骺T#R (ʆX&H R-aDZ!a(iі&k $i^ Iu: FQ u()DYY.30&7T;/ 2s@ek,++%gSj6d&]FMe)7ACG#b{1l"XxG,S447_8UE2GS=``HGz2gp'B)knM~ře%?/?|9U:>[7H˔ h8YK9")5H-ũ#5ys%r͈rp D\Cuy4R"MÌHݑ[#r)~|/_kkaodGe4I@e rp;^ dLi TX {b]EIM6=@iaja-'֟`L@uu)s`Md * Ӏ4})FH AeY_d:>~:k! ϿĴ G1J.\FEN,ݠcXBL9LUCy(̈́ )SZvL& R14"a4ip4(U׆JRƅ㿓:^&܅Ѥ1v*뽛ohHp g~Gϼj9K'߲@/7@ay|R>86_]-9``i(^D,B3L$3<F]9鮇Ha˟8f3lQ@ s~i!9]3j)옄q̻rORy@Hl0Ƙtp!5\`&2I,J@ ʘA&:/4"IR OtpyS$dQ$AOFSC :,ʞہr! {)^to0rADB&&i GO|dj).A!LBU4F4C.\(7 "l".A#H2ǧg\,,{\EA?z]BhnR؉܌8M41j@wUO}(T#1$`_S{N#6%}*s90G`3|\/]ئ]#'Wr0R)if.6it ۧ4.J///`G}0D1=[c֓QRXG4wୗ04̙=Нhogͣ Py``Q[{f|>V#ȨTE Q=W)i[Ҭghs0 ٕ(LG8JWK9[˞/e&E/vT$@󷁳 Ra&[r9{ !QK$@hlPΑH1 )R I03JDΞDFMd%KDkk3llJ4Z=&;yR TYs1ZI1G FۤQUƍՇ8w\#)y/@CNK;坻MO:^%07I[:w`zt4{Ѹ=d2s潵٦D YIעe4`L[ɳb^D 3n*f-@ey#JQUqaLҍԵ0|@hhpZDY|>"Pt#*ky:P" 4hP$bVǧ896Cs%TX2BQSV2.U)$`LzfȉB)QgIl@,^碸$>>Ӥ딗lVf ԒؓD'^D?DJ \1BUC2)JyK8b i xRo&\;"f`U<J74⏽Hx{?y՛*12 i ~B(WeC@yǾM:JoH{fŕXMZ̅JوHlCKLZ}+mCxLDYl{%4@C[[L:f K 6pc;0i^z fhi}sKd^&yYA *Rl`*ND:H$42\(X(/'IT!=Cc[hkJ4H˳qyBgg9b#Ն#|HJ]cS!ٷ%)А3[7pRk/OL}i@ߙ 4u Ϸ$Ny0g\,3YD:|< zُ:`&Hl?@CC} x'>0V.ˆxf@z P$nfEi />&MIFcE_X쫇c{Ru(Qt#U#҇jĖ ƴyn_hhȗFPELr{à%ݔ~ T8ZPTJ$GBGK&Ɏ j?@4z PZ9?8CC]51e2#.0w"R;1/ v=PUT=q`KB=G0h$KIz(ėߠ*%Nh__MfKq"kmVTfK::Wo'Wug & ӔFB7@C~v5^}KO> wMR\]neD"Рׇ)j\AW9PQPC2q4kkwu-F~XRzWfcһO ЕjZΓ8ȏG؎4g쮪m{;%?IE;/>.}8{x jO^)QYYĉk+7,^ΝہԴpĠ4 t E'A 4dz'4^V30!/#".qY֖4P9g/(t 8q ́t}]9MS,v "L3OdEi\`J#!qe,{r6qߑVrV-涴}fg[ZZFy,NMlyhWnm 2j9A.c(a!Fb4-lmay7򅺺:g/FY=Ʊ|,b(yOY5Ms8?"~4n) G@W)RVO#e/!|o' K߁$~>:UF55uÞIίY/k4"NGܷPcfc4FqJWXwwZe7pF7_L]X2xKއܻ/ǓS.!8x>c57;GS[k7x*wLq?cJ \HOGcCmGsHbf7\aGF=@3Ǒp6Lc̛ +'`0)~q0B CzP(.?G46o׷5S Eu=}f/Qc$޿Nw:CU;_L!% {8Tbû1aX()crrR/&Ȕ?ihE3Q$49T/$HM^@B`ЀQ+oL1ފ>},;L~Y wcwlIˈx> Bڨx4"B?JFXtxb^v4HdqGԃG_݁( CcuSQKoS'Z^LKҶ^%]f?Daa~*0qT_ 2c%NVg]5-KqKl;4xt9~KxݓԉyVjrE\O>WT')Դ1``!DUzg9(!YMuMm_? çuĆm$d [$'qNbkI~ M*}Iy]='@ }3K\E/ɏOAU xfeܿS0@M]]?H h` WbxDS0(-I'0ʵ:sm 1^AY;e;HmE`:X$@C+ݷkB|&~f4O,{VK8z1!0IT**ܛqukiGcôyn|7# ,B  |H)Ws̀z !$Z[ӉM` X!fh6y`kzgw{A#-<~."5Q_O1'beH)gCľP;R!H7D~GveNh7J6g[ři4.Xz1߰Rвqo0{Egh@tKơq~Fm}[Dv%ZgZWq}GEо# i\ &669}62rV/)9z3ɞ/֖64PRJ+ ,k@yiҾ] WAؚkj/~'Sti*L`H #4mc 52B\5GZ5`xq(/o'y5T#$%f~(2'?#Tf2„llӞz8C $˟#Ǥ."(2΄8.ak/L3{-I@>= 49`{qiv$\# ЯZغ*WKOS(BCY,+מE@C_!_XWeQ #," c)v7`2}+,mFq&$ѣfu>&ߨ\BˡX-0/W_ی/ ѽoPLn/1umup\!Ǒy<}/vhR >(^,9x@&h`́ll}a(0=f](zaf"]}T9Ģ9YLi?E/uqH ŲOfab|'_؆8%'LJ Cf }٘`GQW/T]>^Y#rax^hK@iv#.bNsa r㐓p }v( pDn/0r\]HwB9?2 >}p6V67ԇsu>_I S=8#8{wt<CO&t|T‹y`|+la+]ޒAvՆO<@O~cGP[] }t$?M0?c0p#~}0qUUgr1#CK_QLB^H*kpR8Mn?/^A䞿`=Xn7kAT䡾ye(EE~Nۈޤ﩮z҉v!'':R4Hb:{,'"}Y4Ab+ 8շ(LYaJK4U{ߡ<51d1!CO{CxUK78i Sopo8İpl2'R#D)Pdέ\/\*<=k}GZaT-P nyY2I)$gS;qK{c/&Gɯa;Xq6WxÐewK-E9 Ee^>ChnnCr n[*Cg=κcD6Ȣ\}˚+mj=/ %"ۈoݍ>!>ą!]<&W'OC<dwvohģFpu[9R;xTΟ#7$ ]8~E~v9M3ԭ.wACyԴԱ`7Anm2i,V 5 Uj{BQUT MJ5xՑRK܌h֏0!k[U /EJ`iWtׂx[?ގs.\SA z@xk~><76( [ipd\oZ3[#I)ز{L|d +6?03ʣ/7ڦFd;)D8![Gߤ7+@- Dܘ3GE 2"̉¹`hj "ob^Xy)#]v."p;@S}Bpޠ!>7+__YPг6ǘ0E+e)YRJd-MqgSC$c}EٝK+p^'BSSY\>'ytNKN^.|(TuMϜ܍1r-c-5fZYTac{1n~~<`50##4^ ǐFwzfGH|3k8 ,霯ØW_X!4 I 3Kb2H=V@֣[#_"ـ+^v`A&J{5 %,o%vh聮d$=A7UM Hi޻.ڈ?d_'j2X@Nh4έ W[ZKe;OF&e%O* d4ğm|1 /]R78J-Q4xW9d_2 R"ԌBpf*0pTM_}!'z@byE:l5(J/Kc3cBi]yq6e"w %u?z! 3HJU]:mƶ&Xa5;2ej1Cͺ2ΝgTUCG0ElAzmH!-za.APS M]=uF-[b8{.Uq ӫ> ?W犕4^PWڪ2~^_e\zݩxhF֕pdD5I/[]^!f,vM=J||G"yYg0i4/w#1,NLB i5m-4ՓRIGHFѢw(.? {WoӎmC(-AbEx W=+k9^3Z:$O+GKĮ{ざFdF"% o/mQ8eMd"R ?E.fQSw c%|oev~naenW7'6O9l_|0 ʂ:>|a8&TF[_+ݍ-a8Hwocð=e~hhkҮ ܶVh=:},V9ucV-iRs'=:Qpb+ ʇ4 Q1oū=N0q7Sqo)ܠ8))=pAY4EBNZnJ= INüee1\ȍB =SÈaS2NoFS:)6g_ Hqx,}j7^Rd[[^jkQG˵릎X#T6iwƍx(]#֕=o~ MXL.;97iGqykj tM4Dg )?3x,"e , _nExN kIy^9P]\H t؛T,a",-BBY 6mMqWc xO(cG4͔;?c94 !b7{!.JO&p!#"uu Fh9Pj’ؗZ;Ac#ET%2+(&s\3g Iw*N+!^c4*(ɪ/D'~vn*TU{ӫ;LEEUU qTU7ñs_&?E& (m@Q~ -KIQ @UjMUvAL{?6詁{EOzl}{J~ikkY⹷mKac?r.EvO :θo yTG"lije ={|cTԷ7&= H_s2OxR&{Op~M,^>4{$47"IąLj%]g*+рzY;vZ5 hɎXλ#uZqd35 ہZ=P̨04TϱF$^k"q$rGϋ;AE8~# )o܋+e2d G;RG"X$#wRrzS Tq+P_Ո n GK}SX?|x8MDimտ".t(@pKM/jr*LMH$ µAQ:MlAlnaƺfkBCmBlչ0`/jAW Dht 00,I9Pj_d5v{LJrw|1n>:jqZ1IsOk_z* X2΄q2ʻ_[@.nV4Pd}1`8Xꫛ(5߶Y?U70jL@dmF 0Ht[=T_>E$f.<;:bR.yp$'iGK?It.!wGhG F8q2N!ln蚙f6ރcjڒR08a5M-k1،kVQUi㑑+!QVM|15N>ֿH^vWS'dx2p/y32]Fh[{-\`چh}M`Fab2T0galG+zZQ\*.| X+<1ŹJAy شb=ey ؼ,?[ˮN`/ m1^ùʊK8`G#`d٣ԉ*zbQ&/ֺIyhfOhߌ $\!PxZ2o* B@ -٢׾ PgUuqn7NS} '~m 6 ե.CR?f#\Jٛu=p.0<L VԊuFeoY(UUUvZԕ KeH $o?^ cʵ]J~v5/!b_K{*ġcxP7s  %P5 AAnI| v`5Q>Nm7@RIR pO.A^" Q]O:OT3l pڗόB,遴2< IE1H+ނVFtzzRm@Izl1s+187`,Ll⓫:yPo}z/Hm|[ЬPLg j}wC} TB|)kOT#RɩS}oog@Cﳔh*/ޟ>DkK˜V{b} ?sQGq;In肹td~ad4J3qu`QC<0ǥ.Pp% g?ބF`COuX/O<@C[v}uʹ헱SO~~K2t(l:R'|/b*otƴ'oKt_)/ 6a ,: ,b&v =zz@(V?TR|".0:6І*q|E>ͬ³jth{өC_ďǷ?GIF\4 d``Cn3{;YԿʹqqoS1|=kg e5 ?zwzv MmO~TzfFҕ`VQ_Kh*9fb @Ȭ$=e+W)d`0~vYO)}%"AKX[aܣ+ad+LhGг* wdзW 7p*޷f9IIKd`y> CiN%~}AK4XxY?7<\R8xqD;D>F=%Tû:ώHq[0)`{oKH*3}g1U(+iVЊJHν~mf10e +{!l/ΓC̜yʼno#9؎@Au2 ňi mhȉry `ŅCvUR &fX*v@& SHYN}_!BA;wIK{i?,斋G 03KW63ՌJ" @]ʢ :-/,ځS™("}Y۝}$][M䈙rԵ01N 12pRH2rN 4T#' "᤼ b[_ohF/ҿ:7o ZBnz<\GxK?7!+ /hTvl@.UaN*\<[2RIlz0 ;sK:[0sqwld!_xJ!K<s=`5qW:pQz $|O6̈́k`*Ta29'M-UDJ8֫y}8}wQPy`=qmFjd̗\q`ķ{/'u}”/0nXX+ZPWT}ƚpp1@tmĩ#PQNQ 'qPH0m$/40iJ! k{ {)ueȎ"Bv>i"w:d(kbFE)!RSl(E .% R[xCLH UM8ƚ;ofNCG#b>޳5~ZF?ji4AK3 {IeCISy"_l+5w5Dwt!'@J0e̸s;EwRZ_X͸(˭BDRJDaZғʱqM(_[p!`*oܫnNJEQ [;ӱ(L·$TUWRmSM`7Y?~Bn@1\ǏAԟT_˗2bLV'r}4d&GdB+ISWDhR{ǶfR&$)d H^&/h`b=ؙ3^2t4#.= #?_fġ(1|`gK MuQO)4Q/~8%kWH}&¡I^ (Oa##Νā Y>::p H:J@B @KSOuԯA<  WS.!-uM=G7Ԕ qSf+oDUS5pj)ܺde8'\nr<#\"Ǯ$uB#ZZ!q!җ=hӕ{" =Xv'23؋#?U:M0y}-m|eVXDt+P^ 72_ hŗqnlq>{^ @,:ĞJEE<c $I:ZLExNH,veW?[\x;鿘z 4Hr=p$|yjKˠc";^03SҐ$S3 ;8Tdv}x~;Z_m') :¿P$5YZ猻2B|o1 ;q㵨).;Lhkjfj)oKE{7U,)enq-45OBw[,E,~g Lur4] AE]G FZ&Z0s_Xڈ5#/85Z:m7#[IRx/yqHRYP]z|dIk%:5Τ.АaՕ3YuAPĝ܄X8 ھX<  _Q(7e1K!cF=XHTladkhkY`?|mÁQkhc+j蠾;W3TR48!L<*rx~%CRAEN @4N I%\2+ueNzݞA]EW!.k_fyO knRc 5k =c?kY z-zʕΥP3l@4T7"7ɥ(H)E>-ehnhA}m +[:S mj$4Y~w6/5u]7{oK Lϓi8).ܹ|k*䶅TTHr% i!rlMr<|͖[D0h裾L++oږ&<#7.O@M%" ˋ3q0 z{7q WxDea^3]gǾa#l~iB ]8Pb2 jLsx.DqŒ~5|UԑtOdxlXLKE$g 3%j(z:,kĖt6# 3Ն1}_bbgƱLJ97 2ώ/nK3S`d' $k%u`K)zONt^0_(YǀnCϕi(N/B܉h *=*`5Q(h`y(\~-u H9 q$BF7J]w)g5y ӁА֖fSvwAWXΩA*3]v(-H3iv㸭7`n!r`~( l-1ǡcf$KRյ34-4E)|Sz hJƼ"x p!arH_6F-]_!| (J/ց*1ҁ.tZ>^6օFEu5-u- 5׮Z"|Z'JKo*T+bK7QSKyɋ){ŮX"" ( H{';.1Q2a[ݙs~9Kg~Pm]u8p zxXHf(|GkW3tFܺS0 m T: h !&܆A}2j1QpwxOy #؅#a{[pz 44N@Q~6@g8fv*W1N4\S$fٷ'u M{?"gsr_dGKLEhcsq9JP[ӊXU+Y.SzTʹ\9Š(Tu$s9L<\HdmR5օcwZ<4uxR]c'Ee` )B Oczf#}?Գ C'kƄ$?y(ޮ;XZH)@Yq_jA/*좓bjO~al`n%k<# G -7mp 8ywQ[U|Oq;4nGRX8zL'HNtT&Р[NH GB49d@CS=Gڥ&A Wfzf¶$T>s"vBv|&) CnB#UQQ!)Wr YbɈMCDf]pRhO HF3Bx? \?)! 7zܻ: =`f-j/$ah=3\| 7RTwet }L}zdfz 6\}ڱCa)|=zAX|uUƎ9PT W洺[/e<v7F! Sf-ޢlOHʌDWK}!5D?b@]; 9 (L2Ň @ïi8="" X Yk+WOoFOimM nݏsdǞ|ԵОlOk[7_QTBAuhoZ4C$3-GAz%qF+mˇKZJnZE=pvNCV:֔κ IGA\ k,-"t%/$͠\z`7TQʴ/8$rs[)=v}z4`$ Z2w_6Rߔ2r'HBX* r+U J;I'ÞEh`4 S!C "޵ZBR!'!y))'[99:r}_QBɖʳȚ~%).kjVuRK-LW_1u硣KmFΐ!?-9>byŶI h 0t.ь(Cԉ3{X{Rn%Kdx7Ue86N݅ĻL19Ak$ ﱋHpXb;v$YWu#ݱramľod Yǧq3;s"kCw(K[ vбS2jejǣ^0σqmetKWaBt{ǀ;%!&퐗s5gchd)^#mn\܎ԨdDCב)5ۂ( C;?7N=p}>V*S'AMS|lHqwK=擐 =r1g@;ld^+.E|T(k50@U#MuJ\;w0;g,u$j[¸ۧ l^6]Nf4yL>p*^& MNEgh @]kEZ f?dmB_BO/џ.!@4 s R Ȥhvgԣ;qN/!x5 Ӄeɇ|'?F-P #h W3WeH> @C~J*ʼn1e42o7/':虘O#[$"X&NsgX\B݄h6|Lx˱wo:@#F$n( N6ɝ.N¯8ֆ;S(,c$ާoLBn<sdw6@#V^ZH_É,^(!TAݬ:IbVrx.%\z:F,R )-;\Q'"D4e|*rƉ+iXD^d/t/.RQZ3#U3 `x " v,6)Ww_m!(-/ϒ0 7|v k%l_=;ދ$Ea@]"m7/sq.kphݝ\GR!j|M"TuET#VV)Zp݈*e/q%"2?xWv TWV^34 0`}q$A-wEF( 4T6FbrƼ ,X2x r1cpI 3NOc?]f .:/l^NýeAuOihxyڗl. ?87b m`} E3#]VU#Ap z:UVCNU2ZUYgY4ĸ8=^ f%xKYISWRW.z ;!Y,.Ķz--#:F蚝6~IvGo9˔ka~Dlܖp[{xAϔ2*J?g~=0~)jy/#yt:ЙjkTaG 4&v-Dej" X1(^bQSS?6CUi9 a`ãliknOe@Caz2b`֜䶲9tK{tٗ Z l:e&փ ν|12Eخ} d0qi_R bʔGKR=K|MavJ؄&JW(Jfjjk'K4,QX}dvxgw` dxL/n[/A|MڙaS1ח MWSҪuߒYH֙"I:BdɡV |K 4el4J?ZzZNZBMeݳ ,a}bIKeES*RG6=MbRKsX( {15cja2nWSu= ׾̘0twBr&Dǫ1uS`dj|,y8 {QN>S̥$|1~B}H_|0bkܤl\»DDŽ^ߨ'QS*4^W[!xÿuj)AL_o@Cg`js9L&{@H=Ю#,Q.mtgon 2 s';>/B\2ITW@cO³?v>>{@]K1a& Cc"ZyÛ$ U%Hfĵ 5Iҏ`l r?IfX ' |ˢ 3 xwZ_&[YT;8y>i!{|=1՗" +f ̕8<ԓ<  OЃu  2@dvn*K*~;w-`FNWFԋm! [%sf{nP] u=3y@IDATxabx *ggJ>>XUq!D`  MA0S51kvh4nC~EPQY^́WEˉ#1"MS,DC' f O1ܞ,AZmT2ϣSV˅N@#xP^\H8M6= Bؖs"4Q&iꨣn ˪^̏vmV|twӱ@d'ckü] @#-Kw@Дlr=wԕ ܏u} Rs?jreڛxn$HgË2>%>*{A@KZZb]# mu=5 Rv7'%YhjRj8~_ Y;RE]A脒 % FhP:7t hh 9ZLf54kr5"|BUm^ TT^ճ.h| lb]aD_c7"4'QoM=ꭶ<#><0̆mGBj|Ƙ5v2, ' ÂqsMQǘvg'syu @N ! |ثk :;}s񨭯 ɽYW n҇QȔ7Q/j%AաAhodKkERhhjv9J=a4PoЉ>S:3SQȚjPm}<ٺ].ֳ#fsRl$OG߯OLtf|3b3YG=@?#? +ԒuDA7\6mb">@WzKI*P;'#{hvǺŁd&z \vy)}>;RxU%e|u@05{6d% Ź\6mՠoīΚhh: rF8M*{@0ig]c]f*OZl^[~W">~% _>buCHSI vaNgL "Dⶥm-{ jD$^>T@r{e⻃Ooò O{>{%@gӹ56M SwY; FqCC(.4|T3퍧,?7e+[*Q@ܟzJlNj4{ztJsJ*{@=>Zq B=&/1+-:"o-<\M xTyuhZ&oFܕfe. ]MON@NxsP ZQy=/?:zxA7Z^%lJqSv3޻vY$?;ϠCYt͌aËu#(B Ry$A/5~i( yiɨ!;Bʓc8Y d̹h 3kg~4~TVegCν10KA⯓k( b •K7k y9TQ. @-rlrd%dǢ†w/5){rYZM+gxA韏27s0fV67HK)S`o󷗌_o%>]8Ocoe`颚G/t}7Ap uCk4ʕP^X;2cw#B(geCB FC2 y\脪 A"gD~a&y=7LSnwͭKMƙ ?$/F"\F2dMTx=m9II TԊhYXB_o020$qa8B>+˪iYh熡] E&2>ΗTO@ M! 52jmv x#bx2M\ C_:-^;l>2j:'s+=|iFkL(ʸ7{()Fg+T8_l FhށR %9q-+ku9 j ]j9vB_ݿյP]]5D>^F&Hs '."ZI[1y(./TkU{6FV+ 2K`jg2n:0>}萅01{? f74}w `JHy%Ȼ138p^&I/Wn66 m`D[Kllg|$#+:ٷQj$^O`5)"FY@YGPAaz>w˪5Ls4'+Sotc47:2A$& D !97kTn P΂TV4 2w%,6 Ut|z(L`Xqɪ2fȊy|潫gʱ3 rבH[kj`e8yj=rsʭHJ?';N}vJDqfrak! CSuےx h%/vVU~] }}o+:51 Js] &^@5DhA܈8$8=w G.b ( MX .}3ȎH^, Ծj&KM­qa<+7=|P_ܐȦ@\d<eDaϦHVf7Qe(,O2x{ϓ#VBԉ\zx6p®ocA &P2s=K\.ENL"+ǎG. +˵;9<\Q%)+gc ?3@ߧAS|oט(ѧo"1<ٵ6a ɽ;@׼ũGZT4o߁u{OIY ^M-KVWm@?QRSWv#)-{x4>W_#ŌҾ4prд*~XIGkHi1^px-ޙY0>JZyMh(nrrmLAd;h&Nw{eE #/ۚcHUyn+\W0uɡ M#}{4mb(j%5M XurgebPJ5e;dp,~(+d iؾ+ qW?z113e:`AXz,cI}n q43ʑ`xӿQh#@ź'~c5|mށUvr(a4 1o1jPVZ]q2f`cɓq7B:a8 ;K.tC\v.^?w9"'# I.}ث4 pi_FA>+VF-rDkYfAmxnz' @->zG4m$e/PG2ܞcAǔ%AraCZX4C$g ( _w n&a R*^C0mNd[U3!qh?Ћ5x"@-TZ,{ 59n޼5JWЕoCcPOXډkW_ɻ+ ؀̻7&Bݠ[V@ѴJTug8 MQCrқ3$T%MT;M5uTd[  e"Smj u}/7X͞:&ea_l|/~!4cgFaO}dx̲0>,Lܸ 䁠\yQ9"Łw1+_qi9=Wqo t҅on5c&-EȦ3LʝBRyQ !VUɯQ- Wf_y\"hhmE_cF/oORF6}s 2O{mI@޷j犉߇ܥDé8hjC:1bφ5R*&{@?9tB8s$IE~Im,#FyhKDƾ?-EVL}o/8Zp1:MM=.ʿz^蛑]Ĉ + &4?@$r?I"2,'7!-XHaZ ^(Mܢc;S Y=faV:+fPFWOSO?MY!A8tv# hk[hx5} Mm =-$J:(/*ĩ߾A$YͷQ#ٕ}*Xsn]PUWԐxB.uy@mC!ri :Y)s@Z7^÷>DZPH30""ee毠܃X=0pVcԏGx14"$@2ZDGOЗx+nPJ>> 𢙛cķѱC2 ~;$܏~Ҟ@@Y)&l<wBN!OH }FOj73&\d 1Hj,)j9.'![5x~ϖ3䡑cИzWOcGcH 5t€Ǩy`OQx' q(]ںz̟?:fF$_x0,Lg 2+AC"{@hc `R!{a6ڃ *@-aoS(//|Ѿ^_";>Qo FCQAοUi5i_ix * [q^TW+L@C5IG9)D^ޛnM$xAZ1 \#PFCѿ3L<; FB]𛁒czBm"˘Za$a7hXeT[}!4}$bڮx^>f$U&Jqbt@pZTlI 5UhjꢬA۾&UM606gCS[DUDtI?܏;iwx0 Z̓4u c>ZsWgO;eC}qr?xlmT Kak}j'tO98uȣI5?:zI?n wd5٥&.&$5$Eo__+ ~141áXk 9[xz*9-`$-TK׹#Mׄ([{ryaAEglPl=9}EJEV4uu1=b/%TNSY.̭<3U8Ђdxݼ0IB)n')(iz#Guu-h̆ k16AנEbks+T\egt8wņ ' C ~]Ǐfay )8d%bsBvF[BǣbbTM*F::\LOӥ$;Fpl`qvN\ 'NRIH(5S3zoCX:?[OSYk;+F6ݑ>@p7A<@)`^ acT;.Tb*^Cз1,=lmi=p䛉ern\hZ_CK,.e;Wm#g13f)MQ]S}83A$4PYX8`QlVh5Ȏox̭0|".V&+~7b(TהgE;Gou'_i-jC6mexo-Q[U5;qQ^PԢ5wpί3RT|7a="/U[_V`yY%O/2JGcݸ}3_W7Mhs) g7]g@cb.#$6Fd| cPɲmuWO]niHoGrD#jK!Q"~KQD.ZN8!5*E& i-y)n>8؎Kea74c*B'hvnYYJ8` 'ww_, frz@=bm튧=ǐdણY + "f8;BUnʑض3 aё5a3C4־o_fFZX4-ZWoY۩޵x6?eu@1M6;ZiPVe7P-;s !&Oi6er|9SS;Cq*^j!7>>f ~sY%v $堁]qM=nIv˶=$ez:j,*,".g.;=h[2J+V>3}jh(`}&@7qjvs0t"C:BMm5/C*wĐ󸸓wq|O$[ = Ӆs ٛ3~ ?,07WuKprcB$~Y7#שV'@{͙^*Jp56~ /$OK 477@cٔ"On%ߍߘ5v2FzCO@vc' !\>gGąShql,8vSP;1,JkDl{}=cNje/Vse~;0tbנ =Skp]Uk)a'ʇtaΈurKZ!3\zՕH ʇE(ڷLSdH4|nL`zWo]Ʈ?!'*4P8;{cYQqz"δLH'o|ٛw7B O7l?THeмWabGTO ~AƝDCT@c?~8Gܱ Z9rEKEyr2'nᏱ/td%cm[mx0Hd34!; uXM( baMT*+jX60rʡc_> Cl$\afF&b3zIA2. 5OI&{@ V,AgF1+#6 ^9YM;@MC gRC@=ݖI YلƯ8`4ťtZ3T{FO׈%X7Ր_'F޸O*4ЅpC>SS$٠ rH?ng)Q7pqzIv55ZZp ,mX^Sv 0d+1*N‘7DCr)->ӤGH٘ l&)/i*[O sNb@$r3iP+iP)yIM7 ʊRA2Th] od uuq g֡iHThoO|7 .F_m>3_}[Ek+|C#権ɯW#>_l|R}x v x ۸Ao|̜2{:CҔ"bR+uNđ/Im WCK~O>:,/go yx4Ė܄H/ ;m1x~=\UTrpyz¸} c(a( "ݽL9zz0pYVrrlYD\~y\ĝIDHu|UQ)ҼJfj$S7/SS{::b5(N)I'`e1*A~8<Ꮹ-:ujf#B0bgwקnŵsXt5]{s9.U6ԉXc~60Đ_'ecTC=4kohmB<&Hcf]9Ns4ǵ{9VC k_l;C9ܗWq7$d}x Qy]?5$Ar Kẁn ҟ{g,\udv'H{vuq (w**P@il2F$h׍ ֑c+,JPA^sc4 4P(R]&޸J2Cj>HoY!0A :B39MtF CTUWȹܛ@Xt؟#dN袏8t\ Ƒ՟0+K*zƦRh꣢W|tHcWZ[2 gJ+pqDlMiQ0$~.vDjLyٓ,`Ӳ fHm WX)RXM(jJ̭l\0;nkW3O#92C^ dkqv{D`@_ ;KA '8ےsй'%]pqs{ذ p tfn?wy({K]KMTYe^kj^[5(H 3PEQbx^z0hMu󿱨lj4ߘZr1ϣ1v]SP7= #}zOI$e75t*zKvڀ s+ {Mې"/GW"16=0iKnIIN`~eҨ cD&j,WhQ52Gh2l|oBWjkb'k콬ذ: /MޏZBk}j$sM{;8v.jfwmM-lafnfl Þes}3Rq[Q4DQD?N+d AS6L9е0af(gGR^`l2Z(kUp7a>f>z%3LߓI9(9a(e:96<'*J2t&`lhIrEK~~7֧ DSSGhizjɊ6?w9@JtDK%mm$rCCtHIFWTJT0'=蘦 rXzpN_[/̋_l!ɌKg T^Jũ+ -綄;R2ɶR&@+}hTw_8-ʺK f¤])b𯚺apa9†ZJJS53񱦭h]:f>~VpJ CPD6%RY=Q!AV5tkOfWbunH:nTe}xB1l@ïہLkMgۛ Qܤl{]Jt޽f')< v|pwU6Xo6xc,v;ΟHdEP ;9@{LOB娦P.m=zE@CJFͥ-QʋNN =Ytrt5/{'`hCRテgILp'o '.F*PtNXf>ʸei8`e˖G =z¢~*!𕚆|gN7"?h {4}]V-K!z“} r0b8f݁>hlS!zxaD{ӟ],&sb/7X e١Jd!:0L]8I֡!sB5!㊽9;]YtSBt`k4TV(I]yeE01ƗF`ɇ})pG-xhH f8nQYp.MGQ(Ȭmͺ:"l:ܘBI}Zq奅,VM>Q$3ui[РMt<=0D\9.Y#S+6 'sy ى8#_-7Xx] 4|"t.\d/PŌ}cDڐ0 ⣐6:!ɹ>^׷6gP;ڄ =&! 86ẁjxmAd=w~ 6GK7ky9r}΁^F*-@S8d%HHOH<dJsn`:!["DE'I_ n~G.nPGl<2~*k'tNrM&f93? ;\!)Nhh}MZ7j}'uC::k!$ J s?9p_#Ԓ]ߊ'@n)lZb*]nfXƹq% ώ؉qJahKS82ph˰ʒ2˿}KHaݗf[u ![C>)kª{"3?@MC/Y*{ X=grp5+~#4߽vc[wiGX =ܣ| xBRHvjiv S2fl> B@H{Y4===DLeD\> W/ȮDQoݨH,p3mݤk(5=?RQR3?׾DJ mEyQN gݯ "[NGk#GGnEKo-!λ߄bYWV.22K?gB$3VB]Nu82`iH G^6wԼU h@<<s QN#=9ݨs""utsV\)qw354A7b =\ХW1 ݜ -)/mA`]BDEBAހwID rS@c\:a OGpyo$1hM6]Cm<(\=tq,s(}1SlUe.J%M5Nfgvfmg/;K&mC"F۩hdqv2&kL^+N_v 3$:QSY jR[_yũ\HR)*48\ +)D-Ii(5\0Ph%B$yNf$]J³jQS] PVbbid'-:./XhhCDs27><F}>WS{g"/>hLD%}Gc;W#-)쒭#chױ"wkCg6|ܤdG ][C³j:F:~4nفspF٢3fo/`o DNR6ֿ3,)}u'j~ԾB- Ua~ ARBBfX8q]5ՕL C%&HFvv 4T.n3V=rӃ[15յABLhL\+?-dxL}woVOQgډ=M}]vK򔧏BC튳k7.bd1c[!4$g;VIӯАSO yc%)҅.Tӆ*ب' l`αA2R_3Ⲁ@IDATCeg'uhP4tiދ>½pEI>ҐS_%hIU3gi0%9й;zMyNƹ2Td5a猩lnr]24ve`瘁uh@E'|<fO wgѲa-]Jvs9cҚ//(i"@.1F&:jw3 QM.|#/-yͣ7fW82!Bo>ۃer5e:t6RlV0˫' $ qE \.Fטb꓆Sl hx@i_ixy裲'sArnţ'W5t0QX*Z-R%`yMt>㦳u(7qpof{I*TuR??z&,w"]D8KM-9ҩ3TvXW֥lKò F*;`n+'BH "y: \7/DI]eFAvҚhMG)Q )P^5 am*QwR=V{2,s<]}C`hot^-,XY~{sWϭϘckz kGٚ79u zVrEb-)SB2YCpwgmP)UF56)Hz}&Kb[ lkh'(,9{NmAJߟٟh<-K=\0E h+nݎo?Ei2|/Zcn#.>}8V  )N\쐎<}|ߑ>A4۫@ÿ}r1l,AaR*,0|(bod!-#Tn})Gx헑fo'$/KҊRw| 3$მg^Q{ie4 KȲ;T1E¤'wJyIo7 :A7j7ӛkZ2޴hցhBH9+Ot(NF4?UT ~A<  :e Q#`'al,-8:K47*xI}hM%3o^!BaԵ03+Q8*^'Nkw/p qDL~Y~UOTЄ=YS0&z;|id{-e_< 'Liiǖ7뇶&rmy zW2 C זۚD~E4ȲÇ(;u%hs U'x"WS, ?ÕF5z8^r33Oi} @e=R>F44VV t8"8D#륻v(O44TI{MU&Ѓ^hqVvY| ywswBIk POH]C}Yq;@]wu:^ZP_\,V^4cT^ Nm}qG0tHaZlCD2T=zCmj M4?RsO|VqKՔ\wϝ'?ù\*WP%zԉF ei&4^6Oʾtn_|(UHy/3D}?1<`*#O}M -(!z\:+WT9DLҶ:*7wD=QJT=jR4< ޗjl.U?P)wa5@SC voa6]V=0"%,;MWizHD8WkNjDtUo=Ϛ.NN}I~P!1,4b?aImEX[O$}hiT{Igvei^ {3cuĦΥAuPpщ̔pj})} a(: 2Z"5Bs}]ͽPQo2Sqn]]E*Ř2Lء\cD2"ℌC`fz1|/|W"%2i.4m,[]R_,>ً{F4p105EN\0wpVW)X).,]cŌ-{OaXL22PQZ>0y=l }4ת(Zrϣ )`+oPV-f1PH}>ZȪ9¼Op1;`ͽ(YlJ>1´uȍ=({}c]tLX5JR}:K؜{ʬy9}P[\?xqJt*>BC2ڃw߬~`"/?/@mTWƉu v| #ѿ坥|!cU[Uw_+庖1fzhnη+B (KT u 0֒tګvGl ՅEiwDE&mF_d#[ϔ #':KH ŋL,' IOoSs\Sο{ե#Kˎǂ<K' s ]?\Ȝ39w}ҳyOQ1d v2bHv[.%,Wh1`pp(-|8N܌?6|ZhUOwYLbzU7 Ep_ٍڼ {ޥq;LEcB`~v{ai"g$Nb~d~r 9Ѹg#{ɹ0|zFTKGbcX\L1cc2FvA>q0(QJcLH;.C.Ry%J2(.KhP`YK^xV(o+EU B3@ĎDY2Oro\XiȻOZQf`r\JhPdZiV薾)L̥#Z؊2vԯ 4i,-qӢg8EXB2!#QєS3V9K jZaĞ/!t9Mv9bc/ qv ?03G{}0oaJ3co"dz|=C`je_=&Ȏ){~ qizqODbJQ]z~e0o)ΜђɳAǿtHEkpE}@:{/4{3 nBuk\9=2 m%U&ZT)\&ҩjKJBSO|l16DJc\7 ҜQ@&*)DM 5Qxp6e>7|κKIf%>gX}ҧ!_+z?$8" 56#a^gkkv`@,PYY_4Pk x7Q 2 (OyIViiwF&Bb(Uu&{ A~4BTu* o89Uyv޸6J懜QعMǪl{a'moIOcR˿[`a_̾4pRs^Q3Ҍbv_*RYL1RЛ}Dd4S'O1qŒo睎OdhwL ut Zbfg ;O9(ʯŊ%q<}ԯcmғ\rbc >'' {Oܨ׶$CIZ@6!nyҹz-KݓWWG Mu(&9{]4s^A5:*r+:Gݻds7}洴t0s8-PP:ƞՓvϒ+\NxEvL;^mQ<Ɩ(NK"TG=2NJc l}&syGSb@\X{ s1lPzd"?&@Ze;P$MD,Z3M' ّ\(?ZIBkW+ƈ8r RAB\ҷuMD]q9|OQ)BK/WrKiN@VnJM>F1EPm[D ue3[{U:={cZg2!P4#9ɭow 3+1ݹ<_,pHeN*+L̋RLKI#3R)PYߋ7Np Cݫ"D8If7^ҷ[HhSFHb!Ę M=Qڤ2s ]Uwq>!X| KٓǷtzuZIq㷷a{G N%@9`M_Xio\PV%xX}"˿Ry7*I>pk0.*m9{+qp;p,]:=246Ghkm-4|7MABggPVG7_^8V Ҧ`Hak]u =~pTtTբ .ٰ=Df3N~%@P H)%[q'-S\ 4W& ȋFCe=O +4I3Qաݪh`QScy;7Lt cSJwΣ`]GVquݩ7%BJ>w6axo9} 4z#(x@1 ~d Y_s!%,G|`3Ȯ{-x" 㟺y؀ﶠ2=.'%nJGv  GD})\DQT9l lLhkoخU 4\G%){Z[۱oւHJ>!N#s+g)s>qpjddC&cJM昧!b&bG`)}'M:: dAjQa3yd \BUDye6j6}}~{Ç~D3؛yh+O ,]w .mBܿQڙ+]8o"JgcO jO~BQ odm1z$ˏZ/@u~!D9 I8+IWWWߛN)w}{rze_~u {b3GWlC‘Lj?XM4Ipo΂G 5yR"BN|&-r=Osk ũKj3{dcW ]AB:T훞z8q0,w0%?>`@*zЖ_U\?6|H;"%BȇYܦA4tv 7 XZ9Qd2p0 .U'L@)F.R0i_Vsи9Ӹ9 ȖzqpMpTdWF0 E+LP^% Be0YFSBxuLQSR aJGxziLp4AM .콭t UE4t|w3ƴIF ו׊< 9Nόr4<-KbB$;$-_00" ܍3lF}>AJF)y)}+12R DC<1.QN#~Y+$p7+O;+T 4*]1y0"x}L[/{,y]x.i`+ge{K>srO-(Bަ^ĉ޺]pſtUW.0fCCxwz8{4\Jrlcc ^Da-,;n9MDs8]7+1 UŻ4 1f=$LfeB4\lP{,{.XH)7! '6.fXb8 ۾p>gغÈv&DH|8N^nUm(\q;(uVHTSq^9ab3WS0[[DùVY7"tZ,T ,mMpR* \~1v5E恘}?} ,~hmRgby 8EDV|\ Adgi?BFRoO*4},P[{|S'GpLzTޛ=m_B-3{Gx+! ,A7W[^=_#x 0 h71Z$A{ ubUm0I")u3a(%i"6K;;GUYr˸(OFcE5rI!L7Q&+Sxߔ@AYNB+`M Vq:PT\A}[BJ.){F +oBk]M~p&YdL%sV [5qU+ +5ѧ}ѿGv>Ss=+39AȻeйc:RZ:Ќ O~R@TJҕss 0MyAM1r%c7?7KYsvJƳ5n픏/k_E#88VV=UM&РDêo _P\%Rb`hbK'%Sh#nCėRHpjA~R,"/[,%e*Ž7"FA`C-)R'mpZّM q=## B0(K#g ,LJhCA9h"dCڱ0ҜօI_3U 4tuT]ԒR"GYY:l髡9oJEn9݆DԦϫ>q*lHvc8\Tݯ.}m ,Z0vNvڗw pB[jD.л/iUzhv32VN}p&lIRy!.w}0P $(ϫlB}UqnO |A2Ϥw _qUBMJY?ެ!%u4~3Qړc+[N-pyœoMQ1\9`IG:CBotĴX7]G]cc":u5fiAF<(-DNZ,윽oo82vy ,m5x HĒPWE&f CeaU6ob Q9IR&I[ގ*:jѨG}yU73#:#s r4$0]ad|Mbfr 壪<(pI wjT)`d?Eѽn6%NH8Kid mfbcu] 4$lه Ӈ+]^>o{W_?Zr[ShnBE~ tp;q2xv6 .Z|WAT2wB|DZ%dx=BFuj6ްQv GisQ@p&`>ENuN"YK=w3nW97z59Gr>ޣ5PEEi˩Aj u҇\rg87x<Co`LEsS=9#5+` Kwec_@ʎ~$A**aӫHU4/u9v48յ y 1+['/c֗s (0ب!R(2J;8+ws OF% 9qE68`S7N4.%DpE7:xBw9LhfoD 6 .7uN!u1MU&>sdQ8q֝́f|A |ƭ-|8W3?݊8`$qun0̝KUjKJyjmRV..+q30GKLTe0hX݊&Рn#zYxio?H\lhj"͏}_֜B>tO P*r`Npv!r2()큫2g' ^|q7KWW^MD91Uv Z[[XB@;:Ľ[M!bk8NI/f`ӭzpPݨ.ItCΔ1;KѦ:F7pYo(iaĜݒ~t{6i!ig\h1cEAYYːssI>4iZQB84f0!:E!6>dv~< l0'x}!X}SxMɸV X$Ge$Ug7<%5ՈS;0΁ȳDZX 6(!$wQ['N#Z[5ַ?.n(#$u3q0 ICjz@ҝi'*wEo+t^w{m~+K.R&4)渫{9\ODIf%@W`﫟= 4Lη1CkzokG9DHe@:kitueۿStcԔ O-/O'Yâ $kV4u+#]]QdfRjFjfh$KfeSoU6{PbJ7ّ!zJ(pxgb [+O)c'Kx#`Ȇ9 5qPǒD-(I2Z:ux)DfYWSkC"l/?h`v*OLΝ;anOdj CfdO3!|D:tA @gbzK䞈0Mo!V**?f;D:.U~$47 ? *zӓ@C,l~:rŤgK:HͦE#N *^~} |jE?ͽS0rt)]]]qwGmU<8Tz&Р;Lma KPSSJH^ȦKD$mp Q|$^׎]C T݀hc`7egHON`3Nh~MpjA t/qKC #R: HOBTuHsjD,G/Δю@CCe5ɿ_17w-,(uZU]Y-vU܃<5$]إ1])jO ĢoCЬaDPػJ3YF0CTT vł'F-a>DDǟHgLZBK.ZN{t{lOf(;XR]&Р#~Xc(JJ@(J¿t4ۇYQ|G u(LEaJ<ɼJbm#{x!6TSn!Z) Azf΁vH#M5(IHۄBnU-I,dl{K+| Ug Vd`WDZc>QjP3=q["4/.Ƹ;' |W 4rk5w^Ԉ +%m ;{s3 )qE iiz&} SENC(UbW m-8q-=? `i묨E;wDݥqØ!u5="_w8:П,d0sbPY/d09AU ,YKD{JH}#{/?z@NG@{mo1qɣU@?BnȢ`$6ۉCnT J*t8.~@adkI9{vl; QF0z"Rn=]WMlLt0N0q{rŭR@*8ԋ$#YTc^#clŁSkw[ 'NckSR)DK]Ms pp:=[s|=Rx_dOb޿`O!,'>l"54oVXC}Դ%x{P\&gb3΍U^ jHXPX 3go@UfHC !LT5?<um>oŸóO!7.lM( (&Io'4zzi ݿTfc# B7ECc5** P]QS0&2:TbdbAqhAPjˊy$zW򽡙CS] IX&2O9~aT XV8*I/I mh:\ZFg`iA!܀ʌ(?Lmc\.a>~hJCq*I0 q8\Ws}#H7Eتuhf?q=f<6ORUάfmk7cTY5ۤ@S] ~uBa`+aa,ojg& nx;T(,Iw-MFۅcY/r@IDATeU:FV}3bB{>(_P]AGoB>g 1cnThј&^W69>d0N `LU-,s=֎(NBKc=Ϟ@ ;9QF}G:E69^3IN ;_5Z_^sD.Y$8$08@c4*PC :$PKa*c;"q)!mT/0y-M B6$$>rTACF7F8RUhRm"/eOp–}8("1zUgHcwE-"H@Kߝ#kEiK<܆?Fᇧv"dIG''#L{hn]R3.4P秾'Ŕ" ”Md=֎Co|ֺ8aMOtSǡO?oCbܭR|QzRD$N ~ M+/ũ2F dMW5t=F!uu(#RŜh:yT=aneO1@UDd }qUՋ=IڍBUVs"a3CTWČ,<4H2W-UmH.HvGCi h`e.ŕ>S'[n"Up$,rkm rL2`o@FG_[p6HC}e#R&bPA {~;GKd2w8SR*# dhoz,/8я"Q}mp0@W7r+&1L5K(oO@܁tl&,W*/u8،_]"2e)I.0IMH 4RnX ͞#åhG &,0G9bl.$K<i01Ƙizu-C3X[ d.S@:}уhhwCjQ6l=Tnvtt &RU )`/T}B&\['Eꀍj[wdž9mmpM"K!d32#)4WAz*E[OGBPp74V#fWPIO,w;]֐8qKxٙ 'N^ u0(MER{?U<C\L*C%{},gTF$)@M^1nEgQEHQ!wL-4c49ꐷTt!u cE*]#>"ިh^+k)Qm-Ko|VP$ $t9"a:/B2 izt|}I@$lYp1G`VB+N”e+`BRY0"d2Qa<!)&M ffF\h+^EUb;;8"(7 nUsTbJ98F$F;ڗ=}<)hAQb`u L0S%8 !3y"1H[Yƪj50\` m}=)Ьx+o7R)d>s3q3؇oLŗ`uv:20уwDNACU#Aѓ7y0t Ug.>Ç%ԇZT䖓"M5I& bH(&M)= 1w"$WY &1iy(hiQ#mfhv6۷ͫ-3E<fTE/x":V7:6xL- '>AY[a҃JNˁqjFRi!-(pjN,JMDtu4oB/'lwVV.jshq78G DHnkJ=```_45H My9'}T6 PN BA\=Ŷs\P CLjJYTT0! nӯb'R;kQ ^Ǒ4&%Zzh:oa*)Sw1z$DJRF5{_I'Zr 1B{+zh`;ĕV @&)9?5PUPIdU/.'Iǥ@T28yCʺP9_@QT4kniSniYqG$N~:*l\\BZI&M*&?]a+?GiNyEo,C '~.o-,~B$731v̄AESgVa$]=zc$+%iJsRcy|5q’kR̳-]n"VeҔhǾ3.@^~ 5b;3DK Ĩâ61%ܫV& 8^˵d3~V5iʼ|Dnڊx":qO,WA+'W$̺X}hn8`,8*lXӭp v?49)r/3_)T03dEsa!Mab5~Ü.%(ND1ϷHAc}K[<7(IXW>~͌"|jm6 RǸ{B8gbF:,Y eߧ0aJmstl*Ա~!5xe;$iȷ> 7$~UE8b۟ ,4կ.3.,T<;SS j;t)ߙTh 8rt=ΊswYq9ORᭈ9[Tw>@R)Eqe7BX!)AC1}r*I ?+zzF无:\`W[g"tAAmnbS[?.iR't͵CKK<$Xؓb (#F{tdڲJȀK0nR]5\;d;)ؐ2@ F|&R<^Yu%`1uy_Qu8 }_mŪ_VsxԔ͂xO%Oԉ}hl&*f_P)LiLLLB|(H BF~arW&-KIB0'죑(MHi#ܐr!`H߁H+ǐ[MQc#8Qldw7GUUh2k f[s3K̸~l zkr8%%Vv.^Yک d_rv+Z17'y8+DCGiG{ ukkc#v! hED^[k_3쎿,Dn[/+; b`fgvrk \Y;])EDo!#VFeYmR[= IlV-D9!*PM$oE}ysˈVqsfS .<㽿 4],o pzru0zM6Iepw|/cfH6OЍT%s@w"^D$3hX wE @I~C@PX 'E4-6h_bN7NK=I)cbnc11=9]j <lz3[DVyھ}jnӑ[OYT6@T(*X? Cr Q_Uv2r{xe"'Zٵ@h|4{끦$)Idz҉%(JNSMoyq{b6*Fb @x8 e!?˟˗t9ۢq!}q=eP30-.W ffviѳbN$sDȋuuwG?Ly#t .X֛@օ5o4<1|.QS[sˈ9Ko|+CAMD&~>[vzm4C ہcarԒŪ I71!̕B?Ìjt )n.l3x.9Y*67Ɣq|!Xs$㥩T{s0ZcH9J䁩EXMpneL^R1yt_ODq0ǬCB #8]`㹶v˂ +쀩&ʂ \P.;qz$RID>pi,0r¹}5X"vEf wA=#a;,baʵP]Rp/ƈ d`Ň ϋBݭvA!"ODGA3mZX7t=Fp\4>P+` a,cH"\T9)ػsR;DIGA ` ;v]󯵥eM&d˙o? &Syz M53L*V|yGR7f)ڄnA4tS[C`w~{$LX6E-S):!ӈ웟*9Q8ŷ?AR5իz1R`n툅(/: dDo^AMe |}b;:vkuM)brYL CԨ 4TӉlR88XЉ3m [Tk06BKs#t DsM= 4p'7SDŽ#n^YlVWUP=F 3(`@AU(.IoEoFg@sy^5~zvrbeDO<]bX*?=;'I$#(I{g+AR:&"U ފ!N&Р<6q`0P XBKP lP= סJ{w׫yq9"eМ-9풃\A@~Ajlc/=CϪJ׶_C}Y9K m"c9k>M͹q8)Yd%Ga?_(]E4xa'7|P?#o:@"FoC^^ W=meY!c45P>(Epe'6= 4 iѕ{eVS}LB0uÌ7I(^!wQ!cսW;Eن)G"6Q&pe/2 ޯ d+`OTy٨$tCKCqhihԒӶ y{ ڻ98p# {% ZkvGCMj )'rr u'9Uo`P`eqj!?F#Lls?)RZe PM)FN}9J86o%d0PH+--ˠ@\KP[8JPpsrDwL -:f1캡 4"}?&_&ÐY%kj(j*^`)S= 4pc|s>O[1d:\}| [x:#$JHn*~OхWy֭A,}8ӽmU"q@vL@7T׈σH~.1ρ]K "8vbE蟣U]ޏZz):%w?/rHKe"GѲK[ ]j?eVSe# m,) X]Ґ<@2>Ó'!BXKڕ&)1tBy7ѧOęm?Ƣ/+L/?+~Y%lisj!g@? \|݇aй1& ܦOQ`}SQ/u)DB㋆*l(>o[.c9WQ&ko՟8#Y:3!M )KOA&x }QGYܰ0s$w9PkT_|8Nxv]J?-a0}ʥx,0zhw:͑@ZDP"sPG"z\iMY=NnEدh4F Q^"vj!;*_߄z4':Uw_EgekSV<!s{d< =#c|S+ːWUo#bt!(wE)DsI'(}^WG_(Jx8l7PSR{wEI݌.mՇH$qQ002q6L%qio{#8%h8XSlxO {-~6>P(o,\Xm15gM&%/zW9TՔ==x DDp霨Lȉt; sleJ!O@8Mo} bHn7ڍ:+']Yy.pV98^R Z,)5$쏁]cw ҶKho"mwQubQr%tAuA_."1QŨX鞣݄MұLDmOFyv͵*ҏ'qOG1TUnMƬt^0R#B(U\9EH{G@V~C Wu5$K%DrqDc3#hDhcK)ذuDEBn^3PUy+a Kz iHu7yhwGDGGъ =-掆K٨)_4U6t_28Vۘu\\:6<6]s75w@"PT1MխH>#p熀{$fZŒ5p*uu d; \@W'9+g9,ZgoW7?ʯ[}+K]%q8!vԷ?v]0s}os t$l*PeNhla7G}#/ιd ԉ~J0 :(+DgG+rRcs)eq|D1 зt ;o  C ]TZj$xC^YdP2Itw9.l0u7ΆO:s%nt6wx4,]=D 5J S^bpg;$IY^Nye f;&R{,[Zw1cixvA>CzWD{Qq1^OQƫnuwo<"q, PܶX_ow-䏋>%5)~[.E}M ,8k]fϿƭR&lG6 Ѡu-Fkk=)שfNPה^Ha).ӈ uU`?xmtg7xv[Vd:v 5ռ)Kgc_Пh(KEҖߍa1ڮ|&}OR]K;ZXt-KֱqK#[@#/'Տv׀#$X?SCa=9,$ߨZ #Z hR:Ē$eTT䠽 )(J,sa:y;JKH÷fHe!G[܊!3hfE%2'PBZ #,JΖĔtop#駊kP_BLQ b&c%&v #n~gɆXI<֧"e0vz#;FraPˎ1VYŴ+0s̉LwwG/m+H.ǥDJd$ -85-.ΑRMG'@|8a}w鄅.âvLJR8ƃ}n‰7Kjژ& vh  K7̼g`&msT䑳L !> k?mQ?2&Ne&}9(f8eh8%-&LĴiae劰-hlBLnb򇠡+fZzn@bԯ(H!RckgVz#\P}q # 3 $!cs^ vZ&7XW\\J̭D>uy-\w $4Hei%8<;;d1?R5[G 쒈uֆ`b(6Ka,ږY π*cۚ(k0N06 $&WYY uu 0ler.\\f55EhiAvy@HKirb撑FZE\ ^u]kBTIǢ˭YNwc庰:4䗢积)^)"K - BA;Oo  luM0m3_}enEu"?.8vpiLeUVJc0Qd]d`Xs2^G캗욳)+^[)B^l,$z~w?RQRUc#k6rnD4d>lJ{de`hg#Qh2"Hs HTw`IFS|箆̅9]l^H35ܱ~zzѣ${{{!FD q74j"[,A^F"mґ}^42 IXSHkKeJ J*OꊊFA37r>&/bdf3/gU֪Z4[:[(Պ$I}p ﹸƯ! }i%6xBEy<ұe&!HR6FЕe!-  #IEĊNY} [aD}};87-N 2eM57ü͏ q3X;H:vԧEj(b<,X?X-5.%3a1 *aD/ oL9V?>vލ"R;wM/}!""G4s,,,ϟGRRV^=d h8r8Vniniau(+‰T)44tQVd_:Ϗ1r_WT {r6\D\&#'JY܎#*%❎&/@)(0ͭHDCQ9$en3 f9d3D!Dw!DZw Q0*Ɯ  m ϜO,=`*y8{ 8g,KF@;k.쌢>hbO`r?9&!iA0 g15t׎&|#tR;XKFc3Btt?KٳoO7}662{#C.+GÈBCCoLMMMKK AAA8s oʞ={0g^w|` C-=ܱMq~~P,Saݺؖ_UIj$(kr;6@$uU_ eU{x5(IJk3*DEgi~ŽwJo6V- M*ʘs8b:C5ݫ}5^099Or埼7?IJ{rO 3ikVVr =~HvGYH._wsLÜeH9'4W1k]p ێY;b}/Ώ?,xy8Hf XYDlȏ4/qUjh@չyD !ӛp:gbQ_SD5bq? =WRԙ8g>Vw$ob9[fDsSsz۱3F<IST{`#0*>mE{!<.PRe, =S pFI"_PzS}1oKSbei.61 e70y ݰ2hhPVtuBÿ Ü0O<<~a`Q ff.\uuujN O\ʊAIi:} BH{qu _UD(:'N~ZDyikhe,mn8=6W`1YL*Q{UUGΒap} Wd%?3;>+rκ[f 6]SvwėCV[驂ݠ J"8ߟzE~yH UHT)jQ_]}5g,_/6A1e#o43gC^b 5_?¹Z}}\aGQd8 ?Gsuram/f:2aѓ"4 dBQ:LFY(.${Rp hoǙNh?a?gg*va'& SEaR>G@_~V,eXj p#'j/IyXG|k uc?~joEjqdFW .$a0xdnQ}c5;y {bJ߈:qa߽+m)7`l, d?f޼yx"9Ju4 &{݃~TI!-7璏t𡅱 Eqp{"݆,\GYAWn!L[Q aEYa2P{ٺ ~yqb`7͏;*3ꃤF=EA}JsIaaQSa) ?G9r+RFMQu!NT@]Mqf+Isώsc47GE͓&B;@z%WƴWi^Snl>a ]6!Ň?= e u=K3 b,[GJ&I^EfDٓMij'hx`^\%I[nW7Ku:?ޛ8~GL_pl]E+0~Fxca?FFFbcĎ7zf 7n~ذx3L ,邾ģ8x}45!nv]e! ]7Jh҅Srcu#bXzY x+p .xi*Դ9qBhk9ցv_;/)Sb#`KhȤ3&nHR,3P&6*&X9ч΃P_R؅-\`(T ORӿuDIqi! IWB% 㵻^ū$ղT|J=?5ZD\ ϙ 29&*+KDDBMM ~dm? Z~r{w--"66Uc=x .\x~GGqC Nyn<~„2ʪ Պ¢K\Q ++Ex]>$==]`֦:d! ^ފ)\[^@u/7́'|sUJȍBGcAUk|DG;iP]bGIUh.3oyvvw!|&k 5U- B;#Jsԅ:Hu-ef6iE[KO, ^u(())q YHBd҆ppCat+bSwcs,\e.#yͯru C[r2(Q'CP\C;o`勔5rb#yDR:}}$\j k*^ 6[ϿH05L|IVZ9X,O>[og}?yzz,0rB466oW׿_og 7oƪUę *0 QP*r<{֒!iaE,LYakpnhooBPL7BEU9 X68{x+[6"z;q8_7u~#{hjڑvsf4.92E/E~N0X^ k7ӡ&# pƶx!d/|M8`3l/**0v0勉OSl§+WblA:{Фg;sR4iᆹO?F_fGD#a~A[_wĝ yYx8āG61=ݔ2=6m?Vce} ,%Bn,q3m6MhBKK EXqnPp`kႈڌ><ϼS.{VHٰ DDnGAA2rby(ԼdFli犵'^,nSy%?i3z,}Bp4H ek6х4x.NZ1х IU##@p4 FX>.&x5D\[J(Ϫ(ZrdJ2f-Ck8;l@IDATrDL6d1$a]@@H:Ϗ(r%p_DacؿFI%Ӝ@?pDy /#=KWOѳ$HR ۰2 3xWMUL)_re㨑65 #d; mHsʪqYhgGG>,jǑs_C=fW(3Ԉg#R ΟN}>'a9u,LR]Bz@F +B8N0sUF< laח5"/58r~,ݢ`Ä``m ]٦L"{_GP#W(5 eukC-^C0b'wt46#/Q]msV!Q;K/]Fw[yzdg̽I=?v $\듅 c k} 3 ɢIoF.o@|oBv#BrW{)pi+W@aGJ)0wê\8)A3''VU3'`OǘfPWR&6qZ-$ŷ;Tbm+e4,q#w tf'(Cb 0t)2W3.eu5,|a3%j܊~ڠÝ ʪ8f\IG!^- \Tٖ&"{?'с^X`>LEKGC?fQHH ۦRA|*Td@+10Yqk}+%peqg5gYS}RMϓ1Ɉ`+P. l%Ye:)LTgr(zOm&v|J^7!hj+ w^R1e Rv40CPR ~nkP&HH7p!l/!+ϼ /`9LouR46::0wsEtF$I./ EoN]1SQV1qBTZ7}PInuT(%8\FUN׳9w 0ǂ w0KpCH(@^~M%.[_\2.A!p\5DI8צ%4 w+YHbp|l>/Dqh`̣ 6`ϩIż) +*>L@֊o?"gtC,:KQ-#] u历bn{$ 0+Ew<{fS8ynw>;[mmv"ԴN0.;]R K2qq5W7c!; (|{Mu{̧B`lԱ-q(?$Ej ]ɬd2@>֊:Dټ^cKv~kc砭m]36{GI} "3A]5z?)3gG@e85twq2ͺﰲP@A&WШhoj cG/ѬX #WP MUְ Ah&` myP` ԑQSPM|=UM W(zAMG /l":=t|֭Z: mH}hGhG(ǫc s?ph͌LII CCu# 8`N|69 ˈw0E{c_5obQ yZ9Kx . FRg> A*/J7d\#hɽ`ZOPS%.} ڝ1gh0j?s-FҲL\J x4# Uu,y+!.b9;o{P y?@Uv.R%nFntw#qM.+ULS&Dn #Xҡ8,9۹e v_~0IY|6D21Pc!]"@DO6Z?NlaҒ{a<SxF'Q:LN*c`3KjPEǟ=T&F;y$O"ǓRYE ݍ)R$br'~ڊ"05E I4%9BG ٚO?Rs. 6,0J%e,^_d&"/袐7kF}n]0ubM*aXLu4 >>apB3'/"jK8I5z>\W@Ja& ({}~ȹkikcO6I0ȯGCI)e`:Knಕ "RS+GxzFDg@l2$ڙD*>a*  ۂkB9?laDt~QՑgNu+X:FEN:*$/PV;n|&3Uu25¾1jj SM1тT!+ pi>uE5|De%81E3E@` -\H@q/,eo:fO4%7@\&Nj2\8C_oOOrx,X'_!Lx/3e{8Y62B $e.yhhŋ'|#M )/6b{&L:0$ǜDn|4,5ҕae,˳Io5yQ/@1h4Dɤ>vjgUЋ"E QwAB= RSލ +2CqRhP`t.H@mvafom ~9Cf HBcr8L~x. x& ;9H Kt?5k\\fɝdPGG V$p؍b7 hh4a Sԉ z{qgrx,UxmWY~%GBvL, }Z!R55請qaO(NJA_"xPRUJjo>h(( ٮa Sae(͔f|<%OP0ZLֆ)N1ٛI^0=$;(HUN׽ˡc)Hډ cE%RxB奬k_ZF\۞-ew_b)1v 7<~Lx/^5*;Zp"P$xN9٩1o3Vc'`VL ;!8nqW(:چ<%,| jkK+J.s kH"?:zr */"W$޼`%$P>,\PQģ hOzcC_X߁{=imwRx`c|$ZDKaBH_eityTFbptBEr& (5,u wq.uϿEy("yV0]Qa_5 1d?{ig8<^^ 0}B5fg11 -=QME|WjT,8 И$7Ý_A|a$'FuY>~-ZS<Yw n,bwowoNJRK*j\z:'' _z:5 E{.!Ћ;.WQU GGkhXcD>߽ ?~m%$ o<6H|D '0 ;y:*juqĶV|y+s+9WQs!o五v?[z="_ʍ3lE,eB%YtBK3OUʼğ=pr젻dn<oWD+pe&* 05Ja 5NXuDGBNn<'y\>l=0u<'E^9B\yWN?n͕U8٠cj2n(1"oW~C{]Ӱ40VS_ 3CT/Sl9}Gd"=Ɲ ns>+;qfk1_u2{SP(͜ ;^¥+/ܿ>sok@WKryBUZ'rat2\xrGUfBw;9(2tCa6Y,%E*zIs'wny!8 UܨHIGKKE1lEeǐolGF\W#$D8cx-ؒ3Cya*[D,'>YL?Ȇo5Hx. l gѐK-=PQ:L%~2^}wfͷ_@q8|AJĪ I|$@CE3Jy&X `BUy-Mui;Ȩgu44j*DB4pc<̱ 2yaPJo/4 9虉Y)/<:Z0iBnc.ȺȣV.X.)K8>I Os fz,ׁt-ckᏘ[3`fm(Pd`>I^ڰ)dM8]4V#>(m3x{&vXct67?Ă7$F'lwՊ %̘9U1!Dmw_9s 9q%?wMx9I>eby-mqkWVBď t3зS{Hqk1iJ4R#鳳IĎ?,с;sNᤵ/8=nnjʧEu8{Al#`rfXIzq&(iWW;Dj^^"߬3Š"e$;$Vx))a 5e8ͻD#ܥvԇ}< Xo`iś_?D{SN ?$] BQPŔ@ p=(-˰o[*6vb@G8?A&Wtca9-#m:O,Wv*1LrCFXбm(a(79DNRZ/G9~qjĂ lEA܋̰:)mBm`G^ֺV9se%8K胑5. 1").\ʲG5*m<0wJWh׈ =,{!\ $9ogY`T˔FI3[BMK̲:fXUCVsF9O>Jc4.q> $JĐZuCQ|Һ=0}%'ͨO!# bP*.7J4Vfb]湓*k h)+*M2}}б4AțBxl 'y:T7C,ܬhBJPʥ똛sU{(NJg$'_.9.j ,^SQ{G2#ew< -}}|”MAEY}V[.!.]5\=˗߽U)\~h (OR-͈ٻ ?#35 Wh(#oA8&q5uUⲕ82|:;|2 Awq=N5x6IeD#ֽ>3VHW[=[cǙ- /ǒic2Mɋ8|[!|jzqˠ $,T'ԩ--:D太P- S<,C=}XǕf\[$/%:Wn-ݟbsPWג'ejK}C(+vb:hkʯVp4 (plmyQGG3|-W"Y4l k`̕4O>Amq>Jp#3ѰUZQ8OuLR`$#NLpWV^?`pTWYX:G_+ZowTqʲ~ Vzwծp#&#{SPd_i qC}יR GȩMjTc!JẎKsU5lT̘>8;ѣ|9 P547莏M ]dTHcI1"&R{|\g˽hПs]TlX""^Sc`fg@떽=u%9o=֕Y?T5/+s2p]13%8ɢcDJ{],m-䎆rԕ6Jvp$H8# L`9G|4Kl== sq9E!%%egk+o%E| ZFLXr߅&L,O򵣽">BkSTT԰|ٳ7fXqOO5WQ"b̍E?,-R]&JA )ӏ;p^ySeT6nD{C#bIB2DEM DHPGk=l8Lm KB8Qt[FZ.%T`]ґ1^cq mDbʊX/̶`?ɇxU3Bh}==뢅&<-"% Whb`c +oP䂁*v 8.?W0=~@[s㢑pxdObhw~*()R`D&AyML`_n c鎢h$1c8܃'E>,e10e̾y֓1&uեdE? 3bJPoal˨̃ˬ-=`>eSwl<|dnRX )6 ̻$0BMa2 y8Y&ON- [;PTUCoE}I-a ]>z :iV9D m#CO(F(ikK+UUĘ_}r3G4t%a ;'e8؂;Ŋ}_,.\KϏ Cu&  EA-9dAV')i{!,}O wTk@dQ hH:/+Rv3{á#p~%F{;s1g*~_JoD覄b'"i|F[?K8OMQ[ +`D7Ŕ%AZgX/h΄!s(HMD%eeΙ'1*  }*p>I*PVW"Jnq%1b4`]}`QӖ 9 %[en&"~>agh+} zenK\fhhȹły"EQ%yY-94*j(N}j r^!si$ZXr*X:N}O .xoPP>BB)0Š9'|4FՓ*Rߢoo&Bc19șXh CwK-aet;H^YPZ̡’+߲rZWff_s+?jH*̖ψƖXrsPQUS7߮-(ι=nLq`a@@p4f u͠L%=ݨ i9C- 7)N"5(&΂̍3w{H =a>&B^F)<}Wq :_Άٓۇ!p62Bs#E P~y'\A/xgcΦ V_神Jɏ)*ϤKmif˪9S mu75͈YC:W ܑAʊӎ*Nf!JYJ 7.di(/EwFtMpx]Ƿ#/=C'ܦΖ$lBrh L8fF6(%\pȺt$r2'z.XtԖ R(V:T6!Fѐ|:k_Cԥ׺x[6c߉sSx:EYQ36o86`ҤmPMl5u`HS=|}-9„qҁzQH^xfSQhkHh,**>$B1v~Mխn PRdy¤|~gZjDvɻ8h*Ku=[1jk]s$HcJO/וAԷ[VWϛuCUC:guBxdxZI:82G0|}W+ ! 9)ORWWN(+  B DrgPS5<\حmd_ ;ٳf b~ F\C@][Ac:gb'H30.Ve{߃l xJ/I$ՒXXJwPFRH/OquFj#q J&~ڛA/B@R!)yfBCG@p4 a L 0qD\!ʪX[,@,Xc;?FEv:ʳ.].c72jb1v4J dlpQK`|vMݱB3Iy=ʛ񟿜,w5*܍Ҍjo{*c7'>5bן*b6/>Mce ~Xs țt[ج05ȉ8G"-7́y5f?UV¢uabx|1?bctqI-IHv0Dt=!// ~+k23SR[%]::r1N$ώ+x^N!Gv)rE/ڋ$ߕn֍[ګ{]h= d1K/?)KE<05]lN'a-ߩB(L̸k-& ""0ʌ(IJFDz{"[XI Ep.X:K݆6X3@ )X1r=#ŕ*j C9J6BcK-OSϽCԊ…* uE0'k2tt"d(DA p YH g|`h%)4% pU-_«fםPă@oWu;KyW{'Cku=X4+v>p[@<`5=$E$2XV~V =L Kde&.dis٧(+e9vr\.y,2\(0qg>\fLde_ˠ)s>09@@YiY_oi)i[XS{ gGÐ|tv";"#:s[XJ?bs80Fpx<-Cm7PF5埻Pt1Mҕz|jv  =׃Fȍ>' 5`XyK=E"*Xkb ܭUe8sxF WB0b -u]\҇Ka8S8T@@\MYk]  .!PދaͼGɻrm\:QӋJQJN}+ )&G3SI]B _xe3"e..;t,ߛُ= UMJGB̓!^K/]FGk@pdP")7?GNf{z)TҺ-jZuInUOW,#c+*aa8i$x3ӣ6Cd`VVI6?{__qY̌FYYh혒4M`Ӿ__鵯RJ^ڤm8c!fI-FYf%;- .;]ݽ3gfus! I/{\rK}vz'"yrGCp+/\~8 QI:fX={ Rف6֋MYġ_||{S~,F*K{Y 8ɔ /*g:,OB65n{;'L>|v6"64`Y4#Fac;q˷1:23P'<[aJO2-Ef Kޝ#0HDGK-Ӡgl k7/Tt D.!7]4#O! [cO(T~|1/%v@V6^¸,R!'!7 |h#,yA_93'Gn*\RB:18eij-UyH#`GgXF\>)=SK{,_]J(GL_w;)7 s2Pgow4q4ǐ#9J9AOH ª<1Ppx$t 8C[y%1؅ޕja#yd%sș8uSY/-}],CpYdQ9A5A]Kk4 oC`b| N)'mNAybaյtXE+u04be ͬeԶgşu/d{oaIH^^qhzx!2FFPt- AL>D r s\=PybQ6b^{ g:kpF+?wQ/4%-f|k+Wn_/T4AëM\hhƱ@[$:Ћ?[GԦA02!>FtR9JKZ36yHK LY9.V-#wŒD4 H6?H1䎆y )IB^yG0O' CUßށ_ &NrY_edGCa?Owfpa*h$Hfb9\ָq1TgUaƎ6XƓ0uuŸ37##?Bn@Qy]7"At |&0 }w qF-ڂF /Ltcxں U&ⴣg5X㞇P`UJ=XrpU K(*3uKxXEK5#rA D1>2|3Ojg)@+h\b뻿TP.|bb}m04Qw3ÖoAEF=8Bhjr}@~|9"u5F \[a؉+_&!TɇgJyO 彵u ͹򛫟y8xdE%Wՠ-e佂-TZeɈTl8;60  SΌX\f8 ܦǹC{tSpr{N\>1b{ K7~(E__B.mmGG16<<m V{Uҁ*R=fa6q>{w??c<-]aR|x-R]…Ł8m>ko"y\ڈ{IPuoF3:Zs$FLHt)q$H V]wi>E$(8{3f*bx nyq7:MM嬋Iw4,`M:t.dEII*ʇrչL:[ޖDcr2 [ ЧBl:Ɔwȅe"]X랏%>;B@ ~ C tt5BCKQ/-Lͭf e)T %]EQgrndX{ǭ]~ﵔ\nlͤԣ)Iwr񀕫'yy0^v{$HCJN,FXxt雽.fZ2NRVI_`ttA@ScEw4,pܗU p>X[@dRp"P}l w鱀Mq(KJAoC Sxa/=>AYr1=6]LHsW7~;k͋B\}lgC>Jgf?cqTG׺Л|~pNOk?`pSAI /}.!q܆_"E42 Խۛ&,\ mgkp%KlL_ m/_D_B5B]p bl U\-uGBlU&\C 5t{@IDAT1E\:= )@At\V8_\M\h?ߍQl(xK΀t4u:Z-D&yr|EH%R o? A^UuG^\vx!D)' %tn% yϨ;kgh%V0wRzCHV1MhCk5&l@HH*nHgCc)܋.&1knv( RX9m=D؉$eH[XS p_, $OҨM9`t7 53q032q1Ekco/TVՄ8=B9GQjPHb_Df59462ܓ,E{zÊ 쌃=q41B(6݇;X$ƪpQ -@cѵ75tVMq ooW)N9Μri([q%AlGCSCkoRt@;N6 G^i ,,$SװeJc## k/D s4W@k'Kp_w'OE5a|?BSq8o;<;?& ܖ{kb{pny `g 8\.XВbom]8Ohh-g*-2Zh ΅).t$Ap d$3`O7imbe #=7p f$"Q ^Sp>ctt3m, Pw4HqWš=-ٵû8sBl qSB䗑jXxkLkib=S?3q8tO?œ|2OVBПg||Q.8w\Lr/~M”XIW6Iuч+}*K9wU }K帐8w wQ/[?b)OaCh,,bQ wc[t;X?qA뙋{C?)#Nbv|Wl ܗk֑zaoE ҎT1-Rò(,]KVD  R_]]xs)v8P^*ҘqؠLڋzD5!7WyE/^~}х{y >;K=@.--X{LÜZkGڗI?MJK 9>E@H\ř֯KCKO1K *QJO^'9omv$2D,812GyW0U}wZQp &))aKq *哟0|4P_!=8؃ cbhAw^IUh*5VGR7(* g8;sft))tuֹ2@iy(yj>k`8g {{ MXqp 3DJ)Ǔ;G|e [7sg%;\*H_,$iיuz&$z!E1hh+mŕH{!bx:IBYܣ'U%BCS 6^~ı z;M K[1C[uŴ֎X Xw$|}\;}!*oC:/~&ԟT/ Hx3=;w%zuecCOh8p@se z{H"P~[t=yހCg'n=,mJJp/YHSs{V|$&gl{~?!'3c'T, | S"ԉs}i8C`Z7"@DeIjV!+7*U*T[s XZ:aIIޤRRZq2b'4  Ai}hS;cO `(wUYW6ޞ/Di ش/e"``mP[=ׯFoC+M@ʧa` i>r4W?DwK?q6K?kg;[!@. v rF@Dmn=HQ{8WI% e MAҟ`w4fN}3<郞AʞY[ǖm:eʹE@1ybUIyi-gI:< 8aކw9(b< m=N&et!?:4Q J,Զd(??%]5XL4!N:ط]~!T^)c GOy1<#uff{;b O&7U(=uV+F,}f'ۨɮDi5x fQ$xb%q5~n[ GN6|q cnoK ifvf6֟SBD z,?< s*,!O_yKhMAK& g6A̳^,ꫬ+t9&SP#%ێeѢ+="椞b`g9SW~#0/a^yΥ`a(kk q9:WTI n' =ͬTe/EЫ~cè+& ^Sɰ0Gg`f\"ZSl\*}) M=Vm@LS5.Z+D,Vۅ`&¹9CzoOP4dӰU'N4Z#xEuV%SJPVH#[Z {3pgzB6Mw83:{sE;KqD7#]BwsP>~m}C84:4y: ŹZ=#|/Gˏ(8)#?cB6[Mf#U&huOk7/M%I R&8UWQ_JO<ϵ⊨$7 1W>$ |Ѱ9s}jjppr8{CCS9P#04;)G@VpGML?hk#2q\,"K2 W@yR* krA|*oGt,پ=^@Cbً>]7}婥$Ţm-Bqr5{MΦ`e)qBG\ײD#H`$<;-Xy9F,yp$EdlOM(s;zASp>4\$ j$yܗWD.޶[fXGxbhrLy7zQ Z \ۂ+nx!å@yˏ6JY:P6ơ<9]`_cd )qPrzj))<'!V42} ~)ٍڜ*u:V60_'!st>-]i]daLiG@`䌌OABH wk$AyxS4ԟ@?k)[qjbCR |%*S0C7*ݪӉM9ۃꜫw[j[;weJS[C~z<57'\XQ_SLO8\C U$##W 2{|ߕ0ټڄL ^Pc[8-Amf6 h_Teujݺ?嫸 Ԋ6p·V@ELS@M^{:F mi4XrsDVT9'`S ^xTX#j(;-Xq> pO4ut!M_$3 r#6*[UH[6n34r21WtσQEQu:'#YpG<oP\FXcUyHC@CC b`@Gvϵ^=hj%h2+hzh(ASn le:lۅ6M9>Ҏ;aF+8q>= ~h!\ oBߍmL9$\ ֤tT)~{<=7qjdk4/<K孎8$e1C_SC@oBA|';~ αݴcy"Tv9T7R\sڭEY062--=ɬJ/玆9.@s{Χ}Es E< MR˛իǐw)&D@A2dBl#a陙 QEd ;_F Vx` pph(##<ge65e/U>ӽ'QKKEJsPЀQ9sN)ΡAy*+ NՏ9윅({$6%#/ `ޛ#0Oaubhx,Lf1wITPpiWF4ВFKnEpX@!' ]%AZzzVsA,\^YB Bmu-M8 f. ;,\ #Rބ CEMPeyt L]n@gѐ^0-!8;az633?V?z.EFY%]:wKiEpY``a#C6->,K;>1%pt*3}c$ϝzCCcCa!00Ѓ ^G ">NS}sL@Ր?Qf;U& ;U胁9^rm] Q< M"VXMSv;KӤ|VX~Xy\G,OHJiY-@P@R4j \q06}Ea:(gI Ww~# 57]Q )544Gtԓ]UݕٸxiFȺ8aQ .ID MLcHLlD!Ǧ):Ћu0>+XP}!@p$ LRtg成Ƕnpx# egOMIDYv|Kqf9֧_$4Y]MMSK\=qzH 99O00P9;KhMeHz7zyUr;`%]ccHJ %%LU]=CD$W[XW)sG6G{Pu)lq.W/AD h)iK8JHmǙyvV>8 UA>G#.`btL^% .A *1X!YINe;i)l% ʾ$6r, ~A[GO*n\tw4ITvH he'Ɛ{eil֮}no7ł@KK>Foo;SىTXqPgoAfo능|EGBP KTOh JpnBI2 #z&{L孖Bedb:*&\ipo["/ \&CZUF^h.NvXx#\hW`XS p&Bx]>|&CR&3ȋ^$ntnI }@7(p/Q~.ܸlc }R؊L( =hlFke yo!hj%UX$L-C}슃䩪&'XzMc&k!DdD%36E߀۟yNYTJ ĩ^[ER$@3r` ~K9'ڭqmUl sͻs;_DNI2AUS~ ?E%D1Akk5S–PGc3J ^hBI`o0KHH(2eBQ y_dDw :H 1r&q$PBĩ0) sw{4tO\d豿E$NhoU::;qOo^"?2-Lm4RZ,))I֎q /RnC}I=:*PJ;pZ%>33;BUBN-.Na| #Ir#{ÅP35H9n (d:#z:7;(hVN4QAi9G`<ά@SqÍHftw|wphRE U놳!{D֭AЖ Ρy- tvAKWKY PqU!($ =7N*FXڹp*xZ:ᨻ ~lkF#hV#TPV0Ji 4A]]5qrNpgl CGVZ; !$q k"^+߅y@3,&9 #1)e5(T RE %4.DBz%|ϩgaœ&쭡K Iޗi>X(PO/IFԳӅRV-{m]}L@#M7!XS ?bXY[vq3"X&Rd5ݩjMөcRq䲵3&\ OG^Q!DCS;%Wז15 ,!t6u M,"y.LZVe uUç̈@KE3s.Cokt_}cBHH'[t޾@Յt\~+y&$oRWGp|"F2D<",ܔBA OƵ%i낒oK <`bnS%Nt_#9Zh |;;e3#'uhjh_ PJ9۪q> Imng9/h('w2܄ N!mwwn o%VsN#RH խߚ .kyb|]!OY7b^!Pκz\G$5l<|ꡧw{(]MHlnScWֈcMmk( P9\"ZX8#&lU{D% 1 Y.xSUʹ7/G@T5ՠX̛з\@|:,. ʈ@%\OeR2(V4IX"(F1K@Α!'awm,3D0dHJꬦH\G'6kQ @#Hֲ[B&ChAE&k154 }ֲuP<Z|Wh뒐Y['add ʍL!0`fc+򈆩ͻ#?7Dꝏ)c'E2FGPrE/Tr5K@ L!voL1Mm x!'^ĵ cښXaq>֎r+Q.kHjDg`aɁgM&{pWIĚ 2{FH $kal`ؕ~q~P WsīD=Kl"̫T֫'3&lkEQ!ش hh"ҷK',\D9WSYh.mDK(K.Y$yU(K)B$VVHͻ5xT ZMl~6Z8b]ģ%@kk5 cIѧ w@O_ܺJhEr)U3tB>[G`*bv RWA +O(J ú98㠜 4J(?+%ƹO"^Zť?yi*x%)ϟĘy珣 $s+czꙆc2@`Dse'^G\~kd09l- #1 uMl@@Ig2Fǔ[RAuCOH)8B<42g;.r\@`G4(r J8zPtԳ0Ak&K:Qap:XO"LJ |MX]N`hm p XEmkAusE䖧al9yfFNG{XFliHM#oE {R&4#e+wÔvgDh(L:* ہ;[rTIڄ_?UrF`eO3h3*3]uV% iΤĊ a1G% --lpu&&ެu@t:q6>^~]Bhuo՛Y ˙GF$7)Z.Jn6γWR $}`Y@4IiW uuuYgnN/GSSqzDG` BO&fo.H A\D<MMn?s@m^5c̝ sFoe5H^5J"H)K hKi9s0UH4"C~ xT\V /"{|XfBWS=Sړ޺^4$=CvYN`i_&!WD0-wV>-8ty_rl8[SKuҚBr:k뙃!pz`lS}|cvYԩN*T-[ˢ^GpGý1=8 VMJ<[5a"):˔wX)EYCFBΉL~<z&BS#"&xM|\Km$̜`b'|ޖV|}q1LaM;`QS}I_~R6۞}#Hh6\G#0+Z%i.N ۬@'ZY#VǬDSGTD<#h}rFgJZrVeUƆI56!۷2ʖnUU7wB(`a,1+rshB`Ys| G#xAk5$GJ7993Ż~ m-nBΧǐy$ aT: &v6PyW5L!}3S~IؐҕBn#?u/Vݡ!S?ĕ#:*@9"{ .>ȇq8! Ép8몘DpRWJpw󀀷6AᡳFѫkU2u7x4ü9~n&uR=0t-SFFpl ND_ i-p_ jjjVAiTTNfhu 8Y#s8A@''l&( kʁd,ݹZezQƬ$ǬN79ǵ lq0|naovu8^LBci2I/'t4"/{@idfs#w2*@I6|/"Z:H jcR<)X,@*pw43>#X US '% $&{j(uL ғ2B6/)G`(koiJ*vJQ / $;h%[!nPCGNV _M10T :qc$DW߇x4289# sbJ S BW[$ʓ;Zw&3-آ5@ M](MC#pOj%-yY{bE;ELֆ4wvxEt&A^D`-Yอ75W:J5P_/Rƒf">K[ hzqmoC``>A}$FY.EL!ajnieڋ;(}m,VMC+.Q5!k2hh |X|4G# A u#U9ts 㾡uǾS?*6URӲkD`"Qp |>nxқʷI)W/Ww?!TOe8o݌& A(rI5͏3X ҹG#par rF`llQ\f3$?O#PΚk+g $ -LXݢMk?nf9IL"򑵢+.{sBx䯅xf %2Dd֔N[ɠo$lŹvJ! *7 {KBIsb?٠mp &~he-E?#̎;°YF҈l%5 P*ƆǠmd^zoe.:O.kVaCgΏ)! $g<%ZnG# vA+"׬S$/^CC a1ʟSj<&Hl]Cc/ Y1Ձ.g:F1v!l0އ#06B&sʧmL>>,_O<|[QlCV#!TFMq8"E;DpvOObl ?%<(!O8ZneIM2iu]D_y:ah{1LʖT]3Xܓ-_)eӹTd0>2B,Bpz,]3#4  )+Zzɚ->4GGu2CKW^aj;1J],xup[m|\}?z@I Zzww]C>aUil|ͥ #H;)j%eL ̰nӰuT!X=<܏T؜8x(s3o|lyUљ9n& k(D_p v>L"hԥ$Q%OgjJ֦\~#o抨W^p#fm8+Jc v˱*ahj<pw4(zA>`/;𸇠\o$/Ã}S >o?,LOK#ړ;8P9>2>Ǡozfreڗ^0p B[q%._=bɷ?1dӂh/z36KW+<'`\j"pB: "В}z$=? #kľ xjɷQRO]Mlews3։ly4e7G# 6Al+vu5@isa?Jjͪ(LG/XW_DXBۍ KwWp{-=] H?0>4S{3|/OA׈HaՓ%f%0P=f;onJx )͡xd8IRAJ/؆ψs("sC8*w4؂ IAM]"GN8b]~9Y+o"uL_K,SCC=4!5uaLNL>(14{ŽQ3H ``oڪZ1؅B]s}L-0-_xFnѿ_DGM-NHۀ5퉟N*a;K~.O@ui.#ClGpp 4\\׭Tt&Os\e:B9)X?0I4^CGpR`FIڒZrDR[u5##_^.r=9oؐfC^0ru P FGܡAG7+v,@*hpb^ BǺe/Dʎ]znXh.F[S5S? J bZzsMcK욹 'T6o) @@k|A랗8JO^BCfXfIȀ -g#TLߎ@kC[&C΁x_8rΣ)|'tg/W]5ID3zY5AP*\,! ص^0V6䛋L5OEsG(|w8\3R =}c;J ֮9wpTINt>}]m,EbX$.BR9^W1Vɖow=aq B<ߍ$M ЀO)MOHF>N8q g>1 3G ,&iq"/gK9RsiO 6!E( X8ٟy8_v*L'>Q5V !׈;ĸj\gE(fwoA nhB]N3%`pJP5Мz8@V0ۙ膌,iL#֎hPb@In2}[6TjqĄ )|q u5 Ć>!R #ћ?v|$G@t5Z&s3zLR`l2cB)3|Ƈ0% ޟ#0'!侥9̏:vN sˍ }CYrqd`?. եlC3DE= [[D3tшGa%0ΟhX0\G@>d\>ڌIi0`Lg deO5d2OEwu-B9@K`F^N!/{016>OI|hA&:\'y P_YD~3d\ݻ;,COYoGzr$60:G@ t4/iQ07Gtj>=``mK0r?8B6/ G@hja)yz~.I|#0`ʼn e6AP!~6{gM"t+ C(T3'G@ cLRёx4JA*h ^ ><h lZ;;/<@<܅pAX}Y\zԖs4H J.# h^_qNܘrr> -%1=Fy-v4u7Qzѭ-8 Iw!1/o!u;B+^+e˫F"?0MLMhhjQp9s@$ G?8[͟CyujBj}\}5J *H1#\ ZnG]C^+bMe27G@]SSd05Ų]+4~:_wO΄4D.XFWC'*HiǝpY`y$`|>x7De@B1u |5ֻm+ '.*/œ V}Y abb &XQa Sxp5iS}*4>1p\B =Mln+pEM`GT^WL/c&[!ɥHqC8TYы}ºbϭ|66o?s5m2 37H>F:H˾^c@m;5MCSirROqGpjv'7m..A0;գl"5VRSCK!z(qE+mpЧ촙+.K1> I _,?}!&nBVO^p'>iTddTeT"ݰt5ԧO"=̯9'^^|NS0ut6ƇGZU ~e  hkݺ/F^^<<0fG**:kAKxFGp⏇q_0'>^|7v,JN^p76EWV4Ci'Akjkb[>}3 ~ cC#Ҙːj$]"Z].;7,ܘ9)kל# piigPXqGx׎k :5GF1OІPxۛ__PInީ,Mў7o]H"<{Vfǹw?ދINU.a^xJ^o^=ڊ+{Xyp4TJҘ0TDIrīK?{u?.@@4lq/8)7Nϛ8vb(w $!{]߽wLGmwgf}vg{Ζ9sJ*Tav:&j&phoo Rt9.DV]di\"@u vohؼ_$341yU6/{pX#S<*XؙIZ'G0H!gAr.[Oj0cUPQ,+o Is=]cv+ kg7Ԟu}D@f Y,HG΍fg}:"@FO` %ebm{46B́%wqW ~1XEF6p^x0bo/BA}G zT

    'Bjv3ǫ2Πvi # T'6#|% #PSR] aP*jvw ѐ6+'kV@)⃧2L`?y^e9&4.^_’AΫG" -9ff ?\.v=]=v|'ho ֽn1͌dHuK=gАR*3y$(z}lJ^zh(TAQ2T_Uyue2@""dvҹ$]M1:pGL8{bJ<&E URUUhn;uZ>s+4^Wq-!-YIpr|̿qB^e0ia,<d qxع[o 2^˰:'2}`hvH:(%9l\&ٙ H*ΜǪ2#CNڨ i"@Bkk= DȄ]jr&i\gYĖ CS@Ƌ,F7U2aB]$FgjiR9jEK[FxS_GϽ&>yujX;YH]qϗtph'm,LWv,gomuh*z7=ϨIB˧YH@DF>0+$n$(!2am \V+\^O20ozpp]VM)Cq夅quSvIj g{Ќb&]7I]W`E"'&Fr0$.R4qBYVVµ yɧt_D I{rr^D\C<dhjh@Sذ!DX6.]Nl]=E\dJ4-]H6%T+~n3;iƁ ,(NU咘dp pOG xF g .7KSPI5mØ8e*Vd$'JLB"ps7L[lÑ U namOp U6Q#67"*[5M{::Q6YRL=&J3ybgk'xn^,e@ xNA {ǾA;–$ 1ՠb2|iG͸-zXBȒ L8Ie|*$* :F<tlnIi&!#t~dd͂\L'J,96=i _@_? yڹ6d,r+"DKUV"ddrIV(I*FXHq,3=FqhEL{#50Lwt:'IYI("@ 24 j!׃'7`η#3̿`dl90h{[3/@[-殺g]&,d+I1e $ߠOa\c?,%,5Ɋ?oGZW3(OTW4bb!ZCE)2Ӥ*-=|Deĭ$O'9aI "@#@: F7iixB7 ? QP 8𲖦V!H9/iEAa}=8[.hN("SVkW*I|WV٦0uݭDV`L24܊z#2Bvd=  cUQQ=!/ D@cР1Ժ3hp6m?44TzVbvwv#9XntM4AUZIӆ;yQcsKn"64>|_a8an=hfE>QAyUI5.Py]IY^)^.|GvveBnx5Rd!Ddha\ 5bTffm+YsL]$9qU|8N Ү0j+r47,]5cgs+ҾV?Oo&lݤQ;_ ɪ`t/} uDyFJ*Ҧ`M孚D8%ȫakilnϲ7,SOwvrԈ R"@줴2%/<(+,4 {Ξ2Lst#A1aP|hnri ܧh6; 3s=6ẁ3"/I;c$dc IܜK Tj2oމJWCyV:K$!0aFWX>ucחoZN*D(P &&~Gww;Lͭ03hBf-ѱYZz:YYl͕l,@ܧ5V c߷a/?G{S;mM[wYȼv(,h$g-Jvp U/Q;nPy֊*Pn),g+01DK"78("@8 C8sp9;IxL܅.-钾kTkB$  ˧hbQ[[ψ>Fx5wchzcKVgݜč[5V޼m AhYk',`a,wCks=Rf:"00Huo@^’7^2aabFȣ= x ,Y%5C=B{Hct443妃s3+{)E2"Р?Oh0" O8⇳C"_QE[|fVqcDzރտ{kew[ݩ2RX]~T~(˪F# ?7tίBĮes(7ݞ==/[$:'bU{b" dhZDȀ@ҧ_ƈZvY7TR♏^oWEg(T%)9 LKmyn33BOW/<ĿIKE W1o[{`{B%JoF,lmXY/vR$**E # @DO:mk`ZjuJq5 {K<'X T4Gΰr鐯Wzbr':^(/zT

    qHYD CRV D@kxcGOG'm0iM R 3ֽ}L N?Wcw̼_Wok>ũiBW@<+^*؆$quH:^ xܐx1sajD" odhDH@ڮ?z&n*'d[}C,R<:X:Zg;yCI?ōqXQ,m0b93I x<0F7 e!Ԉ D@ #2ڂBn!g]Um |~S%~~H|薲2o=[rd o=5v}%K|jҤ緝AΉ,1e o"MOs/:4OUU{Yh4"@24h4Ctu;%3m7ܥU3p! vpado_1+[6`ߏvnߙOPxBxxd(;]%p]q [L0^3% ;B/d = XOǑi("@424h8GbbZkXCV PmACC2Z?G7X!C_*nCJ渶|v|,~m?B2S>Vrzz`*4Ԗ+_Qh׃FH\РܵUf==8uj#.esYڐX4Jnfm;X O:+fq BRU\b!ȸaqV¼-40WV"l$H+-3KPnr8HK1Hdu;ѓP|J2R0s,T_ /DG-֬42<*>z9dhkET]]$MMB/a{ZEie@3Ľb~P%cfǰ54Dj X5jD@wS8{dgwۻPo*_ipV􈅈Pd ڨ6dhPZe<0Џ}H>Y\!ǯFX2VV]mL9*& zT?Јz1cDG/9gX};rׇ_fQQ,$D+kY4yN!wL4f{Lt:  ,1d#3 !Z$TAEe!+.xZJ7neaLU Á 5p-u8t#TV =):x q.eb0]ncIW_f027U%݈\s]y#Dp =%,:qIB0vÜgbw䝋df;bO9Lu{fHe8G0geD ]dh H:V-:prWIS`53'h[ĉr0iphUPs"nBn)++P IPcG!(\DV ;ݰ6"0zɹMhkΝ߿y{~P Y#~O䜰Ƃu /2lŵ]NzxYK1dN$)GJ:MzԟTU5UbsDf8xȄZCa_%+'/؂ 7[g{/Jb(7Fۈ 4U"qT%uvOmDՐ.LȪ<55EB[';$Xk {^~*A~kVy \__&q `Ošώ7x^b^1_LYQVf&ό Ԉ^{0pO> ]@Oym0Ţ֣G9!CUtN܈n)y4JQ\Etq<50%tb؃&M+YqD DVwv +;;eJD.H&,JAS}A6oh ؏^(?2֓fa# =]0ka5 ):הJ6:Ǒ@}qfn(p 8#P6;.jTQFK%PMAq3Œ/ZDDKE S^X 'Vه}3O;y:hkTUAJSޞn$܀̔b^IbG9Q*II"=?QIj4\r3_F-G ~bCV΍\O||f F,+ԚSx+Ԏ}o]+5I!x<#7*^1,4W7ݠ1O5# SV7WʆN݉7~G?_=xYSh=3[PACEGb뚊B𑇴y̌ SSS,V66VY=1jZjP j<a<(*d S3z+d)I %`‘W]SGOKRVdy+Uezr# 38LyMB`D]HQ[ p  =&=V-H;_LoddYD`4msH>1L A>:EʓA+Kz"i߻_pCsY5 5Vj uq*d`dA̞Ž/trq*TғU9,cٺ_ aps۫ؼ.sg!]SS(KS|SKIxu*UsZ Ss}4gU}M([Y_]*wu T&u4nK /ȑye-bfRBܥ46ZX̜#,&2MВ41m}MPH^ZtZ*MLb&b!={:DEP*DwKX g6@Ēh>8vCӓk 4ա$P1O5}#CU80*q@w[μ5 ʱ9OFy`5*2/ )Etl%Otg_#%=/k5Sy\djliix CVD ̞U8uk䥁'2ւ4ʟig E'NUL3VvwSuBg]RAqM".{Nݞ ;!xn8f<<.ʽy5[=UAr+ VzCw1!~FwX8S5HoCUz.N1j$1јSD}4HC(J3Rz5 ^w¢sYX#ti@Uu!MW5 %JHc624Hc*a}tJYL_쥏7. {qN z0Kn!WY0/-2E ޅ(`1i1qZf<2QjBZvwt{nDR' Y򖢢4\x,Гpv8؈µg&X; o~3܎V+~ ?fFGEj26Cl_*_~.GƲ7^r.Q.Rx&fPfFCX8;?OfXSy-WjBxKWc!*+!⮥L4$$) LoŴU $p ň\SV$?5x^`+Y9\}A/?Y>{ԤCǴ-]2XũSŅOe?ȩThW©=PS13T]{& |bJ5*QSPr"jڌf!)041n hka8^ #*τyS[+;fv⿍XFmhlF[,9CLo9{>$} pL-q$uVVQSf --1ZI E+I= R>f6̋>9(B?Rb|{׿,$ êUW_ #p{7}clp>':n@i~(deKP#]4 V_:eЛkr]]d ~ޘgTZKgβ&k'{clLtu<DXÕ+ܰR|ӰMjx`& *#͍ °`o3iljV% ! &mqHݲ:z$݈ߟGv|,r\cV0qΥY81ۛpޑ3e )z<*iQ`CFfBbb"~ӟ%x}OPT%bcU;<n̄$UծKIUGXl\>'Dm*vrr凉hpƌEw!s!=v[>JdGMŋ\'VFp0hTpbblFaA4F>ιbNcvG1h%F/ F&c:^VLfd$aΜ7ZRGa![q1Mܰ07f%&RsFlhae{cp!tKY_裏"<<ޱqFēW7++9g 6Ta"na!pSF~ ]rYFN-15|pvFDv 6AYVB=f@ކPIkYα~fV 7IZZ뽜#C#mtw 'rw_]*oCCmXF`q-ie} QWW}?@}}`4 3FkAh76#Tn272aeRs3axr?pssúuMͺݰ; l#-ZY'Qp9]<#a3YPI)͑SO.]B<&! ]|T\bNg p~dNPN[[} l=)jY ^*u댘3b7h)*8׻pmBG@Rt&^8E q~vVVy?"ds@IDAT,frn0`!YJN~¼@O(>w̙19z%X}8qrzE͸% 'DLJh_Ö䍇J\Ŧ]o+M|ᇬW=(z{(L OgM0iBQ@ft5(ʽ(6G.kOrHw!Az~ͿpaPV32F|ͮ^7>HH*oKe-T_RyxaΞ17{,vEg+p0Bg/w})3CYa`aoŋM?LMcJ]\R)(Y;c鬇h&PӰy>++ب\dn0V;?x9̑4nuw߻~3oIX`&d0eeqD=+$Oڹ{qbFF23IJK} ./[<*}dOnt?4I7db\7iJJRi@{JGQv6􂽉$ѫVp1Kx?z1xSጭI<$"W>g8I3 {{zz5:*󋿣S<)b>OyJNgrÜ?7ϋ]]Ō0Z\}so7h2m0%Cfgg$|3))Ix,^e Pz-A,./28}fV!y8Ejњ^RZK*Y݅RV ^掷~Cg,t$uJaƅ(9r=a[Pt@[==뽙:/U*xL *702Ya~Zxx-ĉrvgfbV˕>'o vޔ [g o|r24h\iH sX2:[c^.a;UBy^j"چDžRs7-u5,EXL|-05+_aNQTV扒<;o!7B(-#64p/^M6ڪ.$;::QQⒻݬk7l^˗/ʕ+sݰ6ȃ[i(/`<y(ARa`:6ip a`.D@JPxأ%(PcadFIg,d6K1 :#/$*KrWhki/]ȠC]HI#<  ~]KFehXf 6oތ'xD_T?я >}o6VZ{wh;=Q&C^,wKބC[C1K!S=keni`T\^ dhЭ'mEy-ƅk }OcX_^(@+y0Q(2k! n~K;3[X +9q̝“]KcŽ%9M8K~)VJq^HRyA{,"d=*}NOdPb#$(>)q i:]#*P"33k,[<6lهb,ʹVړ5 TQJc.H0d`dEi+.N *_{\n.4a>2DGC3KtwKfݪ+m'&ۇ_BƦ} 15hI9Z P\Y[DYE̼L+8nncZ0ÎPMU:/ƌҽ 54Tuu7+s*} dYȣAi: PSQLle:t!UD8UW.,1$o=+{eUH߰W|_AwNk Λ-d!}_ JS.x `nk/Rm1`c _H)[ӏ`?Xi jSdd*SphP溒VZ&zR.wl,C :-|"d9Z891ACVBNʓMK4 '픐#U4MC|6̋a 51=AFD #E 4U0;Ut *o[wΔك N ^n-c>24(sIt6۟lcϬfFI3j +al(Pwz^=?mѐvyd̅?6OE]PxG0YkTE-ey')tA9kIHQibevGXDR2rp&ҔD@}r x5ԇF'֮.X˟!b0axoƾN fУ"< =]"А\Q6–-F}C̙Zv:> @ Τ禁1#`>uXajM)Nty&).4de_`˳+ `遻X ddK* >TՁWr6X:: U,Q]Ot[f45U ޅd$ @ t"q"0ݗO&Vt^8T0 oЇ=bkT籙 ˜a1ҸG5" gF|.HLD@g T^F:+Zy!k3x]ϩ"]>QSqnF6(>f'D\G D`4:[T_%u8!duLlkBJv ;h%I~ upF%,c$H Q'D@̬m~oT]fծNAKB"p24\^,QHMnB6$EXIKΆ%X①D:}(8|blXL?Ӆr f-~3Q$CttyIq#0{K<F[c=&qH"1]w[W- ^&"D`tx3`:RO@t D@ Р4h{uznߌX*Z_R(@W3+û.8v/73H,*&} =$%)"| J\e҉ȗv$DtwDHpCCIF*+YbA4Ҕ܋[t701F  ]5"@G`Xah(KGWg;MV$&$@e+iA[?&C^YS%&kW @3"0"M%,~9~q1˫p>iG4 u&D@RG)z:;Pp<#gIJ>%@]{| &wOVB^%JU" P](*HJaK0{&2L1+b2Ξ@n24x-It"4dhPڊ>'0hhpܚpЛ-,(Ni."0|H߸Ui9CٸP'S1P#D@Yx nh(F[K-)V!$@yblon3'u2`346|鉻><Λ`S#D@Z}eUg$ % IC$N?/P}Rvn|J\zxV6[*3^C3K&/>EРeTN>\(s!iHj$uz24(ѣ*H9-!bbr I3is\={a Ԉ^e%nMXj$Ȼ3:w+g&1rrΈ9'z%/E5&:24h} H DG/4B(>DWgջ%|0tBY=^ "6ErI ":q0,e;NX#E{}Yv;d:<.s ;DMS\8GSc ƒOي@Kk?u= c1Li CCcׂRM~DKLOwMa-=S$AW$S ]ͭ0@ܓC0"w/_ǒ>9}:Z1/ה87M{7%Xo)){/!B&͜&@Y/2 럶 `ctUcDj+KpwRjDH@֎(?IM#IBBqVKPy;^ Y m\%K=ʱ$YauLظ鏨-9ɦǪNHB 230`c'}ZIj0:ah,C/ud`h%GB* hP?(~(a,Ho"nFu"'lkA3\IrdKE 5"Ttv+ueY}sQRd(EaCV_P#D@zzpo +gRN@j3S=5'nN 7B[%D@OO}OY9IF2n(+8KF 9zt3?KKLZ28"@N {~:7ewN0$_Ak44TM}D+QH`HIVEI_/Iu$/7"Sh.V(DoDw̠#IrG{ۃu/5 @%ƯfČBg3_>` NC"`LBS7I^~4#_ PAΫg$ww7Oy\2^w4DIƦSrz sspBX0ԇ `k, mDSJD7BC  @=@#(NN^13)@C02LLMo*%E4I`nV#JE$MNCc"`6@CSm2w}fT^29in*9P"̓>\\\=BuQGV:Oll:d?ԛRR1&V D@(AiUoJ7dhc{jWXL%c%~L 2Wt$bvXIw:$ϡX_`%fHa[oɖ"* !Mׯ*"U_AGD@҈$ݣgpvGڛp1=> [dt[z•:j0g?l p^8t2 D`9B hn88-CX5 4u%} $ubjbD/W!Ⱥk*>d> ᤋ9`/@95C,&J@  ;g7L *R644& D@M4(@j4HHr']ܥwyaYL]{>t O@11AdAgg/*mԈ "5C2u,"@IlIƾ/CC]cHDͲ2-k{0 {#k3 #0˂ 'am-(=z 66Β 9E~Ƽk:lfHܿQ;7}.LIDO11:ȶP'0R/\WlrjT\i0" Wh52o.sp=-.)6?`u< .EiR&Jh:OJ3h`k*zz5>jW*Qp=tWbËq5P#!` 0Q겣Z[;6*_PNpFo_HGD P].OO05.mdL/śdZ!VF}X 7֘Pa5܇g.T:?BLV/@%tU 2>$DK@Cw Iقl uqCm(q-c,,q.Es&"3hjh%/ֶLP)\Im;6ܧus!fmqq R!010?޺UKpջaNw`fb~mDSSƚWG [Nr96V!, <m()9ca9'tt ع 9S!iU$@]ҦE@FUeqn|n~8il_LcJ Ns"@Hjy iV!ͻI}FcW} 5hȹ:l!M-EKb#=pvѨI@nwFǗ`E8w(fŅCfJUJ#@[s{\U hai͒wtX/M~&$!DHbj W_?"a36|HU[_FqE!a^oK]k / lu6k< !6ɳ 1Q\}m"[[a{7S@,HW7>//M'4L44桷Q#1 g[a5l º0e"Rn<ߊm%ؒ0Bbl2F$K ]2lffB8(n\gwζ.pRk``rpH9M&}D@xya)misCӰs4c6=*rȯ13>~_!HF6xjeȄ ,>Y[z4_...!W[&":hX7eonTN.?wmMBhӷ_`)šW6·兹y~z'X)/9bfeԗC 9t@ wt"Gy !lrNzGfwq 6* 4XXY}i|w3o1@1:*WUgT?!Lp/<µsB>sў^EU 3"ދDC.4 p#p*B4#ݍ7$FyY/gD:2w>5CO0hf4Ll'D`%(аZtfiKn*AۇEj[H쓓ƥ=+O{RQ/(YS#=|T>r#< Y0" 7Ai(̲ M׊ ^ᨾ~ =Mb[HA'@_cP*NxZGoabxf!qWPNK1\9&:*v,{!$U." EŸr-(&[`Fue~d|31読DCU ~aB1.RKR"zhX=;iDMpnSsi+&ߺ,-h.&J 8xS_Vp̃ y!DԸ=;22"t":{ WV||V7 "D hh/R1 s-xwGͶOPB' @XFrBJ[:Ȩ}@d*PqQU4' &&Qe@Lǿ^~ #, ԕ"+Fʁ/[IT|vJDMr0l$'3RROk/t+A"@G Dg9r 4T]::jY/hZ[m*NEǟaq~&fX{aD=eCR?"@>QeUpB|k aZT" W!ES㰶|&<(`*W\d7 $@eӌ (=X;e܋wO tWVS}J]EaN5k}v'Zzk=6vejUV8z3j@ӀD@r( %!F`vz3*sg4=9oŅy8!чS6tW"| 7!< gb)E$C%G`^DLfª<܃B%g107gLjW315EPRn\(Oh#{2.:ӈhAh|qi@"@VM ٮu4Ã*WٗM{Wion@/֘`w^})^mA7'vG(ȰZԏ$P Chj&)ȠwǭNb:=#i߈#oFH˵įu6khya۫&61'&k֘~D P_q/..[,,CY;tŵ#t=O2 /cg/>'j4MpEoP[;>B`olg?W4\>E' 2clQ۾t-~BCAb$ee5H54 OY"@ 2 LL]~g:S /s]7 4Lȷ\p>α+v"y#TudhĊ|T4+^-̡mRYC( $J`I7.(J'DpA?9eCO鏵#}?4\d,U)&'0YYOm#adۚ,mhiBJHK56]g0`ia /Uu E&Y 1HY/m_3YDҏcU1d=UFfnW:Pg謨ƗMfެy5.\[oqفቬ%攳L|tΞ_6O&tF&2t`+L"[D78jԑ#[Wg ;{`A0YY{neUB֬AC>׻0ց ?QqY35(2I]4il|Mb46!4 `(DFRʼn;@ PLM#E!nA?ʉ{Q;v#C;::*aig+'wh+P}?|;y#޴S?ޱ#*aPZLMFTn@8-`UP'"@J _eBAY~_Z k{^ EHߦ7OD)#(U  qU'X8A&4SVL F4E`ESCIv9Eu<{wK*z1 ML$#j !)a35nبǼۀ<x]oN SiV^#+'@3FB`zrLxjJFM~ Tmq 1&W Bo5DowHG#jk~]'5txMṵvpD/'"af]gAᛴԔ*bfjGOAC$@C\UI5'Awѐ9rGZ4֍=7pԠ*;&x]*?gx%k_Bѻ+11EۺW7iurL Ⱦ%+o SssmM8C93 ;ԉ)}h+s%'ɜ_7Jcdn^y8u9"JhX%8FcJ9Dp/=  IDgs(}3||^inm>t٠GG!YZ.9$BŰK]JVoi? ]3?ZAsg\]p۫ 1)Xnr8 4{DܙW/$*>;xR^|7ܹ40@IDATBB`?{ #-,ψ0d|v.w%Jp71;>!_ !kÿ,?n>;rC,5e^[ZڨQLSAM@3!>U 4 ]&M.M恪/X` kLM0BwN`8UKIP'<O<D@p] 9,&<༼88E͠ kQi*TLp D@ 0:uٹ(|=v`_ ݈^V7XO`jhWKk`^Cp wɿ(gfp@oT<2<k;O(Z\|WS*! N:v ͵|),au6hFPAs,i$"@$N`y_9K˅v"q<hZk901r+Bl TM^]\/' v^Qq~TZ!T{R¶G}1Dlh8N GzmO%" 5|wX/ 2V6/<2؃"N h`OFíT? 4?C :9?]\ @IՔ 22.&1XwJIP 6}8xzܥ_*z}稪K$܏ͻYO@{U);}O@/A]Uib VFRK:ad PAi<ǔ֬Qm[@s v ޜ}DJH@џA8=H|R˾V pEoډ]V"~ g 2OXY3-=NP(fZ67ʊk469=.?"@4Cp{kB<}CqGuC~A0޸-aKkbJ{7"ؠitC'{`7q |-kT:<} C_^Q&/i2+^=.~ V6=?oJ8h4Ii3%,X!2c0yVJ)g#ljnid#`he+ﴀu %;B" AL,l뱿2 ]-efcJz_=||ajjyt5 K ~ 19$WoP0DUNDmS3sQƱ!L&.ߠed  "P[om7J?m88߫^I%'Bksffi[[7+K@F0 J ,VU+s yY9 ,=K,I%D\`"@K` )U=yv3ڼ h(V|U7KeVꃉ)2?/358~YIDܛ͈0bAI";ڙV\Z̖XcbIvX6aGgC",-e(qnxzħXV?m43=b-ptvXa%FE FJ [X!0W9A13%*:ݧw{e']i}^u"<hX':ˈ Ŧ nTavrB6$b4莲 M"_uOgBD.:p*M$~0c:Ml#=.,LHKKKk}칗ZIaD"p7fw{^#D%==[ʊEXxY:$Wg5'%n20 43_l DږG|n:}X&Ҍҩ, UorNs&I@QO#!`bjԔdWK/Oܶ}"؄$y#yےD`UU 6pZԉBh,[$ |DG.xMhoOef<ʄ <+O2skFumVJ7J44bbhv.n (4ֲhŪD@zT,k+@r"Ť0ǪI',X [$x1zq*G9L6@䗈 $Dmq2_ %֘ {` ϵ7,-p>DVJŬ \RULdy^%X[!"Dp+PWLeX)շ >AWW=z{+)1 %H$ d DMtWi<=/-8Pfm+hW {ػH#誫 S*&[Z 8*a,{!Lկ`fjE9$Gw> #Q8{ѥ{\Rf=ϧX 4,E B=~6f&G]o>[wwcb`oYwWXdZ-- "RVԤ)+w+CHLL\L$=rvZ , ޮ 8lC]gK?(Р4+ D,ybf+{{dzI :DqQW@93Gg9C3 L -\"$ғjy0׉Q_9U#:jl~,}fpwWryD,N!DyoE^xwp7!=kGy;B+NF_}#=z6+N'G`:CFo* !ѩ3yUE bc7"9i,, ׻912ڇƦqZf*zV:iO[⮁&X@NqdX\\@i9~ojjOߐ[OԱ28{a \.nnv3sΤA9 *Nf pAуN!'0ǪD 5 *ԣs_q̎Bh0VSJU+,aHZnqmן/fX]⒓OD@(РW;9`p(U){և^wOV~LQ6 i' r0݃2Md(5&&FdKU&cu_S+GZf&U LȱC_*Ad(EƪEs%{$O2=}AxyI6!;)2w#?VDh Е.o(DNΟPTw m053ןQ˘W?)3H`B2zIG/ĭE[u=hƺD@W*O v.nLLմ4𬔩L2™1VP3͹tY,ސ V1aImz 7~<  Ɓq賴7V򉣘X"#cÆ'혌+W?@MJ85f+6$ 4胺9%<? y*FvGS!@m4 41QijD814\^nc*r_N^drdP&09|12`;03o* >!F;+sJ/~뗄w6ؼ]"]KEQ^~^Hg"*hX6R]]lk]Rq3]Pz=ߋ]@Kɔ[s wD Qβ( ${Tizi<#& .rFw ׈*&lK&ڒv2$4arOn^b+ov\0FB?(l-:-W4_?)N}#9DF R[g~~Es٢z뛈ϐ<咷vQJ^q۞hn[pw J@15/ 75]Bmc%Y) (\ΑK϶ޙimj  V*ɏ9,E?"&&fXao5j\\X0xlI{ȨyM˕r2{x[ [ z}]S+WDK@ȋs (V;J"`jYA9=s+kDb>͉V\h)-BK%nށ_ , %Q?F{{Mt \XG?IdV]?cAdIE2H$462^Q!fL_u2)f-@WqKmeꆓld= _K`N@ 6[Ԇm, uJ&OrAB\R[ ; \KiCh-ffAc]V6\"R  .ؽ0e>jDthfKk;x`d0 Ձ9:'O7Yd .93>Ss Dm$ѳ{Hcki. v|i"{EIgwXH'W/mLOc.RW2ݢ=IIDJOON:W'/oS#8#8}&qogʼ_ui)! . UBwf[xňAU\f#,XPjD@&ƆEbS*ffB"$akK_9e6ee199|s X_4Fof⏾7"@II_s߸q yyv w#u&h*Cod^Μ](+g194ay57s.S4߀b½]ۑC,de޺kj1"|۶X+>MET[n4"Bc`cxKtL4Bo$*󙀡*SҊmE\fXZ?zffP~ȶDoFփ!D@3(Р? p9&^}spX=pJE:`ݵw{Pq,J? ͝8@ʡGo)tߕ|^TLMb0[%xDR>ܧ'T 1p $ʯ/Uptmjf$ΰJ%\Q033]j'Wx011f\7&64 I`km`+DEI@Cttţ Qi.׊c'xr[cb76<^񥴣i7<kgHU7"gT}/| vN{x 4VK _< U+F| `BOC.UcnvV="tY5: $%(rm==Ya7)&^9Whn.UsU$xBtH )Cͅ ߕWCB v#V-|2Ap,{5YZ`sO/!yq_AL(̬,Y C v`l|=ejA6[ܶƠ4meEWƫ$qSVA9W\ c}icDmA]3hKNn)8;x0ǍHL5:  @]N:R_k49񡞺!$Iwzt k4f w?pț(@WSQ,&tnԝW?ļB -&q>>n4Jz:z/xsFz:EB 1<~a>}cPd2S(V@D@3-FE9LMaHZ$' 0!hb %%g10pK? 0lBOez,! @ ,TLSJ7OHvhhmzt < ̸Z;8`Jl(|}L OA{X5ᷚF_΢J1^Y <6]S`mktÃhf#ZJ1񥷂O0BPht*mIKpGUT_bfJf"#3TCuu(e[$FǾ(#`0u9iP"ch1pNTorA?)[SjK`)N0ݍ(r&xEG"珯b N|^Djz.yWobvtBqҞ~L[ՙsX_\ JJ3 h-/ }b-CcDqn FYTnͭ [acCQR(3E"1uSdgzam&1QLjD 4: byyF51žUjLt97k{GznEV Bk'ߢ%n4ӿZ_36 )ظ:·L |nMO87𳴳Eg6ISn 4d_A\a{, ǰ&XBٙODn-5[{gU@YxKTQxP',{TȪǼS'.UeC"~n1>HP` 鶶*\S.E$d"s0qk֘ 1cOEHu6=>JLO8jOOXOA٧'Qq[qE +rnfE?@YՅ=2= C'0rW1106!,>~ 񠳶%>pWp+G&f%]C|ގF\Uy3&lJr?Z,hzvn⒕DhW׮}ʪ~7hgBZe3ǮO19>j&V Yzimt*M )РU[%&L#7YX{VxkaaGu/ ZyQ&:+9Լ£Yp! q0D%?c_KJN~OAXlz<g:Ź'PzJ8el|+ v~9Ʃӿe ܬcL' 4h962# Iצ|Kcº]"Z6?Ky'@C[q)fzwGXAc5tT>kcvT>EO.mB 1[v3 KNy9GD!ƷOPA 0d`Z 0El@%篡V1fz֑(YKWaDzZf'&ZT,5|GO\IY+[/fh?NM:XpKz mC d|e{{7e^VyI?~*d=G0`h0mh(b%AħpWJKv ʯM;d޲m'{gef&&`ewoeN'ޕvQ\cunAVuuƗ3"cы'uZKDYJȶ,55"() jo*K\*BcҘC:ܼ Ò(}sL̰ygazR% JN+!0n<9 Ԉ3%m|t_Yy+ 4Hw=eY__+cxU5d[\l3:y3Ϣ)nod,ڽbzJ|aٹM |6k;c#`]}?VWFurQ}GsߣGHì~Y4YL=ApZ\gLԯqJ= h@OӼQ}e%FHH>L\a)`8|nޒ#&;؁sUmj緶tWԝ +%FQ};r,. vnf,,m33Kxz+^a8mҭ>i*b ^] ڤMc˝/9w} W=#~m]e횵dd Ȅ Qޅgh$=U!k3PʓgӾ#M` %K[;Dg@䆭bˑm}l{i41 uR!6e HFd߲̂ "khm^T77?"q;8<܃>/G`~__~Ny"`LjS|\tf”ecc\uY2v>: #?a F@`fv >ASGsg?" VzE|Pg+JO<*cע8q ˁFj`8:_N4eֽqܝcmOC7ֳ@ `z Ԉ |;[q}w7xyZ`v ?@qݱU03@{O.|I&[W46Fmg  @ꌀO0R6GQ'|Qqb D 4 >TDXi Xd[ -u e=I4mDC[e1`8-K Zb%Q7Xpk q{Z ,W`FYt; myeqjwfɚƖ'yVjY]X0M;X!Jij 4h* I8~AT%Drq;"uU}mJ4^ }j7y券m{SCc W] E<0j@pMn’8L0+/&&T&VF>ei.e.-k7iz ȚH>ge+FU+}V=r_6 &J/?u}6=Yg_x^u YOPNQuztLf& u7ה3zDuYLJ&sQ)"`i fA%Ĩ:[xuśz *Xpppe:ocrr,{d LKSYqґ_ ğ@D@&Qus\.5"26#zNXG /ECA.*El7!>}lu,4X` z \gavz+[3XX ~@^޻bDԈ+EUYD227LfUth5q Ϸi8m؃:16ܷ/}_6z ~ j#](?~ 6јD@k;:Bs~!oV,q 2l 6C1kj6KێZ>Յh/ K \]}) vHy]KvuT SK22AںQXWQ(g"[cw#-XK3)Р3ԚoIqY|59""5ghk36<,D^mՐ{OhV@ޮI<4 z|rm,gٹ|T^yUKTFx\u-HAwS,eK%ˊ-K<ǎK{_|/}.rXŲ)XN$3! >o{g{{4l?8@#C)\4Ֆ̸oQMzy\6@{{+n&곰.3yH8חsfω L4~tvӬZ3L"aʕPZOB3R{zig!D 42QC^>{p?A?)ոŬ/W:76\uHړmI8ڂ4-DSh%P|C#NYJCDN g78<(K w,B`<*ȅ: O) B!nHE 7K`CJ6Bi)EX͔Mt5Y8CܲCBHr shoms?ApTB>*Z+)IP ~WC6y`L~t:nHe ` SHDM-">J Lwᩙ]vnj7~žaW%nvs,T[ȅj`TLzI aF^TT$υ`/%P!!* JT 8& r LecpȊ(t{M+x~qևOvWwʙC3ڇȻOr]sH޹NxY}62o΃͸gG{h,N{Yf4-,ߓ,X wL_ )sh@\qw3{Lm)dn{BlpM%ǭU(ɿ~ctEEe(r!::ncG+è<<_/p;I{.C=8{1V0yPƓ{i43@IDAT WW|W. Ѱ$,s0=c7hr2|-c\d7{?Bo}1,%;{ DG}5(%o)&D0_@st\Y! "YGL= u~Ro@(+P 0NCYQʒ3RP'[XX2 Ngms+PuE4<-̅҆&FfL}qA`y]\u,ȅ=ؓa8h4*.ĨZ(6e?M1cdźrμK#:wo 0*1- l iL=zH`7^"^:G$EOyGPl;_ F4ܹw^B=}li{4=h u\rZ?KAr2ȅMpR nD>ztv!."'a.&J{'F)R{W[vy@QDGeiJKѠX-##p r{W-yB! +lYN*"?wvu|Z#>|oVt?Y_nW_[;NFk d.062n]SyxcS/#".m&a,OE4ױPCWzo @Jv)O F:zwÝ163aIs!&4\dfiDCS[5伃 IqiM!2+?S-%fl/YWO}]Cx(ux-h4Fݴ?hxzx>Le#U׀xqKrC^Hv%QҹS V]NgNqL>y,s9v`Z J?i;y+ē:F58\C8Hvŗp+CJ)m/Rb7AGR̋= q,JH%; R h0,5 ϫF8 YB|7*gZ]xrő5!9}m1Bn>8' ;}.dh)+W$ 'y qv(}s:)~EX EzC]s! &KPQ|LЬ8h\zE.%pv,~^.n|]P'GgKޅP ) VrJ.!a8$\%ju8_Eˏ-l?F![66qbW[#{062O"ޟ;@kɬ҈SFខ8Jḋ~aϿJ-MGIiHq1Ŗ\zjUPp\zLkC%y.*3M"#s6J{=-kMy1ܵi [eODCaEHNisNl݊k{l÷]uM+n~{,rǃՁU s!l]M@[S5N((|B.$EY(Nw1Ai|Bq(\<}DM7sܴsnp =MpH| CXҵlhwn&&%~ =m$էTxM$ҹ9joR 0Ы9"<<[<J/DÜ[|gcc=#mm5 ؒqn>^ 07Icc3I\9=*Mۡ-! ]\ ^K]PMQ/Kjc6Ֆ/bb7Fl,~ٰk_oDf,/_Eч0m4&2c>E%-H4ʮC{a_FP1Z.re`-&*{q11"1q:S uƁsl0(u -|{VI4T7蠅ze³3yexSc,h)Z -ʂM+㡵s͡O wtUGYk*{㓱Kjf?[l|Y/:15:8sPrFRk 8n6SwPe U $CRNഈYj wIL[#C*ȅg <X+`ga\dzG񖏓(WxtgؗvAn Ѡ JA#c532qGKE).߱0d77Ő}m-p_Ԣb 0݃SgqK*ĆʤY=H}V+P_3euTB@]6iYwxfw_$$lR Vx9j>PalcVdo|Jm&@ڮ}TT@,%dÁHx˕5p/ _Y !Igy@"P@ 1aND0lAhhxĈ?ډwQV)kÓ${l#"|upb/kag>"Sp[_|N.'!sg!YSxuRn?PrV^`/'gI6 G6K.Asyڿ/+ᑃdU#dCG?vtY*,"222FXrvӪa KJ굷ؿ[7Ry-u "\C'-!  )bX0poPy*E_\S23\{gh(Gkh)+8-.-R|ؓPBa:R@wSn:0}~Dg<$9jlkq}]F9HdD]Y''!hterrmu3[jjWW\yKC۟#aR۸Xˆ¡Vi5ӞJB',<VxyNg76:9TX+6{V=qqq/1ށ|=$M,p1iZw`OCQ$8|Pyrr|\ܧ)߀Pl=ǟ$GhTߠЈtw//&AS{­㨬/TƱ'+Z+-hѰRWxx4@;=}tSE(:& Fgn-P-]9޺YL2iLܣP11D#A͊`t\eY__蘊ԸMؒ^ s$ϴwOν+Ύ:I=ĐUB.%>B4>rEA$0I_Rd"60IlC%yəʻa~:,ΗOq6'+i{d`g>FRMx} L$IY>#cR3W~h,BE1gɉq]\![UL2jMF2-ňD)meWC$fBJDJl ###-oo%M*c %'' 7M|Uy"hVJ`L<>}F_Bxf5tnlB3(xQCHܼ} svڛ? :Ww{m4'&h5ו3FalDOqӎ4kDYܑX,ҘK 5wGX'j'+t8.w\ ]K/[>z|OJme %%%x׈QDCtt4xW٩uuu //~񋤮l_qi2c~8 GXt}yB,xl~ӁwqJ\z7l/r^Qi03? f#,=>>p񆫷7/7 vvDQu=&+tH>]fI3meWϣD2ɗtߦpg(KDsD0Ck)cLLآR:Q_)։`/缋}hlza1)zU#-w \|(mSR{B` =L.9^z%.׾5CTWW50q^ O8AF{ixxx]r{{; 70{UmE;D2EquF|f$oE`h)64?:;Xًh262Gtց_?WBrs}C=6*K4QNă7>RKEB(2KOJwZG9yv ݍM3}fQ/P4IS-ɉ |N)3Sec_Բvm[ya)&SxIXcёO\ sa7ǿOCLX="} (FgT㛿!#rv$!e `Q\=\_ŒlX}z-q(ngŞ={|g^#L jpLCz:u cb Dý{9(*繎F!g׏\>@`1DdhoIt뭣Ӭm٭qC}ʍ@Ui<F$Oj]4njñ"l%&Lij&"@(4ЈyAe ¢mbo,hii7~5Q8D!PR(E\> 3cvՖ˰F=h##D2=6{7 QY{ʖOM4R(Gk0H ˢΜ9 6IƘ=qy 0<t?߱cjkk܌)6LJ+-&+nr=ېw}UBGR|>ZGƥ.rh]Te@=&ީ%mA}(>g@U^7EaՋ<&(|Õ ҰMK/>dra c*/džFQ66/fZF7$mhVLRfEdYwzAD,Wb;W /zb8f6>}~v^1ȯ~*bzq(1{\ LصtLee9GbFCCYW>1I)پD80h5ׇ-tg;һHxz(p!aBߠwWO<)BAA^D\<\YALrpa! H IB䒫itZzI!@ :0_nِ>pzGޚ;7q^Рpus׼X]qF~?Z K'//mhb+ 3vnTP:R^_Uh`RC1Aa C:$c )C3y"9H^W: ~y2@=ܻkU(*H{="z׭1r"p<%&Égo[6>8}e.Y_D")C.rJi[ q &&dzL\@"L44ޫi]k-e`RՒ -if3xBK,֌*Jʻ6#6щ/๨g㉲bvXPr] !???~z2*?#s։&eEL:Uٳ:_65ax7Ϊ"X7 tMtq1?d!\~j݇Lh4%h~a]\ߌz)ZksQ};]3e MC_Mf"s"Ps/)ltx@};B:WӸUi -IΙ>ZQy J>oWOFrzkslm5_apI cp"]]%0$\ԲdXgdzHѳ??qa 3N 슔~G~{q U#tJ.[ei,'G b{ -Zuo._ymUc{hG${̛vYH27^,\d 4ģxQ,}bt~^Aݲf 0ASWDaEگ#AؽO ),ҟ:͸f( % ّ#G;(qF__K'5\xQ\H,wU$ó>oۚ@72nSfrNsD&ؔM$grz01DCg} [k-6,XLidk,-PB8, 01ݲ m*#J ݮP$^슘48MgBPx8 sGBT&GC`&,@{w\{ hH? w"#XCCzǫ#ZZZqqq7<8 q9990OZ/r1zgMg>C:sЉN,rؖ}X{{$a\ "ӕ;{  l#r:뉧'{'X=ΕW8RR^" ا8g+b7MfO)E2<.@3U%HO_\$#{{Y6 ^?tr!."My.D;U,|?.³W2 zݖYQh K\sppwK<BBB}~ ŸٟI!kjjhFG&Mo֜ݻwDÜ N#;? "rQUO?C+NT!X&D +O:&V#Pv< d칃#MT|$M ,%yR߷^ ?J> /Vއ$P;ACBtX2)^} PT⪛Odrԧ̧OK) 40jB13sG}vE/RJ5] 6o- \ޮV?S3v^+KN_%r `£a2_8*aXLkF3y\Rb㓟Il (:5wnT?N3w֥hh)%r!5n G45 Ք-1Bopm kJ0<C콸0 Ѕa>d" Dkx_+c)l,Jny1jLOp_*|"|*X)!ڪ+PxC45~ID0Hhͮ6V<*Knb s!Ą-M\ĕqi D8_6JJ(Yqgb쇬cE.NؗvA fAC,B4hl@ݜ} J+2Ǚ+D7`8slh&Y n\5)O`-ŗo8,ROщAZJ$E)nqbb]ݰ3_@̺- Z)!Q Ålpߤ e| g`88ˊz<6:kg~{wΰ3FpXDUo"gUa89z/nTm(qhUT!)zbdPfZElq"VkQ0m 8GT !~3)4" ҴִF4]Õ+ou5ؘ[2 LB퉲|\'®7ckg D=ޅg!{ QM+*to(Q{Q*-JHh`,Gpה2;oc^A`lYc''&0H3r*A^\3 "_x4\\u9iN½k$3RBֶ"LkY%9eޥC5îEJN'BkhLQ3KptEX`ږ a\y:O8p?˒B4}(h&@e-E:LK:x\`mKs \ӿĄ=;tSKZHS>ӅOKJm{&}~dl> "V2]8G^ 7̅x#ch8g{%EÞMOIN2 x6m FBR' th08KKց 1NbD HW@W^pzR'oE\fyvr5{m"nő=0QBm6d7iIۼ4 ,j] @@tw4M>PwP(’1 f0E N <ݽf7dn= IpV^X>)ɿg$sLy.lx ZpX-;-I4LNzίQPp^u_$l$Vr !0Ir 첲ʙv+hP! \20zD:t8T ؊6"ZDT&)=Uu~L6/TEO"rXm7w˪K " hLo ODD:E>B#V{EƋccDFnsbw?C]]eWy1X耕Zi)R XYxy[)bJmiJ[9='B%efIوȶ# DO!2W;9TVaddF6`t+τ)<ْ6SCk=.yxTa5atH˂([b(<NN@H46zI[)yre P_Y D|zrdzNp^Fw&n9 婲-'gU91v#L@H[wbCVMB4fܥA@+DLzCC zW}['iL=c3Z' ϰU 4Tб.{!<! *k֮Q$ѭV[};ED0gAٲJQyTy8 9 `r/;(Xӹca3"D`i1e^AxVGҔ 08܏sBGi+DWf DfF 3B4 Xi:FQ9L?Z\ 벶_A;$<4Ֆܺa{q,HФ46&FQ{Ne b+!0,x!Ph~NlQFDb.9xE4TV70::;uy(bKpIXI{5?`wm.h gw_iUܹs,&i(QYX(# f)DvB,Ӂx^֒.g^A!𢴚j'y|GOk#jIE>L؆uD"?n矢FB"gd|qWhUL<4֔,D@xS/ 2n_I룻MH'&K@)LSFE{ /a^h4 7-?p: Ls -8w'F?6V<  ,Sz!ǾAgZt@ Rh;M BRڱ9j qGhC PCl&ͧ-0jֳsjoD/t* e.T(ݧW@yA0 Rm:8N愡iB h]⇴M>qh0 eEQ..)܍KVAl) b2:J7o}~Yω$6[ryK @?M;p Kسk Ѱ\kD@k5yUY&x0OJ0v,6مh0/9e(xԓ]-襔,r8_aI oHZo= Ɔ0Hz =-ӈz uTx?8R_u7 (362\eÓ-m\05ӊޮ) !|~fa@@bht\Xq[zc8C % A \jR!7=ruBƖH۸:WMuRM Yٝ~r'gޮ6""hIDDOg38$cӁ= /F@Y\~&Ez1ۃnrj}X-iO#t)2A H^+-B4AӞϩbϿc ]6beЉi^Ak$/굷)Ԙ"B7\|rT"=0[vZ D.$vG4 !! ظ"#lr`SC"9k;dnD>hѠQ #nM!]mTyI) |˛gXI?1IdB{P-GHJns3Ø`T$R,Ȣ; ;y$'m_zcrY0>jk ^4[^ !f]&#Y3JT7(=]pVk%X%DCm#\0?mXnoj!YY5ᨠ< .`l*+s\8y-s]HP}pp9 wwf2p ǁ/S\̒WJ4){SD.,-k)ǹw04)LlPhQ>,#±mg+=$.͘{)8Vq%-8>evU.ޖ0XKnzSD<8+)|F3ϩ&Vh:s6mzJy˃Ų/hk~ (!^qg,zG((u؛mKEr#`D÷_;5r=-+l+gER6 N-FQFO Na/"ұr(Va B4Xf$YO?ECU25xAAі1HhC4ѩ? ?rP[?wWE_W:qVvNE@Qx Dܷғ!`DnPRG1e31a 7eeʆk`ʪD8B}6׋MވL4 e),!)wO #zWlYr WiSbŶJ4p[o@i w;f="vn))M׮qldEmA{B4Ls c~/lǤCLLNLVF~H+y|E:j9 @UڴehXeQgDLEDGgr#TSW‰b=bC``gsFc[22e̍ FXB41"̲6^]TbtJuǨ ?0p^o)BUYhiq"'`g+a%ɹ 3mM$*$ί*K!iC/~!e020{>0^|N><:ugO\  π{-xׇpp(W@Ǐpݵ9,UCuLL.nQ¾^^\MB":Zj^^46z}+Qk 7zH?'ґHl T$!-Ʈy/#44OVlZ$wy.듳dѻnJ}Vw7ޡ8$DlP!3anr?*Hqzy\I"2Z<#Kr1z?s!-%**] "jj*ҁ!J;W7c技(ud @4baxa6ͻy#(8Vm% Y-IuOis;TmC>D:("pxWPRk@`PIBS=2k7[uU\6sٳK>ؖy\v5@aE.twlslF),krDc"Vz}a&?4rll~ѱ W8?!zKe_2WCss 404~A%U@\## 3t֣H,p\EVR>R1أ"h$D!VlD D# 4֣`Nٰ:G]]P_U5C nn^DiS~Y N\:JJp]yV7 L}Ci+{3H srrR+p<k@`9B4XȒ,E/4L<(t$;T]Xo !`I\G;{嵢2W0aOăp͔7d`ƒCgT"a0eJ !?MTS\Ԑ^wA\؂$x>:}տ=FF6t`ajJa\R3+yeXLT4gzh;> Щ""Á{B; !E D R`& 72ThD4|߫i@IDAT {\E4 RۛoΊMS{hMY$*o>s&}i$Z,o!f#"۶ >‹Yfz@.~䤣seHH،+ıȮaA3T[A}59t<ֽN:mGKtvL&t4 367b|tx4DPpM1m0|.J.m7F4̍Eyu媻܁|@t( KFBŮ݅kE4PWWW;^8M0˖ d]h | ,.18~n4RE@G1= =+P=v XI=#LY8GDD͊mAL:89Ly {kkvzK~`Ay>t6= HLtSm*Hi -zr{!}(D+RmDZL2OBUԨLvXj["Xi=^Gea mKVM4pjUwebSmv/N-WrRW}ZwX{qy\hxB!AN]@<(rv)ArM?.zov4XhmMK(fŪ^=_phtNXл0 9q¯!^6o~Ri>!^[Ir#R:H!oӞlnbx$<  !u4/~Ku%lZQ^{,&7Tu!8 h!qRR83%]B1BbhRQ(L 6P! `)Ԕ]zv7Cy"*!KXǤYzʕL@_7.cJ/W|_Y1`rCAEYO4G$ rYM>.zϘ}}flM& L%A@XB4<9QXL+r*-J ~Jρ]wI$P!ӹH؋%::SU&kc⡃,XԯU0,&  b=TH哯cl*d)3c?m{2'Y_ڪI )֍9g_vYuęvfA@ѠM})m9"b`ru);^<=~DDP캈KNGI,/,ʕ9EcC)hi 6VzpΐB\ON֥$]G落9\*L Ap}GH^z[qVPp x^)\!blHzAu{*w3 Rovz@7u)3Uv7&X=IiL\%4Y,(Li nxT J DccRk$ 2Y08:7 HևZǃ]al4|X< ȵD٠3S5qG$y-ym߉ 1[E[' 6 61 ~! T5>2!~-!Z!NըyV֮]E> s(#,4Y2)2z)⁼ikkV჈T$ۅȅ3VKq}[epMacBxipDKk:N &s~J͏V>@`M+F m" Dm]6#Tީ< }mJoqu~p2avͻE#*2ij_k,_$ Q44Ѓ{T GHLG'q^ν0<؇'~ wӞ#b311 2uҞj(bKpIXI{H,RA@XMhXMZ&CBIuz$ ">p}bB< U6UQ^1ըz])GF!.v~]Y=:TN@@Jj{=|GHJܪ*KD fQYqSit7! )wSh̐={&H*1BHîd `!4|<RN)~ TR:aDYGJA@9h!p暟]{sbtsVT֭q+*ݾѶ޳Kp\r3iА>3#$4A-Y7 r]]M(,s1FU FBVħm0 o{eQ}@kK v4תp/>ò-pf )/V&Dk4gZ > v#b/0l"XCb1,u^wll~Vڌ/,:ַ@CuSXj֘pvֻ<>cɇB+D(T*ry6Ѳv=N$Cx%xJf7FGQVv EC ,: [.?#8$-nWB+drg֢ž/MHȶetPkQ<KQr`VǸY|^er\]yppp o4'\+ h WW|W$hX\r#׮f ڻ/Da" 4L^ 4GGh`4x&n>hnFsG )M${ =r " ({zis =@:8"*>S œDik@aҷ]8 B*J89>LM DG~k G ĈT# zA!L 4f`$&Z?ZqJ.Rg]GJuNA^ ,`80Ѕ>J:Z {RHDfthJK]8j``z$l϶\t7P]}ccnMހ8𺓳N$]GN۴Ο"S ܇Q%;Kt?YHvC=PJ.J5!D:qM { EFG"aYvicI-c@I! [%ndYŻAU[. h0@s{ &eks(@`&H`2A ]SݔqpۏgC# YMVZ8FO:"rvD{7 **T=<|WzY͞Ϣt}߾ز^ʝ|pdBBL@ P &L+gQ""FXvś2Ft;8G1^{ w^<-yi-ޜQDtAJ[nQp )ENٗ>e•8=;p2GGM{Ӟ@|uZr|h$rmK A[Zb6@bT[5n6viJ[ݧ H) h: ~/3?I.ض:^"khn w`=:U7 L(y 'D:S< c.$Zɳ k9C Kr/Wr )G@c$G@=y|?%_Vб>#0@;sǡ̧ⶥA@V XMZv@%۸-+̝6zԅUV '!Ww$j `jD ԈJ{Wĕ'HoLilp7=zsA&_R}jNvLYVg=,0ZS:RPzЗʆ"w0t1-vmm1 6؍!;N~Xarrei`]W?  %<ô̂AViT,G R fJW٠:CS }}s Jˮo.aH؆,rgB)ҼW{uV$e`O,899DDžhaN,Re$::!ҘP%gM/B4LGü}9{PƓr1u! Dɠ!dLAY|?Vsg6N91<: [⸌m#Mt/(~#nd!!q "#Ric8OK!8*bDaǸW>zi]8"YT`ﴐ(RBE1g!&H.m݁qc&zzJ,5 B4GiEX5Zh扽53oJ zѯS+46G8۬d0bW+PRڻn*1z0NOqL:Y]R!VrۻioC8oH@c!/NKE%YO|lB\\}(mʛaɍ G@ѰʀS 0>>K?@iujNsC>qjBO1ӏ.;E,ܾZZ=ȠkA1c+|V5(OJxoDT'!,, w8|btw ?i6=⸸PV̤ K?ޭYጸ QjJ0<:.].*-!̉Eh⨈M"j(V)F)BŅBpK!:rJHP} $.Y s"0LnӡcCXX"5H<Ȱ+DF}WW8ɻ))9 Ba;,|5$*sN$/0b$kV V9lb X -W*43=*|q+^r2.#~ɵ@=kh@JDŽWwʊ 6]վn4jDX/ńs-)ZRC@ <7ZS=㡾^A]QYVb쐍u5HCƟHH? he8,=A@#h TUٙ/?< " sMI~1鵺^O/ݝ^ITPUe*g&qBAfe-e? p{s;{x.ՓL50'|<|} bxJ 2ȤRErx]J$i\|^UA$[[տbn\n:;<˕n .ES~j6 nx(]!, !n8[G P`h`P! t "?Oב2 K2f.Nn2甯CiًT * rC<EE' X.*w9}7LzYDBނ#P,w1=l!~ոuMޮ"Fx~ƻQ&'lmTAQ`*dCHZ'YC] gnEߩl1+La7%(|7NURˑ4oHf*2_LSK5K_w?m5(!44l (@ N`VH,}BD"fT@FW4p/ L@H`zoP^qEe2R"7tSNm6>r4%0}mh ,쁗V|WJN!ݫޏD̵a%p4=1ӦM5ax,Mxvj;NYv䥃(.dk>30 P`XR(9%}%%EBKk#;ױn,(0?׮K9;aEˈK PtGnuc張n(0:FĽ(@ P@>غȿrWKϠ"_̙ 4r6MMQ#8=b޻f BQ. rVŢ+r aL`D@N Pe$lDH)nXd]fn(YL;L*ʰΏZ*&PZuyߣ I@jRXǘ-(@IN +OJ Pzp^X: Kq6bCb u7[`MhdApDa`y<[feuYgQVb9(@ ZC?;O PVVVJC_H q~qW(ܼd}j"7G{g&,prVwB݃#UU G;'4{F P@ 4hpP$ Pz/ؚp0E2tDEL}xIhle+fȋGbUfș.%084ײq8O4\TÒ٫0'0F_ak)@ X 2(@ .`ccE ։DQ;[.*EeK g/3]!URjcvWb؍j~ȈwgϱGP>PZy2%(@ P`"cǺ? qee x?M]ʈ"7OGi6xs\8nˇ00(+X!1, )BQtyVOdoO?I(`QNX3f#W:;eǯ~38xM44n[!~$Ǥf_]"igι}+Qwwe+7@fF Pu_E[[zɈ67 PDD\ i,rM#?VA+q{/썱[]Q[" SA +U^c˰#@6'~g N]>")[e(@ DG 55 r%7} eqj$"z ¦WGZ P6_w?lKy1A pU7?@ٝ>v(@g Y("gem:Y9 4`= 2{Ď 2hp$ PR@3V0Z:7Ⱦ~}]8r} Ksޕ_)@ P0@^UVz6-J6PU(X|BiKα,X" ۹EGQq 7/VH(@>7N&Fזv53*U]}EǍrN',T r읱~+(S7s&>esW q X[XP[(@ իYǸ4$Ǧ?ů:( WvAh"g-3{M(`K'F8̘,(E9/j1Í(@ PC+sb -CyqÜ.nHY@`C(`)OtMI_°Tc -QZg(@ PП@QIK&6+8+^^cnC{80X: >,nz'~S#gpmݭ-X\ \B P@h@lK}'od:kQ|ɛ5R(C~Ga/q=Ʊw~jm}-=fܜuz6&`0Y5q/=4=4~(@ <G?momı̟AB K^,}M<՛g[*`-fd/'`AƖQ *~Q g&~_)@ P_ UݹS{zd.]:9 /, ;;3~@gw.N^:x:{asW|t"`O+S(9 9{?  gIMQZzN]81z흦nW!>r4sʨ#(@}6Рa+)@ P@+I!g-5p ?WZiq1 U"Czp _PMvw KN P!NR x`sBq\LllPK)O=ڇL@ȵ4l`&:1](/& >j + cbt% .6-`mm"$ Y{y~ʪkXj&胣3 otthhrQ DֶX4{Z.>(0>ƣ(@ P"A?EI%TT\ACC9Vx !! 3BqQ`k*>+v4eF _w?d.^? (@ 0Рۡc)@ PAz̜1 HM?~'qN v2W*P|(/fXÒH$NݱZr Pz`A#vSf"'Yg ׮墦ӿ 8,\R' VXqG~dEbu7Gwn@g8(@ P@ -un PД;^\/ؠJ^޻_}/S5X7f>ZEG[&_GAhlO -(`h0 ;/J P( +Q̟A~8 - ?U"QU;馎L0(7rg'7SOMǙ+GPX ,^&R8A#S=m7Ūmuصڪ*+@[]U^4~5ߢt(f10`QPg4Q-`cc:#Jn؃v侇>ώ( #^B"#ZM Pz{qu@^VHO٢mì] f#.X5og]8(@ hW [F P0@mMTDp ' G{'Czuw+]U3§Gv s M P@ 4h}> PAEO>+_vT҄Dxh"kٸX'%Kfœ4-(@ 0Р١a(@ P'J%ffժ>H wiAHOq^jG2b6S#-d3(@ P@ 4h}> P \vg?`(hĘUH su4'/Ā +41, )j\Z*@VG(@ X@WWrrÝ;EXӽ-^Wwمb8w'OQrln(@ 00V1O PW{P犎HE^{MrCwO:pn`,^2Lܛ(P(@ P2^>7Nk:R+6!,pΔz(?Їӗzy!V(` #8w-$HSsDZZD34<4.yJy?1̎J9y`ccDVlPnQXΎl!R>ooR /A4 ;M P'`@q"/k‘] Xvvj K P K=0ozľ99/ pv¥KQp dVJ\`bfQX|Biː?Tݦ(@0t!#v#תډDn^C2(rQk}BzO Pt5&VU!Jh/ʕ;%mmM~ U}`uvLs5ɂ]ŰuM`oW_q#DNn(@z P>o`ˮM%hk/8 pHM}1+՝ z伋ήVuiY")^X"Rmb,ɍ3xg4<݆Xg4X?(g-FL1ں[[1*JDW ˀq(@ XYY#a2Bݸ~W"W|..S48؏g꺲/!24nJA,L\.9p,D"M PpFÔ0"}(N$2`!7c pFƛ5]3WڭaYb?@xxM5"/R17 [&LpZߍb9?!L>I pF830nx1,rJ"fRDto_=Vd$/=ǟkCl5(@ E(9g<̘ƒoqPU_ʍɲc(@ PЏ@!+JF9#] O'R P0C6Nx9i"CVhW]Gĵ[3[Xw PE GAhTr' 9(@SX[Y#1<!3yZR D! Y(@ PW KUlv6vNH([tr硓FtD/X;Q(@ Px.L 6H\jZ+S'@twTY@NT5=RRrs3(@m0Рq0K+le"DU*`.O|,3ƋRhWju,)[[YL߽{X ο߁QEmW P0`1C9̘;qF&Jo51á)[1Ihw2wQ]+pZ0VŬINX$^ٸYWb44-4<(@ P|&1UT댘 ;۱?8uFu4uå{Kd)xq6 5.k^!ӁO@ΠF P(@ Pi4>0Ⱥ~uq3^jdB-ʢ@èiR34aH3-@[0l (@ P( h0hnNxyvͭ wί< y'J/V a!VBے22rĽF1.8׃^ 2(@ P4+ 6J$,`"S$قSR$Lk]D0 ^]PRh`f(&^ٌWREWg(@ P(@M pFu6q<&xjL68n?ߏ agaHiznؚ*L íBI P(@  +Bθh/^?Gc32Q(@ P 8:(3#K$llGAQKUC7 Or\qBuDyZƈCJZb&ze0jl(@)hnk(@_/S)kY@aߔe, KE |.P\}#lO}MbWEj&pMF P@@rS^d(@ X 9S)kkk$Z,w' _ E@nElw3/#TJȐ q W0cxi PhhVↃ2ˉ(^(0I 4LNmcv %044$⣬r1~3\ eRqh0XOzOU1&E8:[4== 4% CDH4Rp9xWb~5}XSec(@ L@[G >H)* mʿ`Tn(@0$_.Q1!TT4 e"QvL /eyqΡJ9+Pۍg(@ SF%hQ`5~f2" 6<#(@ G33Vj+^H؊EQ+Dk=?V]nӃ_H؂%W_7̟BquX-(`=]8rd۫ n"F.e}(@ pF8D XYYa~By"Z: 7VDz*܌%@掻8[x 2GFV*&(@ Y@:sU>;=wm(@ Y3L*ꃭ)8GjĀ?Diձ[7ÂD՛J8(lc(@# ԥC؟Kdu@FFod0+}(@hk`Jdb|OZہcP!,K#6崨kۮV_'m4( 󬥵A9cZc9Gi P pF厭&{&QȲ2aJ+#?Dmc&FM@W0v,B '<;(@b&ؖ:ƪT57Ԣɻ*vyZT) X-ʡCw_w?zxRE70<3(@ P(` &) C^u_LۅC'܂ߡo"/esRh{%RmжKd\Ies3a&8;W,39|9Zm6E P(@C p鄡_> ~):rG(y:m;{=L֏2cj*AMYG{PpQs'rAem_@( >o)@ P(@s pFG 6oh͢*OPP+ʉ =8->!K6Rh6'a,636oR3l롭kٺ{=܍(@ P]+JyĀM8W !#e+]4QV}?Vecc -jRnk2gC`8 5lTՋ׃&M(@ P0g4ji.gero‡GčK!}#9 2<#K3`⨩!I_Q)`jL<3(@ PLSy X 5rB|‘%fw?EH{)k.$!{jי*ɥ 6pkkkZ"^ae0{ڐs~*jo`e&8:zby P(@ M3Ž5 0CUi؉H95ewCQK;Td#] ^QU@ l@g DQѪw5Ū fU}](@ Ph#89 #v#2b6؟KbݧSd9&c[kBHY5q/Az:wQ+*Sp(@ PVJA`j/9qWMokiLKaoo9:fOXEzOϰc"ɧ tOOz=Xۈ6iOۍ[Cw11x^޲{S- 5n.pssOND}8ClR.ēRn/9-G-`emicu+++xx?[Zܱ!h&W oKZdd䤝|YO(_יxwʪrɂ <;l,5u ܻw[mV{9)Va4"6(@ P(`  4X((@ P(@0Р`3(@ P(@ P @%"@ P(@ PЈNhĐ͠ +:~=^zgmm*?l?&[@~YIoQOB__.  ,@](@ P(@ LC-Q(@ P ,@](@ P(@ L -Q`===hmmCCCZ_; PݻdMٚn)x,t!`g`ss3g 7 ELKK 7 Yȝg)b׿ٳgUP|Flls~Pʝ/} {iiii'>x ׾ף2 O;S@{O~lݺӧKuu5VX1~__ 24c#"`g~ŋgtΝ;M6z`;)0S32@!?WC+**g̝;it6]FS7oN }w\9.yl2ؽ{7%'t( ? /7xC@_d`SQLodi2ndS>cdK9nۿ[`… QrssrJKc (`{FT3~fϞda۶mطod@Rv`g/GA"WWW,Y999Z)wv(0 ! ?į9%k׮\֭[~>tuQ_v~o~SAg\8RbLyd@nƑDK'<<<ԌSAbG(0JF (02%.,,  ~;8qBg |)L] ?Q/wnzn̟(WS>cdo777ԖK䲼?XFn7 XHho~7}{F'F pFՌp ~rswwW OرcQי iJ|\`mm=8=˃TnƌW ,U`0G״i  ?dPOGltAL}ȥDr=|ꦐ|b hf_&J<Ʋ\&ȌC,M@gGL@'3{ڵ ҄}2 fX1ZL//!&ĐQQQя~˗/[>"{h(S3k~~,m'+%7 M36f<==U[F:p5WXyq;/{Fhiyi[YYV!ˌ(`~c`` ^z%%r,~;(?\ǐ& YaL.F# 0`f_5% ɭ ~lx vx7CMfyn1~kQ>>>jkgg'g wPgdvmo҉7o?r\CeuiГ1D[\\ UUU=0Lyϴ âE$e*#=;@0>Lّ>:y~_a͚5kuiS\Ù#::Q3nyu֬Y{˥ÛL%7YbVN}z03f&{o"}a~O 򞩯WᲖcDFFgדɌߏSFѕr@ܿgj9-\>r}# `g ^~V0=,EF'{K A &jBss-2kL|'g;^N .`L?Y(BY.L{aǎjzpW| ?WygV0ɵ(`i{7oV rƝb'\^\\*oYpKd!0̓1rL2, o߆zș2/b@d/)N@3 Ȍ_Tɵ]YUzM& :rɀBGG~|r<0\~mD2'g$|k_\||I@3Fr%HsMg\_.?d`Nc q)~o)}ό#Ks53UȠ믿;wZ AQ XXF7w&MA} =+s]'l:e:k>K)03FN!gqZ';Hd9e#ZǑhIQ(@ P(0.&(@ P(@ P`$FRc(@ P(@ Kq P(@ PF`a$>F P(@ Ph(@ P(@ P`$FRc(@ P(@ Kq P(@ PF`a$>F P(@ Ph(@ P(@ P`$FRc(@ P(@ Kq P(@ PF`a$>F P(@ Ph(@ P(@ P`$@ fIENDB`isoband/man/label_placer_simple.Rd0000644000176200001440000000234715114477620016726 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-placer.R \name{label_placer_simple} \alias{label_placer_simple} \title{Generic label placement function} \usage{ label_placer_simple(lines, labels_data, placer_fun) } \arguments{ \item{lines}{Isolines object for which labels should be placed.} \item{labels_data}{A data frame containing information about which labels should be placed.} \item{placer_fun}{A function that takes an individual isoline plus its associated break id as input and returns a data frame specifying label positions. The data frame should have three columns called \code{x}, \code{y}, and \code{theta}. \code{x} and \code{y} specify the label position, and \code{theta} specifies the label angle in radians. The data frame can have multiple rows, which results in the same label being placed in multiple locations.} } \description{ The simple label placer processes separate isolines independently and places labels for each line using a placer function that does the actual placement work. This label placer is not meant to be used by end users, but rather facilitates the development of new label placers, such as \code{\link[=label_placer_minmax]{label_placer_minmax()}}. } \keyword{internal} isoband/man/clip_lines.Rd0000644000176200001440000000206415114477620015065 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/clip-lines.R \name{clip_lines} \alias{clip_lines} \title{Clip lines so they don't run into a set of boxes.} \usage{ clip_lines(x, y, id, clip_boxes, asp = 1) } \arguments{ \item{x}{Numeric vector of x coordinates} \item{y}{Numeric vector of y coordinates} \item{id}{Integer vector of id numbers indicating which lines are connected} \item{clip_boxes}{Data frame specifying the locations of boxes to clip to. Should have five columns, named \code{x}, \code{y}, \code{width}, \code{height}, \code{theta}, which specify the x and y positions of each box midpoint, as well as the box width, box height, and box angle in radians. Each box is specified by one data row.} \item{asp}{Aspect ratio (width/height) of the target canvas. This is used to convert widths to heights and vice versa for rotated boxes} } \description{ Clip lines so they don't run into a set of boxes. Useful for labeling isolines, as it allows removal of line segments that would run into any text labels. } \keyword{internal} isoband/man/isoband-package.Rd0000644000176200001440000000231715114504265015751 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/isoband-package.R \docType{package} \name{isoband-package} \alias{isoband} \alias{isoband-package} \title{isoband: Generate Isolines and Isobands from Regularly Spaced Elevation Grids} \description{ \if{html}{\figure{logo.png}{options: style='float: right' alt='logo' width='120'}} A fast C++ implementation to generate contour lines (isolines) and contour polygons (isobands) from regularly spaced grids containing elevation data. } \seealso{ Useful links: \itemize{ \item \url{https://isoband.r-lib.org} \item \url{https://github.com/r-lib/isoband} \item Report bugs at \url{https://github.com/r-lib/isoband/issues} } } \author{ \strong{Maintainer}: Thomas Lin Pedersen \email{thomasp85@gmail.com} (\href{https://orcid.org/0000-0002-5147-4711}{ORCID}) Authors: \itemize{ \item Hadley Wickham \email{hadley@posit.co} (\href{https://orcid.org/0000-0003-4757-117X}{ORCID}) \item Claus O. Wilke \email{wilke@austin.utexas.edu} (\href{https://orcid.org/0000-0002-7470-9261}{ORCID}) (Original author) } Other contributors: \itemize{ \item Posit, PBC (\href{https://ror.org/03wc8by49}{ROR}) [copyright holder, funder] } } \keyword{internal} isoband/man/label_placer.Rd0000644000176200001440000000314315114477620015350 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-placer.R \name{label_placer_minmax} \alias{label_placer_minmax} \alias{label_placer_none} \alias{label_placer_manual} \alias{label_placer_middle} \title{Set up a label placement strategy} \usage{ label_placer_minmax( placement = "tb", rot_adjuster = angle_halfcircle_bottom(), n = 2 ) label_placer_none() label_placer_manual(breaks, x, y, theta) label_placer_middle(rot_adjuster = angle_halfcircle_bottom()) } \arguments{ \item{placement}{String consisting of any combination of the letters "t", "r", "b", "l" indicating the placement of labels at the top, to the right, at the bottom, to the left of the isoline.} \item{rot_adjuster}{Function that standardizes the rotation angles of the labels. See e.g. \code{\link[=angle_halfcircle_bottom]{angle_halfcircle_bottom()}}.} \item{n}{Size of the point neighborhood over which the rotation angle should be calculated.} \item{breaks}{Character vector specifying the isolines to be labeled, as in \code{\link[=isolines_grob]{isolines_grob()}}.} \item{x, y, theta}{Numeric vectors specifying the x and y positions and angles (in radians) for each label corresponding to each break.} } \description{ These functions set up various label placement strategies. } \details{ \code{label_placer_minmax()} places labels at the horizontal or vertical minima or maxima of the respective isolines. \code{label_placer_none()} places no labels at all. \code{label_placer_manual()} places labels at manually defined locations. \code{label_placer_middle()} places labels at the middle of each isoline. } isoband/man/angle_halfcircle_bottom.Rd0000644000176200001440000000144615114477620017575 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-placer.R \name{angle_halfcircle_bottom} \alias{angle_halfcircle_bottom} \alias{angle_halfcircle_right} \alias{angle_fixed} \alias{angle_identity} \title{Standardize label angles} \usage{ angle_halfcircle_bottom() angle_halfcircle_right() angle_fixed(theta = 0) angle_identity() } \arguments{ \item{theta}{Fixed angle, in radians.} } \description{ Function factories that return functions to standardize rotation angles to specific angle ranges. } \details{ \code{angle_halfcircle_bottom()} standardizes angles to (-pi/2, pi/2]. \code{angle_halfcircle_right()} standardizes angles to (0, pi]. \code{angle_fixed()} sets all angles to a fixed value (0 by default). \code{angle_identity()} does not modify any angles. } isoband/man/isobands.Rd0000644000176200001440000000537315114477620014554 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/isobands.R \name{isobands} \alias{isobands} \alias{isolines} \title{Efficient calculation of isolines and isobands from elevation grid} \usage{ isobands(x, y, z, levels_low, levels_high) isolines(x, y, z, levels) } \arguments{ \item{x}{Numeric vector specifying the x locations of the grid points.} \item{y}{Numeric vector specifying the y locations of the grid points.} \item{z}{Numeric matrix specifying the elevation values for each grid point.} \item{levels_low, levels_high}{Numeric vectors of minimum/maximum z values for which isobands should be generated. Any z values that are exactly equal to a value in \code{levels_low} are considered part of the corresponding isoband, but any z values that are exactly equal to a value in \code{levels_high} are not considered part of the corresponding isoband. In other words, the intervals specifying isobands are closed at their lower boundary and open at their upper boundary.} \item{levels}{Numeric vector of z values for which isolines should be generated.} } \description{ Efficient calculation of isolines and isobands from elevation grid } \examples{ library(grid) #' # one simple connected shape m <- matrix(c(0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0), 6, 6, byrow = TRUE) df_bands <- isobands((1:ncol(m))/(ncol(m)+1), (nrow(m):1)/(nrow(m)+1), m, 0.5, 1.5)[[1]] df_lines <- isolines((1:ncol(m))/(ncol(m)+1), (nrow(m):1)/(nrow(m)+1), m, 0.5)[[1]] g <- expand.grid(x = (1:ncol(m))/(ncol(m)+1), y = (nrow(m):1)/(nrow(m)+1)) grid.newpage() grid.points(g$x, g$y, default.units = "npc", pch = 19, size = unit(0.5, "char")) grid.path(df_bands$x, df_bands$y, df_bands$id, gp = gpar(fill = "cornsilk", col = NA)) grid.polyline(df_lines$x, df_lines$y, df_lines$id) # a similar plot can be generated with the plot_iso() function, # which is useful for exploring how the algorithm works plot_iso(m, 0.5, 1.5) # NAs are ignored m <- matrix(c(NA, NA, NA, 0, 0, 0, NA, NA, NA, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0), 6, 6, byrow = TRUE) plot_iso(m, 0.5, 1.5) # two separate shapes m <- matrix(c(0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0.8, 0), 4, 4, byrow = TRUE) plot_iso(m, 0.5, 1.5) # shape with hole m <- matrix(c(0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 2, 2, 1, 0, 0, 1, 2, 2, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0), 6, 6, byrow = TRUE) plot_iso(m, 0.5, 1.5) } \seealso{ \code{\link{plot_iso}} } isoband/man/isolines_grob.Rd0000644000176200001440000000550215114477620015602 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/isolines-grob.R \name{isolines_grob} \alias{isolines_grob} \title{Render labeled isolines} \usage{ isolines_grob( lines, gp = gpar(), breaks = NULL, labels = NULL, margin = unit(c(1, 1, 1, 1), "pt"), label_col = NULL, label_alpha = NULL, label_placer = label_placer_minmax(), units = "npc" ) } \arguments{ \item{lines}{Isolines, as produced by the \code{\link[=isolines]{isolines()}} function.} \item{gp}{Grid graphical parameters. Parameters applying to lines (such as \code{col}, \code{lwd}, \code{lty}, etc.) are recycled among the total number of lines drawn. Parameters applying only to labels (such as \code{fontfamily}, \code{fontsize}) are recycled among the specified breaks only. The two parameters \code{col} and \code{alpha} are also applied to labels, unless overridden (see \code{label_col} and \code{label_alpha}), but are matched to the corresponding lines.} \item{breaks}{Character vector specifying the isolines that should be labeled. If \code{NULL}, labels all isolines.} \item{labels}{Character vector specifying the labels for each break. If \code{NULL}, uses the breaks as labels. The number of labels provided must match the number of breaks provided.} \item{margin}{Unit object of length 4 specifying the top, right, bottom, and left margins around each text label. The same margins are applied to all labels.} \item{label_col}{Color applied to labels. Can be used to override the color provided in \code{gp}, in case labels and lines should have different colors.} \item{label_alpha}{Alpha applied to labels. Can be used to override the alpha value provided in \code{gp}, in case labels and lines should have different alpha values.} \item{label_placer}{Function that controls how labels are placed along the isolines. Uses \code{\link[=label_placer_minmax]{label_placer_minmax()}} by default.} \item{units}{A character string specifying the units in which to interpret the isolines coordinates. Defaults to \code{"npc"}.} } \description{ This function generates a grid grob that represents labeled isolines. } \examples{ library(grid) viridis_pal <- colorRampPalette( c("#440154", "#414487", "#2A788E", "#22A884", "#7AD151", "#FDE725"), space = "Lab" ) x <- (1:ncol(volcano))/(ncol(volcano)+1) y <- (nrow(volcano):1)/(nrow(volcano)+1) lines <- isolines(x, y, volcano, 5*(19:38)) bands <- isobands(x, y, volcano, 5*(18:38), 5*(19:39)) b <- isobands_grob( bands, gp = gpar(col = NA, fill = viridis_pal(21), alpha = 0.4) ) l <- isolines_grob( lines, breaks = 20*(5:10), gp = gpar( lwd = c(.3, 1, .3, .3) ) ) grid.newpage() grid.draw(b) grid.draw(l) } \seealso{ See \code{\link[=isobands_grob]{isobands_grob()}} for drawing of isobands. See \code{\link[=label_placer_minmax]{label_placer_minmax()}} for label placement strategies. } isoband/DESCRIPTION0000644000176200001440000000343215115215077013405 0ustar liggesusersPackage: isoband Title: Generate Isolines and Isobands from Regularly Spaced Elevation Grids Version: 0.3.0 Authors@R: c( person("Hadley", "Wickham", , "hadley@posit.co", role = "aut", comment = c(ORCID = "0000-0003-4757-117X")), person("Claus O.", "Wilke", , "wilke@austin.utexas.edu", role = "aut", comment = c("Original author", ORCID = "0000-0002-7470-9261")), person("Thomas Lin", "Pedersen", , "thomas.pedersen@posit.co", role = c("aut", "cre"), comment = c(ORCID = "0000-0002-5147-4711")), person("Posit, PBC", role = c("cph", "fnd"), comment = c(ROR = "03wc8by49")) ) Description: A fast C++ implementation to generate contour lines (isolines) and contour polygons (isobands) from regularly spaced grids containing elevation data. License: MIT + file LICENSE URL: https://isoband.r-lib.org, https://github.com/r-lib/isoband BugReports: https://github.com/r-lib/isoband/issues Imports: cli, grid, rlang, utils Suggests: covr, ggplot2, knitr, magick, bench, rmarkdown, sf, testthat (>= 3.0.0), xml2 VignetteBuilder: knitr Config/Needs/website: tidyverse/tidytemplate Config/testthat/edition: 3 Config/usethis/last-upkeep: 2025-12-05 Encoding: UTF-8 RoxygenNote: 7.3.3 Config/build/compilation-database: true LinkingTo: cpp11 NeedsCompilation: yes Packaged: 2025-12-05 12:52:07 UTC; thomas Author: Hadley Wickham [aut] (ORCID: ), Claus O. Wilke [aut] (Original author, ORCID: ), Thomas Lin Pedersen [aut, cre] (ORCID: ), Posit, PBC [cph, fnd] (ROR: ) Maintainer: Thomas Lin Pedersen Repository: CRAN Date/Publication: 2025-12-07 06:10:07 UTC